diff --git a/addons/account/account.py b/addons/account/account.py
index 438dff47aae..6958d79b93f 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -2304,8 +2304,13 @@ class account_model(osv.osv):
if not line.partner_id:
raise osv.except_osv(_('Error!'), _("Maturity date of entry line generated by model line '%s' of model '%s' is based on partner payment term!" \
"\nPlease define partner on it!")%(line.name, model.name))
- if line.partner_id.property_payment_term:
+
+ payment_term_id = False
+ if model.journal_id.type in ('purchase', 'purchase_refund') and line.partner_id.property_supplier_payment_term:
+ payment_term_id = line.partner_id.property_supplier_payment_term.id
+ elif line.partner_id.property_payment_term:
payment_term_id = line.partner_id.property_payment_term.id
+ if payment_term_id:
pterm_list = pt_obj.compute(cr, uid, payment_term_id, value=1, date_ref=date_maturity)
if pterm_list:
pterm_list = [l[0] for l in pterm_list]
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index 8d13ec9dc8f..93b7eb34658 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -217,7 +217,7 @@ class account_invoice(osv.osv):
'date_invoice': fields.date('Invoice Date', readonly=True, states={'draft':[('readonly',False)]}, select=True, help="Keep empty to use the current date"),
'date_due': fields.date('Due Date', readonly=True, states={'draft':[('readonly',False)]}, select=True,
help="If you use payment terms, the due date will be computed automatically at the generation "\
- "of accounting entries. If you keep the payment term and the due date empty, it means direct payment. The payment term may compute several due dates, for example 50% now, 50% in one month."),
+ "of accounting entries. The payment term may compute several due dates, for example 50% now and 50% in one month, but if you want to force a due date, make sure that the payment term is not set on the invoice. If you keep the payment term and the due date empty, it means direct payment."),
'partner_id': fields.many2one('res.partner', 'Partner', change_default=True, readonly=True, required=True, states={'draft':[('readonly',False)]}),
'payment_term': fields.many2one('account.payment.term', 'Payment Term',readonly=True, states={'draft':[('readonly',False)]},
help="If you use payment terms, the due date will be computed automatically at the generation "\
@@ -480,10 +480,11 @@ class account_invoice(osv.osv):
if type in ('out_invoice', 'out_refund'):
acc_id = p.property_account_receivable.id
+ partner_payment_term = p.property_payment_term and p.property_payment_term.id or False
else:
acc_id = p.property_account_payable.id
+ partner_payment_term = p.property_supplier_payment_term and p.property_supplier_payment_term.id or False
fiscal_position = p.property_account_position and p.property_account_position.id or False
- partner_payment_term = p.property_payment_term and p.property_payment_term.id or False
if p.bank_ids:
bank_id = p.bank_ids[0].id
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 7cc9768f00e..5976bfd901a 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -671,17 +671,24 @@ class account_move_line(osv.osv):
return {'value':val}
if not date:
date = datetime.now().strftime('%Y-%m-%d')
+ jt = False
+ if journal:
+ jt = journal_obj.browse(cr, uid, journal).type
part = partner_obj.browse(cr, uid, partner_id)
- if part.property_payment_term:
- res = payment_term_obj.compute(cr, uid, part.property_payment_term.id, 100, date)
+ payment_term_id = False
+ if jt and jt in ('purchase', 'purchase_refund') and part.property_supplier_payment_term:
+ payment_term_id = part.property_supplier_payment_term.id
+ elif jt and part.property_payment_term:
+ payment_term_id = part.property_payment_term.id
+ if payment_term_id:
+ res = payment_term_obj.compute(cr, uid, payment_term_id, 100, date)
if res:
val['date_maturity'] = res[0][0]
if not account_id:
id1 = part.property_account_payable.id
id2 = part.property_account_receivable.id
- if journal:
- jt = journal_obj.browse(cr, uid, journal).type
+ if jt:
if jt in ('sale', 'purchase_refund'):
val['account_id'] = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, id2)
elif jt in ('purchase', 'sale_refund'):
diff --git a/addons/account/demo/account_demo.xml b/addons/account/demo/account_demo.xml
index 0dff40ca19f..8b0f026c9f0 100644
--- a/addons/account/demo/account_demo.xml
+++ b/addons/account/demo/account_demo.xml
@@ -131,5 +131,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/account/partner.py b/addons/account/partner.py
index 3355363308b..b5e0a9538ef 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -215,9 +215,16 @@ class res_partner(osv.osv):
'account.payment.term',
type='many2one',
relation='account.payment.term',
- string ='Payment Term',
+ string ='Customer Payment Term',
view_load=True,
- help="This payment term will be used instead of the default one for the current partner"),
+ help="This payment term will be used instead of the default one for sale orders and customer invoices"),
+ 'property_supplier_payment_term': fields.property(
+ 'account.payment.term',
+ type='many2one',
+ relation='account.payment.term',
+ string ='Supplier Payment Term',
+ view_load=True,
+ help="This payment term will be used instead of the default one for purchase orders and supplier invoices"),
'ref_companies': fields.one2many('res.company', 'partner_id',
'Companies that refers to partner'),
'last_reconciliation_date': fields.datetime('Latest Reconciliation Date', help='Date on which the partner accounting entries were fully reconciled last time. It differs from the date of the last reconciliation made for this partner, as here we depict the fact that nothing more was to be reconciled at this date. This can be achieved in 2 ways: either the last debit/credit entry was reconciled, either the user pressed the button "Fully Reconciled" in the manual reconciliation process')
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index d17f8c18eee..8623bd03922 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -89,6 +89,7 @@
+
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index 684707ea258..aaaa9ddc5a5 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -213,6 +213,7 @@ class purchase_order(osv.osv):
'purchase.order.line': (_get_order, None, 10),
}, multi="sums",help="The total amount"),
'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position'),
+ 'payment_term_id': fields.many2one('account.payment.term', 'Payment Term'),
'product_id': fields.related('order_line','product_id', type='many2one', relation='product.product', string='Product'),
'create_uid': fields.many2one('res.users', 'Responsible'),
'company_id': fields.many2one('res.company','Company',required=True,select=1, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}),
@@ -289,12 +290,17 @@ class purchase_order(osv.osv):
def onchange_partner_id(self, cr, uid, ids, partner_id):
partner = self.pool.get('res.partner')
if not partner_id:
- return {'value':{'fiscal_position': False}}
+ return {'value': {
+ 'fiscal_position': False,
+ 'payment_term_id': False,
+ }}
supplier_address = partner.address_get(cr, uid, [partner_id], ['default'])
supplier = partner.browse(cr, uid, partner_id)
- pricelist = supplier.property_product_pricelist_purchase.id
- fiscal_position = supplier.property_account_position and supplier.property_account_position.id or False
- return {'value':{'pricelist_id': pricelist, 'fiscal_position': fiscal_position}}
+ return {'value': {
+ 'pricelist_id': supplier.property_product_pricelist_purchase.id,
+ 'fiscal_position': supplier.property_account_position and supplier.property_account_position.id or False,
+ 'payment_term_id': supplier.property_supplier_payment_term.id or False,
+ }}
def invoice_open(self, cr, uid, ids, context=None):
mod_obj = self.pool.get('ir.model.data')
@@ -528,8 +534,8 @@ class purchase_order(osv.osv):
'journal_id': len(journal_ids) and journal_ids[0] or False,
'invoice_line': [(6, 0, inv_lines)],
'origin': order.name,
- 'fiscal_position': order.fiscal_position.id or order.partner_id.property_account_position.id,
- 'payment_term': order.partner_id.property_payment_term and order.partner_id.property_payment_term.id or False,
+ 'fiscal_position': order.fiscal_position.id or False,
+ 'payment_term': order.payment_term_id.id or False,
'company_id': order.company_id.id,
}
inv_id = inv_obj.create(cr, uid, inv_data, context=context)
@@ -1140,7 +1146,8 @@ class procurement_order(osv.osv):
'pricelist_id': pricelist_id,
'date_order': purchase_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
'company_id': procurement.company_id.id,
- 'fiscal_position': partner.property_account_position and partner.property_account_position.id or False
+ 'fiscal_position': partner.property_account_position and partner.property_account_position.id or False,
+ 'payment_term_id': partner.property_supplier_payment_term.id or False,
}
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index f0be9e56dec..eba27492974 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -278,6 +278,7 @@
+
diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py
index b5b708119cc..671a21ef364 100644
--- a/addons/purchase/stock.py
+++ b/addons/purchase/stock.py
@@ -60,6 +60,13 @@ class stock_picking(osv.osv):
invoice_vals = super(stock_picking, self)._prepare_invoice(cr, uid, picking, partner, inv_type, journal_id, context=context)
if picking.purchase_id:
invoice_vals['fiscal_position'] = picking.purchase_id.fiscal_position.id
+ invoice_vals['payment_term'] = picking.purchase_id.payment_term_id.id
+ # Fill the date_due on the invoice, for usability purposes.
+ # Note that when an invoice with a payment term is validated, the
+ # date_due is always recomputed from the invoice date and the payment
+ # term.
+ if picking.purchase_id.payment_term_id and context.get('date_inv'):
+ invoice_vals['date_due'] = self.pool.get('account.invoice').onchange_payment_term_date_invoice(cr, uid, [], picking.purchase_id.payment_term_id.id, context.get('date_inv'))['value'].get('date_due')
return invoice_vals
def get_currency_id(self, cursor, user, picking):
diff --git a/addons/purchase/wizard/purchase_line_invoice.py b/addons/purchase/wizard/purchase_line_invoice.py
index edce941ab7b..fc2560f7791 100644
--- a/addons/purchase/wizard/purchase_line_invoice.py
+++ b/addons/purchase/wizard/purchase_line_invoice.py
@@ -74,10 +74,6 @@ class purchase_line_invoice(osv.osv_memory):
journal_id = account_jrnl_obj.search(cr, uid, [('type', '=', 'purchase')], context=None)
journal_id = journal_id and journal_id[0] or False
a = partner.property_account_payable.id
- if partner and partner.property_payment_term.id:
- pay_term = partner.property_payment_term.id
- else:
- pay_term = False
inv = {
'name': name,
'origin': name,
@@ -89,7 +85,7 @@ class purchase_line_invoice(osv.osv_memory):
'invoice_line': [(6,0,lines_ids)],
'currency_id' : orders[0].pricelist_id.currency_id.id,
'comment': multiple_order_invoice_notes(orders),
- 'payment_term': pay_term,
+ 'payment_term': orders[0].payment_term_id.id,
'fiscal_position': partner.property_account_position.id
}
inv_id = invoice_obj.create(cr, uid, inv)
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index defe2805c37..53d2e9d327e 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1023,8 +1023,10 @@ class stock_picking(osv.osv):
partner = self.pool.get('res.partner').browse(cr, uid, partner, context=context)
if inv_type in ('out_invoice', 'out_refund'):
account_id = partner.property_account_receivable.id
+ payment_term = partner.property_payment_term.id or False
else:
account_id = partner.property_account_payable.id
+ payment_term = partner.property_supplier_payment_term.id or False
comment = self._get_comment_invoice(cr, uid, picking)
invoice_vals = {
'name': picking.name,
@@ -1033,7 +1035,7 @@ class stock_picking(osv.osv):
'account_id': account_id,
'partner_id': partner.id,
'comment': comment,
- 'payment_term': partner.property_payment_term and partner.property_payment_term.id or False,
+ 'payment_term': payment_term,
'fiscal_position': partner.property_account_position.id,
'date_invoice': context.get('date_inv', False),
'company_id': picking.company_id.id,