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

#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}Term: ${terminalId} Dr: ${drawerNo} Clerk: ${userId}
${CENTER}${dateStamp}

${CENTER}${DOUBLE_HEIGHT}${BOLD}BALANCE REPORT

${cashTitle} ${cashTotal}
${spacer} ${cashEnd}
${+/-} ${cashDiff}

${checkTitle} ${checkTotal}
${spacer} ${checkEnd}
${+/-} ${checkDiff}

${creditCardTitle} ${ccTotal}
${spacer} ${ccEnd}
${+/-} ${ccDiff}

${giftCardTitle} ${gcTotal}
${spacer} ${gcEnd}
${+/-} ${gcDiff}

${otherTitle} ${otherTotal}
${spacer} ${otherEnd}
${+/-} ${otherDiff}

${grossSalesTitle} ${grossTotal}
${spacer} ${grossEnd}
${+/-} ${grossDiff}

