diff --git a/addons/account/res_config.py b/addons/account/res_config.py index 3f3e1563b14..bc449209e28 100644 --- a/addons/account/res_config.py +++ b/addons/account/res_config.py @@ -129,16 +129,33 @@ class account_config_settings(osv.osv_memory): 'company_id', 'income_currency_exchange_account_id', type='many2one', relation='account.account', - string="Gain Exchange Rate Account", - domain="[('type', '=', 'other')]"), + string="Gain Exchange Rate Account", + domain="[('type', '=', 'other'), ('company_id', '=', company_id)]]"), 'expense_currency_exchange_account_id': fields.related( 'company_id', 'expense_currency_exchange_account_id', type="many2one", relation='account.account', string="Loss Exchange Rate Account", - domain="[('type', '=', 'other')]"), + domain="[('type', '=', 'other'), ('company_id', '=', company_id)]]"), } + def _check_account_gain(self, cr, uid, ids, context=None): + for obj in self.browse(cr, uid, ids, context=context): + if obj.income_currency_exchange_account_id.company_id and obj.company_id != obj.income_currency_exchange_account_id.company_id: + return False + return True + + def _check_account_loss(self, cr, uid, ids, context=None): + for obj in self.browse(cr, uid, ids, context=context): + if obj.expense_currency_exchange_account_id.company_id and obj.company_id != obj.expense_currency_exchange_account_id.company_id: + return False + return True + + _constraints = [ + (_check_account_gain, 'The company of the gain exchange rate account must be the same than the company selected.', ['income_currency_exchange_account_id']), + (_check_account_loss, 'The company of the loss exchange rate account must be the same than the company selected.', ['expense_currency_exchange_account_id']), + ] + def _default_company(self, cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) return user.company_id.id diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 71315c2fd90..cb2b9f94046 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -574,7 +574,7 @@ class hr_timesheet_sheet_sheet_day(osv.osv): (( select min(hrt.id) as id, - 'UTC' as timezone, + p.tz as timezone, l.date::date as name, s.id as sheet_id, sum(l.unit_amount) as total_timesheet, @@ -584,6 +584,10 @@ class hr_timesheet_sheet_sheet_day(osv.osv): hr_analytic_timesheet hrt JOIN account_analytic_line l ON l.id = hrt.line_id LEFT JOIN hr_timesheet_sheet_sheet s ON s.id = hrt.sheet_id + JOIN hr_employee e ON s.employee_id = e.id + JOIN resource_resource r ON e.resource_id = r.id + LEFT JOIN res_users u ON r.user_id = u.id + LEFT JOIN res_partner p ON u.partner_id = p.id group by l.date::date, s.id, timezone ) union ( select diff --git a/addons/l10n_be_invoice_bba/invoice.py b/addons/l10n_be_invoice_bba/invoice.py index fdba030fb7c..a84b783372e 100644 --- a/addons/l10n_be_invoice_bba/invoice.py +++ b/addons/l10n_be_invoice_bba/invoice.py @@ -194,13 +194,10 @@ class account_invoice(osv.osv): reference_type = vals['reference_type'] else: reference_type = inv.reference_type or '' - if reference_type == 'bba': - if vals.has_key('reference'): - bbacomm = vals['reference'] - else: - bbacomm = inv.reference or '' - if self.check_bbacomm(bbacomm): - reference = re.sub('\D', '', bbacomm) + + if reference_type == 'bba' and 'reference' in vals: + if self.check_bbacomm(vals['reference']): + reference = re.sub('\D', '', vals['reference']) vals['reference'] = '+++' + reference[0:3] + '/' + reference[3:7] + '/' + reference[7:] + '+++' same_ids = self.search(cr, uid, [('id', '!=', inv.id), ('type', '=', 'out_invoice'), diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 2fe15d0e53f..0e741536765 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -1821,7 +1821,17 @@ class mail_thread(osv.AbstractModel): ('model', '=', self._name), ('res_id', '=', record_id)], limit=1, context=context) if msg_ids: - self.pool.get('mail.notification')._notify(cr, uid, msg_ids[0], partners_to_notify=partner_ids, context=context) + notification_obj = self.pool.get('mail.notification') + notification_obj._notify(cr, uid, msg_ids[0], partners_to_notify=partner_ids, context=context) + message = message_obj.browse(cr, uid, msg_ids[0], context=context) + if message.parent_id: + partner_ids_to_parent_notify = set(partner_ids).difference(partner.id for partner in message.parent_id.notified_partner_ids) + for partner_id in partner_ids_to_parent_notify: + notification_obj.create(cr, uid, { + 'message_id': message.parent_id.id, + 'partner_id': partner_id, + 'read': True, + }, context=context) def message_auto_subscribe(self, cr, uid, ids, updated_fields, context=None, values=None): """ Handle auto subscription. Two methods for auto subscription exist: @@ -1903,6 +1913,7 @@ class mail_thread(osv.AbstractModel): self._message_auto_subscribe_notify(cr, uid, ids, user_pids, context=context) + return True #------------------------------------------------------ diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index f5bf9dd2add..3ca55e3efb0 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -97,6 +97,16 @@ class mrp_workcenter(osv.osv): value = {'costs_hour': cost.standard_price} return {'value': value} + def _check_capacity_per_cycle(self, cr, uid, ids, context=None): + for obj in self.browse(cr, uid, ids, context=context): + if obj.capacity_per_cycle <= 0.0: + return False + return True + + _constraints = [ + (_check_capacity_per_cycle, 'The capacity per cycle must be strictly positive.', ['capacity_per_cycle']), + ] + class mrp_routing(osv.osv): """ For specifying the routings of Work Centers. diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index 228386a0578..2689389d979 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -387,7 +387,7 @@ - + @@ -401,8 +401,8 @@ - - + +
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index 3c2b76d599a..ef88ed3e76c 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -105,7 +105,7 @@ class sale_advance_payment_inv(osv.osv_memory): raise osv.except_osv(_('Incorrect Data'), _('The value of Advance Amount must be positive.')) if wizard.advance_payment_method == 'percentage': - inv_amount = sale.amount_total * wizard.amount / 100 + inv_amount = sale.amount_untaxed * wizard.amount / 100 if not res.get('name'): res['name'] = self._translate_advance(cr, uid, percentage=True, context=dict(context, lang=sale.partner_id.lang)) % (wizard.amount) else: diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ca401a34179..97fc997d861 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -852,6 +852,16 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } } } + // Heuristic to assign a proper sequence number for new records that + // are added in a dataset containing other lines with existing sequence numbers + if (!self.datarecord.id && self.fields.sequence && + !_.has(values, 'sequence') && !_.isEmpty(self.dataset.cache)) { + // Find current max or min sequence (editable top/bottom) + var current = _[prepend_on_create ? "min" : "max"]( + _.map(self.dataset.cache, function(o){return o.values.sequence}) + ); + values['sequence'] = prepend_on_create ? current - 1 : current + 1; + } if (form_invalid) { self.set({'display_invalid_fields': true}); first_invalid_field.focus(); diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index b5caa949f9a..6ef7e0b4792 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -893,6 +893,8 @@ class users_view(osv.osv): def fields_get(self, cr, uid, allfields=None, context=None, write_access=True, attributes=None): res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access, attributes) # add reified groups fields + if uid != SUPERUSER_ID and not self.pool['res.users'].has_group(cr, uid, 'base.group_erp_manager'): + return res for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context): if kind == 'selection': # selection group field