diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index e2609fe8e06..7fdc8935f4b 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -219,7 +219,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 35e557769f4..b1bb88bb3ec 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -995,6 +995,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 0317ad5e16d..bf11db31bf2 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -5,6 +5,7 @@ var core = require('web.core'); var mixins = require('web.mixins'); var rpc = require('web.rpc'); var Session = require('web.Session'); +var PosBaseWidget = require('point_of_sale.BaseWidget'); var QWeb = core.qweb; var _t = core._t; @@ -447,6 +448,7 @@ var ProxyDevice = core.Class.extend(mixins.PropertiesMixin,{ }) .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 65e4de7faa1..246028a9fdb 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(){ @@ -1330,6 +1333,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(); @@ -1366,6 +1370,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}))); @@ -1408,6 +1425,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 86cd7fab263..0c18994a3bd 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -915,7 +915,7 @@ - + @@ -929,7 +929,7 @@ - + @@ -940,7 +940,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 5fc48b38071..8d959c9ee20 100644 --- a/addons/web_editor/static/src/js/widgets.js +++ b/addons/web_editor/static/src/js/widgets.js @@ -876,7 +876,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()