diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-06-06 15:46:36 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-06-06 15:46:36 +0200 |
| commit | 969eb3fa2f9fe78e3f01a6d4caca1aeae753c58c (patch) | |
| tree | 25e7833ea517141e4e900305288e1c242dabac46 | |
| parent | 976499ac782f9704bf1eb26067b5c4b3a9b22b24 (diff) | |
| parent | c834c0f5879c0e5023645b4a8a57c1b19a9eee18 (diff) | |
[MERGE] forward port branch saas-11.2 up to c834c0f5879
64 files changed, 929 insertions, 318 deletions
diff --git a/addons/account/data/mail_template_data.xml b/addons/account/data/mail_template_data.xml index f461a271452..4bb340a4f5c 100644 --- a/addons/account/data/mail_template_data.xml +++ b/addons/account/data/mail_template_data.xml @@ -7,7 +7,7 @@ <!--Email template --> <record id="email_template_edi_invoice" model="mail.template"> <field name="name">Invoicing: Invoice email</field> - <field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field> + <field name="email_from">${(object.user_id.email and '"%s" <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field> <field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})</field> <field name="partner_to">${object.partner_id.id}</field> <field name="model_id" ref="account.model_account_invoice"/> diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 905f10f4334..020d725e3ca 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -1374,8 +1374,6 @@ class AccountInvoice(models.Model): else: payment_method = self.env.ref('account.account_payment_method_manual_out') journal_payment_methods = pay_journal.outbound_payment_method_ids - if payment_method not in journal_payment_methods: - raise UserError(_('No appropriate payment method enabled on journal %s') % pay_journal.name) communication = self.type in ('in_invoice', 'in_refund') and self.reference or self.number if self.origin: diff --git a/addons/account/models/company.py b/addons/account/models/company.py index 8ae4230a7b2..0209ea5c849 100644 --- a/addons/account/models/company.py +++ b/addons/account/models/company.py @@ -2,10 +2,12 @@ from datetime import timedelta, datetime import calendar +import time +from dateutil.relativedelta import relativedelta from odoo import fields, models, api, _ from odoo.exceptions import ValidationError, UserError -from odoo.exceptions import UserError +from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT from odoo.tools.float_utils import float_round, float_is_zero @@ -63,6 +65,61 @@ Best Regards,''')) account_setup_coa_done = fields.Boolean(string='Chart of Account Checked', help="Technical field holding the status of the chart of account setup step.") account_setup_bar_closed = fields.Boolean(string='Setup Bar Closed', help="Technical field set to True when setup bar has been closed by the user.") + @api.multi + def _check_lock_dates(self, vals): + '''Check the lock dates for the current companies. This can't be done in a api.constrains because we need + to perform some comparison between new/old values. This method forces the lock dates to be irreversible. + + * You cannot define stricter conditions on advisors than on users. Then, the lock date on advisor must be set + after the lock date for users. + * You cannot lock a period that is not finished yet. Then, the lock date for advisors must be set after the + last day of the previous month. + * The new lock date for advisors must be set after the previous lock date. + + :param vals: The values passed to the write method. + ''' + period_lock_date = vals.get('period_lock_date') and\ + time.strptime(vals['period_lock_date'], DEFAULT_SERVER_DATE_FORMAT) + fiscalyear_lock_date = vals.get('fiscalyear_lock_date') and\ + time.strptime(vals['fiscalyear_lock_date'], DEFAULT_SERVER_DATE_FORMAT) + + previous_month = datetime.strptime(fields.Date.today(), DEFAULT_SERVER_DATE_FORMAT) + relativedelta(months=-1) + days_previous_month = calendar.monthrange(previous_month.year, previous_month.month) + previous_month = previous_month.replace(day=days_previous_month[1]).timetuple() + for company in self: + old_fiscalyear_lock_date = company.fiscalyear_lock_date and\ + time.strptime(company.fiscalyear_lock_date, DEFAULT_SERVER_DATE_FORMAT) + + # The user attempts to remove the lock date for advisors + if old_fiscalyear_lock_date and not fiscalyear_lock_date and 'fiscalyear_lock_date' in vals: + raise ValidationError(_('The lock date for advisors is irreversible and can\'t be removed.')) + + # The user attempts to set a lock date for advisors prior to the previous one + if old_fiscalyear_lock_date and fiscalyear_lock_date and fiscalyear_lock_date < old_fiscalyear_lock_date: + raise ValidationError(_('The new lock date for advisors must be set after the previous lock date.')) + + # In case of no new fiscal year in vals, fallback to the oldest + if not fiscalyear_lock_date: + if old_fiscalyear_lock_date: + fiscalyear_lock_date = old_fiscalyear_lock_date + else: + continue + + # The user attempts to set a lock date for advisors prior to the last day of previous month + if fiscalyear_lock_date > previous_month: + raise ValidationError(_('You cannot lock a period that is not finished yet. Please make sure that the lock date for advisors is not set after the last day of the previous month.')) + + # In case of no new period lock date in vals, fallback to the one defined in the company + if not period_lock_date: + if company.period_lock_date: + period_lock_date = time.strptime(company.period_lock_date, DEFAULT_SERVER_DATE_FORMAT) + else: + continue + + # The user attempts to set a lock date for advisors prior to the lock date for users + if period_lock_date < fiscalyear_lock_date: + raise ValidationError(_('You cannot define stricter conditions on advisors than on users. Please make sure that the lock date on advisor is set before the lock date for users.')) + @api.model def _verify_fiscalyear_last_day(self, company_id, last_day, last_month): company = self.browse(company_id) diff --git a/addons/account/tests/test_account_move_closed_period.py b/addons/account/tests/test_account_move_closed_period.py index 298738a0d6c..5de3e97ac4f 100644 --- a/addons/account/tests/test_account_move_closed_period.py +++ b/addons/account/tests/test_account_move_closed_period.py @@ -1,6 +1,8 @@ from odoo.addons.account.tests.account_test_classes import AccountingTestCase from odoo.osv.orm import except_orm -from datetime import datetime, timedelta +from datetime import datetime +from dateutil.relativedelta import relativedelta +from calendar import monthrange from odoo.tools import DEFAULT_SERVER_DATE_FORMAT from odoo.tests import tagged @@ -14,14 +16,16 @@ class TestPeriodState(AccountingTestCase): def setUp(self): super(TestPeriodState, self).setUp() self.user_id = self.env.user - self.day_before_yesterday = datetime.now() - timedelta(2) - self.yesterday = datetime.now() - timedelta(1) - self.yesterday_str = self.yesterday.strftime(DEFAULT_SERVER_DATE_FORMAT) + + last_day_month = datetime.now() - relativedelta(months=1) + last_day_month = last_day_month.replace(day=monthrange(last_day_month.year, last_day_month.month)[1]) + self.last_day_month_str = last_day_month.strftime(DEFAULT_SERVER_DATE_FORMAT) + #make sure there is no unposted entry - draft_entries = self.env['account.move'].search([('date', '<=', self.yesterday_str), ('state', '=', 'draft')]) + draft_entries = self.env['account.move'].search([('date', '<=', self.last_day_month_str), ('state', '=', 'draft')]) if draft_entries: draft_entries.post() - self.user_id.company_id.write({'fiscalyear_lock_date': self.yesterday_str}) + self.user_id.company_id.fiscalyear_lock_date = self.last_day_month_str self.sale_journal_id = self.env['account.journal'].search([('type', '=', 'sale')])[0] self.account_id = self.env['account.account'].search([('internal_type', '=', 'receivable')])[0] @@ -30,7 +34,7 @@ class TestPeriodState(AccountingTestCase): move = self.env['account.move'].create({ 'name': '/', 'journal_id': self.sale_journal_id.id, - 'date': self.day_before_yesterday.strftime(DEFAULT_SERVER_DATE_FORMAT), + 'date': self.last_day_month_str, 'line_ids': [(0, 0, { 'name': 'foo', 'debit': 10, diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py index 4a50c812620..1fce897b602 100644 --- a/addons/account/tests/test_reconciliation.py +++ b/addons/account/tests/test_reconciliation.py @@ -42,6 +42,12 @@ class TestReconciliation(AccountingTestCase): self.diff_income_account = self.env['res.users'].browse(self.env.uid).company_id.income_currency_exchange_account_id self.diff_expense_account = self.env['res.users'].browse(self.env.uid).company_id.expense_currency_exchange_account_id + self.inbound_payment_method = self.env['account.payment.method'].create({ + 'name': 'inbound', + 'code': 'IN', + 'payment_type': 'inbound', + }) + def create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None): #we create an invoice in given currency invoice = self.account_invoice_model.create({'partner_id': self.partner_agrolait_id, @@ -709,6 +715,49 @@ class TestReconciliation(AccountingTestCase): credit_aml.with_context(invoice_id=inv.id).remove_move_reconcile() self.assertAlmostEquals(inv.residual, 111) + def test_revert_payment_and_reconcile(self): + payment = self.env['account.payment'].create({ + 'payment_method_id': self.inbound_payment_method.id, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': self.partner_agrolait_id, + 'journal_id': self.bank_journal_usd.id, + 'payment_date': '2018-06-04', + 'amount': 666, + }) + payment.post() + + self.assertEqual(len(payment.move_line_ids), 2) + + bank_line = payment.move_line_ids.filtered(lambda l: l.account_id.id == self.bank_journal_usd.default_debit_account_id.id) + customer_line = payment.move_line_ids - bank_line + + self.assertEqual(len(bank_line), 1) + self.assertEqual(len(customer_line), 1) + self.assertNotEqual(bank_line.id, customer_line.id) + + self.assertEqual(bank_line.move_id.id, customer_line.move_id.id) + move = bank_line.move_id + + # Reversing the payment's move + reversed_move_list = move.reverse_moves('2018-06-04') + self.assertEqual(len(reversed_move_list), 1) + reversed_move = self.env['account.move'].browse(reversed_move_list[0]) + + self.assertEqual(len(reversed_move.line_ids), 2) + + # Testing the reconciliation matching between the move lines and their reversed counterparts + reversed_bank_line = reversed_move.line_ids.filtered(lambda l: l.account_id.id == self.bank_journal_usd.default_debit_account_id.id) + reversed_customer_line = reversed_move.line_ids - reversed_bank_line + + self.assertEqual(len(reversed_bank_line), 1) + self.assertEqual(len(reversed_customer_line), 1) + self.assertNotEqual(reversed_bank_line.id, reversed_customer_line.id) + self.assertEqual(reversed_bank_line.move_id.id, reversed_customer_line.move_id.id) + + self.assertEqual(reversed_bank_line.full_reconcile_id.id, bank_line.full_reconcile_id.id) + self.assertEqual(reversed_customer_line.full_reconcile_id.id, customer_line.full_reconcile_id.id) + def test_partial_reconcile_currencies_02(self): #### # Day 1: Invoice Cust/001 to customer (expressed in USD) diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml index 00b716edb51..503ac0bd0a7 100644 --- a/addons/account/views/account_view.xml +++ b/addons/account/views/account_view.xml @@ -1166,7 +1166,8 @@ <group> <field name="name"/> <field name="partner_id" - domain="['|', ('parent_id', '=', False), ('is_company', '=', True)]"/> + domain="['|', ('parent_id', '=', False), ('is_company', '=', True)]" + attrs="{'readonly': [('parent_state', '=', 'posted')]}"/> </group> <notebook colspan="4"> <page string="Information"> diff --git a/addons/account_lock/__init__.py b/addons/account_lock/__init__.py new file mode 100644 index 00000000000..cde864bae21 --- /dev/null +++ b/addons/account_lock/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/addons/account_lock/__manifest__.py b/addons/account_lock/__manifest__.py new file mode 100644 index 00000000000..67e76b49098 --- /dev/null +++ b/addons/account_lock/__manifest__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name' : 'Irreversible Lock Date', + 'version' : '1.0', + 'category': 'Accounting', + 'description': """ + Make the lock date irreversible: + + * You cannot define stricter conditions on advisors than on users. Then, the lock date on advisor must be set before the lock date for users. + * You cannot lock a period that is not finished yet. Then, the lock date for advisors must be set before the last day of the previous month. + * The new lock date for advisors must be set after the previous lock date. + """, + 'depends' : ['account'], + 'data': [], +} diff --git a/addons/account_lock/models/__init__.py b/addons/account_lock/models/__init__.py new file mode 100644 index 00000000000..e759f74fc8d --- /dev/null +++ b/addons/account_lock/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import res_company diff --git a/addons/account_lock/models/res_company.py b/addons/account_lock/models/res_company.py new file mode 100644 index 00000000000..5a01046f36b --- /dev/null +++ b/addons/account_lock/models/res_company.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from odoo import models, api + + +class ResCompany(models.Model): + _inherit = 'res.company' + + @api.multi + def write(self, vals): + # fiscalyear_lock_date can't be set to a prior date + if 'fiscalyear_lock_date' in vals or 'period_lock_date' in vals: + self._check_lock_dates(vals) + return super(ResCompany, self).write(vals) diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py index 9cd801144e8..7096852528c 100644 --- a/addons/analytic/models/analytic_account.py +++ b/addons/analytic/models/analytic_account.py @@ -97,6 +97,7 @@ class AccountAnalyticAccount(models.Model): domain=domain + [('amount', '>=', 0.0)], fields=['account_id', 'currency_id', 'amount'], groupby=['account_id', 'currency_id'], + lazy=False, ) data_credit = defaultdict(float) for l in credit_groups: @@ -106,6 +107,7 @@ class AccountAnalyticAccount(models.Model): domain=domain + [('amount', '<', 0.0)], fields=['account_id', 'currency_id', 'amount'], groupby=['account_id', 'currency_id'], + lazy=False, ) data_debit = defaultdict(float) for l in debit_groups: diff --git a/addons/barcodes/static/src/js/barcode_events.js b/addons/barcodes/static/src/js/barcode_events.js index a2e5808f8be..2d602a36b97 100644 --- a/addons/barcodes/static/src/js/barcode_events.js +++ b/addons/barcodes/static/src/js/barcode_events.js @@ -64,12 +64,14 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { 'position': 'fixed', 'top': '50%', 'transform': 'translateY(-50%)', - 'opacity': 0, + 'z-index': '-1', }, }); + // Avoid to show autocomplete for a non appearing input + this.$barcodeInput.attr('autocomplete', 'off'); } - this.__removeBarcodeField = _.debounce(this._removeBarcodeField, this.inputTimeOut); + this.__blurBarcodeInput = _.debounce(this._blurBarcodeInput, this.inputTimeOut); }, handle_buffered_keys: function() { @@ -232,7 +234,7 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { this.max_time_between_keys_in_ms); } // if the barcode input doesn't receive keydown for a while, remove it. - this.__removeBarcodeField(); + this.__blurBarcodeInput(); } }, @@ -247,21 +249,22 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { var barcodeValue = this.$barcodeInput.val(); if (barcodeValue.match(this.regexp)) { core.bus.trigger('barcode_scanned', barcodeValue, $(e.target).parent()[0]); - this.$barcodeInput.val(''); + this._blurBarcodeInput(); } }, /** - * Remove the temporary input created to store the barcode value. - * If nothing happens, this input will be removed, so the focus will be lost - * and the virtual keyboard on mobile devices will be closed. + * Removes the value and focus from the barcode input. + * If nothing happens, the focus will be lost and + * the virtual keyboard on mobile devices will be closed. * * @private */ - _removeBarcodeField: function () { + _blurBarcodeInput: function () { if (this.$barcodeInput) { - // Reset the value and remove from the DOM. - this.$barcodeInput.val('').remove(); + // Close the virtual keyboard on mobile browsers + // FIXME: actually we can't prevent keyboard from opening + this.$barcodeInput.val('').blur(); } }, diff --git a/addons/base_automation/i18n/tr.po b/addons/base_automation/i18n/tr.po index f943fc6fda0..f1bdb579a5d 100644 --- a/addons/base_automation/i18n/tr.po +++ b/addons/base_automation/i18n/tr.po @@ -123,7 +123,7 @@ msgstr "Bağlantı Modeli" #. module: base_automation #: model:ir.model.fields,field_description:base_automation.field_base_automation__binding_type msgid "Binding Type" -msgstr "" +msgstr "Bağlantı Türü" #. module: base_automation #: selection:base.automation.lead.test,state:0 diff --git a/addons/base_geolocalize/i18n/tr.po b/addons/base_geolocalize/i18n/tr.po index b858540b3b8..506cb5037a7 100644 --- a/addons/base_geolocalize/i18n/tr.po +++ b/addons/base_geolocalize/i18n/tr.po @@ -3,19 +3,19 @@ # * base_geolocalize # # Translators: -# Martin Trigaux <mat@odoo.com>, 2017 +# Martin Trigaux, 2017 # Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017 # Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017 # gezgin biri <gezginbiri@hotmail.com>, 2017 -# Murat Kaplan <muratk@projetgrup.com>, 2017 # Matanat Ahmadova <ahmadova.matanat01@gmail.com>, 2017 +# Umur Akın <umura@projetgrup.com>, 2018 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18\n" +"Project-Id-Version: Odoo Server saas~11.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-20 09:53+0000\n" -"PO-Revision-Date: 2017-09-20 09:53+0000\n" -"Last-Translator: Matanat Ahmadova <ahmadova.matanat01@gmail.com>, 2017\n" +"POT-Creation-Date: 2018-03-22 14:10+0000\n" +"PO-Revision-Date: 2018-03-22 14:10+0000\n" +"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n" "Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -45,6 +45,8 @@ msgid "" "Cannot contact geolocation servers. Please make sure that your Internet " "connection is up and running (%s)." msgstr "" +"Coğrafi konumlandıma sunucusuna bağlanılamıyor. Lütfen internet bağlantınızı" +" açık ve çalışmakta olduğundan emin olun (%s)." #. module: base_geolocalize #: model:ir.model,name:base_geolocalize.model_res_partner @@ -52,21 +54,21 @@ msgid "Contact" msgstr "Kontak" #. module: base_geolocalize -#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner_partner_latitude -#: model:ir.model.fields,field_description:base_geolocalize.field_res_users_partner_latitude +#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner__partner_latitude +#: model:ir.model.fields,field_description:base_geolocalize.field_res_users__partner_latitude msgid "Geo Latitude" msgstr "Coğrafi Enlem" #. module: base_geolocalize -#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner_partner_longitude -#: model:ir.model.fields,field_description:base_geolocalize.field_res_users_partner_longitude +#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner__partner_longitude +#: model:ir.model.fields,field_description:base_geolocalize.field_res_users__partner_longitude msgid "Geo Longitude" msgstr "Coğ Boylam" #. module: base_geolocalize #: model:ir.ui.view,arch_db:base_geolocalize.view_crm_partner_geo_form msgid "Geolocate" -msgstr "" +msgstr "Yer Etiketi" #. module: base_geolocalize #: model:ir.ui.view,arch_db:base_geolocalize.view_crm_partner_geo_form @@ -74,8 +76,8 @@ msgid "Geolocation" msgstr "Coğrafi Konum" #. module: base_geolocalize -#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner_date_localization -#: model:ir.model.fields,field_description:base_geolocalize.field_res_users_date_localization +#: model:ir.model.fields,field_description:base_geolocalize.field_res_partner__date_localization +#: model:ir.model.fields,field_description:base_geolocalize.field_res_users__date_localization msgid "Geolocation Date" msgstr "Coğrafi Konum" diff --git a/addons/base_import/i18n/zh_CN.po b/addons/base_import/i18n/zh_CN.po index 0eb1389d7a7..222ed8f1b4a 100644 --- a/addons/base_import/i18n/zh_CN.po +++ b/addons/base_import/i18n/zh_CN.po @@ -8,13 +8,14 @@ # 苏州远鼎 <tiexinliu@126.com>, 2016 # liAnGjiA <liangjia@qq.com>, 2016 # 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2018 +# John Lin <linyinhuan@139.com>, 2018 msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-22 14:10+0000\n" "PO-Revision-Date: 2018-03-22 14:10+0000\n" -"Last-Translator: 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2018\n" +"Last-Translator: John Lin <linyinhuan@139.com>, 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -143,7 +144,7 @@ msgstr "十进制分隔符:" #: code:addons/base_import/static/src/xml/base_import.xml:76 #, python-format msgid "Defer parent/child computation" -msgstr "" +msgstr "推迟父/子计算" #. module: base_import #: model:ir.model.fields,field_description:base_import.field_base_import_import__display_name @@ -317,7 +318,7 @@ msgid "" "If the model uses parent/child relations, computing the" " parent / child relation occurs on every line, and lead" " to a slower import. Defering it can speed up import." -msgstr "" +msgstr "如果该模型使用父/子关系,每行都会发生父/子关系计算,并使导入更慢。推迟她能提升导入速度。" #. module: base_import #. openerp-web diff --git a/addons/calendar/i18n/calendar.pot b/addons/calendar/i18n/calendar.pot index 2ed94168f2a..ab1483026ae 100644 --- a/addons/calendar/i18n/calendar.pot +++ b/addons/calendar/i18n/calendar.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-22 14:11+0000\n" -"PO-Revision-Date: 2018-03-22 14:11+0000\n" +"POT-Creation-Date: 2018-06-06 08:01+0000\n" +"PO-Revision-Date: 2018-06-06 08:01+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -866,6 +866,13 @@ msgid "Meeting" msgstr "" #. module: calendar +#: code:addons/calendar/models/calendar.py:933 +#: code:addons/calendar/models/calendar.py:937 +#, python-format +msgid "Meeting '%s' starts '%s' and ends '%s'" +msgstr "" + +#. module: calendar #: model:ir.ui.view,arch_db:calendar.view_calendar_event_form msgid "Meeting Details" msgstr "" diff --git a/addons/calendar/i18n/zh_CN.po b/addons/calendar/i18n/zh_CN.po index 8e768bb2786..37ccc737772 100644 --- a/addons/calendar/i18n/zh_CN.po +++ b/addons/calendar/i18n/zh_CN.po @@ -13,13 +13,14 @@ # 老窦 北京 <2662059195@qq.com>, 2018 # e2f <projects@e2f.com>, 2018 # e2f_cn c5 <jarvisn@ecinnovations.com>, 2018 +# John Lin <linyinhuan@139.com>, 2018 msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-22 14:11+0000\n" "PO-Revision-Date: 2018-03-22 14:11+0000\n" -"Last-Translator: e2f_cn c5 <jarvisn@ecinnovations.com>, 2018\n" +"Last-Translator: John Lin <linyinhuan@139.com>, 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1062,7 +1063,7 @@ msgstr "邀请向导" #. module: calendar #: model:ir.model.fields,field_description:calendar.field_calendar_event__is_highlighted msgid "Is the Event Highlighted" -msgstr "" +msgstr "是事件高亮" #. module: calendar #: selection:calendar.event,byday:0 diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py index 161130e1e94..7a338adc52b 100644 --- a/addons/calendar/models/calendar.py +++ b/addons/calendar/models/calendar.py @@ -930,9 +930,13 @@ class Meeting(models.Model): def _check_closing_date(self): for meeting in self: if meeting.start_datetime and meeting.stop_datetime and meeting.stop_datetime < meeting.start_datetime: - raise ValidationError(_('Ending datetime cannot be set before starting datetime.')) + raise ValidationError(_('Ending datetime cannot be set before starting datetime.') + "\n" + + _("Meeting '%s' starts '%s' and ends '%s'") % (meeting.name, meeting.start_datetime, meeting.stop_datetime) + ) if meeting.start_date and meeting.stop_date and meeting.stop_date < meeting.start_date: - raise ValidationError(_('Ending date cannot be set before starting date.')) + raise ValidationError(_('Ending date cannot be set before starting date.') + "\n" + + _("Meeting '%s' starts '%s' and ends '%s'") % (meeting.name, meeting.start_date, meeting.stop_date) + ) @api.onchange('start_datetime', 'duration') def _onchange_duration(self): diff --git a/addons/crm/i18n/tr.po b/addons/crm/i18n/tr.po index 1dc1294b67b..503973f4250 100644 --- a/addons/crm/i18n/tr.po +++ b/addons/crm/i18n/tr.po @@ -1021,7 +1021,7 @@ msgstr "Atamaya Zorla" #. module: crm #: model:ir.ui.view,arch_db:crm.res_config_settings_view_form msgid "Format phone numbers based on national conventions" -msgstr "" +msgstr "Telefon numaralarını ulusal sözleşmelere göre biçimlendirme" #. module: crm #: code:addons/crm/models/crm_lead.py:588 @@ -1869,7 +1869,7 @@ msgstr "Telefon" #. module: crm #: model:ir.model.fields,field_description:crm.field_res_config_settings__module_crm_phone_validation msgid "Phone Formatting" -msgstr "" +msgstr "Telefon Biçimlendirmesi" #. module: crm #: code:addons/crm/models/crm_team.py:165 diff --git a/addons/crm_project/i18n/tr.po b/addons/crm_project/i18n/tr.po index f1d4348f477..9406b7286ab 100644 --- a/addons/crm_project/i18n/tr.po +++ b/addons/crm_project/i18n/tr.po @@ -91,4 +91,4 @@ msgstr "Proje" #. module: crm_project #: model:ir.model,name:crm_project.model_crm_lead_convert2task msgid "crm.lead.convert2task" -msgstr "" +msgstr "crm.lead.convert2task" diff --git a/addons/delivery/models/stock_picking.py b/addons/delivery/models/stock_picking.py index 86517b1d0ec..908b7587c51 100644 --- a/addons/delivery/models/stock_picking.py +++ b/addons/delivery/models/stock_picking.py @@ -162,7 +162,8 @@ class StockPicking(models.Model): if self.carrier_id.free_over and self.sale_id and self.sale_id._compute_amount_total_without_delivery() >= self.carrier_id.amount: res['exact_price'] = 0.0 self.carrier_price = res['exact_price'] - self.carrier_tracking_ref = res['tracking_number'] + if res['tracking_number']: + self.carrier_tracking_ref = res['tracking_number'] order_currency = self.sale_id.currency_id or self.company_id.currency_id msg = _("Shipment sent to carrier %s for shipping with tracking number %s<br/>Cost: %.2f %s") % (self.carrier_id.name, self.carrier_tracking_ref, self.carrier_price, order_currency.name) self.message_post(body=msg) diff --git a/addons/event/i18n/es.po b/addons/event/i18n/es.po index f55e9ffd371..418660796de 100644 --- a/addons/event/i18n/es.po +++ b/addons/event/i18n/es.po @@ -206,6 +206,168 @@ msgid "" "</div>\n" " " msgstr "" +"\n" +"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;\">\n" +"% set date_begin = format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%SZ')\n" +"% set date_end = format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%SZ')\n" +" <table style=\"width:600px;margin:5px auto;\">\n" +" <tbody>\n" +" <tr>\n" +" <td>\n" +" <a href=\"/\">\n" +" <img src=\"/logo\" alt=\"${object.company_id.name}\" style=\"vertical-align:baseline;max-width:100px;\" />\n" +" </a>\n" +" </td>\n" +" <td style=\"text-align:right;vertical-align:middle;\">\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +" <a href=\"${object.event_id.website_url}\" style=\"background-color: #1abc9c; padding: 12px; font-weight: 12px; text-decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">Ver evento</a>\n" +" % endif\n" +" </td>\n" +" </tr>\n" +" </tbody>\n" +" </table>\n" +" <table style=\"width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;\">\n" +" <tbody>\n" +" <tr>\n" +" <td style=\"padding:15px 20px 0px 20px; font-size:16px; font-weight:300;\">\n" +" <p style=\"font-size:16px;\">\n" +" Hi,\n" +" </p><p style=\"font-size:16px;\">\n" +" Nos alegra confirmarle su registro en el evento:\n" +" </p>\n" +" <ul>\n" +" <li>Evento: \n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +" <a href=\"${object.event_id.website_url}\" style=\"color:#875A7B;text-decoration:none;\">${object.event_id.name}</a>\n" +" % else:\n" +" <strong>${object.event_id.name}</strong>\n" +" % endif\n" +" </li>\n" +" <li>Asistente: ${object.name}</li>\n" +" </ul>\n" +" <p style=\"font-size:16px;\">\n" +" Nos vemos pronto,\n" +" </p>\n" +" <p style=\"font-size:16px; margin-bottom: 30px\">\n" +" <i>\n" +" -- <br/>\n" +" % if object.event_id.organizer_id:\n" +" ${object.event_id.organizer_id.name}\n" +" % else:\n" +" Los organizadores.\n" +" % endif\n" +" </i>\n" +" </p>\n" +" </td>\n" +" </tr>\n" +" <tr>\n" +" <td style=\"padding:15px 20px 0px 20px;\">\n" +" <table style=\"width:100%;border-top:1px solid #e1e1e1;\">\n" +" <tr>\n" +" <td style=\"padding:25px 0px;vertical-align:top;\">\n" +" <img src=\"/web_editor/font_to_img/61555/rgb(81,81,102)/34\" style=\"padding:4px;max-width:inherit;\" height=\"34\">\n" +" </td>\n" +" <td style=\"padding:25px 10px 25px 10px;width:50%;line-height:20px;vertical-align:top;\">\n" +" <div><strong>Desde</strong> ${object.event_id.date_begin_located}</div>\n" +" <div><strong>Hasta</strong> ${object.event_id.date_end_located}</div>\n" +" <div style=\"font-size:12px;color:#9e9e9e\"><i><strong>TZ</strong> ${object.event_id.date_tz}</i></div>\n" +" </td>\n" +" % if object.event_id.address_id.country_id.name:\n" +" <td style=\"padding:25px 0px;vertical-align:top;\">\n" +" <img src=\"/web_editor/font_to_img/61505/rgb(81,81,102)/34\" style=\"padding:4px;max-width:inherit;\" height=\"34\">\n" +" </td>\n" +" <td style=\"padding:30px 10px 25px 10px;width:50%;vertical-align:top;\">\n" +" % set location = ''\n" +" % if object.event_id.address_id.name:\n" +" <p style=\"margin:0px 0px 0px 0px;\">${object.event_id.address_id.name}</p>\n" +" % endif\n" +" % if object.event_id.address_id.street:\n" +" <p style=\"margin:0px 0px 0px 0px;\">${object.event_id.address_id.street}</p>\n" +" % set location = object.event_id.address_id.street\n" +" % endif\n" +" % if object.event_id.address_id.street2:\n" +" <p style=\"margin:0px 0px 0px 0px;\">${object.event_id.address_id.street2}</p>\n" +" % set location = '%s, %s' % (location, object.event_id.address_id.street2)\n" +" % endif\n" +" <p style=\"margin:0px 0px 0px 0px;\">\n" +" % if object.event_id.address_id.city:\n" +" ${object.event_id.address_id.city},\n" +" % set location = '%s, %s' % (location, object.event_id.address_id.city)\n" +" % endif\n" +" % if object.event_id.address_id.state_id.name:\n" +" ${object.event_id.address_id.state_id.name},\n" +" % set location = '%s, %s' % (location, object.event_id.address_id.state_id.name)\n" +" % endif\n" +" % if object.event_id.address_id.zip:\n" +" ${object.event_id.address_id.zip}\n" +" % set location = '%s, %s' % (location, object.event_id.address_id.zip)\n" +" % endif\n" +" </p>\n" +" % if object.event_id.address_id.country_id.name:\n" +" <p style=\"margin:0px 0px 0px 0px;\">${object.event_id.address_id.country_id.name}</p>\n" +" % set location = '%s, %s' % (location, object.event_id.address_id.country_id.name)\n" +" % endif\n" +" </td>\n" +" % endif\n" +" </tr>\n" +" </table>\n" +" % if object.event_id.organizer_id:\n" +" <table style=\"width:100%;border-top:1px solid #e1e1e1;\">\n" +" <tr>\n" +" <td style=\"padding:10px 0px 25px 0px;\">\n" +" <h2 style=\"font-weight:300;margin:10px 0px\">¿Preguntas sobre este evento?</h2>\n" +" <p>Por favor contacte con el organizador:</p>\n" +" <ul>\n" +" <li>${object.event_id.organizer_id.name}</li>\n" +" % if object.event_id.organizer_id.email\n" +" <li>Correo: <a href=\"mailto:${object.event_id.organizer_id.email}\" style=\"text-decoration:none;color:#875A7B;\">${object.event_id.organizer_id.email}</a></li>\n" +" % endif\n" +" % if object.event_id.organizer_id.phone\n" +" <li>Teléfono: ${object.event_id.organizer_id.phone}</li>\n" +" % endif\n" +" </ul>\n" +"\n" +" </td>\n" +" </tr>\n" +" </table>\n" +" % endif\n" +" <table style=\"width:100%;border-top:1px solid #e1e1e1;\">\n" +" <tr>\n" +" <td style=\"padding:25px 0px;\">\n" +" <strong>Añada este evento a su calendario</strong>\n" +" <a href=\"https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}\" style=\"padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;\" target=\"new\"><img src=\"/web_editor/font_to_img/61525/rgb(135,90,123)/16\" style=\"vertical-align:middle;\" height=\"16\"> Google</a>\n" +" <a href=\"https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&summary=${object.event_id.name}&dtstart=${date_begin}&dtend=${date_end}&location=${location}\" style=\"padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;\" target=\"new\"><img src=\"/web_editor/font_to_img/61525/rgb(135,90,123)/16\" style=\"vertical-align:middle;\" height=\"16\"> Outlook</a>\n" +" <a href=\"https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}\" style=\"padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;\" target=\"new\"><img src=\"/web_editor/font_to_img/61525/rgb(135,90,123)/16\" style=\"vertical-align:middle;\" height=\"16\"> Yahoo</a>\n" +" </td>\n" +" </tr>\n" +" </table>\n" +" </td>\n" +" </tr>\n" +" </tbody>\n" +" </table>\n" +" % if object.event_id.address_id:\n" +" <div style=\"width:598px;margin:0px auto;border-left:1px solid #dddddd;border-right:1px solid #dddddd;border-bottom:1px solid #dddddd;\">\n" +" <a href=\"https://maps.google.com/maps?q=${location}\" target=\"new\">\n" +" <img src=\"http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x200&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}\" style=\"vertical-align:bottom;\" />\n" +" </a>\n" +" </div>\n" +" % endif\n" +" <table style=\"width:600px;margin:0px auto;text-align:center;\">\n" +" <tbody>\n" +" <tr>\n" +" <td style=\"padding-top:10px;font-size: 12px;\">\n" +" <div>Enviado por ${object.company_id.name}</div>\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +" <div>\n" +" Descubra <a href=\"/event\" style=\"text-decoration:none;color:#717188;\">todos nuestros eventos</a>.\n" +" </div>\n" +" % endif\n" +" </td>\n" +" </tr>\n" +" </tbody>\n" +" </table>\n" +"</div>\n" +" " #. module: event #: model:mail.template,body_html:event.event_reminder diff --git a/addons/event/views/res_partner_views.xml b/addons/event/views/res_partner_views.xml index 8fd4b774c5e..59d096efcd1 100644 --- a/addons/event/views/res_partner_views.xml +++ b/addons/event/views/res_partner_views.xml @@ -5,6 +5,7 @@ <field name="name">view.res.partner.form.event.inherited</field> <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> + <field name="groups_id" eval="[(4, ref('event.group_event_user'))]"/> <field name="arch" type="xml"> <div name="button_box" position="inside"> <button class="oe_stat_button" diff --git a/addons/google_calendar/models/google_calendar.py b/addons/google_calendar/models/google_calendar.py index df0df9e3388..a422438778c 100644 --- a/addons/google_calendar/models/google_calendar.py +++ b/addons/google_calendar/models/google_calendar.py @@ -677,7 +677,7 @@ class GoogleCalendar(models.AbstractModel): try: all_event_from_google = self.get_event_synchro_dict(lastSync=lastSync) except requests.HTTPError as e: - if e.response.code == 410: # GONE, Google is lost. + if e.response.status_code == 410: # GONE, Google is lost. # we need to force the rollback from this cursor, because it locks my res_users but I need to write in this tuple before to raise. self.env.cr.rollback() self.env.user.write({'google_calendar_last_sync_date': False}) @@ -842,7 +842,7 @@ class GoogleCalendar(models.AbstractModel): try: # if already deleted from gmail or never created recs.delete_an_event(current_event[0]) - except Exception as e: + except requests.exceptions.HTTPError as e: if e.response.status_code in (401, 410,): pass else: diff --git a/addons/hr_holidays/report/hr_leave_report.py b/addons/hr_holidays/report/hr_leave_report.py index acca821f58a..5df7a3e4636 100644 --- a/addons/hr_holidays/report/hr_leave_report.py +++ b/addons/hr_holidays/report/hr_leave_report.py @@ -5,9 +5,10 @@ from odoo import fields, models, tools class LeaveReport(models.Model): - _name = "hr.leave.report" + _description = 'Leave Summary / Report' _auto = False + _order = "date_from DESC, employee_id" employee_id = fields.Many2one('hr.employee', string="Employee", readonly=True) name = fields.Char('Description', readonly=True) diff --git a/addons/hr_holidays/report/hr_leave_reports.xml b/addons/hr_holidays/report/hr_leave_reports.xml index 6f884671c37..5afe663eaf5 100644 --- a/addons/hr_holidays/report/hr_leave_reports.xml +++ b/addons/hr_holidays/report/hr_leave_reports.xml @@ -46,12 +46,13 @@ <field name="model">hr.leave.report</field> <field name="arch" type="xml"> <tree create="0" edit="0" delete="0"> - <field name="type"/> - <field name="name"/> + <field name="employee_id"/> <field name="number_of_days" string="Number of Days" sum="Remaining Days"/> <field name="date_from"/> <field name="date_to"/> <field name="state"/> + <field name="type"/> + <field name="name"/> </tree> </field> </record> diff --git a/addons/hr_holidays/views/hr_leave_views.xml b/addons/hr_holidays/views/hr_leave_views.xml index 1b210c22eb4..97c88dfcbfa 100644 --- a/addons/hr_holidays/views/hr_leave_views.xml +++ b/addons/hr_holidays/views/hr_leave_views.xml @@ -20,6 +20,9 @@ <field name="model">hr.leave</field> <field name="arch" type="xml"> <search string="Search Leave"> + <field name="employee_id"/> + <field name="department_id"/> + <field name="holiday_status_id"/> <field name="name"/> <filter domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> <filter string="Approved Leaves" domain="[('state', '=', 'validate')]" name="validated"/> @@ -40,10 +43,6 @@ <separator/> <filter string="My Leaves" name="my_leaves" domain="[('employee_id.user_id', '=', uid)]"/> <separator/> - <field name="employee_id"/> - <field name="department_id"/> - <field name="holiday_status_id"/> - <separator/> <filter string="Late Activities" name="activities_overdue" domain="[('activity_ids.date_deadline', '<', context_today().strftime('%Y-%m-%d'))]" help="Show all records which has next action date is before today"/> diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py index 6276aa166ca..f58f49a3218 100644 --- a/addons/hr_timesheet/models/project.py +++ b/addons/hr_timesheet/models/project.py @@ -111,7 +111,7 @@ class Task(models.Model): @api.depends('timesheet_ids.unit_amount') def _compute_effective_hours(self): for task in self: - task.effective_hours = sum(task.timesheet_ids.mapped('unit_amount')) + task.effective_hours = round(sum(task.timesheet_ids.mapped('unit_amount')), 2) @api.depends('effective_hours', 'subtask_effective_hours', 'planned_hours') def _compute_progress_hours(self): diff --git a/addons/hw_escpos/escpos/escpos.py b/addons/hw_escpos/escpos/escpos.py index 7159ac3b31e..f31b1619894 100644 --- a/addons/hw_escpos/escpos/escpos.py +++ b/addons/hw_escpos/escpos/escpos.py @@ -522,6 +522,10 @@ class Escpos: # Print Code if code: self._raw(code) + # We are using type A commands + # So we need to add the 'NULL' character + # https://github.com/python-escpos/python-escpos/pull/98/files#diff-a0b1df12c7c67e38915adbe469051e2dR444 + self._raw('\x00') else: raise exception.BarcodeCodeError() diff --git a/addons/l10n_fr_certification/models/res_company.py b/addons/l10n_fr_certification/models/res_company.py index 97aa993aa7e..f5f962f6fa3 100644 --- a/addons/l10n_fr_certification/models/res_company.py +++ b/addons/l10n_fr_certification/models/res_company.py @@ -30,6 +30,9 @@ class ResCompany(models.Model): if company._is_accounting_unalterable(): sequence_fields = ['l10n_fr_secure_sequence_id'] company._create_secure_sequence(sequence_fields) + # fiscalyear_lock_date can't be set to a prior date + if 'fiscalyear_lock_date' in vals or 'period_lock_date' in vals: + self._check_lock_dates(vals) return res def _create_secure_sequence(self, sequence_fields): diff --git a/addons/l10n_generic_coa/__init__.py b/addons/l10n_generic_coa/__init__.py index 67dee8c60db..d417dc6807c 100644 --- a/addons/l10n_generic_coa/__init__.py +++ b/addons/l10n_generic_coa/__init__.py @@ -1,2 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. + + +def uninstall_hook(cr, registry): + cr.execute( + "DELETE FROM ir_model_data WHERE module = 'l10n_generic_coa'" + ) diff --git a/addons/l10n_generic_coa/__manifest__.py b/addons/l10n_generic_coa/__manifest__.py index 314e13f44ff..2f04d8df530 100644 --- a/addons/l10n_generic_coa/__manifest__.py +++ b/addons/l10n_generic_coa/__manifest__.py @@ -24,4 +24,5 @@ Install some generic chart of accounts. 'data/account_invoice_demo.xml', ], 'website': 'https://www.odoo.com/page/accounting', + 'uninstall_hook': 'uninstall_hook', } diff --git a/addons/mail/i18n/tr.po b/addons/mail/i18n/tr.po index b989dc5f3bd..10f755b2fec 100644 --- a/addons/mail/i18n/tr.po +++ b/addons/mail/i18n/tr.po @@ -3048,7 +3048,7 @@ msgstr "Modeller" #. module: mail #: model:ir.model,name:mail.model_base_module_uninstall msgid "Module Uninstallation" -msgstr "" +msgstr "Yüklemeyi Kaldırma Modülü" #. module: mail #: model:ir.ui.view,arch_db:mail.view_mail_search diff --git a/addons/mass_mailing/i18n/tr.po b/addons/mass_mailing/i18n/tr.po index c43c4af4b0d..03ea4cd2a45 100644 --- a/addons/mass_mailing/i18n/tr.po +++ b/addons/mass_mailing/i18n/tr.po @@ -667,7 +667,7 @@ msgstr "E-Posta" #: model:ir.ui.menu,name:mass_mailing.mass_mailing_menu_root #: model:ir.ui.view,arch_db:mass_mailing.res_config_settings_view_form msgid "Email Marketing" -msgstr "" +msgstr "E-posta Pazarlama" #. module: mass_mailing #: model:ir.model,name:mass_mailing.model_mail_mail_statistics diff --git a/addons/mass_mailing/models/mail_mail.py b/addons/mass_mailing/models/mail_mail.py index 1589f22d5a4..c89986556d0 100644 --- a/addons/mass_mailing/models/mail_mail.py +++ b/addons/mass_mailing/models/mail_mail.py @@ -84,7 +84,7 @@ class MailMail(models.Model): def _send_prepare_values(self, partner=None): # TDE: temporary addition (mail was parameter) due to semi-new-API res = super(MailMail, self)._send_prepare_values(partner) - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url').rstrip('/') if self.mailing_id and res.get('body') and res.get('email_to'): emails = tools.email_split(res.get('email_to')[0]) email_to = emails and emails[0] or False diff --git a/addons/mrp/i18n/nl.po b/addons/mrp/i18n/nl.po index a9638223b4f..b179108cd7d 100644 --- a/addons/mrp/i18n/nl.po +++ b/addons/mrp/i18n/nl.po @@ -3604,7 +3604,7 @@ msgid "" "link to your file." msgstr "" "U kan een bestand van uw computer uploaden of een internet link " -"kopiëren/plakken die linkt naar uw bestand" +"kopiëren/plakken die linkt naar uw bestand." #. module: mrp #: code:addons/mrp/models/mrp_production.py:523 diff --git a/addons/point_of_sale/i18n/nl.po b/addons/point_of_sale/i18n/nl.po index 85cd5756e51..b04366f186e 100644 --- a/addons/point_of_sale/i18n/nl.po +++ b/addons/point_of_sale/i18n/nl.po @@ -3575,7 +3575,7 @@ msgid "" "category is specified, all available products will be shown." msgstr "" "De kassa toont de productcategorieën standaard. Als er geen categorie is " -"gespecificeerd worden alle producten getoond" +"gespecificeerd worden alle producten getoond." #. module: point_of_sale #: model:ir.model.fields,help:point_of_sale.field_pos_config__pricelist_id diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py index 1b41565401d..2ef110a6dae 100644 --- a/addons/point_of_sale/models/pos_config.py +++ b/addons/point_of_sale/models/pos_config.py @@ -364,11 +364,12 @@ class PosConfig(models.Model): @api.multi def write(self, vals): - if (self.is_posbox or vals.get('is_posbox')) and (self.iface_customer_facing_display or vals.get('iface_customer_facing_display')): - facing_display = (self.customer_facing_display_html or vals.get('customer_facing_display_html') or '').strip() - if not facing_display: - vals['customer_facing_display_html'] = self._compute_default_customer_html() result = super(PosConfig, self).write(vals) + + config_display = self.filtered(lambda c: c.is_posbox and c.iface_customer_facing_display and not (c.customer_facing_display_html or '').strip()) + if config_display: + super(PosConfig, config_display).write({'customer_facing_display_html': self._compute_default_customer_html()}) + self.sudo()._set_fiscal_position() self.sudo()._check_modules_to_install() self.sudo()._check_groups_implied() diff --git a/addons/purchase/data/mail_template_data.xml b/addons/purchase/data/mail_template_data.xml index d3c075c3ff0..072342afc87 100644 --- a/addons/purchase/data/mail_template_data.xml +++ b/addons/purchase/data/mail_template_data.xml @@ -5,7 +5,7 @@ <!--Email template --> <record id="email_template_edi_purchase" model="mail.template"> <field name="name">RFQ - Send by Email</field> - <field name="email_from">${(object.create_uid.email and '%s <%s>' % (object.create_uid.name, object.create_uid.email) or '')|safe}</field> + <field name="email_from">${(object.create_uid.email and '"%s" <%s>' % (object.create_uid.name, object.create_uid.email) or '')|safe}</field> <field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field> <field name="partner_to">${object.partner_id.id}</field> <field name="model_id" ref="purchase.model_purchase_order"/> @@ -46,7 +46,7 @@ from ${object.company_id.name}. <!--Email template --> <record id="email_template_edi_purchase_done" model="mail.template"> <field name="name">Purchase Order - Send by Email</field> - <field name="email_from">${(object.create_uid.email and '%s <%s>' % (object.create_uid.name, object.create_uid.email) or '')|safe}</field> + <field name="email_from">${(object.create_uid.email and '"%s" <%s>' % (object.create_uid.name, object.create_uid.email) or '')|safe}</field> <field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field> <field name="partner_to">${object.partner_id.id}</field> <field name="model_id" ref="purchase.model_purchase_order"/> diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 78997867716..72c1cedab76 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -943,12 +943,12 @@ class ProcurementRule(models.Model): if domain in cache: po = cache[domain] else: - po = self.env['purchase.order'].search([dom for dom in domain]) + po = self.env['purchase.order'].sudo().search([dom for dom in domain]) po = po[0] if po else False cache[domain] = po if not po: vals = self._prepare_purchase_order(product_id, product_qty, product_uom, origin, values, partner) - po = self.env['purchase.order'].create(vals) + po = self.env['purchase.order'].sudo().create(vals) cache[domain] = po elif not po.origin or origin not in po.origin.split(', '): if po.origin: @@ -969,7 +969,7 @@ class ProcurementRule(models.Model): break if not po_line: vals = self._prepare_purchase_order_line(product_id, product_qty, product_uom, values, po, partner) - self.env['purchase.order.line'].create(vals) + self.env['purchase.order.line'].sudo().create(vals) def _get_purchase_schedule_date(self, values): """Return the datetime value to use as Schedule Date (``date_planned``) for the diff --git a/addons/purchase/tests/test_stockvaluation.py b/addons/purchase/tests/test_stockvaluation.py index 54fd5bc63f0..e515bd32c82 100644 --- a/addons/purchase/tests/test_stockvaluation.py +++ b/addons/purchase/tests/test_stockvaluation.py @@ -184,7 +184,7 @@ class TestStockValuation(TransactionCase): 'company_id': po1.company_id.id, }) eur_currency._compute_current_rate() - price_unit_usd_new_rate = po1.currency_id.compute(po1.order_line.price_unit, po1.company_id.currency_id, round=True) + price_unit_usd_new_rate = po1.currency_id.compute(po1.order_line.price_unit, po1.company_id.currency_id, round=False) # the new price_unit is lower than th initial because of the rate's change self.assertLess(price_unit_usd_new_rate, price_unit_usd) @@ -198,7 +198,7 @@ class TestStockValuation(TransactionCase): wizard.process() # the unit price of the stock move has been updated to the latest value - self.assertAlmostEqual(move1.price_unit, price_unit_usd_new_rate, places=2) + self.assertAlmostEqual(move1.price_unit, price_unit_usd_new_rate) self.assertAlmostEqual(self.product1.stock_value, price_unit_usd_new_rate * 10, delta=0.1) @@ -412,4 +412,3 @@ class TestStockValuationWithCOA(AccountingTestCase): # check the anglo saxon entries price_diff_entry = self.env['account.move.line'].search([('account_id', '=', price_diff_account.id)]) self.assertEqual(price_diff_entry.credit, 100) - diff --git a/addons/repair/i18n/es.po b/addons/repair/i18n/es.po index 32b246189f6..b38c0edb03b 100644 --- a/addons/repair/i18n/es.po +++ b/addons/repair/i18n/es.po @@ -26,13 +26,14 @@ # Fernando San Martín Woerner <fsnmartin@gmail.com>, 2018 # José Matias Zuazo <jose.zuazo@tpsistemas.com.ar>, 2018 # Nicolás Broggi <rnbroggi@gmail.com>, 2018 +# Carlos Vásquez <carlos.vasquez@clearcorp.co.cr>, 2018 msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-22 14:11+0000\n" "PO-Revision-Date: 2018-03-22 14:11+0000\n" -"Last-Translator: Nicolás Broggi <rnbroggi@gmail.com>, 2018\n" +"Last-Translator: Carlos Vásquez <carlos.vasquez@clearcorp.co.cr>, 2018\n" "Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -97,6 +98,20 @@ msgid "" " <p>Thank you,</p>\n" " </data>" msgstr "" +"<?xml version=\"1.0\"?>\n" +"<data>Estimado(a) ${object.partner_id.name}</p>\n" +" <p>\n" +" Ésta es su orden de reparación ${doc_name} <strong>${object.name}</strong>\n" +" % if object.origin:\n" +" (con referencia: ${object.origin} )\n" +" % endif\n" +" % if object.invoice_method != 'none':\n" +" por un total de <strong>${format_amount(object.amount_total, object.pricelist_id.currency_id)}.</strong>\n" +" % endif\n" +" </p>\n" +" <p>Puede responder a este correo electrónico si tiene alguna duda.</p>\n" +" <p>Gracias,</p>\n" +" </data>" #. module: repair #: model:ir.ui.view,arch_db:repair.report_repairorder diff --git a/addons/sale/data/mail_data.xml b/addons/sale/data/mail_data.xml index 5c9d0b6a2e5..ce8dcc651a1 100644 --- a/addons/sale/data/mail_data.xml +++ b/addons/sale/data/mail_data.xml @@ -55,7 +55,7 @@ <!--Email template --> <record id="email_template_edi_sale" model="mail.template"> <field name="name">Sales Order - Send by Email</field> - <field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field> + <field name="email_from">${(object.user_id.email and '"%s" <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field> <field name="subject">${object.company_id.name} ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })</field> <field name="partner_to">${object.partner_id.id}</field> <field name="model_id" ref="sale.model_sale_order"/> diff --git a/addons/sale/models/product_template.py b/addons/sale/models/product_template.py index e1ffda478ab..79dffdd719b 100644 --- a/addons/sale/models/product_template.py +++ b/addons/sale/models/product_template.py @@ -24,7 +24,7 @@ class ProductTemplate(models.Model): @api.depends('product_variant_ids.sales_count') def _sales_count(self): for product in self: - product.sales_count = sum([p.sales_count for p in product.product_variant_ids]) + product.sales_count = sum([p.sales_count for p in product.with_context(active_test=False).product_variant_ids]) @api.multi def action_view_sales(self): diff --git a/addons/stock/i18n/nl.po b/addons/stock/i18n/nl.po index 90ec0e3c55a..1541859ac42 100644 --- a/addons/stock/i18n/nl.po +++ b/addons/stock/i18n/nl.po @@ -4454,7 +4454,8 @@ msgstr "Aantallen" #, python-format msgid "Quants cannot be created for consumables or services." msgstr "" -"Quants kunnen niet worden aangemaakt voor verbruiksartikelen of diensten." +"Hoeveelheden kunnen niet worden aangemaakt voor verbruiksartikelen of " +"diensten." #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_picking_type__rate_picking_backorders @@ -5429,8 +5430,8 @@ msgid "" "Technical field used to compute whether the mark as todo button should be " "shown." msgstr "" -"Technisch veld waarmee berekend wordt of de markeer als ToDo zichtbaar mag " -"zijn." +"Technisch veld waarmee berekend wordt of de markeer als \"Te doen\" " +"zichtbaar mag zijn." #. module: stock #: model:ir.model.fields,help:stock.field_stock_picking__show_validate diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index e621a86c61a..28a0055b5a4 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -930,11 +930,15 @@ class StockMove(models.Model): if not move.move_orig_ids: if move.procure_method == 'make_to_order': continue + # If we don't need any quantity, consider the move assigned. + need = move.product_qty - move.reserved_availability + if float_is_zero(need, precision_rounding=move.product_id.uom_id.rounding): + assigned_moves |= move + continue # Reserve new quants and create move lines accordingly. available_quantity = self.env['stock.quant']._get_available_quantity(move.product_id, move.location_id) if available_quantity <= 0: continue - need = move.product_qty - move.reserved_availability taken_quantity = move._update_reserved_quantity(need, available_quantity, move.location_id, strict=False) if float_is_zero(taken_quantity, precision_rounding=move.product_id.uom_id.rounding): continue diff --git a/addons/stock/report/report_stock_forecast.py b/addons/stock/report/report_stock_forecast.py index 700aa5455de..1ca3b1195b5 100644 --- a/addons/stock/report/report_stock_forecast.py +++ b/addons/stock/report/report_stock_forecast.py @@ -66,7 +66,7 @@ class ReportStockForecat(models.Model): LEFT JOIN stock_location source_location ON sm.location_id = source_location.id WHERE - sm.state IN ('confirmed','assigned','waiting') and + sm.state IN ('confirmed','partially_available','assigned','waiting') and source_location.usage != 'internal' and dest_location.usage = 'internal' GROUP BY sm.date_expected,sm.product_id, sm.company_id UNION ALL @@ -88,7 +88,7 @@ class ReportStockForecat(models.Model): LEFT JOIN stock_location dest_location ON sm.location_dest_id = dest_location.id WHERE - sm.state IN ('confirmed','assigned','waiting') and + sm.state IN ('confirmed','partially_available','assigned','waiting') and source_location.usage = 'internal' and dest_location.usage != 'internal' GROUP BY sm.date_expected,sm.product_id, sm.company_id) as MAIN diff --git a/addons/stock/tests/test_move.py b/addons/stock/tests/test_move.py index f1879f97d06..9b5de71473c 100644 --- a/addons/stock/tests/test_move.py +++ b/addons/stock/tests/test_move.py @@ -1074,6 +1074,31 @@ class StockMove(TransactionCase): self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.customer_location), 12.0) self.assertEqual(len(self.env['stock.quant']._gather(self.product2, self.customer_location)), 12) + def test_availability_8(self): + """ Test the assignment mechanism when the product quantity is decreased on a partially + reserved stock move. + """ + # make some stock + self.env['stock.quant']._update_available_quantity(self.product1, self.stock_location, 3.0) + self.assertAlmostEqual(self.product1.qty_available, 3.0) + + move_partial = self.env['stock.move'].create({ + 'name': 'test_partial', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 5.0, + }) + + move_partial._action_confirm() + move_partial._action_assign() + self.assertAlmostEqual(self.product1.virtual_available, -2.0) + self.assertEqual(move_partial.state, 'partially_available') + move_partial.product_uom_qty = 3.0 + move_partial._action_assign() + self.assertEqual(move_partial.state, 'assigned') + def test_unreserve_1(self): """ Check that unreserving a stock move sets the products reserved as available and set the state back to confirmed. @@ -3917,4 +3942,3 @@ class StockMove(TransactionCase): picking.button_validate() self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0) self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.customer_location), 2) - diff --git a/addons/stock_account/views/stock_account_views.xml b/addons/stock_account/views/stock_account_views.xml index 656d6ea7364..77747cdea5c 100644 --- a/addons/stock_account/views/stock_account_views.xml +++ b/addons/stock_account/views/stock_account_views.xml @@ -44,7 +44,7 @@ <field name="model">stock.return.picking</field> <field name="arch" type="xml"> <xpath expr="//field[@name='product_return_moves']/tree" position="inside"> - <field name="to_refund" widget="boolean_toggle"/> + <field name="to_refund"/> </xpath> </field> </record> diff --git a/addons/survey/wizard/survey_email_compose_message.py b/addons/survey/wizard/survey_email_compose_message.py index f23d836bc30..80884543585 100644 --- a/addons/survey/wizard/survey_email_compose_message.py +++ b/addons/survey/wizard/survey_email_compose_message.py @@ -87,8 +87,6 @@ class SurveyMailComposeMessage(models.TransientModel): #set url url = wizard.survey_id.public_url - url = urls.url_parse(url).path[1:] # dirty hack to avoid incorrect urls - if token: url = url + '/' + token diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 4c2b213243f..c6f67bc23fa 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1990,9 +1990,7 @@ var BasicModel = AbstractModel.extend({ var records = []; var ids = []; list = this._applyX2ManyOperations(list); - if (_.isEmpty(list.data)) { - return $.when(); - } + _.each(list.data, function (localId) { var record = self.localData[localId]; var data = record._changes || record.data; @@ -2003,6 +2001,9 @@ var BasicModel = AbstractModel.extend({ ids.push(many2oneRecord.res_id); model = many2oneRecord.model; }); + if (!ids.length) { + return $.when(); + } return this._rpc({ model: model, method: 'name_get', diff --git a/addons/web/static/src/less/list_view.less b/addons/web/static/src/less/list_view.less index 666b4a8e116..e56e94fff93 100644 --- a/addons/web/static/src/less/list_view.less +++ b/addons/web/static/src/less/list_view.less @@ -84,7 +84,6 @@ padding: 0px; background-style: none; border-style: none; - height: 0px; display: table-cell; } diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 67698bc285c..a9e6a27e077 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -2551,6 +2551,58 @@ QUnit.module('relational_fields', { QUnit.module('FieldOne2Many'); + QUnit.test('New record with a o2m also with 2 new records, ordered, and resequenced', function (assert) { + assert.expect(3); + + // Needed to have two new records in a single stroke + this.data.partner.onchanges = { + foo: function(obj) { + obj.p = [ + [5], + [0, 0, {trululu: false}], + [0, 0, {trululu: false}], + ] + } + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'<form string="Partners">' + + '<field name="foo" />' + + '<field name="p">' + + '<tree editable="bottom" default_order="int_field">' + + '<field name="int_field" widget="handle"/>' + + '<field name="trululu"/>' + + '</tree>' + + '</field>' + + '</form>', + viewOptions: { + mode: 'create', + }, + mockRPC: function (route, args) { + assert.step(args.method + ' ' + args.model) + return this._super(route, args); + }, + }); + + // change the int_field through drag and drop + // that way, we'll trigger the sorting and the name_get + // of the lines of "p" + testUtils.dragAndDrop( + form.$('.ui-sortable-handle').eq(1), + form.$('tbody tr').first(), + {position: 'top'} + ); + + // Only those two should have been called + // name_get on trululu would trigger an traceback + assert.verifySteps(['default_get partner', 'onchange partner']); + + form.destroy(); + }); + QUnit.test('O2M List with pager, decoration and default_order: add and cancel adding', function (assert) { assert.expect(3); diff --git a/addons/web_editor/static/src/js/editor/summernote.js b/addons/web_editor/static/src/js/editor/summernote.js index b3e06fa1716..657a8bbac8c 100644 --- a/addons/web_editor/static/src/js/editor/summernote.js +++ b/addons/web_editor/static/src/js/editor/summernote.js @@ -2255,7 +2255,7 @@ $.summernote.pluginEvents.backColor = function (event, editor, layoutInfo, backC }; options.onCreateLink = function (sLinkUrl) { - if (sLinkUrl.indexOf('mailto:') === 0) { + if (sLinkUrl.indexOf('mailto:') === 0 || sLinkUrl.indexOf('tel:') === 0) { // pass } else if (sLinkUrl.indexOf('@') !== -1 && sLinkUrl.indexOf(':') === -1) { sLinkUrl = 'mailto:' + sLinkUrl; diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 62d862afe35..ead68c28274 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -18,8 +18,9 @@ from odoo import http, models, fields, _ from odoo.http import request from odoo.tools import pycompat, OrderedSet from odoo.addons.http_routing.models.ir_http import slug, _guess_mimetype -from odoo.addons.web.controllers.main import WebClient, Binary, Home +from odoo.addons.web.controllers.main import WebClient, Binary from odoo.addons.portal.controllers.portal import pager as portal_pager +from odoo.addons.portal.controllers.web import Home logger = logging.getLogger(__name__) diff --git a/addons/website_crm_partner_assign/models/res_partner.py b/addons/website_crm_partner_assign/models/res_partner.py index aa0d40af98e..9b47a9f791d 100644 --- a/addons/website_crm_partner_assign/models/res_partner.py +++ b/addons/website_crm_partner_assign/models/res_partner.py @@ -34,11 +34,11 @@ class ResPartnerActivation(models.Model): class ResPartner(models.Model): _inherit = "res.partner" - partner_weight = fields.Integer('Level Weight', default=lambda *args: 0, + partner_weight = fields.Integer('Level Weight', default=0, track_visibility='onchange', help="Gives the probability to assign a lead to this partner. (0 means no assignation.)") - grade_id = fields.Many2one('res.partner.grade', 'Level') + grade_id = fields.Many2one('res.partner.grade', 'Level', track_visibility='onchange') grade_sequence = fields.Integer(related='grade_id.sequence', readonly=True, store=True) - activation = fields.Many2one('res.partner.activation', 'Activation', index=True) + activation = fields.Many2one('res.partner.activation', 'Activation', index=True, track_visibility='onchange') date_partnership = fields.Date('Partnership Date') date_review = fields.Date('Latest Partner Review') date_review_next = fields.Date('Next Partner Review') diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js index 3aa8691fca7..ebe38118559 100644 --- a/addons/website_event/static/src/js/website_event.js +++ b/addons/website_event/static/src/js/website_event.js @@ -20,8 +20,11 @@ return instance.appendTo($form).then(function () { odoo.define('website_event.website_event', function (require) { var ajax = require('web.ajax'); +var core = require('web.core'); var Widget = require('web.Widget'); +var _t = core._t; + // Catch registration form event, because of JS for attendee details var EventRegistrationForm = Widget.extend({ start: function () { @@ -31,7 +34,6 @@ var EventRegistrationForm = Widget.extend({ .off('click') .removeClass('a-submit') .click(function (ev) { - $(this).attr('disabled', true); self.on_click(ev); }); }); @@ -43,15 +45,18 @@ var EventRegistrationForm = Widget.extend({ var $form = $(ev.currentTarget).closest('form'); var $button = $(ev.currentTarget).closest('[type="submit"]'); var post = {}; + $('#registration_form table').siblings('.alert').remove(); $('#registration_form select').each(function () { post[$(this).attr('name')] = $(this).val(); }); var tickets_ordered = _.some(_.map(post, function (value, key) { return parseInt(value); })); if (!tickets_ordered) { - return $('#registration_form table').after( - '<div class="alert alert-info">Please select at least one ticket.</div>' - ); + $('<div class="alert alert-info"/>') + .text(_t('Please select at least one ticket.')) + .insertAfter('#registration_form table'); + return $.Deferred(); } else { + $button.attr('disabled', true); return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) { var $modal = $(modal); $modal.find('.modal-body > div').removeClass('container'); // retrocompatibility - REMOVE ME in master / saas-19 diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index a99870fae86..3026da8365e 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -427,7 +427,7 @@ <div id="o-carousel-product" class="carousel slide" data-ride="carousel" data-interval="0"> <div class="carousel-outer"> <div class="carousel-inner"> - <div t-if="variant_img" class="item active" itemprop="image" t-field="product.product_variant_id.image" t-options="{'widget': 'image', 'class': 'product_detail_img js_variant_img', 'alt-field': 'name', 'zoom': 'image', 'unique': product['__last_update'] + (product.product_variant_id['__last_update'] or '')}"/> + <div t-if="variant_img" class="item active" itemprop="image" t-field="product[:1].product_variant_id.image" t-options="{'widget': 'image', 'class': 'product_detail_img js_variant_img', 'alt-field': 'name', 'zoom': 'image', 'unique': product['__last_update'] + (product.product_variant_id['__last_update'] or '')}"/> <div t-attf-class="item#{'' if variant_img else ' active'}" itemprop="image" t-field="product.image" t-options="{'widget': 'image', 'class': 'product_detail_img', 'alt-field': 'name', 'zoom': 'image', 'unique': product['__last_update']}"/> <t t-if="len(image_ids)" t-foreach="image_ids" t-as="pimg"> <div class="item" t-field="pimg.image" t-options='{"widget": "image", "class": "product_detail_img", "alt-field": "name", "zoom": "image" }'/> diff --git a/doc/setup/deploy.rst b/doc/setup/deploy.rst index 13d4198cceb..dadd1484d46 100644 --- a/doc/setup/deploy.rst +++ b/doc/setup/deploy.rst @@ -534,10 +534,14 @@ Supported Browsers Odoo is supported by multiple browsers for each of its versions. No distinction is made according to the browser version in order to be up-to-date. Odoo is supported on the current browser version. The list -of the supported browsers by Odoo version is the following: +of the supported browsers is the following: + +- IE11, +- Mozilla Firefox, +- Google Chrome, +- Safari, +- Microsoft Edge -- **Odoo 9:** IE11, Mozilla Firefox, Google Chrome, Safari, Microsoft Edge -- **Odoo 10+:** Mozilla Firefox, Google Chrome, Safari, Microsoft Edge .. [#different-machines] to have multiple Odoo installations use the same PostgreSQL database, diff --git a/odoo/addons/base/i18n/tr.po b/odoo/addons/base/i18n/tr.po index fe58a04c1a8..ff3637e92d3 100644 --- a/odoo/addons/base/i18n/tr.po +++ b/odoo/addons/base/i18n/tr.po @@ -8009,7 +8009,7 @@ msgstr "" #. module: base #: model:ir.module.module,summary:base.module_web_grid msgid "Basic 2D Grid view for odoo" -msgstr "" +msgstr "Odoo için Temel 2D Tablo görünümü" #. module: base #: model:ir.module.module,summary:base.module_quality @@ -8020,6 +8020,7 @@ msgstr "" #: model:ir.module.module,summary:base.module_iap msgid "Basic models and helpers to support In-App purchases." msgstr "" +"Uygulama içi satın alımları destekleyecek temel modeller ve yardımcılar." #. module: base #: model:ir.module.module,shortdesc:base.module_account_batch_deposit @@ -8029,7 +8030,7 @@ msgstr "Toplu Mevduat" #. module: base #: selection:res.country,name_position:0 msgid "Before Address" -msgstr "" +msgstr "Adresten Önce" #. module: base #: selection:res.currency,position:0 @@ -8041,7 +8042,7 @@ msgstr "Tutar Önce" #, python-format msgid "" "Before clicking on 'Change Password', you have to write a new password." -msgstr "" +msgstr "'Şifreyi Değiştir' e tıklamadan önce, yeni bir şifre yazmalısınız." #. module: base #: model:res.country,name:base.by @@ -8056,7 +8057,7 @@ msgstr "Belçika Intrastat beyannamesi" #. module: base #: model:ir.module.module,shortdesc:base.module_pos_blackbox_be msgid "Belgian Registered Cash Register" -msgstr "" +msgstr "Belçika Kaydedilmiş Kasa Hareketleri " #. module: base #: model:res.country,name:base.be @@ -8086,7 +8087,7 @@ msgstr "Belçika - Bordro" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_fleet msgid "Belgium - Payroll - Fleet" -msgstr "" +msgstr "Belçika - Bordro - Filo" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account @@ -8121,7 +8122,7 @@ msgstr "Bütan" #. module: base #: model:ir.module.module,summary:base.module_mrp_plm msgid "Bill of Materials, Routings, Versions, Engineering Change Orders" -msgstr "" +msgstr "Ürün Reçeteleri, Rotalar, Sürümler, Mühendislik Değişim Siparişleri" #. module: base #: selection:ir.property,type:0 @@ -8151,12 +8152,12 @@ msgstr "Bağlantı Modeli" #: model:ir.model.fields,field_description:base.field_ir_actions_server__binding_type #: model:ir.model.fields,field_description:base.field_ir_cron__binding_type msgid "Binding Type" -msgstr "" +msgstr "Bağlantı Türü" #. module: base #: model:ir.module.module,shortdesc:base.module_hw_blackbox_be msgid "Blackbox Hardware Driver" -msgstr "" +msgstr "Blackbox Donanım Sürücüsü" #. module: base #: model:ir.module.module,shortdesc:base.module_website_blog @@ -8196,7 +8197,7 @@ msgstr "Bootswatch Tema" #. module: base #: model:res.country,name:base.ba msgid "Bosnia and Herzegovina" -msgstr "" +msgstr "Bosna Hersek" #. module: base #: model:res.country,name:base.bw @@ -8216,7 +8217,7 @@ msgstr "Bouvet Adası" #. module: base #: selection:res.company,external_report_layout:0 msgid "Boxed" -msgstr "" +msgstr "Kutulanmış" #. module: base #: model:res.country,name:base.br @@ -8242,7 +8243,7 @@ msgstr "Web sitesi ve acquirers köprü modülü." #: model:ir.module.module,description:base.module_website_helpdesk #: model:ir.module.module,summary:base.module_website_helpdesk msgid "Bridge module for helpdesk modules using the website." -msgstr "" +msgstr "Websitesini kullanarak yardım masası modülleri için köprü modülü." #. module: base #: model:res.country,name:base.io @@ -8298,7 +8299,7 @@ msgstr "İle" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_C msgid "C MANUFACTURING" -msgstr "" +msgstr "C Üretimi" #. module: base #: selection:report.paperformat,format:0 @@ -8318,7 +8319,7 @@ msgstr "CRM Ödüllendirme" #. module: base #: model:ir.module.module,shortdesc:base.module_crm_livechat msgid "CRM Livechat" -msgstr "" +msgstr "CRM Canlı Sohbet" #. module: base #: selection:base.language.export,format:0 @@ -8349,7 +8350,7 @@ msgstr "" #. module: base #: model:res.country,name:base.kh msgid "Cambodia" -msgstr "" +msgstr "Kamboçya" #. module: base #: model:res.country,name:base.cm @@ -8362,6 +8363,8 @@ msgstr "Kamerun" msgid "" "Can not create Many-To-One records indirectly, import the field separately" msgstr "" +"Dolaylı olarak Many-To-One kayıtları oluşturamaz, alanı ayrı olarak içe " +"aktarabilir" #. module: base #: code:addons/base/models/ir_module.py:616 @@ -8373,7 +8376,7 @@ msgstr "'%s' modülü güncellenemiyor. Yüklü değil" #: code:addons/base/models/ir_model.py:669 #, python-format msgid "Can only rename one field at a time!" -msgstr "" +msgstr "Bir seferde sadece bir alanı yeniden adlandırabilir!" #. module: base #: model:res.country,name:base.ca @@ -8439,12 +8442,13 @@ msgstr "Yapılandırmasını çoğaltması yamazsınız!" #, python-format msgid "Cannot rename/delete fields that are still present in views:" msgstr "" +"Görünümlerde hâlâ mevcut olan alanları yeniden adlandıramaz / silemezsiniz:" #. module: base #: code:addons/base/models/res_lang.py:228 #, python-format msgid "Cannot unactivate a language that is currently used by users." -msgstr "" +msgstr "Kullanıcı tarafından kullanılan bir dili pasif hale getiremez." #. module: base #: model:res.country,name:base.cv @@ -8506,7 +8510,7 @@ msgstr "Parolayı değiştir" #. module: base #: model:ir.ui.view,arch_db:base.view_country_form msgid "Change the way addresses are displayed in reports" -msgstr "" +msgstr "Adreslerin raporlarda gösterilme şeklini değiştirin" #. module: base #: code:addons/base/models/res_partner.py:337 @@ -8517,6 +8521,10 @@ msgid "" "a new contact should be created under that new company. You can use the " "\"Discard\" button to abandon this change." msgstr "" +"Bir kişinin şirketini değiştirmek, doğru bir şekilde ayarlanmadığında " +"yapılmalıdır. Var olan bir kişi yeni bir şirket için çalışmaya başlarsa, o " +"zaman yeni şirketin altında yeni bir bağlantı kurulmalıdır. Bu değişikliği " +"iptal etmek için \"Atma\" düğmesini kullanabilirsiniz." #. module: base #: code:addons/base/models/ir_model.py:656 @@ -8531,6 +8539,8 @@ msgid "" "Changing the type of a field is not yet supported. Please drop it and create" " it again!" msgstr "" +"Bir alan türünün değişikliği henüz desteklenmiyor. Lütfen bunu bırakın ve " +"yeniden oluşturun!" #. module: base #: selection:ir.property,type:0 @@ -8550,12 +8560,12 @@ msgstr "Çek Yazdırma" #. module: base #: model:ir.module.module,shortdesc:base.module_account_check_printing msgid "Check Printing Base" -msgstr "" +msgstr "Çek Yazdırma Temeli" #. module: base #: model:ir.module.module,shortdesc:base.module_hr_expense_check msgid "Check Printing in Expenses" -msgstr "" +msgstr "Giderlerde Çek Yazdırma" #. module: base #: model:ir.model.fields,help:base.field_res_partner__is_company @@ -8567,7 +8577,7 @@ msgstr "" #. module: base #: model:ir.module.module,summary:base.module_account_check_printing msgid "Check printing commons" -msgstr "" +msgstr "Genel Çek Yazdırma" #. module: base #: model:ir.model.fields,help:base.field_res_partner__customer @@ -8684,6 +8694,8 @@ msgid "" "Choose a subview of partners that includes only address fields, to change " "the way users can input addresses." msgstr "" +"Kullanıcıların adres girme şeklini değiştirmek için yalnızca adres " +"alanlarını içeren iş ortaklarının alt görünümünü seçin." #. module: base #: model:ir.model.fields,help:base.field_ir_mail_server__smtp_encryption @@ -8693,6 +8705,10 @@ msgid "" "- TLS (STARTTLS): TLS encryption is requested at start of SMTP session (Recommended)\n" "- SSL/TLS: SMTP sessions are encrypted with SSL/TLS through a dedicated port (default: 465)" msgstr "" +"Bağlantı şifreleme şemasını seçin:\n" +"- Yok: SMTP oturumları açık metin içinde yapılır.\n" +"- TLS (STARTTLS): SMTP oturumunun başlangıcında TLS şifrelemesi istenir (Tavsiye edilir)\n" +"- SSL / TLS: SMTP oturumları özel bir port üzerinden SSL / TLS ile şifrelenir (varsayılan: 465)" #. module: base #: model:res.country,name:base.cx @@ -8715,12 +8731,12 @@ msgstr "Semt/İlçe" #. module: base #: model:ir.module.module,shortdesc:base.module_base_address_city msgid "City Addresses" -msgstr "" +msgstr "Şehir " #. module: base #: selection:res.company,external_report_layout:0 msgid "Clean" -msgstr "" +msgstr "Temizle" #. module: base #: model:ir.ui.view,arch_db:base.view_base_module_update @@ -8777,6 +8793,7 @@ msgstr "İşbirliği Bloknotları" #: model:ir.module.module,summary:base.module_account_sepa_direct_debit msgid "Collect payments from your customers through SEPA direct debit." msgstr "" +"SEPA doğrudan ödeme yoluyla, müşterilerinizden ödemelerinizi toplayın." #. module: base #: model:res.country,name:base.co @@ -8819,12 +8836,12 @@ msgstr "Sütun 2" #. module: base #: model:ir.model.fields,help:base.field_ir_model_fields__column2 msgid "Column referring to the record in the comodel table" -msgstr "" +msgstr "Comodel tablosundaki reklama başvuran sütun" #. module: base #: model:ir.model.fields,help:base.field_ir_model_fields__column1 msgid "Column referring to the record in the model table" -msgstr "" +msgstr "Model tablosundaki kayda başvuran sütun" #. module: base #: selection:report.paperformat,format:0 @@ -8859,7 +8876,7 @@ msgstr "Ticari Varlık" #. module: base #: model:ir.module.module,summary:base.module_pos_data_drinks msgid "Common Drinks data for points of sale" -msgstr "" +msgstr "Satış noktaları için ortak içecek verileri " #. module: base #: model:ir.ui.view,arch_db:base.view_res_bank_form @@ -8885,7 +8902,7 @@ msgstr "Firmalar" #. module: base #: model:ir.ui.view,arch_db:base.view_users_form msgid "Companies count" -msgstr "" +msgstr "Firma sayıları" #. module: base #: model:ir.model.fields,field_description:base.field_ir_attachment__company_id @@ -8924,7 +8941,7 @@ msgstr "Firma Adı" #: model:ir.model.fields,field_description:base.field_res_partner__commercial_company_name #: model:ir.model.fields,field_description:base.field_res_users__commercial_company_name msgid "Company Name Entity" -msgstr "" +msgstr "Firma Adı Varlığı" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form @@ -8951,7 +8968,7 @@ msgstr "Firma Türü" #. module: base #: model:ir.module.module,shortdesc:base.module_project_timesheet_forecast_sale msgid "Compare timesheets and forecast for your projects" -msgstr "" +msgstr "Projeleriniz için zaman çizelgelerini ve öngörüleri kıyaslayın" #. module: base #: model:ir.model.fields,field_description:base.field_res_partner__contact_address @@ -9002,7 +9019,7 @@ msgstr "Yapılandırma Sihirbazı Adımları" #. module: base #: model:ir.actions.server,name:base.action_run_ir_action_todo msgid "Config: Run Remaining Action Todo" -msgstr "" +msgstr "Yapılandır: Yapılacak Kalan Eylemleri Çalıştır" #. module: base #: model:ir.ui.menu,name:base.menu_reporting_config @@ -9025,7 +9042,7 @@ msgstr "Yapılandırma Sihirbazları" #. module: base #: model:ir.module.module,summary:base.module_timesheet_grid_sale msgid "Configure timesheet invoicing" -msgstr "" +msgstr "Zaman çizelgesi faturalamayı yapılandır" #. module: base #: model:ir.ui.view,arch_db:base.view_base_module_uninstall @@ -9065,7 +9082,7 @@ msgstr "" #: code:addons/base/models/ir_mail_server.py:172 #, python-format msgid "Connection Test Succeeded! Everything seems properly set up!" -msgstr "" +msgstr "Bağlantı Testi Başarılı! Her şey düzgün ayarlanmış görünüyor!" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model_constraint__name @@ -9086,7 +9103,7 @@ msgstr "Aynı ada sahip modül benzersiz kısıtlamalardır." #. module: base #: model:res.partner.industry,name:base.res_partner_industry_F msgid "Construction" -msgstr "" +msgstr "Yap" #. module: base #: model:ir.model,name:base.model_res_partner @@ -9113,7 +9130,7 @@ msgstr "İletişim Formu" #. module: base #: model:ir.module.module,shortdesc:base.module_website_crm_phone_validation msgid "Contact Form Number Validation" -msgstr "" +msgstr "İletişim Form Numarası Doğrulaması" #. module: base #: model:ir.ui.view,arch_db:base.view_partner_form @@ -9217,7 +9234,7 @@ msgstr "E-posta adresi olmayan kişi oluşturulamadı!" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model__count msgid "Count (incl. archived)" -msgstr "" +msgstr "Say ( arşivleri dahil et)" #. module: base #: model:ir.actions.act_window,name:base.action_country @@ -9288,7 +9305,7 @@ msgstr "Erişim Yetkisi Oluştur" #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form msgid "Create Contextual Action" -msgstr "" +msgstr "Bağlamsal Eylem Oluştur" #. module: base #: model:ir.model.fields,field_description:base.field_ir_logging__create_date @@ -9310,12 +9327,12 @@ msgstr "Menü Oluştur" #. module: base #: model:ir.module.module,summary:base.module_website_form_project msgid "Create Tasks From Contact Form" -msgstr "" +msgstr "İletişim Formundan Görevler Oluştur" #. module: base #: model:ir.module.module,summary:base.module_crm_project msgid "Create Tasks from Leads" -msgstr "" +msgstr "Müşteri Adaylarından Görevler Oluştur" #. module: base #: model:ir.ui.view,arch_db:base.view_model_menu_create @@ -9408,12 +9425,13 @@ msgstr "Firma oluştur" #. module: base #: model:ir.module.module,summary:base.module_crm_livechat msgid "Create lead from livechat conversation" -msgstr "" +msgstr "Canlı görüşmelerden müşteri adayı oluştur" #. module: base #: model:ir.module.module,description:base.module_crm_livechat msgid "Create new lead with using /lead command in the channel" msgstr "" +"Kanalda / müşteri adayı komutunu kullanarak yeni müşteri adayı oluşturun" #. module: base #: model:ir.module.module,summary:base.module_survey @@ -9604,7 +9622,7 @@ msgstr "Satış Noktası için kredi kartı desteği" #. module: base #: model:ir.module.module,shortdesc:base.module_crm_phone_validation msgid "Crm Phone Numbers Validation" -msgstr "" +msgstr "CRM Telefon Numarası Doğrulama" #. module: base #: model:res.country,name:base.hr @@ -9614,12 +9632,12 @@ msgstr "Hırvatistan" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_hr msgid "Croatia - Accounting (RRIF 2012)" -msgstr "" +msgstr "Hırvatistan - Muhasebe (RRIF 2012)" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_hr_reports msgid "Croatia - RRIF 2012 COA - Accounting Reports" -msgstr "" +msgstr "Hırvatistan - RRIF 2012 COA - Muhasebe Raporları" #. module: base #: model:res.country,name:base.cu @@ -9687,7 +9705,7 @@ msgstr "Para Birimi" #. module: base #: model:ir.model.fields,help:base.field_res_currency__currency_unit_label msgid "Currency Unit Name" -msgstr "" +msgstr "Para Birimi Adı" #. module: base #: model:ir.model.fields,help:base.field_res_currency__symbol @@ -9756,13 +9774,13 @@ msgstr "Özel alanların 'x_' ile başlayan bir adı olmalıdır !" #. module: base #: model:ir.model.fields,field_description:base.field_res_country__name_position msgid "Customer Name Position" -msgstr "" +msgstr "Müşteri Adı Pozisyonu" #. module: base #: model:ir.module.module,shortdesc:base.module_portal #: model:ir.module.module,summary:base.module_portal msgid "Customer Portal" -msgstr "" +msgstr "Müşteri Portalı" #. module: base #: model:ir.module.module,shortdesc:base.module_rating @@ -9817,17 +9835,17 @@ msgstr "Çek Cumhuriyeti" #. module: base #: model:res.country,name:base.ci msgid "Côte d'Ivoire" -msgstr "" +msgstr "Fil Dişi Sahili" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_D msgid "D ELECTRICITY,GAS,STEAM AND AIR CONDITIONING SUPPLY" -msgstr "" +msgstr "D Elektrik, gaz, buhar ve iklimlendirme arzı" #. module: base #: model:ir.module.module,shortdesc:base.module_delivery_dhl msgid "DHL Shipping" -msgstr "" +msgstr "DHL Kargo" #. module: base #: selection:report.paperformat,format:0 @@ -9849,7 +9867,7 @@ msgstr "Verileri xml dönüştürme testler için" #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form msgid "Data to Write" -msgstr "" +msgstr "Yazma verisi" #. module: base #: model:ir.ui.view,arch_db:base.ir_logging_search_view @@ -9983,7 +10001,7 @@ msgstr "Diğer Kişileri Tekilleştir" #. module: base #: model:ir.model.fields,field_description:base.field_ir_filters__is_default msgid "Default Filter" -msgstr "" +msgstr "Varsayılan Filtre" #. module: base #: model:ir.module.module,shortdesc:base.module_theme_default @@ -9993,7 +10011,7 @@ msgstr "Öntanımlı Tema" #. module: base #: model:ir.model.fields,field_description:base.field_ir_default__json_value msgid "Default Value (JSON format)" -msgstr "" +msgstr "Varsayılan Değer (JSON formatı)" #. module: base #: model:ir.model.fields,help:base.field_ir_actions_act_window__limit @@ -10009,6 +10027,7 @@ msgstr "Varsayılan kağıt formatı?" #: model:ir.module.module,description:base.module_theme_default msgid "Default website theme to showcase customization possibilities." msgstr "" +"Özelleştirme olanaklarını sergilemek için varsayılan web sitesi teması." #. module: base #: model:ir.module.module,shortdesc:base.module_account_deferred_revenue @@ -10018,12 +10037,12 @@ msgstr "Ertelenmiş Gelirler" #. module: base #: model:ir.module.module,shortdesc:base.module_sale_subscription_asset msgid "Deferred Revenues Management for Subscriptions" -msgstr "" +msgstr "Abonelikler için Ertelenmiş Gelir Yönetimi" #. module: base #: model:ir.module.module,shortdesc:base.module_account_tax_python msgid "Define Taxes as Python Code" -msgstr "" +msgstr "Vergileri Python Kodu Olarak Tanımlayın" #. module: base #: model:ir.ui.view,arch_db:base.module_form @@ -10048,7 +10067,7 @@ msgstr "Erişim Yetkilerini Sil" #. module: base #: model:ir.module.module,shortdesc:base.module_delivery_barcode msgid "Delivery Barcode Scanning" -msgstr "" +msgstr "Teslimat Barkodu Taraması" #. module: base #: model:ir.module.module,shortdesc:base.module_delivery @@ -10063,7 +10082,7 @@ msgstr "Demo Veri" #. module: base #: model:res.country,name:base.cd msgid "Democratic Republic of the Congo" -msgstr "" +msgstr "Demokratik Kongo Cumhuriyeti" #. module: base #: model:res.country,name:base.dk @@ -10084,6 +10103,9 @@ msgid "" "\n" " name, partner_id.name" msgstr "" +"Hesaplama yönteminin bağlılıkları; virgül ile ayrılmış alan adlarının listesi, şöyle\n" +"\n" +"ad, partner_id.name" #. module: base #: model:ir.model.fields,field_description:base.field_ir_module_module_dependency__depend_id @@ -10108,7 +10130,7 @@ msgstr "Açıklama HTML" #. module: base #: model:ir.module.module,summary:base.module_mass_mailing_themes msgid "Design gorgeous mails" -msgstr "" +msgstr "Harika mailler tasarlayın" #. module: base #: model:ir.module.module,summary:base.module_mass_mailing @@ -10144,6 +10166,8 @@ msgid "" "Determines where the customer/company name should be placed, i.e. after or " "before the address." msgstr "" +"Müşteri/firma isimlerinin nerede olacağını belirler, örn. adresten önce yada" +" sonra." #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_de @@ -10153,17 +10177,17 @@ msgstr "Almanya - Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_de_reports msgid "Deutschland - Accounting Reports" -msgstr "" +msgstr "Almanya - Muhasebe Raporları" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_de_skr03 msgid "Deutschland SKR03 - Accounting" -msgstr "" +msgstr "Almanya SKR03 - Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_de_skr04 msgid "Deutschland SKR04 - Accounting" -msgstr "" +msgstr "Almanya SKR04 - Muhasebe" #. module: base #: selection:ir.ui.view,type:0 @@ -10312,7 +10336,7 @@ msgstr "Görünüm Adı" #. module: base #: model:ir.module.module,summary:base.module_website_studio msgid "Display Website Elements in Studio" -msgstr "" +msgstr "Studio'daki Website Elemanlarını Göster" #. module: base #: model:ir.model.fields,field_description:base.field_report_paperformat__header_line @@ -10323,11 +10347,12 @@ msgstr "Bir başlık satırı görüntüleme" #: model:ir.ui.view,arch_db:base.view_server_action_form msgid "Display an option in the 'More' top-menu in order to run this action." msgstr "" +"Bu eylemi çalıştırmak için 'Diğer' üst menüsünde bir seçenek görüntüleyin." #. module: base #: model:ir.ui.view,arch_db:base.act_report_xml_view msgid "Display an option on related documents to print this report" -msgstr "" +msgstr "Bu raporu yazdırmak için ilgili belgelerdeki bir seçeneği görüntüle" #. module: base #: model:ir.actions.act_window,help:base.action_country_group @@ -10335,6 +10360,9 @@ msgid "" "Display and manage the list of all countries group. You can create or delete" " country group to make sure the ones you are working on will be maintained." msgstr "" +"Tüm ülkeler grubunun listesini görüntüleyin ve yönetin. Üzerinde " +"çalıştığınız şeylerin korunacağından emin olmak için ülke grubu " +"oluşturabilir veya silebilirsiniz." #. module: base #: model:ir.actions.act_window,help:base.action_country @@ -10460,12 +10488,12 @@ msgstr "Süreler negatif olamaz" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_E msgid "E WATER SUPPLY;SEWERAGE,WASTE MANAGEMENT AND REMEDIATION ACTIVITIES" -msgstr "" +msgstr "E Su temini; Kanalizasyon, atık yönetimi ve çözüm faaliyetleri " #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_mx_edi msgid "EDI for Mexico" -msgstr "" +msgstr "Meksika için EDI" #. module: base #: model:ir.module.module,shortdesc:base.module_hw_escpos @@ -10485,7 +10513,7 @@ msgstr "Her model eşşiz olmalı!" #. module: base #: model:ir.module.module,summary:base.module_web_studio msgid "Easily create and customize your applications" -msgstr "" +msgstr "Uygulamanızı kolayca oluşturun ve kişiselleştirin" #. module: base #: model:res.country,name:base.ec @@ -10561,6 +10589,31 @@ msgid "" "* Nhomar Hernandez <nhomar@vauxoo.com> (Planner/Auditor)\n" "* Luis Torres <luis_t@vauxoo.com> (Developer)\n" msgstr "" +"Meksika için Elektronik Muhasebe ve Mali Raporlar\n" +"\n" +"Meksika Elektronik Faturasına mali raporları ekleyin\n" +"\n" +"- COA\n" +"- Geçici Mizan\n" +"- Yevmiye Kalemleri\n" +"\n" +"DIOT gibi başka operatör raporlar ekleyin.\n" +"\n" +"- DIOT\n" +"\n" +"Bilinen özellik sızması :\n" +"\n" +"- Mali beyan edilen belgelerin geçmişini sunmak için oluşturulan xml'yi kaydedin.\n" +"- Bu modülün kapsamını arttırmak ve ileride regresyonlardan kaçınmak için birim testleri.\n" +"\n" +"Yapılandırma\n" +"\n" +"Bu modülü yapılandırmak için, hesap çizelgenizin l10n_mx verisine ve yapısına bağlı olması şiddetle tavsiye edilir. Eğer CoA, l10n_mx'in ne yaptığına bağlı değilse bunu daha sonra ayarlayabilirsiniz, ancak fazladan manuel çalışmaya ihtiyacınız olacaktır.\n" +"\n" +"Katkıda bulunanlar\n" +"* Nhomar Hernandez <nhomar@vauxoo.com> (Planlayıcı/Denetleyici)\n" +"* Luis Torres\n" +"<luis_t@vauxoo.com> (Geliştirici)\n" #. module: base #: code:addons/base/models/ir_ui_view.py:641 @@ -10592,7 +10645,7 @@ msgstr "E-posta Ağ Geçidi" #. module: base #: model:ir.module.module,shortdesc:base.module_mass_mailing msgid "Email Marketing" -msgstr "" +msgstr "E-posta Pazarlama" #. module: base #: model:ir.ui.view,arch_db:base.view_users_form_simple_modif @@ -10631,12 +10684,12 @@ msgstr "Personeller" #: code:addons/base/models/ir_model.py:430 #, python-format msgid "Empty dependency in %r" -msgstr "" +msgstr "% r'de boş bağımlılık" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_D msgid "Energy supply" -msgstr "" +msgstr "Enerji temini" #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form @@ -10659,7 +10712,7 @@ msgstr "" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_R msgid "Entertainment" -msgstr "" +msgstr "Eğlence" #. module: base #: model:res.country,name:base.gq @@ -10670,7 +10723,7 @@ msgstr "Ekvatoral Gine" #: model:ir.module.module,summary:base.module_hr_maintenance #: model:ir.module.module,summary:base.module_maintenance msgid "Equipments, Assets, Internal Hardware, Allocation Tracking" -msgstr "" +msgstr "Ekipmanlar, Varlıklar, İç Donanım, Tahsis Takibi" #. module: base #: model:res.country,name:base.er @@ -10681,19 +10734,19 @@ msgstr "Eritre" #: code:addons/base/models/res_partner.py:86 #, python-format msgid "Error ! You can not create recursive tags." -msgstr "" +msgstr "Hata ! Tekrarlanan etiketler oluşturamazsınız." #. module: base #: code:addons/base/models/res_company.py:234 #, python-format msgid "Error ! You cannot create recursive companies." -msgstr "" +msgstr "Hata! Tekrarlayan firmalar oluşturamazsınız." #. module: base #: code:addons/base/models/report_paperformat.py:68 #, python-format msgid "Error ! You cannot select a format AND specific page width/height." -msgstr "" +msgstr "Hata! Spesifik bir sayfa genişliği/yüksekliği formatı seçemezsiniz." #. module: base #: code:addons/base/models/ir_ui_view.py:491 @@ -10715,13 +10768,13 @@ msgstr "Hata detayları:" #: code:addons/models.py:987 #, python-format msgid "Error while validating constraint" -msgstr "" +msgstr "Kısıtlama doğrulanırken hata oluştu" #. module: base #: code:addons/base/models/ir_ui_menu.py:76 #, python-format msgid "Error! You cannot create recursive menus." -msgstr "" +msgstr "Hata! Tekrarlanan menüler oluşturamazsınız. " #. module: base #: model:res.country,name:base.ee @@ -10741,7 +10794,7 @@ msgstr "Etiyopya - Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_et_reports msgid "Ethiopia - Accounting Reports" -msgstr "" +msgstr "Etiyopya - Muhasebe Raporları1" #. module: base #: model:res.country.group,name:base.europe @@ -10756,17 +10809,17 @@ msgstr "Değerlendirme Tipi" #. module: base #: model:ir.module.module,shortdesc:base.module_event_barcode msgid "Event Barcode Scanning" -msgstr "" +msgstr "Etkinlik Barkod Tarama" #. module: base #: model:ir.module.module,shortdesc:base.module_event_barcode_mobile msgid "Event Barcode in Mobile" -msgstr "" +msgstr "Moıbil için Etkinlik Barkodu" #. module: base #: model:ir.module.module,summary:base.module_event_barcode_mobile msgid "Event Barcode scan in Mobile" -msgstr "" +msgstr "Mobilde Etkinlik Barkodu Tarama" #. module: base #: model:ir.module.category,name:base.module_category_event_management @@ -10786,7 +10839,7 @@ msgstr "Etkinlik Satışı" #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form msgid "Example of Python code" -msgstr "" +msgstr "Python kodu örnekleri" #. module: base #: model:ir.module.module,description:base.module_gamification_sale_crm @@ -10819,28 +10872,28 @@ msgstr "Bunu içeren kişiler hariç" #. module: base #: model:ir.model.fields,field_description:base.field_ir_module_module_exclusion__exclusion_id msgid "Exclusion Module" -msgstr "" +msgstr "İhraç Modülü" #. module: base #: model:ir.model.fields,field_description:base.field_ir_module_module__exclusion_ids #: model:ir.ui.view,arch_db:base.module_form msgid "Exclusions" -msgstr "" +msgstr "İstisnalar" #. module: base #: model:ir.model.fields,field_description:base.field_ir_module_category__exclusive msgid "Exclusive" -msgstr "" +msgstr "İstisna" #. module: base #: model:ir.ui.view,arch_db:base.ir_cron_view_form msgid "Execute Every" -msgstr "" +msgstr "Her şeyi Yürüt" #. module: base #: selection:ir.actions.server,state:0 msgid "Execute Python Code" -msgstr "" +msgstr "Python Kodunu Uygula" #. module: base #: selection:ir.actions.server,state:0 @@ -10913,12 +10966,12 @@ msgstr "Çevirileri Dışa Aktar" #. module: base #: model:ir.module.module,summary:base.module_hr_expense_sepa msgid "Export expenses payments as SEPA Credit Transfer files" -msgstr "" +msgstr "Gider ödemelerini, SEPA Kredi Transfer dosyaları olarak dışa aktarın." #. module: base #: model:ir.module.module,summary:base.module_account_sepa msgid "Export payments as SEPA Credit Transfer files" -msgstr "" +msgstr "Ödemeleri, SEPA Kredi Transfer dosyaları olarak dışarı aktarın." #. module: base #: model:ir.model.fields,help:base.field_ir_server_object_lines__value @@ -10927,11 +10980,14 @@ msgid "" "When Formula type is selected, this field may be a Python expression that can use the same values as for the code field on the server action.\n" "If Value type is selected, the value will be used directly without evaluation." msgstr "" +"Bir değer belirtimi içeren ifade.\n" +" Formül türü seçildiğinde, bu alan sunucu eylemi üzerindeki kod alanıyla aynı değerleri kullanabilen bir Python ifadesi olabilir.\n" +" Değer türü seçiliyse, değer doğrudan değerlendirme olmadan kullanılır." #. module: base #: model:ir.module.module,shortdesc:base.module_base_address_extended msgid "Extended Addresses" -msgstr "" +msgstr "Genişletilmiş Adresler" #. module: base #: selection:ir.ui.view,mode:0 @@ -11003,12 +11059,12 @@ msgstr "Ek Araçlar" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_U msgid "Extraterritorial" -msgstr "" +msgstr "Yasal Sınırların Dışında" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_F msgid "F CONSTRUCTION" -msgstr "" +msgstr "F Yapı" #. module: base #: model:res.country,name:base.fk @@ -11034,7 +11090,7 @@ msgstr "İller/Eyaletler" #. module: base #: model:ir.module.module,shortdesc:base.module_delivery_fedex msgid "Fedex Shipping" -msgstr "" +msgstr "Fedex Kargo" #. module: base #: model:ir.module.module,summary:base.module_l10n_fr_fec @@ -11099,25 +11155,25 @@ msgstr "Alan" #: code:addons/base/models/ir_model.py:200 #, python-format msgid "Field \"Model\" cannot be modified on models." -msgstr "" +msgstr "Alan 'Modeli', modeller üzerinden değiştirilemez." #. module: base #: code:addons/base/models/ir_model.py:204 #, python-format msgid "Field \"Transient Model\" cannot be modified on models." -msgstr "" +msgstr "Alan \"Geçici Model\", modellerde değiştirilemez." #. module: base #: code:addons/base/models/ir_model.py:202 #, python-format msgid "Field \"Type\" cannot be modified on models." -msgstr "" +msgstr "Alan 'Tür', modeller üzerinden değiştirilemez." #. module: base #: code:addons/base/models/ir_ui_view.py:1047 #, python-format msgid "Field %r used in attributes must be present in view but is missing:" -msgstr "" +msgstr "Niteliklerde kullanılan % r alanı görünmelidir, ancak mevcut değil:" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model_fields__help @@ -11157,11 +11213,13 @@ msgstr "`%(field_name)s` alanı mevcut değil" msgid "" "Field names can only contain characters, digits and underscores (up to 63)." msgstr "" +"Alan isimleri sadece karakterler, rakamlar ve alt çizgi içerebilir (63e " +"kadar)" #. module: base #: sql_constraint:ir.model.fields:0 msgid "Field names must be unique per model." -msgstr "" +msgstr "Alan isimleri her model için benzersiz olmalıdır." #. module: base #: model:ir.actions.act_window,name:base.action_model_fields @@ -11184,7 +11242,7 @@ msgstr "Alan Açıklaması" #: code:addons/base/models/ir_model.py:570 #, python-format msgid "Fields: %s" -msgstr "" +msgstr "Alanlar: %s" #. module: base #: model:res.country,name:base.fj @@ -11229,6 +11287,10 @@ msgid "" "Technical Details:\n" "%s" msgstr "" +"Dosya, uyumsuzluk veya hatalı biçimlendirilmiş bir dosya nedeniyle içe aktarılmadı. (Geçerli biçimler .csv, .po, .pot)\n" +"\n" +"Teknik Detaylar:\n" +"%s" #. module: base #: model:ir.model.fields,field_description:base.field_ir_actions_act_window__filter @@ -11279,7 +11341,7 @@ msgstr "Yalnızca bir kullanıcı görebilir Filtreler" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_K msgid "Finance/Insurance" -msgstr "" +msgstr "Finans/Sigorta" #. module: base #: model:ir.module.module,summary:base.module_account_accountant @@ -11299,7 +11361,7 @@ msgstr "Finlandiya" #. module: base #: model:ir.module.module,shortdesc:base.module_mail_push msgid "Firebase Cloud Messaging" -msgstr "" +msgstr "Firebase Bulut Mesajlaşma" #. module: base #: model:ir.model.fields,field_description:base.field_res_lang__week_start @@ -11324,7 +11386,7 @@ msgstr "Folio 27 210 x 330 mm" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_I msgid "Food" -msgstr "" +msgstr "Gıda" #. module: base #: model:ir.model.fields,help:base.field_res_company__report_footer @@ -11355,6 +11417,8 @@ msgid "" "For one2many fields, the field on the target model that implement the " "opposite many2one relationship" msgstr "" +"One2many alanları için, ters modele many2one uygulanan ilişkiyi hedefleyen " +"alan." #. module: base #: model:ir.model.fields,help:base.field_ir_model_fields__relation @@ -11385,6 +11449,9 @@ msgid "" "\n" "(Document type: %s)" msgstr "" +"Bu çeşit belge için, sadece kendi oluşturduğunuz kayıtlara ulaşabilirsiniz.\n" +"\n" +"(Belge Türü: %s)" #. module: base #: selection:ir.actions.act_window,view_type:0 @@ -11397,7 +11464,7 @@ msgstr "Form" #: model:ir.model.fields,help:base.field_res_partner__email_formatted #: model:ir.model.fields,help:base.field_res_users__email_formatted msgid "Format email address \"Name <email@domain>\"" -msgstr "" +msgstr "E-posta adresini \"Ad <email @ alan adı>\" şeklinde biçimlendirin" #. module: base #: model:ir.model.fields,field_description:base.field_res_partner__email_formatted @@ -11439,34 +11506,38 @@ msgstr "Fransa - Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_reports msgid "France - Accounting Reports" -msgstr "" +msgstr "Fransa - Muhasebe Raporları" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_fec msgid "France - FEC" -msgstr "" +msgstr "Franca - FEC" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_certification msgid "France - VAT Anti-Fraud Certification (CGI 286 I-3 bis)" -msgstr "" +msgstr "Fransa - Vergi Numarası Anti-Fraud Sertifikası (CGI 286 I-3 bis)" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_sale_closing msgid "" "France - VAT Anti-Fraud Certification (CGI 286 I-3 bis) - Sale Closings" msgstr "" +"Fransa - Vergi Numarası Anti-Fraud Sertifikası (CGI 286 I-3 bis) - Satış " +"Kapanmaları" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_pos_cert msgid "" "France - VAT Anti-Fraud Certification for Point of Sale (CGI 286 I-3 bis)" msgstr "" +"Fransa - Satış Noktası için Vergi Numarası Anti-Fraud Sertifikası (CGI 286 " +"I-3 bis)" #. module: base #: model:res.country,name:base.gf msgid "French Guiana" -msgstr "" +msgstr "Fransız Guyanası" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll @@ -11476,7 +11547,7 @@ msgstr "Fransa Bodro" #. module: base #: model:res.country,name:base.pf msgid "French Polynesia" -msgstr "" +msgstr "Fransız Polinezyası" #. module: base #: model:res.country,name:base.tf @@ -11528,6 +11599,7 @@ msgstr "Fonksiyon" #: model:res.partner.industry,full_name:base.res_partner_industry_G msgid "G WHOLESALE AND RETAIL TRADE;REPAIR OF MOTOR VEHICLES AND MOTORCYCLES" msgstr "" +"Toptan ve Perakende Ticareti, Motorlu Araçlar ve Motosikletlerin Onarımı" #. module: base #: selection:ir.module.module,license:0 @@ -11557,22 +11629,22 @@ msgstr "" #. module: base #: model:ir.module.module,description:base.module_l10n_in_purchase msgid "GST Purchase Report" -msgstr "" +msgstr "GST Satın Alma Raporu" #. module: base #: model:ir.module.module,description:base.module_l10n_in_sale msgid "GST Sale Report" -msgstr "" +msgstr "GST Satış Raporu" #. module: base #: model:ir.module.module,description:base.module_l10n_in_stock msgid "GST Stock Report" -msgstr "" +msgstr "GST Stok Raporu" #. module: base #: model:res.country,vat_label:base.in msgid "GSTIN" -msgstr "" +msgstr "GSTIN" #. module: base #: model:res.country,name:base.ga @@ -11599,7 +11671,7 @@ msgstr "Gantt" #. module: base #: model:ir.module.module,summary:base.module_hr_holidays_gantt msgid "Gantt view for Leaves Dashboard" -msgstr "" +msgstr "İzin paneli için Gantt görünümü" #. module: base #: model:ir.module.module,shortdesc:base.module_web_kanban_gauge @@ -11626,7 +11698,7 @@ msgstr "Genel Ayarlar" #: model:ir.ui.menu,name:base.menu_wizard_update_translations #: model:ir.ui.view,arch_db:base.wizard_update_translations msgid "Generate Missing Terms" -msgstr "" +msgstr "Eksik Şartları Oluşturun" #. module: base #: model:ir.ui.view,arch_db:base.ir_property_view_search @@ -11679,7 +11751,7 @@ msgstr "Cebelitarık" #. module: base #: model:ir.module.module,shortdesc:base.module_mail_github msgid "Github Integration with Discuss" -msgstr "" +msgstr "Discuss ile Github Entegrasyonu" #. module: base #: model:ir.model.fields,field_description:base.field_ir_rule__global @@ -11805,7 +11877,7 @@ msgstr "Yunanistan - Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_gr_reports msgid "Greece - Accounting Reports" -msgstr "" +msgstr "Yunanistan - Muhasebe Raporları" #. module: base #: model:res.country,name:base.gl @@ -11826,7 +11898,7 @@ msgstr "Tablo" #. module: base #: model:ir.module.module,shortdesc:base.module_web_grid msgid "Grid View" -msgstr "" +msgstr "Tablo Görünümü" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model_access__group_id @@ -11903,12 +11975,12 @@ msgstr "Gruplar (grupsuz = global)" #. module: base #: model:res.country,name:base.gp msgid "Guadeloupe" -msgstr "" +msgstr "Guadeloupe" #. module: base #: model:res.country,name:base.gu msgid "Guam" -msgstr "" +msgstr "Guam" #. module: base #: model:res.country,name:base.gt @@ -11933,7 +12005,7 @@ msgstr "Gine" #. module: base #: model:res.country,name:base.gw msgid "Guinea-Bissau" -msgstr "" +msgstr "Gine Bissau" #. module: base #: model:res.country,name:base.gy @@ -11943,12 +12015,12 @@ msgstr "Guyana" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_H msgid "H TRANSPORTATION AND STORAGE" -msgstr "" +msgstr "H Ulaşım ve Depolama " #. module: base #: model:ir.module.module,shortdesc:base.module_hr_contract_salary msgid "HR Contract Salary (Belgium)" -msgstr "" +msgstr "İK Sözleşme Maaşı" #. module: base #: model:ir.module.module,shortdesc:base.module_hr_gamification @@ -11958,7 +12030,7 @@ msgstr "IK Ödüllendirme" #. module: base #: model:ir.module.module,shortdesc:base.module_hr_org_chart msgid "HR Org Chart" -msgstr "" +msgstr "İK Organizasyon Planı" #. module: base #: selection:ir.actions.report,report_type:0 @@ -11983,7 +12055,7 @@ msgstr "Barkod Tarayıcıları için Donanım Sürücüleri" #. module: base #: model:ir.module.module,summary:base.module_hw_blackbox_be msgid "Hardware Driver for Belgian Fiscal Data Modules" -msgstr "" +msgstr "Belçika Mali Veri Modülleri için Donanım Sürücüsü" #. module: base #: model:ir.module.module,summary:base.module_hw_escpos @@ -12013,12 +12085,12 @@ msgstr "Başlık boşluğu" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_Q msgid "Health/Social" -msgstr "" +msgstr "Sağlık/Sosyal" #. module: base #: model:res.country,name:base.hm msgid "Heard Island and McDonald Islands" -msgstr "" +msgstr "Heard Adası ve McDonald Adaları" #. module: base #: selection:ir.translation,type:0 @@ -12030,7 +12102,7 @@ msgstr "Yardım" #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form msgid "Help with Python expressions" -msgstr "" +msgstr "Python ifadeleri ile yardım." #. module: base #: model:ir.module.category,name:base.module_category_helpdesk @@ -12041,12 +12113,12 @@ msgstr "Yardım Masası" #. module: base #: model:ir.module.module,shortdesc:base.module_helpdesk_timesheet msgid "Helpdesk Timesheet" -msgstr "" +msgstr "Yardım Masası Zaman Çizelgesi" #. module: base #: model:ir.module.module,shortdesc:base.module_website_helpdesk_forum msgid "Helpdesk: Knowledge Base" -msgstr "" +msgstr "Yardım Masası: Bilgi Üssü" #. module: base #: model:ir.module.category,description:base.module_category_point_of_sale @@ -12055,6 +12127,9 @@ msgid "" "simplified payment mode encoding, automatic picking lists generation and " "more." msgstr "" +"Hızlı satış şifreleme, basit ödeme modu şifreleme, otomatik ayıklama listesi" +" oluşturma ve daha birçok işlem ile Satış Noktasından en iyi verimi almanıza" +" yardım eder." #. module: base #: model:ir.module.category,description:base.module_category_accounting_and_finance @@ -12074,6 +12149,8 @@ msgstr "Teklifleri, sipariş emirlerini ve faturalarınızı yönetmenizi sağla #: model:ir.module.category,description:base.module_category_lead_automation msgid "Helps you manage lead of your marketing campaigns step by step." msgstr "" +"Pazarlama kampanyanızın müşteri potansiyelini adım adım yönetmenize yardımcı" +" olur." #. module: base #: model:ir.module.category,description:base.module_category_hr_attendance @@ -12122,7 +12199,7 @@ msgstr "" #. module: base #: model:ir.module.category,description:base.module_category_hr_holidays msgid "Helps you manage your leaves." -msgstr "" +msgstr "İzinlerinizi yönetmenize yardımcı olur." #. module: base #: model:ir.module.category,description:base.module_category_manufacturing @@ -12138,6 +12215,8 @@ msgid "" "Helps you manage your mass mailing for design\n" " professional emails and reuse templates." msgstr "" +"Profesyonel e-postalar tasarlamak ve şablonları yeniden kullanmak için toplu" +" e-postanızı yönetmenize yardımcı olur." #. module: base #: model:ir.module.category,description:base.module_category_hr_payroll @@ -12159,6 +12238,8 @@ msgid "" "Helps you manage your purchase-related processes such as requests for " "quotations, supplier bills, etc..." msgstr "" +"Teklif talepleri, tedarikçi faturaları gibi satın alma ile ilgili " +"süreçlerinizi yönetmenize yardımcı olur" #. module: base #: model:ir.module.category,description:base.module_category_hr_recruitment @@ -12240,7 +12321,7 @@ msgstr "Saat" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_T msgid "Households" -msgstr "" +msgstr "Mesken" #. module: base #: model:ir.model.fields,help:base.field_ir_cron__numbercall @@ -12265,7 +12346,7 @@ msgstr "İK İşe Alım Görüşme Formları" #. module: base #: model:ir.module.category,name:base.module_category_human_resource msgid "Human Resource" -msgstr "" +msgstr "İnsan Kaynakları" #. module: base #: model:ir.module.category,name:base.module_category_human_resources_survey @@ -12280,7 +12361,7 @@ msgstr "Macar - muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_hu_reports msgid "Hungarian - Accounting Reports" -msgstr "" +msgstr "Macaristan - Muhasebe Raporları" #. module: base #: model:res.country,name:base.hu @@ -12290,7 +12371,7 @@ msgstr "Macaristan" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_I msgid "I ACCOMMODATION AND FOOD SERVICE ACTIVITIES" -msgstr "" +msgstr "Konaklama ve Gıda Hizmet Faaliyetleri" #. module: base #: model:ir.module.module,shortdesc:base.module_base_iban @@ -12428,7 +12509,7 @@ msgstr "ISO kodu" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_J msgid "IT/Communication" -msgstr "" +msgstr "BT/İletişim" #. module: base #: model:res.country,name:base.is @@ -12456,6 +12537,8 @@ msgid "" "If checked and the action is bound to a model, it will only appear in the " "More menu on list views" msgstr "" +"İşaretlenirse ve eylem modele bağlıysa, yalnızca liste görünümündeki Diğer " +"menüsünde görünür." #. module: base #: model:ir.model.fields,help:base.field_ir_mail_server__smtp_debug @@ -12463,6 +12546,8 @@ msgid "" "If enabled, the full output of SMTP sessions will be written to the server " "log at DEBUG level (this is very verbose and may include confidential info!)" msgstr "" +"Etkinleştirilmişse, SMTP oturumlarının tam çıkışı, DEBUG düzeyinde sunucu " +"günlüğüne yazılır (bu çok ayrıntılıdır ve gizli bilgileri içerebilir!)" #. module: base #: model:ir.model.fields,help:base.field_ir_rule__global @@ -12497,7 +12582,7 @@ msgstr "İşlem bağlayıcı sadece bu kullanıcı için geçerli." #. module: base #: model:ir.model.fields,help:base.field_ir_default__condition msgid "If set, applies the default upon condition." -msgstr "" +msgstr "Ayarlanırsa, koşullu varsayılanı uygular." #. module: base #: model:ir.ui.view,arch_db:base.view_server_action_form @@ -12505,6 +12590,8 @@ msgid "" "If several child actions return an action, only the last one will be executed.\n" " This may happen when having server actions executing code that returns an action, or server actions returning a client action." msgstr "" +"Birden fazla alt eylemi bir eylem döndürürse, yalnızca sonuncu yürütülür.\n" +" Bu, bir eylemi döndüren kod yürüten sunucu eylemleri veya istemci eylemi döndüren sunucu eylemleri olduğunda ortaya çıkabilir." #. module: base #: model:ir.model.fields,help:base.field_res_users__action_id @@ -12587,6 +12674,8 @@ msgid "" "If you enable this option, existing translations (including custom ones) " "will be overwritten and replaced by those in this file" msgstr "" +"Bu seçeneği etkinleştirirseniz, mevcut çevirilerin (özel olanlar dahil) " +"üzerine yazılır ve bu dosyadakiler tarafından değiştirilir." #. module: base #: model:ir.model.fields,help:base.field_ir_ui_menu__groups_id @@ -12606,6 +12695,9 @@ msgid "" " (if you delete a native ACL, it will be re-created when you reload the " "module)." msgstr "" +"Etkin alanın işaretini kaldırırsanız, ACL'yi silmeden devre dışı bırakır " +"(yerel bir ACL'yi silerseniz, modülü yeniden yüklediğinizde yeniden " +"oluşturulur)." #. module: base #: model:ir.model.fields,help:base.field_ir_rule__active @@ -12614,11 +12706,14 @@ msgid "" "deleting it (if you delete a native record rule, it may be re-created when " "you reload the module)." msgstr "" +"Etkin alanın işaretini kaldırırsanız, kayıt kuralını silmeden devre dışı " +"bırakır (bir yerel kayıt kuralını silerseniz, modülü yeniden yüklediğinizde " +"yeniden oluşturulabilir)." #. module: base #: model:ir.ui.view,arch_db:base.view_base_module_upgrade msgid "If you wish to cancel the process, press the cancel button below" -msgstr "" +msgstr "Eğer işlemi iptal etmek isterseniz, aşağıdaki iptal tuşuna basın" #. module: base #: model:ir.model.fields,field_description:base.field_res_country__image @@ -12635,12 +12730,12 @@ msgstr "Etkilenen Uygulamalar" #. module: base #: model:ir.model.fields,field_description:base.field_base_module_uninstall__model_ids msgid "Impacted data models" -msgstr "" +msgstr "Etkilenen veri modelleri" #. module: base #: model:ir.model.fields,field_description:base.field_base_module_uninstall__module_ids msgid "Impacted modules" -msgstr "" +msgstr "Etkilenen modüller" #. module: base #: model:ir.model.fields,field_description:base.field_ir_sequence__implementation @@ -12650,7 +12745,7 @@ msgstr "Uygulama" #. module: base #: model:ir.module.module,summary:base.module_base_sparse_field msgid "Implementation of sparse fields." -msgstr "" +msgstr "Seyrek alanların uygulanması" #. module: base #: model:ir.module.module,summary:base.module_pos_blackbox_be @@ -12658,6 +12753,8 @@ msgid "" "Implements the registered cash system, adhering to guidelines by FPS " "Finance." msgstr "" +"Kayıtlı nakit sistemini uygular ve FPS Finance tarafından yönergelere bağlı " +"kalır." #. module: base #: model:ir.ui.menu,name:base.menu_translation_export @@ -12694,7 +12791,7 @@ msgstr "Çeviri İçe Aktar" #. module: base #: model:ir.module.module,description:base.module_currency_rate_live msgid "Import exchange rates from the Internet.\n" -msgstr "" +msgstr "Döviz kurlarını internetten içe aktar.\n" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model__modules @@ -12742,27 +12839,27 @@ msgstr "Hindistan Hesapplanı" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_reports msgid "Indian - Accounting Reports" -msgstr "" +msgstr "Hindistan - Muhasebe Raporları" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_purchase msgid "Indian - Purchase Report(GST)" -msgstr "" +msgstr "Hindistan - Satın Alma Raporları (GST)" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_sale msgid "Indian - Sale Report(GST)" -msgstr "" +msgstr "Hindistan - Satış Raporları (GST)" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_schedule6 msgid "Indian - Schedule VI Accounting" -msgstr "" +msgstr "Hindistan - Program VI Muhasebe" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_stock msgid "Indian - Stock Report(GST)" -msgstr "" +msgstr "Hindistan - Stok Raporu (GST)" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll @@ -12849,7 +12946,7 @@ msgstr "Satırda Düzenle" #. module: base #: model:ir.model.fields,field_description:base.field_res_country__address_view_id msgid "Input View" -msgstr "" +msgstr "Giriş Görünümü" #. module: base #: code:addons/base/models/ir_module.py:436 @@ -12920,22 +13017,22 @@ msgstr "Tamsayı" #. module: base #: model:ir.module.module,description:base.module_web_clearbit msgid "Integrate Clearbit API to get company logo" -msgstr "" +msgstr "Firma logosu almak için Clearbit API entegre olun" #. module: base #: model:ir.module.module,description:base.module_sale_coupon msgid "Integrate coupon mechanism in sales orders." -msgstr "" +msgstr "Satış siparişlerinde kupon mekanizması ile entegre olun." #. module: base #: model:ir.module.module,description:base.module_sale_coupon_delivery msgid "Integrate coupon mechanism with shipping costs." -msgstr "" +msgstr "Teslimat maliyeti ile kupon mekanizmasını entegre edin." #. module: base #: model:ir.module.module,description:base.module_website_sale_coupon msgid "Integrate coupons mechanism in ecommerce." -msgstr "" +msgstr "Kupon mekanizmasını, eticarete entegre edin." #. module: base #: model:ir.module.module,shortdesc:base.module_inter_company_rules @@ -13045,7 +13142,7 @@ msgstr "" #: code:addons/base/models/ir_default.py:68 #, python-format msgid "Invalid field %s.%s" -msgstr "" +msgstr "Geçersiz alan %s.%s" #. module: base #: sql_constraint:ir.ui.view:0 @@ -13053,13 +13150,15 @@ msgid "" "Invalid inheritance mode: if the mode is 'extension', the view must extend " "an other view" msgstr "" +"Geçersiz kalıtım modu: mod 'uzantı' ise, görünüm başka bir görünümü " +"uzatmalıdır" #. module: base #: code:addons/base/models/ir_actions.py:128 #: code:addons/base/models/ir_actions.py:130 #, python-format msgid "Invalid model name %r in action definition." -msgstr "" +msgstr "Eylem tanımındaki geçersiz model adı %r" #. module: base #: code:addons/base/models/ir_ui_view.py:632 @@ -13077,7 +13176,7 @@ msgstr "Dizisi için geçersiz önek veya sonek '%s'" #: code:addons/base/models/res_users.py:327 #, python-format msgid "Invalid search criterion" -msgstr "" +msgstr "Geçersiz arama kriteri" #. module: base #: code:addons/base/models/ir_property.py:69 @@ -13089,7 +13188,7 @@ msgstr "Geçersiz tür" #: code:addons/base/models/ir_default.py:70 #, python-format msgid "Invalid value for %s.%s: %s" -msgstr "" +msgstr "%s.%s:%s için geçersiz değer" #. module: base #: code:addons/base/models/ir_ui_view.py:343 @@ -13136,7 +13235,7 @@ msgstr "Faturalama & Ödemeler" #: model:ir.module.category,name:base.module_category_invoicing_management #: model:ir.module.module,shortdesc:base.module_account_invoicing msgid "Invoicing Management" -msgstr "" +msgstr "Faturalama Yönetimi" #. module: base #: model:res.country,name:base.ir @@ -13204,7 +13303,7 @@ msgstr "İtalya - Muhasebe" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_J msgid "J INFORMATION AND COMMUNICATION" -msgstr "" +msgstr "J BİLGİ VE İLETİŞİM" #. module: base #: model:res.country,name:base.jm @@ -13270,7 +13369,7 @@ msgstr "Zamanında Planlama" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_K msgid "K FINANCIAL AND INSURANCE ACTIVITIES" -msgstr "" +msgstr "K FİNANSAL VE SİGORTA ETKİNLİKLERİ" #. module: base #: selection:ir.actions.act_window.view,view_mode:0 @@ -13287,7 +13386,7 @@ msgstr "Kazkistan" #: model:ir.model.fields,help:base.field_res_users__password msgid "" "Keep empty if you don't want the user to be able to connect on the system." -msgstr "" +msgstr "Kullanıcının sisteme bağlanmasını istemiyorsanız boş tutun." #. module: base #: model:res.country,name:base.ke @@ -13314,7 +13413,7 @@ msgstr "Kiribati" #. module: base #: model:ir.module.module,summary:base.module_website_helpdesk_forum msgid "Knowledge base for helpdesk based on Odoo Forum" -msgstr "" +msgstr "Odoo Forumuna dayanan yardım masası için bilgi bankası" #. module: base #: model:ir.module.module,description:base.module_l10n_si @@ -13329,12 +13428,12 @@ msgstr "Kuveyt" #. module: base #: model:res.country,name:base.kg msgid "Kyrgyzstan" -msgstr "" +msgstr "Kırgızistan" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_L msgid "L REAL ESTATE ACTIVITIES" -msgstr "" +msgstr "L EMLAK FAALİYETLERİ" #. module: base #: selection:ir.module.module,license:0 @@ -13685,7 +13784,7 @@ msgstr "Launchpad" #. module: base #: model:ir.model.fields,field_description:base.field_res_country__address_format msgid "Layout in Reports" -msgstr "" +msgstr "Rapor Düzeni" #. module: base #: model:ir.module.category,name:base.module_category_lead_automation @@ -13700,7 +13799,7 @@ msgstr "Aday Skoru" #. module: base #: model:ir.module.module,shortdesc:base.module_crm_project msgid "Lead to Tasks" -msgstr "" +msgstr "Görevlere Öncülük Et" #. module: base #: model:ir.module.module,summary:base.module_crm @@ -13715,7 +13814,7 @@ msgstr "İzin Yönetimi" #. module: base #: model:ir.module.module,summary:base.module_hr_holidays msgid "Leave allocations and leave requests" -msgstr "" +msgstr "İzin tahsisleri ve izin talepleri" #. module: base #: model:ir.module.category,name:base.module_category_hr_holidays @@ -13725,7 +13824,7 @@ msgstr "İzinler" #. module: base #: model:ir.module.module,shortdesc:base.module_hr_holidays_gantt msgid "Leaves Gantt" -msgstr "" +msgstr "İzin Gantt" #. module: base #: model:res.country,name:base.lb @@ -13775,7 +13874,7 @@ msgstr "Lesotho" #. module: base #: model:ir.module.module,description:base.module_website_sale_wishlist msgid "Let returning shoppers save products in a wishlist" -msgstr "" +msgstr "Alışveriş yapanlara bir istek listesinde ürün kaydetme izni verin" #. module: base #: selection:report.paperformat,format:0 @@ -13833,11 +13932,16 @@ msgid "" "\n" " * UPDATE ME\n" msgstr "" +"Bağlantı Hesabı ve Ödeme ve Portal Ödeme Ekleme\n" +"\n" +"Ödemeyi etkinleştirmek için hesapla ilgili ödeme araçları ve portal seçenekleri sağlayın.\n" +"\n" +"* BENİ GÜNCELLE\n" #. module: base #: model:ir.module.module,summary:base.module_sale_payment msgid "Link Sales and Payment" -msgstr "" +msgstr "Satış Bağlantısı ve Ödeme" #. module: base #: model:ir.module.module,description:base.module_sale_payment @@ -13851,6 +13955,14 @@ msgid "" " * JS code to handle a payment form (eCommerce\n" " * add payment-related fields on SO\n" msgstr "" +"Satış Bağlantısı ve Ödeme\n" +"\n" +"Satışla ilgili ödeme için araçlar sağlayın.\n" +"\n" +"* satış siparişi onayı gibi işlemlerin özel yönetimi\n" +"* öde/sat izni verildiğinde işlemlerle işlemek için araçlar yöntemi\n" +"* bir ödeme formunu işlemek için JS kodu (eTicaret)\n" +"* satış siparişi üzerine ödeme ile ilgili alan ekleyin\n" #. module: base #: model:ir.module.module,shortdesc:base.module_link_tracker @@ -13860,12 +13972,12 @@ msgstr "Bağlantı İzleyici" #. module: base #: model:ir.module.module,summary:base.module_pos_sale msgid "Link module between Point of Sale and Sales" -msgstr "" +msgstr "Satış ve Satış Noktası arasındaki bağlantı modülü" #. module: base #: model:ir.module.module,shortdesc:base.module_project_forecast_sale msgid "Link module between project_forecast and sale(_timesheet)" -msgstr "" +msgstr "project_forecast ile sale(_timesheet) arasındaki bağlantı modülü." #. module: base #: model:ir.model.fields,field_description:base.field_ir_actions_server__link_field_id @@ -13912,7 +14024,7 @@ msgstr "Ziyaretçiler / Müşteriler ile Canlı Sohbet" #. module: base #: model:ir.module.module,shortdesc:base.module_currency_rate_live msgid "Live Currency Exchange Rate" -msgstr "" +msgstr "Canlı Döviz Kuru" #. module: base #: model:ir.ui.view,arch_db:base.view_base_language_install @@ -14002,7 +14114,7 @@ msgstr "Lüksemburg - Muhasebe Raporları" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_M msgid "M PROFESSIONAL, SCIENTIFIC AND TECHNICAL ACTIVITIES" -msgstr "" +msgstr "M PROFESYONEL, BİLİMSEL VE TEKNİK ETKİNLİKLER" #. module: base #: model:ir.module.module,shortdesc:base.module_mrp_byproduct @@ -14013,7 +14125,7 @@ msgstr "MRP Yan Ürünleri" #: model:ir.module.module,shortdesc:base.module_quality_mrp #: model:ir.module.module,shortdesc:base.module_quality_mrp_workorder msgid "MRP features for Quality Control" -msgstr "" +msgstr "Kalite Kontrol için MRP özellikleri" #. module: base #: model:res.country,name:base.mo @@ -14075,7 +14187,7 @@ msgstr "Ana Sıra" #: selection:ir.actions.act_window,target:0 #: selection:ir.actions.client,target:0 msgid "Main action of Current Window" -msgstr "" +msgstr "Geçerli Pencerenin ana aksiyonu" #. module: base #: model:ir.model.fields,field_description:base.field_ir_module_module__maintainer @@ -14095,7 +14207,7 @@ msgstr "" #. module: base #: model:ir.module.module,shortdesc:base.module_mrp_maintenance msgid "Maintenance - MRP" -msgstr "" +msgstr "Bakım - MRP" #. module: base #: model:res.country,name:base.mw @@ -14125,7 +14237,7 @@ msgstr "Malta" #. module: base #: model:ir.module.module,summary:base.module_website_event_sale msgid "Manage Events and Sell Tickets Online" -msgstr "" +msgstr "Etkinlikleri Yönet ve Online Bilet Sat" #. module: base #: model:ir.module.module,description:base.module_hr_recruitment @@ -14188,7 +14300,7 @@ msgstr "" #. module: base #: model:ir.actions.act_window,help:base.action_res_bank_form msgid "Manage bank records you want to be used in the system." -msgstr "" +msgstr "Sistemde kullanmak istediğiniz banka hesaplarınızı yönetin." #. module: base #: model:ir.actions.act_window,help:base.action_partner_category_form @@ -14208,6 +14320,8 @@ msgid "" "Manage sectors of activity to better classify partners for tracking and " "analysis purposes." msgstr "" +"İzleme ve analiz amacıyla iş ortaklarını daha iyi sınıflandırmak için " +"faaliyet sektörlerini yönetin." #. module: base #: model:ir.actions.act_window,help:base.action_partner_title_contact @@ -14216,16 +14330,20 @@ msgid "" "way you want to print them in letters and other documents. Some example: " "Mr., Mrs." msgstr "" +"Sisteminizde bulundurmak istediğiniz iletişim başlıkları ve bunları mektup " +"ve diğer belgelerde yazdırmak istediğiniz gibi yönetin. Örnek: Bay Bayan" #. module: base #: model:ir.module.module,summary:base.module_account_voucher msgid "Manage your debts and credits thanks to simple sale/purchase receipts" msgstr "" +"Basit satış / satın alma makbuzları sayesinde borçlarınızı ve kredilerinizi " +"yönetin" #. module: base #: model:ir.module.module,summary:base.module_hr_payroll msgid "Manage your employee payroll records" -msgstr "" +msgstr "Çalışan bordro kayıtlarınızı yönetin" #. module: base #: model:ir.module.category,name:base.module_category_manufacturing @@ -14301,7 +14419,7 @@ msgstr "Marshall Adaları" #. module: base #: model:res.country,name:base.mq msgid "Martinique" -msgstr "" +msgstr "Martinique" #. module: base #: model:ir.module.category,name:base.module_category_mass_mailing @@ -14316,12 +14434,12 @@ msgstr "Toplu Posta Şablonları" #. module: base #: model:ir.module.module,shortdesc:base.module_mass_mailing_event msgid "Mass mailing on attendees" -msgstr "" +msgstr "Katılımcılara toplu mail gönderimi" #. module: base #: model:ir.module.module,shortdesc:base.module_mass_mailing_event_track msgid "Mass mailing on track speakers" -msgstr "" +msgstr "Konuşmacı için toplu mail gönderimi" #. module: base #: model:ir.module.module,shortdesc:base.module_mrp_mps @@ -14411,7 +14529,7 @@ msgstr "Menüleri özelleştirme" #. module: base #: model:ir.module.module,shortdesc:base.module_pos_mercury msgid "Mercury Payment Services" -msgstr "" +msgstr "Mercury Ödeme Hizmetleri" #. module: base #: model:ir.ui.view,arch_db:base.base_partner_merge_automatic_wizard_form @@ -14472,7 +14590,7 @@ msgstr "" #. module: base #: model:ir.module.module,summary:base.module_l10n_mx_edi msgid "Mexican Localization for EDI documents" -msgstr "" +msgstr "EDI Belgeleri için Meksika Yerelleştirmesi" #. module: base #: model:res.country,name:base.mx @@ -14502,7 +14620,7 @@ msgstr "EnazID" #. module: base #: model:res.partner.industry,name:base.res_partner_industry_B msgid "Mining" -msgstr "" +msgstr "Madencilik" #. module: base #: model:ir.ui.view,arch_db:base.sequence_view @@ -14541,7 +14659,7 @@ msgstr "SMTP Sunucusu Yok" #: code:addons/models.py:2782 #, python-format msgid "Missing document(s)" -msgstr "" +msgstr "Eksik belgeler" #. module: base #: code:addons/models.py:5176 @@ -14553,7 +14671,7 @@ msgstr "Alan için gerekli değer eksik '%s' (%s)" #: code:addons/base/models/ir_ui_view.py:387 #, python-format msgid "Missing view architecture." -msgstr "" +msgstr "Eksik görünüm yapısı" #. module: base #: model:res.partner.title,name:base.res_partner_title_mister @@ -14706,7 +14824,7 @@ msgstr "Modül Adı" #. module: base #: model:ir.model,name:base.model_base_module_uninstall msgid "Module Uninstallation" -msgstr "" +msgstr "Yüklemeyi Kaldırma Modülü" #. module: base #: model:ir.actions.act_window,name:base.action_view_base_module_update @@ -14736,7 +14854,7 @@ msgstr "Modül Bağımlığı" #. module: base #: model:ir.model,name:base.model_ir_module_module_exclusion msgid "Module exclusion" -msgstr "" +msgstr "Modül ihracı" #. module: base #: code:addons/convert.py:830 @@ -14765,7 +14883,7 @@ msgstr "" #. module: base #: model:res.country,name:base.md msgid "Moldova" -msgstr "" +msgstr "Moldova" #. module: base #: model:res.country,name:base.mc @@ -14825,7 +14943,7 @@ msgstr "Bay." #. module: base #: model:ir.module.module,shortdesc:base.module_mrp_workorder msgid "Mrp Workorder" -msgstr "" +msgstr "Mrp İş Siparişi" #. module: base #: model:res.partner.title,shortcut:base.res_partner_title_madam @@ -14871,7 +14989,7 @@ msgstr "Myanmar" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_N msgid "N ADMINISTRATIVE AND SUPPORT SERVICE ACTIVITIES" -msgstr "" +msgstr "N İDARİ VE DESTEK HİZMET FAALİYETLERİ" #. module: base #: model:ir.model.fields,field_description:base.field_base_partner_merge_automatic_wizard__group_by_name @@ -14944,7 +15062,7 @@ msgstr "Hollanda - Muhasebe Raporları" #. module: base #: model:res.country,name:base.nc msgid "New Caledonia" -msgstr "" +msgstr "Yeni Kaledonya" #. module: base #: code:addons/base/wizard/base_export_language.py:18 @@ -14972,7 +15090,7 @@ msgstr "Yeni Zelanda" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_nz msgid "New Zealand - Accounting" -msgstr "" +msgstr "Yeni Zelanda - Muhasebe" #. module: base #: model:ir.module.module,summary:base.module_website_blog @@ -15036,7 +15154,7 @@ msgstr "Niue" #. module: base #: model:ir.ui.view,arch_db:base.res_config_settings_view_form msgid "No Record Found" -msgstr "" +msgstr "Kayıt Bulunamadı" #. module: base #: code:addons/models.py:1299 @@ -15178,7 +15296,7 @@ msgstr "Arama Sayısı" #. module: base #: model:ir.model.fields,field_description:base.field_res_users__companies_count msgid "Number of Companies" -msgstr "" +msgstr "Şirket Sayısı" #. module: base #: model:ir.model.fields,field_description:base.field_base_module_update__added @@ -15193,7 +15311,7 @@ msgstr "Bir kaç modül güncllendi" #. module: base #: model:res.partner.industry,full_name:base.res_partner_industry_O msgid "O PUBLIC ADMINISTRATION AND DEFENCE;COMPULSORY SOCIAL SECURITY" -msgstr "" +msgstr "O KAMU YÖNETİMİ VE SAVUNMA, ZORUNLU SOSYAL GÜVENLİK" #. module: base #: model:ir.module.module,shortdesc:base.module_auth_oauth @@ -15221,7 +15339,7 @@ msgstr "Nesne" #: code:addons/model.py:148 #, python-format msgid "Object %s doesn't exist" -msgstr "" +msgstr "Nesne %s bulunamadı" #. module: base #: model:ir.model.fields,field_description:base.field_ir_model_fields__model @@ -15440,7 +15558,7 @@ msgstr "" #. module: base #: selection:ir.module.module,license:0 msgid "Odoo Enterprise Edition License v1.0" -msgstr "" +msgstr "Odoo Kurumsal Sürüm Lisansı v1.0" #. module: base #: model:ir.module.module,description:base.module_mail @@ -15770,12 +15888,12 @@ msgstr "" #. module: base #: model:ir.module.module,shortdesc:base.module_l10n_mx_reports msgid "Odoo Mexican Localization Reports" -msgstr "" +msgstr "Odoo Meksika Yerelleştirme Raporları" #. module: base #: model:ir.module.module,summary:base.module_web_mobile msgid "Odoo Mobile Core module" -msgstr "" +msgstr "Odoo Mobil Çekirdek Modülü" #. module: base #: model:ir.module.module,description:base.module_note @@ -15957,12 +16075,12 @@ msgstr "" #. module: base #: selection:ir.module.module,license:0 msgid "Odoo Proprietary License v1.0" -msgstr "" +msgstr "Odoo Tescilli Lisansı v1.0" #. module: base #: model:ir.module.module,shortdesc:base.module_web_settings_dashboard msgid "Odoo Settings Dashboard" -msgstr "" +msgstr "Odoo Ayarlar Paneli" #. module: base #: model:ir.module.module,description:base.module_purchase @@ -16035,7 +16153,7 @@ msgstr "" #. module: base #: model:ir.module.module,shortdesc:base.module_web_diagram msgid "Odoo Web Diagram" -msgstr "" +msgstr "Odoo Web Diyagramı" #. module: base #: model:ir.module.module,description:base.module_website @@ -16391,6 +16509,8 @@ msgid "" "One2Many fields cannot be synchronized as part of `commercial_fields` or " "`address fields`" msgstr "" +"One2Many alanları, `commercial_fields` yada `address fields` parçası olarak " +"senkronize olamaz." #. module: base #: model:ir.module.module,shortdesc:base.module_website_event_sale @@ -16415,7 +16535,7 @@ msgstr "Çevrimiçi Teklif" #. module: base #: model:ir.module.module,shortdesc:base.module_website_quote_subscription msgid "Online Subscription Quotes" -msgstr "" +msgstr "Online Abonelik Teklifleri" #. module: base #: code:addons/base/models/res_config.py:560 @@ -16446,7 +16566,7 @@ msgstr "" #. module: base #: sql_constraint:res.currency.rate:0 msgid "Only one currency rate per day allowed!" -msgstr "" +msgstr "Günlük sadece bir kur miktarına izin verildi!" #. module: base #: code:addons/base/wizard/base_partner_merge.py:286 @@ -16472,7 +16592,7 @@ msgstr "" #. module: base #: model:ir.ui.view,arch_db:base.view_base_module_update msgid "Open Apps" -msgstr "" +msgstr "Açık Uygulamalar" #. module: base #: model:ir.actions.client,name:base.action_client_base_menu @@ -16552,6 +16672,9 @@ msgid "" "Schedule, organize, promote or sell events online; conferences, webinars, trainings, etc.\n" "\n" msgstr "" +" \n" +"Online Etkinlikler\n" +"\n" #. module: base #: model:ir.ui.view,arch_db:base.view_window_action_tree diff --git a/odoo/addons/base/views/res_config_settings_views.xml b/odoo/addons/base/views/res_config_settings_views.xml index 0f130d3ce10..74ce361e96b 100644 --- a/odoo/addons/base/views/res_config_settings_views.xml +++ b/odoo/addons/base/views/res_config_settings_views.xml @@ -16,7 +16,7 @@ </div> <header> <button string="Save" type="object" name="execute" class="oe_highlight" /> - <button string="Discard" type="object" name="cancel" /> + <button string="Discard" type="object" name="cancel" special="cancel" /> </header> </div> <div class="o_setting_container"> diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index 28ad85b892a..3370eaeb5ce 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -171,7 +171,7 @@ <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}' attrs="{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False)]}"/> </div> - <field name="vat" placeholder="e.g. BE0477472701"/> + <field name="vat" placeholder="e.g. BE0477472701" attrs="{'readonly': [('parent_id','!=',False)]}"/> </group> <group> <field name="function" placeholder="e.g. Sales Director" @@ -244,7 +244,7 @@ <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}' attrs="{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False)]}"/> </div> - <field name="vat" placeholder="e.g. BE0477472701"/> + <field name="vat" placeholder="e.g. BE0477472701" attrs="{'readonly': [('parent_id','!=',False)]}"/> <field name="category_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}" placeholder="Tags..."/> </group> <group> diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py index 4dda572fb13..b9f4e2fdc7b 100644 --- a/odoo/modules/loading.py +++ b/odoo/modules/loading.py @@ -25,7 +25,8 @@ _logger = logging.getLogger(__name__) _test_logger = logging.getLogger('odoo.tests') -def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=None, report=None): +def load_module_graph(cr, graph, status=None, perform_checks=True, + skip_modules=None, report=None, models_to_check=None): """Migrates+Updates or Installs all module nodes from ``graph`` :param graph: graph of module nodes to load :param status: deprecated parameter, unused, left to avoid changing signature in 8.0 @@ -93,6 +94,9 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= if kind in ('demo', 'test'): threading.currentThread().testing = False + if models_to_check is None: + models_to_check = set() + processed_modules = [] loaded_modules = [] registry = odoo.registry(cr.dbname) @@ -106,6 +110,8 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= t0 = time.time() t0_sql = odoo.sql_db.sql_counter + models_updated = set() + for index, package in enumerate(graph, 1): module_name = package.name module_id = package.id @@ -127,10 +133,20 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= model_names = registry.load(cr, package) loaded_modules.append(package.name) - if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'): + if (hasattr(package, 'init') or hasattr(package, 'update') + or package.state in ('to install', 'to upgrade')): + models_updated |= set(model_names) + models_to_check -= set(model_names) registry.setup_models(cr) registry.init_models(cr, model_names, {'module': package.name}) cr.commit() + elif package.state != 'to remove': + # The current module has simply been loaded. The models extended by this module + # and for which we updated the schema, must have their schema checked again. + # This is because the extension may have changed the model, + # e.g. adding required=True to an existing field, but the schema has not been + # updated by this module because it's not marked as 'to upgrade/to install'. + models_to_check |= set(model_names) & models_updated idref = {} @@ -225,9 +241,14 @@ def _check_module_names(cr, module_names): incorrect_names = mod_names.difference([x['name'] for x in cr.dictfetchall()]) _logger.warning('invalid module names, ignored: %s', ", ".join(incorrect_names)) -def load_marked_modules(cr, graph, states, force, progressdict, report, loaded_modules, perform_checks): +def load_marked_modules(cr, graph, states, force, progressdict, report, + loaded_modules, perform_checks, models_to_check=None): """Loads modules marked with ``states``, adding them to ``graph`` and ``loaded_modules`` and returns a list of installed/upgraded modules.""" + + if models_to_check is None: + models_to_check = set() + processed_modules = [] while True: cr.execute("SELECT name from ir_module_module WHERE state IN %s" ,(tuple(states),)) @@ -236,7 +257,10 @@ def load_marked_modules(cr, graph, states, force, progressdict, report, loaded_m break graph.add_modules(cr, module_list, force) _logger.debug('Updating graph with %d more modules', len(module_list)) - loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks) + loaded, processed = load_module_graph( + cr, graph, progressdict, report=report, skip_modules=loaded_modules, + perform_checks=perform_checks, models_to_check=models_to_check + ) processed_modules.extend(processed) loaded_modules.extend(loaded) if not processed: @@ -250,6 +274,8 @@ def load_modules(db, force_demo=False, status=None, update_module=False): if force_demo: force.append('demo') + models_to_check = set() + cr = db.cursor() try: if not odoo.modules.db.is_initialized(cr): @@ -278,7 +304,9 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # processed_modules: for cleanup step after install # loaded_modules: to avoid double loading report = registry._assertion_report - loaded_modules, processed_modules = load_module_graph(cr, graph, status, perform_checks=update_module, report=report) + loaded_modules, processed_modules = load_module_graph( + cr, graph, status, perform_checks=update_module, + report=report, models_to_check=models_to_check) load_lang = tools.config.pop('load_language') if load_lang or update_module: @@ -333,11 +361,11 @@ def load_modules(db, force_demo=False, status=None, update_module=False): previously_processed = len(processed_modules) processed_modules += load_marked_modules(cr, graph, ['installed', 'to upgrade', 'to remove'], - force, status, report, loaded_modules, update_module) + force, status, report, loaded_modules, update_module, models_to_check) if update_module: processed_modules += load_marked_modules(cr, graph, ['to install'], force, status, report, - loaded_modules, update_module) + loaded_modules, update_module, models_to_check) registry.loaded = True registry.setup_models(cr) @@ -407,6 +435,16 @@ def load_modules(db, force_demo=False, status=None, update_module=False): cr.commit() return registry + # STEP 5.5: Verify extended fields on every model + # This will fix the schema of all models in a situation such as: + # - module A is loaded and defines model M; + # - module B is installed/upgraded and extends model M; + # - module C is loaded and extends model M; + # - module B and C depend on A but not on each other; + # The changes introduced by module C are not taken into account by the upgrade of B. + if models_to_check: + registry.init_models(cr, list(models_to_check), {'models_to_check': True}) + # STEP 6: verify custom views on every model if update_module: env = api.Environment(cr, SUPERUSER_ID, {}) diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py index 712b25aefb3..9e180138a21 100644 --- a/odoo/modules/registry.py +++ b/odoo/modules/registry.py @@ -287,6 +287,8 @@ class Registry(Mapping): """ if 'module' in context: _logger.info('module %s: creating or updating database tables', context['module']) + elif context.get('models_to_check', False): + _logger.info("verifying fields for every extended model") env = odoo.api.Environment(cr, SUPERUSER_ID, context) models = [env[model_name] for model_name in model_names] |
