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" />