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

# Used with a touch screen to allow showing vituals keyboards (alpha and keypad). True by default
# For now this properties is used with both. Maybe at some point we will need to split them (both in the same screen for instance)
ShowKeyboardInSaveSale=Y
# Used with MSR to allow to force swiping from card when showKeyboardInSaveSale is also true 
# For instance the card number in Client Profile screen. False by default
SwipWithCard=N
# Start and End default Sentinel characters (see http://en.wikipedia.org/wiki/Magnetic_stripe_card)
StartSentinel=; 
EndSentinel=? 
# Reference needed when paying by a credit card with an external payment. True by default.
# Actually the best in such case is to set any payment methods, then NO_PAYMENT is used and works like a charm
PosRefNum=Y
