summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-01-10 17:59:26 +0100
committerChristophe Simonis <chs@odoo.com>2019-01-10 17:59:26 +0100
commitd11dc31e7ab553d2c0ae5eaaa59846b46d3cb20d (patch)
treed5f1798b695f1a9f46a0bddb0f2bb289ba9ed9de
parentb87879c1f64c91a925f4814a03687d717791346c (diff)
parent617652bbfed923934cb1d3b6185d302031f4af18 (diff)
[MERGE] forward port branch 11.0 up to 617652bbfed
-rw-r--r--addons/account/models/account_invoice.py4
-rw-r--r--addons/account/tests/test_account_customer_invoice.py63
-rw-r--r--addons/payment_authorize/models/authorize_request.py2
-rw-r--r--addons/point_of_sale/models/pos_order.py15
-rw-r--r--addons/point_of_sale/static/src/js/screens.js5
-rw-r--r--addons/sale_timesheet/static/src/js/timesheet_plan.js8
-rw-r--r--addons/stock/i18n/stock.pot10
-rw-r--r--addons/stock/models/stock_picking.py4
-rw-r--r--addons/stock/views/stock_picking_views.xml3
-rw-r--r--addons/website_sale/static/src/less/website_sale.less2
-rw-r--r--odoo/addons/base/models/res_users.py22
11 files changed, 118 insertions, 20 deletions
diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py
index 29adc16dfdf..9b32833e8b4 100644
--- a/addons/account/models/account_invoice.py
+++ b/addons/account/models/account_invoice.py
@@ -900,6 +900,7 @@ class AccountInvoice(models.Model):
@api.multi
def get_taxes_values(self):
tax_grouped = {}
+ round_curr = self.currency_id.round
for line in self.invoice_line_ids:
price_unit = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
taxes = line.invoice_line_tax_ids.compute_all(price_unit, self.currency_id, line.quantity, line.product_id, self.partner_id)['taxes']
@@ -909,9 +910,10 @@ class AccountInvoice(models.Model):
if key not in tax_grouped:
tax_grouped[key] = val
+ tax_grouped[key]['base'] = round_curr(val['base'])
else:
tax_grouped[key]['amount'] += val['amount']
- tax_grouped[key]['base'] += val['base']
+ tax_grouped[key]['base'] += round_curr(val['base'])
return tax_grouped
@api.multi
diff --git a/addons/account/tests/test_account_customer_invoice.py b/addons/account/tests/test_account_customer_invoice.py
index 0a4a58cbfb4..00f7d732699 100644
--- a/addons/account/tests/test_account_customer_invoice.py
+++ b/addons/account/tests/test_account_customer_invoice.py
@@ -104,3 +104,66 @@ class TestAccountCustomerInvoice(AccountTestUsers):
# I clicked on Add Credit Note button.
self.account_invoice_refund_0.invoice_refund()
+
+ def test_customer_invoice_tax(self):
+
+ self.env.user.company_id.tax_calculation_rounding_method = 'round_globally'
+
+ payment_term = self.env.ref('account.account_payment_term_advance')
+ journalrec = self.env['account.journal'].search([('type', '=', 'sale')])[0]
+ partner3 = self.env.ref('base.res_partner_3')
+ account_id = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id
+
+ tax = self.env['account.tax'].create({
+ 'name': 'Tax 15.0',
+ 'amount': 15.0,
+ 'amount_type': 'percent',
+ 'type_tax_use': 'sale',
+ })
+
+ invoice_line_data = [
+ (0, 0,
+ {
+ 'product_id': self.env.ref('product.product_product_1').id,
+ 'quantity': 40.0,
+ 'account_id': account_id,
+ 'name': 'product test 1',
+ 'discount' : 10.00,
+ 'price_unit': 2.27,
+ 'invoice_line_tax_ids': [(6, 0, [tax.id])],
+ }
+ ),
+ (0, 0,
+ {
+ 'product_id': self.env.ref('product.product_product_2').id,
+ 'quantity': 21.0,
+ 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
+ 'name': 'product test 2',
+ 'discount' : 10.00,
+ 'price_unit': 2.77,
+ 'invoice_line_tax_ids': [(6, 0, [tax.id])],
+ }
+ ),
+ (0, 0,
+ {
+ 'product_id': self.env.ref('product.product_product_3').id,
+ 'quantity': 21.0,
+ 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
+ 'name': 'product test 3',
+ 'discount' : 10.00,
+ 'price_unit': 2.77,
+ 'invoice_line_tax_ids': [(6, 0, [tax.id])],
+ }
+ )
+ ]
+
+ invoice = self.env['account.invoice'].create(dict(
+ name="Test Customer Invoice",
+ reference_type="none",
+ payment_term_id=payment_term.id,
+ journal_id=journalrec.id,
+ partner_id=partner3.id,
+ invoice_line_ids=invoice_line_data
+ ))
+
+ self.assertEquals(invoice.amount_untaxed, sum([x.base for x in invoice.tax_line_ids]))
diff --git a/addons/payment_authorize/models/authorize_request.py b/addons/payment_authorize/models/authorize_request.py
index ba5a14f7edd..d9b87437577 100644
--- a/addons/payment_authorize/models/authorize_request.py
+++ b/addons/payment_authorize/models/authorize_request.py
@@ -149,7 +149,7 @@ class AuthorizeAPI():
root = self._base_tree('createCustomerProfileRequest')
profile = etree.SubElement(root, "profile")
etree.SubElement(profile, "merchantCustomerId").text = 'ODOO-%s-%s' % (partner.id, uuid4().hex[:8])
- etree.SubElement(profile, "email").text = partner.email
+ etree.SubElement(profile, "email").text = partner.email or ''
payment_profile = etree.SubElement(profile, "paymentProfiles")
etree.SubElement(payment_profile, "customerType").text = 'business' if partner.is_company else 'individual'
billTo = etree.SubElement(payment_profile, "billTo")
diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py
index 9688aba93c8..1c93a0f816f 100644
--- a/addons/point_of_sale/models/pos_order.py
+++ b/addons/point_of_sale/models/pos_order.py
@@ -835,21 +835,18 @@ class PosOrder(models.Model):
lots_necessary = True
if picking_type:
lots_necessary = picking_type and picking_type.use_existing_lots
- qty = 0
qty_done = 0
pack_lots = []
pos_pack_lots = PosPackOperationLot.search([('order_id', '=', order.id), ('product_id', '=', move.product_id.id)])
- pack_lot_names = [pos_pack.lot_name for pos_pack in pos_pack_lots]
- if pack_lot_names and lots_necessary:
- for lot_name in list(set(pack_lot_names)):
- stock_production_lot = StockProductionLot.search([('name', '=', lot_name), ('product_id', '=', move.product_id.id)])
+ if pos_pack_lots and lots_necessary:
+ for pos_pack_lot in pos_pack_lots:
+ stock_production_lot = StockProductionLot.search([('name', '=', pos_pack_lot.lot_name), ('product_id', '=', move.product_id.id)])
if stock_production_lot:
+ # a serialnumber always has a quantity of 1 product, a lot number takes the full quantity of the order line
+ qty = 1.0
if stock_production_lot.product_id.tracking == 'lot':
- # if a lot nr is set through the frontend it will refer to the full quantity
- qty = move.product_uom_qty
- else: # serial numbers
- qty = 1.0
+ qty = pos_pack_lot.pos_order_line_id.qty
qty_done += qty
pack_lots.append({'lot_id': stock_production_lot.id, 'qty': qty})
else:
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index f4ff433bf71..139a05459f7 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -1959,16 +1959,11 @@ var PaymentScreenWidget = ScreenWidget.extend({
$('body').keypress(this.keyboard_handler);
// that one comes from the pos, but we prefer to cover all the basis
$('body').keydown(this.keyboard_keydown_handler);
- // legacy vanilla JS listeners
- window.document.body.addEventListener('keypress',this.keyboard_handler);
- window.document.body.addEventListener('keydown',this.keyboard_keydown_handler);
this._super();
},
hide: function(){
$('body').off('keypress', this.keyboard_handler);
$('body').off('keydown', this.keyboard_keydown_handler);
- window.document.body.removeEventListener('keypress',this.keyboard_handler);
- window.document.body.removeEventListener('keydown',this.keyboard_keydown_handler);
this._super();
},
// sets up listeners to watch for order changes
diff --git a/addons/sale_timesheet/static/src/js/timesheet_plan.js b/addons/sale_timesheet/static/src/js/timesheet_plan.js
index d657b421479..7415038db2d 100644
--- a/addons/sale_timesheet/static/src/js/timesheet_plan.js
+++ b/addons/sale_timesheet/static/src/js/timesheet_plan.js
@@ -107,7 +107,13 @@ var ProjectPlan = AbstractAction.extend(ControlPanelMixin, {
* @param {string|html} dom
*/
_refreshPlan: function (dom) {
- this.$el.html(dom);
+ // TODO: Not forward port this fix on master
+ var $dom = $(dom);
+ $dom.find('div.o_timesheet_plan_sale_timesheet_dashboard > table.table, ' +
+ 'div.o_timesheet_plan_sale_timesheet_people_time > table.table, ' +
+ 'div.o_project_plan_project_timesheet_forecast > table.table')
+ .wrap('<div class="table-responsive"></div>');
+ this.$el.html($dom);
},
/**
* Call controller to get the html content
diff --git a/addons/stock/i18n/stock.pot b/addons/stock/i18n/stock.pot
index 14c13da3e5b..cd87992f37e 100644
--- a/addons/stock/i18n/stock.pot
+++ b/addons/stock/i18n/stock.pot
@@ -498,6 +498,16 @@ msgid "Assign Owner"
msgstr ""
#. module: stock
+#: model:ir.ui.view,arch_db:stock.view_picking_form
+msgid "Assign Partner"
+msgstr ""
+
+#. module: stock
+#: model:ir.ui.view,arch_db:stock.view_picking_form
+msgid "Assign the partner to the Operations. Use only if the partner is manually changed!"
+msgstr ""
+
+#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_internal_search
msgid "Assigned Moves"
msgstr ""
diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py
index 48395898b48..c8341ee3102 100644
--- a/addons/stock/models/stock_picking.py
+++ b/addons/stock/models/stock_picking.py
@@ -549,6 +549,10 @@ class Picking(models.Model):
def action_assign_owner(self):
self.move_line_ids.write({'owner_id': self.owner_id.id})
+ def action_assign_partner(self):
+ for picking in self:
+ picking.move_lines.write({'partner_id': picking.partner_id.id})
+
@api.multi
def do_print_picking(self):
self.write({'printed': True})
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index c16fc171d03..b28527c7623 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -240,6 +240,9 @@
<group>
<group>
<field name="partner_id" attrs="{'invisible': [('picking_type_code', '=', 'internal')]}"/>
+ <button name="action_assign_partner" string="Assign Partner" type="object" help="Assign the partner to the Operations. Use only if the partner is manually changed!"
+ attrs="{'invisible': ['|', '|', ('move_line_exist', '=', False), ('state', 'not in', ('draft', 'assigned', 'confirmed')), ('picking_type_code', '=', 'internal')]}"
+ class="oe_link oe_edit_only"/>
<field name="location_id" groups="stock.group_stock_multi_locations" attrs="{'invisible': [('picking_type_code', '=', 'incoming')]}"/>
<field name="location_dest_id" groups="stock.group_stock_multi_locations" attrs="{'invisible': [('picking_type_code', '=', 'outgoing')]}"/>
<field name="backorder_id" readonly="1" attrs="{'invisible': [('backorder_id','=',False)]}"/>
diff --git a/addons/website_sale/static/src/less/website_sale.less b/addons/website_sale/static/src/less/website_sale.less
index 77228b7e538..05acfe2c62b 100644
--- a/addons/website_sale/static/src/less/website_sale.less
+++ b/addons/website_sale/static/src/less/website_sale.less
@@ -859,7 +859,7 @@ a.no-decoration {
.o_website_sale_animate {
opacity: 0.7;
- position: absolute;
+ position: absolute !important;
height: 150px;
width: 150px;
z-index: 1020;
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index 84d740ded24..4949ce9cb42 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -675,8 +675,26 @@ class GroupsImplied(models.Model):
if values.get('users') or values.get('implied_ids'):
# add all implied groups (to all users of each group)
for group in self:
- vals = {'users': list(pycompat.izip(repeat(4), group.with_context(active_test=False).users.ids))}
- super(GroupsImplied, group.trans_implied_ids).write(vals)
+ self._cr.execute("""
+ WITH RECURSIVE group_imply(gid, hid) AS (
+ SELECT gid, hid
+ FROM res_groups_implied_rel
+ UNION
+ SELECT i.gid, r.hid
+ FROM res_groups_implied_rel r
+ JOIN group_imply i ON (i.hid = r.gid)
+ )
+ INSERT INTO res_groups_users_rel (gid, uid)
+ SELECT i.hid, r.uid
+ FROM group_imply i, res_groups_users_rel r
+ WHERE r.gid = i.gid
+ AND i.gid = %(gid)s
+ EXCEPT
+ SELECT r.gid, r.uid
+ FROM res_groups_users_rel r
+ JOIN group_imply i ON (r.gid = i.hid)
+ WHERE i.gid = %(gid)s
+ """, dict(gid=group.id))
return res