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

# User Interface properties/defaults of the extented Accounting component.

# what should the default of the payment to invoice processing be?
# paymentProcessing by invoice or paymentprocessing by invoiceitem?
# there is still a box on the menu to change this option by the user.
# value Y: applying payments to the invoice as a whole (invoiceItemSeqNr = null) with the option to apply per invoice item
# value N: applying payments to every invoice item with the option to apply to an invoice as a whole
#value YY: do not show the option box to the user and do only invoice processing
#value NN: do not show the option box to the user and do only invoiceitem processing
invoiceProcessing=YY

# Automatically create a fixed asset when an 'asset usage' type product is created?
accounting.fixedasset.autocreate=Y
