Add support for multi-currency

Works with a single account journal
Usability and many other enhancements
This commit is contained in:
Alexis de Lattre
2014-10-08 13:47:28 +02:00
committed by ps-tubtim
parent 7820f8029d
commit 58291eac65
14 changed files with 517 additions and 662 deletions

View File

@@ -1,23 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# account_check_deposit for OpenERP #
# Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as #
# published by the Free Software Foundation, either version 3 of the #
# License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU Affero General Public License for more details. #
# #
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
#
# account_check_deposit for Odoo/OpenERP
# Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
import account_deposit
from . import account_deposit

View File

@@ -1,35 +1,45 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# account_check_deposit for OpenERP #
# Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com> #
# Copyright (C) 2013 Akretion Chafique DELLI <chafique.delli@akretion.com> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as #
# published by the Free Software Foundation, either version 3 of the #
# License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU Affero General Public License for more details. #
# #
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
#
# account_check_deposit for Odoo/OpenERP
# Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
# @author: Benoît GUILLOT <benoit.guillot@akretion.com>
# @author: Chafique DELLI <chafique.delli@akretion.com>
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': 'account_check_deposit',
'name': 'Account Check Deposit',
'version': '0.1',
'category': 'Generic Modules/Others',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'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 "received checks" and a
journal for payment by checks.""",
'summary': 'Manage deposit of checks to the bank',
'description': """
Account Check Deposit
=====================
This module allows you to easily manage check deposits : you can select all
the checks you received as payments and create a global deposit for the
selected checks.
A journal for received checks is automatically created.
You must configure on this journal the default debit account and the default
credit account. You must also configure on the company the account for
check deposits.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com/',
'depends': [
@@ -37,12 +47,13 @@
'report_webkit',
],
'data': [
'account_deposit_view.xml',
'account_deposit_sequence.xml',
'account_type_data.xml',
'security/ir.model.access.csv',
'account_deposit_view.xml',
'account_deposit_sequence.xml',
'company_view.xml',
'security/ir.model.access.csv',
'security/check_deposit_security.xml',
'account_data.xml',
],
'installable': True,
'application': True,
'active': False,
}

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
account_check_deposit for Odoo/OpenERP
Copyright (C) 2014 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data noupdate="1">
<record id="check_received_journal_seq" model="ir.sequence">
<field name="name">Journal Check Received</field>
<field name="prefix">CHK/</field>
<field name="padding">6</field>
<field name="company_id" ref="base.main_company"/>
</record>
<!-- The user will have to configure manually the default_credit_account_id
and default_debit_account_id, we can't do that for him -->
<record id="check_received_journal" model="account.journal">
<field name="name">Check Received</field>
<field name="code">CHK</field>
<field name="type">bank</field>
<field name="sequence_id" ref="check_received_journal_seq"/>
<field name="company_id" ref="base.main_company"/>
</record>
</data>
</openerp>

View File

@@ -1,236 +1,321 @@
# -*- coding: utf-8 -*-
###############################################################################
# #
# account_check_deposit for OpenERP #
# Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com> #
# Copyright (C) 2013 Akretion Chafique DELLI <chafique.delli@akretion.com> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as #
# published by the Free Software Foundation, either version 3 of the #
# License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU Affero General Public License for more details. #
# #
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
#
# account_check_deposit for Odoo/OpenERP
# Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
# @author: Benoît GUILLOT <benoit.guillot@akretion.com>
# @author: Chafique DELLI <chafique.delli@akretion.com>
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from openerp.osv import fields, osv, orm
from openerp.osv import fields, orm
from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
class account_check_deposit(orm.Model):
_name = "account.check.deposit"
_description = "Account Check Deposit"
_order = 'deposit_date desc'
def sum_amount(self, cr, uid, ids, name, args, context=None):
def _compute_check_deposit(self, cr, uid, ids, name, args, context=None):
res = {}
for deposit in self.browse(cr, uid, ids, context=context):
total = 0
total = 0.0
count = 0
reconcile = False
currency_none_same_company_id = False
if deposit.company_id.currency_id != deposit.currency_id:
currency_none_same_company_id = deposit.currency_id.id
for line in deposit.check_payment_ids:
total += line.debit
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
count += 1
if currency_none_same_company_id:
total += line.amount_currency
else:
total += line.debit
if deposit.move_id:
for line in deposit.move_id.line_id:
if line.debit > 0 and line.reconcile_id:
res[deposit.id] = True
reconcile = True
res[deposit.id] = {
'total_amount': total,
'is_reconcile': reconcile,
'currency_none_same_company_id': currency_none_same_company_id,
'check_count': count,
}
return res
_columns = {
'name': fields.char(
'Name',
size=64,
required=True,
readonly=True,
states={'draft': [('readonly', '=', False)]}),
'Name', size=64, readonly=True),
'check_payment_ids': fields.one2many(
'account.move.line',
'check_deposit_id',
'Check Payments',
readonly=True,
states={'draft': [('readonly', '=', False)]}),
'account.move.line', 'check_deposit_id', 'Check Payments',
states={'done': [('readonly', '=', True)]}),
'deposit_date': fields.date(
'Deposit Date',
readonly=True,
states={'draft': [('readonly', '=', False)]}),
'Deposit Date', required=True,
states={'done': [('readonly', '=', True)]}),
'journal_id': fields.many2one(
'account.journal',
'Journal',
required=True,
readonly=True,
states={'draft': [('readonly', '=', False)]}),
'account.journal', 'Journal', domain=[('type', '=', 'bank')],
required=True, states={'done': [('readonly', '=', True)]}),
'journal_default_account_id': fields.related(
'journal_id', 'default_debit_account_id', type='many2one',
relation='account.account',
string='Default Debit Account of the Journal'),
'currency_id': fields.many2one(
'res.currency', 'Currency', required=True,
states={'done': [('readonly', '=', True)]}),
'currency_none_same_company_id': fields.function(
_compute_check_deposit, type='many2one',
relation='res.currency', multi='deposit',
string='Currency (False if same as company)'),
'state': fields.selection([
('draft', 'Draft'),
('done', 'Done'),
], 'Status',
readonly=True),
], '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)]}),
'account.move', 'Journal Entry', readonly=True),
'partner_bank_id': fields.many2one(
'res.partner.bank', 'Bank Account', required=True,
domain="[('company_id', '=', company_id)]",
states={'done': [('readonly', '=', True)]}),
'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),
'move_id', 'line_id', relation='account.move.line',
type='one2many', string='Lines', readonly=True),
'company_id': fields.many2one(
'res.company',
'Company',
required=True,
'res.company', 'Company', required=True,
change_default=True,
readonly=True,
states={'draft': [('readonly', '=', False)]}),
states={'done': [('readonly', '=', True)]}),
'total_amount': fields.function(
sum_amount,
string="total amount",
type="float"),
_compute_check_deposit, multi='deposit',
string="Total Amount", readonly=True,
type="float", digits_compute=dp.get_precision('Account')),
'check_count': fields.function(
_compute_check_deposit, multi='deposit', readonly=True,
string="Number of Checks", type="integer"),
'is_reconcile': fields.function(
_is_reconcile,
string="Reconcile",
type="boolean"),
_compute_check_deposit, multi='deposit', readonly=True,
string="Reconcile", type="boolean"),
}
_defaults = {
'name': lambda self, cr, uid, context: '/',
'name': '/',
'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),
'company_id': lambda self, cr, uid, c: self.pool['res.company'].
_company_default_get(cr, uid, 'account.check.deposit', context=c),
}
def _check_deposit(self, cr, uid, ids):
for deposit in self.browse(cr, uid, ids):
deposit_currency = deposit.currency_id
if deposit_currency == deposit.company_id.currency_id:
for line in deposit.check_payment_ids:
if line.currency_id:
raise orm.except_orm(
_('Error:'),
_("The check with amount %s and reference '%s' "
"is in currency %s but the deposit is in "
"currency %s.") % (
line.debit, line.ref or '',
line.currency_id.name,
deposit_currency.name))
else:
for line in deposit.check_payment_ids:
if line.currency_id != deposit_currency:
raise orm.except_orm(
_('Error:'),
_("The check with amount %s and reference '%s' "
"is in currency %s but the deposit is in "
"currency %s.") % (
line.debit, line.ref or '',
line.currency_id.name,
deposit_currency.name))
return True
_constraints = [(
_check_deposit,
"All the checks of the deposit must be in the currency of the deposit",
['currency_id', 'check_payment_ids', 'company_id']
)]
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(
raise orm.except_orm(
_('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:
if line.reconcile_id:
line.reconcile_id.unlink()
_("The deposit '%s' is in valid state, so you must "
"cancel it before deleting it.")
% deposit.name)
return super(account_check_deposit, self).unlink(
cr, uid, ids, context=context)
def backtodraft(self, cr, uid, ids, context=None):
for deposit in self.browse(cr, uid, ids, context=context):
if deposit.move_id:
# It will raise here if journal_id.update_posted = False
deposit.move_id.button_cancel()
for line in deposit.check_payment_ids:
if line.reconcile_id:
line.reconcile_id.unlink()
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')
vals['name'] = self.pool['ir.sequence'].\
next_by_code(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):
date = deposit.deposit_date
period_obj = self.pool['account.period']
period_ids = period_obj.find(cr, uid, dt=date, context=context)
# period_ids will always have a value, cf the code of find()
move_vals = {
'journal_id': deposit.journal_id.id,
'date': date,
'period_id': period_ids[0],
'name': _('Check Deposit %s') % deposit.name,
'ref': deposit.name,
}
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):
def _prepare_move_line_vals(
self, cr, uid, line, context=None):
assert (line.debit > 0), 'Debit must have a value'
return {
'name': line.ref,
'name': _('Check Deposit - Ref. Check %s') % line.ref,
'credit': line.debit,
'debit': 0.0,
'account_id': line.account_id.id,
'partner_id': line.partner_id.id,
'check_line_id': line.id,
}
'currency_id': line.currency_id.id or False,
'amount_currency': line.amount_currency * -1,
}
def _prepare_sum_move_line_vals(self, cr, uid, deposit, move_vals, context=None):
debit = 0.0
for line in deposit.check_payment_ids:
debit += line.debit
def _prepare_counterpart_move_lines_vals(
self, cr, uid, deposit, total_debit, total_amount_currency,
context=None):
return {
'name': deposit.name,
'debit': debit,
'ref': deposit.name,
}
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 = {}
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}
'name': _('Check Deposit %s') % deposit.name,
'debit': total_debit,
'credit': 0.0,
'account_id': deposit.company_id.check_deposit_account_id.id,
'partner_id': False,
'currency_id': deposit.currency_none_same_company_id.id or False,
'amount_currency': total_amount_currency,
}
def validate_deposit(self, cr, uid, ids, context=None):
move_obj = self.pool.get('account.move')
am_obj = self.pool['account.move']
aml_obj = self.pool['account.move.line']
if context is None:
context = {}
for deposit in self.browse(cr, uid, ids, context=context):
context['journal_id'] = deposit.journal_id.id
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, move_id, context=context)
move_vals = self._prepare_account_move_vals(
cr, uid, deposit, context=context)
context['journal_id'] = move_vals['journal_id']
context['period_id'] = move_vals['period_id']
move_id = am_obj.create(cr, uid, move_vals, context=context)
total_debit = 0.0
total_amount_currency = 0.0
to_reconcile_line_ids = []
for line in deposit.check_payment_ids:
total_debit += line.debit
total_amount_currency += line.amount_currency
line_vals = self._prepare_move_line_vals(
cr, uid, line, context=context)
line_vals['move_id'] = move_id
move_line_id = aml_obj.create(
cr, uid, line_vals, context=context)
to_reconcile_line_ids.append([line.id, move_line_id])
# Create counter-part
if not deposit.company_id.check_deposit_account_id:
raise orm.except_orm(
_('Configuration Error:'),
_("Missing Account for Check Deposits on the "
"company '%s'.") % deposit.company_id.name)
counter_vals = self._prepare_counterpart_move_lines_vals(
cr, uid, deposit, total_debit, total_amount_currency,
context=context)
counter_vals['move_id'] = move_id
aml_obj.create(cr, uid, counter_vals, context=context)
am_obj.post(cr, uid, [move_id], context=context)
deposit.write({'state': 'done', 'move_id': move_id})
# We have to reconcile after post()
for reconcile_line_ids in to_reconcile_line_ids:
aml_obj.reconcile(
cr, uid, reconcile_line_ids, context=context)
return True
def onchange_company_id(
self, cr, uid, ids, company_id, currency_id, context=None):
vals = {}
if company_id:
company = self.pool['res.company'].browse(
cr, uid, company_id, context=context)
if currency_id:
if company.currency_id.id == currency_id:
vals['currency_none_same_company_id'] = False
else:
vals['currency_none_same_company_id'] = currency_id
partner_bank_ids = self.pool['res.partner.bank'].search(
cr, uid, [('company_id', '=', company_id)], context=context)
if len(partner_bank_ids) == 1:
vals['partner_bank_id'] = partner_bank_ids[0]
else:
vals['currency_none_same_company_id'] = False
vals['partner_bank_id'] = False
return {'value': vals}
def onchange_journal_id(self, cr, uid, ids, journal_id, context=None):
vals = {}
if journal_id:
journal = self.pool['account.journal'].browse(
cr, uid, journal_id, context=context)
vals['journal_default_account_id'] = \
journal.default_debit_account_id.id
if journal.currency:
vals['currency_id'] = journal.currency.id
else:
vals['currency_id'] = journal.company_id.currency_id.id
else:
vals['journal_default_account_id'] = False
return {'value': vals}
def onchange_currency_id(
self, cr, uid, ids, currency_id, company_id, context=None):
vals = {}
if currency_id and company_id:
company = self.pool['res.company'].browse(
cr, uid, company_id, context=context)
if company.currency_id.id == currency_id:
vals['currency_none_same_company_id'] = False
else:
vals['currency_none_same_company_id'] = currency_id
else:
vals['currency_none_same_company_id'] = False
return {'value': vals}
class account_move_line(orm.Model):
_inherit = "account.move.line"
@@ -239,7 +324,17 @@ class account_move_line(orm.Model):
'check_deposit_id': fields.many2one(
'account.check.deposit',
'Check Deposit'),
'check_line_id': fields.many2one(
'account.move.line',
'Check Receive Move line'),
}
class res_company(orm.Model):
_inherit = 'res.company'
_columns = {
'check_deposit_account_id': fields.many2one(
'account.account', 'Account for Check Deposits',
domain=[
('type', '<>', 'view'),
('type', '<>', 'closed'),
('reconcile', '=', True)]),
}

View File

@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
account_check_deposit for OpenERP
Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com>
account_check_deposit for Odoo/OpenERP
Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
@author: Benoît GUILLOT <benoit.guillot@akretion.com>
The licence is in the file __openerp__.py
-->

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
account_check_deposit for OpenERP
Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com>
Copyright (C) 2013 Akretion Chafique DELLI <chafique.delli@akretion.com>
account_check_deposit for Odoo/OpenERP
Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
@author: Benoît GUILLOT <benoit.guillot@akretion.com>
@author: Chafique DELLI <chafique.delli@akretion.com>
@author: Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
@@ -15,82 +17,81 @@
model="account.check.deposit"
name="check.deposit.webkit"
report_type="webkit"
string="Print Checks Deposit"/>
<!-- INHERITED VIEW FOR THE OBJECT : account_check_deposit -->
string="Checks Deposit"/>
<record id="account_check_deposit_view_form" model="ir.ui.view">
<field name="name">account_check_deposit.account_check_deposit.view_form</field>
<field name="name">account.check.deposit.form</field>
<field name="model">account.check.deposit</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Checks Deposit" version="7.0">
<header>
<button name="validate_deposit" states="draft"
string="Validate Deposit"
string="Validate"
type="object" class="oe_highlight"/>
<button name="cancel" states="done"
string="Cancel" type="object" />
<button name="backtodraft" states="done"
string="Back to Draft" type="object" />
<field name="state" widget="statusbar"
statusbar_visible="draft,done"
statusbar_colors='{"draft":"blue"}'/>
statusbar_visible="draft,done" />
</header>
<sheet>
<h1>
<label string="Deposit" />
<label string="Check Deposit" />
<field name="name" class="oe_inline" />
</h1>
<group name="deposit_fields">
<field name="deposit_date" />
<field name="journal_id" />
<field name="move_id" />
<field name="company_id"
on_change="onchange_company_id(company_id, context)"/>
<field name="partner_id" invisible="1"/>
<field name="bank_id"/>
<group name="main">
<group name="left">
<field name="deposit_date" />
<field name="journal_id"
widget="selection"
on_change="onchange_journal_id(journal_id, context)"/>
<field name="journal_default_account_id"
invisible="1"/>
<field name="currency_id"
groups="base.group_multi_currency"
on_change="onchange_currency_id(currency_id, company_id, context)"/>
<field name="partner_bank_id"/>
</group>
<group name="right">
<field name="company_id"
on_change="onchange_company_id(company_id, currency_id, context)"
groups="base.group_multi_company"/>
<field name="currency_none_same_company_id"
invisible="1"/>
<field name="check_count"/>
<field name="total_amount" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field name="move_id"/>
</group>
</group>
<group string="Check Payments" name="check_payments">
<field name="check_payment_ids" nolabel="1"
widget="many2many"
domain="[('reconcile_id', '=', False),
('debit', '>', 0),
('journal_id', '=', journal_id),
('currency_id', '=', currency_none_same_company_id),
('account_id', '=', journal_default_account_id)]"
context="{'currency': currency_id,
'journal_id': journal_id}" />
</group>
<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>
</record>
<record id="account_check_deposit_view_tree" model="ir.ui.view">
<field name="name">account_check_deposit.account_check_deposit.view_tree</field>
<field name="name">account.check.deposit.tree</field>
<field name="model">account.check.deposit</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Checks Deposit">
<tree string="Checks Deposits" colors="blue:state=='draft';">
<field name="name"/>
<field name="deposit_date"/>
<field name="state"/>
<field name="move_id"/>
<field name="check_count"/>
<field name="total_amount"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="is_reconcile"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state"/>
</tree>
</field>
</record>
@@ -101,28 +102,31 @@
<field name="arch" type="xml">
<search string="Checks Deposit Search">
<field name="name" string="Checks Deposit"/>
<field name="deposit_date" string="Date"/>
<field name="state"/>
<field name="move_id"/>
<group expand="0" string="Group By...">
<filter name="draft" string="Draft"
domain="[('state', '=', 'draft')]" />
<filter name="done" string="Done"
domain="[('state', '=', 'done')]" />
<group string="Group By" name="groupby">
<filter name="date_groupby" string="Deposit Date"
context="{'group_by': 'deposit_date'}"/>
<filter name="journal_groupby" string="Journal"
context="{'group_by': 'journal_id'}" />
<filter name="currency_groupby" string="Currency"
context="{'group_by': 'currency_id'}" />
<filter name="partner_bank_groupby" string="Bank Account"
context="{'group_by': 'partner_bank_id'}" />
</group>
</search>
</field>
</record>
<record id="action_check_deposit_tree" model="ir.actions.act_window">
<field name="name">Checks Deposit</field>
<field name="name">Checks Deposits</field>
<field name="res_model">account.check.deposit</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,graph</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="search_view_id" ref="view_check_deposit_search"/>
<field name="help" type="html"></field>
<field name="view_mode">tree,form</field>
</record>
<menuitem string="Checks Deposit"
action="action_check_deposit_tree"
<menuitem action="action_check_deposit_tree"
id="menu_check_deposit_tree"
parent="account.menu_finance_bank_and_cash"
sequence="20"/>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
account_check_deposit for OpenERP
Copyright (C) 2012 Akretion Benoît GUILLOT <benoit.guillot@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data noupdate="1">
<!-- New account.account.type -->
<record model="account.account.type" id="data_account_type_received_check">
<field name="name">Received Checks</field>
<field name="code">received_check</field>
<field name="close_method">none</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2014 Akretion (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="view_company_form" model="ir.ui.view">
<field name="name">check.deposit.company.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form" />
<field name="arch" type="xml">
<group name="account_grp" position="inside">
<field name="check_deposit_account_id" />
</group>
</field>
</record>
</data>
</openerp>

View File

@@ -1,6 +0,0 @@
[Dolphin]
AdditionalInfoV2=Details_Size,Details_Date,CustomizedDetails
Sorting=2
Timestamp=2012,3,5,14,27,49
Version=2
ViewMode=1

View File

@@ -1,275 +0,0 @@
<html>
<head>
<style type="text/css">
${css}
pre {font-family:helvetica; font-size:12;}
</style>
</head>
<body>
<style type="text/css">
table {
width: 100%;
page-break-after:auto;
border-collapse: collapse;
cellspacing="0";
font-size:10px;
}
td { margin: 0px; padding: 3px; border: 1px solid lightgrey; vertical-align: top; }
pre {font-family:helvetica; font-size:12;}
</style>
<%
def carriage_returns(text):
return text.replace('\n', '<br />')
%>
%for order in objects :
<br>
<% setLang(order.partner_id.lang) %>
<table >
%if order.company_id.address_label_position == 'left':
<tr>
<td style="width:50%">
${_("Shipping Address")}
<hr>
<pre>
${order.partner_shipping_id.address_label}
<pre>
</td>
<td style="width:50%">
%if order.partner_id.address_label != order.partner_shipping_id.address_label:
<b>${_("Ordering Contact")}</b><br>
${order.partner_id.address_label|carriage_returns}
%endif
%if order.partner_id.phone :
${_("Phone")}: ${order.partner_id.phone|entity} <br>
%endif
%if order.partner_id.fax :
${_("Fax")}: ${order.partner_id.fax|entity} <br>
%endif
%if order.partner_id.email :
${_("Mail")}: ${order.partner_id.email|entity} <br>
%endif
%if order.partner_invoice_id.address_label != order.partner_shipping_id.address_label:
<br>
<b>${_("Invoice Address")}</b><br>
${order.partner_invoice_id.address_label|carriage_returns}
%endif
%if order.partner_invoice_id.partner_id.vat :
${_("VAT")}: ${order.partner_invoice_id.partner_id.vat|entity} <br>
%endif
</td>
</tr>
%endif
%if order.company_id.address_label_position == 'right' or not order.company_id.address_label_position:
<tr>
<td style="width:50%">
%if order.partner_id.address_label != order.partner_shipping_id.address_label:
<b>${_("Ordering Contact")}</b><br>
<hr>
${order.partner_id.address_label|carriage_returns}
%endif
%if order.partner_id.phone :
${_("Tel")}: ${order.partner_id.phone|entity} <br>
%endif
%if order.partner_id.fax :
${_("Fax")}: ${order.partner_id.fax|entity} <br>
%endif
%if order.partner_id.email :
${_("E-mail")}: ${order.partner_id.email|entity} <br>
%endif
%if order.partner_invoice_id.address_label != order.partner_shipping_id.address_label:
<br>
<hr>
<b>${_("Invoice Address")}</b><br>
<hr>
${order.partner_invoice_id.address_label|carriage_returns}
%endif
%if order.partner_invoice_id.vat :
${_("VAT")}: ${order.partner_invoice_id.vat|entity} <br>
%endif
</td>
<td style="width:50%">
<b>${_("Shipping Address")}</b><br>
<hr>
<pre>
${order.partner_shipping_id.address_label}
<pre>
</td>
</tr>
%endif
</table>
<br />
<br />
%if order.state == 'draft' :
<span class="title">${_("Quotation N°")} ${order.name or ''|entity}</span>
%elif order.state == 'cancel' :
<span class="title">${_("Sale Order Canceled")} ${order.name or ''|entity}</span>
%else :
<span class="title">${_("Order N°")} ${order.name or ''|entity}</span>
%endif
<br/>
<table style="width:100%">
<tr>
%if order.client_order_ref:
<td>${_("Reference")}</td>
%endif
%if order.project_id:
<td>${_("Projekt")}</td>
%endif
<td style="text-align:center;white-space:nowrap"><b>${_("Order Date")}</b></td>
%if order.carrier_id:
<td style="text-align:center;white-space:nowrap"><b>${_("Carrier")}</b></td>
%endif
%if order.user_id:
<td style="text-align:center;white-space:nowrap"><b>${_("Salesman")}</b></td>
%endif
%if order.payment_term :
<td style="text-align:center;white-space:nowrap"><b>${_("Payment Term")}</b></td>
%endif
%if order.incoterm:
<td style="text-align:center;white-space:nowrap"><b>${_("Incoterm")}</b></td>
%endif
<td style="text-align:center;white-space:nowrap"><b>${_("Curr")}</b></td>
</tr>
<tr>
%if order.client_order_ref:
<td>
${order.client_order_ref}
</td>
%endif
%if order.project_id:
<td>${order.project_id.name}</td>
%endif
%if order.date_order:
<td>
${order.date_order or ''}</td>
%endif
%if order.carrier_id:
<td>
${order.carrier_id.name }
</td>
%endif
%if order.user_id :
<td>${order.user_id.name or ''}</td>
%endif
%if order.payment_term :
<td>${order.payment_term.name}</td>
%endif
%if order.incoterm:
<td>${order.incoterm.name}</td>
%endif
<td style="white-space:nowrap">${order.pricelist_id.currency_id.name} </td>
</table>
<h1><br /></h1>
<table style="width:100%">
<thead>
<tr>
%if order.print_code:
<td style="text-align:center;white-space:nowrap"><b>${_("Code")}</b></td>
<td style="text-align:center;white-space:nowrap"><b>${_("Description")}</b></td>
%else:
<td style="text-align:center;white-space:nowrap"><b>${_("Description")}</b></td>
%endif
<td style="text-align:center;white-space:nowrap"><b>${_("Tax")}</b></td>
%if order.print_uom:
<td style="text-align:center;white-space:nowrap"><b>${_("Quantity")}</b></td><td style="text-align:center;white-space:nowrap"><b>${_("UoM")}</b></td>
%endif
%if order.print_uos:
<th style="text-align:center;white-space:nowrap">${_("UoS Qty")}</th><th style="text-align:center;white-space:nowrap;">${_("UoS")}</th>
%endif
%if order.print_ean:
<td style="text-align:center;white-space:nowrap"><b>${_("EAN")}</b></td>
%endif
%if order.print_packing:
<td style="text-align:center;white-space:nowrap"><b>${_("Pack")}</b></td>
<td style="text-align:center;white-space:nowrap"><b>${_("Packaging")}</b></td>
%endif
<td style="text-align:center;white-space:nowrap"><b>${_("Price Unit")}</b></td>
%if order.print_discount:
<td style="text-align:center;white-space:nowrap"><b>${_("Discount")}</b></td>
%endif
<td style="text-align:center;white-space:nowrap"><b>${_("Sub Total")}</b></td>
</tr>
</thead>
%for line in order.order_line_sorted :
<tbody>
<tr>
%if order.print_code:
<td>${line.product_id.default_code or ''|entity}</td>
<td>
${line.product_id.name or line.name|entity}
</td>
%else:
<td>${line.name|entity}
</td
%endif
<td>${ ', '.join([tax.name or '' for tax in line.tax_id]) }</td>
%if order.print_uom:
<td style="white-space:nowrap;text-align:right;">${str(line.product_uom_qty).replace(',000','') or '0'}</td>
<td style="white-space:nowrap;text-align:left;">${line.product_uom.name or ''}</td>
%endif
%if order.print_uos:
<td style="white-space:nowrap;text-align:right;">${str(line.product_uos_qty).replace(',000','') or '0'}</td>
<td style="white-space:nowrap;text-align:left;">${line.product_uos.name or ''}</td>
%endif
%if order.print_ean:
<td style="white-space:nowrap;text-align:left;">${line.product_packaging.ean or line.product_id.ean13 or ''}</td>
%endif
%if order.print_packing:
<td style="white-space:normal;text-align:left;">${line.product_packaging.qty and line.product_uom_qty/line.product_packaging.qty or ''}</td>
<td style="white-space:normal;text-align:left;">${line.product_packaging and line.product_packaging.ul.name or ''} ${line.product_packaging and _(" / " or '')} ${line.product_packaging and line.product_packaging.qty or ''} ${line.product_packaging and line.product_id.uom_id.name or ''}</td>
%endif
<td style="white-space:nowrap;text-align:right;">${line.price_unit or ''}</td>
%if order.print_discount:
<td style="text-align:right;">${line.discount}</th>
%endif
<td style="white-space:nowrap;text-align:right;">${line.price_subtotal or ''}</td>
</tr>
%endfor
</tbody>
<tfoot>
<tr>
<td colspan="${order.cols}" style="border-style:none"/>
<td style="border-top: 2px solid"><b>${_("Net Total:")}</b></td>
<td class="amount" style="border-top:2px solid;text-align:right;">${formatLang(order.amount_untaxed, get_digits(dp='Sale Price'))} </td>
</tr>
<tr>
<td colspan="${order.cols}" style="border-style:none"/>
<td style="border-style:none"><b>${_("Taxes:")}</b></td>
<td class="amount" style="text-align:right;">${formatLang(order.amount_tax, get_digits(dp='Sale Price'))} </td>
</tr>
<tr>
<td colspan="${order.cols}" style="border-style:none"/>
<td style="border-top:2px solid"><b>${_("Total:")}</b></td>
<td class="amount" style="border-top:2px solid;text-align:right;">${formatLang(order.amount_total, get_digits(dp='Sale Price'))} </td>
</tr>
</tfoot>
</table>
%if order.note and 'note_print' not in order._columns:
<br>
<pre>${order.note}</pre>
%endif:
%if 'note_print' in order._columns and order.note_print:
<br>
<pre>${order.note_print}</pre>
%endif:
<p style="page-break-after:always"></p>
%endfor
</body>
</html>

View File

@@ -1,32 +1,22 @@
#-*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2010 Camptocamp SA (http://www.camptocamp.com)
# All Right Reserved
# account_check_deposit for Odoo/OpenERP
# Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
#
# Author : Ferdinand Gassauer (Camptocamp Austria)
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
###############################################################################
import report_webkit_html
from . import report_webkit_html

View File

@@ -37,76 +37,54 @@
</head>
<body>
%for deposit in objects :
<% setLang(deposit.partner_id.lang) %>
<b><span class="titre">${_("Deposit Slip of Checks(Euros)")}</span></b>
<br>
<br>
<br>
<br>
<br>
<br>
<h2>
<b>${_("Deposit N°")} ${deposit.name}</b>
</h2>
<% setLang(deposit.company_id.partner_id.lang) %>
<b><span class="titre">${_("Deposit Slip of Checks in ")} ${deposit.currency_id.name}</span></b>
<h1>
<b>${_("Deposit Date")}</b><span class="vtrait1">${_("|")}</span>
<span class="valign_up1"> ${deposit.deposit_date}</span>
<b><span class="halign">${_("Bank Code")}</span></b>
<span class="vtrait2">${_("|")}</span><span class="valign_up2"> ${deposit.bank_id.bank_code}</span>
<br>
<b>${_("Beneficiary")}</b><span class="vtrait1">${_("|")}</span>
<span class="valign_up1"> ${company.partner_id.name}</span>
<b><span class="halign">${_("Office Code")}</span></b>
<span class="vtrait2">${_("|")}</span><span class="valign_up2"> ${deposit.bank_id.office}</span>
<br>
<b>${_("Account to crediting")}</b><span class="vtrait1">${_("|")}</span>
<span class="valign_up1"> ${deposit.bank_id.rib_acc_number}</span>
<b><span class="halign">${_("BIS Key")}</span></b><span class="vtrait2">${_("|")}</span>
<span class="valign_up2"> ${deposit.bank_id.key}</span>
</h1>
<br>
<h3>
<b>${_("Check Payments")}</b>
</h3>
<table class="basic_table" width="100%">
<tr>
<th class="date">${_("Deposit Date")}</th>
<th class="text-align:center;">${_("Deposit Ref")}</th>
<th class="text-align:center;">${_("Beneficiary")}</th>
<th class="text-align:center;">${_("Bank Account Number")}</th>
</tr>
<tr>
<td class="date">${formatLang(deposit.deposit_date, date=True)}</td>
<td class="text-align:center;">${deposit.name}</td>
<td class="text-align:center;">${deposit.company_id.partner_id.name}</td>
<td class="text-align:center;">${deposit.partner_bank_id.acc_number}</td>
</tr>
</table>
<h3>${_("Check Payments")}</h3>
<table style="width:100%">
<thead>
<tr>
<th class="entete_tab">${_("Payment Date")}</th>
<th class="entete_tab">${_("Reference")}</th>
<th class="entete_tab">${_("Description")}</th>
<th class="entete_tab">${_("Designation")}</th>
<th class="entete_tab">${_("Debtor")}</th>
<th class="entete_tab">${_("Amount")}</th>
</thead>
</tr>
<br>
%for move_line in deposit.check_payment_ids :
<tbody>
<tr>
<td class="cellule_tab">${move_line.date or ''}</td>
<td class="cellule_tab">${move_line.ref or ''}</td>
<td class="cellule_tab">${move_line.name or ''}</td>
<td class="cellule_tab">${move_line.partner_id.name or ''}</td>
<td class="amount">${move_line.debit or '0'}</td>
<td class="amount">${deposit.currency_id == deposit.company_id.currency_id and move_line.debit or move_line.amount_currency} ${deposit.currency_id.name}</td>
</tr>
</tbody>
%endfor
%endfor
<tfoot>
<tr>
<td colspan=4 class="amount total"><b>${_("Total:")}</b></td>
<td colspan=5 class="amount total"><b>${deposit.total_amount or '0'}</b></td>
<td colspan="3" class="amount total"><b>${_("Total:")}</b></td>
<td class="amount total"><b>${deposit.total_amount or '0'} ${deposit.currency_id.name}</b></td>
</tr>
</tfoot>
</table>
</body>
</html>

View File

@@ -1,34 +1,35 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010-2012 Camptocamp Austria (<http://www.camptocamp.at>)
# Copyright (C) 2013 AKRETION (<http://www.akretion.com>)
# account_check_deposit for Odoo/OpenERP
# Copyright (C) 2012-2014 Akretion (http://www.akretion.com/)
# @author: Benoît GUILLOT <benoit.guillot@akretion.com>
# @author: Chafique DELLI <chafique.delli@akretion.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
###############################################################################
import time
from report import report_sxw
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)
super(report_webkit_html, self).__init__(
cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'cr': cr,

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2014 Akretion (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
The licence is in the file __openerp__.py
-->
<openerp>
<data noupdate="1">
<record id="check_deposit_rule" model="ir.rule">
<field name="name">Check Deposit multi-company</field>
<field name="model_id" ref="model_account_check_deposit"/>
<field name="global" eval="True"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
</record>
</data>
</openerp>