mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[FIX+REF+IMP] account_check_deposit:
* [FIX] fix datamodel structure, indeed check_payment_ids should be a m2o. In the view we still keep the widget * [REF] remove useless state cancel, only draft/done is sufficent for now, forbid to delete a done deposit, fix move_line name need to be the equal to the line.ref for the reconciliation * [IMP] improve reconciliation between the check and the check deposit * [FIX] set correctly the date on the move line generated * [FIX] fix reconciliation of check * [IMP] check deposit improve view and add tab for move line generated * [IMP] add total amount and flag to know if the deposit have been reconcile, the best will be to add a workflow * [FIX] fix error when replaying commit * [REF] remove dependency on sale_quick_payment as check can be registred in various way like native voucher * [CLEAN] pep8 cleanup no code change * [REF] clean remove useless code, default value are called during the create * [FIX] fix wrong spelling * [REF] V7 clean up
This commit is contained in:
committed by
Pedro M. Baeza
parent
1fd35fba85
commit
dcd60b1090
@@ -20,8 +20,6 @@
|
||||
# #
|
||||
###############################################################################
|
||||
|
||||
|
||||
|
||||
{
|
||||
'name': 'account_check_deposit',
|
||||
'version': '0.1',
|
||||
@@ -30,21 +28,21 @@
|
||||
'description': """This module allows you to use check deposits.
|
||||
With a new model : account_check_deposit you can select all
|
||||
the checks payments and create a global deposit for the selected checks.
|
||||
You may have to create an account for recieved checks and a journal for payment by checks.""",
|
||||
You may have to create an account for "received checks" and a
|
||||
journal for payment by checks.""",
|
||||
'author': 'Akretion',
|
||||
'website': 'http://www.akretion.com/',
|
||||
'depends': ['account_accountant',
|
||||
'report_webkit',
|
||||
'sale_quick_payment'
|
||||
],
|
||||
'init_xml': [],
|
||||
'update_xml': [
|
||||
'account_deposit_view.xml',
|
||||
'account_deposit_sequence.xml',
|
||||
'account_type_data.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'depends': [
|
||||
'account_accountant',
|
||||
'report_webkit',
|
||||
],
|
||||
'data': [
|
||||
'account_deposit_view.xml',
|
||||
'account_deposit_sequence.xml',
|
||||
'account_type_data.xml',
|
||||
'security/ir.model.access.csv',
|
||||
],
|
||||
'demo_xml': [],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
'active': False,
|
||||
}
|
||||
|
||||
@@ -30,148 +30,193 @@ class account_check_deposit(orm.Model):
|
||||
|
||||
def sum_amount(self, cr, uid, ids, name, args, context=None):
|
||||
res = {}
|
||||
total = 0
|
||||
for deposit in self.browse(cr, uid, ids, context=context):
|
||||
total = 0
|
||||
for line in deposit.check_payment_ids:
|
||||
total += line.debit
|
||||
res[deposit.id]= total
|
||||
return res
|
||||
res[deposit.id] = total
|
||||
return res
|
||||
|
||||
def _is_reconcile(self, cr, uid, ids, name, args, context=None):
|
||||
res = {}
|
||||
for deposit in self.browse(cr, uid, ids, context=context):
|
||||
res[deposit.id] = False
|
||||
if deposit.move_id:
|
||||
for line in deposit.move_id.line_id:
|
||||
if line.debit > 0 and line.reconcile_id:
|
||||
res[deposit.id] = True
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True, readonly=True,
|
||||
tates={'draft':[('readonly',False)]}),
|
||||
'check_payment_ids': fields.many2many('account.move.line',
|
||||
'account_move_line_deposit_rel',
|
||||
'check_deposit_id',
|
||||
'move_line_id',
|
||||
'Check Payments',
|
||||
readonly=True,
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'deposit_date': fields.date('Deposit Date', readonly=True,
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'journal_id': fields.many2one('account.journal', 'Journal',
|
||||
required=True, readonly=True,
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'name': fields.char(
|
||||
'Name',
|
||||
size=64,
|
||||
required=True,
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'check_payment_ids': fields.one2many(
|
||||
'account.move.line',
|
||||
'check_deposit_id',
|
||||
'Check Payments',
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'deposit_date': fields.date(
|
||||
'Deposit Date',
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'journal_id': fields.many2one(
|
||||
'account.journal',
|
||||
'Journal',
|
||||
required=True,
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'state': fields.selection([
|
||||
('draft','Draft'),
|
||||
('done','Done'),
|
||||
('cancel','Cancelled')
|
||||
],'Status', readonly=True),
|
||||
'move_id': fields.many2one('account.move', 'Journal Entry',
|
||||
readonly=True,
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'bank_id': fields.many2one('res.partner.bank', 'Bank', required=True,
|
||||
readonly=True,
|
||||
domain="[('partner_id', '=', partner_id)]",
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'partner_id':fields.related('company_id', 'partner_id', type="many2one",
|
||||
relation="res.partner", string="Partner",
|
||||
readonly=True),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True,
|
||||
change_default=True, readonly=True,
|
||||
states={'draft':[('readonly',False)]}),
|
||||
'total_amount': fields.function(sum_amount, string ="total amount"),
|
||||
('draft', 'Draft'),
|
||||
('done', 'Done'),
|
||||
], 'Status',
|
||||
readonly=True),
|
||||
'move_id': fields.many2one(
|
||||
'account.move',
|
||||
'Journal Entry',
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'bank_id': fields.many2one(
|
||||
'res.partner.bank',
|
||||
'Bank',
|
||||
required=True,
|
||||
readonly=True,
|
||||
domain="[('partner_id', '=', partner_id)]",
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'line_ids': fields.related(
|
||||
'move_id',
|
||||
'line_id',
|
||||
relation='account.move.line',
|
||||
type='one2many',
|
||||
string='Lines',
|
||||
readonly=True),
|
||||
'partner_id': fields.related(
|
||||
'company_id',
|
||||
'partner_id',
|
||||
type="many2one",
|
||||
relation="res.partner",
|
||||
string="Partner",
|
||||
readonly=True),
|
||||
'company_id': fields.many2one(
|
||||
'res.company',
|
||||
'Company',
|
||||
required=True,
|
||||
change_default=True,
|
||||
readonly=True,
|
||||
states={'draft': [('readonly', '=', False)]}),
|
||||
'total_amount': fields.function(
|
||||
sum_amount,
|
||||
string="total amount",
|
||||
type="float"),
|
||||
'is_reconcile': fields.function(
|
||||
_is_reconcile,
|
||||
string="Reconcile",
|
||||
type="boolean"),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'name': lambda self, cr, uid, context: '/',
|
||||
'deposit_date': fields.date.context_today,
|
||||
'state':'draft',
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.check.deposit', context=c),
|
||||
'state': 'draft',
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company').\
|
||||
_company_default_get(cr, uid, 'account.check.deposit', context=c),
|
||||
}
|
||||
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
for deposit in self.browse(cr, uid, ids, context=context):
|
||||
if deposit.state == 'done':
|
||||
raise osv.except_osv(_('User Error!'),
|
||||
_('You cannot delete a validad deposit, cancel it before'))
|
||||
return super(account_check_deposit, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
def cancel(self, cr, uid, ids, context=None):
|
||||
for deposit in self.browse(cr, uid, ids, context=context):
|
||||
if not deposit.journal_id.update_posted:
|
||||
raise osv.except_osv(_('Error!'), _('You cannot modify a posted entry of this journal.\nFirst you should set the journal to allow cancelling entries.'))
|
||||
raise osv.except_osv(
|
||||
_('Error!'),
|
||||
_('You cannot modify a posted entry of this journal.\n'
|
||||
'First you should set the journal to allow cancelling '
|
||||
'entries.'))
|
||||
for line in deposit.check_payment_ids:
|
||||
line.reconcile_id.unlink()
|
||||
deposit.move_id.button_cancel()
|
||||
deposit.move_id.unlink()
|
||||
if line.reconcile_id:
|
||||
line.reconcile_id.unlink()
|
||||
if deposit.move_id:
|
||||
deposit.move_id.button_cancel()
|
||||
deposit.move_id.unlink()
|
||||
deposit.write({'state': 'draft'})
|
||||
return True
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
if vals.get('name','/')=='/':
|
||||
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'account.check.deposit') or '/'
|
||||
return super(account_check_deposit, self).create(cr, uid, vals, context=context)
|
||||
if vals.get('name', '/') == '/':
|
||||
vals['name'] = self.pool.get('ir.sequence').\
|
||||
get(cr, uid, 'account.check.deposit')
|
||||
return super(account_check_deposit, self).\
|
||||
create(cr, uid, vals, context=context)
|
||||
|
||||
def _prepare_account_move_vals(self, cr, uid, deposit, context=None):
|
||||
move_vals = {}
|
||||
move_lines = [[0, 0, self._prepare_sum_move_line_vals(cr, uid,
|
||||
deposit, move_vals,
|
||||
context=context)]]
|
||||
for line in deposit.check_payment_ids:
|
||||
move_lines.append([0, 0, self._prepare_move_line_vals(cr, uid, line,
|
||||
move_vals,
|
||||
context=context)])
|
||||
move_vals.update({
|
||||
date = deposit.deposit_date
|
||||
move_vals = {
|
||||
'journal_id': deposit.journal_id.id,
|
||||
'line_id': move_lines,
|
||||
})
|
||||
'date': date,
|
||||
}
|
||||
period_obj = self.pool['account.period']
|
||||
period_ids = period_obj.find(cr, uid, dt=date, context=context)
|
||||
if period_ids:
|
||||
move_vals['period_id'] = period_ids[0]
|
||||
sum_move_line = self._prepare_sum_move_line_vals(
|
||||
cr, uid, deposit, move_vals, context=context)
|
||||
move_lines = [[0, 0, sum_move_line]]
|
||||
|
||||
for line in deposit.check_payment_ids:
|
||||
move_line = self._prepare_move_line_vals(
|
||||
cr, uid, line, move_vals, context=context)
|
||||
move_lines.append([0, 0, move_line])
|
||||
|
||||
move_vals.update({'line_id': move_lines})
|
||||
return move_vals
|
||||
|
||||
def _prepare_move_line_vals(self, cr, uid, line, move_vals, context=None):
|
||||
move_line_vals = self.pool.get('account.move.line').default_get(
|
||||
cr, uid,
|
||||
['centralisation', 'date','date_created', 'currency_id',
|
||||
'journal_id', 'amount_currency', 'account_id', 'period_id',
|
||||
'company_id'],
|
||||
context=context)
|
||||
move_line_vals.update({
|
||||
'name': line.name,
|
||||
return {
|
||||
'name': line.ref,
|
||||
'credit': line.debit,
|
||||
'account_id': line.account_id.id,
|
||||
'partner_id': line.partner_id.id,
|
||||
'ref': line.ref,
|
||||
})
|
||||
return move_line_vals
|
||||
'check_line_id': line.id,
|
||||
}
|
||||
|
||||
def _prepare_sum_move_line_vals(self, cr, uid, deposit, move_vals, context=None):
|
||||
move_line_vals = self.pool.get('account.move.line').default_get(
|
||||
cr, uid,
|
||||
['centralisation', 'date','date_created', 'currency_id',
|
||||
'journal_id', 'amount_currency', 'account_id', 'period_id',
|
||||
'company_id', 'state'],
|
||||
context=context)
|
||||
|
||||
debit = 0.0
|
||||
for line in deposit.check_payment_ids:
|
||||
debit += line.debit
|
||||
move_line_vals.update({
|
||||
'name': deposit.name,
|
||||
'debit': debit,
|
||||
'ref': deposit.name,
|
||||
})
|
||||
return {
|
||||
'name': deposit.name,
|
||||
'debit': debit,
|
||||
'ref': deposit.name,
|
||||
}
|
||||
|
||||
return move_line_vals
|
||||
|
||||
def _reconcile_checks(self, cr, uid, deposit, move_id, context=None):
|
||||
move_line_obj = self.pool.get('account.move.line')
|
||||
for line in deposit.check_payment_ids:
|
||||
move_line_ids = move_line_obj.search(cr, uid,
|
||||
[('move_id', '=', move_id),
|
||||
('credit', '=', line.debit),
|
||||
('name', '=', line.ref)],
|
||||
context=context)
|
||||
if move_line_ids:
|
||||
move_line_obj.reconcile(cr, uid,
|
||||
[line.id, move_line_ids[0]],
|
||||
context=context)
|
||||
def _reconcile_checks(self, cr, uid, move_id, context=None):
|
||||
move_line_obj = self.pool['account.move.line']
|
||||
move_obj = self.pool['account.move']
|
||||
move = move_obj.browse(cr, uid, move_id, context=context)
|
||||
for line in move.line_id:
|
||||
if line.check_line_id:
|
||||
move_line_obj.reconcile(cr, uid, [
|
||||
line.id,
|
||||
line.check_line_id.id,
|
||||
], context=context)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def onchange_company_id(self, cr, uid, ids, company_id, context=None):
|
||||
vals={}
|
||||
vals = {}
|
||||
if company_id:
|
||||
company=self.pool.get('res.company').browse(cr, uid, company_id, context=context)
|
||||
vals['partner_id']=company.partner_id.id
|
||||
return {'value':vals}
|
||||
|
||||
|
||||
company = self.pool.get('res.company').\
|
||||
browse(cr, uid, company_id, context=context)
|
||||
vals['partner_id'] = company.partner_id.id
|
||||
return {'value': vals}
|
||||
|
||||
def validate_deposit(self, cr, uid, ids, context=None):
|
||||
move_obj = self.pool.get('account.move')
|
||||
@@ -182,8 +227,8 @@ class account_check_deposit(orm.Model):
|
||||
move_vals = self._prepare_account_move_vals(cr, uid, deposit, context=context)
|
||||
move_id = move_obj.create(cr, uid, move_vals, context=context)
|
||||
move_obj.post(cr, uid, [move_id], context=context)
|
||||
self._reconcile_checks(cr, uid, deposit, move_id, context=context)
|
||||
deposit.write({'state':'done', 'move_id': move_id})
|
||||
self._reconcile_checks(cr, uid, move_id, context=context)
|
||||
deposit.write({'state': 'done', 'move_id': move_id})
|
||||
return True
|
||||
|
||||
|
||||
@@ -191,9 +236,10 @@ class account_move_line(orm.Model):
|
||||
_inherit = "account.move.line"
|
||||
|
||||
_columns = {
|
||||
'check_deposit_id': fields.many2many('account.check.deposit',
|
||||
'account_move_line_deposit_rel',
|
||||
'check_deposit_id',
|
||||
'move_line_id',
|
||||
'Check Deposit'),
|
||||
'check_deposit_id': fields.many2one(
|
||||
'account.check.deposit',
|
||||
'Check Deposit'),
|
||||
'check_line_id': fields.many2one(
|
||||
'account.move.line',
|
||||
'Check Receive Move line'),
|
||||
}
|
||||
|
||||
@@ -49,25 +49,31 @@
|
||||
<field name="partner_id" invisible="1"/>
|
||||
<field name="bank_id"/>
|
||||
</group>
|
||||
<separator string="Check Payments"/>
|
||||
<field name="check_payment_ids" nolabel="1"
|
||||
colspan="4" widget="many2many"
|
||||
domain="[('reconcile_id','=',False),
|
||||
('account_id.user_type.code','=','recieved_check')]">
|
||||
<tree string="Check Payment">
|
||||
<field name="journal_id" />
|
||||
<field name="period_id" />
|
||||
<field name="date"/>
|
||||
<field name="name"/>
|
||||
<field name="ref"/>
|
||||
<field name="partner_id" />
|
||||
<field name="account_id" />
|
||||
<field name="move_id" />
|
||||
<field name="debit" sum="Total Debit"/>
|
||||
<field name="credit" sum="Total Credit"/>
|
||||
<field name="reconcile"/>
|
||||
</tree>
|
||||
</field>
|
||||
<notebook colspan="4">
|
||||
<page string="Check Payments">
|
||||
<field name="check_payment_ids" nolabel="1"
|
||||
colspan="4" widget="many2many"
|
||||
domain="[('reconcile_id','=',False),
|
||||
('account_id.user_type.code','=','received_check')]">
|
||||
<tree string="Check Payment">
|
||||
<field name="journal_id" />
|
||||
<field name="period_id" />
|
||||
<field name="date"/>
|
||||
<field name="name"/>
|
||||
<field name="ref"/>
|
||||
<field name="partner_id" />
|
||||
<field name="account_id" />
|
||||
<field name="move_id" />
|
||||
<field name="debit" sum="Total Debit"/>
|
||||
<field name="credit" sum="Total Credit"/>
|
||||
<field name="reconcile"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Move Line">
|
||||
<field name="line_ids" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
@@ -83,6 +89,8 @@
|
||||
<field name="deposit_date"/>
|
||||
<field name="state"/>
|
||||
<field name="move_id"/>
|
||||
<field name="total_amount"/>
|
||||
<field name="is_reconcile"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
<!-- New account.account.type -->
|
||||
|
||||
<record model="account.account.type" id="data_account_type_received_check">
|
||||
<field name="name">Recieved Checks</field>
|
||||
<field name="code">recieved_check</field>
|
||||
<field name="name">Received Checks</field>
|
||||
<field name="code">received_check</field>
|
||||
<field name="close_method">none</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -23,18 +23,19 @@
|
||||
|
||||
import time
|
||||
from report import report_sxw
|
||||
from osv import osv
|
||||
|
||||
|
||||
class report_webkit_html(report_sxw.rml_parse):
|
||||
|
||||
def __init__(self, cr, uid, name, context):
|
||||
super(report_webkit_html, self).__init__(cr, uid, name, context=context)
|
||||
self.localcontext.update({
|
||||
'time': time,
|
||||
'cr':cr,
|
||||
'cr': cr,
|
||||
'uid': uid,
|
||||
})
|
||||
|
||||
report_sxw.report_sxw('report.account.check.deposit',
|
||||
'account.check.deposit',
|
||||
'addons/account_check_deposit/report/check_deposit.mako',
|
||||
parser=report_webkit_html)
|
||||
'account.check.deposit',
|
||||
'addons/account_check_deposit/report/check_deposit.mako',
|
||||
parser=report_webkit_html)
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_account_check_deposit_account_check_deposit_group_manager","account_check_deposit_account_check_deposit_group_manager","model_account_check_deposit","base.group_system",1,1,1,1
|
||||
"access_account_check_deposit_account_check_deposit_group_user","account_check_deposit_account_check_deposit_group_user","model_account_check_deposit","base.group_user",1,0,0,0
|
||||
"access_account_check_deposit_account_check_deposit_group_manager","account_check_deposit_account_check_deposit_group_manager","model_account_check_deposit","account.group_account_user",1,1,1,1
|
||||
|
||||
|
Reference in New Issue
Block a user