report zvadin02 line-count 100 message-id vn.
*@----------------------------------------------------------------------
*@ Program id    : ZVADIN02
*@ Program Desc  : Nowsco Invoice Printing
*@                 1st - Original program: RVADIN01
*@
*@ Transaction Code - none
*@ Input files   : ID - none
*@ Output files  : ID - none
*@
*@ Tables Updated: Table - none
*@
*@
*@ Author      : T. Nguyen
*@ Date        : Jan 28 95
*@ Requested by: Nowsco Well Services
*@----------------------------------------------------------------------
*@ Algorithm: ZVDOINV1 (using print processor) - T. Nguyen
*@        I have modified this program so that a file is generated when
*@        someone has tried to print an invoice.  This file contains
*@        information about the invoice.  Whenever possible, the data
*@        is written to file when the original program is writing the
*@        the same data to the form to be printed.  This insures that
*@        the data written to the file is the same as that which is
*@        printed on the invoice print out.  Any data that is not on
*@        the invoice print out is handled by a seperate routine by
*@        accessing the appropriate table(s).
*@----------------------------------------------------------------------
** MODIFICATION DETAILS:
** Jan 28 95  TNguyen   Major changes to original program
** Feb 01 95  TNguyen   Write 'N/C' to item prices when item category
**                      is ZFOB, AGNN, ZFOC, TANN
** C11K900704 Mar PTAM  Suppress B C surcharge line at item level
**                      Field no should be 31 instead of 01 at header
**
** C11K900736 Apr PTAM  Suppress group item detail lines and
**                      fix price on group item header line
**                      ( Assume group items must be all or non on a
**                      same invoice )
** C11K900784 Apr TNGUYEN  print Date of Service to flat file, id 21
** C11K900750 Apr PTAM  For CR Memo, print Order No., Date of Service &
**                      Job type.
** C11K900934 May TNGUYEN  print Invoice comments, Base in charge
**            Jun TNGUYEN  Get correct document title for G2, L2.
** LABK900750 Jul DVFINTEL Emergency fix to get order number on invoice
**                         printout
** LABK900923 Jul TNGUYEN  Fix get header text problem. Added
**                          subroutine GET_DOC_HEADER_TEXT
**            Aug PTAM     - Draft invoice is replaced by Proforma inv
**                         - Find all delivery notes instead of 1
**           Jlai         - To get path from table FILENAME
** LABK901070 Aug PTAM     - if HM00 exists in cond type
**                           = print N/C for price
**                           = suppress SURCHG
** LABK901124 Sep RVAT     - If there's an HM00 output HM00 for Header
**                         - Also output an HM00 at the item level
**                         - OUtput the SAP Document type F2, F8, etc
**                         - Output the ZREB Condition amount
** LABK901167 950928 TN    - Fix the problem of empty TKOMVD table ( the
**                           the table is retured by SAP function)
** LABK901387 951204 TN    - Get document type for reverse doc. Required
**                           for MS Access table ZTMPL.
** LABK901422 951219 GS    - Add SD category as key to look up table
**                           ZTMPL
**            960103 GS    - Added quick fix to avoid double printing of
**                           01 000001 38 (tax)
**                         - see " gs - quick fix
**  LABK901643 960301 JLai  - To eliminate Too Small Condition
**
**  LABK901707 960315 JLAI  - To get specify template for F8
**
**  LABK901744 960328 GSOLTYS - write out freight to flat file for
**                              use in ceco invoice (cond. type HD00)
**                            - for company code 2600, bypass checking
**                              item total vs. invoice total.
**                            - all changes commented with "gs
**
** LABK901926 960530 GSOLTYS - Undo change to bypass checking item total
**                             vs. invoice total for comp. code 2600.
**                             Instead, whenever we print out '02' '32',
**                             this is the number we use for a running
**                             sum.  This is based on the assumption
**                             that '32' is used ONLY for this purpose.
**                           - changes commented with "gs2
**                           - Use product line from line item as
**                             part of compound key to retreive template
**                             from ztmpl (get_ms_access_template)
**                             As a precaution, if we can't find a
**                             product line, use previous logic and use
**                             a '1'.  Changes outlined with "gs3.
** LABK901693 960531 GSOLTYS - Compensate for provincial surcharge in
**                             'Do Not Mail' validation.  Changes
**                             commented with "gs4
** LABK901946 960606 Jlai    - To pass old quantity from quotation
**                              to invoice
**                   GSoltys - compensate for new condition type ZRYT
**                           - when it exits, blank out the discount %
**                             at the item level
**                           - changes commented with "gs5
**LABK902148 960819 JLlai    - To fix bug for order quantity from quote
**LABK902227 960918 GSoltys  - allow FOB additives on invoice
**                           - changes commented with "gs6
**labk902142 Gsoltys    Utilize 'department' field of header-output as
** October 7th, 1996    drop zone indicator.  Changes commented
**                      "gs7
**
**LABK902133  961011  JBallard - Added the table PA0001 to replace PREL
**                               (used to retrieve employee names).
**                               Commented with "jb1.
**
**                               Special Note: If SAP ever deletes PREL
**                               The tables PA0001, PA0002, PA000#, etc.
**                              can be used, depending on the infotype #
**
**LABK902421       961204 jlai - To add material description to itemtab
**                           for further matching purpose
**                        gsoltys - Prevent double net value(29) output
**                                  - commented with "gs8
**LABK902417 December 6th, 1996 GSoltys
**                 Get well information from sales order instead of from
**                 invoice.
**                 Changes commented with "gs9
**LABK902483 January 8th, 1997 GSoltys
**                 To implememt BJ special price condition - ZBJS
**                 Changes commented with "gs10
**
**LABK902772 January 13, 1997 JBallard
**                 Modified to flag a Performa (F8) or and Invoice (F2)
**                 if any of the following conditions are met:
**
**                   1. Items that are in category TAS or ZAS and have a
**                      pricing condition of ZDSC.
**                   2. Any item with a positive discount and with a
**                      pricing condition of ZDSC.
**
**                 The invoice is flagged with a DO NOT MAIL message
**                 that will be printed off in Access.
**                 Changes commented with "jb2.
**
**           January 23, 1997 JBallard
**                 Same as above but invoice is also flagged if:
**                 1. PB00 and PB01 occur on same item.
**                 2. Double HM00 condition.
**                 3. HM00 and ZDSC cond together.
**                 4. ZBJS with ZDBP, PB00, PB01.
**                 Added subroutine PRINT_INVOICE_HEADER_ERROR - prints
**                 a DO NOT MAIL error message for flagged invoices.
**                 Changes commented with "jb2
**
**          March 26, 1997 JBallard
**                 Tax jurisdiction is now downloaded to the flat file
**                 so that Access can determine whether to print
**                 H.S.T for jurisdictions CHNS1, and CHNF1 (CH*).
**                 Done for companies in Newfoundland and Nova Scotia
**                 where P.S.T. and G.S.T. are combined into H.S.T.
**                 (Harmonized Sales Tax).
**                 Changes commented with jb3.
**
**          April 4, 1997 Jballard
**                Added condition for invoice validations that
**                only look at invoices greater than 71041090. Done so
**                that the validations dont kick in for old invoices.
**                Changes commented with jb4
**
**LABK910355  Feb 18, 1998 LABK910355
**                Add validation to ensure that the Ship To/Tax area
**                on the invoice is the same one as on the sales order.
**                Changes commented with jb5
**----------------------------------------------------------------------
**LABK910778 March 13, 1998
**                Suppress printing of items that do not have a
**                material number.
**                Changes commented with jb6
**----------------------------------------------------------------------
**LABK912012 June 17, 1998
**                Additional chagned regarding Ship To/Tax area,
**                See LABK910355.  Changes marked with gh1
**----------------------------------------------------------------------
**LABK9*     Sept 29, 1998 CFieulle
**                Enable printing by SAPScript as well as print
**                processor. SAPScript uses layout set ZV_NWS_INVOICE01.
**                Two other abap's copied to use SAPscript:
**                zvprint3 (from zvprint2)
**                zvrefsi2 (from zvrefsi1)
**----------------------------------------------------------------------
**LABK913512 Nov 23, 1998  CFieulle
**                Sort items by material number so items of a
**                particular material group (eg. PRODUCT) print
**                together.
**LABK913516      Make SAPScript copy the 'Do Not Use Copy' for now.
**----------------------------------------------------------------------
**LABK913524 Nov 24, 1998 CFieulle
**                Items of same description should be compressed into
**                one line item.
**                Use 'Invoice Form' field of document header text
**                as flag for reprinting of an original document.
**                User will enter the word original in this field.
**----------------------------------------------------------------------
**LABK916213 Aug 23, 1999 CFieulle
**                For situations where there are line items of condition
**                type HM00 with no price (free) (item category TANN,
**                ZFOC or ZTAP) which users want to be included in the
*                 fixed price, because these items have no price,
**                they have been separated into 'Additional Items'.
**                Modify so that these items are included in the
**                fixed price.
**----------------------------------------------------------------------
** LABK918227 Jan 27, 2000 CFieulle
**                Add new condition type Nowsco special discount.
**                Configured for Wascana only, and amount to be printed
**                after BC surcharge and before tax.
**----------------------------------------------------------------------
** LABK918670  CFieulle 2000-03-09 Re user default printer message:
**                                  specify message type 'ZZ', so that
**                                  message VN001 doesn't come up
**                                  when there is a printer error.
**----------------------------------------------------------------------
** Post 46B upgrade**
** LABK926189  CFieulle 2000-07-10 For 46B, jobtype descriptions are
**                                 are now appended with the job type
**                                 number.  We don't want to show the
**                                 number when printing.
**----------------------------------------------------------------------
** LABK926388  CFieulle 2000-07-26 Item text is brought in via
**                                 'RV_BILLING_PRINT_VIEW' from the
**                                 delivery note.  However, the users
**                                 need to change the item descr from
**                                 time to time, in which case, they
**                                 would have to change the del note
**                                 item text.  BUT item text in del's
**                                 can't be changed, so we're making
**                                 sure that the item text we display
**                                 on the invoice comes from the
**                                 corresponding sales order line item.
**----------------------------------------------------------------------
** LABK926703  CFieulle 2000-08-25 Header text retrieval.  Make sure
**                                 that an invoice/order or quote
**                                 number exists to plug into stxl id
**                                 to prevent pulling up a header text
**                                 when none exists for current document
**----------------------------------------------------------------------
** LABK928274  CFieulle 2000-09-26 Disable file extraction.
**----------------------------------------------------------------------
** LABK928636  CFieulle 2000-10-27 Header texts: afe and proposal no.:
**             When a document is copied to another the text may be
**             copied, but only up to a certain number of docs.  So
**             when searching for the text, if there's none, check
**             back to the referenced docs to find the text.
**----------------------------------------------------------------------
** LABK928651  CFieulle 2000-10-31 Re LABK928636 above.  Correct
**             infinite loop.
**----------------------------------------------------------------------
** LABK928790  CFieulle 2000-11-14 Header texts: Re LABK928636 above
**             Do the same for Customer Field Rep.
**----------------------------------------------------------------------
** LABK929091  Gary Horn  January 5, 2001
**             Add logic to look for ZCO2 condition type
**             - changes marked with gh3
**----------------------------------------------------------------------
** LABK929819  CFieulle February 06, 2001
**             Logic to handle C02 surcharge: condition type ZBJS.
**----------------------------------------------------------------------
** LABK930236  CFieulle June 19, 2001
**             New Condition type Z100 created for 'no-charge' items.
**             Items of category 'TANN', ZTAP', and 'ZFOC' are auto-
**             matically defaulted to this cond. type and therefore
**             should have no price.
**----------------------------------------------------------------------
** LABK931107  CFieulle Oct 30, 2001
**             Credit Memos:  For HM00's, instead of printing each
**             line item, change to print only main HM00 line just as
**             for regular invoices.
**----------------------------------------------------------------------
** LABK931123  CFieulle Oct 31, 2001
**             Co 9040: do not exclude first 4 chars of job type desc.
**             for invoices created from Oct 1, 2001
**----------------------------------------------------------------------
** LABK931392  IJADALOW  December 04, 2001.
**             Replacing tables TVV1 and TVV1T, with tables T2502 and
**             T25A2 respectively.  T2502 contains all job types from
**             the past as well as current ones.
**             Requestd by Ophelia Tik.
**             Look for "IJ1" for the changes made.
** LABK931491  IJADALOW  December 14, 2001.
**             Fix output of the Job Description.
**----------------------------------------------------------------------
** LABK934346  Field 'lines' in structure zinvoice01 was changed from
**             2 chars to 4.  Condense so that it can be read correctly
**             in the layoutset, else it affects the alignment of the
**             form.
**----------------------------------------------------------------------
** LABK934226  IJADALOW January 3, 2003
**    &        Print Parent item of FOB's.
** LABK934392  This FOB change is effective for Berlington Cementing
**             Invoices Only
*@----------------------------------------------------------------------
** LABK934576  IJADALOW March 12, 2003
**             Print the Fuel Surcharge
**----------------------------------------------------------------------
** LABK934634  CFieulle March 20, 2003
**             Allow for extra line for fuel surcharge in the 'Total'
**             box of the printout.
**----------------------------------------------------------------------

tables: komk,                          "Communicationarea for conditions
        komp,                          "Communicationarea for conditions
        komvd,                         "Communicationarea for conditions
        vbco3,                         "Communicationarea for view
        vbdkr,                         "Headerview
        vbdpr,                         "Itemview
        sadr,                          "Addresses
        tvko,                          "Sales organisation
        tvstt,                         "Plant name
*        FILENAME,                      "Path
        adrs,                          "Communicationarea for Address
        konv.                                               "gs
include rvadtabl.

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
data: zryt_flag type i.                                     "gs5
data: net_printed type i.                                   "gs8
data: freight_value like konv-kwert.                        "gs
*DATA: PATH(60) TYPE C.
data: retcode   like sy-subrc.         "Returncode
data: repeat(1) type c.
data: xvbeln like vbrk-vbeln.
data: xposnr like vbrl-posnr.

data: begin of tvbdpr occurs 100.      "Internal table for items
        include structure vbdpr.
data: end of tvbdpr.

data: begin of tkomv occurs 50.
        include structure komv.
data: end of tkomv.

data: begin of tkomvd occurs 50.
        include structure komvd.
data: end of tkomvd.

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

data: pr_kappl(01)   type c value 'V'. "Application for pricing

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
********************************************************************
*  Nowsco required additional data
include zvprtda1.
tables: vbrp, *vbrp, komv, vbak,
*** IJ1 Replace Starts
*       vbfa, vbpa, tvv1t, vbrk, bkpf,
        vbfa, vbpa, T25A2, vbrk, bkpf,
*** IJ1 Replace Ends
        prel,                          " Employee names    AClimie
        pa0001,          "Replaces PREL for empl. names  - jb1
        p0001.

data: filenam(8), text80(80) type c, text240(240) type c,
      item_count(6) type n, item_field_id(2) type n,
      item_total_after_disc like komvd-kwert,
      book_total            like komvd-kwert,
      del_notes(78) type c,
      len(2) type n,
      doc_type like vbrk-fkart,
      product_line_flag type i,                             "gs3
      prod_line like vbrp-kvgr2.                            "gs3

data: job_type_no like vbak-kvgr1,     "AClimie
      item_gross_value like komvd-stunr value '100',
      item_fixed_price like komvd-stunr value '016',
      hm00_cond like komvd-stunr value '420',
      hm00_cond_flag(1) type c value 'N',
      hm00_header_cond_flag(1) type c value 'N',
      hm00_exists(1) type c value ' ',
      net_value1 like komvd-stunr value '400',
      net_value2 like komvd-stunr value '500',
      tax_id(2) type n value '32',
      last_print_date like nast-datvr,
      last_print_time like nast-uhrvr,
      opr_zyrt like komvd-stunr value '430',                "gs5
      opr_zbjs like komvd-stunr value '398',                "gs10

      c02_cond_old like komvd-stunr value '398',            "LABK929819
      c02_cond_new like komvd-stunr value '425',            "LABK929819
      c02_new_cond_flag(1) type c,                          "LABK929819

      opr_nocharge like komvd-stunr value '350',            "LABK930236

      zdsc_cnt_flag type i,                                 "jb2
      tas_zas_flag(1) type c,                               "jb2
      bad_item_no1 like vbrp-posnr,                         "jb2
      bad_item_no2 like vbrp-posnr,                         "jb2
      bad_item_no3 like vbrp-posnr,                         "jb2
      bad_item_no4 like vbrp-posnr,                         "jb2
      bad_item_no5 like vbrp-posnr,                         "jb2
      tas_zas_zdsc_error_flag(1) type c,                    "jb2
      zdsc_pos_disc_flag(1) type c,                         "jb2
      dual_cond_err_flag type c,                            "jb2
      pb00_cnt_flag type i,                                 "jb2
      pb01_cnt_flag type i,                                 "jb2
      zdbp_cnt_flag type i,                                 "jb2
      hm00_cnt_flag type i,                                 "jb2
      dum_rc type i,                                        "jb2
      dum_post_amt(16) type c,                              "jb2
      dum_pbook like bsid-dmbtr,                            "jb2
      dum_cond_amt like bsid-dmbtr,                         "jb2
      dum_cond_type(4) type c,                              "jb2
      err_msg1(40) type c,                                  "jb2
      err_msg2 like err_msg1,                               "jb2
      err_msg3 like err_msg1,                               "jb2
      err_msg4 like err_msg1,                               "jb2
      dbl_hm00_err_flag(1) type c,                          "jb2
      pb00_pb01_err_flag(1) type c ,                        "jb2
      zdsc_hm00_err_flag(1) type c,                         "jb2
      nofobtext_err_flag(1) type c,                         "LABK934392
      shipto_diff_flag type c.                              "jb5

field-symbols: , .

data: temp_name(40) type c.
data: zatx_netwr_sum     like vbrp-netwr,
      zatx_net_no_surchg like vbrp-netwr,
      zatx_surchg        like vbrp-netwr,
      tkomvd_lines(3) type p,
      hdr_net_bef_tax_surchg like vbrp-netwr.

data: begin of cancelled_docs occurs 50,   " Store cancelling billing
          vbeln like vbfa-vbeln,       " documents
      end of cancelled_docs.

data: begin of quote occurs 1.
        include structure vbak.
data: end of quote.

data: begin of sales_ord occurs 1.
        include structure vbak.
data: end of sales_ord.

data: begin of del_note_tbl occurs 4,
        vbeln like vbfa-vbeln,
      end of del_note_tbl.

data: begin of t_string,
        char(1) type c,
        rest(39) type c,
      end of t_string.
*{LABK934226
DATA: BEGIN OF tvbap OCCURS 50.
        INCLUDE STRUCTURE vbdpr.
DATA: END OF tvbap.

DATA: fob_parent TYPE i VALUE 0,
      fob_posnr(6) TYPE n,
      fob_blend(45) TYPE c,          "description
      g_cust_num LIKE vbpa-kunnr.

*}LABK934226
* ******* data for reformat sales order output ****** "JL
tables: vbap.
data:
      begin of itemtab occurs 50,
        item_count(6) type n,
        material_no like vbdpr-matnr,
        arktx like vbdpr-arktx,                             "JL1204
        qty_quoted like zinvoice01-quantity,          "LABK934392
      end of itemtab,
      quotation like vbdkr-vbeln,
      quote_flag type i value 0.

*----- Start addition for SAPScript
tables: zinvoice01,
        tsp03,
        usr01.

data: xscreen(1) type c.               "Output on printer or screen

data: begin of item_data occurs 20,
        matnr     like vbrp-matnr,
        mat_num   like zinvoice01-mat_num,
        mat_desc  like zinvoice01-mat_desc,
        quantity  like zinvoice01-quantity,
        uom       like zinvoice01-uom,
        category  like zinvoice01-category,
        tt_af_sur like zinvoice01-tt_af_sur,
        book_val  like zinvoice01-book_val,
        net_val   like zinvoice01-net_val,
        disc_per  like zinvoice01-disc_per,
        disc_amt  like zinvoice01-disc_amt,
        cond_type like zinvoice01-cond_type,
        price_ad  like zinvoice01-price_ad,
        3pty_sur  like zinvoice01-3pty_sur,
        prov_sur  like zinvoice01-prov_sur,
        mat_reim  like zinvoice01-mat_reim,
        fin_amt   like zinvoice01-fin_amt,
        qty_quoted like zinvoice01-quantity,
        bj_cond    like zinvoice01-bj_cond,
        count(6) type n,
        list_pr(15) type c,
        disc(6) type c,
        disc_pr(15) type c,
        price(15) type c,
        quanu(15) type c,
        quanq(15) type c,
        tax_flag(1) type c,
        uepos LIKE vbrp-uepos,       "LABK934226
        posnr LIKE vbrp-posnr,       "LABK934226
      end of item_data.
*{ Start Insert LABK934392
data: item_tmp LIKE item_data OCCURS 20 WITH HEADER LINE,
      rec_index LIKE sy-tabix.
*} LABK934392

data: begin of item_gr1 occurs 20.
        include structure item_data.
data: end of item_gr1.

data: begin of item_gr2 occurs 20.
        include structure item_data.
data: end of item_gr2.

data: begin of item_gr3 occurs 20.
        include structure item_data.
data: end of item_gr3.

data: begin of xitem_data occurs 20,
        matnr     like vbrp-matnr,
        mat_num   like zinvoice01-mat_num,
        mat_desc  like zinvoice01-mat_desc,
        quantity  type p decimals 3,
        uom       like zinvoice01-uom,
        category  like zinvoice01-category,
        tt_af_sur type p decimals 2,
        book_val  type p decimals 2,
        net_val   type p decimals 2,
*        disc_per(5) type c,
        disc_per(7) type c,                                 "LABK930236
        disc_amt  type p decimals 2,
        cond_type like zinvoice01-cond_type,
        price_ad  type p decimals 2,
        3pty_sur  type p decimals 2,
        prov_sur  type p decimals 2,
        mat_reim  type p decimals 2,
        fin_amt   type p decimals 2,
        qty_quoted type p decimals 3,
        bj_cond    like zinvoice01-bj_cond,
*       count(6) type n,
        list_pr(15) type c,
        disc(6) type c,
        disc_pr(15) type c,
        price(15) type c,
        quanu(15) type c,
        quanq(15) type c,
        tax_flag(1) type c,
        uepos LIKE vbrp-uepos,       "LABK934226
        posnr LIKE vbrp-posnr,       "LABK934226
      end of xitem_data.

data: tax1  like komvd-kwert,
      tax2  like komvd-kwert,
      tax3  like komvd-kwert,
      tax4  like komvd-kwert,
      tax5  like komvd-kwert,
      itax1 like komvd-kwert,
      itax2 like komvd-kwert,
      itax3 like komvd-kwert,
      itax4 like komvd-kwert,
      itax5 like komvd-kwert,
      tax_jcd  like vbpa-kunnr,                     "Tax jurisdiction
      sum1hm00 like zinvoice01-net_val,
      sum2hm00 like zinvoice01-net_val,
      sum1norm like zinvoice01-net_val,
      sum2norm like zinvoice01-net_val,
      line1(72) type c,
      line2(72) type c,
      line3(72) type c,
      line4(72) type c.
*     line5(72) type c.

*DATA:   PREVIEW(2) TYPE C.

*----- End addition for SAPScript


********************************************************************


form entry using return_code us_screen.

  clear retcode.
*  CLEAR PREVIEW.
  perform processing using us_screen.
*///////////////////////////////////////////////////////////////////////

** write print control data to file
*  CLEAR PRINT_TABLE.
*  REFRESH PRINT_TABLE.
*  PRINT_TABLE = ITCPO.
*  APPEND PRINT_TABLE.
** For Invoice form, get template from text field id 0011
*  CLEAR TEMP_NAME.
* ???
**ERFORM WRITE_CONTROL_DATA(ZVPRINT1) TABLES PRINT_TABLE USING
**  'jjjj' VBDKR-VBELN VBDKR-VBTYP 'xxxx'.  "???
* The following commented out because the Invoice Form text line in
* the document header text is no longer used to print USA invoices
* so this field can be used to indicate reprint of an original invoice.
* See 'Get_document_title'.
*  IF VBDKR-VBTYP = 'M'    " Invoice Form from invoice save text
*     OR VBDKR-VBTYP = 'U'.             " F2 = M, F8 = U
*    PERFORM GET_HEADER_TEXT(ZVPRINT3) USING
*                                      VBDKR-VBELN '0011' TEXTLINE.
*    IF TEXTLINE NE SPACE.
*      TEMP_NAME = TEXTLINE.
*    ENDIF.
*  ENDIF.
*  IF ( VBDKR-VBTYP = 'M'    " Invoice Form from sales save text
*       OR VBDKR-VBTYP = 'U' )  AND TEMP_NAME = ' '.
*    PERFORM GET_HEADER_TEXT(ZVPRINT3) USING VBDKR-VBELN_VAUF
*            '0011' TEXTLINE.
*    IF TEXTLINE NE SPACE.
*      TEMP_NAME = TEXTLINE.
*    ENDIF.
*  ENDIF.
** Get microsoft access template name for this region
** Product line was hard coded to '1' because there is no product line
** information for invoices or proforma
*
*  IF TEMP_NAME = ' '.
**                                                                  "gs3
*    PRODUCT_LINE_FLAG = 0.
*    SELECT * FROM VBRP WHERE VBELN EQ VBDKR-VBELN.
*      IF VBRP-KVGR2 NE  ' '.
*        PRODUCT_LINE_FLAG = 1.
*        MOVE VBRP-KVGR2 TO PROD_LINE.
*        EXIT.
*      ENDIF.
*    ENDSELECT.
*
*  IF PREVIEW = 'NO'.
*    IF PRODUCT_LINE_FLAG EQ 1.
*      PERFORM GET_MS_ACCESS_TEMPLATE(ZVPRINT3) USING
*              VBDKR-VKORG    DOC_TYPE  VBDKR-VBTYP PROD_LINE TEMP_NAME.
*    ELSE.
*      PERFORM GET_MS_ACCESS_TEMPLATE(ZVPRINT3) USING
*               VBDKR-VKORG    DOC_TYPE  VBDKR-VBTYP    '1'   TEMP_NAME.
*    ENDIF.
*  ENDIF.
*
*  ENDIF.
**                                                                  "gs3
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_CONTROL_DATA(ZVPRINT3) TABLES PRINT_TABLE USING
*            VBDKR-VBELN   SY-UNAME   TEMP_NAME     'ZVADIN02'.
*    CLOSE DATASET DATAFILE.
*    PERFORM SAP_MOVER_FILE_SETUP(ZVPRINT3) USING DATAFILE.
*  ENDIF.
*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  case retcode.
    when 0.
      return_code = 0.
    when 3.
      return_code = 3.
    when others.
      return_code = 1.
  endcase.

endform.

*---------------------------------------------------------------------*
*       FORM PROCESSING                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  PROC_SCREEN                                                   *
*---------------------------------------------------------------------*
form processing using proc_screen.

  perform get_data.

  if vbdkr-uvall ne space or vbdkr-uvals ne space or
     vbdkr-uvprs ne space.
    if proc_screen = space.
      retcode = 3.
      if vbdkr-uvall ne space or vbdkr-uvals ne space.
        syst-msgno = '201'.
        syst-msgid = 'VN'.
        syst-msgty = 'I'.
        perform protocol_update.
      endif.
      if vbdkr-uvprs ne space.
        syst-msgno = '200'.
        syst-msgid = 'VN'.
        syst-msgty = 'I'.
        perform protocol_update.
      endif.
    else.
      if vbdkr-uvall ne space or vbdkr-uvals ne space.
        message i201.
      endif.
      if vbdkr-uvprs ne space.
        message i200.
      endif.
    endif.
  endif.

  check retcode = 0.
  perform form_open using proc_screen vbdkr-land1.
  check retcode = 0.
* Get header info
  perform write_header_info_to_file.
  perform item_print.
  check retcode = 0.
  perform end_print.
  check retcode = 0.
  perform massage_data.
  perform activate_elements.
  perform form_close.
  check retcode = 0.
endform.

***********************************************************************
*       S U B R O U T I N E S                                         *
***********************************************************************

*---------------------------------------------------------------------*
*       FORM END_PRINT                                                *
*---------------------------------------------------------------------*
*                                                                     *
*---------------------------------------------------------------------*

form end_print.
  perform get_header_prices.
  perform header_price_print.
endform.

*---------------------------------------------------------------------*
*       FORM FORM_CLOSE                                               *
*---------------------------------------------------------------------*
*       End of printing the form                                      *
*---------------------------------------------------------------------*

form form_close.

  call function 'CLOSE_FORM'
       exceptions
            others = 1.
  if sy-subrc ne 0.
    retcode = sy-subrc.
    perform protocol_update.
  endif.
  set country space.

endform.

*&---------------------------------------------------------------------*
*&      Form  PRINT_INVOICE_HEADER_ERROR
*&---------------------------------------------------------------------*
*  Created by: John Ballard Jan/97.
*       This subroutine prints an error message in the address
*       fields of the invoice in Access. The error message
*       depends on what lines are passed to it. They vary
*       depending on what condtions have been violated.
*       See FORM HEADER_PRICE_PRINT for existing error
*       messages.
*----------------------------------------------------------------------*
form print_invoice_header_error using line1 line2 line3 line4.

*IF PREVIEW = 'NO'.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '52' LINE1.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '53' LINE2.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '54' LINE3.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '55' LINE4.
*ENDIF.

endform.                               " PRINT_INVOICE_HEADER_ERROR
*---------------------------------------------------------------------*
*       FORM FORM_OPEN                                                *
*---------------------------------------------------------------------*
*       Start of printing the form                                    *
*---------------------------------------------------------------------*
*  -->  US_SCREEN  Output on screen                                   *
*                  ' ' = Printer                                      *
*                  'X' = Screen                                       *
*  -->  US_COUNTRY County for telecommunication and SET COUNTRY       *
*---------------------------------------------------------------------*

form form_open using us_screen us_country.

* note: ZRVADOPF is a copy of RVADOPFO - I had to add one line of code
* in this program to suppress the printing of the document .... (Lee)
* include zrvadopf.

  if nast-ldest = 'DFLT'.    " Use the user default printer.
    select single * from usr01 where bname = sy-uname.
    select single * from tsp03 where padest = usr01-spld.
    if sy-subrc = 0.
      nast-ldest = usr01-spld.
    else.
*     message e001 with 'Unable to find user default printer.'.
      message e001(zz) with                                 "LABK918670
              'Unable to find user default printer.'.       "LABK918670
    endif.
  endif.


  include rvadopfo.

*  IF ITCPO-TDPREVIEW <> 'X' AND
*     ITCPO-TDNOPRINT <> 'X'.
*    PREVIEW = 'NO'.
*  ENDIF.


endform.

*---------------------------------------------------------------------*
*       FORM GET_DATA                                                 *
*---------------------------------------------------------------------*
*       General provision of data for the form                        *
*---------------------------------------------------------------------*

form get_data.

  call function 'RV_PRICE_PRINT_REFRESH'
       tables
            tkomv = tkomv.
  clear komk.
  clear komp.

  if nast-objky+10(6) ne space.
    vbco3-vbeln = nast-objky+16(10).
  else.
    vbco3-vbeln = nast-objky.
  endif.

  vbco3-mandt = sy-mandt.
  vbco3-spras = nast-spras.
  vbco3-kunde = nast-parnr.
  vbco3-parvw = nast-parvw.

  call function 'RV_BILLING_PRINT_VIEW'
       exporting
            comwa = vbco3
       importing
            kopf  = vbdkr
       tables
            pos   = tvbdpr.

  perform sender.
  perform check_repeat.
endform.

*---------------------------------------------------------------------*
*       FORM GET_ITEM_PRICES                                          *
*---------------------------------------------------------------------*
*       In this routine the price data for the item is fetched from   *
*       the database.                                                 *
*---------------------------------------------------------------------*

form get_item_prices.

  clear: komp,
         tkomv.

  if komk-knumv ne vbdkr-knumv.
    clear komk.
    komk-mandt = sy-mandt.
    komk-kalsm = vbdkr-kalsm.
    komk-kappl = pr_kappl.
    komk-waerk = vbdkr-waerk.
    komk-knumv = vbdkr-knumv.
    komk-vbtyp = vbdkr-vbtyp.
  endif.
  komp-kposn = vbdpr-posnr.

  call function 'RV_PRICE_PRINT_ITEM'
       exporting
            comm_head_i = komk
            comm_item_i = komp
            language    = nast-spras
       importing
            comm_head_e = komk
            comm_item_i = komp
       tables
            tkomv       = tkomv
            tkomvd      = tkomvd.

endform.

*---------------------------------------------------------------------*
*       FORM GET_HEADER_PRICES                                        *
*---------------------------------------------------------------------*
*       In this routine the price data for the header is fetched from *
*       the database.                                                 *
*---------------------------------------------------------------------*

form get_header_prices.

  call function 'RV_PRICE_PRINT_HEAD'
       exporting
            comm_head_i = komk
            language    = nast-spras
       importing
            comm_head_e = komk
       tables
            tkomv       = tkomv
            tkomvd      = tkomvd.

endform.

*---------------------------------------------------------------------*
*       FORM HEADER_PRICE_PRINT                                       *
*---------------------------------------------------------------------*
*       Printout of the header prices                                 *
*---------------------------------------------------------------------*

form header_price_print.

  data: begin of header_tax occurs 5,
          koaid like komvd-koaid,
          kschl like komvd-kschl,
          kwert like komvd-kwert,
        end of header_tax.

* Get header final amount/ net total to file
*IF PREVIEW = 'NO'.
*  PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '01' '000001' '25' BOOK_TOTAL.
*  PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '01' '000001' '38' KOMK-FKWRT.
*ENDIF.
  move book_total to zinvoice01-hprbk_tot.
  move komk-fkwrt to zinvoice01-hfinal_amt.

* PERFORM WRITE_TO_FILEA(ZVPRINT1) USING '01' '000001' '32' KOMK-SUPOS.
  perform get_pricing_proc(zvprint3) tables tkomv tax_table   using
                   nows_disc_amt   nows_disc_perc
                   price_adj_amt
                   3party_surchg_amt
                   prov_surchg_amt
                   mat_reimb_amt       "950923 RV
                   0                   "  0 --> header prices
                   zbjs_amt            "gs10
                   nows_spec_disc_amt.                      "LABK918227
*
* if there is HM00 in cond type => ignore header surcharge
* added HM00 output IF THERE IS ANY hm00 ON THE INVOICE RV 950923
* IF HM00_COND_FLAG NE ' '.                           " rv 950923
  if hm00_header_cond_flag ne 'N'.                    " rv 950923
    clear: prov_surchg_amt.
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '77' 'HM00'.
*    ENDIF.
    move 'HM00' to zinvoice01-hhead_cont.
  endif.

  hdr_net_bef_tax_surchg = vbrk-netwr. " get header net price       "pt
* HDR_NET_BEF_TAX_SURCHG = KOMK-SUPOS - PROV_SURCHG_AMT.            "pt
*                                      - MAT_REIMB_AMT.   "950923 RV
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '01' '000001' '32'
*                                             HDR_NET_BEF_TAX_SURCHG.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'
*                                                   '24' NOWS_DISC_PERC.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'
*                                                   '26' NOWS_DISC_AMT.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'
*                                                   '27' PRICE_ADJ_AMT.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'
*                                              '28' 3PARTY_SURCHG_AMT.
*  ENDIF.
  move hdr_net_bef_tax_surchg to zinvoice01-htt_af_sur.
  move nows_disc_perc to zinvoice01-hdisc_per.
  move nows_disc_amt to zinvoice01-hdisc_amt.
  move price_adj_amt to zinvoice01-hprice_adj.
  move 3party_surchg_amt to zinvoice01-h3pty_sur.

  if nows_spec_disc_amt ne 0.                               "LABK918227
    move nows_spec_disc_amt to zinvoice01-hsdisc_amt.       "LABK918227
    move 'Special Discount' to zinvoice01-hsdisc_des.       "LABK918227
  endif.                                                    "LABK918227

*{ start insert LABK934576
  if fuel_surchg_amt ne 0.
    move fuel_surchg_amt to zinvoice01-hfuelsur_amt.
    move '   Fuel Surcharge' to zinvoice01-hfuelsur_des.
  endif.
*} Start Insert LABK934576

*
* only write header surcharge if there is no HM00 in cond type
* after all the item_print processed, surcharge might have been reset
* if HM00 exists.
  if prov_surchg_amt ne 0.
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'
*                                                 '30' PROV_SURCHG_AMT.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                       '31' 'BC Surcharge'.
*    ENDIF.
    move prov_surchg_amt to zinvoice01-htot_sur.
    move 'BC Surcharge' to zinvoice01-hsur_desc.
  endif.

  if mat_reimb_amt ne 0.               "950923 RV
*    IF PREVIEW = 'NO'.
*     PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '01' '000001'   "950923 RV
*                    '79' MAT_REIMB_AMT.                      "950923 RV
*     PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'     "950923 RV
*                    '80' 'Mat. Reimbursement'.               "950923 RV
*    ENDIF.
    move mat_reimb_amt to zinvoice01-hmat_reim.
    move 'Mat. Reimbursement' to zinvoice01-hreim_desc.
  endif.                               "950923 RV

  total_after_disc_amt = book_total +
              nows_disc_amt + price_adj_amt + 3party_surchg_amt
              + zbjs_amt.              "gs10
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '01' '000001'
*                                       '29' TOTAL_AFTER_DISC_AMT.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '16'
*                                               DISC_PERC_TEXT.
*  ENDIF.
  move total_after_disc_amt to zinvoice01-hnet_val.
  move disc_perc_text to zinvoice01-hdisc_desc.

  clear header_tax.
  refresh header_tax.
  loop at tkomvd.
    komvd = tkomvd.
    if komvd-koaid = 'D'.
      move-corresponding komvd to header_tax.
      collect header_tax.
    endif.
  endloop.

  tax_id = 32.
  loop at header_tax.
    add 1 to tax_id.
    check header_tax-kwert ne 0.
    if tax_id ne 38.                   " gs - quick fix
      case tax_id.
        when 33.
          move header_tax-kwert to tax1.
        when 34.
          move header_tax-kwert to tax2.
        when 35.
          move header_tax-kwert to tax3.
        when 36.
          move header_tax-kwert to tax4.
        when 37.
          move header_tax-kwert to tax5.
      endcase.
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '01' '000001'
*                                         TAX_ID    HEADER_TAX-KWERT.
*      ENDIF.
    endif.                             " gs - quick fix
  endloop.

**********************************************************  start of jb2
* Incorrect Discount Entered (positive value).
  if zdsc_pos_disc_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'A positive discount has been entered'.
    err_msg3 = 'for an item using the condition ZDSC.'       .
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no1 to textline+20.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'A positive discount has been entered' to zinvoice01-bp_addr2.
    move 'for an item using the condition ZDSC.' to zinvoice01-bp_addr3.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no1 to textline+20.
    move textline to zinvoice01-bp_addr4.
*

* PB00 and PB01 occur together on same item.
  elseif pb00_pb01_err_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'The conditions PB00 and PB01 are not'.
    err_msg3 = 'allowed together on the same item.'.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no2 to textline+20.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'The conditions PB00 and PB01 are not' to zinvoice01-bp_addr2.
    move 'allowed together on the same item.' to zinvoice01-bp_addr3.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no2 to textline+20.
    move textline to zinvoice01-bp_addr4.
*

* Double HM00 condition
  elseif dbl_hm00_err_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'There are multiple HM00 conditions'.
    err_msg3 = 'on this document.'.
    err_msg4 = 'Only one HM00 condition is allowed.'.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'There are multiple HM00 conditions' to zinvoice01-bp_addr2.
    move 'on this document.' to zinvoice01-bp_addr3.
    move 'Only one HM00 condition is allowed.' to zinvoice01-bp_addr4.
*

* HM00 and ZDSC exist on the same item.
  elseif zdsc_hm00_err_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'Condition HM00 is not allowed with'.
    err_msg3 = 'condition ZDSC.'       .
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no3 to textline+20.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'Condition HM00 is not allowed with' to zinvoice01-bp_addr2.
    move 'condition ZDSC.' to zinvoice01-bp_addr3.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no3 to textline+20.
    move textline to zinvoice01-bp_addr4.
*

* ZBJS with either ZDBP, PB00, PB01
  elseif dual_cond_err_flag = 'X'.

    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'Condition ZBJS is not allowed with'.
    err_msg3 =  'either PB00, PB01, or ZDBP.'       .
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no4 to textline+20.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'Condition ZBJS is not allowed with' to zinvoice01-bp_addr2.
    move  'either PB00, PB01, or ZDBP.' to zinvoice01-bp_addr3.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no4 to textline+20.
    move textline to zinvoice01-bp_addr4.
*

* Item in category TAS or ZAS with condition ZDSC.
  elseif tas_zas_zdsc_error_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'Condition type ZDSC is not allowed for'.
    err_msg3 = 'items in category TAS or ZAS'       .
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no5 to textline+20.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
   move 'Condition type ZDSC is not allowed for' to zinvoice01-bp_addr2.
    move 'items in category TAS or ZAS.' to zinvoice01-bp_addr3.
    move 'Check SAP Item No:  ' to textline.
    move bad_item_no5 to textline+20.
    move textline to zinvoice01-bp_addr4.
*

***********************************************************   end of jb2
* Item Total does not match Invoice Total.
  elseif hdr_net_bef_tax_surchg ne item_total_after_disc.   "gs4

    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'Invoice total is different from Item total'.
    move 'Invoice total: ' to textline.
    move hdr_net_bef_tax_surchg to textline+18.
    err_msg3 = textline.
    move '   Item total: ' to textline.
    move item_total_after_disc to textline+18.
    err_msg4 = textline.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    clear textline.
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'Invoice total is different from Item total'
                                               to zinvoice01-bp_addr2.
    move 'Invoice total: ' to textline.
    move hdr_net_bef_tax_surchg to textline+18.
    move textline to zinvoice01-bp_addr3.
    move '   Item total: ' to textline.
    move item_total_after_disc to textline+18.
    move textline to zinvoice01-bp_addr4.
*

* SHIP-TO on invoice does not match SHIP-TO (TAX AREA) on other docs jb5
  elseif shipto_diff_flag = 'X'.
    err_msg1 = '***********     DO NOT MAIL     ***********'.
    err_msg2 = 'SHIP-TO/TAX AREA partner is different'.
    err_msg3 = 'on preceding documents (SO / Delivery).'.
    err_msg4 = 'Related documents need to be changed.'.
    perform print_invoice_header_error using
                                  err_msg1 err_msg2 err_msg3 err_msg4.
* CF
    move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'SHIP-TO/TAX AREA partner is different' to zinvoice01-bp_addr2.
    move 'on preceding documents (SO / Delivery).'
                                                 to zinvoice01-bp_addr3.
    move 'Related documents need to be changed.'
                                                 to zinvoice01-bp_addr4.
*
*{ LABK934392
  elseif nofobtext_err_flag = 'X'.
        move '***** DO NOT MAIL *****' to zinvoice01-bp_addr1.
    move 'FOB item text was not found' to zinvoice01-bp_addr2.
    move ' '                      to zinvoice01-bp_addr3.
    move ' '                      to zinvoice01-bp_addr4.
*} LABK934392
  else.
*   write bill to address
    perform write_bill_to_party_info(zvprint3)
                                 using vbdkr-vbeln '01' '000001'
                                       zinvoice01-bp_num
                                       zinvoice01-bp_name
                                       zinvoice01-bp_addr1
                                       zinvoice01-bp_addr2
                                       zinvoice01-bp_addr3
                                       zinvoice01-bp_addr4
                                       zinvoice01-bp_pcode
                                       zinvoice01-bp_city
                                       zinvoice01-bp_region
                                       zinvoice01-bp_country.
*                                       PREVIEW.
  endif.

* Begin of gh3 -->
* Get the CO2 Surcharge if there is any
  clear: zinvoice01-co2_surcharge,
         zinvoice01-co2_surcharge_x.

  loop at tkomv where kschl = 'ZCO2'
                  and kinak = space.
    add tkomv-kwert to zinvoice01-co2_surcharge.
  endloop.

  if not zinvoice01-co2_surcharge is initial.
    zinvoice01-co2_surcharge_x = 'X'.
  endif.
* <-- end of gh3
endform.


*---------------------------------------------------------------------*
*       FORM ITEM_PRICE_PRINT                                         *
*---------------------------------------------------------------------*
*       Printout of the item prices                                   *
*---------------------------------------------------------------------*

form item_price_print.

  clear: total_after_disc_amt, hm00_cond_flag.
* T.N      Sep 28, 1995
* TKOMV  - Price Determination Communications condition record
* TKOMVD - Price Determination Communications cond. record for printing
* Once again, we are at SAP's mercy as it decides what it will return
* in these tables. This time for item w/ zero amount and HM00 cond, it
* decides to return NOTHING for TKOMVD (What a piece of %#!%^&). The
* following piece code is designed to get around that problem.

  clear tkomvd_lines.

  loop at tkomvd.
    if tkomvd-kposn = vbdpr-posnr.
      tkomvd_lines = 1.                "  Table is not EMPTY
      exit.
    endif.
  endloop.

  if tkomvd_lines = 0.                 "  Table is EMPTY
    clear tkomvd.
    refresh tkomvd.
*   We'll copy information from TKOMV to TKOMVD for this item
    loop at tkomv.
      check tkomv-kposn = vbdpr-posnr.
      move-corresponding tkomv to tkomvd.
      append tkomvd.
    endloop.
  endif.

  clear c02_new_cond_flag.                                   "LABK929819

  loop at tkomvd.
*{ Start Insert LABK934576
    IF tkomvd-stunr = fuel_surcharge.
      CONTINUE.
    ENDIF.
*} End Insert LABK934576
    clear item_data-cond_type.
    komvd = tkomvd.
*   Obtain various values
    if komvd-stunr = opr_zyrt.                                     "gs10
*     handles zryt condition type                                   "gs5
      total_after_disc_amt = komvd-kwert.                           "gs5
      add komvd-kwert to book_total.                                "gs5
*      IF PREVIEW = 'NO'.                                            "cf
*       PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02'   ITEM_COUNT    "gs5
*                            '25' KOMVD-KWERT.                      "gs5
*      ENDIF.
      move komvd-kwert to item_data-book_val.
      zryt_flag = 1.                                                "gs5
    elseif komvd-stunr = item_gross_value or    "  Mutually exclusive
      komvd-stunr = item_fixed_price
*   Begin insert LABK929819 -->
*   Make sure the c02 line (with new stunr = 425)
*   is evaluated so we can get a net value just like
*   other regular lines. 398 is evaluated as a zbjs item.
      or komvd-stunr = c02_cond_new
      or komvd-stunr = c02_cond_old.
        item_data-cond_type = 'c02'.                        "LABK929500
        if komvd-stunr = c02_cond_new or
           komvd-stunr = c02_cond_old.
          c02_new_cond_flag = 'X'.
        endif.
        if komvd-stunr <> c02_cond_old.
*   -->   End insert LABK929819
          total_after_disc_amt = komvd-kwert.
          add komvd-kwert to book_total.
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FI  LEA(ZVPRINT3) USING '02'   ITEM_COUNT
*                             '25' KOMVD-KWERT.
*        ENDIF.
        move komvd-kwert to item_data-book_val.
      endif.                                                "LABK929819
*   Start insert LABK930236
*   'No-charge' items cancel out gross value
*    elseif komvd-stunr = opr_nocharge.
*      add komvd-kwert to book_total.
*      add komvd-kwert to total_after_disc_amt.
*      add komvd-kwert to item_data-book_val.
*   End insert LABK930236
    elseif komvd-stunr = hm00_cond.
      hm00_cond_flag = 'Y'.
      hm00_header_cond_flag = 'Y'.
      add komvd-kwert to book_total.
      total_after_disc_amt = komvd-kwert.
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02'   ITEM_COUNT
*                                                '25' KOMVD-KWERT.
*      ENDIF.
      move komvd-kwert to item_data-book_val.
*     Get HM00 condition type RV 950923
*
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT
*                                                 '16' 'HM00'.
*      ENDIF.
      move 'HM00' to item_data-cond_type.
*   Begin insert LABK929819 -->
*   If ZBJS condition comes before HM00 (older invoices before
*   the c02 config changes would have this.  In which case, if they're
*   HM00, we want all items to be included in fixed price with no
*   separating out of the c02's into additional items. So for the
*   c02, don't process any other condition types.
      if not c02_new_cond_flag is initial.
        exit.
      endif.
*   --> End insert LABK929819

    endif.
  endloop.

endform.

*---------------------------------------------------------------------*
*       FORM ITEM_PRINT                                               *
*---------------------------------------------------------------------*
*       Printout of the items                                         *
*---------------------------------------------------------------------*

form item_print.
  data: material_no like vbdpr-matnr,
        temp_disc type f.

  clear itemtab.                                            "JL9606
  refresh itemtab.                                          "JL9606

* Clear Header level flags.
  clear: zdsc_pos_disc_flag,                                "jb2
         pb00_pb01_err_flag,                                "jb2
         dbl_hm00_err_flag,                                 "jb2
         zdsc_hm00_err_flag,                                "jb2
         dual_cond_err_flag,                                "jb2
         tas_zas_zdsc_error_flag,                           "jb2
         nofobtext_err_flag,                                "LABK934392
         bad_item_no1,                                      "jb2
         bad_item_no2,                                      "jb2
         bad_item_no3,                                      "jb2
         bad_item_no4,                                      "jb2
         bad_item_no5.                                      "jb2

  item_total_after_disc = 0.

*{LABK934226
* Get the Customer ID Number for this invoice
  SELECT SINGLE kunnr FROM vbpa
         INTO g_cust_num
         WHERE vbeln = vbdkr-vbeln
           AND posnr = '000000'
           AND parvw = 'AG'.

  TRANSLATE nast-dsnam TO UPPER CASE.

  IF vbdkr-vbtyp = 'M'.           "for invoices only
    LOOP AT tvbdpr.
      CHECK tvbdpr-pstyv NE 'TAQ'.
      MOVE-CORRESPONDING tvbdpr TO tvbap.
      APPEND tvbap.
    ENDLOOP.
    fob_posnr = '999999'.
    fob_blend = ' '.
  ENDIF.
*}LABK934226

  loop at tvbdpr.
    clear: itax1,itax2, itax3, itax4, itax5, item_data.

    vbdpr = tvbdpr.

*   Make sure a material number exists. If not, do not download to file.
    check not vbdpr-matnr is initial.  "jb6

    select single * from vbrp where
                  vbeln = vbdkr-vbeln and
                  posnr = vbdpr-posnr.

* Clear item level flags.
    clear:   tas_zas_flag,                                  "jb2
             zdsc_cnt_flag,                                 "jb2
             pb00_cnt_flag,                                 "jb2
             pb01_cnt_flag,                                 "jb2
             zdbp_cnt_flag,                                 "jb2
             hm00_cnt_flag.                                 "jb2
*   set zryt flag to zero (assume it does not exist)                "gs5
    zryt_flag = 0.                                          "gs5
*   set net value printed flag to zero so that is only prints one   "gs8
    net_printed = 0.                                        "gs8
*   set zbjs flag to zero (assume it does not exist)               "gs10
    zbjs_flag = 0.                     "gs10

* Get the item text from sales order item.                 "LABK926388
    select single * from vbap                              "LABK926388
      where vbeln = vbdpr-vbeln_vauf                       "LABK926388
        and posnr = vbdpr-posnr_vauf.                      "LABK926388
    vbdpr-arktx = vbap-arktx.                              "LABK926388

*   strip out leading zero's of material no
    write vbdpr-matnr to material_no no-zero.
    condense material_no.
    move vbdpr-arktx to itemtab-arktx.                      "JL1204
    perform get_item_prices.

    if hm00_exists = ' '.              " only loop through this once
      loop at tkomvd. " determine if HM00 cond type exists
        komvd = tkomvd.
      endloop.
    endif.

    if vbrp-pstyv ne 'TAQ'.                                 "gs6
* suppress group item lines, higher-level item NE 0.
      item_count = item_count + 1.
*   Get Material no/ material description
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT
*                                                '10' MATERIAL_NO.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT
*                                                '13' VBDPR-ARKTX.
*      ENDIF.
      move material_no to item_data-mat_num.
      move vbdpr-matnr to item_data-matnr.
      move vbdpr-arktx to item_data-mat_desc.

*   Get Item Quantity (invoiced qty)
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT
*                                                '11' VBDPR-FKIMG.
*      ENDIF.
      move vbdpr-fkimg to item_data-quantity.

*   Get Item Unit of Measure
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT
*                                                '12' VBDPR-VRKME.
*      ENDIF.
      move vbdpr-vrkme to item_data-uom.

*   Get Item category
*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT '14'
*                                                          VBRP-PSTYV.
*      ENDIF.
      move vbrp-pstyv to item_data-category.

      if vbrp-pstyv = 'ZATX'.
        clear: zatx_netwr_sum, zatx_surchg, zatx_net_no_surchg,
               komvd-kwert, nows_disc_perc, nows_disc_amt.

        select * from vbrp into *vbrp where vbeln = vbrp-vbeln and
                 uepos = vbrp-aupos.
          add *vbrp-netwr to zatx_netwr_sum.
          add *vbrp-kzwi1 to komvd-kwert.
*   acc. surcharge of the detail line, can use this to acc other amts.
          perform get_pricing_proc(zvprint3)
                   tables tkomv tax_table   using
                   nows_disc_amt    nows_disc_perc
                   price_adj_amt
                   3party_surchg_amt
                   prov_surchg_amt
                   mat_reimb_amt       "950923 RV
                  *vbrp-posnr
                   zbjs_amt            "gs10
                   nows_spec_disc_amt.                      "LABK918227
          add prov_surchg_amt to zatx_surchg.
          add mat_reimb_amt   to zatx_surchg.               "950923 RV
        endselect.

        add komvd-kwert to book_total.
        total_after_tax = zatx_netwr_sum.
        zatx_net_no_surchg = zatx_netwr_sum - zatx_surchg.
*      ADD ZATX_NET_NO_SURCHG TO ITEM_TOTAL_AFTER_DISC.             "gs2
        add zatx_netwr_sum to item_total_after_disc.        "gs2
        nows_disc_amt = ( komvd-kwert - zatx_net_no_surchg ) * -1.
        temp_disc = ( 1 - ( zatx_net_no_surchg / komvd-kwert ) ) * 100.

*      Why * by 100? There seems to be a problem of converting between
*      float type and nows_disc_perc type (it would be 0.xx without
*      * by 100). I don't know why that is the case!
        nows_disc_perc = temp_disc * 100.
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02' ITEM_COUNT
*                                                 '32' ZATX_NETWR_SUM.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02' ITEM_COUNT
*                                                 '25' KOMVD-KWERT.
*        ENDIF.
        move zatx_netwr_sum to item_data-tt_af_sur.
        move komvd-kwert to item_data-book_val.

       if hm00_exists ne 'Y'. " Only write if there is no HM00 cond type
          if net_printed = 0.                                     "gs8
*            IF PREVIEW = 'NO'.
*              PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02'   ITEM_COUNT
*                                    '29' ZATX_NET_NO_SURCHG.
*            ENDIF.
            move zatx_net_no_surchg to item_data-net_val.
            net_printed = 1.                                       "gs8
          endif.                                                   "gs8
        else.
          if net_printed = 0.                                      "gs8
*            IF PREVIEW = 'NO'.
*              PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02'   ITEM_COUNT
*                                 '29' '           '.
*            ENDIF.
            move '           ' to item_data-net_val.
            net_printed = 1.                                       "gs8
          endif.                                                   "gs8
        endif.

*      if zryt condition type exist for this item,                  "gs5
*      blank out the discount percentage                            "gs5
       if zryt_flag eq 0 and zbjs_flag eq 0.                       "gs10
*         IF PREVIEW = 'NO'.
*           PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                  '24' NOWS_DISC_PERC.
*         ENDIF.
         move nows_disc_perc to item_data-disc_per.
       else .                                                      "gs5
*         IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT  "gs5
*                                                  '24' ' '.        "gs5
*         ENDIF.
         move ' ' to item_data-disc_per.
         if zbjs_flag ne 0 and hm00_cond_flag ne 'Y'.              "gs10
*            IF PREVIEW = 'NO'.
*            PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT "gs10
*                                                   '16' 'ZBJS'.   "gs10
*            ENDIF.
            move 'ZBJS' to item_data-bj_cond.
          endif.                                                   "gs10
        endif.                                                      "gs5
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                '26' NOWS_DISC_AMT.
*        ENDIF.
        move nows_disc_amt to item_data-disc_amt.
        if nows_disc_perc ne 0.
          disc_perc_text = 'Disc. %'.
        endif.
      else.
*   write Item Net Value 2 to file
        add vbdpr-netwr to item_total_after_disc.                   "gs2
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02' ITEM_COUNT
*                                               '32' VBDPR-NETWR.
*        ENDIF.
        move vbdpr-netwr to item_data-tt_af_sur.
        total_after_tax = vbdpr-netwr.
      endif.

      perform item_price_print.

*{LABK934226
* Identify the FOB parent and the items belonging to the same FOB
      IF vbdkr-vbtyp = 'M'               "Invoices Only
        AND g_cust_num = '0001116370'    "Berlington Only
        AND job_type_no >= 100           "Cementing Jobs only
        AND job_type_no <= 199
        AND nast-dsnam <> 'OLD'.         "New Items Only

        fob_parent = 0.
        PERFORM determine_parent USING vbdpr-posnr
                                         vbdpr-uepos
                                         fob_parent.
*     if we have an fob parent, check to see if there is an fob
*     description to use in place of the regular material description
        IF fob_parent EQ 1.
          CLEAR textline.
*         PERFORM get_item_text USING vbdkr-vbeln vbdpr-posnr
*         Get item text from the Sales Order, NOT THE QUOTE
          PERFORM get_item_text USING vbdkr-vbeln_vauf vbdpr-posnr_vauf
                                      '0053' textline.
          IF NOT textline IS INITIAL.
            fob_blend = textline.
          ELSE.                                            "LABK934392
            fob_blend = 'X'.                               "LABK934392
            nofobtext_err_flag = 'X'.                      "LABK934392
          ENDIF.
          fob_posnr = vbdpr-posnr.
        ENDIF.

        IF vbdpr-uepos EQ fob_posnr.
*         This is an FOB detail line
          MOVE tvbdpr-uepos TO item_data-uepos.
          MOVE tvbdpr-posnr TO item_data-posnr.
          MOVE fob_blend    TO item_data-mat_desc.
        ELSE.
*         This might be an FOB parent and/or FOB detail line
          tvbdpr-posnr = '000000'.
          IF vbdpr-posnr EQ fob_posnr.
            tvbdpr-arktx = fob_blend.
            tvbdpr-posnr = fob_posnr.
          ENDIF.
*         Make sure it is a detail line
          IF tvbdpr-posnr EQ fob_posnr.
            MOVE fob_posnr TO tvbdpr-uepos.
            MOVE fob_blend TO item_data-mat_desc.
          ENDIF.
          MOVE tvbdpr-uepos TO item_data-uepos.
          MOVE tvbdpr-posnr TO item_data-posnr.
        ENDIF.
      ENDIF.
*}LABK934226

*   Get item taxes
      perform get_pricing_proc(zvprint3) tables tkomv tax_table   using
                     nows_disc_amt    nows_disc_perc
                     price_adj_amt
                     3party_surchg_amt
                     prov_surchg_amt
                     mat_reimb_amt
                     vbdpr-posnr
                     zbjs_amt            "gs10
                     nows_spec_disc_amt.                     "LABK918227

      if hm00_cond_flag = 'Y'.
        clear: nows_disc_amt, nows_disc_perc, price_adj_amt,
               3party_surchg_amt, prov_surchg_amt, mat_reimb_amt,
                   zbjs_amt,            "gs10
                   nows_spec_disc_amt.                       "LABK918227
      endif.

      if nows_disc_perc ne 0.
        disc_perc_text = 'Disc. %'.
      endif.

      if vbrp-pstyv ne 'ZATX'.
*
*      if zryt condition type exist for this item,                  "gs5
*      blank out the discount percentage                            "gs5
       if zryt_flag eq 0 and zbjs_flag eq 0.                       "gs10
*         IF PREVIEW = 'NO'.
*           PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                  '24' NOWS_DISC_PERC.
*         ENDIF.
         move nows_disc_perc to item_data-disc_per.
        else.                                                       "gs5
*         IF PREVIEW = 'NO'.
*         PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT   "gs5
*                                                 '24' ' '.         "gs5
*         ENDIF.
         move ' ' to item_data-disc_per.
         if zbjs_flag ne 0 and hm00_cond_flag ne 'Y'.              "gs10
*           IF PREVIEW = 'NO'.
*           PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02' ITEM_COUNT  "gs10
*                                                  '16' 'ZBJS'.    "gs10
*           ENDIF.
           move 'ZBJS' to item_data-bj_cond.
          endif.                                                   "gs10
        endif.                                                     "gs5
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                  '26' NOWS_DISC_AMT.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                  '27' PRICE_ADJ_AMT.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                                '28' 3PARTY_SURCHG_AMT.
*        ENDIF.
        move nows_disc_amt to item_data-disc_amt.
        move price_adj_amt to item_data-price_ad.
        move 3party_surchg_amt to item_data-3pty_sur.
      endif.
      if vbrp-pstyv = 'ZFOB' or vbrp-pstyv = 'AGNN' or
         vbrp-pstyv = 'ZFOC' or vbrp-pstyv = 'TANN'.
        if net_printed = 0.                                        "gs8
*          IF PREVIEW = 'NO'.
*            PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02'   ITEM_COUNT
*                                     '29' '           '.
*          ENDIF.
          move '        ' to item_data-net_val.
          net_printed = 1.                                         "gs8
        endif.                                                     "gs8
      endif.

      if vbrp-pstyv ne 'ZATX'.
        if c02_new_cond_flag = ' '.                        "LABK929500
          total_after_disc_amt = total_after_disc_amt +
                  nows_disc_amt + price_adj_amt + 3party_surchg_amt
                + zbjs_amt.              "gs10
        else.                                               "LABK929500
          total_after_disc_amt = total_after_disc_amt +     "LABK929500
          nows_disc_amt + price_adj_amt + 3party_surchg_amt."LABK929500
        endif.                                              "LABK929500
       if hm00_exists ne 'Y'. " Only write if there is no HM00 cond type
          if net_printed = 0.                               "gs8
*            IF PREVIEW = 'NO'.
*              PERFORM WRITE_TO_FILEA(ZVPRINT3) USING '02'   ITEM_COUNT
*                                             '29' TOTAL_AFTER_DISC_AMT.
*            ENDIF.
            move total_after_disc_amt to item_data-net_val.
            net_printed = 1.                                "gs8
          endif.                                            "gs8
        else.
          if net_printed = 0.                               "gs8
*            IF PREVIEW = 'NO'.
*              PERFORM WRITE_TO_FILE(ZVPRINT3) USING '02'   ITEM_COUNT
*                                  '29' '           '.
*            ENDIF.
            move '          ' to item_data-net_val.
            net_printed = 1.                                "gs8
          endif.                                            "gs8
        endif.
*     ADD TOTAL_AFTER_DISC_AMT TO ITEM_TOTAL_AFTER_DISC.            "gs2
      endif.

*      if vbrp-pstyv = 'ZTAP' or vbrp-pstyv = 'TANN' or     "LABK930236
*         vbrp-pstyv = 'ZFOC'.                              "LABK930236
*        item_data-book_val = item_data-net_val = 0.        "LABK930236
*      endif.                                               "LABK930236

***************************************************************start jb2
* This section is used to determine if the invoice violates any
* pricing conditions. GET_PRICING_INFO is used to fill the
* PRICING_INFO table with the pricing condition values
* (TYPE, VALUE, COUNTER).
* This section should be used to add any other pricing condition
* violations that need to be flagged with DO NOT MAIL (using the
* subroutine PRINT_INVOICE_HEADER_ERROR   .
* NOTE: for each new condition that is added, 2 new flag variables
*       need to be created. One as a counter, one as an indicator to
*       flag with DO NOT MAIL.
*       A new BAD_ITEM_NO# variable needs to be created
*       where # is the next number in the sequence of violations.
*       e.g. as of Feb 3, 1997 the number of violation conditions
*       is up to 5.
*       New error messages for DO NOT MAIL need to be created in
*       the subroutine HEADER_PRICE_PRINT.


      perform get_pricing_info(zvprint3) using vbrp-vbeln vbrp-posnr
              dum_rc dum_post_amt dum_pbook dum_cond_amt dum_cond_type .


      loop at pricing_info.
        case pricing_info-condition_type.
          when 'PB00'.
            if pricing_info-condition_amount gt 0.
              add 1 to pb00_cnt_flag.
            endif.
          when 'PB01'.
            if pricing_info-condition_amount gt 0.
              add 1 to pb01_cnt_flag.
            endif.
          when 'ZDBP'.
            if pricing_info-condition_amount gt 0.
              add 1 to zdbp_cnt_flag.
            endif.
          when 'HM00'.
            if pricing_info-condition_amount gt 0.
              add pricing_info-condition_counter to hm00_cnt_flag.
            endif.
          when 'ZDSC'.
            if pricing_info-condition_amount lt 0.
              add 1 to zdsc_cnt_flag.
            elseif pricing_info-condition_amount gt 0. "Positive disc.
              zdsc_pos_disc_flag = 'X'.
              write vbdpr-posnr to bad_item_no1 no-zero.
              condense bad_item_no1 .
            endif.
        endcase.
      endloop.

*     Only perform checks if document is a Pro Forma or an Invoice  jb2
      if ( vbdkr-vbtyp = 'M' or vbdkr-vbtyp = 'U' )
*     and the document # is greater than last one created April 4/97 jb4
          and vbdkr-vbeln gt '0071041090'.

*       Check if item is in category TAS or ZAS                     jb2
        if vbrp-pstyv = 'TAS' or  vbrp-pstyv = 'ZAS'.
          tas_zas_flag = 'X'.
          write vbdpr-posnr to bad_item_no5 no-zero.
          condense bad_item_no5 .
        endif.

*       Check if PB00 and PB01 are together on same item.          jb2
        if pb00_cnt_flag gt 0 and pb01_cnt_flag gt 0.
          write vbdpr-posnr to bad_item_no2 no-zero.
          condense bad_item_no2 .
          pb00_pb01_err_flag = 'X'.
        endif.

*       Check if there is a double HM00 condition.    jb2
        if hm00_cnt_flag gt 1.
          dbl_hm00_err_flag = 'X'.
        endif.

*       Check for HM00 and ZDSC on the same item.        jb2
        if hm00_cnt_flag gt 0 and zdsc_cnt_flag gt 0.
          write vbdpr-posnr to bad_item_no3 no-zero.
          condense bad_item_no3 .
          zdsc_hm00_err_flag = 'X'.
        endif.

*       Check for ZDSC_CNT_FLAG and TAS_ZAS_FLAG.                jb2
        if zdsc_cnt_flag gt 0 and tas_zas_flag = 'X'.
          tas_zas_zdsc_error_flag = 'X'.
        endif.

*       Check if item is in category ZBJS along with PB00, PB01, ZDBP
        if zbjs_flag gt 0
           and ( pb00_cnt_flag gt 0 or pb01_cnt_flag gt 0
                                        or zdbp_cnt_flag gt 0 ).
          write vbdpr-posnr to bad_item_no4 no-zero.
          condense bad_item_no4 .
          dual_cond_err_flag = 'X'.
        endif.
      endif.

**************************************************************** end jb2

      if prov_surchg_amt ne 0.
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                               '30' PROV_SURCHG_AMT.
*        ENDIF.
        move prov_surchg_amt to item_data-prov_sur.
      endif.

      if mat_reimb_amt ne 0.           "950923 RV
*        IF PREVIEW = 'NO'.
*     PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT "950923 RV
*                                         '40' MAT_REIMB_AMT. "950923 RV
*        ENDIF.
        move mat_reimb_amt to item_data-mat_reim.
      endif.                           "950923 RV

      tax_id = 32.
      loop at tax_table.
        add 1 to tax_id.
        add tax_table-tax_amount to total_after_tax.
*        IF PREVIEW = 'NO'.
*          PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                       TAX_ID  TAX_TABLE-TAX_AMOUNT.
*        ENDIF.
        case tax_id.
          when 33.
            move tax_table-tax_amount to itax1.
          when 34.
            move tax_table-tax_amount to itax2.
          when 35.
            move tax_table-tax_amount to itax3.
          when 36.
            move tax_table-tax_amount to itax4.
          when 37.
            move tax_table-tax_amount to itax5.
        endcase.
      endloop.

*      IF PREVIEW = 'NO'.
*        PERFORM WRITE_TO_FILEA(ZVPRINT3)  USING '02' ITEM_COUNT
*                                              '38' TOTAL_AFTER_TAX.
*      ENDIF.
      MOVE item_data-mat_desc to itemtab-arktx.             "LABK934392
      move total_after_tax to item_data-fin_amt.
      move item_count to itemtab-item_count.                "JL9608
      move material_no   to itemtab-material_no.            "JL9608
                                       "JL1204 arktx added
      append itemtab.                                       "JL9608
    endif.

* Used to put a '*' in front of items that have no T related tax
    if itax2 ne 0.
      move '*' to item_data-tax_flag.
    else.
      move ' ' to item_data-tax_flag.
    endif.

* Save item data to internal table
    move item_count to item_data-count.
   if item_data-category ne 'ZON'.
     check item_data-mat_desc ne ' '.
      append item_data.
   endif.

  endloop.
*{ Start Insert LABK934392
  SORT item_data BY mat_num uepos descending posnr descending.
*} End Insert LABK934392
  if quote_flag = 1.                                        "JL9605
    if vbdkr-vbtyp <> 'O'.    "Don't need quote info for Credit Memos
*{Start insert LABK934392
      IF vbdkr-vbtyp = 'M'                "Invoices Only
         AND g_cust_num = '0001116370'    "Berlington Only
         AND job_type_no >= 100           "Cementing Jobs only
         AND job_type_no <= 199
         AND nast-dsnam <> 'OLD'.         "New Items Only

        perform get_quantity_quoted tables  itemtab item_data
                       using    quotation  item_count.
      ELSE.
*} End insert LABK934392
        perform write_data_to_access tables  itemtab item_data  "JL
                       using    quotation  item_count.         "JL9605
*                                PREVIEW.
      ENDIF.
    endif.
  endif.                                                    "JL9605

*{ Start Insert LABK934392            ------------------------
* Collect the FOB items together with the parent
  data: l_fobparent LIKE item_gr1-posnr,
        fob_inhand.

  IF vbdkr-vbtyp = 'M'                "Invoices Only
     AND g_cust_num = '0001116370'    "Berlington Only
     AND job_type_no >= 100           "Cementing Jobs only
     AND job_type_no <= 199
     AND nast-dsnam <> 'OLD'.         "New Items Only

    REFRESH item_tmp.
    SORT item_data BY uepos posnr.

* The list Unit Price for the FOB = total gross price/parent Qty used
* The Disc Unit Price for the FOB = total net price / parent Qty used
    LOOP AT item_data.
      IF NOT item_data-uepos IS INITIAL.
        IF item_data-posnr = item_data-uepos.
          l_fobparent = item_data-uepos.
          IF fob_inhand = 'X'.
            APPEND item_tmp.
            CLEAR fob_inhand.
          ENDIF.
          item_tmp = item_data.
          fob_inhand = 'X'.
        ELSEIF l_fobparent = item_data-uepos.
          fob_inhand = 'X'.
          ADD: item_data-tt_af_sur TO item_tmp-tt_af_sur,
               item_data-net_val   TO item_tmp-net_val,
               item_data-disc_amt  TO item_tmp-disc_amt,
               item_data-price_ad  TO item_tmp-price_ad,
               item_data-3pty_sur  TO item_tmp-3pty_sur,
               item_data-prov_sur  TO item_tmp-prov_sur,
               item_data-mat_reim  TO item_tmp-mat_reim,
               item_data-fin_amt   TO item_tmp-fin_amt.
        ENDIF.
      ELSE.
        APPEND item_data TO item_tmp.
        CLEAR fob_inhand.
      ENDIF.
    ENDLOOP.
    IF fob_inhand = 'X'.
      APPEND item_tmp.
    ENDIF.
    REFRESH item_data.
    item_data[] = item_tmp[].
    SORT item_data BY matnr.
  ENDIF.
*} End Insert LABK934392 -----------------------------

endform.
* To prepare data for reformatting sales order
*
include zvrefsi2.                                           "JL9605


*---------------------------------------------------------------------*
*       FORM SENDER                                                   *
*---------------------------------------------------------------------*
*       This routine determines the address of the sender (Table VKO) *
*---------------------------------------------------------------------*

form sender.

  select single * from tvko  where vkorg = vbdkr-vkorg.
  check sy-subrc = 0.
  select single * from sadr where adrnr = tvko-adrnr
                            and   natio = space.
  vbdkr-sland = sadr-land1.

endform.


************************************************************************
*      FORM WRITE_HEADER_INFO_TO_FILE
************************************************************************
* - This routine writes any header data to the file that could not be
*   written in the code already given.
*
************************************************************************
form write_header_info_to_file.

*  DATA: LENGTH TYPE I, OUT_FNAME(12), TITLE(35).
  data: length type i, title(35).
***JL        QUOTE_FLAG TYPE I VALUE 0.

  data: l_ref_vbeln like vbdkr-vbeln.                      "LABK928636

  clear quote_flag.                                        "JL
  item_count = 0.
  length = strlen( vbdkr-vbeln ) - 8.
  assign vbdkr-vbeln+length(8) to .
*  FILENAM = .
** to get path from FILENAME
**check 'department' field for drop zone indicator                  "gs7
*  IF PREVIEW = 'NO'.
*
*  PERFORM GET_PATH_NAME(ZVPRINT3) USING                 "gs7
*          PATH 'INVBCK' CHANGING RETCODE.                "gs7
*  IF RETCODE NE 0.
*    SUBMIT ZCALLERR WITH RET_CODE = RETCODE
*                    WITH MAIN_PGM = SY-REPID.
*    EXIT.
*  ENDIF.
*  PERFORM OPEN_FILE(ZVPRINT3) USING FILENAM OUT_FNAME
*                                       PATH.
*
*  ENDIF.          "if preview = 'no'

* Get document title
* These titles can be found in layout set RVINVOICE01.
  case vbdkr-vbtyp.
    when 'M'.
      title = 'Invoice'.
      perform get_document_title using title doc_type.
    when 'N'.
      perform get_document_title using title  doc_type.
      title = 'Reverse Document'.
    when 'O'.
      title = 'Credit Memo'.
      perform get_document_title using title  doc_type.
    when 'P'.
      title = 'Debit Memo'.
      perform get_document_title using title   doc_type.
    when 'S'.
      perform get_document_title using title  doc_type.
      title = 'Reverse Credit Memo'.
    when 'U'.
      perform get_document_title using title   doc_type.
      title = 'Pro Forma Invoice'.     " No Draft/Copy prefix required
    when others.
      title = 'Invoice'.
  endcase.

*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '01' TITLE.
*  ENDIF.

* concatenate title '(Do Not Use)' into title separated by ' '.
  move title to zinvoice01-title.

* Get Sales Order
  clear: sales_ord, quote.
  refresh: sales_ord, quote.
  perform get_inv_related_docs(zvprint3) tables sales_ord quote
                              using vbdkr-vbeln   doc_type.
  read table sales_ord index 1.  " Only use first sales ord for now
  move sales_ord-vbeln to vbdkr-vbeln_vauf.

* Get Invoice number / Invoice date
*  IF PREVIEW = 'NO'.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '06' VBDKR-VBELN.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '23' VBDKR-FKDAT.
*  ENDIF.
  move vbdkr-vbeln to zinvoice01-inv_num.
  move vbdkr-fkdat to zinvoice01-inv_date.

* Get Reference no/date, Delivery no/date, Order no/date
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                               '18' SALES_ORD-BSTNK.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                                '19' SALES_ORD-BSTDK.
*  ENDIF.
  move sales_ord-bstnk to zinvoice01-po_num.
  move sales_ord-bstdk to zinvoice01-so_date.

* Get all delivery notes
  perform get_del_notes tables del_note_tbl
                            using vbdkr-vbeln_vauf   del_notes.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '05' DEL_NOTES.
*  ENDIF.
  concatenate 'Delivery Note: ' del_notes(36) into zinvoice01-delnotes.
  move del_notes+36  to zinvoice01-delnotes2.

*
* WRite out SAp Document type, F8, F2, S1, etc   RV 950923
*
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '78' DOC_TYPE.
*  ENDIF.
  move doc_type to zinvoice01-doc_type.
*
  if doc_type cs 'L2' or doc_type cs 'G2'.
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                                 '22' SALES_ORD-VDATU.
*    ENDIF.
    move sales_ord-vdatu to zinvoice01-del_date.
  else.
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                                   '22' VBDKR-LFDAT.
*    ENDIF.
    move vbdkr-lfdat to zinvoice01-del_date.
  endif.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                               '04' VBDKR-VBELN_VAUF.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                               '09' VBDKR-AUDAT_VAUF.
*  ENDIF.
  move vbdkr-vbeln_vauf to zinvoice01-order_num.
  move vbdkr-audat_vauf to zinvoice01-order_date.

* Get invoice currency code
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                                 '15' VBDKR-WAERK.
*  ENDIF.
  move vbdkr-waerk to zinvoice01-curr_code.

* Get invoiced address*******ship to party
  perform write_ship_to_party_info_2(zvprint3)
                                 using vbdkr-vbeln '01' '000001'
                                       zinvoice01-dir1
                                       zinvoice01-dir2
                                       zinvoice01-cust_num
                                       zinvoice01-cust_name
                                       zinvoice01-sp_addr1
                                       zinvoice01-sp_addr2
                                       zinvoice01-sp_pcode
                                       zinvoice01-sp_city
                                       zinvoice01-sp_country
                                       zinvoice01-sp_region
                                       zinvoice01-sp_addr3
                                       zinvoice01-sp_addr4
                                       zinvoice01-dir3
                                       zinvoice01-acct_group
                                       zinvoice01-tax_exempt.
*                                       PREVIEW.

* find well name and location stored in name1 and location fields of
* ZB partner
* perform get_well_data(zvprint3) using vbdkr-vbeln '01' '000001'.  "gs9
* get location data using so number instead of invoice number       "gs9
  perform get_well_data(zvprint3) using                             "gs9
                                    vbdkr-vbeln_vauf '01' '000001'
                                        zinvoice01-bp_county
                                        zinvoice01-well_name
                                        zinvoice01-formation
                                        zinvoice01-zb_street
                                        zinvoice01-zb_country
                                        zinvoice01-zb_pcode
                                        zinvoice01-zb_region.
*                                        PREVIEW.

* Get Date of Service
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                               '21' SALES_ORD-VDATU.
*  ENDIF.
  move sales_ord-vdatu to zinvoice01-req_del_dt.

* Get job type description
  job_type_no = sales_ord-kvgr1.
*** IJ1 Replace Starts
*  select single * from tvv1t where spras = sy-langu and
*                                   kvgr1 = job_type_no.
  select single * from T25A2 where spras = sy-langu and
                                   kvgr1 = job_type_no.
*** IJ1 Replace Ends
*  IF PREVIEW = 'NO'.
** PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '07' TVV1T-BEZEI.
*   PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '07' "LABK926189
*                                         TVV1T-BEZEI+4(16). "LABK926189
*  ENDIF.
* MOVE TVV1T-BEZEI TO ZINVOICE01-JOB_TYPE.
  if vbdkr-vkorg = '9040' and                               "LABK931123
     vbdkr-fkdat >= '20011001'.                             "LABK931123
*** IJ1 Replace Starts
*    move tvv1t-bezei to zinvoice01-job_type.                "LABK931123
*  else.                                                     "LABK931123
*    move tvv1t-bezei+4(16) to zinvoice01-job_type.          "LABK926189
    move t25A2-bezek to zinvoice01-job_type.                "LABK931123
  else.                                                     "LABK931123
*    move t25A2-bezek+4(16) to zinvoice01-job_type.          "LABK926189
    move t25A2-bezek to zinvoice01-job_type.          "LABK931491
*** IJ1 Replace Ends
  endif.                                                    "LABK931123

* Write Tax Jurisdiction to file    jb3.

  select single * from vbpa where
                   parvw = 'WE' and
                   posnr = '000000' and
                   vbeln = vbdkr-vbeln.
*  IF PREVIEW = 'NO'.
*   PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '39' VBPA-KUNNR.
*  ENDIF.
  move vbpa-kunnr to tax_jcd.

* When printing invoices, check to make sure the SHIP-TO/TAX AREA
* is the same across all preceding documents. jb5
  if ( vbdkr-vbtyp = 'M' or vbdkr-vbtyp = 'U' ).                    "gh1
    perform check_for_diff_shipto.
  endif.

* write salesman name to file
  clear p0001.
  select single * from vbpa where
                   parvw = 'VE' and
                   posnr = '000000' and
                   vbeln = vbdkr-vbeln.

* This select statement modified with PA0001. LABKK902133 - jb1
* The move-corresponding is probably not necessary, but is kept in
* until it can be determined for sure that it is not req'd.

*  SELECT * FROM PREL WHERE INFTY = '0001' AND
*                           PERNR = VBPA-PERNR.
*    MOVE PREL+3 TO P0001.

  select * from pa0001 where pernr = vbpa-pernr.
    move-corresponding pa0001 to p0001.
  endselect.
*  IF PREVIEW = 'NO'.
*  PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '08' P0001-ENAME.
*  ENDIF.
  move p0001-ename to zinvoice01-salesman.

* Get quotation number
  clear quotation.                                          "JL9606
  read table quote     index 1.        " Only use first quote for now
* if sy-subrc = 0 and quote-auart = 'AG'.      "  Quotation type    "gh2
  if sy-subrc = 0 and ( quote-auart = 'AG' or quote-auart = 'ZZQT' ).
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001'
*                                            '02'    QUOTE-VBELN.
*    ENDIF.
    move quote-vbeln to zinvoice01-quote_num.
    quote_flag = 1.
    quotation = quote-vbeln.                                "JL9606
  endif.
  if quote_flag = 0.
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '02' '  '.
*    ENDIF.
    move '  ' to zinvoice01-quote_num.
  endif.

*  Get proposal number
* Check whether this doc's order was copied from another   "LABK928636
* and if so, retrace until we get to the original order    "LABK928636
* and get the text for this order.                         "LABK928636
  clear: l_ref_vbeln, textline.                            "LABK928636
  perform trace_ref_doc_text using '0004' changing         "LABK928636
                                   l_ref_vbeln.            "LABK928636
  if not l_ref_vbeln is initial.                           "LABK928636
    perform get_header_text(zvprint3) using l_ref_vbeln    "LABK928636
                                      '0004' textline.     "LABK928636
  else.                                                    "LABK928636
    perform get_doc_header_text using vbdkr-vbeln
        vbdkr-vbeln_vauf   quote-vbeln  '0004' textline.
  endif.                                                   "LABK928636

*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '03'
*                                               TEXTLINE.
*  ENDIF.
  move textline to zinvoice01-prop_num.

*  Get SO ticket no
  perform get_doc_header_text using
        vbdkr-vbeln     vbdkr-vbeln_vauf   quote-vbeln  '0015' textline.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '73'
*                                               TEXTLINE.
*  ENDIF.
  move textline to zinvoice01-so_ticket.

*  Get AFE no
* Check whether this doc's order was copied from another   "LABK928636
* and if so, retrace until we get to the original order    "LABK928636
* and get the text for this order.                         "LABK928636
  clear: l_ref_vbeln, textline.                            "LABK928636
  perform trace_ref_doc_text using '0003' changing         "LABK928636
                                   l_ref_vbeln.            "LABK928636
  if not l_ref_vbeln is initial.                           "LABK928636
    perform get_header_text(zvprint3) using l_ref_vbeln    "LABK928636
                                      '0003' textline.     "LABK928636
  else.                                                    "LABK928636
    perform get_doc_header_text using  vbdkr-vbeln
         vbdkr-vbeln_vauf   quote-vbeln  '0003' textline.
  endif.                                                   "LABK928636

*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '70' TEXTLINE.
*  ENDIF.
  move textline to zinvoice01-afe_num.

*  Get sales customer contact
  perform get_doc_header_text using
        vbdkr-vbeln     vbdkr-vbeln_vauf   quote-vbeln  '0001' textline.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '71' TEXTLINE.
*  ENDIF.
  move textline to zinvoice01-sales_cont.

*  Get field customer contact
* Check whether this doc's order was copied from another   "LABK928790
* and if so, retrace until we get to the original order    "LABK928790
* and get the text for this order.                         "LABK928790
  clear: l_ref_vbeln, textline.                            "LABK928790
  perform trace_ref_doc_text using '0031' changing         "LABK928790
                                   l_ref_vbeln.            "LABK928790
  if not l_ref_vbeln is initial.                           "LABK928790
    perform get_header_text(zvprint3) using l_ref_vbeln    "LABK928790
                                      '0031' textline.     "LABK928790
  else.                                                    "LABK928790
    perform get_doc_header_text using
        vbdkr-vbeln     vbdkr-vbeln_vauf   quote-vbeln  '0031' textline.
  endif.                                                   "LABK928790
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '72' TEXTLINE.
*  ENDIF.
  move textline to zinvoice01-ops_cont.

*  Get invoice comment
  perform get_header_text(zvprint3) using vbdkr-vbeln '0033' text240.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '74'   TEXT240.
*  ENDIF.
  perform get_header_text_2(zvprint3) using vbdkr-vbeln '0033' line1
                                      line2 line3 line4.
  if vbdkr-vbtyp = 'U' and zinvoice01-delnotes <> ' '.     "pro forma
    if zinvoice01-delnotes2 <> ' '.
      move: zinvoice01-delnotes  to zinvoice01-comment1,
            zinvoice01-delnotes2 to zinvoice01-comment2,
            line1                to zinvoice01-comment3,
            line2                to zinvoice01-comment4.
    else.
      move: zinvoice01-delnotes  to zinvoice01-comment1,
            line1                to zinvoice01-comment2,
            line2                to zinvoice01-comment3,
            line3                to zinvoice01-comment4.
    endif.
  else.
    move: line1 to zinvoice01-comment1,
          line2 to zinvoice01-comment2,
          line3 to zinvoice01-comment3,
          line4 to zinvoice01-comment4.
  endif.

*  Get Base in Charge
  perform get_doc_header_text using
        vbdkr-vbeln     vbdkr-vbeln_vauf   quote-vbeln  '0032' text80.
  select single * from tvstt where spras = sy-langu and
                                   vstel = text80(4).
  if sy-subrc = 0.
    text80 = tvstt-vtext.
  endif.
*  IF PREVIEW = 'NO'.
*    PERFORM WRITE_TO_FILE(ZVPRINT3) USING '01' '000001' '75' TEXT80.
*  ENDIF.
  move text80 to zinvoice01-base_chrge.

* Get Freight
* if no freight condition exists, 0.00 written                       "gs
  clear freight_value.                                      "gs
  select * from vbrk where                                  "gs
    vbeln = vbdkr-vbeln.                                    "gs
    select * from konv where                                "gs
      knumv = vbrk-knumv      "doc. cond. number                   "gs
      and kschl = 'HD00'.     "condition type                      "gs
      freight_value = freight_value + konv-kwert.                  "gs
    endselect.                                                     "gs
    exit.                                                          "gs
  endselect.                                                       "gs
  if freight_value eq 0.    "write out line but with a blank       "gs
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING                        "gs
*                          '01' '000001' '94' ' '.                  "gs
*    ENDIF.
    move ' ' to zinvoice01-freight.
  else.                                                            "gs
*    IF PREVIEW = 'NO'.
*      PERFORM WRITE_TO_FILE(ZVPRINT3) USING                        "gs
*                          '01' '000001' '94' FREIGHT_VALUE.        "gs
*    ENDIF.
    move freight_value to zinvoice01-freight.
  endif.                                                           "gs
*
endform.


*---------------------------------------------------------------------*
*       FORM GET_DOC_HEADER_TEXT                                      *
*---------------------------------------------------------------------*
*  Get the header text for this document                              *
*---------------------------------------------------------------------*
form get_doc_header_text using invoice_hdr sales_hdr quote_hdr
                                                        txt_id   txt.

  perform get_header_text(zvprint3) using invoice_hdr txt_id txt.
  if txt = space.
    if not sales_hdr is initial.                           "LABK926703
      perform get_header_text(zvprint3) using sales_hdr txt_id txt.
    endif.                                                 "LABK926703
    if txt = space.
      if not quote_hdr is initial.                         "LABK926703
        perform get_header_text(zvprint3) using quote_hdr txt_id txt.
      endif.                                               "LABK926703
    endif.
  endif.

endform.

*---------------------------------------------------------------------*
*       FORM GET_DOCUMENT_TITLE                                       *
*---------------------------------------------------------------------*
*  Get the correct title for invoices, credit memos, debit memos      *
*---------------------------------------------------------------------*
form get_document_title using doc_title   document_type.

  tables: stxl, stxh.

  data: temp_str(15) type c.

  data: begin of stxl_id occurs 0,
          tdobject like stxl-tdobject,
          tdname   like stxl-tdname,
          tdid     like stxl-tdid,
          spras    like stxl-tdspras,
        end of stxl_id.

  data: begin of lines occurs 0.
          include structure tline.
  data: end of lines.

  data: textname(18) type c.

  clear textname.

  select * from vbfa where vbelv = vbdkr-vbeln_vauf and vbtyp_n = 'N'.
    move vbfa-vbeln to cancelled_docs-vbeln.
    collect cancelled_docs.            " Save it to an internal table.
  endselect.

  select single * from vbrk where vbeln = vbdkr-vbeln.
  document_type = vbrk-fkart.
  if vbrk-rfbsk = 'C'.                 "  Accounting doc was created.
    select single * from bkpf where bukrs = vbrk-bukrs and
                                    belnr = vbrk-belnr and
                                    gjahr = vbrk-gjahr.
*   Compare acct doc created date/time against last print date/time
    if ( last_print_date > bkpf-cpudt ) or
       ( last_print_date = bkpf-cpudt and
             last_print_time > bkpf-cputm ).

* Check for repeat of original print (indicated in the header text
* of the document in the Invoice Comment), or else just a copy
      move: 'VBBK'      to stxl_id-tdobject,
            vbdkr-vbeln to stxl_id-tdname,
            '0011'     to stxl_id-tdid,
            sy-langu   to stxl_id-spras.

      import tline to lines from database stxl(tx) id stxl_id.
      if sy-subrc = 0.
        loop at lines.
          move lines-tdline to textname.
          exit.
        endloop.
        translate textname to upper case.
        delete from database stxl(tx) id stxl_id.
      endif.
      if textname ns 'ORIGINAL'.
        temp_str = 'Copy'.
      endif.
    endif.
  endif.

* Cancelled document?
  loop at cancelled_docs.
    select single * from vbrk where vbeln = cancelled_docs-vbeln.
    if sy-subrc = 0.
      if vbrk-sfakn = vbdkr-vbeln.
        move 'Cancelled' to temp_str.
        exit.
      endif.
    endif.
  endloop.

  concatenate temp_str doc_title into doc_title separated by ' '.

endform.

*---------------------------------------------------------------------*
*       FORM CHECK_REPEAT                                             *
*---------------------------------------------------------------------*
*       A text is printed, if it is a repeat print for the document.  *
*---------------------------------------------------------------------*

form check_repeat.

  clear repeat.
  select * into *nast from nast where kappl = nast-kappl
                                and   objky = nast-objky
                                and   kschl = nast-kschl
                                and   spras = nast-spras
                                and   parnr = nast-parnr
                                and   parvw = nast-parvw
                                and   nacha between '1' and '4'.
    check *nast-vstat = '1'.
    move *nast-datvr to last_print_date.
    move *nast-uhrvr to last_print_time.
    repeat = 'X'.
*   EXIT.
  endselect.
endform.

*---------------------------------------------------------------------*
*       FORM GET_DEL_NOTES.                                           *
*---------------------------------------------------------------------*
*       Look for all delivery notes related to the billing document   *
*---------------------------------------------------------------------*

form get_del_notes tables deliv_intab structure del_note_tbl
                          using sales_order    del_notes_str.
  data: len1 type i.

  clear: deliv_intab, del_notes_str.
  refresh: deliv_intab.

  select * from vbfa where vbelv = sales_order
                     and vbtyp_n = 'J'.         " just del notes
    move-corresponding vbfa to deliv_intab.
    collect deliv_intab.
  endselect.

  loop at deliv_intab.
    clear: sy-subrc.
*   only delivery notes related to the billing document
    select * from vbfa where vbelv = deliv_intab-vbeln
                         and vbeln = vbdkr-vbeln
                         and vbtyp_v = 'J'.
      exit.
    endselect.
    if sy-subrc = 0.
      t_string = deliv_intab-vbeln.
      len = strlen( t_string ).
      do len times.
        if t_string-char = '0' or t_string = ' '.
          shift t_string left.
        else.
          exit.
        endif.
      enddo.
* ************************************************************
*  To eliminate Raising Too Small Exception
      len1 = strlen( del_notes_str ).
      if len1 > 69.
        exit.
      endif.
* **************************************************************

      concatenate del_notes_str t_string into del_notes_str
                                    separated by ' '.
    endif.
  endloop.

endform.


*&---------------------------------------------------------------------*
*&      Form  CHECK_FOR_DIFF_SHIPTO  jb5
*&---------------------------------------------------------------------*
*       this routine checks to make sure the ship-to / tax area
*       is the same on both the invoice and sales order.
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form check_for_diff_shipto.

* Check Sales Order
  select single * from vbpa where
                   parvw = 'WE' and
                   posnr = '000000' and
                   vbeln = vbdkr-vbeln_vauf.

  if sy-subrc = 0.
    if vbpa-kunnr ne vbdkr-kunwe.
      shipto_diff_flag = 'X'.
    else.
* Check Delivery Note
      select single * from vbpa where
                       parvw = 'WE' and
                       posnr = '000000' and
                       vbeln = vbdkr-vbeln_vl.
      if sy-subrc = 0.
        if vbpa-kunnr ne vbdkr-kunwe.
          shipto_diff_flag = 'X'.
        endif.
      endif.
    endif.
  endif.

endform.                               " CHECK_FOR_DIFF_SHIPTO
*&---------------------------------------------------------------------*
*&      Form  MASSAGE_DATA
*&---------------------------------------------------------------------*
form massage_data.

  data: new_val(15)   type c,
        additional(1) type c,
        regular(1)    type c,
        lines         type i.


*  Convert appropriate header data to upper case.
  translate zinvoice01-afe_num to upper case.
  translate zinvoice01-po_num to upper case.
  translate zinvoice01-so_ticket to upper case.
  translate zinvoice01-well_name to upper case.
  translate zinvoice01-bp_county to upper case.

*  Service description window formatting
  if zinvoice01-well_name cs 'Name'.
    move ' ' to zinvoice01-well_name.
  endif.
  if zinvoice01-bp_country cs 'Location'.
    move ' ' to zinvoice01-bp_country.
  endif.

*  Prepare total box data
  perform convert_no_to_str2(zvprint3)  using
                                   zinvoice01-hfinal_amt 2 'Y' new_val.
* move new_val to zinvoice01-totalline5.
* move new_val to zinvoice01-totalline6.                    "LABK918227
  move new_val to zinvoice01-totalline7.                    "LABK934576

* Taxes
  if tax2 ne 0 or tax5 ne 0.

    if tax_jcd(3) = 'CAQ'.
*     move '  Q.S.T.' to zinvoice01-descline3.
*     move '  Q.S.T.' to zinvoice01-descline4.              "LABK918227
      move '  Q.S.T.' to zinvoice01-descline5.              "LABK934576
    else.
*     move '* Provincial Tax' to zinvoice01-descline3.
*     move '* Provincial Tax' to zinvoice01-descline4.      "LABK918227
      move '* Provincial Tax' to zinvoice01-descline5.      "LABK934576
    endif.
*   move '  G.S.T.' to zinvoice01-descline4.
*   move '  G.S.T.' to zinvoice01-descline5.                "LABK918227
    move '  G.S.T.' to zinvoice01-descline6.                "LABK934576
    perform convert_no_to_str(zvprint3)  using
                                  tax1 2 'Y' new_val.
*   move new_val to zinvoice01-totalline4.
*   move new_val to zinvoice01-totalline5.                  "LABK918227
    move new_val to zinvoice01-totalline6.                  "LABK934576
    if tax2 ne 0.
      perform convert_no_to_str(zvprint3)  using
                                    tax2 2 'Y' new_val.
*     move new_val to zinvoice01-totalline3.
*     move new_val to zinvoice01-totalline4.                "LABK918227
      move new_val to zinvoice01-totalline5.                "LABK934576
    else.
      perform convert_no_to_str(zvprint3)  using
                                    tax5 2 'Y' new_val.
*     move new_val to zinvoice01-totalline3.
*     move new_val to zinvoice01-totalline4.                "LABK918227
      move new_val to zinvoice01-totalline5.                "LABK934576
    endif.
  else.
    perform convert_no_to_str(zvprint3)  using
                                  tax1 2 'Y' new_val.
*   move new_val to zinvoice01-totalline3.
*   move new_val to zinvoice01-totalline4.                  "LABK918227
    move new_val to zinvoice01-totalline5.                  "LABK934576
    if tax_jcd(2) = 'CH'.
*     move '  H.S.T.' to zinvoice01-descline3.
*     move '  H.S.T.' to zinvoice01-descline4.              "LABK918227
      move '  H.S.T.' to zinvoice01-descline5.              "LABK934576
    else.
*     move '  G.S.T.' to zinvoice01-descline3.
*     move '  G.S.T.' to zinvoice01-descline4.              "LABK918227
      move '  G.S.T.' to zinvoice01-descline5.              "LABK934576
    endif.
*   move ' ' to zinvoice01-descline4.
*   move ' ' to zinvoice01-totalline4.
*   move ' ' to zinvoice01-descline5.                       "LABK918227
*   move ' ' to zinvoice01-totalline5.                      "LABK918227
    move ' ' to zinvoice01-descline6.                       "LABK934576
    move ' ' to zinvoice01-totalline6.                      "LABK934576
  endif.

* Surcharge
  if zinvoice01-hsur_desc ne ' '.
    perform convert_no_to_str(zvprint3)  using
                                  zinvoice01-htot_sur 2 'Y' new_val.
    move new_val to zinvoice01-totalline1.
    move zinvoice01-hsur_desc to zinvoice01-descline1.
  endif.
  perform convert_no_to_str(zvprint3)  using
                                zinvoice01-htt_af_sur 2 'Y' new_val.
* move new_val to zinvoice01-totalline2.
* move new_val to zinvoice01-totalline3.                    "LABK918227
  move new_val to zinvoice01-totalline4.                    "LABK934576

* Nowsco special discount                                   "LABK918227
  if nows_spec_disc_amt ne 0.                               "LABK918227
    move zinvoice01-hsdisc_des to zinvoice01-descline2.     "LABK918227
    perform convert_no_to_str(zvprint3)  using              "LABK918227
           zinvoice01-hsdisc_amt 2 'Y' new_val.             "LABK918227
    move new_val to zinvoice01-totalline2.                  "LABK918227
  endif.                                                    "LABK918227

* Nowsco special discount                                   "LABK934576
  if fuel_surchg_amt ne 0.                                  "LABK934576
    move zinvoice01-hfuelsur_des to zinvoice01-descline3.   "LABK934576
    perform convert_no_to_str(zvprint3)  using              "LABK934576
           zinvoice01-hfuelsur_amt 2 'Y' new_val.           "LABK934576
    move new_val to zinvoice01-totalline3.                  "LABK934576
  endif.                                                    "LABK934576


* Get unique records
loop at item_data.
  move-corresponding item_data to xitem_data.
  collect xitem_data.
  clear xitem_data.
endloop.

refresh item_data.
loop at xitem_data.
  move-corresponding xitem_data to item_data.
  append item_data.
  clear item_data.
endloop.

* Prepare item data
  clear: additional, regular.
  loop at item_data.

    if item_data-quantity ne 0.
*     List Unit Price division
      if item_data-bj_cond = 'ZBJS'
        or item_data-cond_type = 'c02'.                  "LABK929500
        item_data-book_val = item_data-net_val * 1000
                           / item_data-quantity.
        item_data-disc_amt = ' '.
      else.
        item_data-book_val = item_data-book_val * 1000
                             / item_data-quantity.
*     Discount Unit Price division
        item_data-disc_amt = item_data-net_val * 1000
                             / item_data-quantity.
      endif.
    endif.

*   List Unit Price
    if item_data-mat_num eq '300001' or
      item_data-mat_num eq '000000000000300001'.
*        If material is 300001, use net val / quantity instead of
*        book val / quantity
      if item_data-net_val ne 0.
*       List Unit Price division
        item_data-book_val = item_data-net_val * 1000
                             / item_data-quantity.
      endif.
    endif.
    if item_data-book_val ne 0.
      perform convert_no_to_str(zvprint3)  using
                                    item_data-book_val 2 'Y' new_val.

      move new_val to item_data-list_pr.
    else.
      move 'N/C' to item_data-list_pr.
    endif.

*     Discount Percentage
    perform convert_no_to_str(zvprint3)  using
                                     item_data-disc_per 2 'Y' new_val.
    write new_val+9(6) to item_data-disc.
    if item_data-disc eq '00.00'
      or item_data-cond_type = 'c02'.                      "LABK929500
      move ' ' to item_data-disc.
    endif.

*     Discount Unit Price
    if zinvoice01-hdisc_desc ne ' '.
      if item_data-net_val ne 0.
        perform convert_no_to_str(zvprint3)  using
                                   item_data-disc_amt 2 'Y' new_val.
        move new_val to item_data-disc_pr.
      else.
        move 'N/C' to item_data-disc_pr.
      endif.
    else.
      move ' ' to item_data-disc_pr.
    endif.

*     Price (net value)
    perform convert_no_to_str(zvprint3)  using
                                     item_data-net_val 2 'Y' new_val.
    if new_val = ' '.
      move '0.00' to new_val.
    endif.
    move new_val to item_data-price.

*     Quantity Used
    perform convert_no_to_str(zvprint3)  using
                                     item_data-quantity 3 'Y' new_val.
    if new_val = ' '.
      move '0.000' to new_val.
    endif.
    move new_val to item_data-quanu.
    condense item_data-quanu.

*     Quantity Quoted
    perform convert_no_to_str(zvprint3)  using
                                     item_data-qty_quoted 3 'Y' new_val.
    move new_val to item_data-quanq.
    condense item_data-quanq.

*   Test to see if we have regular AND additional item, or just reg.
*   if item_data-qty_quoted ne 0 or item_data-quanq ne '0.000'.
    if item_data-qty_quoted ne 0 or item_data-quanq ne ' '.
      move 'X' to additional.
    else.
      move 'X' to regular.
    endif.

    modify item_data.
  endloop.

* Set mixed flag if we have both additional AND regular items
  if additional eq 'X' and regular eq 'X'.
    move 'X' to zinvoice01-mixed.
  else.
    move ' ' to zinvoice01-mixed.
  endif.

* For hm00 and mixed (fixed\additional) invoices, separate into
* fixed and additional groups and total each groups price
  clear: item_gr1, item_gr2, sum1hm00, sum2hm00, sum1norm, sum2norm.
  refresh: item_gr1, item_gr2.

*{Start Insert LABK934392
  IF vbdkr-vbtyp = 'M'                "Invoices Only
     AND g_cust_num = '0001116370'    "Berlington Only
     AND job_type_no >= 100           "Cementing Jobs only
     AND job_type_no <= 199
     AND nast-dsnam <> 'OLD'.         "New Items Only

    refresh item_tmp.
    item_tmp[] = item_data[].
    refresh item_data. clear item_data.

    LOOP at item_tmp.
*     For FOB's only, clear unit price before discount
      IF item_tmp-posnr = item_tmp-uepos AND NOT
         item_tmp-posnr IS INITIAL.
        IF item_tmp-disc_pr IS INITIAL OR
           item_tmp-disc_pr = 'N/C'.
          item_tmp-disc_amt = item_tmp-book_val.
          item_tmp-disc_pr = item_tmp-list_pr.
        ENDIF.
        CLEAR: item_tmp-list_pr,
               item_tmp-disc_per, item_tmp-disc.

        MODIFY item_tmp.

*     Combine the items with the same item number and item description
*     and discounted unit price
        READ table item_data with key matnr = item_tmp-matnr
                                 mat_desc = item_tmp-mat_desc
                                 disc_amt = item_tmp-disc_amt.
        IF sy-subrc = 0.
          rec_index = sy-tabix.
          ADD item_tmp-quantity to item_data-quantity.
          ADD item_tmp-qty_quoted to  item_data-qty_quoted.
          ADD item_tmp-net_val  to item_data-net_val.

*       Price (net value)
          perform convert_no_to_str(zvprint3)  using
                                       item_data-net_val 2 'Y' new_val.
          if new_val = ' '.
            move '0.00' to new_val.
          endif.
          move new_val to item_data-price.

*         Quantity Quoted
          perform convert_no_to_str(zvprint3)  using
                                     item_data-qty_quoted 3 'Y' new_val.
          move new_val to item_data-quanq.
          condense item_data-quanq.

*         Quantity Used
          perform convert_no_to_str(zvprint3)  using
                                     item_data-quantity 3 'Y' new_val.
          if new_val = ' '.
            move '0.000' to new_val.
          endif.
          move new_val to item_data-quanu.
          condense item_data-quanu.

          MODIFY item_data INDEX rec_index.
        Else.
          APPEND item_tmp TO item_data.
        ENDIF.
      ELSE.
        APPEND item_tmp TO item_data.
      ENDIF.
    ENDLOOP.

  ENDIF.
*}End Insert LABK934392

  loop at item_data.
*    If we have a HM00, sort into two groups - fixed and additional
*   if zinvoice01-hhead_cont eq 'HM00'.
    if ( zinvoice01-hhead_cont eq 'HM00' and zinvoice01-mixed = ' ' ).
      if item_data-cond_type eq 'HM00'.
        move-corresponding item_data to item_gr1.       "Fixed
        append item_gr1.
        add item_data-net_val to sum1hm00.
      else.
* Want 'free of charge' items included in fixed price section
        if item_data-category = 'ZTAP' or                  "LABK916213
           item_data-category = 'ZFOC' or                  "LABK916213
           item_data-category = 'TANN'.                    "LABK916213
          move-corresponding item_data to item_gr1.        "LABK916213
          append item_gr1.                                 "LABK916213
          add item_data-net_val to sum1hm00.               "LABK916213
        elseif item_data-quantity <> 0.                    "LABK916213
* If all from quotes, and additional item not included in fixed price
* (i.e. not included in billing doc), if not used, don't print.
*       if item_data-quantity <> 0.
          move-corresponding item_data to item_gr2.        "Additional
          append item_gr2.
          add item_data-net_val to sum2hm00.
        endif.
      endif.
*   elseif zinvoice01-mixed eq 'X'.
    elseif ( zinvoice01-hhead_cont <> 'HM00'
            and zinvoice01-mixed eq 'X' ).
      if item_data-qty_quoted ne 0 or item_data-quanq ne ' '.
        move-corresponding item_data to item_gr1.
        append item_gr1.
        add item_data-net_val to sum2norm.
      else.
        move-corresponding item_data to item_gr2.
        append item_gr2.
        add item_data-net_val to sum1norm.
      endif.
***NEW**
    elseif ( zinvoice01-hhead_cont = 'HM00'
            and zinvoice01-mixed = 'X' ).
      if ( item_data-cond_type eq 'HM00' )
           and ( item_data-qty_quoted ne 0 or item_data-quanq ne ' ' ).
        move-corresponding item_data to item_gr1.       "Fixed
        append item_gr1.
        add item_data-net_val to sum1hm00.
      elseif ( item_data-cond_type = 'HM00' )
           and ( item_data-qty_quoted = 0 or item_data-quanq = ' ' ).
        move-corresponding item_data to item_gr2.       "Addl with fx pr
        append item_gr2.
        add item_data-net_val to sum1hm00.
      else.
        move-corresponding item_data to item_gr3.       "In addn to fx
        append item_gr3.                                "pr ie regular
        add item_data-net_val to sum2hm00.
      endif.
***END NEW**
    endif.
  endloop.

  sort item_gr1 by matnr ascending tax_flag descending.
  sort item_gr2 by matnr ascending tax_flag descending.
  sort item_gr3 by matnr ascending tax_flag descending.
  sort item_data by matnr ascending tax_flag descending.

** Frac Sand
** At lease one existing line containing frac sand must be
** first in all groups
  clear lines.
  describe table item_gr1 lines lines.
  if lines > 0.
    read table item_gr1 with key mat_desc(9) = 'Frac Sand'.
    if sy-subrc = 0.
      perform move_frac_first tables item_gr1.
    endif.
  endif.

  clear lines.
  describe table item_gr2 lines lines.
  if lines > 0.
    read table item_gr2 with key mat_desc(9) = 'Frac Sand'.
    if sy-subrc = 0.
      perform move_frac_first tables item_gr2.
    endif.
  endif.

  clear lines.
  describe table item_gr3 lines lines.
  if lines > 0.
    read table item_gr3 with key mat_desc(9) = 'Frac Sand'.
    if sy-subrc = 0.
      perform move_frac_first tables item_gr3.
    endif.
  endif.

  clear lines.
  describe table item_data lines lines.
  if lines > 0.
    read table item_data with key mat_desc(9) = 'Frac Sand'.
    if sy-subrc = 0.
      perform move_frac_first tables item_data.
    endif.
  endif.
  clear lines.
** end frac sand

* No qty quoted for Debit Memos
* if ( vbdkr-vbtyp = 'O' ) or ( vbdkr-vbtyp = 'P' ).
  if vbdkr-vbtyp = 'P'.
    item_gr1-quanq = ' '.
    modify item_gr1 transporting quanq where quanq ne ' '.
    item_gr2-quanq = ' '.
    modify item_gr2 transporting quanq where quanq ne ' '.
    item_gr3-quanq = ' '.
    modify item_gr3 transporting quanq where quanq ne ' '.
    item_data-quanq = ' '.
    modify item_data transporting quanq where quanq ne ' '.
  endif.

* Convert sums into strings
  perform convert_no_to_str(zvprint3)  using
                                       sum1hm00 2 'Y' new_val.
  move new_val to zinvoice01-sum1hm00.
  perform convert_no_to_str(zvprint3)  using
                                       sum2hm00 2 'Y' new_val.
  move new_val to zinvoice01-sum2hm00.
  perform convert_no_to_str(zvprint3)  using
                                       sum1norm 2 'Y' new_val.
  move new_val to zinvoice01-sum1norm.
  perform convert_no_to_str(zvprint3)  using
                                       sum2norm 2 'Y' new_val.
  move new_val to zinvoice01-sum2norm.


endform.                    " MASSAGE_DATA


*&---------------------------------------------------------------------*
*&      Form  MOVE_FRAC_FIRST
*&---------------------------------------------------------------------*
form move_frac_first tables ftab structure item_data.

data: begin of frac_line occurs 0.
        include structure item_gr1.
data: end of frac_line.

data: unused    type i,
      used_indx type i,
      old_count type i,
      new_count type i,
      tot_lines type i.

  clear: unused, used_indx, old_count, new_count, tot_lines.

  describe table ftab lines tot_lines.

  loop at ftab where quanu = '0.000'.       "Unused
    add 1 to unused.
  endloop.

  read table ftab with key mat_desc(9) = 'Frac Sand'
                               quanu = '0.000'.
  if sy-subrc = 0.
    if unused <> 0.
      old_count = 1.
      while old_count <= unused.
        read table ftab index old_count.
        if ftab-mat_desc(9) = 'Frac Sand'.
          add 1 to new_count.
          move ftab to frac_line.
          delete ftab index old_count.
          insert frac_line into ftab index new_count.
          exit.
        endif.
        add 1 to old_count.
      endwhile.
    endif.
    clear: old_count, new_count.
  endif.

  used_indx = unused + 1.

  loop at ftab where mat_desc(9) = 'Frac Sand'
                     and quanu <> '0.000'.
    exit.
  endloop.
  if sy-subrc = 0.
    old_count = used_indx.               "first line of used
    new_count = used_indx.
    while old_count <= tot_lines.
      read table ftab index old_count.
      if ftab-mat_desc(9) = 'Frac Sand'.
        move ftab to frac_line.
        delete ftab index old_count.
        insert frac_line into ftab index new_count.
*       add 1 to new_count.
        exit.
      endif.
      add 1 to old_count.
    endwhile.
    clear: old_count, new_count, tot_lines.
  endif.


endform.                    "MOVE_FRAC_FIRST


*&---------------------------------------------------------------------*
*&      Form  ACTIVATE_ELEMENTS
*&---------------------------------------------------------------------*
form activate_elements.

  data: item type i, gr2 type i, gr3 type i.
  item = 0.

  clear zinvoice01-lines.

* Start delete LABK931107
*  if vbdkr-vbtyp = 'O'.             "Credit Memos
*    loop at item_data.
*      add 1 to zinvoice01-lines.
*    endloop.
*  else.                             "all other document types
* End delete LABK931107

* This section gets the number of lines in the 'main' portion
* of the printout and adds the number of lines reserved for the
* 'total' portion of the printout.

    if ( zinvoice01-hhead_cont eq 'HM00'
        and zinvoice01-mixed eq ' ' ).
      add 2 to zinvoice01-lines.
      loop at item_gr1.
        add 1 to zinvoice01-lines.
      endloop.
      add 1 to zinvoice01-lines.
      loop at item_gr2.
        add 1 to gr2.
        add 1 to zinvoice01-lines.
      endloop.
      if gr2 gt 0.
       add 1 to zinvoice01-lines.
      endif.
    elseif ( zinvoice01-hhead_cont <> 'HM00'
             and zinvoice01-mixed eq 'X' ).
      loop at item_gr1.
        add 1 to zinvoice01-lines.
      endloop.
      loop at item_gr2.
        add 1 to zinvoice01-lines.
      endloop.
      add 1 to zinvoice01-lines.
    elseif ( zinvoice01-hhead_cont = 'HM00'
             and zinvoice01-mixed eq 'X' ).
      add 1 to zinvoice01-lines.
      loop at item_gr1.
        add 1 to zinvoice01-lines.
      endloop.
      loop at item_gr2.
*        AT FIRST.
*          ADD 2 TO ZINVOICE01-LINES.
*        ENDAT.
        add 1 to zinvoice01-lines.
      endloop.
      add 1 to zinvoice01-lines.
      loop at item_gr3.
        add 1 to gr3.
        at first.
          add 1 to zinvoice01-lines.
        endat.
        add 1 to zinvoice01-lines.
      endloop.
      if gr3 gt 0.
        add 1 to zinvoice01-lines.
      endif.
    else.
      loop at item_data.
        add 1 to zinvoice01-lines.
      endloop.
    endif.
    clear: gr2, gr3.
* Start delete LABK931107
*  endif.                "vbdkr-vbtyp = 'O'
* End delete LABK931107


* Footer for co. code 9040 higher than for others so lines in main
* window must be less
  if vbdkr-vkorg = '9040'.
    if zinvoice01-lines >= 30.              "total lines in main window
      zinvoice01-lines = ( zinvoice01-lines mod 30 ).
    endif.
  else.
    if zinvoice01-lines >= 33.              "total lines in main window
      zinvoice01-lines = ( zinvoice01-lines mod 33 ).
    endif.
  endif.

* {Start replace LABK934634
*  case vbdkr-vbtyp.
*    when 'O' or 'P'.                       "credit or debit memo
*      if zinvoice01-lines <> 0.            "exactly 32 lines
*        add 9 to zinvoice01-lines.         "total box + 'credit'
*      endif.
*    when 'M'.                               "invoice
*      if zinvoice01-lines <> 0.             "exactly 32 lines
*        if vbdkr-vkorg = '9040'.
*          add 11 to zinvoice01-lines.       "2 for tot box + pmt instr
*        else.
*          add 9 to zinvoice01-lines.        "total box
*        endif.
*      endif.
*    when others.
*      if zinvoice01-lines <> 0.             "exactly 32 lines
*        add 14 to zinvoice01-lines.         "total box + Nowsco Rep
*      endif.
*  endcase.

* 9 lines were reserved for the total portion of the printout.
* A new line for fuel surcharge has been added so we need to adjust.
* Add 1.
  case vbdkr-vbtyp.
    when 'O' or 'P'.                         "credit or debit memo
      if zinvoice01-lines <> 0.              "exactly 32 lines
        add 10 to zinvoice01-lines.          "total box + 'credit'
      endif.
    when 'M'.                                 "invoice
      if zinvoice01-lines <> 0.               "exactly 32 lines
        if vbdkr-vkorg = '9040'.
          add 12 to zinvoice01-lines.         "2 for tot box + pmt instr
        else.
          add 10 to zinvoice01-lines.          "total box
        endif.
      endif.
    when others.
      if zinvoice01-lines <> 0.               "exactly 32 lines
        add 15 to zinvoice01-lines.           "total box + Nowsco Rep
      endif.
  endcase.
* End replace LABK934634}

  if vbdkr-vkorg = '9040'.
    if ( zinvoice01-lines >= 30 ).
      zinvoice01-lines = 0.
      zinvoice01-underline = ' '.
    endif.
  else.
    if ( zinvoice01-lines >= 33 ).
      zinvoice01-lines = 0.
      zinvoice01-underline = ' '.
    endif.
  endif.

* {Start insert LABK934346
  condense zinvoice01-lines no-gaps.
*  End insert LABK934346}

* Activate header elements
* Start delete LABK931107
*  if vbdkr-vbtyp = 'O'.              "Credit Memo
*    item = 0.
*    loop at item_data.
*      move-corresponding item_data to zinvoice01.
*      if item eq 0.
*        perform write_form using 'LINE1' 'MAIN'.
*      else.
*        perform write_form using 'LINEN' 'MAIN'.
*      endif.
*      add 1 to item.
*    endloop.
*  else.
* End delete LABK931107

*  If we have an hm00
    if ( zinvoice01-hhead_cont eq 'HM00'
        and zinvoice01-mixed eq ' ' ).
*     Show header line
      perform write_form using 'LINE1HM00' 'MAIN'.

*     Loop through items included in fixed price
      loop at item_gr1.
        move-corresponding item_gr1 to zinvoice01.
        perform write_form using 'LINE2HM00' 'MAIN'.
      endloop.

*     Display fixed price
      perform write_form using 'LINE3HM00' 'MAIN'.

*     Loop through additional items
      gr2 = 0.
      loop at item_gr2.
        move-corresponding item_gr2 to zinvoice01.
        add 1 to gr2.
        at first.
          perform write_form using 'LINE4HM00' 'MAIN'.
        endat.
*        PERFORM WRITE_FORM USING 'LINE2HM00' 'MAIN'.
        perform write_form using 'LINE2HM00_ADD' 'MAIN'.
      endloop.

*     Display additional item total
      if gr2 gt 0.
        perform write_form using 'LINE5HM00' 'MAIN'.
      endif.

*  else, check to see if we have an invoice with fixed and additional
*  items (TPRSS)
* elseif zinvoice01-mixed eq 'X'.
    elseif ( zinvoice01-hhead_cont <> 'HM00'
             and zinvoice01-mixed eq 'X' ).
      item = 0.
      loop at item_gr1.
        move-corresponding item_gr1 to zinvoice01.
        if item eq 0.
          perform write_form using 'LINE1' 'MAIN'.
        else.
          perform write_form using 'LINEN' 'MAIN'.
        endif.
        add 1 to item.
      endloop.

      loop at item_gr2.
        move-corresponding item_gr2 to zinvoice01.
        add 1 to gr2.
        at first.
          perform write_form using 'ADDHEAD' 'MAIN'.
        endat.
        perform write_form using 'LINEN' 'MAIN'.
      endloop.

    elseif ( zinvoice01-hhead_cont = 'HM00'
             and zinvoice01-mixed eq 'X' ).
*     Show header line
      perform write_form using 'LINE1HM00' 'MAIN'.

*     Loop through items included in fixed price from quote
      loop at item_gr1.
        move-corresponding item_gr1 to zinvoice01.
*       perform write_form using 'LINE6HM00' 'MAIN'.
* Users no longer want qty quoted for fixed price items
        perform write_form using 'LINE2HM00' 'MAIN'.
      endloop.

*     Loop through additional items with fixed price
      loop at item_gr2.
        move-corresponding item_gr2 to zinvoice01.
        add 1 to gr2.
***Don't show 'Addtl Items' header or header line anymore
*       at first.
*         perform write_form using 'ADDHEAD' 'MAIN'.
*     Show header line anymore
*         perform write_form using 'LINE1HM00' 'MAIN'.
*       endat.
        perform write_form using 'LINE2HM00' 'MAIN'.
      endloop.

*     Display fixed price
      perform write_form using 'LINE3HM00' 'MAIN'.

*     Loop through additional items i.e. in addition to fixed price
      gr3 = 0.
      loop at item_gr3.
        move-corresponding item_gr3 to zinvoice01.
        add 1 to gr3.
        at first.
          perform write_form using 'LINE4HM00' 'MAIN'.
        endat.
*       perform write_form using 'LINE2HM00' 'MAIN'.
        perform write_form using 'LINE1' 'MAIN'.
      endloop.

*     Display additional item total
      if gr3 gt 0.
        perform write_form using 'LINE5HM00' 'MAIN'.
      endif.

*  Regular invoice
    else.
      item = 0.
      loop at item_data.
        move-corresponding item_data to zinvoice01.
        if item eq 0.
          perform write_form using 'LINE1' 'MAIN'.
        else.
          perform write_form using 'LINEN' 'MAIN'.
        endif.
       add 1 to item.
      endloop.
    endif.
* Start delete LABK931107
*  endif.           "vbdkr-vbtyp = 'O'
* End delete LABK931107

  perform write_form using 'UNDERLINE' 'MAIN'.
  zinvoice01-underline = 'X'.
  perform write_form using 'TOTAL' 'MAIN'.

endform.                    " ACTIVATE_ELEMENTS


*&---------------------------------------------------------------------*
*&      Form  PROTOCOL_UPDATE
*&---------------------------------------------------------------------*
*       The messages are collected for the processing protocol.       *
*---------------------------------------------------------------------*
form protocol_update.

  check xscreen = space.
  call function 'NAST_PROTOCOL_UPDATE'
       exporting
            msg_arbgb = syst-msgid
            msg_nr    = syst-msgno
            msg_ty    = syst-msgty
            msg_v1    = syst-msgv1
            msg_v2    = syst-msgv2
            msg_v3    = syst-msgv3
            msg_v4    = syst-msgv4
       exceptions
            others    = 1.

endform.                    " PROTOCOL_UPDATE

*&---------------------------------------------------------------------*
*&      Form  WRITE_FORM
*&---------------------------------------------------------------------*
form write_form using element window.

call function 'WRITE_FORM'
     exporting
          element       = element
          window        = window
     exceptions
          element       = 1
          window        = 6
          others        = 7.

endform.                    " WRITE_FORM

* >>Start Insert LABK928636 >>
*&---------------------------------------------------------------------*
*&      Form  TRACE_REF_DOC_TEXT
*&---------------------------------------------------------------------*
form trace_ref_doc_text using value(p_id) changing p_ref_vbeln.

  data: l_vbeln like vbdkr-vbeln,
        l_tdid  like stxh-tdid.

  l_vbeln = vbdkr-vbeln.
  l_tdid  = p_id.

  clear p_ref_vbeln.

* Get the sales order that this was created from and get any
* possible sales orders that this order was copied from.

* Set sy-subrc.
  sy-subrc = 0.

  while sy-subrc = 0.
    select single * from stxh
      where tdobject = 'VBBK'
        and tdname   = l_vbeln
        and tdid     = l_tdid
        and tdspras  = sy-langu.
    if sy-subrc = 0.
      if not stxh-tdref     is initial and
         not stxh-tdrefname is initial.
* There is a ref document
        p_ref_vbeln = stxh-tdrefname(10).
* Check that the referenced doc is not the same as the one
* we got before. Not 100% sure that the original record would
* have no ref flag.
        if p_ref_vbeln = l_vbeln.
          exit.
        else.
          l_vbeln = stxh-tdrefname(10).
        endif.
      else.
* No ref document
        exit.
      endif.
    endif.
  endwhile.

endform.                    " TRACE_REF_DOC_TEXT
* >>End Insert LABK928636 >>
*{ Start insert LABK934226
*-----------------------------------------------------------------------
*  Determine Parent
*    Find if the item is a parent item, i.e. An exploding FOB
*-----------------------------------------------------------------------
FORM determine_parent USING p_posnr    "child line number
                        p_uepos        "parent line number
                        fob_parent.

  IF p_uepos = '000000'.
*     check all items for a parent equal to the current posnr
    LOOP AT tvbap.
      IF tvbap-uepos EQ p_posnr.
        fob_parent = 1.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM print_item_text                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM get_item_text USING p_vbeln p_posnr p_id p_line.

  DATA: lines LIKE tline OCCURS 1 WITH HEADER LINE,
         l_name(70) TYPE c.

  CONCATENATE p_vbeln p_posnr INTO l_name.

  CALL FUNCTION 'READ_TEXT'
       EXPORTING
            client          = sy-mandt
            id              = p_id
            language        = 'E'
            name            = l_name
            object          = 'VBBP'
       TABLES
            lines           = lines
       EXCEPTIONS
            id              = 01
            language        = 02
            name            = 03
            not_found       = 04
            object          = 05
            reference_check = 06.
  READ TABLE lines INDEX 1.
  MOVE lines-tdline TO p_line.
  REFRESH lines.

ENDFORM.                                           "get_item_text

*-----------------------------------------------------------------------
*                   Form GET_quoted_quantity
* This is a modified copy of the form "WRITE_DATA_TO_ACCESS" in the
* include program "ZVREFSI2"
*-----------------------------------------------------------------------
*FORM WRITE_DATA_TO_ACCESS TABLES SALES_ITEMTAB STRUCTURE ITEMTAB
FORM get_quantity_quoted TABLES SALES_ITEMTAB STRUCTURE ITEMTAB
                                 ITEM_DATA STRUCTURE ITEM_DATA
                         USING    QUOTATION   LAST_ITEM.

  DATA:  BEGIN OF QUOTE_ITEMTAB OCCURS 50,
             ITEM_COUNT(6) TYPE N,
             MATNR LIKE VBAP-MATNR,     " Material Number
             ARKTX LIKE VBAP-ARKTX,     "short text
             KWMENG LIKE VBAP-KWMENG,   "Quantity
             VRKME   LIKE VBAP-VRKME,   "Unit
             PSTYV LIKE VBAP-PSTYV,     "Item category
             posnr like vbap-posnr,
             uepos like vbap-uepos,
         END OF QUOTE_ITEMTAB,
         MATCH_SW(1) TYPE C,
         ITEM_COUNT(6) TYPE N.

  DATA: wa_quote_item like line of quote_itemtab.
  DATA: quote_desc like quote_itemtab-arktx,
*        temp_desc like quote_itemtab-arktx,
        temp_posnr like vbap-posnr,
        temp_uepos like vbap-uepos.
  DATA: BEGIN OF tvbdpa OCCURS 0.        "Internal table for items
          INCLUDE STRUCTURE vbdpa.
  DATA: END OF tvbdpa.

  ITEM_COUNT = LAST_ITEM.

  CLEAR: QUOTE_ITEMTAB, wa_quote_item.
  REFRESH QUOTE_ITEMTAB.

  SELECT SINGLE * FROM VBAK WHERE
    VBELN = QUOTATION.
  IF VBAK-AUART NE 'AG'.
    WRITE: / 'ZVREFSI2 error, no quotation...'.
    EXIT.            "exit from the routine
  ENDIF.

* Only populate quote with ernam = 'SAPPRT' or 'TPRSS'.    "LABK926688
  IF ( VBAK-ERNAM NE 'SAPPRT'
      and vbak-ernam(4) ne 'TPRS' ).                        "LABK930749
    EXIT.
  ENDIF.

  fob_posnr = '999999'.
  fob_blend = ' '.
  REFRESH tvbap.
  SELECT * FROM vbap
     INTO corresponding fields of TABLE tvbap
    WHERE VBELN = QUOTATION
      AND pstyv NE 'TAQ'
      AND abgru = ' '.

  SELECT * FROM VBAP WHERE
      VBELN = QUOTATION AND PSTYV NE 'TAQ'.
    MOVE-CORRESPONDING VBAP TO wa_quote_item.
    PERFORM TRUNC_LEAD_ZERO USING wa_quote_item-MATNR.

    fob_parent = 0.
    PERFORM determine_parent USING vbap-posnr
                                 vbap-uepos
                                 fob_parent.
*  if we have an fob parent, check to see if there is an fob
*  description to use in place of the regular material description
    IF fob_parent EQ 1.
      CLEAR textline.
* Get item text from THE QUOTE
      PERFORM get_item_text USING vbap-vbeln vbap-posnr
                                '0053' textline.
      fob_blend = wa_quote_item-ARKTX.
      IF NOT textline IS INITIAL.
        fob_blend = textline.
      ENDIF.
      fob_posnr = vbap-posnr.
    ENDIF.

      temp_posnr = vbap-posnr.
      temp_uepos = vbap-uepos.
      IF vbap-uepos EQ fob_posnr.
*       This is an FOB detail line
        MOVE vbap-uepos TO wa_quote_item-uepos.
        MOVE vbap-posnr TO wa_quote_item-posnr.
        MOVE fob_blend    TO wa_quote_item-arktx.
      ELSE.
*       This might be an FOB parent and/or FOB detail line
        temp_posnr = '000000'.
        IF vbap-posnr EQ fob_posnr.
          temp_posnr = fob_posnr.
        ENDIF.
*       Make sure it is a detail line
        IF temp_posnr EQ fob_posnr.
          MOVE fob_posnr TO temp_uepos.
          MOVE fob_blend TO wa_quote_item-arktx.
        ENDIF.
        MOVE temp_uepos TO wa_quote_item-uepos.
        MOVE temp_posnr TO wa_quote_item-posnr.
      ENDIF.

    read table quote_itemtab with key matnr = wa_quote_item-matnr
                                arktx = wa_quote_item-arktx.
    if sy-subrc = 0.
       add wa_quote_item-kwmeng to quote_itemtab-kwmeng.
       modify quote_itemtab index sy-tabix.
    else.
      append wa_quote_item to quote_itemtab.
    endif.
  ENDSELECT.

  LOOP AT QUOTE_ITEMTAB.
    quote_desc = quote_itemtab-arktx.
    CONDENSE quote_desc NO-GAPS.
    TRANSLATE quote_desc TO UPPER CASE.
    CLEAR MATCH_SW.

    LOOP AT SALES_ITEMTAB.
      CONDENSE sales_itemtab-arktx NO-GAPS.
      TRANSLATE sales_itemtab-arktx TO UPPER CASE.

      IF SALES_ITEMTAB-MATERIAL_NO = QUOTE_ITEMTAB-MATNR
         AND SALES_ITEMTAB-ARKTX = quote_desc.
        LOOP AT ITEM_DATA WHERE
                          COUNT EQ SALES_ITEMTAB-ITEM_COUNT.
          MATCH_SW = 'X'.
          MOVE QUOTE_ITEMTAB-KWMENG TO ITEM_DATA-QTY_QUOTED.
          MODIFY ITEM_DATA.

          EXIT.
        ENDLOOP.
        EXIT.
      ENDIF.
    ENDLOOP.

    IF MATCH_SW NE 'X'.
      ITEM_COUNT = ITEM_COUNT + 1.
      CLEAR ITEM_DATA.
      MOVE QUOTE_ITEMTAB-MATNR TO
           ITEM_DATA-MAT_NUM.
      MOVE QUOTE_ITEMTAB-ARKTX TO
           ITEM_DATA-MAT_DESC.
      MOVE QUOTE_ITEMTAB-KWMENG TO
           ITEM_DATA-QTY_QUOTED.
      MOVE QUOTE_ITEMTAB-VRKME TO
           ITEM_DATA-UOM.
      MOVE QUOTE_ITEMTAB-PSTYV TO
           ITEM_DATA-CATEGORY.
      MOVE QUOTE_ITEMTAB-uepos TO
           ITEM_DATA-uepos.
      MOVE QUOTE_ITEMTAB-posnr TO
           ITEM_DATA-posnr.
      APPEND ITEM_DATA.
    ENDIF.
  ENDLOOP.

ENDFORM.                             "get_quantity_quoted
*} End insert LABK934392