Table of Contents:



REPORT zfcheque NO STANDARD PAGE HEADING LINE-SIZE 122.
*@----------------------------------------------------------------------
*@ Program id    : ZFCHEQUE
*@ Program Desc  : Cheque printing program for CAN office
*@
*@ Transaction Code - none
*@ Input files   : ID - none
*@ Output files  : ID - none
*@
*@ Tables Updated: Table - none
*@
*@ Author      : Fiona Lau
*@ Date        : 2001/11/15
*@ Requested by:
*@
*@----------------------------------------------------------------------
*@ Algorithm:
*@----------------------------------------------------------------------
**
** Parameters: 1. run_date
**             2. identification
**             3. currency (CAD/USD)
**             4. print without signature - print all cheques without
**                                          signature
**             5. view report option - display report only
**             6. output_file - for new print, save cheque info. to
**             7. input_file - for reprint, retrieve cheque info. from
**             8. reprint option: specify one cheque,
**                                specify cheque range (exclusive)
**                                all cheques
**
** For new print, cheque info. is retrieved form table reguh
** & regup base on input parameters(run_date, identification and
** currency) and is saved to the output_file. Then all cheque info. is
** retrieved again from file and sent to the printer.
** For reprint, cheque info. is retrieved form the input_file and is
** checked against the input paramters(run_date, identification and
** currency). If the file is valid, cheques are sent to the printer
** depends on the reprint option(specify one cheque/specify cheque
** range/all cheques).
**---------------------------------------------------------------------
**
** LABK932282    2002/04/04    FLAU
** Use payee's name & address instead of vendor's name & address
** for pay to.
**---------------------------------------------------------------------
** April 24, 2003 LABK934811  CFieulle
**                Allow to print cheques of pmt method 'S'. (just add)
**---------------------------------------------------------------------

INCLUDE zsmaster.

TABLES: reguh, regup.
TABLES: zfcheque.

* c_limit : limit for auto-signature
CONSTANTS: c_limit LIKE reguh-rwbtr VALUE '25000'.
* c_items : no. of item per page
CONSTANTS: c_items  TYPE p VALUE '80'.


TYPES: BEGIN OF t_reguh,
  laufd  LIKE reguh-laufd,    "run date
  laufi  LIKE reguh-laufi,    "identification
  vblnr  LIKE reguh-vblnr,    "document #
  rwbtr  LIKE reguh-rwbtr,    "amount paid in payment currency
  lifnr  LIKE reguh-lifnr,    "account # of vendor
*LABK932282->
*  name1  LIKE reguh-name1,
*  name2  LIKE reguh-name2,
*  stras  LIKE reguh-stras,    "house # & street
*  ort01  LIKE reguh-ort01,    "city
  znme1  like reguh-znme1,    "payee name1
  znme2  like reguh-znme2,    "payee name2
  zstra  like reguh-zstra,    "payee house # & street
  zort1  like reguh-zort1,    "payee city
*LABK932282<-
  zregi  LIKE reguh-zregi,    "regional code of the payee
  zpstl  LIKE reguh-zpstl,    "postal code of the payee
  zland  LIKE reguh-zland,    "country key
  waers  LIKE reguh-waers,    "currency key
  landx  LIKE t005t-landx,    "country name

  hbkid  LIKE reguh-hbkid,    "house bank key ID
  ubnks  LIKE reguh-ubnks,    "bank country key
  hktid  LIKE reguh-hktid,    "ID for account detial
  bankl  LIKE t012-bankl,     "bank #
  bankn  LIKE t012k-bankn,    "bank account #

  count(6) TYPE n,            "# of items
  pages    TYPE p,            "# of pages printed
END OF t_reguh.

TYPES: BEGIN OF t_regup,
  laufd  LIKE regup-laufd,    "run date
  laufi  LIKE regup-laufi,    "identification
  vblnr  LIKE regup-vblnr,    "doc. # (cheque #)
  lifnr  LIKE regup-lifnr,    "vendor #
  bldat  LIKE regup-bldat,    "document date
  xblnr  LIKE regup-xblnr,    "reference doc. #
  wrbtr  LIKE regup-wrbtr,    "$ in doc currency
  shkzg  LIKE regup-shkzg,    "debit/credit indicator
  bukrs  LIKE regup-bukrs,    "company code
  gjahr  LIKE regup-gjahr,    "fiscal year
  item   LIKE regup-buzei,    "item #
  belnr  LIKE regup-belnr,    "doc. #
END OF t_regup.


TYPES: BEGIN OF t_cheque,
  laufd  LIKE reguh-laufd,    "run date
  laufi  LIKE reguh-laufi,    "identification
  vblnr  LIKE reguh-vblnr,    "document #
  rwbtr  LIKE reguh-rwbtr,    "amount paid in payment currency
  lifnr  LIKE reguh-lifnr,    "account # of vendor
*LABK932282->
*  name1  LIKE reguh-name1,
*  name2  LIKE reguh-name2,
*  stras  LIKE reguh-stras,    "house # & street
*  ort01  LIKE reguh-ort01,    "city
  znme1  like reguh-znme1,    "payee name1
  znme2  like reguh-znme2,    "payee name2
  zstra  like reguh-zstra,    "payee house # & street
  zort1  like reguh-zort1,    "payee city
*LABK932282<-
  zregi  LIKE reguh-zregi,    "regional code of the payee
  zpstl  LIKE reguh-zpstl,    "postal code of the payee
  zland  LIKE reguh-zland,    "country key
  waers  LIKE reguh-waers,    "currency key
  landx  LIKE t005t-landx,    "country name

  bankl  LIKE t012-bankl,     "bank #
  bankn  LIKE t012k-bankn,    "bank account #

  count(6) TYPE n,            "# of items
  pages    TYPE p,            "# of pages printed

  bldat  LIKE regup-bldat,    "document date
  xblnr  LIKE regup-xblnr,    "reference doc. #
  wrbtr  LIKE regup-wrbtr,    "$ in doc currency
  shkzg  LIKE regup-shkzg,    "debit/credit indicator
  bukrs  LIKE regup-bukrs,    "company code
  gjahr  LIKE regup-gjahr,    "fiscal year
  item   LIKE regup-buzei,    "item #
END OF t_cheque.

DATA: i_reguh TYPE t_reguh OCCURS 100 WITH HEADER LINE.
DATA: i_regup TYPE t_regup OCCURS 100 WITH HEADER LINE.

DATA: i_cheque TYPE t_cheque OCCURS 100 WITH HEADER LINE.

DATA: msg(100).
DATA: datafile TYPE mac_t_filename.


DATA: BEGIN OF i_currency_text OCCURS 5,
        waers LIKE tcurt-waers,
        ltext LIKE tcurt-ltext,
      END OF i_currency_text.

DATA: l_linsz LIKE sy-linsz.
DATA: l_waers LIKE reguh-waers.

DATA: l_subrc       LIKE sy-subrc,
      l_rptonly     TYPE c VALUE ' ',
      l_newcheque   TYPE c VALUE 'X',
      l_newprt      TYPE c VALUE ' ',
      l_rundate     LIKE reguh-laufd,
      l_identif     LIKE reguh-laufi,
      l_currency    LIKE reguh-waers,
      l_cheque      LIKE reguh-vblnr,
      l_chequelast  LIKE reguh-vblnr,
      l_reprint     TYPE c,
      l_printed     TYPE p VALUE 0,
      l_items       TYPE p VALUE 0,
      l_totpages    TYPE p VALUE 0,
      l_form(20)    TYPE c,
      l_count       TYPE p VALUE 0,
      l_start       TYPE p VALUE 0,
      l_end         TYPE p VALUE 0,
      l_nosignature TYPE p VALUE 0,
      l_employee    TYPE p VALUE 0,
      l_other       TYPE p VALUE 0,
      l_type        TYPE c,
      l_index       TYPE p,
      l_totnosign      LIKE reguh-rwbtr,
      l_totemployee    LIKE reguh-rwbtr,
      l_totother       LIKE reguh-rwbtr.


RANGES: r_rzawe FOR reguh-rzawe.    "payment method

mac_set_range_row r_rzawe mac_c_append : 'C' ' '.
*{Start insert LABK934811
mac_set_range_row r_rzawe mac_c_append : 'S' ' '.
* End insert LABK934811}

PARAMETERS:  p_laufd LIKE reguh-laufd OBLIGATORY, "DEFAULT '20010614',
             p_laufi LIKE reguh-laufi OBLIGATORY. "DEFAULT 'wca1'.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) text-001.
SELECTION-SCREEN COMMENT 20(14) text-002 FOR FIELD p_cad.
PARAMETERS p_cad RADIOBUTTON GROUP opt1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 20(14) text-003 FOR FIELD p_usd.
PARAMETERS p_usd RADIOBUTTON GROUP opt1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 1.

PARAMETERS p_nosign AS CHECKBOX.    "no signature
PARAMETERS p_report AS CHECKBOX.    "report only

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-004.
PARAMETERS p_ofile TYPE mac_t_filename DEFAULT 'c:\temp\zcheque.txt'.
SELECTION-SCREEN END OF BLOCK 1.

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-005.

PARAMETERS p_ifile TYPE mac_t_filename.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS p_one RADIOBUTTON GROUP opt3 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 2(26) text-006 FOR FIELD p_one.
SELECTION-SCREEN POSITION 33.
PARAMETERS p_cheq1 LIKE reguh-vblnr.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS p_range RADIOBUTTON GROUP opt3.
SELECTION-SCREEN COMMENT 2(26) text-009 FOR FIELD p_range.
SELECTION-SCREEN COMMENT 28(5) text-010.
SELECTION-SCREEN POSITION 33.
PARAMETERS p_cheq3 LIKE reguh-vblnr.
SELECTION-SCREEN COMMENT 62(6) text-011.
SELECTION-SCREEN POSITION 68.
PARAMETERS p_cheq4 LIKE reguh-vblnr.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS p_all RADIOBUTTON GROUP opt3.
SELECTION-SCREEN COMMENT 3(26) text-008 FOR FIELD p_all.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK 2.

DEFINE lmac_check_file_access.
* check if file is accessible
  open dataset &1 for &2 in &3 mode message msg.
  &4 = sy-subrc.
  if sy-subrc <> 0.
    message s001(zz) with msg.
  endif.
  close dataset &1.
END-OF-DEFINITION.

DEFINE lmac_write_report_header.
  skip.
  uline.
  format color col_group intensified off.
  write: at /1(l_linsz) &1.
  format color col_heading  intensified off.
  write:  /1(10) &2,
          13(10) &3,
          25(10) &4,
          37(30) &5,
          69(15) &6 right-justified,
          86(30) &7,
          118(5) &8.
  format reset.
  uline.
END-OF-DEFINITION.

DEFINE lmac_write_report_items.
  write:  /1(10) &1,
          13(10) &2,
          25(10) &3,
          37(30) &4,
          69(15) &5,
          86(30) &6,
          118(5) &7.
END-OF-DEFINITION.

DEFINE lmac_write_report_subtotal.
  concatenate &1 &2 into l_txt.
  format color col_total intensified off.
  uline.
  write: at /1(l_linsz) l_txt.
  format reset.
END-OF-DEFINITION.


INITIALIZATION.
* Authority check
  AUTHORITY-CHECK OBJECT 'Z:CHEQUE'
           ID 'ACTVT' FIELD '35'.  "output
  IF sy-subrc NE 0.
* no authorization for printing cheques
    l_rptonly = 'X'.
    AUTHORITY-CHECK OBJECT 'Z:CHEQUE'
             ID 'ACTVT' FIELD '03'.  "display
    IF sy-subrc NE 0.
      MESSAGE s001(zz) WITH
      'You are not authorised to run program ZFCHEQUE.'.
      LEAVE PROGRAM.
    ENDIF.
  ENDIF.
* End Authority check


START-OF-SELECTION.

  IF p_ofile IS INITIAL AND p_ifile IS INITIAL.
    MESSAGE s001(zz) WITH 'Must have input file or output file.'.
    EXIT.
  ELSEIF NOT p_ofile IS INITIAL AND NOT p_ifile IS INITIAL.
   MESSAGE s001(zz) WITH 'Cannot have both input file and output file.'.
    EXIT.
  ENDIF.

  IF NOT p_ofile IS INITIAL.
* check if datafile is accessible
    lmac_check_file_access p_ofile output text l_subrc.
    IF l_subrc <> 0.
      STOP.
    ENDIF.

    datafile = p_ofile.

    l_newprt = 'X'.

  ELSE.
    IF p_one = 'X'.
      IF p_cheq1 IS INITIAL.
        MESSAGE s001(zz) WITH 'Please specify cheque no. to print'.
        EXIT.
      ENDIF.
      l_cheque = p_cheq1.
    ELSEIF p_range = 'X'.
      IF p_cheq3 IS INITIAL.
        MESSAGE s001(zz) WITH 'Please specify cheque no. range'.
        EXIT.
      ENDIF.
      l_cheque = p_cheq3.
      l_chequelast = p_cheq4.
    ENDIF.

* check if datafile is accessible
    lmac_check_file_access p_ifile input text l_subrc.
    IF l_subrc <> 0.
      STOP.
    ENDIF.

    datafile = p_ifile.
  ENDIF.


* no authorization for printing cheques
* set to view report only
  IF l_rptonly = 'X'.
    p_report = 'X'.
  ENDIF.


  IF p_cad = 'X'.
    l_waers = 'CAD'.
  ELSE.
    l_waers = 'USD'.
  ENDIF.

  l_linsz = sy-linsz.


* if this is new print, select cheques form database.
  IF l_newprt = 'X'.
    PERFORM select_cheques TABLES i_reguh i_regup
                           USING p_laufd p_laufi l_waers
                           CHANGING l_subrc.
    IF l_subrc <> 0.
      CASE l_subrc.
        WHEN '-1'.
          MESSAGE s001(zz) WITH 'Found no cheque.'.
        WHEN '-2'.
          MESSAGE s001(zz) WITH 'Error finding cheque item.'.
        WHEN '-3'.
          MESSAGE s001(zz) WITH 'Error finding country name.'.
        WHEN '-4'.
          MESSAGE s001(zz) WITH 'Error finding bank number.'.
        WHEN '-5'.
          MESSAGE s001(zz) WITH 'Error finding bank account number.'.
      ENDCASE.
      EXIT.
    ENDIF.


    PERFORM sort_cheques
            TABLES i_reguh i_regup i_cheque.

    mac_ws_download_raw_itab datafile i_cheque.
  ENDIF.
  REFRESH i_cheque.
  mac_ws_upload_tabbed_itab datafile i_cheque.
  l_rundate = i_cheque-laufd.
  l_identif = i_cheque-laufi.
  l_currency = i_cheque-waers.
  IF l_rundate <> p_laufd
     OR l_identif <> p_laufi
     OR l_currency <> l_waers.
    MESSAGE s001(zz) WITH
        'Input parameters does not match parameters in input file.'.
    EXIT.
  ENDIF.


  IF l_currency = 'USD'.
    l_form = 'ZFCHEQUE_US'.
  ELSEIF l_currency = 'CAD'.
    l_form = 'ZFCHEQUE_CA'.
  ENDIF.

* Get the text for the currency
  SELECT DISTINCT waers ltext INTO TABLE i_currency_text
    FROM tcurt
    WHERE spras = sy-langu
      AND waers = l_currency.
  READ TABLE i_currency_text WITH KEY waers = l_currency
       BINARY SEARCH.


  IF l_newprt = 'X' OR p_all = 'X'.
    l_start = 1.
    DESCRIBE TABLE i_cheque LINES l_end.
  ELSE.
    CLEAR l_start.
    CLEAR l_end.
    CLEAR l_count.
    LOOP AT i_cheque.

      l_count = l_count + 1.
      CHECK i_cheque-vblnr = l_cheque.

      IF l_start IS INITIAL.
        IF p_one = 'X'.
          l_start = l_count.
          l_end = l_count + i_cheque-count - 1.
        ELSEIF p_range = 'X'.
          l_start = l_count + i_cheque-count.
          IF l_chequelast IS INITIAL.    "print to the end
            DESCRIBE TABLE i_cheque LINES l_end.
          ELSE.
            l_cheque = l_chequelast.     "find last cheque to print
          ENDIF.
        ENDIF.
      ELSE.
        l_end = l_count - 1.
      ENDIF.
      IF NOT l_end IS INITIAL.
        EXIT.
      ENDIF.

    ENDLOOP.

    IF l_start IS INITIAL OR l_end IS INITIAL.
      MESSAGE s001(zz) WITH
          'Incorrect cheque no specified.'.
      EXIT.
    ENDIF.

  ENDIF.

*LABK931378->
  IF p_report <> 'X'.
    PERFORM open_form_cheque USING l_form.
  ENDIF.
*LABK931378<-

  l_newcheque = 'X'.
  LOOP AT i_cheque FROM l_start TO l_end.

    IF l_newcheque = 'X'.

      CLEAR zfcheque.
      MOVE-CORRESPONDING i_cheque TO zfcheque.
*    zfcheque-rwbtr = - zfcheque-rwbtr.
      WRITE zfcheque-rwbtr TO zfcheque-total_amount
            CURRENCY zfcheque-waers.
      CONDENSE zfcheque-total_amount NO-GAPS.
      CONCATENATE '$' zfcheque-total_amount '**'
                  INTO zfcheque-total_amount.

* Get the currency text
      PERFORM convert_amount_to_string
              USING zfcheque-rwbtr zfcheque-waers
              CHANGING zfcheque-line1 zfcheque-line2 zfcheque-line3.

* not report only
      IF p_report <> 'X'.

*LABK931378->
*        PERFORM open_form_cheque USING l_form.
        PERFORM start_form_cheque USING l_form.
*LABK931378<-

* signature for amount under $25,000 only
        IF zfcheque-rwbtr < c_limit AND p_nosign <>'X'.
          CALL FUNCTION 'WRITE_FORM'
               EXPORTING
                    element                  = 'SIGNATURE'
                    window                   = 'SIGN'
               EXCEPTIONS
                    element                  = 1
                    function                 = 2
                    type                     = 3
                    unopened                 = 4
                    unstarted                = 5
                    window                   = 6
                    bad_pageformat_for_print = 7
                    OTHERS                   = 8.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
        ENDIF.
      ENDIF.    "end p_report<>'X'

      l_newcheque = ' '.
      l_items = 0.
    ENDIF.      "l_newcheque='X'

* write cheque item
    zfcheque-bldat = i_cheque-bldat.
    zfcheque-xblnr = i_cheque-xblnr.
    zfcheque-wrbtr = i_cheque-wrbtr.
    WRITE zfcheque-wrbtr TO zfcheque-item_amount
          CURRENCY zfcheque-waers.
    IF i_cheque-shkzg = 'S'.
      zfcheque-item_amount+1(1) = '-'.
    ENDIF.
    CONDENSE zfcheque-item_amount NO-GAPS.
    WRITE zfcheque-item_amount TO
          zfcheque-item_amount RIGHT-JUSTIFIED.

    IF p_report <> 'X'.
      mac_write_form 'ITEMS' 'MAIN'.
    ENDIF.   "if p_report <> 'X'
    l_items = l_items + 1.

* last cheque item
    IF i_cheque-count = l_items.
*LABK931378->
      IF p_report <> 'X'.
*        PERFORM close_form.
        PERFORM end_form.
      ENDIF.
*LABK931378<-
      l_newcheque = 'X'.

      COMPUTE  i_cheque-pages = ceil( l_items / c_items ).
      l_totpages = l_totpages + i_cheque-pages.

      PERFORM write_report USING i_cheque
                          CHANGING l_nosignature l_employee l_other.
      l_printed = l_printed + 1.

    ENDIF.

  ENDLOOP.

*LABK931378->
  IF p_report <> 'X'.
    PERFORM close_form.
  ENDIF.
*LABK931378<-

  PERFORM write_report_subtotal USING 'Subtotal for all the rest:'
                                       l_totother l_waers.
  PERFORM write_summary
          USING l_totnosign l_totemployee l_totother
                l_nosignature l_employee l_other l_printed.

TOP-OF-PAGE.
  mac_default_report_header mac_c_null.
  PERFORM wirte_parameters
          USING l_rundate l_identif l_currency.

*---------------------------------------------------------------------*
*       FORM open_form_cheque                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM open_form_cheque USING p_form.

  DATA: options LIKE itcpo.

  CLEAR options.
*  options-tdpreview = 'X'.    "fff
  options-tdimmed = 'X'.
  options-tddest = 'ZCHQ'.
  options-tdcopies = '1'.
  options-tddelete = ' '.

  CALL FUNCTION 'OPEN_FORM'
       EXPORTING
            device  = 'PRINTER'
            dialog  = ' '
            form    = p_form
            options = options.

ENDFORM.                               "OPEN_FORM_CHEQUE


*---------------------------------------------------------------------*
*       FORM CLOSE_FORM                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM close_form.

  CALL FUNCTION 'CLOSE_FORM'.

ENDFORM.                               " CLOSE_FORM


*---------------------------------------------------------------------*
*       FORM start_form_cheque                                        *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  p_form                                                        *
*---------------------------------------------------------------------*
FORM start_form_cheque USING p_form.
  CALL FUNCTION 'START_FORM'
       EXPORTING
            form      = p_form
            language  = sy-langu
            startpage = 'FIRST'.

ENDFORM.                               "START_FORM_CHEQUE


*---------------------------------------------------------------------*
*       FORM end_form                                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM end_form.

  CALL FUNCTION 'END_FORM'.

ENDFORM.                               " END_FORM

*&---------------------------------------------------------------------*
*&      Form  CONVERT_AMOUNT_TO_STRING
*&---------------------------------------------------------------------*
FORM convert_amount_to_string USING p_total p_waers
                              CHANGING p_line1 p_line2 p_line3.

  DATA: lw_words LIKE spell.

  DATA: li_currency(20) TYPE c OCCURS 5 WITH HEADER LINE,
        li_words(20) TYPE c OCCURS 50 WITH HEADER LINE.

  DATA: l_len   TYPE i,
        l_count TYPE i,
        l_line  TYPE i VALUE 1,
        l_fraction(8) TYPE c VALUE 'DDD/FFFF',
        l_factor      TYPE i.


  DEFINE lmac_print_line.
    if not &1 is initial.
      concatenate &1 li_words into &1 separated by space.
    else.
      &1 = li_words.
    endif.
  END-OF-DEFINITION.

  CLEAR: p_line1, p_line2, p_line3.

  CALL FUNCTION 'SPELL_AMOUNT'
       EXPORTING
            amount    = p_total
            currency  = p_waers
            filler    = ' '
            language  = sy-langu
       IMPORTING
            in_words  = lw_words
       EXCEPTIONS
            not_found = 1
            too_large = 2
            OTHERS    = 3.
  IF sy-subrc = 0.

* Figure out the decimal to fraction
    l_factor = 10 ** lw_words-currdec.
    l_count = 3 MOD lw_words-currdec.
    DO l_count TIMES.
      SHIFT lw_words-decimal(3) RIGHT.
      lw_words-decimal(1) = 0.
    ENDDO.

    WRITE: lw_words-decimal TO l_fraction(3) NO-ZERO RIGHT-JUSTIFIED,
           l_factor TO l_fraction+4(4) NO-ZERO LEFT-JUSTIFIED.

    SHIFT l_fraction LEFT DELETING LEADING space.

    SPLIT i_currency_text AT space INTO TABLE li_currency.
    LOOP AT li_currency. ENDLOOP.
    CONCATENATE li_currency 's' INTO li_currency.

    IF NOT lw_words-decimal IS INITIAL.
      CONCATENATE lw_words-word li_currency 'AND'
                  lw_words-decword 'CENTS ONLY'
             INTO lw_words-word SEPARATED BY space.
    ELSE.
      CONCATENATE lw_words-word li_currency 'ONLY'
             INTO lw_words-word SEPARATED BY space.

    ENDIF.

    TRANSLATE lw_words-word TO UPPER CASE.

    SPLIT lw_words-word AT space INTO TABLE li_words.

    CLEAR l_count.

    LOOP AT li_words.
      l_len = strlen( li_words ).

      ADD l_len TO l_count.

      IF l_count > 45.   " line size of ZFCHQ-VALUE
        l_count = l_len.
        ADD 1 TO l_line.
      ENDIF.

      CASE l_line.

        WHEN 1.
          lmac_print_line p_line1.
        WHEN 2.
          lmac_print_line p_line2.
        WHEN 3.
          lmac_print_line p_line3.
      ENDCASE.

      ADD 1 TO l_count.  " space between words

    ENDLOOP.

  ENDIF.


ENDFORM.                    " CONVERT_AMOUNT_TO_STRING

*&---------------------------------------------------------------------*
*&      Form  WIRTE_PARAMETERS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM wirte_parameters USING    p_rundate
                            p_identif
                            p_currency.

  WRITE:/ 'Rundate:              ', p_rundate.
  WRITE:/ 'Identification:       ', p_identif.
  WRITE:/ 'Currency:             ', p_currency.
  ULINE.
ENDFORM.                    " WIRTE_PARAMETERS

*&---------------------------------------------------------------------*
*&      Form  SELECT_CHEQUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM select_cheques TABLES  p_reguh STRUCTURE i_reguh
                            p_regup STRUCTURE i_regup
                    USING    p_laufd
                             p_laufi
                             p_waers
                    CHANGING p_subrc.

  DATA: l_count TYPE p,
        l_index TYPE p.
  DATA: tp_regup TYPE t_regup OCCURS 100 WITH HEADER LINE.


  SELECT laufd laufi vblnr rwbtr lifnr name1 name2
         stras ort01
         znme1  znme2  zstra zort1   "LABK932282
         zregi zpstl zland waers
         hbkid ubnks hktid
         FROM reguh INTO CORRESPONDING FIELDS OF TABLE p_reguh
         WHERE laufd = p_laufd
         AND  laufi = p_laufi
         AND  waers = p_waers
         AND  rzawe IN r_rzawe
         AND  xvorl NE 'X'           " production data
         AND  rwbtr NE '0'
         ORDER BY lifnr  vblnr.
  IF sy-subrc <> 0.
    p_subrc = -1.
    EXIT.
  ENDIF.


  LOOP AT p_reguh.
    SELECT laufd
           laufi
           vblnr
           lifnr
           bldat
           xblnr
           wrbtr
           shkzg
           bukrs
           gjahr
           belnr
           FROM regup
           INTO CORRESPONDING FIELDS OF TABLE tp_regup
           WHERE laufd = p_reguh-laufd
           AND lifnr = p_reguh-lifnr
           AND vblnr = p_reguh-vblnr.
    IF sy-subrc <> 0.
      p_subrc = -2.
      EXIT.
    ENDIF.

    LOOP AT tp_regup.

* put bseg-zuonr as invoice no. for empolyee
      IF tp_regup-lifnr(1) = 'E'.
        SELECT SINGLE zuonr FROM bseg INTO tp_regup-xblnr
               WHERE belnr = tp_regup-belnr
               AND   bukrs = tp_regup-bukrs.
      ENDIF.

      APPEND tp_regup TO p_regup.
    ENDLOOP.
  ENDLOOP.


* count items for each cheque
  SORT p_reguh BY vblnr.
  SORT p_regup BY vblnr.
  l_index = 1.
  LOOP AT p_reguh.
    l_count = 0.
    LOOP AT p_regup FROM l_index.
      IF i_regup-vblnr = p_reguh-vblnr.
        l_count = l_count + 1.
        l_index = l_index + 1.
      ELSE.
        EXIT.
      ENDIF.
    ENDLOOP.
    p_reguh-count = l_count.

* get country name from country code
    SELECT SINGLE landx
           FROM t005t INTO p_reguh-landx
           WHERE land1 = p_reguh-zland
           AND spras = sy-langu.
    IF sy-subrc <> 0.
      p_subrc = -3.
      EXIT.
    ENDIF.


    TRANSLATE p_reguh-landx TO UPPER CASE.

* get bank #
    SELECT SINGLE bankl
           FROM t012 INTO p_reguh-bankl
           WHERE hbkid = p_reguh-hbkid
           AND banks = p_reguh-ubnks.
    IF sy-subrc <> 0.
      p_subrc = -4.
      EXIT.
    ENDIF.


* get bank account #
    SELECT SINGLE bankn
           FROM t012k INTO p_reguh-bankn
           WHERE hbkid = p_reguh-hbkid
           AND hktid = p_reguh-hktid.
    IF sy-subrc <> 0.
      p_subrc = -5.
      EXIT.
    ENDIF.


    MODIFY p_reguh.

  ENDLOOP.

  p_subrc = 0.

ENDFORM.                    " SELECT_CHEQUES

*&---------------------------------------------------------------------*
*&      Form  WRITE_SUMMARY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_summary USING    p_totnosign p_totemployee p_totother
                            p_nosignature
                            p_employee
                            p_other
                            p_printed.

  DATA: l_grandtotal LIKE reguh-rwbtr.

  l_grandtotal  =  p_totnosign + p_totemployee + p_totother.

  PERFORM write_report_subtotal USING 'Grand total for all cheques: '
                                       l_grandtotal l_waers.

  SKIP.
  ULINE.
  FORMAT COLOR COL_GROUP INTENSIFIED OFF.
  WRITE: AT /(l_linsz) 'Summary'.
  FORMAT RESET.
  ULINE.
  WRITE: / 'Total cheques issued for amount >= $25,000: ',
           l_nosignature.
  WRITE: / 'Total cheques issued for employee:          ',
           l_employee.
  WRITE: / 'Total cheques issued for the rest:          ',
           l_other.
  ULINE.
  WRITE: / 'Total cheques issued:                       ',
           l_printed.
  WRITE: / 'Total cheque paper used:                    ',
           l_totpages.

* no authorization to print cheques.
  IF l_rptonly = 'X'.
    SKIP.
    FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
    WRITE: / 'You are not authorised to print cheques.'.
    FORMAT RESET.
  ENDIF.

ENDFORM.                    " WRITE_SUMMARY


*&---------------------------------------------------------------------*
*&      Form  SORT_CHEQUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sort_cheques TABLES   p_reguh STRUCTURE i_reguh
                           p_regup STRUCTURE i_regup
                           p_cheque STRUCTURE i_cheque.


  DATA: wa_cheque LIKE LINE OF i_cheque.

  DATA:   wa_reguh  TYPE t_reguh,
          it_nosign LIKE STANDARD TABLE OF wa_reguh,
          it_employee LIKE STANDARD TABLE OF wa_reguh,
          it_other LIKE STANDARD TABLE OF wa_reguh.

  DATA: l_count TYPE p.

* separate the cheques into 3 groups:
* reguh_nosignature : amount >= 25000
* reguh_employee : for employees
* reguh_other : other vernders.
  LOOP AT p_reguh INTO wa_reguh.
    wa_reguh-rwbtr = - wa_reguh-rwbtr.
    IF wa_reguh-rwbtr >= c_limit.
      APPEND wa_reguh TO it_nosign.
    ELSEIF wa_reguh-lifnr(1) = 'E'.
      APPEND wa_reguh TO it_employee.
    ELSE.
      APPEND wa_reguh TO it_other.
    ENDIF.
  ENDLOOP.

  SORT it_nosign BY rwbtr.
*LABK932282  SORT it_employee BY name2 name1 vblnr.
  SORT it_employee BY znme2 znme1 vblnr.
  SORT it_other BY lifnr vblnr.

  REFRESH p_reguh.
  REFRESH p_cheque.

  LOOP AT it_nosign INTO wa_reguh.
    MOVE-CORRESPONDING wa_reguh TO wa_cheque.
    PERFORM match_cheque_items TABLES p_cheque p_regup
    USING wa_cheque.
  ENDLOOP.

  LOOP AT it_employee INTO wa_reguh.
    MOVE-CORRESPONDING wa_reguh TO wa_cheque.
    PERFORM match_cheque_items TABLES p_cheque p_regup
                                  USING wa_cheque.
  ENDLOOP.

  LOOP AT it_other INTO wa_reguh.
    MOVE-CORRESPONDING wa_reguh TO wa_cheque.
    PERFORM match_cheque_items  TABLES p_cheque p_regup
                              USING wa_cheque.
  ENDLOOP.

ENDFORM.                    " SORT_CHEQUES

*&---------------------------------------------------------------------*
*&      Form  MATCH_CHEQUE_ITEMS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM match_cheque_items TABLES   p_cheque STRUCTURE i_cheque
                                 p_regup STRUCTURE i_regup
                        USING    p_wa_cheque STRUCTURE i_cheque.

  DATA: l_count TYPE p.
  DATA: tmp_regup TYPE t_regup OCCURS 100 WITH HEADER LINE.

  REFRESH tmp_regup.
  l_count = 0.
  LOOP AT p_regup.
    IF p_regup-vblnr = p_wa_cheque-vblnr
       AND p_regup-laufd = p_wa_cheque-laufd
       AND p_regup-laufi = p_wa_cheque-laufi
       AND p_regup-lifnr = p_wa_cheque-lifnr.

      tmp_regup = p_regup.
      l_count = l_count + 1.
      tmp_regup-item = l_count.
      APPEND tmp_regup.
    ENDIF.
  ENDLOOP.

  p_wa_cheque-count = l_count.

  SORT tmp_regup BY vblnr bldat xblnr wrbtr.

  LOOP AT tmp_regup.
    MOVE-CORRESPONDING tmp_regup TO p_wa_cheque.
    APPEND p_wa_cheque TO p_cheque.
  ENDLOOP.

ENDFORM.                    " MATCH_CHEQUE_ITEMS

*&---------------------------------------------------------------------*
*&      Form  WRITE_REPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_report USING    p_cheque STRUCTURE i_cheque
                CHANGING l_nosignature l_employee l_other.

*count # of cheque printed for each category
*and write report
  IF p_cheque-rwbtr >= c_limit.
    IF l_nosignature = 0.
      lmac_write_report_header 'Cheques for amount >= $25,000:'
                                'Cheque No.' 'Date' 'Vender No.'
                                'Vender Name' 'Amount' ' ' 'Pages'.
    ENDIF.
    lmac_write_report_items p_cheque-vblnr p_cheque-laufd
                            p_cheque-lifnr p_cheque-znme1
*LABK932282                 p_cheque-name1
                            p_cheque-rwbtr ' ' p_cheque-pages.
    l_nosignature = l_nosignature + 1.
    l_totnosign = l_totnosign + p_cheque-rwbtr.
  ELSEIF p_cheque-lifnr(1) = 'E'.
    IF l_employee = 0.
      PERFORM write_report_subtotal
              USING 'Subtotal for amount >= $25,000:'
                    l_totnosign l_waers.
      lmac_write_report_header 'Cheques for employees:'
                               'Cheque No.' 'Date' 'Vender No.'
                               'Vender Name' 'Amount' 'Base' 'Pages'.
    ENDIF.
    lmac_write_report_items p_cheque-vblnr p_cheque-laufd
                            p_cheque-lifnr p_cheque-znme1
*LABK932282                 p_cheque-name1
                            p_cheque-rwbtr p_cheque-znme2
*LABK932282                 p_cheque-name2
                            p_cheque-pages.
    l_employee = l_employee + 1.
    l_totemployee = l_totemployee + p_cheque-rwbtr.
  ELSE.
    IF l_other = 0.
      IF l_employee = 0.
        PERFORM write_report_subtotal
                USING 'Subtotal for amount >= $25,000:'
                                   l_totnosign l_waers.
      ELSE.
        PERFORM write_report_subtotal
                USING 'Subtotal for employees:'
                                   l_totemployee l_waers.
      ENDIF.

      lmac_write_report_header 'Cheques for all the rest:'
                               'Cheque No.' 'Date' 'Vender No.'
                               'Vender Name' 'Amount' ' ' 'Pages'.
    ENDIF.
    lmac_write_report_items p_cheque-vblnr p_cheque-laufd
                        p_cheque-lifnr p_cheque-znme1
*LABK932282             p_cheque-name1
                        p_cheque-rwbtr ' '
                        p_cheque-pages.
    l_other = l_other + 1.
    l_totother = l_totother + p_cheque-rwbtr.
  ENDIF.

ENDFORM.                    " WRITE_REPORT

*&---------------------------------------------------------------------*
*&      Form  WRITE_REPORT_SUBTOTAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_report_subtotal USING    p_title
                                    p_total
                                    p_waers.
  DATA:   l_txt(100)    TYPE c.
  DATA:   l_total(15)  TYPE c.

  WRITE p_total TO l_total CURRENCY p_waers.
  CONCATENATE p_title l_total INTO l_txt.
  FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
  ULINE.
  WRITE: /1 p_title,
          69(15) l_total,
          118(5) ' '.
  FORMAT RESET.

ENDFORM.                    " WRITE_REPORT_SUBTOTAL