diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index 17c0a77c30f..343512dc271 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -135,7 +135,8 @@ for a particular financial year and for preparation of vouchers there is a modul
],
'css':[
'static/src/css/account_move_reconciliation.css',
- 'static/src/css/account_move_line_quickadd.css'
+ 'static/src/css/account_move_line_quickadd.css',
+ 'static/src/css/account_bank_and_cash.css',
],
'demo': [
'demo/account_demo.xml',
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 8a15321b9c6..d437074023a 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -106,13 +106,13 @@ class account_bank_statement(osv.osv):
'balance_start': fields.float('Starting Balance', digits_compute=dp.get_precision('Account'),
states={'confirm':[('readonly',True)]}),
'balance_end_real': fields.float('Ending Balance', digits_compute=dp.get_precision('Account'),
- states={'confirm': [('readonly', True)]}),
+ states={'confirm': [('readonly', True)]}, help="Computed using the cash control lines"),
'balance_end': fields.function(_end_balance,
store = {
'account.bank.statement': (lambda self, cr, uid, ids, c={}: ids, ['line_ids','move_line_ids','balance_start'], 10),
'account.bank.statement.line': (_get_statement, ['amount'], 10),
},
- string="Computed Balance", help='Balance as calculated based on Starting Balance and transaction lines'),
+ string="Computed Balance", help='Balance as calculated based on Opening Balance and transaction lines'),
'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
'line_ids': fields.one2many('account.bank.statement.line',
'statement_id', 'Statement lines',
@@ -128,6 +128,7 @@ class account_bank_statement(osv.osv):
'currency': fields.function(_currency, string='Currency',
type='many2one', relation='res.currency'),
'account_id': fields.related('journal_id', 'default_debit_account_id', type='many2one', relation='account.account', string='Account used in this journal', readonly=True, help='used in statement reconciliation domain, but shouldn\'t be used elswhere.'),
+ 'cash_control': fields.related('journal_id', 'cash_control' , type='boolean', relation='account.journal',string='Cash control'),
}
_defaults = {
@@ -450,22 +451,25 @@ class account_bank_statement(osv.osv):
def _compute_balance_end_real(self, cr, uid, journal_id, context=None):
res = False
if journal_id:
- cr.execute('SELECT balance_end_real \
- FROM account_bank_statement \
- WHERE journal_id = %s AND NOT state = %s \
- ORDER BY date DESC,id DESC LIMIT 1', (journal_id, 'draft'))
- res = cr.fetchone()
+ journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
+ if journal.with_last_closing_balance:
+ cr.execute('SELECT balance_end_real \
+ FROM account_bank_statement \
+ WHERE journal_id = %s AND NOT state = %s \
+ ORDER BY date DESC,id DESC LIMIT 1', (journal_id, 'draft'))
+ res = cr.fetchone()
return res and res[0] or 0.0
def onchange_journal_id(self, cr, uid, statement_id, journal_id, context=None):
if not journal_id:
return {}
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
-
- journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['company_id', 'currency'], context=context)
- company_id = journal_data['company_id']
- currency_id = journal_data['currency'] or self.pool.get('res.company').browse(cr, uid, company_id[0], context=context).currency_id.id
- return {'value': {'balance_start': balance_start, 'company_id': company_id, 'currency': currency_id}}
+ journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
+ currency = journal.currency or journal.company_id.currency_id
+ res = {'balance_start': balance_start, 'company_id': journal.company_id.id, 'currency': currency.id}
+ if journal.type == 'cash':
+ res['cash_control'] = journal.cash_control
+ return {'value': res}
def unlink(self, cr, uid, ids, context=None):
stat = self.read(cr, uid, ids, ['state'], context=context)
@@ -546,7 +550,7 @@ class account_bank_statement_line(osv.osv):
_name = "account.bank.statement.line"
_description = "Bank Statement Line"
_columns = {
- 'name': fields.char('OBI', required=True, help="Originator to Beneficiary Information"),
+ 'name': fields.char('Description', required=True),
'date': fields.date('Date', required=True),
'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')),
'type': fields.selection([
diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py
index 8e3e250d41c..c1c5265d8c2 100644
--- a/addons/account/account_cash_statement.py
+++ b/addons/account/account_cash_statement.py
@@ -159,6 +159,10 @@ class account_cash_statement(osv.osv):
context=context
)
+ opening_details_ids = self._get_cash_open_box_lines(cr, uid, journal_id, context)
+ if opening_details_ids:
+ result['value']['opening_details_ids'] = opening_details_ids
+
if not statement_ids:
return result
@@ -172,13 +176,14 @@ class account_cash_statement(osv.osv):
store = {
'account.bank.statement': (lambda self, cr, uid, ids, context=None: ids, ['line_ids','move_line_ids'], 10),
'account.bank.statement.line': (_get_statement_from_line, ['amount'], 10),
- }),
+ },
+ help="Total of cash transaction lines."),
'closing_date': fields.datetime("Closed On"),
'details_ids' : fields.one2many('account.cashbox.line', 'bank_statement_id', string='CashBox Lines'),
'opening_details_ids' : fields.one2many('account.cashbox.line', 'bank_statement_id', string='Opening Cashbox Lines'),
'closing_details_ids' : fields.one2many('account.cashbox.line', 'bank_statement_id', string='Closing Cashbox Lines'),
'user_id': fields.many2one('res.users', 'Responsible', required=False),
- 'difference' : fields.function(_compute_difference, method=True, string="Difference", type="float"),
+ 'difference' : fields.function(_compute_difference, method=True, string="Difference", type="float", help="Difference between the theoretical closing balance and the real closing balance."),
'last_closing_balance' : fields.function(_compute_last_closing_balance, method=True, string='Last Closing Balance', type='float'),
}
_defaults = {
@@ -187,13 +192,12 @@ class account_cash_statement(osv.osv):
'user_id': lambda self, cr, uid, context=None: uid,
}
- def create(self, cr, uid, vals, context=None):
- journal = False
- if vals.get('journal_id'):
- journal = self.pool.get('account.journal').browse(cr, uid, vals['journal_id'], context=context)
- if journal and (journal.type == 'cash') and not vals.get('details_ids'):
- vals['details_ids'] = []
-
+ def _get_cash_open_box_lines(self, cr, uid, journal_id, context):
+ details_ids = []
+ if not journal_id:
+ return details_ids
+ journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
+ if journal and (journal.type == 'cash'):
last_pieces = None
if journal.with_last_closing_balance == True:
@@ -206,16 +210,19 @@ class account_cash_statement(osv.osv):
last_pieces = dict(
(line.pieces, line.number_closing) for line in last_bank_statement.details_ids
)
-
for value in journal.cashbox_line_ids:
nested_values = {
'number_closing' : 0,
'number_opening' : last_pieces.get(value.pieces, 0) if isinstance(last_pieces, dict) else 0,
'pieces' : value.pieces
}
+ details_ids.append([0, False, nested_values])
+ return details_ids
- vals['details_ids'].append([0, False, nested_values])
-
+ def create(self, cr, uid, vals, context=None):
+ journal_id = vals.get('journal_id')
+ if journal_id and not vals.get('opening_details_ids'):
+ vals['opening_details_ids'] = vals.get('opening_details_ids') or self._get_cash_open_box_lines(cr, uid, journal_id, context)
res_id = super(account_cash_statement, self).create(cr, uid, vals, context=context)
self._update_balances(cr, uid, [res_id], context)
return res_id
@@ -233,7 +240,10 @@ class account_cash_statement(osv.osv):
@return: True on success, False otherwise
"""
-
+ if vals.get('journal_id', False):
+ cashbox_line_obj = self.pool.get('account.cashbox.line')
+ cashbox_ids = cashbox_line_obj.search(cr, uid, [('bank_statement_id', 'in', ids)], context=context)
+ cashbox_line_obj.unlink(cr, uid, cashbox_ids, context)
res = super(account_cash_statement, self).write(cr, uid, ids, vals, context=context)
self._update_balances(cr, uid, ids, context)
return res
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index ed2d88b7386..60821c2b454 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -2264,7 +2264,6 @@
-
@@ -2272,6 +2271,7 @@
+
@@ -2305,41 +2305,64 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/addons/account/static/src/css/account_bank_and_cash.css b/addons/account/static/src/css/account_bank_and_cash.css
new file mode 100644
index 00000000000..5b5643d0d8e
--- /dev/null
+++ b/addons/account/static/src/css/account_bank_and_cash.css
@@ -0,0 +1,27 @@
+.openerp .oe_force_bold {
+ font-weight: bold !important;
+}
+.openerp label.oe_open_balance{
+ margin-right: -18px;
+}
+.openerp label.oe_subtotal_footer_separator{
+ float:right;
+ width: 184px !important;
+}
+.openerp label.oe_mini_subtotal_footer_separator{
+ margin-right: -14px;
+}
+.openerp .oe_account_total, .openerp .oe_pos_total {
+ margin-left: -2px;
+}
+.openerp label.oe_real_closing_balance{
+ min-width: 184px !important;
+}
+.openerp label.oe_difference, .openerp label.oe_pos_difference {
+ margin-right: -10px;
+ padding-left: 10px !important;
+ min-width: 195px !important;
+}
+.openerp .oe_opening_total{
+ margin-right: 4px;
+}
diff --git a/addons/account_analytic_plans/account_analytic_plans_view.xml b/addons/account_analytic_plans/account_analytic_plans_view.xml
index 42b17ae06c3..05955d6f5cd 100644
--- a/addons/account_analytic_plans/account_analytic_plans_view.xml
+++ b/addons/account_analytic_plans/account_analytic_plans_view.xml
@@ -270,6 +270,20 @@
+
+
+ account.bank.statement.form.inherit
+ account.bank.statement
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index fec66d0d602..aa6a798d6b9 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -45,6 +45,16 @@ class pos_config(osv.osv):
('deprecated', 'Deprecated')
]
+ def _get_currency(self, cr, uid, ids, fieldnames, args, context=None):
+ result = dict.fromkeys(ids, False)
+ for pos_config in self.browse(cr, uid, ids, context=context):
+ if pos_config.journal_id:
+ currency_id = pos_config.journal_id.currency.id or pos_config.journal_id.company_id.currency_id.id
+ else:
+ currency_id = self.pool['res.users'].browse(cr, uid, uid, context=context).company_id.currency_id.id
+ result[pos_config.id] = currency_id
+ return result
+
_columns = {
'name' : fields.char('Point of Sale Name', size=32, select=1,
required=True, help="An internal identification of the point of sale"),
@@ -56,6 +66,7 @@ class pos_config(osv.osv):
'journal_id' : fields.many2one('account.journal', 'Sale Journal',
domain=[('type', '=', 'sale')],
help="Accounting journal used to post sales entries."),
+ 'currency_id' : fields.function(_get_currency, type="many2one", string="Currency", relation="res.currency"),
'iface_self_checkout' : fields.boolean('Self Checkout Mode',
help="Check this if this point of sale should open by default in a self checkout mode. If unchecked, OpenERP uses the normal cashier mode by default."),
'iface_cashdrawer' : fields.boolean('Cashdrawer Interface'),
@@ -202,6 +213,7 @@ class pos_session(osv.osv):
readonly=True,
states={'opening_control' : [('readonly', False)]}
),
+ 'currency_id' : fields.related('config_id', 'currency_id', type="many2one", relation='res.currency', string="Currnecy"),
'start_at' : fields.datetime('Opening Date', readonly=True),
'stop_at' : fields.datetime('Closing Date', readonly=True),
@@ -232,27 +244,28 @@ class pos_session(osv.osv):
type='float',
digits_compute=dp.get_precision('Account'),
string="Ending Balance",
- help="Computed using the cash control lines",
+ help="Total of closing cash control lines.",
readonly=True),
'cash_register_balance_start' : fields.related('cash_register_id', 'balance_start',
type='float',
digits_compute=dp.get_precision('Account'),
string="Starting Balance",
- help="Computed using the cash control at the opening.",
+ help="Total of opening cash control lines.",
readonly=True),
'cash_register_total_entry_encoding' : fields.related('cash_register_id', 'total_entry_encoding',
string='Total Cash Transaction',
- readonly=True),
+ readonly=True,
+ help="Total of all paid sale orders"),
'cash_register_balance_end' : fields.related('cash_register_id', 'balance_end',
type='float',
digits_compute=dp.get_precision('Account'),
- string="Computed Balance",
- help="Computed with the initial cash control and the sum of all payments.",
+ string="Theoretical Closing Balance",
+ help="Sum of opening balance and transactions.",
readonly=True),
'cash_register_difference' : fields.related('cash_register_id', 'difference',
type='float',
string='Difference',
- help="Difference between the counted cash control at the closing and the computed balance.",
+ help="Difference between the theoretical closing balance and the real closing balance.",
readonly=True),
'journal_ids' : fields.related('config_id', 'journal_ids',
diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml
index 0f26a7c85b9..195b7ce6e0c 100644
--- a/addons/point_of_sale/point_of_sale_view.xml
+++ b/addons/point_of_sale/point_of_sale_view.xml
@@ -772,6 +772,7 @@
+
@@ -878,9 +879,9 @@
class="oe_highlight" />
-
-
-
+
+
+