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

# create a payment application if a payment is received/sent or invoice is approved (take the oldest not closed one)
accounting.payment.application.autocreate=Y

# create a 'not-paid' payment record if the purchase order is approved
accounting.payment.purchaseorder.autocreate=Y

# create a 'not-paid' payment record if the sales order is completed and no payment exist yet.
accounting.payment.salesorder.autocreate=Y

# create invoice per shipment = Y Invoice per order = N
create.invoice.per.shipment=Y
