diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-01-10 17:59:26 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-01-10 17:59:26 +0100 |
| commit | d11dc31e7ab553d2c0ae5eaaa59846b46d3cb20d (patch) | |
| tree | d5f1798b695f1a9f46a0bddb0f2bb289ba9ed9de | |
| parent | b87879c1f64c91a925f4814a03687d717791346c (diff) | |
| parent | 617652bbfed923934cb1d3b6185d302031f4af18 (diff) | |
[MERGE] forward port branch 11.0 up to 617652bbfed
| -rw-r--r-- | addons/account/models/account_invoice.py | 4 | ||||
| -rw-r--r-- | addons/account/tests/test_account_customer_invoice.py | 63 | ||||
| -rw-r--r-- | addons/payment_authorize/models/authorize_request.py | 2 | ||||
| -rw-r--r-- | addons/point_of_sale/models/pos_order.py | 15 | ||||
| -rw-r--r-- | addons/point_of_sale/static/src/js/screens.js | 5 | ||||
| -rw-r--r-- | addons/sale_timesheet/static/src/js/timesheet_plan.js | 8 | ||||
| -rw-r--r-- | addons/stock/i18n/stock.pot | 10 | ||||
| -rw-r--r-- | addons/stock/models/stock_picking.py | 4 | ||||
| -rw-r--r-- | addons/stock/views/stock_picking_views.xml | 3 | ||||
| -rw-r--r-- | addons/website_sale/static/src/less/website_sale.less | 2 | ||||
| -rw-r--r-- | odoo/addons/base/models/res_users.py | 22 |
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 |
