REPORT zvdoquo2 LINE-COUNT 100 MESSAGE-ID vn.
*@---------------------------------------------------------------------*
*@ Program ID:    ZVDOQUO2
*@ Program Desc:  Print of Quotation by SAPscript
*@                Original program: RVADOR01
*@        I have modified this program so that a file is generated when
*@        someone has tried to print a quotation.  This file contains
*@        information about the quotation.  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 quotation print out.  Any data that is not on
*@        the quotation print out is handled by a seperate routine by
*@        accessing the appropriate table(s).
*@
*@ Input file    : none
*@ Output file   : id TE - sap output file path, filename is unique to
*@                 that document
*@
*@ Tables Updated: Table zpara - NOWSCO user program parameter table
*@ Programmer: Lee Haire
*@ Position: Basis Consultant
*@ Company: OmniLogic Systems Group Inc.
*@ Client: NOWSCO Well Service Ltd.
*@ Date completed: Nov.2, 1994
*@---------------------------------------------------------------------*
** Change History:
**  Jan 26, 1995  T.Nguyen   Major changes to orginal program
**                           and use it to print out Sales Order also
** C11K900934 May T.Nguyen   Print Base in charge
** C11K900934 950623 RV      Select template based on doc type
**            950804 TN      Change get tax proc. in header_price_print
** LABK900923 Aug PTAM     - output 2nd file with 1st file name in for
**                           SAP MOVER
**            Aug Jlai     - To get the file path name from table
**                           FILENAME
** LABK901070 Aug PTAM     - Suppress BC SURCHG if HM00 exists in
**                           cond type
**                         - for Sales Order if HM00 exist => write
**                           'Fixed price job' to invoice comment
**
** LABK901124 950923 RV - output HM00 Condition type if it's used
**                     - allow for changes to GET_PRICING_PROC(ZVPRINT1)
**                       for MAT_REIMB_AMT
**
**LABK901167 950928 TN - Fix the problem of empty TKOMVD table ( the
**                       the table is retured by SAP function)
**                       For sales order indicate if item is additional
**           951026 TN - Print out phone number of the base that the
**                       salesman belongs to ( Header: Field id 81 )
**           951129 TN - Print out fields required for interfacing with
**                       T.E to SAPBack table.
**LABK901422 951219 GS - Add SD category as key to look up table ZTMPL
**           951228 GS - for online, test transaction, for batch, look
**                       in zpara, and write out SAPBack information
**                       accordingly (create vs. update)
**LABK901551 960220 GS - use sales unit(vbdpa-vrkme) in place of
**                       sales unit of target(vbdpa-zieme),
**                       default template from SAP script file
**LABK901891 960514 GS - Print out customers shipping instructions
**                       from header text and creation date for CECO
**                       Sales Order.  Changes marked by "gs
**LABK901949 960606 GS - Compensate for FOB quotation.  For quotations,
**                       Download an id string that indcates the
**                       following:
**                         Regular Item - 000000000000
**                         FOB Parent   - nnnnnn000000
**                         FOB Child    - xxxxxxnnnnnn
**
**                            where nnnnnn is the current line in doc.
**                                  xxxxxx is the FOB parent line in doc
**                       Also download FOB description and yeild from
**                       the FOB parent item texts if they exist, else
**                       use the regular material description. "gs2
**LABK901946 960529 JLai-To reformat the sales order with used quantity
**                       from quotation
**           960808 GS - Download saleman's comments from header level
**                     - modify FOB filter to exclude type TAQ (blend
**                       components) "gs3
**LABK902227 960922 GSoltys  - allow FOB additives on invoice
**                           - changes commented with "gs4
**LABK902133  961011  JBallard - Added the tables PA0001 and PA0002
**                               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 #
**
**             961017 JBallard - addition of a longer variable (TEXT240)
**                               to store the salespersons comments.
**                             - changes marked with "jb2
**LABK902421   961204 jlai - To add material description to itemtab
**                           for further matching purpose
**labk902483   GSoltys Jan.27\97 Fix ZVPRINT get_pricing_proc call
**             - marked with gs5
**LABK909566   Jan 8, 1997 - Download condition type ZBJS to flat file
**             so that discount % will be suppressed on Access printout
**             for the Quotations
**             Changes marked with jb99.
**----------------------------------------------------------------------
* LABK911324 April 17, 1998
* Modified so that it updates newly created table ZTESAPBACK w/creation
* status. This will eliminate the update process with the the Print
* Processor. Changes marked with gh1
**----------------------------------------------------------------------
* LABK913531 GHorn November 24, 1998
* Cleared textline variable so that it would remain empty if a valid
* selection was not found and prevent an old value being populated.
* Confused?
* Changes marked with gh2
**----------------------------------------------------------------------
** LABK913955 JTsang February 26, 1999
** Convert to SAPScript printing - Quotes/Service Orders/DR-CR Memos/
** Templates.
**----------------------------------------------------------------------
* LABK915116 April 27, 1999 CFieulle  Quotes/Contracts
* Prevent printing when in 'preview' mode. Subroutine 'write_header_
* info_to_file' moved to after 'open_form' where value of preview flag
* is determined.
* Also changes to accommodate layout set printing.
**----------------------------------------------------------------------
* LABK915243 May 11, 1999 CFieulle Templates
* Changes to accommodate layout set printing.
**----------------------------------------------------------------------
* LABK915255 May 13, 1999 CFieulle Service Orders
* Changes to accommodate layout set printing.
**----------------------------------------------------------------------
* LABK915522 June 23, 1999 CFieulle
* Set up filename for backup file.  Also final transport to clone and
* production.
**----------------------------------------------------------------------
* LABK916958 Oct 15, 1999 CFieulle
* Use table Z2UTL instead of: ZUNLN for units,
*                             ZPRLN for personnel on jobs.
* Re: new utilisation data capture.
**----------------------------------------------------------------------
* LABK916974 Oct 15, 1999 CFieulle
* Adjust length of employee number to fit new Fracmaster employee
* numbers which are six digits in length. Layout set ZV_NOWSCO_ORDER
* also adjusted.
**----------------------------------------------------------------------
* LABK916978 Oct 15, 1999 CFieulle
* Allow all of salesperson's text to be printed.
*
**----------------------------------------------------------------------
* LABK917025 Oct 22, 1999 Akassam
* Insert Material number. changes denoted by labk number
**----------------------------------------------------------------------
** 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.
**----------------------------------------------------------------------
** LABK925268  CFieulle 2000-04-10  46B Upgrade.
**                                  Use central address mgmt table ADRC
**                                  instead of SADR for header data on
**                                  all post 46B documents.
**----------------------------------------------------------------------
** 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.
**----------------------------------------------------------------------
** LABK928153  CFieulle 2000-08-21  Print display - list header. Use
**                                  a different zinvoice01 field,
**                                  because it's being used to determine
**                                  when there should be an underline,
**                                  and prevents the first list
**                                  header with net price from being
**                                  printed, because it's being filled
**                                  with another value.
**                                  2. If the quote value is a fixed
**                                  price i.e. HM00 pricing, don't
**                                  print Discount%, Discounted Unit
**                                  Price and Net Price on first page.
**                                  3. Remove file extraction.
**----------------------------------------------------------------------
** LABK929091  Gary Horn  January 5, 2001
**                        Extract CO2 value from conditions
**                        - changes marked with gh3
**----------------------------------------------------------------------
** LABK929345  CFieulle   January 22, 2001
**             Decrease salesperson's comment box by 2 lines.
**             Layoutset ZV_NOWSCO_QUOTE modified. Decrease limit of #
**             of lines in main.
**----------------------------------------------------------------------
** LABK929390  CFieulle   February 06, 2001
**             1.Line items for printing: sum line items of same
**             description and discount %.
**             2.Do not print rejected items (entry in vbap-agru)
**             3.New CO2 value extraction logic. (old one not used)
**             4.Line item print modification: no more boxes for main
**               and total, so line items and total can flow.
**----------------------------------------------------------------------
** LABK929496  CFieulle  February 23, 2001
**             Layout: fob section underline.
**----------------------------------------------------------------------
** LABK929508  CFieulle  March 01, 2001
**             Additional c02 modns.
**----------------------------------------------------------------------
** LABK929587  CFieulle  March 15, 2001
**             Do not include BC surcharge for HM00 documents.
**----------------------------------------------------------------------
** LABK930234  CFieulle  June 19, 2001
**             Quotes:
**             New Condition type Z100 created for 'no-charge' items.
**             Items of category 'AGNN', ZFAP', and 'ZFOB' are auto-
**             matically defaulted to this cond. type and therefore
**             should have no price.
**----------------------------------------------------------------------
** LABK930598  CFieulle August 20, 2001
**             Quotes: Re LABK930234 above - also applies to blend
**             component display.
**----------------------------------------------------------------------
** Sept. 13, 2001 LABK930879 CFieulle
**             Handle multiple zdsc discounts.  If more than one, 'A'
**             (automatic pricing) line should not be used. If more than
**             two, print error message in place of item description.
**             Reason:
**             When a quote is created via TPRSS and the zdsc is later
**             changed manually at the header level, the previous
**             item discount remains resulting in two discounts.  In the
**             case of two discounts, the automatic entry does not take
**             effect. If the user doesn not notice and decides to add
**             another discount (which the system allows), we may end up
**             with multiple zdsc discounts for the same item, in which
**             case we alert them via an error message printed in place
**            of the item description.
**----------------------------------------------------------------------
** LABK930893 CFieulle & BYwang, Sept 28, 2001
**            - Change the display length of the FOB text to 100
**                - add new field in zinvoice01 "fob_mat_desc"
**            - change the SAPForm "zv_nowsco_qoute"
**----------------------------------------------------------------------
** LABK931012 2001/10/12 FLAU
** LABK931071
**            - Incorrect printing of discount unit price due to wrong
**              reference table assignment of zinvoice01-disc_per and
**              zinvoice01-disc_amt.
**----------------------------------------------------------------------
** 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.
**----------------------------------------------------------------------
** LABK931580  CFieulle December 27, 2001
**             Prevent printing of large discount %'s ( * 100).
**             Also make sure underline under each section on FOB pages
**             is always printed.
**----------------------------------------------------------------------
** LABK934576  IJADALOW March 12, 2003
**             Print the Fuel Surcharge and add it to the quote total.
**----------------------------------------------------------------------


TABLES: komk,                          "Communicationarea for conditions
        komp,                          "Communicationarea for conditions
        komv,
        komvd,                         "Communicationarea for conditions
        vbco3,                         "Communicationarea for view
        vbdka,                         "Headerview
        vbdpa,                         "Itemview
        vbdpau,                        "Subitemnumbers
        sadr,                          "Addresses
        tvko,                          "Sales organisation
        tvstt,                         "Plant name
        filename,                      "Path
        t001w,                         "Plants
        vbfa,                          "Document flow table
        adrs,                          "Communicationarea for Address
        kna1,
        konv,                          "conditions table
        usr01,
        tsp03,
        zinvoice01.

TABLES: adrc.  "Addresses (central address admin.)         "LABK925268

INCLUDE rvadtabl.

TABLES: thead.                 "SAPscript: Text Header     "LABK916978

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*DATA: PATH(60) TYPE C.
DATA: retcode   LIKE sy-subrc.         "Returncode
DATA: repeat(1) TYPE c.
DATA: proposal(10).
DATA: fob_posnr(6) TYPE n.
DATA: fob_hi_qty LIKE vbap-kwmeng.
*data: fob_blend like vbap-arktx,
DATA: fob_blend(45) TYPE c,                                 "LABK929496
      text1 LIKE vbap-arktx.
DATA: fob_cement LIKE vbap-arktx.
DATA: fob_yield TYPE p DECIMALS 5.
DATA: bc_surchg LIKE zinvoice01-net_val.
DATA: quotation_no LIKE vbfa-vbelv.
DATA: total_tax LIKE komv-kwert.
DATA: o_type(1) TYPE c.
DATA: in_type LIKE vbak-vbtyp.      " doc. type of the order entered
DATA: re_type LIKE vbak-vbtyp.      " doc. type of the reference doc.
DATA: name2 LIKE sadr-name2,
      stras LIKE sadr-stras,
      ort01 LIKE sadr-ort01,
      regio LIKE sadr-regio,
      pstlz LIKE sadr-pstlz,
      bill_to_kunnr LIKE vbpa-kunnr.
DATA: total_pst LIKE konv-kwert.

DATA: BEGIN OF tvbdpa OCCURS 0.        "Internal table for items
        INCLUDE STRUCTURE vbdpa.
DATA: END OF tvbdpa.

DATA: BEGIN OF linetab OCCURS 0,
        matnr     LIKE vbap-matnr,
*{   REPLACE        CANK900302                                        1
*\        mat_desc  like zinvoice01-mat_desc,
        mat_desc(100)  TYPE c,
*}   REPLACE
        quantity  LIKE zinvoice01-quantity,
        uom       LIKE zinvoice01-uom,
        disc_per  LIKE zinvoice01-disc_per,
        disc_amt  LIKE zinvoice01-disc_amt,
        net_val   LIKE zinvoice01-net_val,
        sp_addr4  LIKE zinvoice01-sp_addr4,
        sp_city   LIKE zinvoice01-sp_city,
        sp_region LIKE zinvoice01-sp_region,
        sp_pcode  LIKE zinvoice01-sp_pcode,
        posnr     LIKE vbap-posnr,
*       UNDERLINE LIKE ZINVOICE01-UNDERLINE,
        general_flag LIKE zinvoice01-general_flag,          "LABK928153
        hm00_flag(1) TYPE c,
        c02_flag(1)  TYPE c,                                "LABK929390
        mvgr1     LIKE vbap-mvgr1,
        lines     LIKE zinvoice01-lines,
      END OF linetab.
DATA: BEGIN OF fob OCCURS 0,
*{   REPLACE        CANK900302                                        2
*\        mat_desc  like zinvoice01-mat_desc,
        mat_desc(100) TYPE c,
*}   REPLACE
        quantity  LIKE zinvoice01-quantity,
        uom       LIKE zinvoice01-uom,
        disc_per  LIKE zinvoice01-disc_per,
        disc_amt  LIKE zinvoice01-disc_amt,
        net_val   LIKE zinvoice01-net_val,
        sp_addr4  LIKE zinvoice01-sp_addr4,
        sp_city   LIKE zinvoice01-sp_city,
        sp_region LIKE zinvoice01-sp_region,
        sp_pcode  LIKE zinvoice01-sp_pcode,
        posnr     LIKE vbap-posnr,
        uepos     LIKE vbap-uepos,
        yield     TYPE p DECIMALS 5,
        kzwi2     LIKE vbap-kzwi2,
*       UNDERLINE LIKE ZINVOICE01-UNDERLINE,
        general_flag LIKE zinvoice01-general_flag,          "LABK928153
      END OF fob.
DATA: BEGIN OF eqp1 OCCURS 12,
*       unit like zunln-zunit,
        unit LIKE z2utl-unit,                               "LABK916958
      END OF eqp1.
DATA: BEGIN OF eqp2 OCCURS 12,
*       unit like zunln-zunit,
        unit LIKE z2utl-unit,                               "LABK916958
      END OF eqp2.
DATA: BEGIN OF emp1 OCCURS 10,
*       number like zprln-pernr,
        number LIKE z2utl-pernr,                            "LABK916958
        name   LIKE p0002-nachn,
*       class  like zprln-matnr,
        class  LIKE z2utl-percls,                           "LABK916958
      END OF emp1.
DATA: BEGIN OF emp2 OCCURS 10,
*       number like zprln-pernr,
        number LIKE z2utl-pernr,                            "LABK916958
        name   LIKE p0002-nachn,
*       class  like zprln-matnr,
        class  LIKE z2utl-percls,                           "LABK916958
      END OF emp2.

* gs2
DATA: BEGIN OF tvbap OCCURS 50.
        INCLUDE STRUCTURE vbdpa.
DATA: END OF tvbap.

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: BEGIN OF tvbdpau OCCURS 5.
        INCLUDE STRUCTURE vbdpau.
DATA: END   OF tvbdpau.
************************************************************************
* my additional data declarations
TABLES: vbak,                          "Sales Document: Header Data
*       tvv1t,                       "Customer Group 1: Description
        t25A2,                       "Customer Group 1: Description "ij1
        vbpa,
        prel,                          " employee names
        pa0001, "Replaces PREL (w/infty = 0001) for empl. names. - jb1
        pa0002, "Replaces PREL (w/infty = 0002) for empl. names. - jb1
        p0001,
        p0002,
*       zprln,                         " employee assignments
*       zunln,                         " unit assignments
        z2utl,                         "Bonus Utilization   "LABK916958
        vbap,
        zpara.
INCLUDE zvprtda1.     "  Global data required for sapscript printing

DATA: book_total TYPE p DECIMALS 2,    "book value - running total
      item_count(6) TYPE n,            "counter for # items
      strng(10) TYPE c,
      text80(80) TYPE c,
      tax_id(2) TYPE n VALUE '32',
      unit_count(6) TYPE n,
      total_net_val_for_item LIKE komvd-kwert,
      hm00_flag(1) TYPE c VALUE ' ',
      c02_flag(1)  TYPE c VALUE ' ',                        "LABK929390
      c02_header_flag(1) TYPE c VALUE ' ',                  "LABK929593
      header_hm00_flag(1) TYPE c VALUE ' ',                 " 950923 RV
      tkomvd_lines(3) TYPE p,
      quote_flag TYPE i VALUE 0,
      emp_count(2) TYPE n,
      itemid(12) TYPE c,                                    "gs2
      fob_parent TYPE i VALUE 0,                            "gs2
      text240(240) TYPE c.                                  "jb2

FIELD-SYMBOLS: .

* the titles for the various sales documents
DATA: title_a(35) VALUE 'Inquiry',
      title_b(35) VALUE 'Cost Estimate',
      title_c(35) VALUE 'Service Order',
      title_d(35) VALUE 'Product Proposal',
      title_g(35) VALUE 'Contract',
      title_h(35) VALUE 'Return Order',
      title_k(35) VALUE 'Credit Memo Request',
      title_l(35) VALUE 'Debit Memo Request'.

DATA: template(40),                                         " 950623 RV
      del_notes(78) TYPE c, len(2) TYPE n.
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.
* ******* data for reformat sales order output ****** "JL9605
DATA:
      BEGIN OF itemtab OCCURS 50,
        item_count(6) TYPE n,
        material_no LIKE vbdpa-matnr,
        arktx LIKE vbdpa-arktx,        "description JL1204
      END OF itemtab,
      quotation LIKE vbap-vgbel.

DATA: g_errmsg(55).                                         "LABK930879
************************************************************************
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

DATA: pr_kappl(01)   TYPE c VALUE 'V'. "Application for pricing

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*DATA:   PREVIEW(2) TYPE C.                               "LABK915116
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


FORM entry USING return_code us_screen.
  CLEAR retcode.
*  CLEAR PREVIEW.                                      "LABK915116
  PERFORM processing USING us_screen.
*///////////////////////////////////////////////////////////////////////
** For sales order, get template from text field id 0006
*  CLEAR TEMPLATE.
*  IF VBDKA-VBTYP = 'C' OR O_TYPE = 'C'.                " Sales Order
*    IF O_TYPE = 'C'.
*      VBDKA-VBELN = NAST-OBJKY.
*    ENDIF.
*   PERFORM GET_HEADER_TEXT(ZVPRINT1) USING VBDKA-VBELN '0006' TEXTLINE.
*    IF TEXTLINE NE SPACE.
*      TEMPLATE = TEXTLINE.
*    ENDIF.
*  ENDIF.
** For Quotation, get template from text field id 0010
*
*  IF VBDKA-VBTYP = 'B'.
*   PERFORM GET_HEADER_TEXT(ZVPRINT1) USING VBDKA-VBELN '0010' TEXTLINE.
*    IF TEXTLINE NE SPACE.
*      TEMPLATE = TEXTLINE.
*    ENDIF.
*  ENDIF.
*  IF PREVIEW = 'NO'.                                     "LABK915116
**   Get microsoft access template name for this region
*  IF TEMPLATE = ' '.   "If no templates taken from text id 0006, & 0010
*      PERFORM GET_MS_ACCESS_TEMPLATE(ZVPRINT1) USING
*          VBAK-VKORG   VBAK-AUART   VBAK-VBTYP   VBAK-KVGR2   TEMPLATE.
*    ENDIF.
*  ENDIF.                                                 "LABK915116
** write print control data to file
*  PRINT_TABLE = ITCPO.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_CONTROL_DATA(ZVPRINT1) TABLES PRINT_TABLE USING
*              VBDKA-VBELN   SY-UNAME   TEMPLATE      'ZVDOQUO2'.
*    CLOSE DATASET DATAFILE.
*    PERFORM SAP_MOVER_FILE_SETUP(ZVPRINT1) USING DATAFILE.
*  ENDIF.                                                 "LABK915116

*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  IF retcode NE 0.
    return_code = 1.
  ELSE.
    return_code = 0.
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM PROCESSING                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  PROC_SCREEN                                                   *
*---------------------------------------------------------------------*
FORM processing USING proc_screen.

  PERFORM get_data.
  CHECK retcode = 0.
**//////////////////////////////////////////////////////////////////////
*  PERFORM WRITE_HEADER_INFO_TO_FILE.
**\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  PERFORM form_open USING proc_screen vbdka-land1.
  CHECK retcode = 0.
*///////////////////////////////////////////////////////////////////////
  PERFORM write_header_info_to_file.
*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  PERFORM form_title_print.
  CHECK retcode = 0.
  PERFORM item_print.
  CHECK retcode = 0.
  PERFORM end_print.
  CHECK retcode = 0.
  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 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.

  PERFORM get_pricing_proc(zvprint1) TABLES tkomv tax_table   USING
                   nows_disc_amt   nows_disc_perc
                   price_adj_amt
                   3party_surchg_amt
                   prov_surchg_amt
                   mat_reimb_amt
                   0                   "  0 --> header prices
                   zbjs_amt.                                "gs5

  clear bc_surchg.                                         "LABK934576

* No bc surcharge for HM00 documents                       "LABK929587
  IF header_hm00_flag = ' '.                                "LABK929587
    bc_surchg = prov_surchg_amt.
  ELSE.                                                     "LABK929593
    IF c02_header_flag NE space.                            "LABK929593
      bc_surchg = c02_prov_surchg_amt.                      "LABK929593
    ENDIF.                                                  "LABK929593
  ENDIF.                                                    "LABK929587
*  IF PREVIEW = 'NO'.                                      "LABK915116
*    PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'
*                                                   '24' NOWS_DISC_PERC.
*    PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'
*                                                   '26' NOWS_DISC_AMT.
*    PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'
*                                                   '27' PRICE_ADJ_AMT.
*    PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'
*                                              '28' 3PARTY_SURCHG_AMT.
*  ENDIF.                                                  "LABK915116
*
* added HM00 output IF THERE IS ANY hm00 ON THE INVOICE       RV 950923
  IF header_hm00_flag NE ' '.                               " rv 950923
*    IF PREVIEW = 'NO'.                                      "LABK915116
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '77' 'HM00'.
*    ENDIF.                                                  "LABK915116
  ENDIF.                                                    " rv 950923
*
* only write header surcharge if there is no HM00 in cond type
* after all the item_print processed
*  IF PROV_SURCHG_AMT NE 0 AND HM00_FLAG = ' '.              " 950923 RV
  IF prov_surchg_amt NE 0 AND header_hm00_flag = ' '.       " 950923 RV
*    IF PREVIEW = 'NO'.                                      "LABK915116
*      PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'
*                                                 '30' PROV_SURCHG_AMT.
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'
*                                       '31' 'BC Surcharge'.
*   ENDIF.                                                   "LABK915116
  ENDIF.

* Write the Mat reimbursement if there is one                " 950923 RV
*                                                            " 950923 RV
  IF mat_reimb_amt NE 0.                                    " 950923 RV
*   IF PREVIEW = 'NO'.                                       "LABK915116
*     PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '01' '000001'  " 950923 RV
*                               '79' MAT_REIMB_AMT.          " 950923 RV
*     PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'    " 950923 RV
*                             '80' 'Material Reimbursement'. " 950923 RV
*   ENDIF.                                                   "LABK915116
  ENDIF.                                                    " 950923 RV
*
*  IF VBDKA-VBTYP = 'C' AND HM00_FLAG NE ' '.                " 950923 RV
* Sales Order & HM00 => write fixed price job though inv.cmt " 950923 RV
*     PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '74'" 950923 R
*                               'Fixed price job.'.          " 950923 RV
*  ENDIF.                                                    " 950923 RV

  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 PREVIEW = 'NO'.                                     "LABK915116
*      PERFORM WRITE_TO_FILEA(ZVPRINT1) USING '01' '000001'
*                                          TAX_ID    HEADER_TAX-KWERT.
*    ENDIF.                                                 "LABK915116
  ENDLOOP.

*  IF PREVIEW = 'NO'.                                     "LABK915116
**   write Net Total file
*  PERFORM WRITE_TO_FILEA(ZVPRINT1) USING '01' '000001' '32' KOMK-SUPOS.
**   write Final Amount to file
*  PERFORM WRITE_TO_FILEA(ZVPRINT1) USING '01' '000001' '38' KOMK-FKWRT.
*    PERFORM WRITE_TO_FILEA(ZVPRINT1) USING '01' '000001' '29'
*                                             TOTAL_NET_VAL_FOR_ITEM.
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '16'
*                                                DISC_PERC_TEXT.
*  ENDIF.                                                 "LABK915116

* Begin of gh3 -->
* Extract CO2 surcharge
  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_PRINT                                               *
*---------------------------------------------------------------------*
*       Printout of the items                                         *
*---------------------------------------------------------------------*

FORM item_print.
  DATA: material_no LIKE vbdpa-matnr, item_net_val LIKE komvd-kwert,
        net_val_per_unit LIKE komvd-kbetr,
        netvalperunit LIKE komvd-kbetr,
        itemnetval LIKE komvd-kwert,
        l_disc_count(2) TYPE n,                             "LABK930879
        l_man_count(2)  TYPE n.                             "LABK930879

  CLEAR itemtab.                                            "JL9606
  REFRESH itemtab.
  clear: hm00_flag, header_hm00_flag.                       "LABK934576
  LOOP AT tvbdpa.                                           "gs2
    IF NOT tvbdpa-abgru IS INITIAL.                         "LABK929390
      CONTINUE.                                             "LABK929390
    ENDIF.                                                  "LABK929390
    vbdpa = tvbdpa.
    IF vbdka-vbtyp = 'C' OR vbdka-vbtyp = 'B' OR vbdka-vbtyp = 'G'.
      CHECK vbdpa-pstyv NE 'TAQ'.                           "jt1
    ENDIF.
    MOVE-CORRESPONDING tvbdpa TO tvbap.                     "gs2
    APPEND tvbap.                                           "gs2
  ENDLOOP.
  fob_posnr = '999999'.
  fob_blend = ' '.
  fob_cement = ' '.
  CLEAR fob.
  REFRESH fob.
  CLEAR linetab.
  REFRESH linetab.                                          "gs2

  LOOP AT tvbdpa.
    IF NOT tvbdpa-abgru IS INITIAL.                         "LABK929390
      CONTINUE.                                             "LABK929390
    ENDIF.                                                  "LABK929390

    vbdpa = tvbdpa.

    CLEAR c02_flag.                                         "LABK929390

    IF vbdka-vbtyp = 'C'.
      CHECK vbdpa-pstyv NE 'TAQ'.                           "gs4
    ENDIF.
    IF vbdka-vbtyp = 'B' OR vbdka-vbtyp = 'G'.              "gs2
      CHECK vbdpa-pstyv NE 'TAQ'.                           "gs3
    ENDIF.                                                  "gs3
*
*   strip out leading zero's of material no
    WRITE vbdpa-matnr TO material_no NO-ZERO.
    MOVE vbdpa-arktx TO itemtab-arktx.                      "JL961204
    CONDENSE material_no.
    IF vbdpa-posnr_neu NE space.       "Item

*     get_item_prices will populate 2 tables, tkomv and tkomvd. TKOMV
*     contains taxes, nowsco disc, price adj, 3rd party surchage,
*     provincial surchg, and other info of the pricing procedure. TKOMVD
*     most of the time will return: 100 - Gross value, 400 - Net Value
*     for Item, 110 - Nowsco Disc. (also found in TKOMV). The most
*     important piece of info to us is 400 - Net Value for Item. This
*     info is NOT in TKOMVD when the pricing procedure contains either
*     HM00 (Order Value)  or PB00 (Price Gross) or (PB01) Fixed Price,
*     instead 420, 100, and 016 - Fixed Price are returned respectively.
*     These values will be used as substitute for 400. Please use ZTD7A
*     to examine these two tables when exceptions occur.

      PERFORM get_item_prices.

      item_count = item_count + 1.
*     IF PREVIEW = 'NO'.                                     "LABK915116
**         write Item Material No. to file
*          PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                  '10' MATERIAL_NO.
*     ENDIF.                                                 "LABK915116
*     write Item category to file
      SELECT SINGLE * FROM vbap WHERE vbeln = vbdka-vbeln AND
                                                  posnr = vbdpa-posnr.
*     for quotes, write out ItemID string                           "gs2
      IF vbdka-vbtyp = 'B'.
        fob_parent = 0.
        PERFORM build_itemid USING itemid
                                   vbdpa-posnr
                                   vbdpa-fkrel
                                   vbdpa-uepos
                                   fob_parent.
*       IF PREVIEW = 'NO'.                                   "LABK915116
*              PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                    '03' ITEMID.
*       ENDIF.                                               "LABK915116
      ENDIF.
*     if we have an fob parent, check to see if there is an fob
*     description to use in place of the regular material description
*     also, if there is a yield, download it
      IF fob_parent EQ 1.
        PERFORM get_item_text(zvprint1) USING vbdka-vbeln vbdpa-posnr
                                              '0053' textline.
        IF textline EQ ' '.
*         IF PREVIEW = 'NO'.                                 "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                  '13' VBDPA-ARKTX.
*         ENDIF.                                             "LABK915116
        ELSE.
*           use fob description
*          IF PREVIEW = 'NO'.                                "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                  '13' TEXTLINE.
*          ENDIF.                                            "LABK915116
          fob-mat_desc = textline.
          fob_posnr = vbdpa-posnr.
          fob_hi_qty = vbdpa-kwmeng.
          fob_blend = textline.
          fob-posnr = vbdpa-posnr.
          fob-uepos = vbdpa-uepos.
*         FOB-UNDERLINE = 'F'.
          fob-general_flag = 'F'.                           "LABK928153
          SPLIT textline AT '+' INTO fob_cement text1.
          PERFORM get_item_text(zvprint1) USING vbdka-vbeln vbdpa-posnr
                                                '0054' textline.
*          IF PREVIEW = 'NO'.                                "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                  '98' TEXTLINE.
*         ENDIF.                                             "LABK915116
          IF textline CA 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
            " Textline contains a non-numeric character.
            fob-yield = 0.
          ELSE.
            fob-yield = textline.
          ENDIF.
          APPEND fob.
        ENDIF.
        CLEAR textline.                                             "gh2
        PERFORM get_item_text(zvprint1) USING vbdka-vbeln vbdpa-posnr
                                              '0054' textline.
        IF NOT textline IS INITIAL.                                 "gh2
*        IF TEXTLINE NE ' '.
*         IF PREVIEW = 'NO'.                                 "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                '98' TEXTLINE.
*         ENDIF.                                             "LABK915116
*        ENDIF.                                                     "gs2
        ENDIF.                                                      "gh2
      ELSE.
*     write Item Text (Description) to file as usual
*        IF PREVIEW = 'NO'.                                 "LABK915116
*          PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                                '13' VBDPA-ARKTX.
*        ENDIF.                                              "LABK915116
      ENDIF.
*
**JL9605  IF VBDKA-VBTYP = 'C'.     "  Sales Order
*       check to see if this item is added manually by the user (i.e
*       it is not in the original quotation)
**JL9605    IF VBAP-VGBEL = SPACE AND VBAP-VGPOS = 0 AND QUOTE_FLAG = 1.
*         This item was added in manually by the user
**JL9605  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT '41'
**JL9605                                                'ADDITIONAL'.
**JL9605  ENDIF.
**JL9605      ENDIF.
*      IF PREVIEW = 'NO'.                                   "LABK915116
**       write Item Category
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT '14'
*                                                       VBAP-PSTYV.
**       write Item Pure Service
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT '05'
*                                                       VBAP-MVGR1.
**       write per TNE quantity
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT '44'
*                                                       VBAP-KDMAT.
**       write Item Quantity to file
*        PERFORM WRITE_TO_FILE(ZVPRINT1)
*                            USING '02' ITEM_COUNT '11' VBDPA-LSMENG.
**      write Item Unit of Measure to file
*
**     use sales unit for quote and sales unit of target for sales order
**      IF VBAK-VBTYP EQ 'B'.   "quote
**         PERFORM WRITE_TO_FILE(ZVPRINT1)
**                              USING '02' ITEM_COUNT '12' VBDPA-VRKME.
**      ELSE.
**         PERFORM WRITE_TO_FILE(ZVPRINT1)
**                              USING '02' ITEM_COUNT '12' VBDPA-ZIEME.
**      ENDIF.
*
**       use sales unit for all - GS
*        PERFORM WRITE_TO_FILE(ZVPRINT1)
*                              USING '02' ITEM_COUNT '12' VBDPA-VRKME.
**       write item net value to file
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)
*                               USING '02' ITEM_COUNT '32' VBDPA-NETWR.
*      ENDIF.                  "if preview = 'NO'         "LABK915116

      total_after_tax = vbdpa-netwr.

*      increase our running total of the book value
*      BOOK_TOTAL = BOOK_TOTAL + KOMVD-KWERT.


      PERFORM get_pricing_proc(zvprint1) 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
                   vbdpa-posnr
                   zbjs_amt.                                "gs5

*     Start insert LABK930879
*     When a quote is created via TPRSS and the zdsc is later changed
*     manually at the header level, the previous item discount remains
*     resulting in two discounts.  In the case of two discounts, the
*     automatic entry does not take effect.  If the user does not
*     notice and decides to add another discount (which the system
*     allows), we may end up with multiple manual zdsc discounts for the
*     same item, in which case we alert them via an error message
*     printed in place of the item description.
      CLEAR: l_disc_count, l_man_count, g_errmsg.
      LOOP AT tkomv WHERE kinak <> 'X'
                      AND kposn = vbdpa-posnr
                      AND stunr = nows_disc.
        ADD 1 TO l_disc_count.
        IF ( tkomv-kherk = 'C' OR tkomv-kherk = 'D' ).
          ADD 1 TO l_man_count. "How many manual discs?
        ENDIF.
      ENDLOOP.
*     If more than one manual discount, print error message
      IF l_man_count > 1.
        CONCATENATE '**ERROR: THIS ITEM HAS MORE THAN ONE'
          'ACTIVE DISCOUNT!**'
          INTO g_errmsg SEPARATED BY ' '.
        zinvoice01-attention = 'X'.
      ELSEIF l_disc_count = 2.
        LOOP AT tkomv WHERE kinak <> 'X'
                        AND kposn = vbdpa-posnr
                        AND stunr  = nows_disc
                        AND kherk <> 'A'.
          nows_disc_perc = tkomv-kbetr.
          nows_disc_perc = ( nows_disc_perc / 10 )  "LABK931580
                              * -1.                 "LABK931580
*          nows_disc_perc = ( nows_disc_perc ) * -1. "LABK931012
        ENDLOOP.
      ENDIF.
*     End insert LABK930879

* 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 = vbdpa-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 = vbdpa-posnr.
          MOVE-CORRESPONDING tkomv TO tkomvd.
          APPEND tkomvd.
        ENDLOOP.
      ENDIF.

      PERFORM get_net_value_for_item(zvprint1) TABLES tkomvd USING
                   nows_disc_amt    nows_disc_perc
                   price_adj_amt    3party_surchg_amt   hm00_flag
                   item_net_val     net_val_per_unit
                   c02_flag.                                "LABK929390

      IF hm00_flag NE space.                                "LABK928153
        zinvoice01-hm00_flag = 'X'.                         "LABK928153
      ENDIF.                                                "LABK928153

*     Get bc surcharge for c02.  For MH00 docs, bc          "LABK929593
*     surcharge is still charged against c02.               "LABK929593
      IF c02_flag NE space.                                 "LABK929593
        c02_header_flag = 'X'.                              "LABK929593
        LOOP AT tkomvd WHERE kposn = vbdpa-posnr            "LABK929593
                        AND ( stunr = prov_surchg OR        "LABK929593
                              stunr = prov_surchg_2 ).      "LABK929593
          CHECK tkomvd-kinak NE 'X'.                        "LABK929593
          ADD tkomvd-kwert TO c02_prov_surchg_amt.          "LABK929593
        ENDLOOP.                                            "LABK929593
      ENDIF.                                                "LABK929593

      netvalperunit = net_val_per_unit.
      itemnetval = item_net_val.
      IF vbdpa-uepos EQ fob_posnr.
        PERFORM construct_fob_items USING netvalperunit itemnetval.
      ELSE.
        tvbdpa-posnr = '000000'.
        IF vbdpa-posnr EQ fob_posnr.
          tvbdpa-arktx = fob_blend.
          tvbdpa-posnr = fob_posnr.
        ENDIF.
        PERFORM construct_line_items USING netvalperunit itemnetval.
        IF tvbdpa-posnr EQ fob_posnr.
          MOVE fob_cement TO tvbdpa-arktx.
        MOVE fob_posnr TO tvbdpa-uepos.  " make sure it is a detail line
          PERFORM construct_fob_items USING netvalperunit itemnetval.
        ENDIF.
      ENDIF.

      IF vbdka-vbtyp = 'C'.            "  Sales Order
*       write Book Value per unit to file
        IF vbap-pstyv = 'ZFOB' OR vbap-pstyv = 'AGNN' OR
          vbap-pstyv = 'ZFOC' OR vbap-pstyv = 'TANN'.
*          IF PREVIEW = 'NO'.                                "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02'   ITEM_COUNT
*                               '39' '              '.
*          ENDIF.                                            "LABK915116
        ELSE.
*          IF PREVIEW = 'NO'.                                "LABK915116
*            PERFORM WRITE_TO_FILEA(ZVPRINT1)
*                          USING '02' ITEM_COUNT '39' NET_VAL_PER_UNIT.
*          ENDIF.                                            "LABK915116
        ENDIF.
      ENDIF.

      IF nows_disc_perc NE 0.
        MOVE 'Disc. %' TO disc_perc_text.
      ENDIF.
*      IF PREVIEW = 'NO'.                                  "LABK915116
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                                '24' NOWS_DISC_PERC.
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                                '26' NOWS_DISC_AMT.
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                                '27' PRICE_ADJ_AMT.
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                                '28' 3PARTY_SURCHG_AMT.
*      ENDIF.                                              "LABK915116
      IF prov_surchg_amt NE 0.
*        IF PREVIEW = 'NO'.                                "LABK915116
*          PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                                '30' PROV_SURCHG_AMT.
*          PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02' ITEM_COUNT
*                                          '31' 'BC Surcharge'.
*        ENDIF.                                            "LABK915116
      ENDIF.
      IF mat_reimb_amt NE 0.                                " 950923 RV
*        IF PREVIEW = 'NO'.                                "LABK915116
*         PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT"950923
*                                         '30' MAT_REIMB_AMT." 950923 RV
*        ENDIF.                                            "LABK915116
      ENDIF.                                                " 950923 RV
      tax_id = 32.
      LOOP AT tax_table.
        ADD 1 TO tax_id.
        ADD tax_table-tax_amount TO total_after_tax.
        ADD tax_table-tax_amount TO total_tax.
*        IF PREVIEW = 'NO'.                                "LABK915116
*          PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                     TAX_ID  TAX_TABLE-TAX_AMOUNT.
*        ENDIF.                                            "LABK915116
      ENDLOOP.
      IF vbap-pstyv = 'ZFOB' OR vbap-pstyv = 'AGNN' OR
         vbap-pstyv = 'ZFOC' OR vbap-pstyv = 'TANN'.
*        IF PREVIEW = 'NO'.                                "LABK915116
*          PERFORM WRITE_TO_FILE(ZVPRINT1) USING '02'   ITEM_COUNT
*                               '29' '              '.
*        ENDIF.                                            "LABK915116
      ELSE.
        ADD item_net_val TO total_net_val_for_item.
*        IF HM00_FLAG NE SPACE.     " HM00 condition         " 950923 RV
*         CLEAR ITEM_NET_VAL.                                " 950923 RV
*       ENDIF.                                               " 950923 RV
*       IF PREVIEW = 'NO'.                                   "LABK915116
*          PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                              '29' ITEM_NET_VAL.
*       ENDIF.                                               "LABK915116
      ENDIF.
*     IF PREVIEW = 'NO'.                                     "LABK915116
*        PERFORM WRITE_TO_FILEA(ZVPRINT1)  USING '02' ITEM_COUNT
*                                              '38' TOTAL_AFTER_TAX.
*     ENDIF.                                                 "LABK915116
      CLEAR total_after_tax.
*
*     If any item has an HM00 condition set the header flag " 950923 RV
      IF hm00_flag NE space.                                " 950923 RV
        header_hm00_flag = 'Y'.                             " 950923 RV
*       IF PREVIEW = 'NO'.                                   "LABK915116
*         PERFORM WRITE_TO_FILE(ZVPRINT1)  USING '02'        " 950923 RV
*                                   ITEM_COUNT '16' 'HM00'.  " 950923 RV
*       ENDIF.                                               "LABK915116
      ENDIF.                                                " 950923 RV

*JB99
*     If the item has a ZBJS condition write to file.
      IF zbjs_flag NE 0 AND hm00_flag EQ space.
*       IF PREVIEW = 'NO'.                                   "LABK915116
*          PERFORM WRITE_TO_FILE(ZVPRINT1)  USING '02'
*                                     ITEM_COUNT '16' 'ZBJS'.
*       ENDIF.                                               "LABK915116
        CLEAR zbjs_flag.
      ENDIF.
*JB99

      MOVE item_count TO itemtab-item_count.                "JL9606
      MOVE material_no   TO itemtab-material_no.            "JL9606
      APPEND itemtab.                                       "JL9606
    ENDIF.
    CLEAR fob_blend.                                        "LABK929496
  ENDLOOP.
* write Total Book Value to file
* PERFORM WRITE_TO_FILEA(ZVPRINT1)
*                              USING  '01' '000001' '25' BOOK_TOTAL.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    IF QUOTE_FLAG = 1.                                        "JL9605
*      PERFORM WRITE_DATA_TO_ACCESS TABLES  ITEMTAB            "JL9605
*                       USING    QUOTATION  ITEM_COUNT.        "JL9605
*    ENDIF.                                                    "JL9605
*  ENDIF.                                                 "LABK915116

ENDFORM.

*---------------------------------------------------------------------*
*       FORM CONSTRUCT_LINE_ITEMS                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  NET_VAL_UNIT                                                  *
*  -->  ITEM_NET_VAL                                                  *
*---------------------------------------------------------------------*
FORM construct_line_items USING net_val_unit LIKE zinvoice01-disc_amt
                                item_net_val LIKE zinvoice01-book_val.
  DATA: disc_perc LIKE linetab-disc_per.
  CLEAR linetab.

*"LABK931012->
*  disc_perc = nows_disc_perc * 10.
*  net_val_unit = net_val_unit * 10.
  disc_perc = nows_disc_perc.
  net_val_unit = net_val_unit.
*"LABK931012<-

  MOVE tvbdpa-matnr TO linetab-matnr.
  IF NOT fob_blend IS INITIAL.                              "LABK929496
    MOVE fob_blend TO linetab-mat_desc.                     "LABK929496
  ELSE.                                                     "LABK929496
    MOVE tvbdpa-arktx TO linetab-mat_desc.
  ENDIF.                                                    "LABK929496
* Start insert LABK930879
  IF NOT g_errmsg IS INITIAL.
    MOVE g_errmsg TO linetab-mat_desc.
  ENDIF.
* End insert LABK930879
  MOVE vbap-mvgr1 TO linetab-mvgr1.
  MOVE tvbdpa-lsmeng TO linetab-quantity.
  MOVE tvbdpa-vrkme TO linetab-uom.
  MOVE tvbdpa-posnr TO linetab-posnr.
  MOVE hm00_flag TO linetab-hm00_flag.
  IF disc_perc = 1000.                                      "LABK930234
    disc_perc = ' '.                                        "LABK930234
  ENDIF.                                                    "LABK930234
  IF zbjs_flag NE 0.
    MOVE 0 TO linetab-disc_per.  " ZBJS - discount % doesn't apply.
  ELSE.
    MOVE disc_perc TO linetab-disc_per.
  ENDIF.
  IF tkomvd-kschl = 'PB01'.
*   a fixed price item. Enter the net value for consistency.
*   linetab-disc_amt = item_net_val * 10. "LABK931012
    linetab-disc_amt = item_net_val.                        "LABK931012
  ELSE.
*   Calculate the disc unit price because if the item     "LABK930234
*   ZDBP condition is 0, the item net value is            "LABK930234
*   returned for unit net value. At this point it will    "LABK930234
*   be transferred to the disc unit price.                "LABK930234
    linetab-disc_amt =                                      "LABK930234
*"LABK931012->
*    ( item_net_val / linetab-quantity ) * 10             "LABK930234
     ( item_net_val / linetab-quantity ).                   "LABK930234
*"LABK931012<-

*    move net_val_unit to linetab-disc_amt.
  ENDIF.
  MOVE item_net_val TO linetab-net_val.
* MOVE 'H' TO LINETAB-UNDERLINE.
  MOVE 'H' TO linetab-general_flag.                         "LABK928153
  IF vbak-vbtyp = 'K' OR vbak-vbtyp = 'L' OR vbak-vbtyp = 'H'.
    SELECT SINGLE * FROM konv
           WHERE knumv = vbak-knumv
             AND kposn = vbap-posnr
             AND stunr = '502'
             AND zaehk = 07.     " PST related item.
    IF konv-kwert NE 0.
      linetab-lines = '*'.
      total_pst = total_pst + konv-kwert.
    ELSE.
      linetab-lines = ' '.
    ENDIF.
  ENDIF.
* Begin insert LABK929390 -->
  IF NOT c02_flag IS INITIAL.
    linetab-c02_flag = 'X'.
  ENDIF.
* --> End insert LABK929390
  APPEND linetab.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM CONSTRUCT_FOB_ITEMS                                      *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  NET_VAL_UNIT                                                  *
*  -->  ITEM_NET_VAL                                                  *
*---------------------------------------------------------------------*
FORM construct_fob_items USING net_val_unit LIKE komvd-kbetr
                               item_net_val LIKE zinvoice01-book_val.

  DATA: disc_perc LIKE linetab-disc_per.
  CLEAR fob.
*  disc_perc = nows_disc_perc * 10.  "LABK931012
  disc_perc = nows_disc_perc.                               "LABK931012

  MOVE tvbdpa-arktx TO fob-mat_desc.
  SELECT SINGLE * FROM vbap
   WHERE vbeln = vbdka-vbeln
     AND posnr = vbdpa-posnr.
  IF vbap-kdmat = 0.
    vbap-kdmat = 1.
  ENDIF.
*  move vbap-kdmat to fob-quantity.
  fob-quantity = vbap-kwmeng / fob_hi_qty.
  item_net_val = vbap-netpr * vbap-kdmat.
*  net_val_unit = vbap-netpr * 10.
  MOVE tvbdpa-vrkme TO fob-uom.
  IF nows_disc_perc = 100.                                  "LABK930598
    disc_perc = ' '.                                        "LABK930598
  ENDIF.                                                    "LABK930598
  MOVE disc_perc TO fob-disc_per.

*  move item_net_val to fob-net_val.
  disc_perc = nows_disc_perc / 100.
  disc_perc = 1 - disc_perc.
  fob-net_val = vbap-kzwi1 * disc_perc.
  fob-net_val = fob-net_val / fob_hi_qty.

  IF nows_disc_perc = 100.                                  "LABK930598
*   Calculate the disc unit price because if the item       "LABK930598
*   ZDBP condition is 0, the item net value is              "LABK930598
*   returned for unit net value. At this point it will      "LABK930598
*   be transferred to the disc unit price.                  "LABK930598
*"LABK931012->
*    fob-disc_amt = ( fob-net_val / fob-quantity ) * 10. "LABK930598
    fob-disc_amt = ( fob-net_val / fob-quantity ).          "LABK930598
*"LABK931012<-
  ELSE.                                                     "LABK930598
*"LABK931012->
*    if net_val_unit > 100.
*      move net_val_unit to fob-disc_amt.
*    else.
*      fob-disc_amt = net_val_unit * 10.
*    endif.

    IF vbap-meins <> vbap-vrkme.
      fob-disc_amt = ( fob-net_val / fob-quantity ).
    ELSE.
      MOVE net_val_unit TO fob-disc_amt.
    ENDIF.

*"LABK931012<-
  ENDIF.                                                    "LABK930598

  fob-kzwi2 = vbap-kzwi2.
  MOVE tvbdpa-uepos TO fob-uepos.
  MOVE tvbdpa-posnr TO fob-posnr.
* MOVE 'F' TO FOB-UNDERLINE.
  MOVE 'F' TO fob-general_flag.                             "LABK928153
  APPEND fob.
ENDFORM.

* To prepare data for reformatting sales order
*
INCLUDE zvrefsi1.                                           "JL9605


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

FORM sender.

  SELECT SINGLE * FROM tvko  WHERE vkorg = vbdka-vkorg.
  CHECK sy-subrc = 0.
  SELECT SINGLE * FROM sadr WHERE adrnr = tvko-adrnr
                            AND   natio = space.
  vbdka-sland = sadr-land1.
ENDFORM.

*-----------------------------------------------------------------------
*    ACTIVATE_ELEMENTS
*-----------------------------------------------------------------------
FORM activate_elements.
  DATA: typ LIKE vbak-vbtyp.
  DATA: matnr_found TYPE i.

  zinvoice01-mixed = ' '.
  o_type = ' '.
  SELECT SINGLE vbtyp FROM vbak INTO typ WHERE vbeln = vbdka-vbeln.
  IF typ EQ 'C' AND tnapr-fonam = 'ZV_NOWSCO_QUOTE'.
*  There is a preceding document associated with this service order.
*  If the preceding document is a quotation, then this service order
*  will be printed on a quotation form by using the layout set
*  'ZV_NOWSCO_QUOTE'.
    o_type = 'C'.
    nast-kschl = 'ZQ01'.   " output type is quotation.
    typ = 'B'.
    vbdka-vbeln = quotation_no.
    zinvoice01-mixed = '*'.
    SELECT * FROM vbap WHERE vbeln = quotation_no.
      CHECK vbap-pstyv NE 'TAQ'.
      matnr_found = 0.
      LOOP AT linetab.
*      if linetab-matnr eq vbap-matnr.
        IF linetab-mat_desc EQ vbap-arktx.
          matnr_found = 1.
          EXIT.
        ENDIF.
      ENDLOOP.
      IF matnr_found = 0.
*      Add the proposed items to the table.
        CLEAR linetab.
        MOVE vbap-matnr TO linetab-matnr.
        MOVE vbap-arktx TO linetab-mat_desc.
        MOVE 0 TO linetab-quantity.
        MOVE vbap-vrkme TO linetab-uom.
        MOVE vbap-posnr TO linetab-posnr.
*      MOVE 'H' TO LINETAB-UNDERLINE.
        MOVE 'H' TO linetab-general_flag.                   "LABK928153
        APPEND linetab.
      ENDIF.
    ENDSELECT.
  ENDIF.
  CASE typ.
    WHEN 'B' OR 'G'.
      PERFORM print_quotation.
    WHEN 'C'.
      IF vbak-auart = 'ZT' OR vbak-auart = 'ZZT'.
        PERFORM print_template.
      ELSE.
        PERFORM print_service_order.
      ENDIF.
    WHEN 'K' OR 'L' OR 'H'.
      PERFORM print_memo_request.
  ENDCASE.
ENDFORM.

*-----------------------------------------------------------------------
*    print a quotation
*-----------------------------------------------------------------------
FORM print_quotation.
  DATA: item TYPE i, gr2 TYPE i, total_price LIKE linetab-net_val,
        cnt TYPE i, first_loop(1) TYPE n, i(3) TYPE n,
        total_fob_net LIKE linetab-net_val.
  DATA: allowable_lns_left TYPE i,                          "LABK915116
        total_lns TYPE i,                                   "LABK915116
        lns_left TYPE i,                                    "LABK915116
        newpage_flag(1) VALUE 'X'.                          "LABK915116

* Begin insert LABK929390 -->
  DATA: BEGIN OF i_temptab OCCURS 0,
          matnr     LIKE vbap-matnr,
          mat_desc  LIKE zinvoice01-mat_desc,
          quantity  LIKE zinvoice01-quantity,
          uom       LIKE zinvoice01-uom,
          disc_per(20) TYPE c,
          disc_amt(20) TYPE c,
          net_val   LIKE zinvoice01-net_val,
          sp_addr4  LIKE zinvoice01-sp_addr4,
          sp_city   LIKE zinvoice01-sp_city,
          sp_region LIKE zinvoice01-sp_region,
          sp_pcode  LIKE zinvoice01-sp_pcode,
          posnr     LIKE vbap-posnr,
          general_flag LIKE zinvoice01-general_flag,
          hm00_flag(1) TYPE c,
          mvgr1     LIKE vbap-mvgr1,
          c02_flag(1)  TYPE c,
          lines     LIKE zinvoice01-lines,
        END OF i_temptab.

  DATA: BEGIN OF i_additional_tab OCCURS 0.
          INCLUDE STRUCTURE linetab.
  DATA: END OF i_additional_tab.

  DATA: l_addtl_count TYPE i.

  CLEAR:  zinvoice01-sum2, zinvoice01-sum1.
* --> End insert LABK929390

  item = 0.

* Activate header elements
  zinvoice01-order_num = proposal.
* zinvoice01-mixed = ' '.
  LOOP AT linetab.
    IF linetab-posnr NE '000000'.
      cnt = 0.
      LOOP AT fob.
        IF fob-uepos EQ linetab-posnr.
          total_price = total_price + fob-net_val.
          total_fob_net = total_fob_net + fob-kzwi2.
          cnt = cnt + 1.
        ENDIF.
      ENDLOOP.
*      linetab-disc_amt = total_price * 10.  "LABK931012
      linetab-disc_amt = total_price.                       "LABK931012

      IF cnt = 1.
        " no lower level item associated with this line item.
        linetab-net_val = linetab-quantity * total_price.
      ELSE.
        " total net price = total of net values of all components.
        linetab-net_val = total_fob_net.
      ENDIF.
      total_price = 0.
      total_fob_net = 0.
      MODIFY linetab.
    ENDIF.
  ENDLOOP.

  SORT linetab BY matnr quantity ASCENDING.

* Begin insert LABK929390 -->
* Lines items of same material and discount % should not be listed
* separately, but should be summed.
  REFRESH i_temptab.  CLEAR i_temptab.
  LOOP AT linetab.
    MOVE-CORRESPONDING linetab TO i_temptab.
    COLLECT i_temptab.
    CLEAR i_temptab.
  ENDLOOP.
  REFRESH linetab.  CLEAR linetab.
  LOOP AT i_temptab.
    MOVE-CORRESPONDING i_temptab TO linetab.
    APPEND linetab.
    CLEAR linetab.
  ENDLOOP.

* If it's an HM00 and there are c02 lines, list them separately
* under new section - 'Additional items'.
*  if not hm00_flag is initial.
  IF NOT header_hm00_flag IS INITIAL.                       "LABK929508
    LOOP AT linetab.
      IF linetab-c02_flag IS INITIAL.
        ADD linetab-net_val TO zinvoice01-sum1.
      ELSE.
        MOVE-CORRESPONDING linetab TO i_additional_tab.
        ADD i_additional_tab-net_val TO zinvoice01-sum2.
        APPEND i_additional_tab.
        CLEAR i_additional_tab.
      ENDIF.
    ENDLOOP.
    IF sy-subrc = 0.
      DELETE linetab WHERE NOT c02_flag IS initial.
    ENDIF.
  ENDIF.

* --> End insert LABK929390

  LOOP AT linetab.
    MOVE-CORRESPONDING linetab TO zinvoice01.
    MOVE linetab-matnr TO zinvoice01-mat_num.               "labk917025
    IF linetab-disc_amt EQ 0 AND linetab-net_val NE 0.
      " PB01 - fixed price item.
*     zinvoice01-disc_amt = linetab-net_val * 10. "LABK931012
      zinvoice01-disc_amt = linetab-net_val.                "LABK931012
    ENDIF.
* Dont print discount perc or disc amount for c02 surcharge "LABK929508
    IF NOT linetab-c02_flag IS INITIAL.                     "LABK929508
      CALL FUNCTION 'WRITE_FORM'                            "LABK929508
             EXPORTING                                      "LABK929508
                  element = 'LINE3'                         "LABK929508
                  window  = 'MAIN'                          "LABK929508
             EXCEPTIONS                                     "LABK929508
                  OTHERS  = 01.                             "LABK929508
    ELSEIF zinvoice01-disc_amt NE 0.                        "LABK929508
*    if zinvoice01-disc_amt ne 0.
      CALL FUNCTION 'WRITE_FORM'
           EXPORTING
                element = 'LINE1'
                window  = 'MAIN'
           EXCEPTIONS
                OTHERS  = 01.
    ELSE.
      CALL FUNCTION 'WRITE_FORM'
           EXPORTING
                element = 'LINE2'
                window  = 'MAIN'
           EXCEPTIONS
                OTHERS  = 01.
    ENDIF.
    total_price = total_price + linetab-net_val.
  ENDLOOP.

* Start delete LABK929390 -->
*  clear zinvoice01-lines.                                   "LABK915116
*  describe table linetab lines zinvoice01-lines.            "LABK915116
*  if zinvoice01-lines >= 30.    "total lines in window      "LABK915116
*    zinvoice01-lines = ( zinvoice01-lines mod 30 ).         "LABK915116
*    if zinvoice01-lines <> 0.                               "LABK915116
*      zinvoice01-underline = ' '.                           "LABK915116
*    endif.                                                  "LABK915116
*  endif.                                                    "LABK915116
*  if zinvoice01-lines <> 0.                                 "LABK915116
**    ADD 10 TO ZINVOICE01-LINES.   "total, comments    "LABK915116
*    add 7 to zinvoice01-lines.                              "LABK929345
*  endif.                                                    "LABK915116
*  if ( zinvoice01-lines >= 30 ).                            "LABK915116
*    zinvoice01-lines = 0.                                   "LABK915116
*  endif.                                                    "LABK915116


*  call function 'WRITE_FORM'                                "LABK915116
*       exporting                                            "LABK915116
*            element = 'WRITE_LINE'                          "LABK915116
*            window  = 'MAIN'                                "LABK915116
*       exceptions                                           "LABK915116
*            others  = 01.                                   "LABK915116
*
* --> End delete LABK929390

* Begin insert LABK929390 -->
* Print any additional items (c02) if any. This happens if it's an HM00.
  DESCRIBE TABLE i_additional_tab LINES l_addtl_count.

  IF l_addtl_count > 0.

* If it's an HM00, print a 'Fixed Price' line as we do with the invoices
* if there are also additional (c02) items.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'FIXED_PRICE_WITH_ADDITIONAL'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.

    LOOP AT i_additional_tab.
      MOVE-CORRESPONDING i_additional_tab TO zinvoice01.
      MOVE i_additional_tab-matnr TO zinvoice01-mat_num.
      IF i_additional_tab-disc_amt EQ 0 AND
         i_additional_tab-net_val NE 0.  " PB01 - fixed price item.
*       zinvoice01-disc_amt = i_additional_tab-net_val * 10. "LABK931012
        zinvoice01-disc_amt = i_additional_tab-net_val.     "LABK931012

      ENDIF.
      AT FIRST.
        CALL FUNCTION 'WRITE_FORM'
             EXPORTING
                  element = 'ADDITIONAL_INTRO'
                  window  = 'MAIN'
             EXCEPTIONS
                  OTHERS  = 01.
      ENDAT.
      CALL FUNCTION 'WRITE_FORM'
           EXPORTING
                element = 'ADDITIONAL_LINE1'
                window  = 'MAIN'
           EXCEPTIONS
                OTHERS  = 01.
      total_price = total_price + i_additional_tab-net_val.
    ENDLOOP.

    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'ADDITIONAL_TOTAL'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.

  ENDIF.
* --> End insert LABK929390

  zinvoice01-underline = 'X'.                               "LABK915116

*{ Start insert LABK934576
  IF fuel_surchg_amt NE 0.
    MOVE '   Fuel Surcharge' TO zinvoice01-hfuelsur_des.
    MOVE fuel_surchg_amt TO zinvoice01-hfuelsur_amt.
  ELSE.
    MOVE ' ' TO zinvoice01-hfuelsur_des.
    MOVE 0 TO zinvoice01-hfuelsur_amt.
  ENDIF.
*} End Insert LABK934576

  IF bc_surchg NE 0.
    MOVE '   BC Surcharge' TO zinvoice01-disc.
    MOVE bc_surchg TO zinvoice01-tt_af_sur.
  ELSE.
    MOVE ' ' TO zinvoice01-disc.
    MOVE 0 TO zinvoice01-tt_af_sur.
  ENDIF.
*{ Start Replace LABK934576
*  zinvoice01-htt_af_sur = total_price + bc_surchg.
  zinvoice01-htt_af_sur = total_price + bc_surchg + fuel_surchg_amt.
*} End Replace LABK934576

*  CALL FUNCTION 'WRITE_FORM' "deleted LABK915116
*       EXPORTING
*            ELEMENT = 'LINE2'
*            WINDOW  = 'TOTAL'
*       EXCEPTIONS
*            OTHERS  = 01.


  CALL FUNCTION 'WRITE_FORM'                                "LABK915116
       EXPORTING                                            "LABK915116
            element = 'TOTAL'                               "LABK915116
            window  = 'MAIN'                                "LABK915116
       EXCEPTIONS                                           "LABK915116
            OTHERS  = 01.                                   "LABK915116


* We're now at the last page before FOB pages               "LABK915116
  zinvoice01-last_page = 'X'.                               "LABK915116
  CLEAR zinvoice01-lines.                                   "LABK915116

  CLEAR: total_lns, lns_left, allowable_lns_left.           "LABK915116

  READ TABLE fob INDEX 1.
  IF sy-subrc EQ 0.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'NEWPAGE'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    total_price = 0.
    first_loop = 0.
    DESCRIBE TABLE fob LINES total_lns.                     "LABK915116
    LOOP AT fob WHERE mat_desc CS '+'.                      "LABK915116
      ADD 3 TO total_lns.                                   "LABK915116
    ENDLOOP.
    LOOP AT fob.
      IF fob-mat_desc NS '+'.                               "LABK915116
        ADD 1 TO zinvoice01-lines.                          "LABK915116
      ENDIF.                                                "LABK915116
      MOVE-CORRESPONDING fob TO zinvoice01.
*{   INSERT         CANK900302                                        1
      MOVE fob-mat_desc TO zinvoice01-fob_mat_desc.
*}   INSERT
      IF fob-uepos EQ '000000'.
        IF first_loop EQ 1.
          PERFORM print_fob_total USING total_price.
*{   INSERT         CANK900302                                        2
          CLEAR zinvoice01-inv_commts.
*}   INSERT
          clear i.                                          "LABK931580
          WHILE i < 225.
            i = i + 1.
            zinvoice01-inv_commts+i = '_'.
          ENDWHILE.
          IF zinvoice01-lines > 26.                         "LABK915116
            CLEAR zinvoice01-lines.                         "LABK915116
            CALL FUNCTION 'WRITE_FORM'                      "LABK915116
                 EXPORTING                                  "LABK915116
                   element = 'WRITE_LINE_FOB_2'             "LABK915116
                   window  = 'MAIN'                         "LABK915116
                 EXCEPTIONS                                 "LABK915116
                   OTHERS  = 01.                            "LABK915116
          ENDIF.                                            "LABK915116
* If there is more than one FOB and the last one on a page  "LABK915116
* would be split between pages, output the whole thing to   "LABK915116
* a next page. Check halfway down the page before the next  "LABK915116
* blend description.                                        "LABK915116
          IF zinvoice01-lines > 13 AND                      "LABK915116
            NOT newpage_flag IS INITIAL.                    "LABK915116
            lns_left = total_lns - zinvoice01-lines.        "LABK915116
            allowable_lns_left = 26 - zinvoice01-lines.     "LABK915116
            IF lns_left > allowable_lns_left.               "LABK915116
              CALL FUNCTION 'WRITE_FORM'                    "LABK915116
                   EXPORTING                                "LABK915116
                     element = 'WRITE_LINE_FOB_2'           "LABK915116
                     window  = 'MAIN'                       "LABK915116
                   EXCEPTIONS                               "LABK915116
                     OTHERS  = 01.                          "LABK915116
              CALL FUNCTION 'WRITE_FORM'                    "LABK915116
                   EXPORTING                                "LABK915116
                      element = 'NEWPAGE'                   "LABK915116
                      window  = 'MAIN'                      "LABK915116
                   EXCEPTIONS                               "LABK915116
                      OTHERS  = 01.                         "LABK915116
              newpage_flag = ' '.                           "LABK915116
              CLEAR: lns_left, allowable_lns_left,          "LABK915116
                     zinvoice01-lines.                      "LABK915116
            ELSE.                                           "LABK915116
              CALL FUNCTION 'WRITE_FORM'                    "LABK915116
                  EXPORTING                                 "LABK915116
                       element = 'UNDERLINE'                "LABK915116
                       window  = 'MAIN'                     "LABK915116
                  EXCEPTIONS                                "LABK915116
                       OTHERS  = 01.                        "LABK915116
            ENDIF.                                          "LABK915116
          ELSE.                                             "LABK915116
            CALL FUNCTION 'WRITE_FORM'
                 EXPORTING
                      element = 'UNDERLINE'
                      window  = 'MAIN'
                 EXCEPTIONS
                      OTHERS  = 01.
          ENDIF.                                            "LABK915116


        ENDIF.
        fob_yield = fob-yield.
        MOVE-CORRESPONDING fob TO zinvoice01.
        ADD 1 TO zinvoice01-lines.                          "LABK915116
        IF zinvoice01-lines > 26.                           "LABK915116
          CLEAR zinvoice01-lines.                           "LABK915116
          CALL FUNCTION 'WRITE_FORM'                        "LABK915116
               EXPORTING                                    "LABK915116
                 element = 'WRITE_LINE_FOB_2'               "LABK915116
                 window  = 'MAIN'                           "LABK915116
               EXCEPTIONS                                   "LABK915116
                 OTHERS  = 01.                              "LABK915116
        ENDIF.                                              "LABK915116
        CALL FUNCTION 'WRITE_FORM'
             EXPORTING
                  element = 'BLEND'
                  window  = 'MAIN'
             EXCEPTIONS
                  OTHERS  = 01.
      ELSE.
        IF zinvoice01-lines > 26.                           "LABK915116
          CLEAR zinvoice01-lines.                           "LABK915116
          CALL FUNCTION 'WRITE_FORM'                        "LABK915116
               EXPORTING                                    "LABK915116
                 element = 'WRITE_LINE_FOB_2'               "LABK915116
                 window  = 'MAIN'                           "LABK915116
               EXCEPTIONS                                   "LABK915116
                 OTHERS  = 01.                              "LABK915116
        ENDIF.                                              "LABK915116

        CALL FUNCTION 'WRITE_FORM'
             EXPORTING
                  element = 'FOBLINE'
                  window  = 'MAIN'
             EXCEPTIONS
                  OTHERS  = 01.
        total_price = total_price + fob-net_val.
        first_loop = 1.
      ENDIF.
    ENDLOOP.
    PERFORM print_fob_total USING total_price.

* Clear last_page here because it (sapscript) seems to      "LABK915116
* start printing the main line items at this point          "LABK915116
    zinvoice01-last_page = ' '.                             "LABK915116

    CALL FUNCTION 'WRITE_FORM'                              "LABK915116
         EXPORTING                                          "LABK915116
              element = 'WRITE_LINE_FOB_2'                  "LABK915116
              window  = 'MAIN'                              "LABK915116
         EXCEPTIONS                                         "LABK915116
              OTHERS  = 01.                                 "LABK915116
  ENDIF.


ENDFORM.

*---------------------------------------------------------------------*
*       FORM print_service_order                                      *
*---------------------------------------------------------------------*
*       This routine prints a service order                           *
*---------------------------------------------------------------------*

FORM print_service_order.
  DATA: total_price LIKE linetab-net_val,
        cnt TYPE i.
  DATA: line_cnt TYPE i.                                    "LABK915255

  zinvoice01-bp_addr1 = ' '.
  zinvoice01-bp_addr2 = ' '.
  zinvoice01-bp_addr3 = ' '.
  zinvoice01-bp_addr4 = ' '.
  IF kna1-name2 EQ ' '.
    MOVE kna1-stras TO zinvoice01-bp_addr1.
    CONCATENATE kna1-ort01 ', ' kna1-regio INTO zinvoice01-bp_addr2.
    MOVE kna1-pstlz TO zinvoice01-bp_addr3.
  ELSE.
    MOVE kna1-name2 TO zinvoice01-bp_addr1.
    MOVE kna1-stras TO zinvoice01-bp_addr2.
    CONCATENATE kna1-ort01 ', ' kna1-regio INTO zinvoice01-bp_addr3.
    MOVE kna1-pstlz TO zinvoice01-bp_addr4.
  ENDIF.
  SORT linetab ASCENDING BY matnr quantity.
  TRANSLATE vbak-bstnk TO UPPER CASE.
  TRANSLATE sadr-ort01 TO UPPER CASE.
  TRANSLATE sadr-name1 TO UPPER CASE.
  IF re_type = 'B'.
    zinvoice01-tax_flag = '*'.
  ELSE.
    zinvoice01-tax_flag = ' '.
  ENDIF.
  TRANSLATE zinvoice01-sp_addr1 TO UPPER CASE.
  TRANSLATE zinvoice01-sp_addr2 TO UPPER CASE.
  CLEAR line_cnt.                                           "LABK915255
  LOOP AT linetab.
    MOVE-CORRESPONDING linetab TO zinvoice01.
    IF zinvoice01-disc_amt = 0.
      zinvoice01-mixed = '*'.
    ELSE.
      zinvoice01-mixed = ' '.
    ENDIF.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'LINE1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    ADD 1 TO line_cnt.                                      "LABK915255
    IF line_cnt = 28.                                       "LABK915255
      CALL FUNCTION 'WRITE_FORM'                            "LABK915255
           EXPORTING                                        "LABK915255
                element = 'UNDERLINE_ITEMS'                 "LABK915255
                window  = 'MAIN'                            "LABK915255
           EXCEPTIONS                                       "LABK915255
                OTHERS  = 01.                               "LABK915255
      CLEAR line_cnt.                                       "LABK915255
    ENDIF.                                                  "LABK915255
    total_price = total_price + linetab-net_val.
  ENDLOOP.

  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'LINE2'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  ADD 1 TO line_cnt.                                        "LABK915255
  IF line_cnt = 28.                                         "LABK915255
    CALL FUNCTION 'WRITE_FORM'                              "LABK915255
         EXPORTING                                          "LABK915255
              element = 'UNDERLINE'                         "LABK915255
              window  = 'MAIN'                              "LABK915255
         EXCEPTIONS                                         "LABK915255
              OTHERS  = 01.                                 "LABK915255
    CLEAR line_cnt.                                         "LABK915255
  ENDIF.                                                    "LABK915255

  cnt = 0.
  WHILE cnt < 6.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'LINE3'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = cnt + 1.
    ADD 1 TO line_cnt.                                      "LABK915255
    IF line_cnt = 28.                                       "LABK915255
      CALL FUNCTION 'WRITE_FORM'                            "LABK915255
           EXPORTING                                        "LABK915255
                element = 'UNDERLINE'                       "LABK915255
                window  = 'MAIN'                            "LABK915255
           EXCEPTIONS                                       "LABK915255
                OTHERS  = 01.                               "LABK915255
      CLEAR line_cnt.                                       "LABK915255
    ENDIF.                                                  "LABK915255
  ENDWHILE.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'UNDERLINE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'ESTIMATE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.

  CLEAR zinvoice01-last_page.
* Flag for writing notes and signatures box on last page before page
* 'TWO'.
  zinvoice01-last_page = 'X'.


  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'NEWPAGE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  cnt = 1.
  WHILE cnt < 13.
    READ TABLE eqp1 INDEX cnt.
    IF sy-subrc EQ 0.
      MOVE eqp1-unit TO zinvoice01-dir1.
    ELSE.
      zinvoice01-dir1 = ' '.
    ENDIF.
    READ TABLE eqp2 INDEX cnt.
    IF sy-subrc EQ 0.
      MOVE eqp2-unit TO zinvoice01-dir2.
    ELSE.
      zinvoice01-dir2 = ' '.
    ENDIF.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'SERVICE'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = cnt + 1.
  ENDWHILE.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'EMPTITLE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  cnt = 1.
  LOOP AT emp1.
*   concatenate emp1-number+4(4) emp1-name
    CONCATENATE emp1-number+2(6) emp1-name                  "LABK916974
                            INTO zinvoice01-comment1 SEPARATED BY space.
    MOVE emp1-class TO zinvoice01-comment2.
    READ TABLE emp2 INDEX cnt.
    IF sy-subrc EQ 0.
*     concatenate emp2-number+4(4) emp2-name
      CONCATENATE emp2-number+2(6) emp2-name                "LABK916974
                            INTO zinvoice01-comment3 SEPARATED BY space.
      MOVE emp2-class TO zinvoice01-comment4.
    ELSE.
      zinvoice01-comment3 = ' '.
      zinvoice01-comment4 = ' '.
    ENDIF.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'EMPINFO1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = cnt + 1.
  ENDLOOP.
  WHILE cnt < 11.
    zinvoice01-comment1 = ' '.
    zinvoice01-comment2 = ' '.
    zinvoice01-comment3 = ' '.
    zinvoice01-comment4 = ' '.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'EMPINFO1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = cnt + 1.
  ENDWHILE.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'EMP_UNDERLINE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM print_memo_request                                       *
*---------------------------------------------------------------------*
*       This routine prints a credit/debit memo request               *
*---------------------------------------------------------------------*

FORM print_memo_request.
  DATA: total_price LIKE linetab-net_val, temp LIKE linetab-net_val,
        cnt TYPE i.

  zinvoice01-cust_num = bill_to_kunnr.
  IF name2 EQ ' '.
    MOVE stras TO zinvoice01-bp_addr1.
    CONCATENATE ort01 ', ' regio INTO zinvoice01-bp_addr2.
    MOVE pstlz TO zinvoice01-bp_addr3.
  ELSE.
    MOVE name2 TO zinvoice01-bp_addr1.
    MOVE stras TO zinvoice01-bp_addr2.
    CONCATENATE ort01 ', ' regio INTO zinvoice01-bp_addr3.
    MOVE pstlz TO zinvoice01-bp_addr4.
  ENDIF.
  LOOP AT linetab.
*   make sure the first material of "Frac Sand" will be placed on the
*   top of the list.
    IF linetab-mat_desc(9) = 'Frac Sand'.
      linetab-matnr = '000000000000000000'.
      MODIFY linetab.
      EXIT.
    ENDIF.
  ENDLOOP.
  SORT linetab ASCENDING BY matnr quantity.
  TRANSLATE vbak-bstnk TO UPPER CASE.
  TRANSLATE zinvoice01-sp_addr1 TO UPPER CASE.
  TRANSLATE zinvoice01-sp_addr2 TO UPPER CASE.
  header_hm00_flag = 'Y'.
  zinvoice01-tax_flag = 'Y'.    " suppress disc % and disc unit price
* determine if the discount % and amount shall be suppressed.
  LOOP AT linetab.
    IF linetab-hm00_flag EQ space.
      " non fixed price detected
      header_hm00_flag = ' '.
    ENDIF.
    IF linetab-disc_per > 0.
      zinvoice01-tax_flag = ' '.
    ENDIF.
  ENDLOOP.
  IF header_hm00_flag = 'Y'.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'TEXT1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
  ENDIF.
  cnt = 0.
  LOOP AT linetab.
    MOVE-CORRESPONDING linetab TO zinvoice01.
    IF header_hm00_flag = 'Y'.
      zinvoice01-mixed = 'Y'.
      zinvoice01-tax_flag = 'Y'.
      MOVE 0 TO zinvoice01-disc_per.
      MOVE 0 TO zinvoice01-disc_amt.
      MOVE 0 TO zinvoice01-net_val.
    ENDIF.
    IF header_hm00_flag NE 'Y' AND zinvoice01-tax_flag EQ 'Y'.
      MOVE 0 TO zinvoice01-disc_per.
      MOVE 0 TO zinvoice01-disc_amt.
    ENDIF.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'LINE1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    total_price = total_price + linetab-net_val.
    cnt = cnt + 1.
    IF cnt > 26.
*     make sure boundary lines are printed at page break.
      zinvoice01-lines = '*'.
    ELSE.
      zinvoice01-lines = ' '.
    ENDIF.
  ENDLOOP.
  MOVE total_price TO zinvoice01-tt_af_sur.
  IF header_hm00_flag EQ 'Y'.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'FIXED'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
  ENDIF.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'UNDERLINE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  zinvoice01-mixed = ' '.
  IF bc_surchg NE 0.
    MOVE 'BC Surcharge' TO zinvoice01-disc.
    MOVE bc_surchg TO zinvoice01-net_val.
  ELSE.
    MOVE ' ' TO zinvoice01-disc.
    MOVE 0 TO zinvoice01-net_val.
  ENDIF.
  zinvoice01-hprbk_tot = 0.
  IF total_pst > 0.
    total_tax = total_tax - total_pst.
    zinvoice01-hprbk_tot = total_pst.
  ENDIF.
  IF zinvoice01-hprbk_tot = 0.
    zinvoice01-tax_flag = ' '.
  ELSE.
    zinvoice01-tax_flag = 'Y'.
  ENDIF.
  MOVE total_tax TO zinvoice01-hfinal_amt.
  zinvoice01-htt_af_sur = total_price + total_tax + bc_surchg +
                          total_pst.
  IF cnt > 26.      " more than one page printed.
    cnt = cnt - 26.
  ENDIF.
  IF cnt > 14.
*   if not enough space, generate a new page before printing totals.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'NEWPAGE'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = 0.
  ENDIF.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'TOTAL1'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
  cnt = 0.
  total_price = 0.
  total_tax = 0.
  total_pst = 0.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM print_template                                           *
*---------------------------------------------------------------------*
*       This routine prints a template                                *
*---------------------------------------------------------------------*

FORM print_template.
  DATA: cnt TYPE i.

  zinvoice01-bp_addr1 = ' '.
  zinvoice01-bp_addr2 = ' '.
  zinvoice01-bp_addr3 = ' '.
  zinvoice01-bp_addr4 = ' '.
  IF kna1-name2 EQ ' '.
    MOVE kna1-stras TO zinvoice01-bp_addr1.
    CONCATENATE kna1-ort01 ', ' kna1-regio INTO zinvoice01-bp_addr2.
    MOVE kna1-pstlz TO zinvoice01-bp_addr3.
  ELSE.
    MOVE kna1-name2 TO zinvoice01-bp_addr1.
    MOVE kna1-stras TO zinvoice01-bp_addr2.
    CONCATENATE kna1-ort01 ', ' kna1-regio INTO zinvoice01-bp_addr3.
    MOVE kna1-pstlz TO zinvoice01-bp_addr4.
  ENDIF.
* sort linetab ascending by matnr quantity.
* translate vbak-bstnk to upper case.
  TRANSLATE sadr-ort01 TO UPPER CASE.
  TRANSLATE sadr-name1 TO UPPER CASE.
  cnt = 0.
  CLEAR zinvoice01-lines.                                   "LABK915243
  LOOP AT linetab.
    MOVE-CORRESPONDING linetab TO zinvoice01.
    MOVE linetab-matnr TO zinvoice01-mat_num.
    MOVE linetab-mvgr1 TO zinvoice01-descline1.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'LINE1'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.
    cnt = cnt + 1.
*    IF CNT > 26. "deleted LABK915243
*      ZINVOICE01-LINES = '*'.
*    ELSE.
*      ZINVOICE01-LINES = ' '.
*    ENDIF.
    IF cnt = 37.              "total lines in window      "LABK915243
      CALL FUNCTION 'WRITE_FORM'                            "LABK915243
           EXPORTING                                        "LABK915243
                element = 'CONTINUED'                       "LABK915243
                window  = 'CONTINUE'                        "LABK915243
           EXCEPTIONS                                       "LABK915243
                OTHERS  = 01.                               "LABK915243
      CLEAR cnt.                                            "LABK915243
    ENDIF.                                                  "LABK915243
  ENDLOOP.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'UNDERLINE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM print_fob_total                                          *
*---------------------------------------------------------------------*
*       This routine prints the FOB total lines for a quotation       *
*---------------------------------------------------------------------*
*

FORM print_fob_total USING total_price LIKE linetab-net_val.

  ADD 1 TO zinvoice01-lines.                                "LABK915116
  IF zinvoice01-lines > 26.                                 "LABK915116
    CLEAR zinvoice01-lines.                                 "LABK915116
    CALL FUNCTION 'WRITE_FORM'                              "LABK915116
        EXPORTING                                           "LABK915116
             element = 'WRITE_LINE_FOB_2'                   "LABK915116
             window  = 'MAIN'                               "LABK915116
        EXCEPTIONS                                          "LABK915116
             OTHERS  = 01.                                  "LABK915116
  ENDIF.                                                    "LABK915116

  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'ULINE'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.

  ADD 1 TO zinvoice01-lines.                                "LABK915116
  IF zinvoice01-lines > 26.                                 "LABK915116
    CLEAR zinvoice01-lines.                                 "LABK915116
    CALL FUNCTION 'WRITE_FORM'                              "LABK915116
        EXPORTING                                           "LABK915116
             element = 'WRITE_LINE_FOB_2'                   "LABK915116
             window  = 'MAIN'                               "LABK915116
        EXCEPTIONS                                          "LABK915116
             OTHERS  = 01.                                  "LABK915116
  ENDIF.                                                    "LABK915116

  zinvoice01-mat_desc = '                     Blend Total FOB:'.
  zinvoice01-quantity = 1.
  zinvoice01-uom = 'TNE'.
  zinvoice01-disc_per = ' '.
  zinvoice01-disc_amt = ' '.
  zinvoice01-net_val = total_price.
*    total_price = 0.
  CALL FUNCTION 'WRITE_FORM'
       EXPORTING
            element = 'FOBTOTAL'
            window  = 'MAIN'
       EXCEPTIONS
            OTHERS  = 01.

  zinvoice01-mat_desc = ' '.
  zinvoice01-quantity = 1.
  zinvoice01-uom = 'M3'.
  zinvoice01-disc_per = ' '.
  zinvoice01-disc_amt = ' '.
  IF fob_yield NE 0.
    ADD 1 TO zinvoice01-lines.                              "LABK915116
    IF zinvoice01-lines > 26.                               "LABK915116
      CLEAR zinvoice01-lines.                               "LABK915116
      CALL FUNCTION 'WRITE_FORM'                            "LABK915116
           EXPORTING                                        "LABK915116
               element = 'WRITE_LINE_FOB_2'                 "LABK915116
               window  = 'MAIN'                             "LABK915116
           EXCEPTIONS                                       "LABK915116
               OTHERS  = 01.                                "LABK915116
    ENDIF.                                                  "LABK915116

    zinvoice01-net_val = total_price / fob_yield.
    total_price = 0.
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'FOBMCUBE'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.

  ELSE.
    ADD 1 TO zinvoice01-lines.                              "LABK915116
    IF zinvoice01-lines > 26.                               "LABK915116
      CLEAR zinvoice01-lines.                               "LABK915116
      CALL FUNCTION 'WRITE_FORM'                            "LABK915116
           EXPORTING                                        "LABK915116
               element = 'WRITE_LINE_FOB_2'                 "LABK915116
               window  = 'MAIN'                             "LABK915116
           EXCEPTIONS                                       "LABK915116
               OTHERS  = 01.                                "LABK915116
    ENDIF.                                                  "LABK915116

    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'FOBMCUBE0'
              window  = 'MAIN'
         EXCEPTIONS
              OTHERS  = 01.

  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM TVBDPAU_CREATE                                           *
*---------------------------------------------------------------------*
*       This routine is creating a table which includes the subitem-  *
*       numbers                                                       *
*---------------------------------------------------------------------*

FORM tvbdpau_create.

  LOOP AT tvbdpa.
    IF tvbdpa-uepos IS INITIAL.
      IF tvbdpau-uposv > 0.
        APPEND tvbdpau.
        CLEAR tvbdpau.
      ENDIF.
      tvbdpau-posnr = tvbdpa-posnr.
    ELSE.
      IF tvbdpau-uposv IS INITIAL OR
         tvbdpau-uposv > tvbdpa-posnr.
        tvbdpau-uposv = tvbdpa-posnr.
      ENDIF.
      IF tvbdpau-uposb < tvbdpa-posnr AND
         tvbdpau-uposv < tvbdpa-posnr.
        tvbdpau-uposb = tvbdpa-posnr.
      ENDIF.
    ENDIF.
  ENDLOOP.
  IF tvbdpau-uposv > 0.
    APPEND tvbdpau.
  ENDIF.
  SORT tvbdpau.

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.
  re_type = ' '.
  in_type = ' '.
  SELECT SINGLE vbtyp INTO in_type FROM vbak WHERE vbeln = nast-objky.
  SELECT SINGLE vgbel INTO quotation_no
                      FROM vbap
                     WHERE vbeln = nast-objky.
  SELECT SINGLE vbtyp INTO re_type FROM vbak WHERE vbeln = quotation_no.
  SELECT SINGLE vbelv INTO quotation_no
                      FROM vbfa
                     WHERE vbelv = quotation_no.
  IF sy-subrc EQ 0 AND in_type = 'C' AND re_type = 'B'.
*  there is a preceding document associated with this service order.
*  usually, the preceding document is a quotation, therefore the
*  layout set 'ZV_NOWSCO_QUOTE' is used to replace the default one.
    tnapr-fonam = 'ZV_NOWSCO_QUOTE'.
*   nast-objky = quotation_no.
*   nast-kschl = 'ZQ01'.
  ENDIF.

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

  CALL FUNCTION 'RV_DOCUMENT_PRINT_VIEW'
       EXPORTING
            comwa = vbco3
       IMPORTING
            kopf  = vbdka
       TABLES
            pos   = tvbdpa.

  PERFORM sender.
  PERFORM tvbdpau_create.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM PROTOCOL_UPDATE                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
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 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 vbdka-knumv.
    CLEAR komk.
    komk-mandt = sy-mandt.
    komk-kalsm = vbdka-kalsm.
    komk-kappl = pr_kappl.
    komk-waerk = vbdka-waerk.
    komk-knumv = vbdka-knumv.
    komk-vbtyp = vbdka-vbtyp.
  ENDIF.
  komp-kposn = vbdpa-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 FORM_CLOSE                                               *
*---------------------------------------------------------------------*
*       End of printing the form                                      *
*---------------------------------------------------------------------*

FORM form_close.

  CALL FUNCTION 'CLOSE_FORM'           "...Ende Formulardruck
       EXCEPTIONS OTHERS = 1.
  IF sy-subrc NE 0.
    retcode = 1.
  ENDIF.
  SET COUNTRY space.

ENDFORM.

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

  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.

* LABK912523 - revert the zrvadopf back to rvadopfo, which open the
*              layout set.
  INCLUDE rvadopfo.

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

ENDFORM.

*---------------------------------------------------------------------*
*       FORM FORM_TITLE_PRINT                                         *
*---------------------------------------------------------------------*
*       Printing of the form title depending of the field VBTYP       *
*---------------------------------------------------------------------*

FORM form_title_print.

  DATA: title(35).             "document type name we will write to file

  CASE vbdka-vbtyp.
    WHEN 'A'.
*     assign name of document type to our variable
      title =  title_a.                                     " 950623 RV
    WHEN 'B'.                                               " 950623 RV
      title =  title_b.                                     " 950623 RV
    WHEN 'C'.                                               " 950623 RV
      title =  title_c.                                     " 950623 RV
    WHEN 'D'.                                               " 950623 RV
      title =  title_d.                                     " 950623 RV
    WHEN 'G'.                                               " 950623 RV
      title =  title_g.                                     " 950623 RV
    WHEN 'H'.                                               " 950623 RV
      title =  title_h.                                     " 950623 RV
    WHEN 'K'.                                               " 950623 RV
      title =  title_k.                                     " 950623 RV
    WHEN 'L'.                                               " 950623 RV
      title =  title_l.                                     " 950623 RV
    WHEN OTHERS.                                            " 950623 RV
      title =  title_c.                                     " 950623 RV
  ENDCASE.
*  IF PREVIEW = 'NO'.                                     "LABK915116
**   write Document Type to file
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '01' TITLE.
**   write currency of first item to header
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '15' VBDKA-WAERK.
*  ENDIF.                                                 "LABK915116

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.
*
* Note: The Location that TE wants is actually the first line in the
*       name field of the 'ZB' partner as seen in the partner details
*       screen.  The Well Name that TE is looking for is actually the
*       the location field of the 'ZB' partner as seen in the partner
*       details screen.
*
************************************************************************
FORM write_header_info_to_file.

  DATA: job_type_no(3), personnel_name(30),
        del_date(10).
  DATA: length TYPE i,
*        FILENAME(12) TYPE C,
*        OUT_NAME(12) TYPE C,
        cnt TYPE i.

* determine how many chars to take off the beginning of the doc. number
  length = strlen( vbdka-vbeln ) - 8.
* assign to temporary field-symbol
  ASSIGN vbdka-vbeln+length(8) TO .
** assign field-symbol to filename
*  FILENAME = .
** add '.' for the extension
*  MOVE '.' TO FILENAME+8.
*  IF PREVIEW = 'NO'.                                        "LABK915116
**   to get path information
**   perform get_path_name(zvprint1) using path 'TE'  changing retcode.
*    PERFORM GET_PATH_NAME(ZVPRINT1) USING PATH 'SDBCK'      "LABK915522
*                                         CHANGING RETCODE.  "LABK915522
*
*    IF RETCODE NE 0.
*      SUBMIT ZCALLERR WITH RET_CODE = RETCODE
*                      WITH MAIN_PGM = SY-REPID.
*      EXIT.
*    ENDIF.
*    PERFORM OPEN_FILE(ZVPRINT1) USING FILENAME OUT_NAME PATH.
*  ENDIF.           "if preview = 'NO'                    "LABK915116
*   'S:\'.
* BOOK_TOTAL = 0.
  item_count = 0.

  IF vbdka-vbtyp = 'G'.                "  Contract
*    IF PREVIEW = 'NO'.                                     "LABK915116
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'
*                                          '02' VBDKA-VBELN.
*    ENDIF.                                                 "LABK915116
  ENDIF.

  IF vbdka-vbtyp = 'H'.          "  Return Order              950623 RV
*    IF PREVIEW = 'NO'.                                     "LABK915116
*     PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'    " 950623 RV
*                                          '04' VBDKA-VBELN. " 950623 RV
*    ENDIF.                                                 "LABK915116
  ENDIF.                                                    " 950623 RV

  IF vbdka-vbtyp = 'B'.          " Quotation
*   write Quotation Number to file
*    IF PREVIEW = 'NO'.                                     "LABK915116
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'
*                                            '02' VBDKA-VBELN.
*    ENDIF.                                                 "LABK915116
  ENDIF.
  CLEAR quotation.                                          "JL9605
  IF vbdka-vbtyp = 'C'.                "  Sales Order
*    IF PREVIEW = 'NO'.                                     "LABK915116
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001'
*                                            '04' VBDKA-VBELN.
*    ENDIF.                                                 "LABK915116
*   write Quotation Number to file
    SELECT * FROM vbap WHERE vbeln = vbdka-vbeln.
      IF vbap-vgbel NE space.
        SELECT SINGLE * FROM vbak WHERE vbeln = vbap-vgbel.
        IF sy-subrc = 0 AND vbak-auart = 'AG'.    " Quotation type
*         IF PREVIEW = 'NO'.                                 "LABK915116
*            PERFORM WRITE_TO_FILE(ZVPRINT1) USING
*                                       '01' '000001' '02' VBAK-VBELN.
*         ENDIF.                                             "LABK915116
          quote_flag = 1.
          quotation = vbap-vgbel.
          EXIT.
        ENDIF.
      ENDIF.
    ENDSELECT.
    IF quote_flag = 0.
*     IF PREVIEW = 'NO'.                                     "LABK915116
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '02' '  '.
*     ENDIF.                                                 "LABK915116
    ENDIF.
*   Get all delivery notes for the sales order
    PERFORM get_del_notes TABLES del_note_tbl
                            USING vbdka-vbeln   del_notes.
*    IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '05' DEL_NOTES.
*    ENDIF.                                                 "LABK915116

*   write units to be used to file.
    unit_count = 0.
    CLEAR eqp1.
    REFRESH eqp1.
    CLEAR eqp2.
    REFRESH eqp2.
*   select * from zunln where vbelv = vbdka-vbeln.
    SELECT * FROM z2utl WHERE vbeln = vbdka-vbeln           "LABK916958
                          AND unit NE ' '.                  "LABK916958
      unit_count = unit_count + 1.
*     IF PREVIEW = 'NO'.                                     "LABK915116
*        PERFORM WRITE_TO_FILE(ZVPRINT1)
**                         using '04' unit_count '01' zunln-zunit.
*                     USING '04' UNIT_COUNT '01' Z2UTL-UNIT. "LABK915116
*     ENDIF.                                                 "LABK915116
      IF unit_count < 13.
*       move zunln-zunit to eqp1-unit.
        MOVE z2utl-unit TO eqp1-unit.                       "LABK916958
        APPEND eqp1.
      ELSE.
*       move zunln-zunit to eqp2-unit.
        MOVE z2utl-unit TO eqp2-unit.                       "LABK916958
        APPEND eqp2.
      ENDIF.
    ENDSELECT.
    IF unit_count = 0.                 "  Write dummy record
*     IF PREVIEW = 'NO'.                                     "LABK915116
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '04' '000001' '01' '   '.
*     ENDIF.                                                 "LABK915116
    ENDIF.
*   write personnel was used in the job to file
    unit_count = 0.
    CLEAR emp1.
    CLEAR emp2.
    REFRESH emp1.
    REFRESH emp2.
    cnt = 1.
*   select * from zprln where vbelv = vbdka-vbeln.
    SELECT * FROM z2utl WHERE vbeln = vbdka-vbeln.          "LABK916958
      CLEAR: p0002, personnel_name.

* This select statement modified with PA0002. - 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 = '0002' AND
*                           PERNR = ZPRLN-PERNR.
*        MOVE PREL+3 TO P0002.
*     clear emp.
*     select * from pa0002 where pernr = zprln-pernr. " jb1
      SELECT * FROM pa0002 WHERE pernr = z2utl-pernr.       "LABK916958
        MOVE-CORRESPONDING pa0002 TO p0002.
        MOVE p0002-vorna(1) TO personnel_name.
        MOVE '.' TO personnel_name+1(1).
        MOVE p0002-nachn TO personnel_name+3(27).
        ADD 1 TO unit_count.
* Find the person's Class                                    "LABK916958
        IF z2utl-percls IS INITIAL.                         "LABK916958
          SELECT SINGLE stell INTO (pa0001-stell)           "LABK916958
            FROM pa0001 WHERE pernr = z2utl-pernr           "LABK916958
                         AND endda >= z2utl-effdate         "LABK916958
                         AND begda <= z2utl-effdate.        "LABK916958
          CONCATENATE 'P0' pa0001-stell+6(2)                "LABK916958
            INTO z2utl-percls.                              "LABK916958
        ENDIF.                                              "LABK916958
*       IF PREVIEW = 'NO'.                                   "LABK915116
*          PERFORM WRITE_TO_FILE(ZVPRINT1) USING '03' UNIT_COUNT '01'
*                                                       PERSONNEL_NAME.
*         write Employee class to file
*         perform write_to_file(zvprint1) using '03' unit_count '02'
*                                                      zprln-matnr.
*         PERFORM WRITE_TO_FILE(ZVPRINT1) USING '03'         "LABK915116
*             UNIT_COUNT '02' Z2UTL-PERCLS.                  "LABK915116
*         write Employee number to file
*         perform write_to_file(zvprint1) using '03' unit_count '03'
*                                                      zprln-pernr.
*         PERFORM WRITE_TO_FILE(ZVPRINT1) USING '03'         "LABK915116
*             UNIT_COUNT '03' Z2UTL-PERNR.                   "LABK915116
*       ENDIF.                                               "LABK915116
*     store employee info
        IF cnt < 11.
          MOVE personnel_name TO emp1-name.
*       move zprln-matnr to emp1-class.
*       move zprln-pernr to emp1-number.
         MOVE z2utl-percls TO emp1-class.                   "LABK915116
         MOVE z2utl-pernr TO emp1-number.                   "LABK915116
          APPEND emp1.
        ELSE.
          MOVE personnel_name TO emp2-name.
*       move zprln-matnr to emp2-class.
*       move zprln-pernr to emp2-number.
         MOVE z2utl-percls TO emp2-class.                   "LABK915116
         MOVE z2utl-pernr TO emp2-number.                   "LABK915116
          APPEND emp2.
        ENDIF.
        cnt = cnt + 1.

        EXIT.
      ENDSELECT.
    ENDSELECT.
    IF unit_count = 0.                 "  Write dummy record
*     IF PREVIEW = 'NO'.                                     "LABK915116
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '03' '000001' '01' '   '.
*     ENDIF.                                                 "LABK915116
    ENDIF.
  ENDIF.

* call procedure to write Proposal No. to file
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0004' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '03' TEXTLINE.
*  ENDIF.                                                 "LABK915116
  proposal = textline.    " to be used later by write_to_sapback_table
* find well name and location(stored in name1 and location fields of
* ZB partner.
  PERFORM get_well_data(zvprint1) USING vbdka-vbeln '01' '000001'.
*                                     PREVIEW.              "LABK915116
  IF vbpa-adrnr NE ' '.
    IF NOT sadr IS INITIAL.                                 "LABK925268
      zinvoice01-sp_addr1 = sadr-ort01.
      zinvoice01-sp_addr2 = sadr-name1.
    ELSEIF NOT adrc IS INITIAL.                             "LABK925268
      zinvoice01-sp_addr1 = adrc-city1.                     "LABK925268
      zinvoice01-sp_addr2 = adrc-name1.                     "LABK925268
    ENDIF.                                                  "LABK925268
  ELSE.
    zinvoice01-sp_addr1 = kna1-ort01.
    zinvoice01-sp_addr2 = kna1-name1.
  ENDIF.
  PERFORM get_well_info USING vbdka-vbeln '01' '000001'.

* write Job Type (description) to file
  SELECT SINGLE * FROM vbak WHERE vbeln = vbdka-vbeln.
  job_type_no = vbak-kvgr1.
* SELECT SINGLE * FROM tvv1t WHERE spras = sy-langu AND
  SELECT SINGLE * FROM t25A2 WHERE spras = sy-langu AND   "IJ1
                                   kvgr1 = job_type_no.
*  IF PREVIEW = 'NO'.                                     "LABK915116
** PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '07' TVV1T-BEZEI.
*   PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '07'
*                                         TVV1T-BEZEI+4(16). "LABK926189
**   write purchase order number to file
*   PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '18' VBAK-BSTNK.
*
**   write Quotation Date to file
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '20' VBDKA-AUDAT.
*
**   write Date of Service to file
*   PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '21' VBAK-VDATU.
*
**   write Product Line to file
*   PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '88' VBAK-KVGR2.
*
**  write Creation Date to file                                      "gs
*   PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '95' VBAK-ERDAT.
*  ENDIF.                                                 "LABK915116

* write sales representative to file
  CLEAR p0001.
  SELECT SINGLE * FROM vbpa WHERE
           parvw = 'VE' AND
           posnr = '000000' AND
           vbeln = vbdka-vbeln.

* This select statement modified with PA0001 - 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'.                                     "LABK915116
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '08' P0001-ENAME.
*  ENDIF.                                                 "LABK915116

* Write base's phone number of salesman
  sadr-telf1 = ''.                     " Defaults to head office.
  adrc-tel_number = ''.                                     "LABK925268
  SELECT SINGLE * FROM t001w WHERE werks = p0001-werks.
  SELECT SINGLE * FROM sadr WHERE adrnr = t001w-adrnr AND natio = ' '.
  IF sy-subrc = 0.                                          "LABK925268
*    IF PREVIEW = 'NO'.                                      "LABK915116
*      PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '81'
*                                            SADR-TELF1.
*    ENDIF.                                                  "LABK915116
  ELSE.                                                     "LABK925268
    SELECT SINGLE * FROM adrc WHERE addrnumber = t001w-adrnr"LABK925268
                                AND date_from LE sy-datum   "LABK925268
                                AND nation      = ' '.      "LABK925268
    IF sy-subrc = 0.                                        "LABK925268
*      IF PREVIEW = 'NO'.                                    "LABK925268
*        PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' "LABK925268
*                                  '81'    ADRC-TEL_NUMBER.  "LABK925268
*      ENDIF.                                                "LABK925268
    ENDIF.                                                  "LABK925268
  ENDIF.                                                    "LABK925268

* write bill to party information to file
  PERFORM write_bill_to_party_info(zvprint1)
                             USING vbdka-vbeln '01' '000001'.
*                             PREVIEW.                       "LABK915116
  MOVE vbpa-kunnr TO bill_to_kunnr.
  IF vbpa-adrnr NE ' '.
    IF NOT sadr IS INITIAL.                                 "LABK925268
      MOVE sadr-name2 TO name2.
      MOVE sadr-stras TO stras.
      MOVE sadr-ort01 TO ort01.
      MOVE sadr-regio TO regio.
      MOVE sadr-pstlz TO pstlz.
    ELSEIF NOT adrc IS INITIAL.                             "LABK925268
      MOVE adrc-name2      TO name2.                        "LABK925268
      MOVE adrc-street     TO stras.                        "LABK925268
      MOVE adrc-city1      TO ort01.                        "LABK925268
      MOVE adrc-region     TO regio.                        "LABK925268
      MOVE adrc-post_code1 TO pstlz.                        "LABK925268
    ENDIF.                                                  "LABK925268
  ELSE.
    MOVE kna1-name2 TO name2.
    MOVE kna1-stras TO stras.
    MOVE kna1-ort01 TO ort01.
    MOVE kna1-regio TO regio.
    MOVE kna1-pstlz TO pstlz.
  ENDIF.

* write ship to party information to file
  PERFORM write_ship_to_party_info(zvprint1)
                             USING vbdka-vbeln '01' '000001'.
*                                   PREVIEW.              "LABK915116

*  write shipping instructions                                       "gs
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0017' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '84' TEXTLINE.
*  ENDIF.                                                 "LABK915116
*  write salesman's comments                                        "gs3
*                                 changed TEXTLINE to TEXT240       "jb2
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0002' text240.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '74' TEXT240.
*  ENDIF.                                                 "LABK915116
* salesperson comments
*  zinvoice01-comment1 = text240(70).
*  zinvoice01-comment2 = text240+70(70).
*  zinvoice01-comment3 = text240+140(70).
*  zinvoice01-comment4 = text240+210(30).
  zinvoice01-inv_commts = text240.
  MOVE vbdka-vbeln TO thead-tdname.                         "LABK916978

*  write AFE no to file
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0003' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '70' TEXTLINE.
*  ENDIF.                                                 "LABK915116
  zinvoice01-afe_num = textline.
*  write sales customer contact
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0001' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '71'
*                                               TEXTLINE.
*  ENDIF.                                                 "LABK915116
*  write field customer contact
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0031' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '72'
*                                               TEXTLINE.
*  ENDIF.                                                 "LABK915116
  zinvoice01-descline1 = textline.
*  write so ticket no to file
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0015' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '73' TEXTLINE.
*  ENDIF.                                                 "LABK915116
  zinvoice01-descline2 = textline.
*  write Base in Charge
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0032' text80.
  SELECT SINGLE * FROM tvstt WHERE spras = sy-langu AND
                                   vstel = text80(4).
  IF sy-subrc = 0.
    text80 = tvstt-vtext.
    zinvoice01-descline3 = text80.
  ENDIF.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '75' TEXT80.
*  ENDIF.                                                 "LABK915116
*  write proposal path name
  PERFORM get_header_text(zvprint1) USING vbdka-vbeln '0005' textline.
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_FILE(ZVPRINT1) USING '01' '000001' '17'
*                                                          TEXTLINE.
*  ENDIF.                                                 "LABK915116
*  write some extra fields to the SAPBack table for T.E
*  IF PREVIEW = 'NO'.                                     "LABK915116
*    PERFORM WRITE_TO_SAPBACK_TABLE USING PROPOSAL.
*  ENDIF.                                                 "LABK915116
ENDFORM.

*---------------------------------------------------------------------*
*       FORM GET_WELL_INFO                                            *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM get_well_info USING well_location rec_id seq_id.
  SELECT SINGLE * FROM vbpa WHERE
           parvw = 'ZB' AND
           posnr = '000000' AND
           vbeln = well_location.

  IF vbpa-adrnr NE ' '.
    CLEAR: sadr, adrc.                                      "LABK925268
* well locatn, name, formation changed in ZB partner, write them to file
    SELECT SINGLE * FROM sadr WHERE
             adrnr = vbpa-adrnr AND
             natio = ' '.

    IF sy-subrc = 0.                                        "LABK925268
      PERFORM replace_hard_corded_texts USING
               sadr-name1   sadr-ort01   sadr-ort02.
      zinvoice01-bp_addr1 = sadr-ort01.
      SPLIT sadr-name1 AT ':' INTO zinvoice01-bp_addr3
                                   zinvoice01-bp_addr2.
    ELSE.                                                   "LABK925268
      SELECT SINGLE * FROM adrc WHERE                       "LABK925268
               addrnumber = vbpa-adrnr AND                  "LABK925268
               date_from LE sy-datum   AND                  "LABK925268
               nation     = ' '.                            "LABK925268
      IF sy-subrc = 0.                                      "LABK925268
        PERFORM replace_hard_corded_texts USING             "LABK925268
                 adrc-name1   adrc-city1   adrc-city2.      "LABK925268
        zinvoice01-bp_addr1 = adrc-city1.                   "LABK925268
        SPLIT adrc-name1 AT ':' INTO zinvoice01-bp_addr3    "LABK925268
                                     zinvoice01-bp_addr2.   "LABK925268
      ENDIF.                                                "LABK925268
    ENDIF.                                                  "LABK925268
  ELSE.
* well locatn, name, formation not changed, write them to file
    SELECT SINGLE * FROM kna1 WHERE
             kunnr = vbpa-kunnr.

    PERFORM replace_hard_corded_texts USING
             kna1-name1   kna1-ort01   kna1-ort02.
    zinvoice01-bp_addr1 = kna1-ort01.
    SPLIT kna1-name1 AT ':' INTO zinvoice01-bp_addr3
                                 zinvoice01-bp_addr2.
  ENDIF.
  IF zinvoice01-bp_addr2 EQ ' '.
    zinvoice01-bp_addr2 = zinvoice01-bp_addr3.
  ELSE.
    CONCATENATE ':' zinvoice01-bp_addr2 INTO zinvoice01-bp_addr2.
  ENDIF.
  CONDENSE zinvoice01-bp_addr2.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM REPLACE_HARD_CORDED_TEXTS                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  LOCATION                                                      *
*  -->  WELLNAME                                                      *
*  -->  FORMATION                                                     *
*---------------------------------------------------------------------*
FORM replace_hard_corded_texts USING location wellname formation.   "gs4
  DATA: templocation(35) TYPE c.
  MOVE location TO templocation.
  IF templocation+0(5) = 'Free:' OR templocation+0(5) = 'FREE:'.
    SHIFT location LEFT BY 5 PLACES.
  ENDIF.

  REPLACE 'Location' WITH '' INTO location.
  REPLACE 'Well Name' WITH '' INTO wellname.
  REPLACE 'Formation' WITH '' INTO formation.
  REPLACE 'LOCATION' WITH '' INTO location.
  REPLACE 'WELL NAME' WITH '' INTO wellname.
  REPLACE 'FORMATION' WITH '' INTO formation.


ENDFORM.

*---------------------------------------------------------------------*
*       FORM WRITE_TO_SAPBACK_TABLE                                   *
*---------------------------------------------------------------------*
*       Look for all delivery notes related to the billing document   *
*
* December 29th, 1995
* gs - for online quotes, test transaction code
*      to determine update vs. create
*    - for tprss quotes, use zpara table to receive action parameters
*---------------------------------------------------------------------*
FORM write_to_sapback_table USING prop.
*  DATA: STR(80).                       " Message for T.E
*  DATA: QUOTE_NUM(10).
*
*  CHECK VBDKA-VBTYP = 'B'.             " Quotation
** write Proposal Number to file
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '27' '000001' '01' PROP.
** write Quotation Number to file
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '27' '000001' '02' VBDKA-VBELN.
** Construct informed message for T.E (sapback)
** A) for on-line, test transaction to determine update/create
*  IF SY-TCODE = 'VA21'.                " create
*    WRITE 'CREATE 0' TO STR.
*  ENDIF.
*  IF SY-TCODE = 'VA22'.                " update
*    WRITE 'UPDATE 0' TO STR.
*  ENDIF.
** B) for trpss update/create (background), we must use different method
**    because it always uses va22
**    use ZPARA to receive update 0 or create 0 action from TPRSS
*  MOVE VBDKA-VBELN TO QUOTE_NUM.
*  SHIFT QUOTE_NUM BY 2 PLACES LEFT.
*  SELECT SINGLE * FROM ZPARA WHERE
*      RECTYPE = 'TPRSS' AND PGMNAME = QUOTE_NUM.
** If we cannot find it, we have to assume that we are online and that
** method A) will prevail
*  IF SY-SUBRC EQ 0.
*    WRITE ZPARA-PARAMETER1 TO STR.
*  ENDIF.
**
*  WRITE 'Quotation' TO STR+9.
*  WRITE VBDKA-VBELN TO STR+19.
*  WRITE '<==>' TO STR+30.
*  WRITE PROP TO STR+35.
*  WRITE SY-DATUM TO STR+50.
*  WRITE SY-UZEIT TO STR+62.
*
*  CONDENSE STR.
** perfrom housekeeping on zpara
*  DELETE FROM ZPARA WHERE
*     RECTYPE = 'TPRSS' AND PGMNAME = QUOTE_NUM.
** write message to file
*  PERFORM WRITE_TO_FILE(ZVPRINT1) USING '27' '000001' '03' STR.
*
** Update SAPBACK table ZTESAPBACK - gh1
*  PERFORM SAPBACK_UPDATE(ZVTEQUO2) USING PROP VBDKA-VBELN STR.

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.

  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.
    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.
    CALL FUNCTION 'STRING_CONCATENATE'
         EXPORTING
              string1 = del_notes_str
              string2 = '@'
         IMPORTING
              string  = del_notes_str.
    CALL FUNCTION 'STRING_CONCATENATE'
         EXPORTING
              string1 = del_notes_str
              string2 = t_string
         IMPORTING
              string  = del_notes_str.
  ENDLOOP.
  CLEAR sy-subrc.
  WHILE sy-subrc = 0.
    REPLACE '@' WITH ' ' INTO del_notes_str.
  ENDWHILE.
ENDFORM.
*
*-----------------------------------------------------------------------
*  BUILD_ITEMID
*    - construct itemid string to show parent type, and parent-child
*      relationship and sequence if applicable (FOB children)
*-----------------------------------------------------------------------
FORM build_itemid
                  USING itemid
                  currentline
                  billing
                  currenthigher
                  fob_parent.
*
  DATA: parentline LIKE vbdpa-uepos,
        ida(6) TYPE c,
        idb(6) TYPE c.
*
  IF currenthigher NE '000000'.
*  we have an FOB child
    MOVE currenthigher TO ida.         "parent line number
    MOVE currentline TO idb.           "current child line number
  ELSE.
*  we must have one of three types of parents
    IF billing EQ ' '.
*     regular parent item with no explosion
      MOVE '000000' TO ida.
      MOVE '000000' TO idb.
    ELSE.
*     we must have one of two types of parents that explodes
*     check all items for a parent equal to the currentline and has rel.
*     billing eq ' '  (FOB Parent)
      LOOP AT tvbap.
        IF tvbap-uepos EQ currentline AND tvbap-fkrel EQ ' '.
          fob_parent = 1.
          EXIT.
        ENDIF.
      ENDLOOP.
      IF fob_parent EQ 1.
*        FOB explosion parent
        MOVE currentline TO ida.
      ELSE.
*        Regular explosion parent
        MOVE '000000' TO ida.
      ENDIF.
      MOVE '000000' TO idb.
    ENDIF.
  ENDIF.
* concatenate id's
  MOVE ida TO itemid.
  WRITE idb TO itemid+6.
ENDFORM.
*