diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 4da3b2f624d..b6eb9f69efa 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -213,7 +213,7 @@ class AccountInvoice(models.Model): move_name = fields.Char(string='Journal Entry Name', readonly=False, default=False, copy=False, help="Technical field holding the number given to the invoice, automatically set when the invoice is validated then stored to set the same number again if the invoice is cancelled, set to draft and re-validated.") - reference = fields.Char(string='Vendor Reference', + reference = fields.Char(string='Vendor Reference', copy=False, help="The partner reference of this invoice.", readonly=True, states={'draft': [('readonly', False)]}) reference_type = fields.Selection('_get_reference_type', string='Payment Reference', required=True, readonly=True, states={'draft': [('readonly', False)]}, diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py index c0430d720c9..3b0198b3f09 100644 --- a/addons/account/tests/test_reconciliation.py +++ b/addons/account/tests/test_reconciliation.py @@ -19,13 +19,14 @@ class TestReconciliation(AccountingTestCase): self.res_currency_model = self.registry('res.currency') self.res_currency_rate_model = self.registry('res.currency.rate') - self.partner_agrolait_id = self.env.ref("base.res_partner_2").id + partner_agrolait = self.env.ref("base.res_partner_2") + self.partner_agrolait_id = partner_agrolait.id self.currency_swiss_id = self.env.ref("base.CHF").id self.currency_usd_id = self.env.ref("base.USD").id self.currency_euro_id = self.env.ref("base.EUR").id self.env.ref('base.main_company').write({'currency_id': self.currency_euro_id}) - self.account_rcv = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1) - self.account_rsa = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_payable').id)], limit=1) + self.account_rcv = partner_agrolait.property_account_receivable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1) + self.account_rsa = partner_agrolait.property_account_payable_id or self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_payable').id)], limit=1) self.product = self.env.ref("product.product_product_4") self.bank_journal_euro = self.env['account.journal'].create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'}) diff --git a/addons/hr_attendance/models/hr_attendance.py b/addons/hr_attendance/models/hr_attendance.py index 76d442a4b67..1e43f98cd69 100644 --- a/addons/hr_attendance/models/hr_attendance.py +++ b/addons/hr_attendance/models/hr_attendance.py @@ -16,7 +16,8 @@ class HrAttendance(models.Model): return self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1) employee_id = fields.Many2one('hr.employee', string="Employee", default=_default_employee, required=True, ondelete='cascade', index=True) - department_id = fields.Many2one('hr.department', string="Department", related="employee_id.department_id") + department_id = fields.Many2one('hr.department', string="Department", related="employee_id.department_id", + readonly=True) check_in = fields.Datetime(string="Check In", default=fields.Datetime.now, required=True) check_out = fields.Datetime(string="Check Out") worked_hours = fields.Float(string='Worked Hours', compute='_compute_worked_hours', store=True, readonly=True) diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 43885b39768..27c1b8cfbcd 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -993,6 +993,7 @@ class ReportSaleDetails(models.AbstractModel): payments = [] return { + 'currency_precision': user_currency.decimal_places, 'total_paid': user_currency.round(total), 'payments': payments, 'company_name': self.env.user.company_id.name, diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js index 5d272bbfda8..e8bd95bc117 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -4,6 +4,7 @@ odoo.define('point_of_sale.devices', function (require) { var core = require('web.core'); var Model = require('web.DataModel'); var Session = require('web.Session'); +var PosBaseWidget = require('point_of_sale.BaseWidget'); var QWeb = core.qweb; var _t = core._t; @@ -440,6 +441,7 @@ var ProxyDevice = core.Class.extend(core.mixins.PropertiesMixin,{ var self = this; new Model('report.point_of_sale.report_saledetails').call('get_sale_details').then(function(result){ var env = { + widget: new PosBaseWidget(self), company: self.pos.company, pos: self.pos, products: result.products, diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js index d9fe56cd5e5..1dcbf9d90fb 100644 --- a/addons/point_of_sale/static/src/js/screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -980,6 +980,9 @@ var ProductScreenWidget = ScreenWidget.extend({ this.product_categories_widget.reset_category(); this.numpad.state.reset(); } + if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) { + this.chrome.widget.keyboard.connect($(this.el.querySelector('.searchbox input'))); + } }, close: function(){ @@ -1326,6 +1329,7 @@ var ClientListScreenWidget = ScreenWidget.extend({ // to maintain consistent scroll. display_client_details: function(visibility,partner,clickpos){ var self = this; + var searchbox = this.$('.searchbox input'); var contents = this.$('.client-details-contents'); var parent = this.$('.client-list').parent(); var scroll = parent.scrollTop(); @@ -1362,6 +1366,19 @@ var ClientListScreenWidget = ScreenWidget.extend({ this.details_visible = true; this.toggle_save_button(); } else if (visibility === 'edit') { + // Connect the keyboard to the edited field + if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) { + contents.off('click', '.detail'); + searchbox.off('click'); + contents.on('click', '.detail', function(ev){ + self.chrome.widget.keyboard.connect(ev.target); + self.chrome.widget.keyboard.show(); + }); + searchbox.on('click', function() { + self.chrome.widget.keyboard.connect($(this)); + }); + } + this.editing_client = true; contents.empty(); contents.append($(QWeb.render('ClientDetailsEdit',{widget:this,partner:partner}))); @@ -1404,6 +1421,9 @@ var ClientListScreenWidget = ScreenWidget.extend({ }, close: function(){ this._super(); + if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) { + this.chrome.widget.keyboard.hide(); + } }, }); gui.define_screen({name:'clientlist', widget: ClientListScreenWidget}); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index ee5bef3456d..c6627159262 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -900,7 +900,7 @@ - + @@ -914,7 +914,7 @@ - + @@ -925,7 +925,7 @@ Total: - + diff --git a/addons/point_of_sale/views/report_saledetails.xml b/addons/point_of_sale/views/report_saledetails.xml index 7894c3a4cef..c0301c80281 100644 --- a/addons/point_of_sale/views/report_saledetails.xml +++ b/addons/point_of_sale/views/report_saledetails.xml @@ -50,7 +50,7 @@ - + @@ -67,8 +67,8 @@ - - + + @@ -76,7 +76,7 @@

- Total: + Total:
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index c00834613a0..44967fb6901 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -283,7 +283,7 @@ class StockMove(models.Model): if propagated_date_field: current_date = datetime.strptime(move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT) new_date = datetime.strptime(vals.get(propagated_date_field), DEFAULT_SERVER_DATETIME_FORMAT) - delta = new_date - current_date + delta = relativedelta.relativedelta(new_date, current_date) if abs(delta.days) >= move.company_id.propagation_minimum_delta: old_move_date = datetime.strptime(move.move_dest_id.date_expected, DEFAULT_SERVER_DATETIME_FORMAT) new_move_date = (old_move_date + relativedelta.relativedelta(days=delta.days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) diff --git a/addons/web_editor/static/src/js/widgets.js b/addons/web_editor/static/src/js/widgets.js index d599859cf49..d08f70e2aea 100644 --- a/addons/web_editor/static/src/js/widgets.js +++ b/addons/web_editor/static/src/js/widgets.js @@ -875,7 +875,7 @@ var VideoDialog = Widget.extend({ this.$iframe = this.$("iframe"); var $media = $(this.media); if ($media.hasClass("media_iframe_video")) { - var src = $media.data('src'); + var src = $media.data('oe-expression') || $media.data('src'); this.$("input#urlvideo").val(src); this.$("input#autoplay").prop("checked", (src || "").indexOf("autoplay") >= 0); this.get_video(); diff --git a/doc/cla/individual/auyeung112002.md b/doc/cla/individual/auyeung112002.md new file mode 100644 index 00000000000..c56eb068b3e --- /dev/null +++ b/doc/cla/individual/auyeung112002.md @@ -0,0 +1,11 @@ +Hong Kong, 2017-6-9 + +I hereby agree to the terms of the Odoo Individual Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Jason auyeung112002@gmail.com https://github.com/auyeung112002 diff --git a/odoo/addons/base/res/res_lang.py b/odoo/addons/base/res/res_lang.py index 19a5b9be339..feac7e3053c 100644 --- a/odoo/addons/base/res/res_lang.py +++ b/odoo/addons/base/res/res_lang.py @@ -220,12 +220,11 @@ class Lang(models.Model): if self.env['res.users'].search([('lang', 'in', lang_codes)]): raise UserError(_("Cannot unactivate a language that is currently used by users.")) # delete linked ir.value specifying default partner's language - default_lang = self.env['ir.values'].search([ + self.env['ir.values'].search([ ('key', '=', 'default'), ('name', '=', 'lang'), - ('model', '=', 'res.partner')]) - if default_lang and default_lang.value_unpickle in lang_codes: - default_lang.unlink() + ('model', '=', 'res.partner') + ]).filtered(lambda l: l.value_unpickle in lang_codes).unlink() res = super(Lang, self).write(vals) self.clear_caches()