Problem: if we try to validate an invoice with a line with a discount of 100%, this will create an aml with debit=credit=0 and reconciled flag as True. So when trying to cancel invoice, it is not possible because the check tell us that there is an entry which is reconciled and we can't unreconcile that entry, so the check should just ignore line with debit-credit=0. Also add readonly to general_account_id related field on account.analytic.line. This is to prevent a write while creating the account_move_line in the case of an invoice with analytic account.
60 lines
2.9 KiB
Python
60 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from openerp import api, fields, models, _
|
|
|
|
|
|
class AccountAnalyticLine(models.Model):
|
|
_inherit = 'account.analytic.line'
|
|
_description = 'Analytic Line'
|
|
_order = 'date desc'
|
|
|
|
amount = fields.Monetary(currency_field='company_currency_id')
|
|
product_uom_id = fields.Many2one('product.uom', string='Unit of Measure')
|
|
product_id = fields.Many2one('product.product', string='Product')
|
|
general_account_id = fields.Many2one('account.account', string='Financial Account', ondelete='restrict', readonly=True,
|
|
related='move_id.account_id', store=True, domain=[('deprecated', '=', False)])
|
|
move_id = fields.Many2one('account.move.line', string='Move Line', ondelete='cascade', index=True)
|
|
code = fields.Char(size=8)
|
|
ref = fields.Char(string='Ref.')
|
|
company_currency_id = fields.Many2one('res.currency', related='company_id.currency_id', readonly=True,
|
|
help='Utility field to express amount currency')
|
|
currency_id = fields.Many2one('res.currency', related='move_id.currency_id', string='Account Currency', store=True, help="The related account currency if not equal to the company one.", readonly=True)
|
|
amount_currency = fields.Monetary(related='move_id.amount_currency', store=True, help="The amount expressed in the related account currency if not equal to the company one.", readonly=True)
|
|
partner_id = fields.Many2one('res.partner', related='account_id.partner_id', string='Partner', store=True, readonly=True)
|
|
|
|
@api.v8
|
|
@api.onchange('product_id', 'product_uom_id', 'unit_amount', 'currency_id')
|
|
def on_change_unit_amount(self):
|
|
if not self.product_id:
|
|
return {}
|
|
|
|
result = 0.0
|
|
prod_accounts = self.product_id.product_tmpl_id._get_product_accounts()
|
|
unit = self.product_uom_id
|
|
account = prod_accounts['expense']
|
|
if not unit or self.product_id.uom_po_id.category_id.id != unit.category_id.id:
|
|
unit = self.product_id.uom_po_id
|
|
|
|
ctx = dict(self._context or {})
|
|
if unit:
|
|
# price_get() will respect a 'uom' in its context, in order
|
|
# to return a default price for those units
|
|
ctx['uom'] = unit.id
|
|
|
|
# Compute based on pricetype
|
|
amount_unit = self.product_id.with_context(ctx).price_get('standard_price')[self.product_id.id]
|
|
amount = amount_unit * self.unit_amount or 0.0
|
|
result = round(amount, self.currency_id.decimal_places) * -1
|
|
self.amount = result
|
|
self.general_account_id = account
|
|
self.product_uom_id = unit
|
|
|
|
@api.model
|
|
def view_header_get(self, view_id, view_type):
|
|
context = (self._context or {})
|
|
header = False
|
|
if context.get('account_id', False):
|
|
analytic_account = self.env['account.analytic.account'].search([('id', '=', context['account_id'])], limit=1)
|
|
header = _('Entries: ') + (analytic_account.name or '')
|
|
return header
|