#####################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#####################################################################

#description.length=28
#productId.length=27
#quantity.length=6
#price.length=10
#infoString.length=34
#dateFormat=EEE, d MMM yyyy HH:mm:ss z
${CENTER}${DOUBLE_HEIGHT}${BOLD}Company XYZ
${CENTER}${BOLD}7 E. 8th St. #308
${CENTER}${BOLD}New York, NY 10003
${CENTER}${BOLD}212.655.3052

${CENTER}Sale: ${orderId} Tx: ${transactionId} Dr: ${drawerNo} Clerk: ${userId}
${CENTER}${dateStamp}

DESCRIPTION                       PRICE    QTY
==============================================
[BEGIN ITEM LOOP]
${productId} ${isTaxable}${basePrice} ${quantity}
${description}
${itemDiscount} ${adjustments}
${configDescription} ${configBasePrice} ${configQuantity}
[END ITEM LOOP]

                         SALES TAX: ${taxTotal}
                     SALE DISCOUNT: ${saleDiscount}
                             TOTAL: ${grandTotal}

[BEGIN PAY LOOP]
${payInfo}: ${amount}
${nameOnCard}
${authInfoString}
[END PAY LOOP]

                            CHANGE: ${change}


[ORDER BARCODE]

${CENTER}${DOUBLE_HEIGHT}${BOLD}THANK-YOU


