I think this gonna be the most hard situation i am facing, in my minisystem it involves a selling of an item where a customers need to make downpayment. So what i did were these:
For a customers to make downpayment i used (Customer Payment, however i did not make any entry on it's Payment Information 'account_move_line'. The next thing i did was validate it, so it created a journal items)
In my crm_lead, i add some field (many2one on account_voucher) that point to the customer payment
I created a class named account_sale_line (many2one to both sale_order and account_invoice)
In account_invoice i modified method _amount_all (because i add some field in account_invoice) this is how i modified it:
def _amount_residual(self, cr, uid, ids, name, args, context=None):
_logger.info("\n\t\t\tI was called, my ids is ... %s"%(str(name)))
result = super(account_invoice,self)._amount_residual(cr, uid, ids, name, args)
#result = {}
for invoice in self.browse(cr, uid, ids, context=context):
result[invoice.id] = 0.0
if invoice.move_id:
for m in invoice.move_id.line_id:
if m.account_id.type in ('receivable','payable'):
result[invoice.id] += m.amount_residual_currency
result[invoice.id] = result[invoice.id] - invoice.so_ai_amount
#prevent the residual amount on the invoice to be less than 0
result[invoice.id] = max(result[invoice.id], 0.0)
return result
def _get_invoice_factor(self, cr, uid, ids, context=None):
result = {}
for line in self.pool.get('sale.order.invoice').browse(cr, uid, ids, context=context):
result[line.order_id.id] = True
return result.keys()
'residual': fields.function(_amount_residual, digits_compute=dp.get_precision('Account'), string='Balance',
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line','move_id','so_ai_lines'], 50),
'account.invoice.tax': (_get_invoice_tax, None, 50),
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 50),
'account.move.line': (_get_invoice_from_line, None, 50),
'account.move.reconcile': (_get_invoice_from_reconcile, None, 50),
'sale.order.invoice': (_get_invoice_from_so_ai, ['amount'], 50),
},
help="Remaining amount due."),
What problem i am facing is when i click the button Convert to Qoutation in class crm_sale, it says:
AttributeError: 'Field move_id not found in browse_record(account.invoice, 102)' . Here is what the log says:
File "/opt/openerp/custom_addons/mini_shop/account_invoice.py", line 74, in _amount_residual
result = super(account_invoice,self)._amount_residual(cr, uid, ids, name, args)
File "/opt/openerp/custom_addons/mini_shop/account_invoice.py", line 126, in _amount_residual
if invoice.move_id:
File "/opt/openerp/server-7/openerp/osv/orm.py", line 504, in __getattr__
raise AttributeError(e)
AttributeError: 'Field move_id not found in browse_record(account.invoice, 102)'
I cannot understand why it point to account_invoice and i don't know why the id being pointed out is 102, if my guess is right this id is the supposed id of sale_order.
Hi, I guess your line has invoice id, other than order id. Try by result[line.invoice_id.id] = True