diff --git a/addons/account/account.py b/addons/account/account.py index c956bb2e280..cc60ce2a959 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -126,6 +126,21 @@ class account_account(osv.osv): _name = "account.account" _description = "Account" + def search(self, cr, uid, args, offset=0, limit=None, order=None): + pos = 0 + while pos'draft' GROUP BY a.id" % acc_set) @@ -312,7 +327,10 @@ class account_journal(osv.osv): 'name': fields.char('Journal Name', size=64, required=True), 'code': fields.char('Code', size=16), 'type': fields.selection([('sale','Sale'), ('purchase','Purchase'), ('cash','Cash'), ('general','General'), ('situation','Situation')], 'Type', size=32, required=True), + 'type_control_ids': fields.many2many('account.account.type', 'account_journal_type_rel', 'journal_id','type_id', 'Type Controls', domain=[('code','<>','view')]), + 'account_control_ids': fields.many2many('account.account', 'account_account_type_rel', 'journal_id','account_id', 'Account', domain=[('type','<>','view')]), + 'active': fields.boolean('Active'), 'view_id': fields.many2one('account.journal.view', 'View', required=True, help="Gives the view used when writing or browsing entries in this journal. The view tell Tiny ERP which fields should be visible, required or readonly and in which order. You can create your own view for a faster encoding in each journal."), 'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account'), @@ -561,6 +579,12 @@ class account_move(osv.osv): l[2]['period_id'] = default_period context['period_id'] = default_period + if not 'name' in vals: + journal = self.pool.get('account.journal').browse(cr, uid, context.get('journal_id', vals.get('journal_id', False))) + if journal.sequence_id: + vals['name'] = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) + else: + raise osv.except_osv('Error', 'No sequence defined in the journal !') if 'line_id' in vals: c = context.copy() c['novalidate'] = True diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 08fc7091eee..51ecda00ba4 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -104,32 +104,63 @@ class account_bank_statement(osv.osv): if (not st.journal_id.default_credit_account_id) or (not st.journal_id.default_debit_account_id): raise osv.except_osv('Configration Error !', 'Please verify that an account is defined in the journal.') for move in st.line_ids: + move_id = self.pool.get('account.move').create(cr, uid, { + 'journal_id': st.journal_id.id, + 'period_id': st.period_id.id, + }, context=context) if not move.amount: continue - self.pool.get('account.move.line').create(cr, uid, { + torec = [] + amount = move.amount + if move.reconcile_id and move.reconcile_id.line_new_ids: + for newline in move.reconcile_id.line_new_ids: + amount += newline.amount + torec.append(self.pool.get('account.move.line').create(cr, uid, { 'name': move.name, 'date': move.date, + 'move_id': move_id, 'partner_id': ((move.partner_id) and move.partner_id.id) or False, 'account_id': (move.account_id) and move.account_id.id, - 'credit': ((move.amount>0) and move.amount) or 0.0, - 'debit': ((move.amount<0) and -move.amount) or 0.0, + 'credit': ((amount>0) and amount) or 0.0, + 'debit': ((amount<0) and -amount) or 0.0, 'statement_id': st.id, 'journal_id': st.journal_id.id, 'period_id': st.period_id.id, - 'ref': move.invoice_id and move.invoice_id.number or '' - }, context=context) - if not st.journal_id.centralisation: - c = context.copy() - c['journal_id'] = st.journal_id.id - c['period_id'] = st.period_id.id - fields = ['move_id','name','date','partner_id','account_id','credit','debit'] - default = self.pool.get('account.move.line').default_get(cr, uid, fields, context=c) - default.update({ - 'statement_id': st.id, - 'journal_id': st.journal_id.id, - 'period_id': st.period_id.id, - }) - self.pool.get('account.move.line').create(cr, uid, default, context=context) + }, context=context)) + if move.reconcile_id and move.reconcile_id.line_new_ids: + for newline in move.reconcile_id.line_new_ids: + self.pool.get('account.move.line').create(cr, uid, { + 'name': newline.name or move.name, + 'date': move.date, + 'move_id': move_id, + 'partner_id': ((move.partner_id) and move.partner_id.id) or False, + 'account_id': (newline.account_id) and newline.account_id.id, + 'debit': newline.amount>0 and newline.amount or 0.0, + 'credit': newline.amount<0 and -newline.amount or 0.0, + 'statement_id': st.id, + 'journal_id': st.journal_id.id, + 'period_id': st.period_id.id, + }, context=context) + + c = context.copy() + c['journal_id'] = st.journal_id.id + c['period_id'] = st.period_id.id + fields = ['move_id','name','date','partner_id','account_id','credit','debit'] + default = self.pool.get('account.move.line').default_get(cr, uid, fields, context=c) + default.update({ + 'statement_id': st.id, + 'journal_id': st.journal_id.id, + 'period_id': st.period_id.id, + 'move_id': move_id, + }) + self.pool.get('account.move.line').create(cr, uid, default, context=context) + if move.reconcile_id and move.reconcile_id.line_ids: + torec += map(lambda x: x.id, move.reconcile_id.line_ids) + try: + self.pool.get('account.move.line').reconcile(cr, uid, torec, 'statement', context) + except: + raise osv.except_osv('Error !', 'Unable to reconcile entry "%s": %.2f'%(move.name, move.amount)) + done.append(st.id) self.write(cr, uid, done, {'state':'confirm'}, context=context) return True @@ -153,6 +184,69 @@ class account_bank_statement(osv.osv): return {} account_bank_statement() +class account_bank_statement_reconcile(osv.osv): + _name = "account.bank.statement.reconcile" + _description = "Statement reconcile" + def _total_entry(self, cr, uid, ids, prop, unknow_none, context={}): + result = {} + for o in self.browse(cr, uid, ids, context): + result[o.id] = 0.0 + for line in o.line_ids: + result[o.id] += line.debit - line.credit + return result + + def _total_new(self, cr, uid, ids, prop, unknow_none, context={}): + result = {} + for o in self.browse(cr, uid, ids, context): + result[o.id] = 0.0 + for line in o.line_new_ids: + result[o.id] += line.amount + return result + + def _total_balance(self, cr, uid, ids, prop, unknow_none, context={}): + result = {} + for o in self.browse(cr, uid, ids, context): + result[o.id] = o.total_new-o.total_entry+o.total_amount + return result + + def _total_amount(self, cr, uid, ids, prop, unknow_none, context={}): + return dict(map(lambda x: (x,context.get('amount', 0.0)), ids)) + + def name_get(self, cr, uid, ids, context): + res= [] + for o in self.browse(cr, uid, ids, context): + res.append((o.id, '[%.2f/%.2f]' % (o.total_entry, o.total_new))) + return res + + _columns = { + 'name': fields.char('Date', size=64, required=True), + 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True), + 'line_new_ids': fields.one2many('account.bank.statement.reconcile.line', 'line_id', 'Write-Off'), + + 'total_entry': fields.function(_total_entry, method=True, string='Total entries'), + 'total_new': fields.function(_total_new, method=True, string='Total write-off'), + 'total_amount': fields.function(_total_amount, method=True, string='Payment amount'), + 'total_balance': fields.function(_total_balance, method=True, string='Balance'), + } + _defaults = { + 'name': lambda *a:time.strftime('%Y-%m-%d'), + 'partner_id': lambda s,cr,u,c={}: c.get('partner', False), + 'total_amount': lambda s,cr,u,c={}: c.get('amount', 0.0) + } +account_bank_statement_reconcile() + +class account_bank_statement_reconcile_line(osv.osv): + _name = "account.bank.statement.reconcile.line" + _description = "Statement reconcile line" + _columns = { + 'name': fields.char('Description', size=64), + 'account_id': fields.many2one('account.account', 'Account', required=True), + 'line_id': fields.many2one('account.bank.statement.reconcile', 'Reconcile'), + 'amount': fields.float('Amount', required=True), + } +account_bank_statement_reconcile_line() + + class account_bank_statement_line(osv.osv): def onchange_partner_id(self, cr, uid, id, partner_id, type, context={}): if not partner_id: @@ -177,9 +271,8 @@ class account_bank_statement_line(osv.osv): 'partner_id': fields.many2one('res.partner', 'Partner'), 'account_id': fields.many2one('account.account','Account', required=True), 'statement_id': fields.many2one('account.bank.statement', 'Statement', select=True), - 'invoice_id': fields.many2one('account.invoice', 'Invoice', states={'confirm':[('readonly',True)]}), - + 'reconcile_id': fields.many2one('account.bank.statement.reconcile', 'Reconcile', states={'confirm':[('readonly',True)]}), } _defaults = { 'name': lambda self,cr,uid,context={}: self.pool.get('ir.sequence').get(cr, uid, 'account.bank.statement.line'), @@ -189,5 +282,3 @@ class account_bank_statement_line(osv.osv): account_bank_statement_line() - - diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 979a0af24fc..23ae41f8623 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -358,6 +358,8 @@ class account_move_line(osv.osv): for field in journal.view_id.columns_id: fields.append(field.field) attrs = [] + if field.field=='account_id' and journal.id: + attrs.append('domain="[(\'journal_id\', \'=\', '+str(journal.id)+'),(\'type\',\'<>\',\'view\')]"') if field.readonly: attrs.append('readonly="1"') if field.required: @@ -474,3 +476,13 @@ class account_move_line(osv.osv): self.pool.get('account.move').validate(cr, uid, [vals['move_id']], context) return result account_move_line() + + +class account_bank_statement_reconcile(osv.osv): + _inherit = "account.bank.statement.reconcile" + _columns = { + 'line_ids': fields.many2many('account.move.line', 'account_bank_statement_line_rel', 'statement_id', 'line_id', 'Entries'), + } +account_bank_statement_reconcile() + + diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 26386258567..7f6422aa79e 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -403,14 +403,14 @@ - + - - + + @@ -435,6 +435,34 @@ + + + account.bank.statement.reconcile.form + account.bank.statement.reconcile + form + +
+ + + + + + + + + + + + + + + + +