[IMP] Improve modularity and migrate account_move_line

This commit is contained in:
Adrien Peiffer
2014-09-04 01:55:59 +02:00
parent 2bfa8bc1cf
commit 1dca591477

View File

@@ -18,56 +18,19 @@
# #
############################################################################## ##############################################################################
from openerp.osv import fields, orm, osv from openerp import models, api
from openerp.tools.translate import _ from openerp.tools.translate import _
class AccountJournal(orm.Model): class AccountMoveLine(models.Model):
_inherit = 'account.journal'
_columns = {
'allow_date_fy': fields.boolean('Check Date in Fiscal Year',
help='If set to True then do not '
'accept the entry if '
'the entry date is not into '
'the fiscal year dates'),
}
_defaults = {
'allow_date_fy': True,
}
class AccountMove(orm.Model):
_inherit = "account.move"
def _check_fiscal_year(self, cr, uid, ids):
for move in self.browse(cr, uid, ids):
if move.journal_id.allow_date_fy:
date_start = move.period_id.fiscalyear_id.date_start
date_stop = move.period_id.fiscalyear_id.date_stop
if not date_start <= move.date <= date_stop:
return False
return True
_constraints = [
(_check_fiscal_year,
'You cannot create entries with date not in the '
'fiscal year of the chosen period',
['line_id']),
]
class AccountMoveLine(orm.Model):
_inherit = 'account.move.line' _inherit = 'account.move.line'
@api.multi
def _authorized_reconcile(self, vals): def _authorized_reconcile(self, vals):
""" Check if only reconcile_id and/or reconcile_partial_id are altered. """ Check if only reconcile_id and/or reconcile_partial_id are altered.
We cannot change other vals, but we should be able to write or unlink We cannot change other vals, but we should be able to write or unlink
those field. those field (e.g. when you want to manually unreconcile an entry
e.g. when you want to manually unreconcile an entry generated by an invoice).
generated by an invoice
""" """
if not vals: if not vals:
return False return False
@@ -75,88 +38,84 @@ class AccountMoveLine(orm.Model):
write_keys = set(vals) write_keys = set(vals)
return rec_keys.issuperset(write_keys) return rec_keys.issuperset(write_keys)
def _check_invoice_related_move(self, cr, uid, ids, vals=None, @api.multi
context=None): def _check_invoice_related_move(self, vals=None):
for line in self.browse(cr, uid, ids, context=context): for line in self:
if line.invoice: if line.invoice:
if self._authorized_reconcile(vals): if self._authorized_reconcile(vals):
return True return True
err_msg = (_('Invoice name (id): %s (%s)') % err_msg = (_('Invoice name (id): %s (%s)') %
(line.invoice.name, line.invoice.id)) (line.invoice.name, line.invoice.id))
raise osv.except_osv( raise models.except_orm(
_('Error'), _('Error'),
_('You cannot do this on an entry generated ' _('You cannot do this on an entry generated by an invoice.'
'by an invoice. You must change the related ' 'You must '
'invoice directly.\n%s.') % err_msg 'change the related invoice directly.\n%s.') % err_msg)
)
return True return True
def _check_statement_related_move(self, cr, uid, ids, vals=None, @api.multi
context=None): def _check_statement_related_move(self, vals=None):
for line in self.browse(cr, uid, ids, context=context): for line in self:
if line.statement_id: if line.statement_id:
if self._authorized_reconcile(vals): if self._authorized_reconcile(vals):
return True return True
err_msg = (_('Bank statement name (id): %s (%s)') % err_msg = (_('Bank statement name (id): %s (%s)') %
(line.statement_id.name, line.statement_id.id)) (line.statement_id.name, line.statement_id.id))
raise osv.except_osv( raise models.except_orm(
_('Error'), _('Error'),
_('You cannot do this on an entry generated ' _('You cannot do this on an entry generated by a bank'
'by a bank statement. You must change the related' ' statement. '
'bank statement directly.\n%s.') % err_msg 'You must change the related bank statement'
) ' directly.\n%s.') % err_msg)
return True return True
@api.cr_uid_ids_context
def unlink(self, cr, uid, ids, context=None, check=True): def unlink(self, cr, uid, ids, context=None, check=True):
""" Add the following checks: """ Add the following checks:
- Is the move related to an invoice - Is the move related to an invoice
- Is the move related to a bank statement - Is the move related to a bank statement
- Is other values than reconcile_partial_id and/or - Is other values than reconcile_partial_id and/or reconcile_id
reconcile_id modified modified
In that case, we forbid the move to be deleted even if draft. We In that case, we forbid the move to be deleted even if draft. We
should never delete directly a move line related or generated by should never delete directly a move line related or generated by
another object. This is mandatory if you use the module setting another object. This is mandatory if you use the module setting
all moves in draft (module: account_default_draft_move) all moves in draft (module: account_default_draft_move)
""" """
if context is None:
context = {}
if not context.get('from_parent_object', False): if not context.get('from_parent_object', False):
self._check_invoice_related_move(cr, uid, ids, context=context) self._check_invoice_related_move(cr, uid, ids)
self._check_statement_related_move(cr, uid, ids, context=context) self._check_statement_related_move(cr, uid, ids)
return super(AccountMoveLine, self).unlink(cr, uid, ids, return super(AccountMoveLine, self).unlink(cr, uid, ids,
context=context, context=context,
check=check) check=check)
@api.cr_uid_ids_context
def write(self, cr, uid, ids, vals, context=None, check=True, def write(self, cr, uid, ids, vals, context=None, check=True,
update_check=True): update_check=True):
""" Add the following checks: """ Add the following checks:
- Is the move related to an invoice - Is the move related to an invoice
- Is the move related to a bank statement - Is the move related to a bank statement
- Is other values than reconcile_partial_id and/or - Is other values than reconcile_partial_id and/or reconcile_id
reconcile_id modified modified
In that case, we forbid the move to be modified even if draft. In that case, we forbid the move to be modified even if draft.
We should never update directly a move line related or generated We should never update directly a move line related or generated
by another object. This is mandatory if you use the module by another object. This is mandatory if you use the module
setting all moves in draft (module: account_default_draft_move) setting all moves in draft (module: account_default_draft_move)
""" """
if context is None:
context = {}
if not context.get('from_parent_object', False): if not context.get('from_parent_object', False):
self._check_invoice_related_move(cr, uid, ids, vals, self._check_invoice_related_move(cr, uid, ids, vals)
context=context) self._check_statement_related_move(cr, uid, ids, vals)
self._check_statement_related_move(cr, uid, ids, vals, return super(AccountMoveLine, self).write(cr, uid, ids, vals,
context=context) context=context,
return super(AccountMoveLine, self).write( check=check,
cr, uid, ids, vals, update_check=update_check)
context=context, check=check, update_check=update_check
)
def _check_currency_and_amount(self, cr, uid, ids, context=None): @api.multi
for l in self.browse(cr, uid, ids, context=context): def _check_currency_and_amount(self):
for l in self:
# we check zero amount line # we check zero amount line
if not (l.debit and l.credit): if not (l.debit and l.credit):
continue continue
@@ -164,16 +123,18 @@ class AccountMoveLine(orm.Model):
return False return False
return True return True
def _check_currency_amount(self, cr, uid, ids, context=None): @api.multi
for l in self.browse(cr, uid, ids, context=context): def _check_currency_amount(self):
for l in self:
if l.amount_currency: if l.amount_currency:
if ((l.amount_currency > 0.0 and l.credit > 0.0) or if ((l.amount_currency > 0.0 and l.credit > 0.0) or
(l.amount_currency < 0.0 and l.debit > 0.0)): (l.amount_currency < 0.0 and l.debit > 0.0)):
return False return False
return True return True
def _check_currency_company(self, cr, uid, ids, context=None): @api.multi
for l in self.browse(cr, uid, ids, context=context): def _check_currency_company(self):
for l in self:
if l.currency_id.id == l.company_id.currency_id.id: if l.currency_id.id == l.company_id.currency_id.id:
return False return False
return True return True
@@ -195,64 +156,3 @@ class AccountMoveLine(orm.Model):
"the same than the company one.", "the same than the company one.",
['currency_id']), ['currency_id']),
] ]
class AccountInvoice(orm.Model):
_inherit = "account.invoice"
def action_cancel(self, cr, uid, ids, context=None):
"""Override the method to add the key 'from_parent_object' in
the context. This is to allow to delete move line related to
invoice through the cancel button.
"""
if context is None:
context = {}
else:
context = context.copy()
context['from_parent_object'] = True
return super(AccountInvoice, self).action_cancel(cr, uid, ids,
context=context)
def action_move_create(self, cr, uid, ids, context=None):
"""Override the method to add the key 'from_parent_object' in
the context."""
if context is None:
context = {}
else:
context = context.copy()
context['from_parent_object'] = True
return super(AccountInvoice, self).action_move_create(cr, uid, ids,
context=context)
class AccountBankStatement(orm.Model):
_inherit = "account.bank.statement"
def button_cancel(self, cr, uid, ids, context=None):
"""Override the method to add the key 'from_parent_object' in
the context. This is to allow to delete move line related to
bank statement through the cancel button.
"""
if context is None:
context = {}
else:
context = context.copy()
context['from_parent_object'] = True
return super(AccountBankStatement, self).button_cancel(cr, uid, ids,
context=context)
def create_move_from_st_line(self, cr, uid, st_line_id,
company_currency_id,
st_line_number, context=None):
"""Add the from_parent_object key in context in order to be able
to post the move.
"""
if context is None:
context = {}
else:
context = context.copy()
context['from_parent_object'] = True
return super(AccountBankStatement, self).create_move_from_st_line(
cr, uid, st_line_id, company_currency_id,
st_line_number, context=context
)