diff --git a/addons/account/account.py b/addons/account/account.py index b87caf547ab..aa5d507b3d2 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1944,15 +1944,17 @@ class account_tax(osv.osv): return super(account_tax, self).write(cr, uid, ids, vals, context=context) def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): + if context is None: + context = {} journal_pool = self.pool.get('account.journal') - if context and context.has_key('type'): + if context.get('type'): if context.get('type') in ('out_invoice','out_refund'): args += [('type_tax_use','in',['sale','all'])] elif context.get('type') in ('in_invoice','in_refund'): args += [('type_tax_use','in',['purchase','all'])] - if context and context.has_key('journal_id'): + if context.get('journal_id'): journal = journal_pool.browse(cr, uid, context.get('journal_id')) if journal.type in ('sale', 'purchase'): args += [('type_tax_use','in',[journal.type,'all'])] diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index b521f3ff48c..61c397364b9 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -457,7 +457,7 @@ - + diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index b48e842caf5..640ac90249b 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -1020,10 +1020,14 @@ class account_move_line(osv.osv): part_rec_ids = [rec['reconcile_partial_id'][0] for rec in part_recs] unlink_ids += rec_ids unlink_ids += part_rec_ids + all_moves = obj_move_line.search(cr, uid, ['|',('reconcile_id', 'in', unlink_ids),('reconcile_partial_id', 'in', unlink_ids)]) + all_moves = list(set(all_moves) - set(move_ids)) if unlink_ids: if opening_reconciliation: obj_move_rec.write(cr, uid, unlink_ids, {'opening_reconciliation': False}) obj_move_rec.unlink(cr, uid, unlink_ids) + if all_moves: + obj_move_line.reconcile_partial(cr, uid, all_moves, 'auto',context=context) return True def unlink(self, cr, uid, ids, context=None, check=True): diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index e518d8899b2..6e25c46168f 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -31,7 +31,7 @@ - + diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 99890a5f239..2205d52065b 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -22,6 +22,7 @@ from dateutil.relativedelta import relativedelta import datetime import logging import time +import traceback from openerp.osv import osv, fields from openerp.osv.orm import intersect, except_orm @@ -721,23 +722,40 @@ class account_analytic_account(osv.osv): inv_obj.button_compute(cr, uid, [invoice_id], context=context) return invoice_id - def recurring_create_invoice(self, cr, uid, automatic=False, context=None): + def recurring_create_invoice(self, cr, uid, ids, context=None): + return self._recurring_create_invoice(cr, uid, ids, context=context) + + def _cron_recurring_create_invoice(self, cr, uid, context=None): + return self._recurring_create_invoice(cr, uid, [], automatic=True, context=context) + + def _recurring_create_invoice(self, cr, uid, ids, automatic=False, context=None): context = context or {} current_date = time.strftime('%Y-%m-%d') - - contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)]) + if ids: + contract_ids = ids + else: + contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True), ('type', '=', 'contract')]) for contract in self.browse(cr, uid, contract_ids, context=context): - invoice_id = self._prepare_invoice(cr, uid, contract, context=context) + try: + invoice_id = self._prepare_invoice(cr, uid, contract, context=context) - next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") - interval = contract.recurring_interval - if contract.recurring_rule_type == 'daily': - new_date = next_date+relativedelta(days=+interval) - elif contract.recurring_rule_type == 'weekly': - new_date = next_date+relativedelta(weeks=+interval) - else: - new_date = next_date+relativedelta(months=+interval) - self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) + next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") + interval = contract.recurring_interval + if contract.recurring_rule_type == 'daily': + new_date = next_date+relativedelta(days=+interval) + elif contract.recurring_rule_type == 'weekly': + new_date = next_date+relativedelta(weeks=+interval) + else: + new_date = next_date+relativedelta(months=+interval) + self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) + if automatic: + cr.commit() + except Exception: + if automatic: + cr.rollback() + _logger.error(traceback.format_exc()) + else: + raise return True class account_analytic_account_summary_user(osv.osv): diff --git a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml index 492278a87b5..0637c2ad276 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml @@ -93,7 +93,7 @@ OpenERP Automatic Email days -1 - + diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index d99be3db355..97fb15e9290 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -151,8 +151,10 @@
- -
diff --git a/addons/account_analytic_analysis/test/account_analytic_analysis.yml b/addons/account_analytic_analysis/test/account_analytic_analysis.yml index 49668a2b781..4f594b6bed3 100644 --- a/addons/account_analytic_analysis/test/account_analytic_analysis.yml +++ b/addons/account_analytic_analysis/test/account_analytic_analysis.yml @@ -20,6 +20,7 @@ !record {model: account.analytic.account, id: contract_main}: partner_id: base.main_partner template_id: account_analytic_analysis.contract_template + type: contract - I check that the contract inherited from data of the template - @@ -32,7 +33,7 @@ I generate all invoices from contracts having recurring invoicing - !python {model: account.analytic.account}: | - self.recurring_create_invoice(cr, uid) + self.recurring_create_invoice(cr, uid, []) - I test the generated invoice - diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index 4cf12098fff..23a309c1dda 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -454,15 +454,10 @@ class account_bank_statement(osv.osv): _inherit = "account.bank.statement" _name = "account.bank.statement" - def create_move_from_st_line(self, cr, uid, st_line_id, company_currency_id, st_line_number, context=None): - account_move_line_pool = self.pool.get('account.move.line') - account_bank_statement_line_pool = self.pool.get('account.bank.statement.line') - st_line = account_bank_statement_line_pool.browse(cr, uid, st_line_id, context=context) - result = super(account_bank_statement,self).create_move_from_st_line(cr, uid, st_line_id, company_currency_id, st_line_number, context=context) - move = st_line.move_ids and st_line.move_ids[0] or False - if move: - for line in move.line_id: - account_move_line_pool.write(cr, uid, [line.id], {'analytics_id':st_line.analytics_id.id}, context=context) + def _prepare_bank_move_line(self, cr, uid, st_line, move_id, amount, company_currency_id, context=None): + result = super(account_bank_statement,self)._prepare_bank_move_line(cr, uid, st_line, + move_id, amount, company_currency_id, context=context) + result['analytics_id'] = st_line.analytics_id.id return result def button_confirm_bank(self, cr, uid, ids, context=None): diff --git a/addons/account_anglo_saxon/invoice.py b/addons/account_anglo_saxon/invoice.py index 81394bc926e..8ef17fa886c 100644 --- a/addons/account_anglo_saxon/invoice.py +++ b/addons/account_anglo_saxon/invoice.py @@ -123,6 +123,8 @@ class account_invoice_line(osv.osv): if a == line['account_id'] and i_line.product_id.id == line['product_id']: uom = i_line.product_id.uos_id or i_line.product_id.uom_id valuation_price_unit = self.pool.get('product.uom')._compute_price(cr, uid, uom.id, i_line.product_id.standard_price, i_line.uos_id.id) + if inv.currency_id.id != company_currency: + standard_price = self.pool.get('res.currency').compute(cr, uid, company_currency, inv.currency_id.id, standard_price, context={'date': inv.date_invoice}) if i_line.product_id.cost_method != 'standard' and i_line.purchase_line_id: #for average/fifo/lifo costing method, fetch real cost price from incomming moves stock_move_obj = self.pool.get('stock.move') diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 771c6e15bd8..a70684df1ad 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -783,6 +783,7 @@ class account_voucher(osv.osv): total_credit += line.credit and line.amount_currency or 0.0 total_debit += line.debit and line.amount_currency or 0.0 + remaining_amount = price #voucher line creation for line in account_move_lines: @@ -803,13 +804,13 @@ class account_voucher(osv.osv): 'move_line_id':line.id, 'account_id':line.account_id.id, 'amount_original': amount_original, - 'amount': (line.id in move_lines_found) and min(abs(price), amount_unreconciled) or 0.0, + 'amount': (line.id in move_lines_found) and min(abs(remaining_amount), amount_unreconciled) or 0.0, 'date_original':line.date, 'date_due':line.date_maturity, 'amount_unreconciled': amount_unreconciled, 'currency_id': line_currency_id, } - price -= rs['amount'] + remaining_amount -= rs['amount'] #in case a corresponding move_line hasn't been found, we now try to assign the voucher amount #on existing invoices: we split voucher amount by most old first, but only for lines in the same currency if not move_lines_found: @@ -937,19 +938,17 @@ class account_voucher(osv.osv): def cancel_voucher(self, cr, uid, ids, context=None): reconcile_pool = self.pool.get('account.move.reconcile') move_pool = self.pool.get('account.move') - + move_line_pool = self.pool.get('account.move.line') for voucher in self.browse(cr, uid, ids, context=context): # refresh to make sure you don't unlink an already removed move voucher.refresh() - recs = [] for line in voucher.move_ids: if line.reconcile_id: - recs += [line.reconcile_id.id] - if line.reconcile_partial_id: - recs += [line.reconcile_partial_id.id] - - reconcile_pool.unlink(cr, uid, recs) - + move_lines = [move_line.id for move_line in line.reconcile_id.line_id] + move_lines.remove(line.id) + reconcile_pool.unlink(cr, uid, [line.reconcile_id.id]) + if len(move_lines) >= 2: + move_line_pool.reconcile_partial(cr, uid, move_lines, 'auto',context=context) if voucher.move_id: move_pool.button_cancel(cr, uid, [voucher.move_id.id]) move_pool.unlink(cr, uid, [voucher.move_id.id]) diff --git a/addons/account_voucher/test/sales_payment.yml b/addons/account_voucher/test/sales_payment.yml index 3679c34dc52..ed9305a320c 100644 --- a/addons/account_voucher/test/sales_payment.yml +++ b/addons/account_voucher/test/sales_payment.yml @@ -44,6 +44,8 @@ !python {model: account.voucher}: | vals = {} journal_id = self.default_get(cr, uid, ['journal_id']).get('journal_id',None) + voucher = self.recompute_voucher_lines(cr, uid, [], ref("base.res_partner_19"), journal_id, 450.0, ref('base.EUR'), 'receipt', False) + assert (voucher['value'].get('writeoff_amount') == 0.0), "Writeoff amount calculated by recompute_voucher_lines() is not 0.0" res = self.onchange_partner_id(cr, uid, [], ref("base.res_partner_19"), journal_id, 0.0, 1, ttype='receipt', date=False) vals = { 'account_id': ref('account.cash'), @@ -64,6 +66,7 @@ vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] id = self.create(cr, uid, vals) voucher_id = self.browse(cr, uid, id) + assert (voucher_id.writeoff_amount == 0.0), "Writeoff amount is not 0.0" assert (voucher_id.state=='draft'), "Voucher is not in draft state" self.signal_proforma_voucher(cr, uid, [voucher_id.id]) diff --git a/addons/base_geolocalize/views/res_partner_view.xml b/addons/base_geolocalize/views/res_partner_view.xml index 24cc8d2d21d..1bd537ae3ff 100644 --- a/addons/base_geolocalize/views/res_partner_view.xml +++ b/addons/base_geolocalize/views/res_partner_view.xml @@ -8,7 +8,7 @@ - + diff --git a/addons/website_hr_recruitment/security/website_hr_recruitment_security.xml b/addons/website_hr_recruitment/security/website_hr_recruitment_security.xml index 724c4dfddce..792995ca606 100644 --- a/addons/website_hr_recruitment/security/website_hr_recruitment_security.xml +++ b/addons/website_hr_recruitment/security/website_hr_recruitment_security.xml @@ -5,6 +5,7 @@ Job Positions: Public [('website_published', '=', True)] + @@ -14,6 +15,7 @@ Job department: Public [('jobs_ids.website_published', '=', True)] + diff --git a/addons/website_mail/views/snippets.xml b/addons/website_mail/views/snippets.xml index b99be8f6d8c..98a79393211 100644 --- a/addons/website_mail/views/snippets.xml +++ b/addons/website_mail/views/snippets.xml @@ -428,7 +428,7 @@ - + View Product @@ -445,7 +445,7 @@ - + View Product @@ -462,7 +462,7 @@ - + View Product