[MERGE] forward port of branch saas-3 up to 6b70b80
This commit is contained in:
commit
3540ec53e4
|
@ -130,15 +130,32 @@ class account_config_settings(osv.osv_memory):
|
||||||
type='many2one',
|
type='many2one',
|
||||||
relation='account.account',
|
relation='account.account',
|
||||||
string="Gain Exchange Rate Account",
|
string="Gain Exchange Rate Account",
|
||||||
domain="[('type', '=', 'other')]"),
|
domain="[('type', '=', 'other'), ('company_id', '=', company_id)]]"),
|
||||||
'expense_currency_exchange_account_id': fields.related(
|
'expense_currency_exchange_account_id': fields.related(
|
||||||
'company_id', 'expense_currency_exchange_account_id',
|
'company_id', 'expense_currency_exchange_account_id',
|
||||||
type="many2one",
|
type="many2one",
|
||||||
relation='account.account',
|
relation='account.account',
|
||||||
string="Loss Exchange Rate 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):
|
def _default_company(self, cr, uid, context=None):
|
||||||
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||||
return user.company_id.id
|
return user.company_id.id
|
||||||
|
|
|
@ -574,7 +574,7 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
|
||||||
((
|
((
|
||||||
select
|
select
|
||||||
min(hrt.id) as id,
|
min(hrt.id) as id,
|
||||||
'UTC' as timezone,
|
p.tz as timezone,
|
||||||
l.date::date as name,
|
l.date::date as name,
|
||||||
s.id as sheet_id,
|
s.id as sheet_id,
|
||||||
sum(l.unit_amount) as total_timesheet,
|
sum(l.unit_amount) as total_timesheet,
|
||||||
|
@ -584,6 +584,10 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
|
||||||
hr_analytic_timesheet hrt
|
hr_analytic_timesheet hrt
|
||||||
JOIN account_analytic_line l ON l.id = hrt.line_id
|
JOIN account_analytic_line l ON l.id = hrt.line_id
|
||||||
LEFT JOIN hr_timesheet_sheet_sheet s ON s.id = hrt.sheet_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
|
group by l.date::date, s.id, timezone
|
||||||
) union (
|
) union (
|
||||||
select
|
select
|
||||||
|
|
|
@ -194,13 +194,10 @@ class account_invoice(osv.osv):
|
||||||
reference_type = vals['reference_type']
|
reference_type = vals['reference_type']
|
||||||
else:
|
else:
|
||||||
reference_type = inv.reference_type or ''
|
reference_type = inv.reference_type or ''
|
||||||
if reference_type == 'bba':
|
|
||||||
if vals.has_key('reference'):
|
if reference_type == 'bba' and 'reference' in vals:
|
||||||
bbacomm = vals['reference']
|
if self.check_bbacomm(vals['reference']):
|
||||||
else:
|
reference = re.sub('\D', '', vals['reference'])
|
||||||
bbacomm = inv.reference or ''
|
|
||||||
if self.check_bbacomm(bbacomm):
|
|
||||||
reference = re.sub('\D', '', bbacomm)
|
|
||||||
vals['reference'] = '+++' + reference[0:3] + '/' + reference[3:7] + '/' + reference[7:] + '+++'
|
vals['reference'] = '+++' + reference[0:3] + '/' + reference[3:7] + '/' + reference[7:] + '+++'
|
||||||
same_ids = self.search(cr, uid,
|
same_ids = self.search(cr, uid,
|
||||||
[('id', '!=', inv.id), ('type', '=', 'out_invoice'),
|
[('id', '!=', inv.id), ('type', '=', 'out_invoice'),
|
||||||
|
|
|
@ -1821,7 +1821,17 @@ class mail_thread(osv.AbstractModel):
|
||||||
('model', '=', self._name),
|
('model', '=', self._name),
|
||||||
('res_id', '=', record_id)], limit=1, context=context)
|
('res_id', '=', record_id)], limit=1, context=context)
|
||||||
if msg_ids:
|
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):
|
def message_auto_subscribe(self, cr, uid, ids, updated_fields, context=None, values=None):
|
||||||
""" Handle auto subscription. Two methods for auto subscription exist:
|
""" 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)
|
self._message_auto_subscribe_notify(cr, uid, ids, user_pids, context=context)
|
||||||
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
|
|
|
@ -97,6 +97,16 @@ class mrp_workcenter(osv.osv):
|
||||||
value = {'costs_hour': cost.standard_price}
|
value = {'costs_hour': cost.standard_price}
|
||||||
return {'value': value}
|
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):
|
class mrp_routing(osv.osv):
|
||||||
"""
|
"""
|
||||||
For specifying the routings of Work Centers.
|
For specifying the routings of Work Centers.
|
||||||
|
|
|
@ -387,7 +387,7 @@
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
<page string="Properties" groups="product.group_mrp_properties">
|
<page string="Properties">
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="position"/>
|
<field name="position"/>
|
||||||
|
@ -401,8 +401,8 @@
|
||||||
<field name="product_efficiency"/>
|
<field name="product_efficiency"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<separator string="Properties"/>
|
<separator string="Properties" groups="product.group_mrp_properties"/>
|
||||||
<field name="property_ids" widget="many2many_tags"/>
|
<field name="property_ids" widget="many2many_tags" groups="product.group_mrp_properties"/>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
<div class="oe_chatter">
|
<div class="oe_chatter">
|
||||||
|
|
|
@ -105,7 +105,7 @@ class sale_advance_payment_inv(osv.osv_memory):
|
||||||
raise osv.except_osv(_('Incorrect Data'),
|
raise osv.except_osv(_('Incorrect Data'),
|
||||||
_('The value of Advance Amount must be positive.'))
|
_('The value of Advance Amount must be positive.'))
|
||||||
if wizard.advance_payment_method == 'percentage':
|
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'):
|
if not res.get('name'):
|
||||||
res['name'] = self._translate_advance(cr, uid, percentage=True, context=dict(context, lang=sale.partner_id.lang)) % (wizard.amount)
|
res['name'] = self._translate_advance(cr, uid, percentage=True, context=dict(context, lang=sale.partner_id.lang)) % (wizard.amount)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -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) {
|
if (form_invalid) {
|
||||||
self.set({'display_invalid_fields': true});
|
self.set({'display_invalid_fields': true});
|
||||||
first_invalid_field.focus();
|
first_invalid_field.focus();
|
||||||
|
|
|
@ -893,6 +893,8 @@ class users_view(osv.osv):
|
||||||
def fields_get(self, cr, uid, allfields=None, context=None, write_access=True, attributes=None):
|
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)
|
res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access, attributes)
|
||||||
# add reified groups fields
|
# 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):
|
for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context):
|
||||||
if kind == 'selection':
|
if kind == 'selection':
|
||||||
# selection group field
|
# selection group field
|
||||||
|
|
Loading…
Reference in New Issue