diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-05-25 14:34:18 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-05-25 14:34:18 +0200 |
| commit | 37eed7c509fb5846c89ef37046df4b3cab299719 (patch) | |
| tree | f84141132c09ddafa7922375a84d5bf072265d04 | |
| parent | 943075fd94eec2bc61b751e8828e3bd69054b2f8 (diff) | |
| parent | 58e35522468d1d4c0674518f785a32be56d2c1a2 (diff) | |
[MERGE] forward port branch saas-11.2 up to 58e35522468
67 files changed, 1406 insertions, 144 deletions
diff --git a/addons/account/i18n/es.po b/addons/account/i18n/es.po index ef861857698..5eabdf0a97c 100644 --- a/addons/account/i18n/es.po +++ b/addons/account/i18n/es.po @@ -9362,6 +9362,8 @@ msgstr "La referencia de asociado para esta factura." msgid "" "The partners of the journal's company and the related bank account mismatch." msgstr "" +"La empresa del diario de la compañía y el de la cuenta del banco " +"relacionada, no coinciden" #. module: account #: code:addons/account/models/account_payment.py:61 @@ -10665,6 +10667,7 @@ msgid "" "You cannot change the currency of the company since some journal items " "already exist" msgstr "" +"No puede cambiar la moneda de la compañía ya que contiene asientos contables" #. module: account #: code:addons/account/models/account.py:271 diff --git a/addons/account/i18n/fr.po b/addons/account/i18n/fr.po index 64a8bf75f7d..6103e3d269d 100644 --- a/addons/account/i18n/fr.po +++ b/addons/account/i18n/fr.po @@ -65,13 +65,14 @@ # Fabri Yohann <psn@fabri.pw>, 2017 # Jérôme Tanché <jerome.tanche@ouest-dsi.fr>, 2017 # e2f <projects@e2f.com>, 2018 +# Schreiner Grégory <schreiner.gregory@gmail.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: e2f <projects@e2f.com>, 2018\n" +"Last-Translator: Schreiner Grégory <schreiner.gregory@gmail.com>, 2018\n" "Language-Team: French (https://www.transifex.com/odoo/teams/41243/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -9405,6 +9406,8 @@ msgstr "La référence donnée par le partenaire pour cette facture." msgid "" "The partners of the journal's company and the related bank account mismatch." msgstr "" +"Les partenaires du journal de la société et le compte bancaire lié ne " +"correspondent pas" #. module: account #: code:addons/account/models/account_payment.py:61 @@ -10707,6 +10710,8 @@ msgid "" "You cannot change the currency of the company since some journal items " "already exist" msgstr "" +"Vous ne pouvez pas modifier la devise de l'entreprise car certains articles " +"de journal existent déjà" #. module: account #: code:addons/account/models/account.py:271 diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po index 05640cf7a2b..0d387c800f4 100644 --- a/addons/account/i18n/tr.po +++ b/addons/account/i18n/tr.po @@ -30,6 +30,10 @@ msgid "" " * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n" " * The 'Cancelled' status is used when user cancel invoice." msgstr "" +" * 'Taslak' durumu, bir kullanıcı yeni yada onaylanmamış bir fatura hazırlıyorsa kullanılır.\n" +" * 'Açık' durumu, kullanıcı bir fatura oluştururken kullanılır, fatura numarası oluşturulur. Kullanıcı faturayı ödeyinceye kadar açık durumdadır.\n" +" * 'Ödendi' durumu, fatura ödenince otomatik olarak ayarlanır. Yevmiye girişlerinin uzlaştırılımış yada uzlaştırılmamış olmasıyla ilgilidir.\n" +" * 'İptal edildi' durumu kullanıcı bir faturayı iptal ettiğinde kullanılır." #. module: account #: model:ir.model.fields,field_description:account.field_account_chart_template__code_digits diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py index 1cca2df5214..e3f03a48952 100644 --- a/addons/account/models/account_payment.py +++ b/addons/account/models/account_payment.py @@ -441,12 +441,17 @@ class account_payment(models.Model): @api.multi def button_invoices(self): + if self.partner_type == 'supplier': + views = [(self.env.ref('account.invoice_supplier_tree').id, 'tree'), (self.env.ref('account.invoice_supplier_form').id, 'form')] + else: + views = [(self.env.ref('account.invoice_tree').id, 'tree'), (self.env.ref('account.invoice_form').id, 'form')] return { 'name': _('Paid Invoices'), 'view_type': 'form', 'view_mode': 'tree,form', 'res_model': 'account.invoice', 'view_id': False, + 'views': views, 'type': 'ir.actions.act_window', 'domain': [('id', 'in', [x.id for x in self.invoice_ids])], } diff --git a/addons/analytic/i18n/tr.po b/addons/analytic/i18n/tr.po index 0248209cb6c..fd94a91c23b 100644 --- a/addons/analytic/i18n/tr.po +++ b/addons/analytic/i18n/tr.po @@ -11,13 +11,14 @@ # Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017 # Martin Trigaux, 2017 # Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017 +# Umur Akın <umura@projetgrup.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: Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017\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" @@ -148,7 +149,7 @@ msgstr "Bakiye" #. module: analytic #: model:ir.ui.view,arch_db:analytic.view_account_analytic_account_kanban msgid "Balance:" -msgstr "" +msgstr "Bakiye:" #. module: analytic #: model:ir.actions.act_window,name:analytic.action_analytic_account_form @@ -412,6 +413,8 @@ msgstr "Analitik Satırları Ara" #: model:ir.model.fields,help:analytic.field_account_analytic_tag__active msgid "Set active to false to hide the Analytic Tag without removing it." msgstr "" +"Analitik Etiketi kaldırmadan gizlemek için etkin seçeneğini yanlış olarak " +"ayarla." #. module: analytic #: model:ir.model.fields,field_description:analytic.field_account_analytic_line__tag_ids diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py index d2e2a609e88..9cd801144e8 100644 --- a/addons/analytic/models/analytic_account.py +++ b/addons/analytic/models/analytic_account.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from collections import defaultdict from odoo import api, fields, models, _ from odoo.osv import expression from odoo.exceptions import ValidationError @@ -78,9 +79,9 @@ class AccountAnalyticAccount(models.Model): @api.multi def _compute_debit_credit_balance(self): - res_currency_obj = self.env['res.currency'] + Curr = self.env['res.currency'] analytic_line_obj = self.env['account.analytic.line'] - domain = [('account_id', 'in', self.mapped('id'))] + domain = [('account_id', 'in', self.ids)] if self._context.get('from_date', False): domain.append(('date', '>=', self._context['from_date'])) if self._context.get('to_date', False): @@ -92,17 +93,23 @@ class AccountAnalyticAccount(models.Model): domain.append(('company_id', 'in', self._context['company_ids'])) user_currency = self.env.user.company_id.currency_id - account_amounts = analytic_line_obj.search_read(domain, ['account_id', 'amount', 'currency_id']) - account_ids = set([line['account_id'][0] for line in account_amounts]) - data_debit = {account_id: 0.0 for account_id in account_ids} - data_credit = {account_id: 0.0 for account_id in account_ids} - for account_amount in account_amounts: - currency_id = account_amount['currency_id'][0] - amount = res_currency_obj.browse(currency_id).compute(account_amount['amount'], user_currency) - if amount < 0.0: - data_debit[account_amount['account_id'][0]] += amount - else: - data_credit[account_amount['account_id'][0]] += amount + credit_groups = analytic_line_obj.read_group( + domain=domain + [('amount', '>=', 0.0)], + fields=['account_id', 'currency_id', 'amount'], + groupby=['account_id', 'currency_id'], + ) + data_credit = defaultdict(float) + for l in credit_groups: + data_credit[l['account_id'][0]] += Curr.browse(l['currency_id'][0]).compute(l['amount'], user_currency) + + debit_groups = analytic_line_obj.read_group( + domain=domain + [('amount', '<', 0.0)], + fields=['account_id', 'currency_id', 'amount'], + groupby=['account_id', 'currency_id'], + ) + data_debit = defaultdict(float) + for l in debit_groups: + data_debit[l['account_id'][0]] += Curr.browse(l['currency_id'][0]).compute(l['amount'], user_currency) for account in self: account.debit = abs(data_debit.get(account.id, 0.0)) diff --git a/addons/anonymization/i18n/tr.po b/addons/anonymization/i18n/tr.po index ae89afae2c5..c53cad2c808 100644 --- a/addons/anonymization/i18n/tr.po +++ b/addons/anonymization/i18n/tr.po @@ -11,13 +11,14 @@ # Ramiz Deniz Öner <deniz@denizoner.com>, 2017 # Gökhan Erdoğdu <gokhan.erdogdu@mechsoft.com.tr>, 2017 # Özem Sökmem <ozensokmen@gmail.com>, 2017 +# Umur Akın <umura@projetgrup.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: Özem Sökmem <ozensokmen@gmail.com>, 2017\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" @@ -396,6 +397,8 @@ msgid "" "This is the file created by the anonymization process. It should have the " "extension '.json' or '.pickle'." msgstr "" +"Bu dosya anonimleştirme işlemi tarafından oluşturulmuştur. Bunun uzantısı " +"'.json' yada '.pickle' dır." #. module: anonymization #: selection:ir.model.fields.anonymize.wizard,state:0 diff --git a/addons/barcodes/i18n/tr.po b/addons/barcodes/i18n/tr.po index 0cec71e252e..e1f85af3bdd 100644 --- a/addons/barcodes/i18n/tr.po +++ b/addons/barcodes/i18n/tr.po @@ -412,6 +412,8 @@ msgstr "Birim Ürün" msgid "" "Used to order rules such that rules with a smaller sequence match first" msgstr "" +"ilk olarak küçük sıralarla eşleyen kurallar gibi kullanılan sipariş " +"kuralları" #. module: barcodes #: model:ir.model.fields,help:barcodes.field_barcodes_barcode_events_mixin___barcode_scanned @@ -426,7 +428,7 @@ msgstr "Tartılmış Ürün" #. module: barcodes #: model:ir.model,name:barcodes.model_barcode_nomenclature msgid "barcode.nomenclature" -msgstr "" +msgstr "barcode.nomenclature" #. module: barcodes #: model:ir.model,name:barcodes.model_barcode_rule @@ -436,4 +438,4 @@ msgstr "barkod.kuralı" #. module: barcodes #: model:ir.model,name:barcodes.model_barcodes_barcode_events_mixin msgid "barcodes.barcode_events_mixin" -msgstr "" +msgstr "barcodes.barcode_events_mixin" diff --git a/addons/base_import/i18n/nl.po b/addons/base_import/i18n/nl.po index 317594a9792..b81f00756fb 100644 --- a/addons/base_import/i18n/nl.po +++ b/addons/base_import/i18n/nl.po @@ -145,7 +145,7 @@ msgstr "Decimaal scheidingsteken:" #: code:addons/base_import/static/src/xml/base_import.xml:76 #, python-format msgid "Defer parent/child computation" -msgstr "" +msgstr "Uitstellen boven/onderliggende berekening" #. module: base_import #: model:ir.model.fields,field_description:base_import.field_base_import_import__display_name diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py index ddbb5a37880..161130e1e94 100644 --- a/addons/calendar/models/calendar.py +++ b/addons/calendar/models/calendar.py @@ -656,7 +656,13 @@ class Meeting(models.Model): }[data['rrule_type']] deadline = fields.Datetime.from_string(data['stop']) - return deadline + relativedelta(**{delay: count * mult}) + computed_final_date = False + while not computed_final_date and count > 0: + try: # may crash if year > 9999 (in case of recurring events) + computed_final_date = deadline + relativedelta(**{delay: count * mult}) + except ValueError: + count -= data['interval'] + return computed_final_date or deadline return final_date @api.multi diff --git a/addons/crm/i18n/nl.po b/addons/crm/i18n/nl.po index 845479dbeba..078a6c36e63 100644 --- a/addons/crm/i18n/nl.po +++ b/addons/crm/i18n/nl.po @@ -1022,7 +1022,7 @@ msgstr "Forceer toewijzing" #. module: crm #: model:ir.ui.view,arch_db:crm.res_config_settings_view_form msgid "Format phone numbers based on national conventions" -msgstr "" +msgstr "Opmaak telefoonnummers gebaseerd op nationale afspraken." #. module: crm #: code:addons/crm/models/crm_lead.py:588 @@ -1878,7 +1878,7 @@ msgstr "Telefoon" #. module: crm #: model:ir.model.fields,field_description:crm.field_res_config_settings__module_crm_phone_validation msgid "Phone Formatting" -msgstr "" +msgstr "Telefoonnummer opmaak" #. module: crm #: code:addons/crm/models/crm_team.py:165 diff --git a/addons/hr_attendance/static/src/js/kiosk_mode.js b/addons/hr_attendance/static/src/js/kiosk_mode.js index 59bd0c3f71e..6046b9bdbb2 100644 --- a/addons/hr_attendance/static/src/js/kiosk_mode.js +++ b/addons/hr_attendance/static/src/js/kiosk_mode.js @@ -2,6 +2,7 @@ odoo.define('hr_attendance.kiosk_mode', function (require) { "use strict"; var AbstractAction = require('web.AbstractAction'); +var ajax = require('web.ajax'); var core = require('web.core'); var Session = require('web.session'); @@ -28,6 +29,8 @@ var KioskMode = AbstractAction.extend({ self.$el.html(QWeb.render("HrAttendanceKioskMode", {widget: self})); self.start_clock(); }); + // Make a RPC call every day to keep the session alive + self._interval = window.setInterval(this._callServer.bind(this), (60*60*1000*24)); return $.when(def, this._super.apply(this, arguments)); }, @@ -56,8 +59,15 @@ var KioskMode = AbstractAction.extend({ destroy: function () { core.bus.off('barcode_scanned', this, this._onBarcodeScanned); clearInterval(this.clock_start); + clearInterval(this._interval); this._super.apply(this, arguments); }, + + _callServer: function () { + // Make a call to the database to avoid the auto close of the session + return ajax.rpc("/web/webclient/version_info", {}); + }, + }); core.action_registry.add('hr_attendance_kiosk_mode', KioskMode); diff --git a/addons/hr_holidays/report/hr_leave_reports.xml b/addons/hr_holidays/report/hr_leave_reports.xml index 18d8785721e..6f884671c37 100644 --- a/addons/hr_holidays/report/hr_leave_reports.xml +++ b/addons/hr_holidays/report/hr_leave_reports.xml @@ -33,8 +33,6 @@ <filter name="group_name" string="Description" context="{'group_by':'name'}"/> <filter name="group_employee" string="Employee" context="{'group_by':'employee_id'}"/> <filter name="group_category" string="Category" context="{'group_by':'category_id'}"/> - <filter name="group_manager" string="Manager" context="{'group_by':'manager_id'}"/> - <filter name="group_second_approver_id" string="Validator" context="{'group_by':'second_approver_id'}"/> <filter name="group_type" string="Type" context="{'group_by':'holiday_status_id'}"/> <separator/> <filter name="group_date_from" string="Start Month" context="{'group_by':'date_from'}"/> @@ -118,7 +116,7 @@ <field name="res_model">hr.leave.report</field> <field name="src_model">hr.employee</field> <field name="view_type">form</field> - <field name="view_mode">tree,kanban</field> + <field name="view_mode">tree,kanban,form</field> <field name="view_id" eval="hr_leave_report_tree"/> <field name="context">{ 'search_default_group_type': 1, diff --git a/addons/iap/__manifest__.py b/addons/iap/__manifest__.py index 35124df76eb..6a30ed891c9 100644 --- a/addons/iap/__manifest__.py +++ b/addons/iap/__manifest__.py @@ -9,7 +9,7 @@ 'description': """ This module provides standard tools (account model, context manager and helpers) to support In-App purchases inside Odoo. """, - 'depends': ['web'], + 'depends': ['web', 'web_settings_dashboard'], 'data': [ 'security/ir.model.access.csv', 'security/ir_rule.xml', diff --git a/addons/l10n_co/__manifest__.py b/addons/l10n_co/__manifest__.py index 72a39483284..88f5fb464f9 100644 --- a/addons/l10n_co/__manifest__.py +++ b/addons/l10n_co/__manifest__.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -# Copyright (C) David Arnold (devCO). -# Author David Arnold (devCO), dar@devco.co +# Copyright (C) David Arnold (XOE Solutions). +# Author David Arnold (XOE Solutions), dar@xoe.solutions # Co-Authors Juan Pablo Aries (devCO), jpa@devco.co # Hector Ivan Valencia Muñoz (TIX SAS) # Nhomar Hernandez (Vauxoo) @@ -13,7 +13,8 @@ 'version': '0.8', 'category': 'Localization', 'description': 'Colombian Accounting and Tax Preconfiguration', - 'author': 'David Arnold BA HSG (devCO)', + 'author': 'David Arnold (XOE Solutions)', + 'website': 'https://xoe.solutions', 'depends': [ 'account', ], diff --git a/addons/l10n_es/__manifest__.py b/addons/l10n_es/__manifest__.py index c5d7599074e..44b23a5e9c4 100644 --- a/addons/l10n_es/__manifest__.py +++ b/addons/l10n_es/__manifest__.py @@ -3,6 +3,7 @@ # List of contributors: # Jordi Esteve <jesteve@zikzakmedia.com> +# Ignacio Ibeas <ignacio@acysos.com> # Dpto. Consultoría Grupo Opentia <consultoria@opentia.es> # Pedro M. Baeza <pedro.baeza@tecnativa.com> # Carlos Liébana <carlos.liebana@factorlibre.com> diff --git a/addons/l10n_es/data/account_fiscal_position_template_data.xml b/addons/l10n_es/data/account_fiscal_position_template_data.xml index 49beed9d022..eef1bd1ac03 100644 --- a/addons/l10n_es/data/account_fiscal_position_template_data.xml +++ b/addons/l10n_es/data/account_fiscal_position_template_data.xml @@ -113,6 +113,16 @@ <field name="chart_template_id" ref="account_chart_template_common"/> </record> + <record id="fp_reagyp_a" model="account.fiscal.position.template"> + <field name="name">REAGYP - Agricultura</field> + <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/> + </record> + + <record id="fp_reagyp_gp" model="account.fiscal.position.template"> + <field name="name">REAGYP - Ganadería y pesca</field> + <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/> + </record> + <!-- ************************************************************* --> <!-- Fiscal Position Tax Templates --> <!-- ************************************************************* --> @@ -2889,6 +2899,28 @@ <field name="tax_dest_id" ref="account_tax_template_s_iva0_isp"/> </record> + <!-- Régimen especial de Agricultura, Ganaderia y Pesca --> + <record id="fptt_reagyp_a_4b_1" model="account.fiscal.position.tax.template"> + <field name="position_id" ref="fp_reagyp_a"/> + <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/> + <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_iva12_agr"/> + </record> + <record id="fptt_reagyp_a_4b_2" model="account.fiscal.position.tax.template"> + <field name="position_id" ref="fp_reagyp_a"/> + <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/> + <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_irpf2"/> + </record> + <record id="fptt_reagyp_gp_4b_1" model="account.fiscal.position.tax.template"> + <field name="position_id" ref="fp_reagyp_gp"/> + <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/> + <field name="tax_dest_id" ref="account_tax_template_p_iva105_gan"/> + </record> + <record id="fptt_reagyp_gp_4b_2" model="account.fiscal.position.tax.template"> + <field name="position_id" ref="fp_reagyp_gp"/> + <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/> + <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_irpf2"/> + </record> + <!-- ************************************************************* --> <!-- Fiscal Position Account Templates --> <!-- ************************************************************* --> diff --git a/addons/l10n_es/data/account_tax_data.xml b/addons/l10n_es/data/account_tax_data.xml index d07503b0b88..327144f6fe1 100644 --- a/addons/l10n_es/data/account_tax_data.xml +++ b/addons/l10n_es/data/account_tax_data.xml @@ -1044,6 +1044,18 @@ <field name="tax_group_id" ref="tax_group_iva_12"/> <field name="tag_ids" eval="[(6, False, [ref('mod_303_42')])]"/> </record> + <record id="account_tax_template_p_iva105_gan" model="account.tax.template"> + <field name="description">P_IVA105_GAN</field> + <field name="type_tax_use">purchase</field> + <field name="account_id" ref="l10n_es.account_common_472"/> + <field name="name">10,5% IVA Soportado régimen ganadero o pesca</field> + <field name="refund_account_id" ref="l10n_es.account_common_472"/> + <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/> + <field name="amount" eval="10.5"/> + <field name="amount_type">percent</field> + <field name="include_base_amount" eval="1"/> + <field name="tag_ids" eval="[(6, False, [ref('mod_303_42')])]"/> + </record> <record id="account_tax_template_s_iva0_e" model="account.tax.template"> <field name="description">S_IVA0_E</field> <field name="type_tax_use">sale</field> @@ -1330,6 +1342,7 @@ <field name="refund_account_id" ref="l10n_es.account_common_4751"/> <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/> <field name="amount" eval="-2"/> + <field name="sequence" eval="2"/> <field name="amount_type">percent</field> <field name="tax_group_id" ref="tax_group_retenciones_2"/> <field name="tag_ids" eval="[(6, False, [ref('mod_111_08'), ref('mod_111_09')])]"/> diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index e32bf8d270d..5ebfc94cc24 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -120,7 +120,8 @@ class MailThread(models.AbstractModel): followers = self.env['mail.followers'].sudo().search([ ('res_model', '=', self._name), ('partner_id', operator, operand)]) - return [('id', 'in', followers.mapped('res_id'))] + # using read() below is much faster than followers.mapped('res_id') + return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])] @api.model def _search_follower_channels(self, operator, operand): @@ -133,7 +134,8 @@ class MailThread(models.AbstractModel): followers = self.env['mail.followers'].sudo().search([ ('res_model', '=', self._name), ('channel_id', operator, operand)]) - return [('id', 'in', followers.mapped('res_id'))] + # using read() below is much faster than followers.mapped('res_id') + return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])] @api.multi @api.depends('message_follower_ids') @@ -143,7 +145,8 @@ class MailThread(models.AbstractModel): ('res_id', 'in', self.ids), ('partner_id', '=', self.env.user.partner_id.id), ]) - following_ids = followers.mapped('res_id') + # using read() below is much faster than followers.mapped('res_id') + following_ids = [res['res_id'] for res in followers.read(['res_id'])] for record in self: record.message_is_follower = record.id in following_ids @@ -155,9 +158,11 @@ class MailThread(models.AbstractModel): ]) # Cases ('message_is_follower', '=', True) or ('message_is_follower', '!=', False) if (operator == '=' and operand) or (operator == '!=' and not operand): - return [('id', 'in', followers.mapped('res_id'))] + # using read() below is much faster than followers.mapped('res_id') + return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])] else: - return [('id', 'not in', followers.mapped('res_id'))] + # using read() below is much faster than followers.mapped('res_id') + return [('id', 'not in', [res['res_id'] for res in followers.read(['res_id'])])] @api.multi def _get_message_unread(self): diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js index 4bb81489789..fce7eb29f6f 100644 --- a/addons/mail/static/src/js/activity.js +++ b/addons/mail/static/src/js/activity.js @@ -32,6 +32,7 @@ function _readActivities(self, ids) { model: 'mail.activity', method: 'read', args: [ids], + context: (self.record && self.record.getContext()) || self.getSession().user_context, }).then(function (activities) { // convert create_date and date_deadline to moments _.each(activities, function (activity) { @@ -108,6 +109,7 @@ var AbstractActivityField = AbstractField.extend({ method: 'action_feedback', args: [[id]], kwargs: {feedback: feedback}, + context: this.record.getContext(), }); }, _scheduleActivity: function (id, previous_activity_type_id, callback) { diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 7b1876cd211..61645b3c3b9 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -473,10 +473,16 @@ class MrpProduction(models.Model): @api.multi def _generate_workorders(self, exploded_boms): workorders = self.env['mrp.workorder'] + original_one = False for bom, bom_data in exploded_boms: # If the routing of the parent BoM and phantom BoM are the same, don't recreate work orders, but use one master routing if bom.routing_id.id and (not bom_data['parent_line'] or bom_data['parent_line'].bom_id.routing_id.id != bom.routing_id.id): - workorders += self._workorders_create(bom, bom_data) + temp_workorders = self._workorders_create(bom, bom_data) + workorders += temp_workorders + if temp_workorders: # In order to avoid two "ending work orders" + if original_one: + temp_workorders[-1].next_work_order_id = original_one + original_one = temp_workorders[0] return workorders def _workorders_create(self, bom, bom_data): diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index b8f826caec2..0c0ddf37ead 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -225,6 +225,7 @@ class MrpWorkorder(models.Model): 'done_wo': False, 'location_id': move.location_id.id, 'location_dest_id': move.location_dest_id.id, + 'date': move.date, }) qty_todo -= 1 elif float_compare(qty_todo, 0.0, precision_rounding=rounding) < 0: @@ -416,7 +417,12 @@ class MrpWorkorder(models.Model): @api.multi def button_start(self): - # TDE CLEANME + self.ensure_one() + # As button_start is automatically called in the new view + if self.state in ('done', 'cancel'): + return True + + # Need a loss in case of the real time exceeding the expected timeline = self.env['mrp.workcenter.productivity'] if self.duration < self.duration_expected: loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type','=','productive')], limit=1) diff --git a/addons/payment/controllers/portal.py b/addons/payment/controllers/portal.py index 6f13400356b..ded83ea59d1 100644 --- a/addons/payment/controllers/portal.py +++ b/addons/payment/controllers/portal.py @@ -92,7 +92,7 @@ class WebsitePayment(http.Controller): 'type': 'form_save' if acquirer.save_token != 'none' and partner_id else 'form', } - tx = request.env['payment.transaction'].sudo().create(values) + tx = request.env['payment.transaction'].sudo().with_context(lang=None).create(values) request.session['website_payment_tx_id'] = tx.id render_values = { @@ -122,7 +122,7 @@ class WebsitePayment(http.Controller): 'type': 'form_save' if token.acquirer_id.save_token != 'none' and partner_id else 'form', } - tx = request.env['payment.transaction'].sudo().create(values) + tx = request.env['payment.transaction'].sudo().with_context(lang=None).create(values) request.session['website_payment_tx_id'] = tx.id try: diff --git a/addons/payment_ogone/models/payment.py b/addons/payment_ogone/models/payment.py index 8771addc151..5164fec16aa 100644 --- a/addons/payment_ogone/models/payment.py +++ b/addons/payment_ogone/models/payment.py @@ -357,7 +357,7 @@ class PaymentTxOgone(models.Model): 'AMOUNT': int(self.amount * 100), 'CURRENCY': self.currency_id.name, 'OPERATION': 'SAL', - 'ECI': 2, # Recurring (from MOTO) + 'ECI': 9, # Recurring (from eCommerce) 'ALIAS': self.payment_token_id.acquirer_ref, 'RTIMEOUT': 30, 'PARAMPLUS' : url_encode(param_plus) diff --git a/addons/pos_mercury/static/src/js/pos_mercury.js b/addons/pos_mercury/static/src/js/pos_mercury.js index e403b9bcf12..7f896e5661f 100644 --- a/addons/pos_mercury/static/src/js/pos_mercury.js +++ b/addons/pos_mercury/static/src/js/pos_mercury.js @@ -449,6 +449,7 @@ PaymentScreenWidget.include({ order.selected_paymentline.paid = true; order.selected_paymentline.mercury_swipe_pending = false; order.selected_paymentline.mercury_amount = response.authorize; + order.selected_paymentline.set_amount(response.authorize); order.selected_paymentline.mercury_card_number = decodedMagtek['number']; order.selected_paymentline.mercury_card_brand = response.card_type; order.selected_paymentline.mercury_card_owner_name = decodedMagtek['name']; diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 20578c30c93..36eb3d323be 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -218,6 +218,9 @@ class Project(models.Model): doc_count = fields.Integer(compute='_compute_attached_docs_count', string="Number of documents attached") date_start = fields.Date(string='Start Date') date = fields.Date(string='Expiration Date', index=True, track_visibility='onchange') + subtask_project_id = fields.Many2one('project.project', string='Sub-task Project', ondelete="restrict", + help="Choosing a sub-tasks project will both enable sub-tasks and set their default project (possibly the project itself)") + # rating fields percentage_satisfaction_task = fields.Integer( compute='_compute_percentage_satisfaction_task', string="Happy % on Task", store=True, default=-1) @@ -295,6 +298,8 @@ class Project(models.Model): # Prevent double project creation self = self.with_context(mail_create_nosubscribe=True) project = super(Project, self).create(vals) + if not vals.get('subtask_project_id'): + project.subtask_project_id = project.id if project.privacy_visibility == 'portal' and project.partner_id: project.message_subscribe(project.partner_id.ids) return project @@ -508,6 +513,7 @@ class Task(models.Model): legend_normal = fields.Char(related='stage_id.legend_normal', string='Kanban Ongoing Explanation', readonly=True, related_sudo=False) parent_id = fields.Many2one('project.task', string='Parent Task', index=True) child_ids = fields.One2many('project.task', 'parent_id', string="Sub-tasks", context={'active_test': False}) + subtask_project_id = fields.Many2one('project.project', related="project_id.subtask_project_id", string='Sub-task Project', readonly=True) subtask_count = fields.Integer("Sub-task count", compute='_compute_subtask_count') email_from = fields.Char(string='Email', help="These people will receive email.", index=True) email_cc = fields.Char(string='Watchers Emails', help="""These email addresses will be added to the CC field of all inbound diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml index 7bb76b1af98..8d85df10b3d 100644 --- a/addons/project/views/project_views.xml +++ b/addons/project/views/project_views.xml @@ -139,6 +139,7 @@ </div> <field name="rating_status_period" class="oe_inline" attrs="{'required': [('rating_status','=','periodic')], 'invisible': [('rating_status','!=','periodic')]}" groups="project.group_project_rating"/> <field name="portal_show_rating" attrs="{'invisible': [('rating_status','==','no')]}" groups="project.group_project_rating"/> + <field name="subtask_project_id" groups="project.group_subtask_project"/> </group> <group name="misc"> <group string="Configuration" groups="base.group_no_one" name="configuration"> @@ -413,7 +414,7 @@ <button class="oe_stat_button" icon="fa-tasks" type="object" name="action_open_parent_task" string="Parent Task" attrs="{'invisible' : [('parent_id', '=', False)]}" groups="project.group_subtask_project"/> <button name="action_subtask" type="object" class="oe_stat_button" icon="fa-tasks" attrs="{'invisible' : [('parent_id', '!=', False)]}" - context="{'project_id': project_id, 'name': name, 'parent_id': id}" groups="project.group_subtask_project"> + context="{'project_id': subtask_project_id, 'name': name, 'partner_id': partner_id}" groups="project.group_subtask_project"> <field string="Sub-tasks" name="subtask_count" widget="statinfo"/> </button> <button name="%(rating_rating_action_task)d" type="action" attrs="{'invisible': [('rating_count', '=', 0)]}" class="oe_stat_button" icon="fa-smile-o" groups="project.group_project_rating"> @@ -461,6 +462,7 @@ <field name="email_cc" groups="base.group_no_one"/> <field name="parent_id" attrs="{'invisible' : [('subtask_count', '>', 0)]}" groups="project.group_subtask_project"/> <field name="child_ids" invisible="1" /> + <field name="subtask_project_id" invisible="1" /> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> <field name="displayed_image_id" groups="base.group_no_one"/> </group> diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 2c624970f91..78997867716 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -348,6 +348,7 @@ class PurchaseOrder(models.Model): @api.multi def print_quotation(self): + self.write({'state': "sent"}) return self.env.ref('purchase.report_purchase_quotation').report_action(self) @api.multi diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py index 4f72b3ceaf5..46df20ce9de 100644 --- a/addons/purchase/report/purchase_report.py +++ b/addons/purchase/report/purchase_report.py @@ -88,7 +88,7 @@ class PurchaseReport(models.Model): join res_partner partner on s.partner_id = partner.id left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) - LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.template,',t.id) AND ip.company_id=s.company_id) + LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.product,',p.id) AND ip.company_id=s.company_id) left join uom_uom u on (u.id=l.product_uom) left join uom_uom u2 on (u2.id=t.uom_id) left join stock_picking_type spt on (spt.id=s.picking_type_id) diff --git a/addons/rating/i18n/tr.po b/addons/rating/i18n/tr.po index 8e19460d8d2..498284c331f 100644 --- a/addons/rating/i18n/tr.po +++ b/addons/rating/i18n/tr.po @@ -9,13 +9,14 @@ # Ediz Duman <neps1192@gmail.com>, 2017 # Martin Trigaux, 2017 # Levent Karakaş <levent@mektup.at>, 2017 +# Umur Akın <umura@projetgrup.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: Levent Karakaş <levent@mektup.at>, 2017\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" @@ -260,7 +261,7 @@ msgstr "Değerlendirme Ortalaması" #: model:ir.model.fields,field_description:rating.field_project_task__rating_last_feedback #: model:ir.model.fields,field_description:rating.field_rating_mixin__rating_last_feedback msgid "Rating Last Feedback" -msgstr "" +msgstr "Son Geribildirimleri Derecelendirme " #. module: rating #: model:ir.model.fields,field_description:rating.field_mail_channel__rating_last_image @@ -268,7 +269,7 @@ msgstr "" #: model:ir.model.fields,field_description:rating.field_project_task__rating_last_image #: model:ir.model.fields,field_description:rating.field_rating_mixin__rating_last_image msgid "Rating Last Image" -msgstr "" +msgstr "Son Resmin Değerlendirilmesi" #. module: rating #: model:ir.model.fields,field_description:rating.field_mail_channel__rating_last_value diff --git a/addons/sale/i18n/es.po b/addons/sale/i18n/es.po index 803590c4001..bbfeff87c3d 100644 --- a/addons/sale/i18n/es.po +++ b/addons/sale/i18n/es.po @@ -217,6 +217,8 @@ msgid "" "<span class=\"label label-success hidden-xs\"><i class=\"fa fa-fw fa-" "check\"/><span class=\"hidden-xs\"> Done</span></span>" msgstr "" +"<span class=\"label label-success hidden-xs\"><i class=\"fa fa-fw fa-" +"check\"/><span class=\"hidden-xs\"> Realizado </span></span>" #. module: sale #: model:ir.ui.view,arch_db:sale.portal_order_page @@ -233,6 +235,8 @@ msgid "" "<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> " "Done</span>" msgstr "" +"<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> " +"Realizado </span>" #. module: sale #: model:ir.ui.view,arch_db:sale.report_saleorder_document diff --git a/addons/stock/data/stock_data.xml b/addons/stock/data/stock_data.xml index bc37a9bb572..53e4639be74 100644 --- a/addons/stock/data/stock_data.xml +++ b/addons/stock/data/stock_data.xml @@ -142,11 +142,6 @@ <field name="number_increment">1</field> </record> - <record id="base.main_partner" model="res.partner"> - <field name="property_stock_customer" model="stock.warehouse" - eval="obj().env.ref('stock.warehouse0').lot_stock_id.id"/> - </record> - <!-- create xml ids for demo data that are widely used in tests or in other codes, for more convenience --> <function model="ir.model.data" name="_update"> <value>stock.location</value> diff --git a/addons/stock/i18n/fr.po b/addons/stock/i18n/fr.po index ae03212d38a..24431158e5e 100644 --- a/addons/stock/i18n/fr.po +++ b/addons/stock/i18n/fr.po @@ -27,6 +27,7 @@ # Lucas Deliege <lud@odoo.com>, 2016 # lucasdeliege <deliegelucas@gmail.com>, 2016 # ShevAbam, 2016 +# Fred Gilson <fgi@odoo.com>, 2016 # Régis GEROMEGNACE <regis.geromegnace@gmail.com>, 2016 # Shark McGnark <peculiarcheese@gmail.com>, 2016 # Guilhaume Bordiau <github@guilhaume.fr>, 2016 @@ -6224,7 +6225,7 @@ msgstr "Mettre à jour la quantité d'articles" #: model:ir.ui.view,arch_db:stock.product_product_view_form_easy_inherit_stock #: model:ir.ui.view,arch_db:stock.product_template_form_view_procurement_button msgid "Update Qty On Hand" -msgstr "Mettre à jour le stock disponibles" +msgstr "Mettre à jour le stock disponible" #. module: stock #: selection:stock.move,priority:0 selection:stock.picking,priority:0 diff --git a/addons/stock/models/res_company.py b/addons/stock/models/res_company.py index a310991cc17..58c61be714f 100644 --- a/addons/stock/models/res_company.py +++ b/addons/stock/models/res_company.py @@ -28,12 +28,18 @@ class Company(models.Model): location.sudo().write({'company_id': company.id}) company.write({'internal_transit_location_id': location.id}) + warehouses = self.env['stock.warehouse'].search([('partner_id', '=', self.partner_id.id)]) + warehouses.mapped('partner_id').with_context(force_company=self.id).write({ + 'property_stock_customer': location.id, + 'property_stock_supplier': location.id, + }) + @api.model def create(self, vals): company = super(Company, self).create(vals) - # multi-company rules prevents creating warehouse and sub-locations + company.create_transit_location() + # mutli-company rules prevents creating warehouse and sub-locations self.env['stock.warehouse'].check_access_rights('create') self.env['stock.warehouse'].sudo().create({'name': company.name, 'code': company.name[:5], 'company_id': company.id, 'partner_id': company.partner_id.id}) - company.create_transit_location() return company diff --git a/addons/stock/models/stock_quant.py b/addons/stock/models/stock_quant.py index 7b82cb01f79..cced953e3ba 100644 --- a/addons/stock/models/stock_quant.py +++ b/addons/stock/models/stock_quant.py @@ -79,12 +79,6 @@ class StockQuant(models.Model): if float_compare(quant.quantity, 1, precision_rounding=quant.product_uom_id.rounding) > 0 and quant.lot_id and quant.product_id.tracking == 'serial': raise ValidationError(_('A serial number should only be linked to a single product.')) - @api.constrains('in_date', 'lot_id') - def check_in_date(self): - for quant in self: - if quant.in_date and not quant.lot_id: - raise ValidationError(_('An incoming date cannot be set to an untracked product.')) - @api.constrains('location_id') def check_location_id(self): for quant in self: @@ -109,9 +103,9 @@ class StockQuant(models.Model): @api.model def _get_removal_strategy_order(self, removal_strategy): if removal_strategy == 'fifo': - return 'in_date, id' + return 'in_date ASC NULLS FIRST, id' elif removal_strategy == 'lifo': - return 'in_date desc, id desc' + return 'in_date DESC NULLS LAST, id desc' raise UserError(_('Removal strategy %s not implemented.') % (removal_strategy,)) def _gather(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, strict=False): @@ -134,7 +128,17 @@ class StockQuant(models.Model): domain = expression.AND([[('owner_id', '=', owner_id and owner_id.id or False)], domain]) domain = expression.AND([[('location_id', '=', location_id.id)], domain]) - return self.search(domain, order=removal_strategy_order) + # Copy code of _search for special NULLS FIRST/LAST order + self.sudo(self._uid).check_access_rights('read') + query = self._where_calc(domain) + self._apply_ir_rules(query, 'read') + from_clause, where_clause, where_clause_params = query.get_sql() + where_str = where_clause and (" WHERE %s" % where_clause) or '' + query_str = 'SELECT "%s".id FROM ' % self._table + from_clause + where_str + " ORDER BY "+ removal_strategy_order + self._cr.execute(query_str, where_clause_params) + res = self._cr.fetchall() + # No uniquify list necessary as auto_join is not applied anyways... + return self.browse([x[0] for x in res]) @api.model def _get_available_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, strict=False, allow_negative=False): @@ -196,17 +200,16 @@ class StockQuant(models.Model): quants = self._gather(product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=True) rounding = product_id.uom_id.rounding - if lot_id: - incoming_dates = quants.mapped('in_date') # `mapped` already filtered out falsy items - incoming_dates = [fields.Datetime.from_string(incoming_date) for incoming_date in incoming_dates] - if in_date: - incoming_dates += [in_date] - # If multiple incoming dates are available for a given lot_id/package_id/owner_id, we - # consider only the oldest one as being relevant. - if incoming_dates: - in_date = fields.Datetime.to_string(min(incoming_dates)) - else: - in_date = fields.Datetime.now() + incoming_dates = [d for d in quants.mapped('in_date') if d] + incoming_dates = [fields.Datetime.from_string(incoming_date) for incoming_date in incoming_dates] + if in_date: + incoming_dates += [in_date] + # If multiple incoming dates are available for a given lot_id/package_id/owner_id, we + # consider only the oldest one as being relevant. + if incoming_dates: + in_date = fields.Datetime.to_string(min(incoming_dates)) + else: + in_date = fields.Datetime.now() for quant in quants: try: diff --git a/addons/stock/models/stock_traceability.py b/addons/stock/models/stock_traceability.py index 633fb1b785e..9a9ec915e93 100644 --- a/addons/stock/models/stock_traceability.py +++ b/addons/stock/models/stock_traceability.py @@ -21,24 +21,28 @@ class MrpStockReport(models.TransientModel): @api.model def _get_move_lines(self, move_lines): - res = self.env['stock.move.line'] - for move_line in move_lines: + lines_seen = move_lines + lines_todo = list(move_lines) + while lines_todo: + move_line = lines_todo.pop(0) # if MTO if move_line.move_id.move_orig_ids: - res |= move_line.move_id.move_orig_ids.mapped('move_line_ids').filtered( - lambda m: m.lot_id.id == move_line.lot_id.id) + lines = move_line.move_id.move_orig_ids.mapped('move_line_ids').filtered( + lambda m: m.lot_id == move_line.lot_id + ) - lines_seen # if MTS + elif move_line: + lines = self.env['stock.move.line'].search([ + ('product_id', '=', move_line.product_id.id), + ('lot_id', '=', move_line.lot_id.id), + ('id', 'not in', lines_seen.ids), + ('date', '<', move_line.date), + ]) else: - if move_line: - res |= self.env['stock.move.line'].search([ - ('product_id', '=', move_line.product_id.id), - ('lot_id', '=', move_line.lot_id.id), - ('id', '!=', move_line.id), - ('date', '<', move_line.date), - ]) - if res: - res |= self._get_move_lines(res) - return res + continue + lines_todo += list(lines) + lines_seen |= lines + return lines_seen - move_lines @api.model def get_lines(self, line_id=None, **kw): diff --git a/addons/stock/models/stock_warehouse.py b/addons/stock/models/stock_warehouse.py index 7fc13f8b07c..4a5d595ec87 100644 --- a/addons/stock/models/stock_warehouse.py +++ b/addons/stock/models/stock_warehouse.py @@ -178,9 +178,10 @@ class Warehouse(models.Model): ResCompany = self.env['res.company'] if company_id: transit_loc = ResCompany.browse(company_id).internal_transit_location_id.id + self.env['res.partner'].browse(partner_id).with_context(force_company=company_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc}) else: transit_loc = ResCompany._company_default_get('stock.warehouse').internal_transit_location_id.id - self.env['res.partner'].browse(partner_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc}) + self.env['res.partner'].browse(partner_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc}) def create_sequences_and_picking_types(self): IrSequenceSudo = self.env['ir.sequence'].sudo() diff --git a/addons/stock/report/report_stockpicking_operations.xml b/addons/stock/report/report_stockpicking_operations.xml index 850f5ad2e3d..724aea21c07 100644 --- a/addons/stock/report/report_stockpicking_operations.xml +++ b/addons/stock/report/report_stockpicking_operations.xml @@ -96,8 +96,8 @@ <span t-field="ml.product_id.description_picking"/> </td> <td> - <span t-if="o.state != 'done'" t-esc="ml.product_uom_qty"/> - <span t-if="o.state == 'done'" t-esc="ml.qty_done"/> + <span t-if="o.state != 'done'" t-field="ml.product_uom_qty"/> + <span t-if="o.state == 'done'" t-field="ml.qty_done"/> <span t-field="ml.product_uom_id" groups="uom.group_uom"/> </td> <td width="20%" t-if="o.picking_type_id.code != 'incoming'"> diff --git a/addons/stock/tests/test_quant.py b/addons/stock/tests/test_quant.py index baebfc1de9d..98e1627451c 100644 --- a/addons/stock/tests/test_quant.py +++ b/addons/stock/tests/test_quant.py @@ -628,7 +628,24 @@ class StockQuant(TransactionCase): }) quantity, in_date = self.env['stock.quant']._update_available_quantity(product1, stock_location, 1.0) self.assertEqual(quantity, 1) - self.assertEqual(in_date, None) + self.assertNotEqual(in_date, None) + + + def test_in_date_1b(self): + stock_location = self.env.ref('stock.stock_location_stock') + product1 = self.env['product.product'].create({ + 'name': 'Product A', + 'type': 'product', + }) + self.env['stock.quant'].create({ + 'product_id': product1.id, + 'location_id': stock_location.id, + 'quantity': 1.0, + }) + quantity, in_date = self.env['stock.quant']._update_available_quantity(product1, stock_location, 2.0) + self.assertEqual(quantity, 3) + self.assertNotEqual(in_date, None) + def test_in_date_2(self): """ Check that an incoming date is correctly set when updating the quantity of a tracked @@ -706,6 +723,34 @@ class StockQuant(TransactionCase): # Removal strategy is LIFO, so lot1 should be received as it was received later. self.assertEqual(quants[0][0].lot_id.id, lot1.id) + def test_in_date_4b(self): + """ Check for LIFO and max with/without in_date that it handles the LIFO NULLS LAST well + """ + stock_location = self.env.ref('stock.stock_location_stock') + stock_location1 = self.env.ref('stock.stock_location_components') + stock_location2 = self.env.ref('stock.stock_location_14') + lifo_strategy = self.env['product.removal'].search([('method', '=', 'lifo')]) + stock_location.removal_strategy_id = lifo_strategy + product1 = self.env['product.product'].create({ + 'name': 'Product A', + 'type': 'product', + 'tracking': 'serial', + }) + + self.env['stock.quant'].create({ + 'product_id': product1.id, + 'location_id': stock_location1.id, + 'quantity': 1.0, + }) + + in_date_location2 = datetime.now() + self.env['stock.quant']._update_available_quantity(product1, stock_location2, 1.0, in_date=in_date_location2) + + quants = self.env['stock.quant']._update_reserved_quantity(product1, stock_location, 1) + + # Removal strategy is LIFO, so the one with date is the most recent one and should be selected + self.assertEqual(quants[0][0].location_id.id, stock_location2.id) + def test_in_date_5(self): """ Receive the same lot at different times, once they're in the same location, the quants are merged and only the earliest incoming date is kept. diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 76baf196c2d..f4cddcc1ee2 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1047,8 +1047,12 @@ class Binary(http.Controller): elif status != 200 and download: return request.not_found() - height = int(height or 0) - width = int(width or 0) + if headers and dict(headers).get('Content-Type', '') == 'image/svg+xml': # we shan't resize svg images + height = 0 + width = 0 + else: + height = int(height or 0) + width = int(width or 0) if crop and (width or height): content = crop_image(content, type='center', size=(width, height), ratio=(1, 1)) diff --git a/addons/web/static/src/js/core/ajax.js b/addons/web/static/src/js/core/ajax.js index 2912b319df2..d6c67eacaec 100644 --- a/addons/web/static/src/js/core/ajax.js +++ b/addons/web/static/src/js/core/ajax.js @@ -260,12 +260,20 @@ function get_file(options) { if (options.error) { var body = this.contentDocument.body; var nodes = body.children.length === 0 ? body.childNodes : body.children; - options.error({ - message: nodes.length > 1 ? nodes[1].textContent : '', - data: { - title: nodes.length > 0 ? nodes[0].textContent : '', - }, - }); + var errorParams = {}; + + try { // Case of a serialized Odoo Exception: It is Json Parsable + var node = nodes[1] || nodes[0]; + errorParams = JSON.parse(node.textContent); + } catch (e) { // Arbitrary uncaught python side exception + errorParams = { + message: nodes.length > 1 ? nodes[1].textContent : '', + data: { + title: nodes.length > 0 ? nodes[0].textContent : '', + } + } + } + options.error(errorParams); } } finally { complete(); diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js index decaf1884b2..a3a9e04f30c 100644 --- a/addons/web/static/src/js/views/abstract_controller.js +++ b/addons/web/static/src/js/views/abstract_controller.js @@ -12,6 +12,7 @@ odoo.define('web.AbstractController', function (require) { * reading localstorage, ...) has to go through the controller. */ +var concurrency = require('web.concurrency'); var ControlPanelMixin = require('web.ControlPanelMixin'); var core = require('web.core'); var AbstractAction = require('web.AbstractAction'); @@ -54,6 +55,8 @@ var AbstractController = AbstractAction.extend(ControlPanelMixin, { this.controllerID = params.controllerID; this.initialState = params.initialState; + // use a DropPrevious to correctly handle concurrent updates + this.dp = new concurrency.DropPrevious(); // those arguments are temporary, they won't be necessary as soon as the // ControlPanel will be handled by the View this.displayName = params.displayName; @@ -232,11 +235,11 @@ var AbstractController = AbstractAction.extend(ControlPanelMixin, { var self = this; var shouldReload = (options && 'reload' in options) ? options.reload : true; var def = shouldReload ? this.model.reload(this.handle, params) : $.when(); - return def.then(function (handle) { + return this.dp.add(def).then(function (handle) { self.handle = handle || self.handle; // update handle if we reloaded var state = self.model.get(self.handle); var localState = self.renderer.getLocalState(); - return self.renderer.updateState(state, params).then(function () { + return self.dp.add(self.renderer.updateState(state, params)).then(function () { self.renderer.setLocalState(localState); self._update(state); }); 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 9c38ecc3a58..1e684d01287 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1559,8 +1559,10 @@ var BasicModel = AbstractModel.extend({ rec = self._makeDataPoint(params); list._cache[rec.res_id] = rec.id; } - - rec._noAbandon = true; + // Do not abandon the record if it has been created + // from `default_get`. The list has a savepoint only + // after having fully executed `default_get`. + rec._noAbandon = !list._savePoint; list._changes.push({operation: 'ADD', id: rec.id}); if (command[0] === 1) { list._changes.push({operation: 'UPDATE', id: rec.id}); @@ -1979,6 +1981,9 @@ 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; @@ -1992,13 +1997,16 @@ var BasicModel = AbstractModel.extend({ return this._rpc({ model: model, method: 'name_get', - args: [ids], + args: [_.uniq(ids)], context: list.context, }) .then(function (name_gets) { - for (var i = 0; i < name_gets.length; i++) { - records[i].data.display_name = name_gets[i][1]; - } + _.each(records, function (record) { + var nameGet = _.find(name_gets, function (nameGet) { + return nameGet[0] === record.data.id; + }); + record.data.display_name = nameGet[1]; + }); }); }, /** @@ -2484,7 +2492,16 @@ var BasicModel = AbstractModel.extend({ var self = this; var def; if (list.static) { - def = this._readUngroupedList(list); + def = this._readUngroupedList(list).then(function () { + if (list.parentID && self.isNew(list.parentID)) { + // list from a default_get, so fetch display_name for many2one fields + var many2ones = self._getMany2OneFieldNames(list); + var defs = _.map(many2ones, function (name) { + return self._fetchNameGets(list, name); + }); + return $.when.apply($, defs); + } + }); } else { def = this._searchReadUngroupedList(list); } @@ -3053,6 +3070,23 @@ var BasicModel = AbstractModel.extend({ return Object.keys(fieldsInfo && fieldsInfo[viewType] || {}); }, /** + * Get many2one fields names in a datapoint. This is useful in order to + * fetch their names in the case of a default_get. + * + * @private + * @param {Object} datapoint a valid resource object + * @returns {string[]} list of field names that are many2one + */ + _getMany2OneFieldNames: function (datapoint) { + var many2ones = []; + _.each(datapoint.fields, function (field, name) { + if (field.type === 'many2one') { + many2ones.push(name); + } + }); + return many2ones; + }, + /** * Evaluate the record evaluation context. This method is supposed to be * called by _getEvalContext. It basically only generates a dictionary of * current values for the record, with commands for x2manys fields. diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index d33da5c0650..123b5388638 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -1237,8 +1237,167 @@ QUnit.module('relational_fields', { form.destroy(); }); - QUnit.test('list in form: discard newly added element with empty required field (onchange)', function (assert) { - assert.expect(8); + QUnit.test('list in form: name_get with unique ids (default_get)', function (assert) { + assert.expect(2); + + this.data.partner.records[0].display_name = "MyTrululu"; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form>' + + '<sheet>' + + '<field name="p">' + + '<tree editable="bottom">' + + '<field name="trululu"/>' + + '</tree>' + + '</field>' + + '</sheet>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + p: [ + [0, 0, { trululu: 1 }], + [0, 0, { trululu: 1 }] + ] + }); + } + if (args.method === 'name_get') { + assert.deepEqual(args.args[0], _.uniq(args.args[0]), + "should not have duplicates in name_get rpc"); + } + return this._super.apply(this, arguments); + }, + }); + + assert.strictEqual(form.$('td.o_data_cell').text(), "MyTrululuMyTrululu", + "both records should have the correct display_name for trululu field"); + + form.destroy(); + }); + + QUnit.test('list in form: show name of many2one fields in multi-page (default_get)', function (assert) { + assert.expect(4); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form>' + + '<sheet>' + + '<field name="p">' + + '<tree editable="bottom" limit="1">' + + '<field name="display_name"/>' + + '<field name="trululu"/>' + + '</tree>' + + '</field>' + + '</sheet>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + p: [ + [0, 0, { display_name: 'record1', trululu: 1 }], + [0, 0, { display_name: 'record2', trululu: 2 }] + ] + }); + } + return this._super.apply(this, arguments); + }, + }); + + assert.strictEqual(form.$('td.o_data_cell').first().text(), + "record1", "should show display_name of 1st record"); + assert.strictEqual(form.$('td.o_data_cell').first().next().text(), + "first record", "should show display_name of trululu of 1st record"); + + form.$('button.o_pager_next').click(); + + assert.strictEqual(form.$('td.o_data_cell').first().text(), + "record2", "should show display_name of 2nd record"); + assert.strictEqual(form.$('td.o_data_cell').first().next().text(), + "second record", "should show display_name of trululu of 2nd record"); + + form.destroy(); + }); + + QUnit.test('list in form: discard newly added element with empty required field (onchange in default_get)', function (assert) { + // variant of the test "list in form: discard newly added element with + // empty required field (default_get)", in which the `default_get` + // performs an `onchange` at the same time. This `onchange` may create + // some records, which should not be abandoned on discard, similarly + // to records created directly by `default_get` + assert.expect(7); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + this.data.partner.onchanges = { + product_id: function (obj) { + if (obj.product_id === 37) { + obj.p = [[0, 0, { display_name: "entry", trululu: false }]]; + } + }, + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form>' + + '<field name="product_id"/>' + + '<field name="p">' + + '<tree editable="bottom">' + + '<field name="display_name"/>' + + '<field name="trululu" required="1"/>' + + '</tree>' + + '</field>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + product_id: 37, + }); + } + return this._super.apply(this, arguments); + }, + }); + + // check that there is a record in the editable list with empty string as required field + assert.strictEqual(form.$('.o_data_row').length, 1, + "should have a row in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should have the correct displayed name"); + var requiredField = $('td.o_data_cell.o_required_modifier'); + assert.strictEqual(requiredField.length, 1, + "should have a required field on this record"); + assert.strictEqual(requiredField.text(), "", + "should have empty string in the required field on this record"); + + // click on empty required field in editable list record + requiredField.click(); + // click off so that the required field still stay empty + $('body').click(); + + // record should not be dropped + assert.strictEqual(form.$('.o_data_row').length, 1, + "should not have dropped record in the editable list"); + assert.strictEqual($('td.o_data_cell').first().text(), "entry", + "should still have the correct displayed name"); + assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "", + "should still have empty string in the required field"); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + }); + + QUnit.test('list in form: discard newly added element with empty required field (onchange after default_get)', function (assert) { + // discarding a record from an `onchange` in a `default_get` should not + // abandon the record. However, any `onchange` after `default_get` + // should be abandoned on discard + assert.expect(6); var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; @@ -1249,7 +1408,6 @@ QUnit.module('relational_fields', { obj.p = [[0, 0, { display_name: "entry", trululu: false }]]; } }, - trululu: function () {}, }; var form = createView({ @@ -1291,13 +1449,9 @@ QUnit.module('relational_fields', { // click off so that the required field still stay empty $('body').click(); - // record should not be dropped - assert.strictEqual(form.$('.o_data_row').length, 1, - "should not have droppped record in the editable list"); - assert.strictEqual($('td.o_data_cell').first().text(), "entry", - "should still have the correct displayed name"); - assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "", - "should still have empty string in the required field"); + // record should be dropped + assert.strictEqual(form.$('.o_data_row').length, 0, + "should have dropped record in the editable list"); relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; form.destroy(); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 493c440702e..31c89cb0a32 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -3418,6 +3418,47 @@ QUnit.module('Views', { testUtils.unpatch(mixins.ParentedMixin); }); + QUnit.test('concurrent reloads finishing in inverse order', function (assert) { + assert.expect(3); + + var blockSearchRead = false; + var def = $.Deferred(); + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree><field name="foo"/></tree>', + mockRPC: function (route) { + var result = this._super.apply(this, arguments); + if (route === '/web/dataset/search_read' && blockSearchRead) { + return $.when(def).then(_.constant(result)); + } + return result; + }, + }); + + assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4, + "list view should contain 4 records"); + + // reload with a domain (this request is blocked) + blockSearchRead = true; + list.reload({domain: [['foo', '=', 'yop']]}); + + assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4, + "list view should still contain 4 records (search_read being blocked)"); + + // reload without the domain + blockSearchRead = false; + list.reload({domain: []}); + + // unblock the RPC + def.resolve(); + assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4, + "list view should still contain 4 records"); + + list.destroy(); + }); + QUnit.test('list view on a "noCache" model', function (assert) { assert.expect(8); diff --git a/addons/web_editor/static/src/js/widgets/widgets.js b/addons/web_editor/static/src/js/widgets/widgets.js index f7c1c808016..b63568ff0bd 100644 --- a/addons/web_editor/static/src/js/widgets/widgets.js +++ b/addons/web_editor/static/src/js/widgets/widgets.js @@ -373,13 +373,13 @@ var ImageWidget = MediaWidget.extend({ .sortBy(function (r) { if (_.any(self.firstFilters, function (filter) { var regex = new RegExp(filter, 'i'); - return r.name.match(regex) || r.datas_fname.match(regex); + return r.name.match(regex) || r.datas_fname && r.datas_fname.match(regex); })) { return -1; } if (_.any(self.lastFilters, function (filter) { var regex = new RegExp(filter, 'i'); - return r.name.match(regex) || r.datas_fname.match(regex); + return r.name.match(regex) || r.datas_fname && r.datas_fname.match(regex); })) { return 1; } diff --git a/addons/website_form/controllers/main.py b/addons/website_form/controllers/main.py index b37ca97ea79..41a120008b4 100644 --- a/addons/website_form/controllers/main.py +++ b/addons/website_form/controllers/main.py @@ -112,6 +112,7 @@ class WebsiteForm(http.Controller): 'record': {}, # Values to create record 'attachments': [], # Attached files 'custom': '', # Custom fields values + 'meta': '', # Add metadata if enabled } authorized_fields = model.sudo()._get_form_writable_fields() diff --git a/addons/website_quote/__manifest__.py b/addons/website_quote/__manifest__.py index e6a0a1c274f..115f8f6821d 100644 --- a/addons/website_quote/__manifest__.py +++ b/addons/website_quote/__manifest__.py @@ -7,7 +7,7 @@ 'website': 'https://www.odoo.com/page/quote-builder', 'version': '1.0', 'description': "", - 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail'], + 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail', 'sale_payment'], 'data': [ 'data/website_quote_data.xml', 'report/sale_order_reports.xml', diff --git a/addons/website_sale/static/src/js/website_sale_tour_buy.js b/addons/website_sale/static/src/js/website_sale_tour_buy.js index 4aa9f82e627..ecec6541b2d 100644 --- a/addons/website_sale/static/src/js/website_sale_tour_buy.js +++ b/addons/website_sale/static/src/js/website_sale_tour_buy.js @@ -72,7 +72,7 @@ tour.register('shop_buy_product', { content: "Pay Now", //Either there are multiple payment methods, and one is checked, either there is only one, and therefore there are no radio inputs extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))', - trigger: 'button[id="o_payment_form_pay"]:visible', + trigger: 'button[id="o_payment_form_pay"]:visible:not(:disabled)', }, { content: "finish", diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index dd27b8312b9..a99870fae86 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -1152,7 +1152,7 @@ <t t-if="error" t-foreach="error.get('error_message', [])" t-as="err"> <h4 class="text-danger" t-esc="err" /> </t> - <form name="/shop/checkout" method="post" class="checkout_autoformat"> + <form action="/shop/address" method="post" class="checkout_autoformat"> <div t-attf-class="form-group #{error.get('name') and 'has-error' or ''} col-md-12 div_name"> <label class="control-label" for="name">Name</label> <input type="text" name="name" class="form-control" t-att-value="'name' in checkout and checkout['name']" /> diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py index 56ef9c451f2..70b3b446303 100644 --- a/addons/website_sale_delivery/controllers/main.py +++ b/addons/website_sale_delivery/controllers/main.py @@ -4,7 +4,6 @@ from odoo import http, _ from odoo.http import request from odoo.addons.website_sale.controllers.main import WebsiteSale -from odoo.tools import float_repr class WebsiteSaleDelivery(WebsiteSale): @@ -46,9 +45,6 @@ class WebsiteSaleDelivery(WebsiteSale): has_stockable_products = any(line.product_id.type in ['consu', 'product'] for line in order.order_line) if has_stockable_products: if order.carrier_id and not order.delivery_rating_success: - values['errors'].append( - (_("Ouch, you cannot choose this carrier!"), - _("%s does not ship to your address, please choose another one.\n(Error: %s)" % (order.carrier_id.name, order.delivery_message)))) order._remove_delivery_line() delivery_carriers = order._get_delivery_methods() @@ -67,8 +63,15 @@ class WebsiteSaleDelivery(WebsiteSale): return {'status': order.delivery_rating_success, 'error_message': order.delivery_message, 'carrier_id': carrier_id, - 'new_amount_delivery': float_repr(currency.round(order.delivery_price), currency.decimal_places), - 'new_amount_untaxed': order.amount_untaxed, - 'new_amount_tax': order.amount_tax, - 'new_amount_total': order.amount_total, + 'new_amount_delivery': self._format_amount(order.delivery_price, currency), + 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency), + 'new_amount_tax': self._format_amount(order.amount_tax, currency), + 'new_amount_total': self._format_amount(order.amount_total, currency), } + + def _format_amount(self, amount, currency): + fmt = "%.{0}f".format(currency.decimal_places) + lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') + + return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ + .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011') diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py index 027d3db904d..461a70f5496 100644 --- a/addons/website_sale_delivery/models/sale_order.py +++ b/addons/website_sale_delivery/models/sale_order.py @@ -65,12 +65,11 @@ class SaleOrder(models.Model): carrier = delivery break self.write({'carrier_id': carrier.id}) + self._remove_delivery_line() if carrier: self.get_delivery_price() if self.delivery_rating_success: self.set_delivery_line() - else: - self._remove_delivery_line() return bool(carrier) diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js index 3cb0df152c1..971e604d1d1 100644 --- a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js +++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js @@ -27,6 +27,10 @@ odoo.define('website_sale_delivery.checkout', function (require) { else { console.error(result.error_message); $compute_badge.text(result.error_message); + $amount_delivery.text(result.new_amount_delivery); + $amount_untaxed.text(result.new_amount_untaxed); + $amount_tax.text(result.new_amount_tax); + $amount_total.text(result.new_amount_total); } }; @@ -40,6 +44,12 @@ odoo.define('website_sale_delivery.checkout', function (require) { var $carriers = $("#delivery_carrier input[name='delivery_type']"); $carriers.click(_onCarrierClick); + // Workaround to: + // - update the amount/error on the label at first rendering + // - prevent clicking on 'Pay Now' if the shipper rating fails + if ($carriers.length > 0) { + $carriers.filter(':checked').click(); + } /* Handle stuff */ $(".oe_website_sale select[name='shipping_id']").on('change', function () { diff --git a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml index 2d570094f66..80718417aaf 100644 --- a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml +++ b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml @@ -3,7 +3,7 @@ <template id="cart_delivery" name="Delivery Costs" inherit_id="website_sale.total"> <xpath expr="//tr[@id='order_total_untaxed']" position="before"> - <tr id="order_delivery" t-if="website_sale_order and website_sale_order.has_delivery"> + <tr id="order_delivery" t-if="website_sale_order and website_sale_order.carrier_id"> <td class="text-right noborder text-muted" title="Delivery will be updated after choosing a new delivery method">Delivery:</td> <td class="text-left-not-lg text-right-lg noborder text-muted" > <span t-field="website_sale_order.amount_delivery" style="white-space: nowrap;" t-options='{ diff --git a/doc/cla/corporate/acysos.md b/doc/cla/corporate/acysos.md new file mode 100644 index 00000000000..ed1e556d19a --- /dev/null +++ b/doc/cla/corporate/acysos.md @@ -0,0 +1,16 @@ +Spain, 2018-05-12 + +Acysos S.L. agrees to the terms of the Odoo Corporate Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Ignacio Ibeas ignacio@acysos.com https://github.com/acysos + +List of contributors: + +Ignacio Ibeas ignacio@acysos.com https://github.com/acysos +Alex Ezquebo alexander@acysos.com https://github.com/acysos diff --git a/doc/cla/individual/wohthan.md b/doc/cla/individual/wohthan.md new file mode 100644 index 00000000000..33f300742ae --- /dev/null +++ b/doc/cla/individual/wohthan.md @@ -0,0 +1,11 @@ +Italy, 2018-05-17 + +I hereby agree to the terms of the Odoo Individual Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Samuele Carli <carlisamuele@csspace.net> https://github.com/WohthaN diff --git a/odoo/addons/base/data/res.country.state.csv b/odoo/addons/base/data/res.country.state.csv index c48ed49141d..4b445f52cf9 100644 --- a/odoo/addons/base/data/res.country.state.csv +++ b/odoo/addons/base/data/res.country.state.csv @@ -397,6 +397,7 @@ state_it_sv,it,"Savona","SV" state_it_si,it,"Siena","SI" state_it_sr,it,"Siracusa","SR" state_it_so,it,"Sondrio","SO" +state_it_su,it,"Sud Sardegna","SU" state_it_ta,it,"Taranto","TA" state_it_te,it,"Teramo","TE" state_it_tr,it,"Terni","TR" diff --git a/odoo/addons/base/data/res_country_data.xml b/odoo/addons/base/data/res_country_data.xml index db41e2370ce..0e865be0fdf 100644 --- a/odoo/addons/base/data/res_country_data.xml +++ b/odoo/addons/base/data/res_country_data.xml @@ -1123,6 +1123,7 @@ <field file="base/static/img/country_flags/mx.png" name="image" type="base64" /> <field name="currency_id" ref="MXN" /> <field eval="52" name="phone_code" /> + <field name="vat_label">RFC</field> </record> <record id="my" model="res.country"> <field name="name">Malaysia</field> diff --git a/odoo/addons/base/i18n/de.po b/odoo/addons/base/i18n/de.po index 12945219fd5..3710878ca5b 100644 --- a/odoo/addons/base/i18n/de.po +++ b/odoo/addons/base/i18n/de.po @@ -7657,7 +7657,7 @@ msgstr "Aktionen" #. module: base #: model:ir.ui.view,arch_db:base.action_view_company_form_link_2_currencies msgid "Activate more currencies" -msgstr "" +msgstr "Aktivieren von zusätzlichen Währungen" #. module: base #: model:ir.model.fields,field_description:base.field_ir_cron__active diff --git a/odoo/addons/base/i18n/tr.po b/odoo/addons/base/i18n/tr.po index 9a626da8d9a..8f66e9fc13f 100644 --- a/odoo/addons/base/i18n/tr.po +++ b/odoo/addons/base/i18n/tr.po @@ -60,6 +60,10 @@ msgid "" "Allow cashier to reprint receipts\n" "\n" msgstr "" +"\n" +"\n" +"Kasiyerin fişleri tekrar yazdırmasına izin ver.\n" +"\n" #. module: base #: model:ir.module.module,description:base.module_l10n_hu @@ -76,6 +80,18 @@ msgid "" " - Hungarian Bank information\n" " " msgstr "" +"\n" +"\n" +"Macar lokalizasyonu için bazı modüller\n" +"==========================================\n" +"\n" +"This module consists :\n" +"\n" +" - Generic Hungarian chart of accounts\n" +" - Hungarian taxes\n" +" - Hungarian Bank information\n" +" \n" +" " #. module: base #: model:ir.module.module,description:base.module_l10n_do @@ -182,6 +198,10 @@ msgid "" "\n" " " msgstr "" +"\n" +"Gelir tahakkuku\n" +"Ürün satışlarınızda gelir muhasebenizi yönetin.\n" +"Gelir tahakkuk taksitlerini takip eder ve ilgili yevmiye girişlerini oluşturur." #. module: base #: code:addons/base/models/res_config.py:314 @@ -202,6 +222,8 @@ msgid "" "\n" "This module adds a custom Sales Channel for the point of sale to be able to view and manage your point of sale sales with more ease.\n" msgstr "" +"\n" +"Bu modül, satış noktasınızın daha kolay yönetilebilmesi ve görüntülenebilmesi için özel satış kanalı ekler.\n" #. module: base #: model:ir.module.module,description:base.module_pos_restaurant @@ -214,6 +236,14 @@ msgid "" "- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers\n" "\n" msgstr "" +"\n" +"Bu modül çeşitli restoran özelliklerini satış noktaına ekler: \n" +"\n" +"- Hesap Yazdırma: Ödeme öncesinde makbuz yazdırılmasına olanak sağlar \n" +"\n" +"- Hesap Bölme: Bir siparişi birden fazla siparişe bölmeye olanak sağlar \n" +"\n" +"- Mutfak Sipariş Yazdırma: Sipariş değişikliklerini mutfak veya bar yazıcılarından yazdırılmasına olanak sağlar\n" #. module: base #: model:ir.module.module,description:base.module_pos_discount @@ -224,6 +254,8 @@ msgid "" "sale discount to a customer.\n" "\n" msgstr "" +"\n" +"Bu modül kasiyerin müşteriye hızlı bir şekilde satış indirimini yüzdesini vermesine izin verir.\n" #. module: base #: model:ir.module.module,description:base.module_pos_loyalty @@ -235,6 +267,8 @@ msgid "" "and get rewards.\n" "\n" msgstr "" +"\n" +"Bu modül, satış noktasında müşterilerinizin sadakat puanı kazanıp ödüller kazanabileceği sadakat programı tanımlamanızı sağlar.\n" #. module: base #: code:addons/model.py:136 @@ -303,6 +337,9 @@ msgid "" " - Track timesheet for task from ticket\n" " " msgstr "" +"\n" +"- Yardım masası takımı için proje düzenlemeye izin ver\n" +"- Taleplerdeki görevler için zaman çizelgesini takip et" #. module: base #: model:ir.module.module,description:base.module_account_tax_python @@ -315,6 +352,11 @@ msgid "" " \"Python Code\" defines the amount of the tax.\n" " " msgstr "" +"\n" +"Python kodu olarak tanımlanan bir vergi, birim fiyat, ürün veya iş ortağı gibi verileri içeren yerel bir ortamda yürütülen iki python kod snippet'lerinden oluşur.\n" +"'Uygulanabilir Kod', uygulanabilecekse tanımlar\n" +"\n" +"\"Python Kod' verginin miktarını tanımlar." #. module: base #: model:ir.module.module,description:base.module_l10n_be_reports @@ -356,6 +398,8 @@ msgid "" " Also add DATEV export options to general ledger\n" " " msgstr "" +"\n" +"Almanya için Muhasebe raporları Bilanço, Kâr ve Zarar, KDV ve İş Ortağı KDV raporlarını içerir. Ayrıca, genel muhasebe defterine DATEV ihracat seçenekleri ekler" #. module: base #: model:ir.module.module,description:base.module_l10n_hu_reports @@ -424,6 +468,8 @@ msgid "" " Accounting reports for UK\n" " " msgstr "" +"\n" +"Birleşik Krallık için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_us_reports @@ -432,6 +478,8 @@ msgid "" " Accounting reports for US\n" " " msgstr "" +"\n" +"Birleşik Devletler için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_uy_reports @@ -440,6 +488,8 @@ msgid "" " Accounting reports for Uruguay\n" "\n" msgstr "" +"\n" +"Uruguay için muhasebe raporları\n" #. module: base #: model:ir.module.module,description:base.module_account_extension @@ -450,6 +500,9 @@ msgid "" " This module will be auto installed if account module and enterprise edition are present\n" " " msgstr "" +"\n" +"Enterprise Sürümü için temel muhasebe modülünü uyarla.\n" +"Bu modül, eğer muhasebe modülü ve enterprise sürümü yüklüyse, otomatik olarak yüklenir." #. module: base #: model:ir.module.module,description:base.module_voip @@ -458,6 +511,8 @@ msgid "" " Allow to make call from next activities or with click-to-dial.\n" " " msgstr "" +"\n" +"Gelecek etkinlikten yada anlaşmaya telefon ile çağrı oluşturmaya izin ver." #. module: base #: model:ir.module.module,summary:base.module_account_tax_python @@ -475,6 +530,8 @@ msgid "" " Bill timesheets logged on helpdesk tickets.\n" " " msgstr "" +"\n" +"Ödeme zaman çizelgesi, yardım masası taleplerinde loglanır." #. module: base #: model:ir.module.module,description:base.module_hr_maintenance @@ -503,6 +560,8 @@ msgid "" " Compute sales tax automatically using TaxCloud based on customer address in United States.\n" " " msgstr "" +"\n" +"Satış vergisini, müşterinin Birleşik Devletlerdeki adresini baz alan TaxCloud kullanarak otomatik olarak hesapla." #. module: base #: model:ir.module.module,summary:base.module_l10n_mx_reports @@ -514,6 +573,11 @@ msgid "" " DIOT Report\n" " " msgstr "" +"\n" +"Ekonomik muhasebe raporları\n" +"- COA\n" +"- Geçici Mizan\n" +"DIOT raporu" #. module: base #: model:ir.module.module,summary:base.module_pos_cache @@ -521,6 +585,8 @@ msgid "" "\n" " Enable a cache on products for a lower POS loading time." msgstr "" +"\n" +"Daha kısa bir POS yükleme süresi için ürünlerde bir önbellek etkinleştirin." #. module: base #: model:ir.module.module,description:base.module_hr_expense_sepa @@ -529,6 +595,8 @@ msgid "" " Enable the SEPA features in the payments of expenses\n" " " msgstr "" +"\n" +"SEPA özelliklerini giderlerin ödemesinde etkinleştirin" #. module: base #: model:ir.module.module,description:base.module_account_sepa @@ -540,6 +608,10 @@ msgid "" " For more informations about the SEPA standards : http://www.iso20022.org/ and http://www.europeanpaymentscouncil.eu/\n" " " msgstr "" +"\n" +"Önerilen SEPA normları gibi, ödeme talimatı oluşturun, pain.001 mesajlarına teşekkürler. Desteklenen pain versiyonu (ülkelere göre) pain.001.001.03 (genel), pain.001.001.03.ch.02 (İsviçre) ve pain.001.003.03 (Almanya). Oluşturulan XML dosyası daha sonra bankanıza yüklenebilir.\n" +"Bu modül Avrupa Ödeme Konseyi tarafından verilen uygulama kurallarına uyar.\n" +"SEPA standartları hakkında daha fazla bilgi için : http://www.iso20022.org/ ve http://www.europeanpaymentscouncil.eu/" #. module: base #: model:ir.module.module,summary:base.module_voip @@ -547,6 +619,8 @@ msgid "" "\n" " Make Call from all modules using the VOIP system." msgstr "" +"\n" +"Tüm modüllerden VOIP sistemini kullanarak çağrı oluşturun." #. module: base #: model:ir.module.module,summary:base.module_website_quote_subscription @@ -554,6 +628,8 @@ msgid "" "\n" " Online Quotes for subscriptions products" msgstr "" +"\n" +"Abonelik ürünleri için online talepler" #. module: base #: model:ir.module.module,description:base.module_hr_expense_check @@ -562,6 +638,8 @@ msgid "" " Print amount in words on checks issued for expenses\n" " " msgstr "" +"\n" +"Masraflar için verilen çeklerde yazılı tutar" #. module: base #: model:ir.module.module,summary:base.module_social_media @@ -580,6 +658,11 @@ msgid "" " fields are stored in a \"serialized\" field in the form of a JSON mapping.\n" " " msgstr "" +"\n" +"Bu modülün amacı \"seyrek\" alanlara uygulamaktır\n" +"\n" +"Bu uygulama, bir tablodaki sütun sayısı üzerindeki PostgreSQL sınırlamasını engeller.\n" +"Tüm seyrek alanları değeri JSON haritalama formundaki 'seri' alanlarda depolanır." #. module: base #: model:ir.module.module,description:base.module_social_media @@ -597,6 +680,8 @@ msgid "" " This module adds support for barcodes scanning to the delivery packages.\n" " " msgstr "" +"\n" +"Bu modül, teslimat paketlerinde barkod taraması için destek ekler." #. module: base #: model:ir.module.module,description:base.module_stock_barcode @@ -605,6 +690,8 @@ msgid "" " This module adds support for barcodes scanning to the warehouse management system.\n" " " msgstr "" +"\n" +"Bu modül depo yönetim sisteminde barkod taraması için destek ekler." #. module: base #: model:ir.module.module,description:base.module_account_sepa_direct_debit @@ -641,6 +728,15 @@ msgid "" " try to use this method on an invoice for whose payment no mandate can be used.\n" " " msgstr "" +"\n" +" Bu modül, bir takım ödemeleri toplayabilmek için bankanıza göndermek üzere SEPA Otomatik Ödeme (SDD) uyumlu XML dosyalarının (pain.008.001.02 belirtimiyle tutarlı olarak) oluşturulmasını sağlar.\n" +"Bu ödeme yöntemine hak kazanabilmek için bir müşteri, önce otomatik ödeme kullanım onayını vererek şirkete bir vekalet vermiş olmalıdır.\n" +"Bu onay Odoo'ya 'müşteri yetkisi' olarak kodlanmış olmalıdır.\n" +"Bir SDD dosyasını düzgün bir şekilde oluşturmak için aşağıdaki gereksinimleri de karşılamanız gerekir:\n" +"- Şirket hesabınız geçerli bir IBAN numarası olarak ayarlanmalıdır \n" +"- Şirket hesabınız geçerli bir BIC'ye sahip bir banka ile ilişkili olmalıdır \n" +"- Şirketinize bir alacaklı kimliği verilmiş olmalıdır (bu, 'ayarlar' menüsünde yapılabilir. muhasebe modülü).\n" +"- Firmanız SDD ödemeleri almak için bir yevmiye tanımlamış olmalıdır (yine, 'muhasebe modülünün' ayarlarında ')" #. module: base #: model:ir.module.module,summary:base.module_account_online_sync @@ -648,6 +744,8 @@ msgid "" "\n" " This module is used for Online bank synchronization." msgstr "" +"\n" +"Bu modül online banka senkronizasyonu için kullanılır." #. module: base #: model:ir.module.module,description:base.module_account_online_sync @@ -656,6 +754,8 @@ msgid "" " This module is used for Online bank synchronization. It provides basic methods to synchronize bank statement.\n" " " msgstr "" +"\n" +"Bu modül online banka senkronizasyonu için kullanılır. Bu, banka durumu ile senkronize olmayı basit yöntemlerle sağlar." #. module: base #: model:ir.module.module,description:base.module_web_mobile @@ -664,6 +764,8 @@ msgid "" " This module provides the core of the Odoo Mobile App.\n" " " msgstr "" +"\n" +"Bu modül Odoo Mobil App'in çekirdeğini sağlar." #. module: base #: model:ir.module.module,description:base.module_maintenance @@ -703,6 +805,9 @@ msgid "" " to allow you to define interviews for different jobs.\n" " " msgstr "" +"\n" +"İşe alım sürecinde görüşme formlarını kullanın.\n" +"Bu modül, farklı işler için görüşmeler tanımlamanıza olanak tanıyan anket modülü ile entegre edilmiştir." #. module: base #: model:ir.module.module,description:base.module_timesheet_grid_sale @@ -712,6 +817,8 @@ msgid "" " linked to an SO, or only the validated timesheets\n" " " msgstr "" +"\n" +"Zaman çizelgesini faturaladığınızda, bir satış siparişine veya yalnızca onaylanmış zaman çizelgelerine bağlı tüm zaman çizelgelerini faturalandırmaya izin verir" #. module: base #: model:ir.module.module,description:base.module_l10n_multilang @@ -724,6 +831,10 @@ msgid "" " templates to target objects.\n" " " msgstr "" +"\n" +"* Birçok dil, Muhasebe Kartı, Vergiler, Vergi Kodları, Yevmiyeler, Muhasebe Şablonları, Analitik Muhasebe Kartları ve Analitik Yevmiyeler için destek sağlar.\n" +"* Kurulum sihirbaz değişiklikleri \n" +"- Şablonlardan COA, Vergi, Vergi Kodu ve Mali Durumlarını hedef objelere kopyalayın." #. module: base #: model:ir.module.module,description:base.module_quality_mrp_workorder @@ -738,6 +849,8 @@ msgid "" "\n" " Adds workcenters to Quality Control\n" msgstr "" +"\n" +"Kalite kontrol için iş merkezi ekler\n" #. module: base #: model:ir.module.module,description:base.module_test_documentation_examples @@ -748,6 +861,8 @@ msgid "" " syntax-checked and tested.\n" " " msgstr "" +"\n" +"Sözdizimi kontrol edilip test edilebilecek durumlarda teknik dokümantasyon örnekleri olarak (`literalinclude`` direktifiyle) kullanılacak kod parçalarını içerir." #. module: base #: model:ir.module.module,description:base.module_website_sale_stock @@ -765,6 +880,8 @@ msgid "" " Gantt view for Leaves Dashboard\n" " " msgstr "" +"\n" +"İzin paneli için Gantt görünümü" #. module: base #: model:ir.module.module,description:base.module_hr_timesheet_attendance @@ -786,6 +903,9 @@ msgid "" " PayUmoney payment gateway supports only INR currency.\n" " " msgstr "" +"\n" +"Hindistan için PayuMoney Ödeme Alıcısı.\n" +"PayUmoney ödeme geçidi sadece INR para birimini destekler." #. module: base #: model:ir.module.module,description:base.module_project_forecast @@ -801,6 +921,8 @@ msgid "" "\n" " Publish your products on eBay" msgstr "" +"\n" +"Ürünlerinizi eBay'de yayınlayın" #. module: base #: model:ir.module.module,description:base.module_project_forecast_sale @@ -809,6 +931,8 @@ msgid "" "* Automatically enables forecasting on projects created from sales orders\n" " " msgstr "" +"\n" +"* Satış siparişlerinden oluşturulmuş projelerde otomatik olarak öngörür" #. module: base #: model:ir.module.module,description:base.module_timesheet_grid @@ -818,6 +942,9 @@ msgid "" "* Activate grid view for timesheets\n" " " msgstr "" +"\n" +"* Zaman çizelgesi sunumu ve onaylama\n" +"* Zaman çizelgesi için grid görünümünü etkinleştir" #. module: base #: model:ir.module.module,description:base.module_report_intrastat @@ -829,6 +956,9 @@ msgid "" "This module gives the details of the goods traded between the countries of\n" "European Union." msgstr "" +"\n" +"Ticaret istatistiklerini ekleyen bir modül.\n" +"Bu modül, Avrupa Birliği ülkeleri arasında yapılan ticaretin detaylarını verir." #. module: base #: model:ir.module.module,description:base.module_account_accountant @@ -840,6 +970,11 @@ msgid "" "\n" "It assigns manager and user access rights to the Administrator for the accounting application and only user rights to the Demo user.\n" msgstr "" +"\n" +"Muhasebe Erişim Hakları\n" +"Admin kullanıcıya yevmiye kalemleri ve hesap planı gibi tüm muhasebe özelliklerine erişim sağlar.\n" +"\n" +"Muhasebe uygulaması için admine, yöneticiye, kullanıcıya ve yalnızca Demo kullanıcısı için kullanıcı hakları atar.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_be_hr_payroll_account @@ -862,6 +997,8 @@ msgid "" "==================\n" " " msgstr "" +"\n" +"Muhasebe Raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_ar_reports @@ -872,6 +1009,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Arjantin için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_bo_reports @@ -882,6 +1021,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Bolivya için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_co_reports @@ -891,6 +1032,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Kolombiya için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_hr_reports @@ -900,6 +1043,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Hırvatistan için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_et_reports @@ -910,6 +1055,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Etiyopya muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_fr_reports @@ -920,6 +1067,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Fransa için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_gr_reports @@ -930,6 +1079,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Yunanistan için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_in_reports @@ -939,6 +1090,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Hindistan için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_jp_reports @@ -948,6 +1101,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Japonya için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_lu_reports @@ -957,6 +1112,8 @@ msgid "" "=================================\n" " " msgstr "" +"\n" +"Lüksemburg için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_ma_reports @@ -966,6 +1123,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Fas için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_no_reports @@ -975,6 +1134,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Norveç için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_pl_reports @@ -984,6 +1145,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Polonya için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_l10n_sg_reports @@ -1005,6 +1168,8 @@ msgid "" "================================\n" " " msgstr "" +"\n" +"Tayland için muhasebe raporları" #. module: base #: model:ir.module.module,description:base.module_website_mass_mailing @@ -1013,6 +1178,8 @@ msgid "" "Add a snippet in the website builder to subscribe a mass_mailing list\n" " " msgstr "" +"\n" +"Website oluşturucuya, bir mass_mailing listesine abone olmak için bir parça ekleyin" #. module: base #: model:ir.module.module,description:base.module_sale_order_dates @@ -1027,6 +1194,12 @@ msgid "" " * Commitment Date\n" " * Effective Date\n" msgstr "" +"\n" +"Satış siparişine ek tarih bilgisi ekleyin.\n" +"Bir satış siparişine şu tarihleri ekleyebilirsiniz:\n" +"* İstenen Tarih (seçim tarihinde beklenen tarih olarak kullanılacaktır)\n" +"* Taahhüt Tarihi\n" +"* Yürürlülük Tarihi\n" #. module: base #: model:ir.module.module,description:base.module_hr_contract @@ -1066,6 +1239,11 @@ msgid "" "For instance when invoicing a training, the training agenda and materials will automatically be sent to your customers.'\n" " " msgstr "" +"\n" +"Fatura onayında göndermek için ürüne email şablonu ekleyin\n" +"Bu modül ile birlikte, ürünlerinizi müşterinize tam bilgi ve araç göndermek için bir şablona bağlayın.\n" +"\n" +"Örneğin, bir eğitimi faturalandırırken, eğitim ajandası ve materyalleri müşterilerinize otomatik olarak gönderilecektir." #. module: base #: model:ir.module.module,description:base.module_product_margin @@ -1076,6 +1254,8 @@ msgid "" "\n" "The wizard to launch the report has several options to help you get the data you need.\n" msgstr "" +"\n" +"Satışları, satın alımları, marjları ve faturalara dayalı diğer ilginç göstergeleri hesaplayan ürünlere bir raporlama menüsü ekler\n" #. module: base #: model:ir.module.module,description:base.module_pad @@ -1088,6 +1268,8 @@ msgid "" "pads (by default, http://etherpad.com/).\n" " " msgstr "" +"\n" +"Web istemcisinde (Ether) Pad eklentileri için gelişmiş destek ekler." #. module: base #: model:ir.module.module,description:base.module_website_calendar @@ -1097,6 +1279,8 @@ msgid "" "-------------------------------------------------------------\n" "\n" msgstr "" +"\n" +"Müşterilerinizin Web Siteniz üzerinden Randevu Almasını sağlayın\n" #. module: base #: model:ir.module.module,description:base.module_pos_mercury @@ -1116,6 +1300,14 @@ msgid "" "* Supported cards: Visa, MasterCard, American Express, Discover\n" " " msgstr "" +"\n" +"Kredi kartı POS ödemelerine izin verir.\n" +"Bu modül, müşterilerin, siparişlerini kredi kartı ile ödemesine izin verir.\n" +"İşlemler Mercury (Wells Fargo Bank tarafından geliştirilen) tarafından işlenir. Bir Mercury ticari hesabı gereklidir. Bu hesap, şunları sağlar:\n" +"* Ödeme ekranındayken sadece bir kredi kartını okutarak hızlı ödeme.\n" +"* Nakit ve kredi kartı ödemelerinin birleştirilmesi.\n" +"* Paraüstü\n" +"* Desteklenen kartlar: Visa, MasterCard, American Express, Discover" #. module: base #: model:ir.module.module,description:base.module_auth_oauth @@ -1124,6 +1316,8 @@ msgid "" "Allow users to login through OAuth2 Provider.\n" "=============================================\n" msgstr "" +"\n" +"OAuth2 sağlayıcısı ile kullanıcılara giriş için izin ver.\n" #. module: base #: model:ir.module.module,description:base.module_auth_signup @@ -1157,6 +1351,9 @@ msgid "" "\n" "Be careful with this module as it has audit implications. Cancelling accounting entries is not authorized in all countries.\n" msgstr "" +"\n" +"Hesap girdilerinin iptalini sağlar.\n" +"Bu modül yevmiye girişlerini iptal etmeye izin vermek için, muhasebe yevmiyelerine bir kontrol kutusu ekler.\n" #. module: base #: model:ir.module.module,description:base.module_sale_timesheet @@ -1169,6 +1366,10 @@ msgid "" "according to the order/contract you work on. This allows to\n" "have real delivered quantities in sales orders.\n" msgstr "" +"\n" +"Satış siparişlerinde satış zaman çizelgesine izin verir.\n" +"\n" +"Bu modül, çalıştığınız siparişe / sözleşmeye göre tüm zaman çizelgesinde doğru ürünü belirler. Bu, satış siparişlerindeki gerçek teslim miktarının olmasını sağlar. \n" #. module: base #: model:ir.module.module,description:base.module_delivery @@ -1180,6 +1381,9 @@ msgid "" "You can define your own carrier for prices. When creating\n" "invoices from picking, the system is able to add and compute the shipping line.\n" msgstr "" +"\n" +"Satış siparişlerine ve toplamaya teslimat yöntemi eklemenizi sağlar.\n" +"Fiyatlar için kendi taşıyıcınızı tanımlayabilirsiniz. Toplamadan faturalar oluşturulurken, sistem kargo satırını ekleyebilir ve hesaplamayı sağlar.\n" #. module: base #: model:ir.module.module,description:base.module_mrp_account @@ -1190,6 +1394,9 @@ msgid "" "\n" "* Cost structure report\n" msgstr "" +"\n" +"MRP'deki Analitik Muhasebe\n" +"* Maliyet yapısı raporu\n" #. module: base #: model:ir.module.module,description:base.module_l10n_ar @@ -1202,6 +1409,12 @@ msgid "" "\n" " " msgstr "" +"\n" +"Arjantin hesap planı ve yerel vergi.\n" +"==============================================\n" +"Plan contable argentino e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +" " #. module: base #: model:ir.module.module,description:base.module_website_forum @@ -1210,6 +1423,8 @@ msgid "" "Ask questions, get answers, no distractions\n" " " msgstr "" +"\n" +"Sorular sorun, cevaplar alın, oyalamak yok" #. module: base #: model:ir.module.module,description:base.module_account_test @@ -1223,6 +1438,10 @@ msgid "" "in PDF format which can be accessed by Menu Reporting -> Accounting Tests, then select the test \n" "and print the report from Print button in header area.\n" msgstr "" +"\n" +"Muhasebe ile ilgili konular.\n" +"Bu modül ile birlikte, muhasebe modülünün tutarlılıklarını ve tutarsızlıklarını, Raporlama / Muhasebe / Muhasebe Testleri menüsünden manuel olarak kontrol edebilirsiniz.\n" +"Süreklilik Testi oluşturmak için bir istek yazabilir ve test sonuçlarını PDF formatında Raporlar Menüsü -> Muhasebe Testleri den elde edebilir, daha sonra testi seçer ve raporun üst kısmında bulunan Yazdır butonuna tıklayarak yazdırabilirsin. \n" #. module: base #: model:ir.module.module,description:base.module_account_asset @@ -1235,6 +1454,10 @@ msgid "" "\n" " " msgstr "" +"\n" +"Varlıklar Yönetimi\n" +"Bir şirketin yada bir kişinin sahip olduğu varlıkları yönetin.\n" +"Amortismanları takip eder ve karşılık gelen yevmiye girişlerini yaratır." #. module: base #: model:ir.module.module,description:base.module_document @@ -1245,6 +1468,10 @@ msgid "" "* Show attachment on the top of the forms\n" "* Document Indexation: odt\n" msgstr "" +"\n" +"Eklerin listesi ve belge endeksleme\n" +"* Eki formun üstünde göster\n" +"* Belge Endeksleme: odt\n" #. module: base #: model:ir.module.module,description:base.module_l10n_au @@ -1260,6 +1487,12 @@ msgid "" " - sets up Australian taxes.\n" " " msgstr "" +"\n" +"Avustralya Muhasebe Modülü\n" +"Avustralya muhasebesi temel grafikler ve yerelleştirmeler.\n" +"Ayrıca:\n" +"- bir dizi bölgesel para birimini etkinleştirir.\n" +"- Avustralya vergilerini ayarla." #. module: base #: model:ir.module.module,description:base.module_l10n_au_reports @@ -1271,6 +1504,9 @@ msgid "" "GST Reporting for Australian Accounting.\n" " " msgstr "" +"\n" +"Avustralya Muhasebe Raporları\n" +"Avustralya Muhasebesi için GST raporları." #. module: base #: model:ir.module.module,description:base.module_base_vat_autocomplete @@ -1282,6 +1518,9 @@ msgid "" " This module requires the python library stdnum to work.\n" " " msgstr "" +"\n" +"Vergi No ile adreslerin oto-tamamlanması\n" +"Bu modül çalışmak için python kütüphane stdnumu gerektirir." #. module: base #: model:ir.module.module,description:base.module_base_gengo @@ -1298,6 +1537,13 @@ msgid "" "This wizard will activate the CRON job and the Scheduler and will start the automatic translation via Gengo Services for all the terms where you requested it.\n" " " msgstr "" +"\n" +"Gengo API üzerinden Otomatik Çeviriler\n" +"\n" +"Bu modül, Gengo API kullanarak otomatik çeviri için pasif zamanlayıcı işini yükleyecektir. Etkinleştirmek için, şunları yapmak zorundasınız.\n" +"1) 'Ayarlar > Şirketler > Gengo Parametreleri' içinde Gengo yetkilendirme parametrelerini yapılandırın.\n" +"2) Sihirbazı 'Ayarlar> Uygulama Koşulları> Gengo: Manuel Tercüme İstekleri' altında başlatın ve sihirbazı izleyin.\n" +"Bu sihirbaz CRON işini ve Zamanlayıcı'yı etkinleştirir ve sizden talep ettiğiniz tüm terimler için otomatik çeviri ile Gengo Servisleri'ni başlatır." #. module: base #: model:ir.module.module,description:base.module_hw_scanner @@ -1311,6 +1557,9 @@ msgid "" "point of sale module. \n" "\n" msgstr "" +"\n" +"Barkod Tarama Donanım Sürücüsü\n" +"Bu modül, web istemcisinin uzaktan kurulmuş bir barkoda erişmesini sağlar tarayıcı ve satış noktası noktasına barkod tarayıcı desteği sağlamak için posbox tarafından kullanılır.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_et @@ -1326,6 +1575,12 @@ msgid "" " - Regional State listings\n" " " msgstr "" +"\n" +"Etiyopya Yerelleştirmesi için Temel Modül\n" +"Bu en son Etiyopya Odoo yerelleştirmesi ve şunları içerir:\n" +"- Hesağ planı\n" +"- Vergi No'lu vergi yapısı\n" +"- Stopaj yapısı" #. module: base #: model:ir.module.module,description:base.module_l10n_br @@ -1367,6 +1622,32 @@ msgid "" "2011). Those modules are also strictly licensed under AGPL V3 and today don't \n" "come with any additional paid permission for online use of 'private modules'.\n" msgstr "" +"\n" +"Brezilya lokalizasyonu için temel modül\n" +"==========================================\n" +"\n" +"Bu modül şunlardan oluşur:\n" +"\n" +" - Genel Brezilya hesap tablosu\n" +" - Brezilya vergileri gibi:\n" +"\n" +" - IPI\n" +" - ICMS\n" +" - PIS\n" +" - COFINS\n" +" - ISS\n" +" - IR\n" +" - IRPJ\n" +" - CSLL\n" +"\n" +"Tax_discount alanı ayrıca, account.tax.template dosyasına eklenmiştir.\n" +"Bazı Brezilya KDV'lerinin doğru hesaplanmasını sağlamak için ICMS gibi account.tax nesnelerine izin verir.\n" +"Hesap oluşturma sihirbazı şeması bu yeni verileri doğru bir şekilde yayar\n" +"\n" +"Ancak, bu modülün birçok uygulamada eksik olduğunu not etmek önemlidir.\n" +"Odoo'yu Brezilya'da uygun şekilde kullanın. Bu uygulamalar (halihazırda faal olan elektronik mali Faturalama gibi), Brezilyalı Launchpad yerelleştirme projesi olan https://launchpad.net/openerp.pt-br-localiz'in 15'ten fazla ek modülü ve bunların\n" +"ekstra eklentiler dalı tarafından taşınır. Bu modüller dikkat çekici Odoo modülerliğini bozmama amacını taşıyor, bu yüzden sayıca çok ama küçükler. \n" +"Bu modülleri ayrı tutmanın nedenlerinden biri, Brezilyalı Yerelleşme liderlerinin, şirketlerin geri kalan yasal gereklilikleri finanse etmesi (örneğin, mali defterler, SPED, mali SPED ve PAF ECF gibi) Eylül ayında hala eksik olan yerelleşmeyi tamamlamak için haklar çevikliğine ihtiyaç duymalarıdır. 2011). Bu modüller ayrıca AGPL V3 kapsamında kesinlikle lisanslıdır ve bugün 'özel modüllerin çevrimiçi kullanımı için herhangi bir ek ücretli izinle birlikte gelmemektedir.\n" #. module: base #: model:ir.module.module,description:base.module_account_batch_deposit @@ -1379,6 +1660,10 @@ msgid "" "When you proceed with the reconciliation, simply select the corresponding batch deposit to reconcile the payments.\n" " " msgstr "" +"\n" +"Toplu ödemeler, alınan çekleri bankaya yatırmadan önce gruplamanıza izin verir.\n" +"Bankanıza yatırılan tutar, banka hesap özetinizde tek bir işlem olarak görünür.\n" +"Uzlaştırmaya geçtiğinizde ödemeleri eşleştirmek için ilgili toplu ödemeyi seçin." #. module: base #: model:ir.module.module,description:base.module_l10n_be_hr_payroll @@ -1398,6 +1683,19 @@ msgid "" " * Salary Maj, ONSS, Withholding Tax, Child Allowance, ...\n" " " msgstr "" +"\n" +"Belçika Bordro Kuralları.\n" +"======================\n" +"\n" +" * Çalışan bilgileri\n" +" * Çalışan Sözleşmeleri\n" +" * Pasaport Bazlı Sözleşme\n" +" * Ödenek / Kesintiler\n" +" * Temel / Brüt / Net Maaşı yapılandırmaya izin ver\n" +" * Çalışan Payslip\n" +" * Aylık Bordro Kayıt\n" +" * Ayrılık Yönetimi ile Entegre\n" +" * Maaş Maj, ONSS, Stopaj Vergisi, Çocuk Ödeneği," #. module: base #: model:ir.module.module,description:base.module_pos_blackbox_be @@ -1421,6 +1719,23 @@ msgid "" "No modified version is certified and supported by Odoo SA.\n" " " msgstr "" +"\n" +"Belçika Kayıtlı Yazarkasa\n" +"================================\n" +"\n" +"Bu modül Satış Noktası modülünü sertifikalı bir Belçika kasaya dönüştürür.\n" +"\n" +"Daha fazla bilgi:\n" +" * http://www.systemedecaisseenregistreuse.be/\n" +" * http://www.geregistreerdkassasysteem.be/\n" +"\n" +"Yasal\n" +"-----\n" +"** pos_blackbox_be kaynaklarının kullanımı sadece odoo.com SaaS platformunda onaylıdır\n" +"9.0 sürümü için. **\n" +"Pos_blackbox_be'nin gizlenmiş ve onaylanmış bir sürümü sağlanabilir.\n" +"şirket içi kurulumlar için talepler.\n" +"Hiçbir değiştirilmiş sürüm Odoo SA tarafından onaylanmış ve desteklenmemektedir." #. module: base #: model:ir.module.module,description:base.module_l10n_bo @@ -1432,6 +1747,12 @@ msgid "" "\n" " " msgstr "" +"\n" +"Bolivya hesap planı ve yerel vergi.\n" +"==============================================\n" +"Plan contable boliviano e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +" " #. module: base #: model:ir.module.module,description:base.module_website_rating @@ -1440,6 +1761,8 @@ msgid "" "Bridge module for rating on website stuff.\n" " " msgstr "" +"\n" +"Web sitesi sayfalarında değerlendirme için köprü modülü." #. module: base #: model:ir.module.module,description:base.module_project_timesheet_holidays @@ -1452,6 +1775,12 @@ msgid "" "on leaves. Project and task can be configured company-wide.\n" " " msgstr "" +"\n" +"Köprü modülü zaman çizelgesine izinleri entegre eder\n" +"================================================\n" +"\n" +"Bu modül, çalışanlar otomatik olarak zaman çizelgelerini izinler üzerinde günlüğe kaydetmeyi sağlar.\n" +". Proje ve görev şirket çapında yapılandırılabilir." #. module: base #: model:ir.module.module,description:base.module_base_automation_hr_contract @@ -1461,6 +1790,8 @@ msgid "" "====================================================\n" " " msgstr "" +"\n" +"Otomatik işlemlerde sözleşme takvimi eklemek için köprü" #. module: base #: model:ir.module.module,description:base.module_crm_phone_validation @@ -1471,6 +1802,9 @@ msgid "" "\n" "This module allows for validate and format phone numbers for leads and contacts." msgstr "" +"\n" +"CRM Telefon Numarası Doğrulaması\n" +"Bu modül müşteri adaylarının yada kişilerin telefon numaralarını doğrulamayı ve formatını sağlar." #. module: base #: model:ir.module.module,description:base.module_l10n_ve @@ -1504,6 +1838,19 @@ msgid "" "If you install this module, and select Custom chart a basic chart will be proposed, \n" "but you will need set manually account defaults for taxes.\n" msgstr "" +"\n" +"Venezuella Hesap Bilgileri.\n" +"Venezuela, yasalara göre hiçbir hesap tablosuna sahip değil, ancak varsayılan, Odoo'da önerilen, Venezuela'da kabul edilen bazı uygulamalarl uyumludur ve bu plan bu uygulamalara uymalıdır. \n" +"\n" +"Bu modül 1000'den fazla şirket için temel olarak test edildi, çünkü Venezüella piyasasında en yaygın yazılımların bir karışımına dayanıyor. Muhasebecilerin Odoo'yla ilk adımlarını daha rahat hissetmelerini sağlayacak.\n" +"Bu modül, Venezüella'nın tamamının lokalizasyonu gibi görünmüyor, ancak bu ülkede Odoo ile gerçekten hızlı bir şekilde başlamanıza yardımcı olacak.\n" +"Bu modül size şunları sağlar:\n" +"- Venezuella temel vergileri\n" +"- Topluluk yerelleştirmesiyle testleri çalıştırmak için temel verilere sahip olun\n" +"- İhtiyaçlarınız bir muhasebe PoV'sinden temel alıyorsa, 0'dan bir şirket başlatın.\n" +"Eğer Venezuella faturasız bir şekilde stoğunuzu değerlemek istiyorsanız, biz account_anglo_saxon kullanmanızı öneriyoruz.\n" +"\n" +"Bu modülü kurarsanız ve Özel çizelge'yi seçerseniz, temel bir grafik önerilecektir, ancak vergiler için manuel hesap varsayılanlarını ayarlamanız gerekecektir.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_th @@ -1515,6 +1862,9 @@ msgid "" "Thai accounting chart and localization.\n" " " msgstr "" +"\n" +"Tayland Hesap Bilgileri\n" +"Tayland muhasebe biligileri ve yerelleştirme" #. module: base #: model:ir.module.module,description:base.module_l10n_cr @@ -1533,6 +1883,13 @@ msgid "" "please go to http://translations.launchpad.net/openerp-costa-rica.\n" " " msgstr "" +"\n" +"Kosta Rika hesap bilgileri.\n" +"Şunları içerir:\n" +"* account.account.template\n" +"* account.tax.template\n" +"* account.chart.template\n" +"Herşey İspanyolca çeviri ile İngilizce'dir. Daha fazla çeviri kabul edilir, lütfen http://translations.launchpad.net/openerp-costa-rica adresine gidin." #. module: base #: model:ir.module.module,description:base.module_l10n_cl @@ -1561,6 +1918,9 @@ msgid "" "This module allows to enforce users to choose the city of a partner inside a given list instead of a free text field.\n" " " msgstr "" +"\n" +"Adreslerle Şehir Yönetimi\n" +"Bu modül, kullanıcıları serbest metin alanı yerine belirli bir listedeki bir ortağın şehrini seçmeye zorlar." #. module: base #: model:ir.module.module,description:base.module_project_timesheet_forecast_sale @@ -1572,6 +1932,9 @@ msgid "" "In your project plan, you can compare your timesheets and your forecast to better schedule your resources.\n" " " msgstr "" +"\n" +"Zaman çizelgelerini ve öngörüleri projeleriniz için kıyaslayın.\n" +"Proje planınızda, kaynaklarınızı daha iyi planlamak için zaman çizelgelerinizi ve öngörülerinizi kıyaslayabilirsiniz." #. module: base #: model:ir.module.module,description:base.module_decimal_precision @@ -1580,6 +1943,8 @@ msgid "" "Configure the price accuracy you need for different kinds of usage: accounting, sales, purchases.\n" "=================================================================================================\n" msgstr "" +"\n" +"Farklı kullanım türleri için ihtiyacınız olan fiyat doğruluğunu yapılandırın: muhasebe, satış, satın almalar.\n" #. module: base #: model:ir.module.module,description:base.module_website_crm_phone_validation @@ -1593,6 +1958,11 @@ msgid "" "- use the international format for all others\n" " " msgstr "" +"\n" +"Websitedeki İletişim Numarası Doğrulama\n" +"Kartvizit (telefon, cep telefonu) numaralarını doğrulayın ve potansiyel müşteri adaylarına ve kişilere göre normalleştirin:\n" +"- Şirketinizin bulunduğu ülke için ulusal formatı kullanın\n" +"- Diğerleri için uluslararası formatı kullanın " #. module: base #: model:ir.module.module,description:base.module_account @@ -1601,6 +1971,8 @@ msgid "" "Core mechanisms for the accounting modules. To display the menuitems, install the module account_invoicing.\n" " " msgstr "" +"\n" +"Muhasebe modülü için ana mekanizma. menü elemanlarını göstermek, modül account_invoicing yükleyin." #. module: base #: model:ir.module.module,description:base.module_survey @@ -1616,6 +1988,9 @@ msgid "" "sent mails with personal token for the invitation of the survey.\n" " " msgstr "" +"\n" +"Güzel web anketleri oluşturun ve cevapları görselleştirin\n" +"Bazı kullanıcıların cevaplarına veya incelemelerine göre değişir. Bir anket birden fazla sayfa olabilir. Her sayfa birçok soru içerebilir ve her sorunun birden çok cevabı olabilir. Farklı kullanıcılar soruların cevaplarını farklı verebilirler ve anket buna göre yapılır. Ortaklara ayrıca, anketin daveti için kişisel Token'ı olan postalar gönderilir." #. module: base #: model:ir.module.module,description:base.module_link_tracker @@ -1626,6 +2001,8 @@ msgid "" "\n" " " msgstr "" +"\n" +"Kısa ve takip edilebilir URL oluşturun." #. module: base #: model:ir.module.module,description:base.module_event_sale @@ -1643,6 +2020,11 @@ msgid "" "when you confirm your sales order it will automatically create a registration for\n" "this event.\n" msgstr "" +"\n" +"Satış siparişleri ile kayıt oluşturma.\n" +"Bu modül, kayıt oluşturma işleminizi ana satış akışınızla otomatikleştirmenize ve bağlamanıza ve böylece kayıtların faturalama özelliğini etkinleştirmenize olanak tanır.\n" +"Size, kendisiyle ilişkili bir etkinlik kategorisi seçme olanağını sunan yeni bir tür hizmet ürünü tanımlar.\n" +"Bu ürün için bir satış siparişini kodladığınızda, o kategorinin mevcut bir etkinliğini seçebileceksiniz ve satış siparişinizi onayladığınızda bu etkinlik için otomatik olarak bir kayıt oluşturacaktır.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_hr @@ -1675,6 +2057,25 @@ msgid "" " https://www.rrif.hr/dok/preuzimanje/rrif-rp2012.rar\n" "\n" msgstr "" +"\n" +"Hırvat yerelleştirmesi.\n" +"Yazar: Goran Kliska, Slobodni programi d.o.o., Zagreb\n" +" https://www.slobodni-programi.hr\n" +"Katkıda Bulunanlar: Tomislav Bošnjaković, Storm\n" +"Bilgisyarlar : tipovi konta Ivan Vađić, Slobodni programi: tipovi konta\n" +"Tanım: \n" +"Hırvat Hesap Bilgileri (RRIF ver.2012)\n" +"\n" +"RRIF-ov računski plan za poduzetnike za 2012.\n" +"Vrste konta\n" +"Kontni plan prema RRIF-u, dorađen u smislu kraćenja naziva i dodavanja analitika\n" +"Porezne grupe prema poreznoj prijavi\n" +"Porezi PDV obrasca\n" +"Ostali porezi\n" +"Osnovne fiskalne pozicije\n" +"Izvori podataka:\n" +" https://www.rrif.hr/dok/preuzimanje/rrif-rp2011.rar\n" +" https://www.rrif.hr/dok/preuzimanje/rrif-rp2012.rar\n" #. module: base #: model:ir.module.module,description:base.module_website_sale_delivery @@ -1694,6 +2095,8 @@ msgid "" "Design gorgeous mails\n" " " msgstr "" +"\n" +"Harika mailler tasarlayın" #. module: base #: model:ir.module.module,description:base.module_l10n_de @@ -1706,6 +2109,9 @@ msgid "" "German accounting chart and localization.\n" " " msgstr "" +"\n" +"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03.\n" +"Alman muhasebe bilgileri ve yerelleştirme." #. module: base #: model:ir.module.module,description:base.module_l10n_de_skr04 @@ -1717,6 +2123,9 @@ msgid "" "German accounting chart and localization.\n" " " msgstr "" +"\n" +"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03.\n" +"Alman muhasebe bilgileri ve yerelleştirme." #. module: base #: model:ir.module.module,description:base.module_website_twitter @@ -1739,6 +2148,8 @@ msgid "" "\n" "Display orders to invoice in website dashboard.\n" msgstr "" +"\n" +"Website panelinde faturalanacak siparişleri göster.\n" #. module: base #: model:ir.module.module,description:base.module_website_forum_doc @@ -1747,6 +2158,8 @@ msgid "" "Documentation based on question and pertinent answers of Forum\n" " " msgstr "" +"\n" +"Forumun sorularına ve ilgili cevaplarına dayalı dokümanlar" #. module: base #: model:ir.module.module,description:base.module_l10n_mx_edi @@ -1759,6 +2172,10 @@ msgid "" "This module allows the creation of the EDI documents and the communication with the Mexican certification providers (PACs) to sign/cancel them.\n" " " msgstr "" +"\n" +"EDI Meksika Yerelleştirmesi\n" +"Meksika faturalaması için kullanıcıların EDI belgesi oluşturmasını sağlar.\n" +"Bu modül EDI belgesi oluşturmayı ve Meksika sertifika sağlayıcısı (PACs) ile iletişim kurup imzala/iptal etmeyi sağlar." #. module: base #: model:ir.module.module,description:base.module_hw_escpos @@ -1772,6 +2189,9 @@ msgid "" "that would need such functionality.\n" "\n" msgstr "" +"\n" +"ESC/POS Donanım Sürücüsü\n" +"Bu modül, Odoo'nun ESC / POS uyumlu yazıcılarla baskı yapmasına ve ESC / POS kontrollü nakit çekmecelerin satış noktasında ve bu tür işlevselliğe ihtiyaç duyabilecek diğer modüllerde açılmasına olanak tanır.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_eu_service @@ -1825,6 +2245,26 @@ msgid "" "\n" " " msgstr "" +"\n" +"Telekomünikasyon, yayın ve elektronik hizmetler için AB Mini One Stop Shop (MOSS) KDV\n" +"1 Ocak 2015'ten itibaren Avrupa Birliği dahilinde satılan telekomünikasyon, yayın ve elektronik hizmetlerin, müşterinin ait olduğu ülkede her zaman vergilendirilmesi gerekmektedir. Bu AB yönergesinin uygulanmasını basitleştirmek için, Mini One Stop Shop (MOSS) kayıt şeması, işletmelerin benzersiz bir vergi beyannamesi yapmasına izin verir.\n" +"Bu modül, gerekli vergileri otomatik olarak uygulamak ve kaydetmek için gerekli AB mali pozisyonlarının ve vergilerinin oluşturulmasına yardımcı olarak mümkün kılmaktadır.\n" +"Bu modül, AB içindeki elektronik hizmetleri satmak için mali pozisyonların ve vergilerin kurulumuna yardımcı olacak bir sihirbaz kurar.\n" +"Sihirbaz şunları seçmenize izin verir.\n" +"- Bu hizmetleri sattığınız AB ülkeleri\n" +"- Hedef ülke vergisine eşlenecek hizmetler için ulusal KDV verginiz\n" +"- İsteğe bağlı olarak: hesap eşlemesini kopyalamak için bir şablon mali konumu. Mevcut B2C Intra-EU mali durumunuz olmalı (varsayılan hesap eşleştirmesi yok)\n" +"- isteğe bağlı olarak: vergi miktarlarını toplamak için kullanılacak bir hesap (hizmetlerin ulusal KDV vergisi tarafından kullanılan hesaba varsayılan)\n" +"Seçilen ülkelerdeki bir müşteri ile AB satışları için otomatik olarak geçerli olan ilgili mali pozisyonları ve vergileri yaratır.\n" +"\n" +"Daha fazla ülke eklemek için sihirbaz tekrar çalıştırılabilir.\n" +"\n" +"Sihirbaz, MOSS bildiriminin KDV tutarlarını toplamak için ayrı bir Grafik Çizelgesi oluşturur, bu nedenle MOSS verilerini çıkarmak kolay olmalıdır.\n" +"Vergi Raporu menüsünde \"AB MOSS KDV Çizelgesi\" adlı Vergi Tablosuna bakın (Genel Muhasebe Raporu)\n" +"Referanslar\n" +"++++++++++\n" +"- 2008/8 / EC sayılı Direktif\n" +"- 1042/2013 sayılı Konsey Uygulama Tüzüğü" #. module: base #: model:ir.module.module,description:base.module_utm @@ -1834,6 +2274,8 @@ msgid "" "=====================================================\n" " " msgstr "" +"\n" +"Paylaşılan linklerde UTM izleyicileri etkinleştir." #. module: base #: model:ir.module.module,description:base.module_auth_crypt @@ -1865,6 +2307,15 @@ msgid "" "necessarily have to be enabled).\n" "\n" msgstr "" +"\n" +"Kodlanmış Şifreler\n" +"\n" +"Güçlü bir şifreleme hash'i ile varsayılan şifre değiştirmeyi değiştirir.\n" +"Şu anda kullanılan anahtar türetme işlevi RSA Security LLC'nin endüstri standardı olan ''PKDF2\" ile kombinasyon halinde ''SHA512'' 'tir. \n" +"Bu birkaç binlerce tur ile tuzlama ve anahtar germe içerir.\n" +"Şifrelenmiş parolaların geçmiş sürümleri, bir kullanıcının kimliği doğrulandığında otomatik olarak güncel şemasına yükseltilir (`` auth_crypt`` önceden daha zayıf `` md5crypt`` anahtar türetme işlevini kullanıyordu.\n" +"Not: Bu modülün yüklenmesi kalıcı olarak kullanıcı şifresinin kurtarılmasını önler ve geri alınamaz. \n" +"Bu nedenle, \"auth_signup\" modülü tarafından sağlananlar gibi kullanıcılar için bazı şifre sıfırlama mekanizmasının etkinleştirilmesi önerilir (yeni kullanıcılar için kaydolmanın mutlaka etkinleştirilmesi gerekmez).\n" #. module: base #: model:ir.module.module,description:base.module_base_address_extended @@ -1879,6 +2330,10 @@ msgid "" "with the street name, the house number, and room number.\n" " " msgstr "" +"\n" +"Genişletilmiş Adres Yönetimi\n" +"Bu modül, doğru adresleri yönetmek için ihtiyaç duyabileceği tüm ekstra alanları içerir.\n" +"Örneğin, yasal raporlarda, bazı ülkelerin caddeyi, sokak, bina numarası ve ev numarası gibi çeşitli alanlara ayırması gerekir." #. module: base #: model:ir.module.module,description:base.module_hw_blackbox_be @@ -1894,6 +2349,11 @@ msgid "" "Belgian cash register. It allows the communication on with a certified Fiscal\n" "Data Module but will not modify the behaviour of the Point of Sale.\n" msgstr "" +"\n" +"Mali Veri Modülü Donanım Sürücüsü\n" +"Bu modül bir satış noktası müşterisinin bağlanmış bir Belçika Mali Veri Modülüne iletişim kurmasını sağlar.\n" +"Bu modül ** bir Odoo Point Of Sale modülünü sertifikalı bir Belçika yazarkasa dönüştürmez.\n" +"Onaylanmış Mali Veri Modülü ile iletişimi sağlar ve Satış Noktası'nın davranışını değiştirmez.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_fr_hr_payroll @@ -1918,6 +2378,15 @@ msgid "" " payslip interface, but not in the payslip report\n" " " msgstr "" +"\n" +"Fransız Ödeme Kuralları.\n" +"- Fransız lokalizasyonu için hr_payroll yapılandırması\n" +"- Fransız maaş bordrosu için tüm kadro katkıları 'kadro' ve 'kadro dışı'\n" +"- Yeni ödeme raporu\n" +"Yapılacaklar:\n" +"- Kesinti ve ödenek için tatil modülü ile entegrasyon\n" +"- Otomatik account_move_line için hr_payroll_account ile entegrasyon\n" +"- Katkıyı entegre etmeye devam edin. Sadece ana katkı şuanda uygulanmaktadır." #. module: base #: model:ir.module.module,description:base.module_gamification @@ -1934,6 +2403,13 @@ msgid "" "\n" "Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile.\n" msgstr "" +"\n" +"Oyunlaştırma Süreci\n" +"Oyunlaştırma modülü Odoo kullanıcılarını motive etmek ve değerlendirme için yollar sağlar.\n" +"Kullanıcılar ulaştıkları amaçları ve görev sayıları ile değerlendirilebilir.\n" +"** Hedefler **, bir takımın üyelerini birbirleriyle ve zaman içinde değerlendirmek ve karşılaştırmak için ** zorluklar ** üzerinden atanır.\n" +"Sayısal olmayan başarılar için, kullanıcılara ** rozetler ** verilebilir. Basit bir \"teşekkür\" den olağanüstü bir başarıya kadar, bir rozet iyi bir iş için bir kullanıcıya minnettarlık etmenin kolay bir yoludur.\n" +"Hem hedefler hem de rozetler esnek ve çok çeşitli modüller ve eylemlere uyarlanabilir. Yüklendiğinde, bu modül yeni kullanıcıların Odoo'yu keşfetmesine ve kullanıcı profilini yapılandırmasına yardımcı olmak için kolay hedefler oluşturur.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_uy @@ -1945,6 +2421,9 @@ msgid "" "Provide Templates for Chart of Accounts, Taxes for Uruguay.\n" "\n" msgstr "" +"\n" +"Genel Hesap Planı\n" +"Uruguay Hesap Planı ve Vergileri için Şablon Sağlar, \n" #. module: base #: model:ir.module.module,description:base.module_l10n_be_intrastat @@ -1954,6 +2433,8 @@ msgid "" "Based on invoices.\n" " " msgstr "" +"\n" +" Faturalara dayanarak, bildiri için Intrastat XML raporu oluşturur." #. module: base #: model:ir.module.module,description:base.module_hr_payroll_account @@ -1967,6 +2448,11 @@ msgid "" " * Company Contribution Management\n" " " msgstr "" +"\n" +"Muhasebe ile Bütünleştirilmiş Genel Bordro sistemi.\n" +"* Gider Kodlaması\n" +"* Ödeme Kodlaması\n" +"* Şirket Katkı Yönetimi" #. module: base #: model:ir.module.module,description:base.module_mail_push @@ -1980,6 +2466,10 @@ msgid "" "**Configure your API keys from General Setting**\n" " " msgstr "" +"\n" +"Google Firebase Messaging Entegrasyonu\n" +"Bu modül, sohbet sırasında her mesaj için kayıtlı cep telefonlarına FCM push bildirimi göndermeyi sağlar.\n" +"Genel ayarlardan API keylerini yapılandırın." #. module: base #: model:ir.module.module,description:base.module_hw_proxy @@ -1994,6 +2484,10 @@ msgid "" "are found in other modules that must be installed separately. \n" "\n" msgstr "" +"\n" +"Donanım Proxy'si\n" +"Bu modül, bu sunucuya bağlı çevre birimlerini uzaktan kullanmanıza izin verir.\n" +"Bu modüller sadece etkin çerçeveyi içerir. Gerçek aygıt sürücüleri, ayrı olarak yüklenmesi gereken diğer modüllerde bulunur.\n" #. module: base #: model:ir.module.module,description:base.module_helpdesk @@ -2017,6 +2511,19 @@ msgid "" "\n" " " msgstr "" +"\n" +"Yardım Masası- Talep Yönetimi Uygulaması\n" +"Özellikler: \n" +"- Talebi farklı aşamalardan çözerek işleyin.\n" +"- Talebinizi tanımlamak öncelik, tür, açıklama ve etiket ekleyin.\n" +"- Ek bilgi için iletişime geçmek ve iş arkadaşlarınıza talep üstünden ping atmak için sohbeti kullanın.\n" +"- Uyarlanmış bir kontrol panelinin kullanımının ve biletlerinizi işlemek için kullanımı kolay bir kanban görünümünün keyfini çıkarın.\n" +"- Raporlar menusunden pivot görünümünü kullanarak talebiniz için detaylı analiz yapın \n" +"- Bir takım oluşturun ve üyelerini tanıtın, eğer dilerseniz otomatik atama yöntemini kullanın.\n" +"- Biletleri otomatik olarak oluşturmak ve müşterilerinizle iletişim kurmak için bir posta takma adı kullanın.\n" +"- Servis Seviyesi Sözleşmesi son tarihlerini otomatik olarak talebinize ekleyin.\n" +"- Değerlendirme puanlarını kullanarak müşteri geri bildirimini elde edin\n" +"- Takımınızın form görüntüsünü kolayca kullanarak ek özellikler yükleyin." #. module: base #: model:ir.module.module,description:base.module_base_import_module @@ -2028,6 +2535,9 @@ msgid "" "This module allows authorized users to import a custom data module (.xml files and static assests)\n" "for customization purpose.\n" msgstr "" +"\n" +"Özel bir veri modülünü içe aktarın\n" +"Bu modül yetkili kullanıcıların, özelleştirme amacı için özel bir veri modülünü (.xml dosyaları ve duran varlıklar) içe aktarır.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_cn_standard @@ -2064,6 +2574,14 @@ msgid "" "Sheet, now only Vertical format has been permitted Which is Supported By Odoo.\n" " " msgstr "" +"\n" +"Hindistan Muhasebesi: Hesap Detayları\n" +"Hint hesap bilgileri ve yerelleştirmesi.\n" +"\n" +"Odoo Hesapların İki Biçimini sunarak Hindistan Muhasebesini yönetmeye izin verir, yani Hesapların Hint Grafiği - Hesapların Standart ve Hint Çizelgesi - Çizelge VI.\n" +"\n" +"Not: Çizelge VI, MCA tarafından revize edilmiştir ve 31 Mart 2011'den sonra yapılan tüm Bilanço için geçerlidir.\n" +"Format, önceki iki Bilanço formatı seçeneği ile ortadan kalktı, artık sadece Odoo tarafından Desteklenen Dikey formatına izin verildi." #. module: base #: model:ir.module.module,description:base.module_l10n_in_schedule6 @@ -2081,6 +2599,12 @@ msgid "" "Sheet, now only Vertical format has been permitted Which is Supported By OpenERP.\n" " " msgstr "" +"\n" +"Hindistan Muhasebesi: Hesap Planı\n" +"Hint hesap planı ve yerelleştirmesi.\n" +"\n" +"Not: Çizelge VI, MCA tarafından revize edilmiştir ve 31 Mart 2011'den sonra yapılan tüm Bilanço için geçerlidir.\n" +"Format, önceki iki Bilanço formatı seçeneği ile ortadan kalktı, artık sadece Open ERP tarafından Desteklenen Dikey formatına izin verildi." #. module: base #: model:ir.module.module,description:base.module_l10n_in_hr_payroll @@ -2102,6 +2626,20 @@ msgid "" " - Yearly Salary by Head and Yearly Salary by Employee Report\n" " " msgstr "" +"\n" +"Hindistan Maaş Bordrosu Kuralları\n" +"\n" +"- Hint yerelleştirmesi için hr_payroll yapılandırması\n" +"- Hindistan maaş bordrosu için tüm ana katkılar.\n" +"* Yeni bordro raporları\n" +"* Personel sözleşmeleri\n" +"* Temel / Brüt / Net Maaşı yapılandırmaya izin verir\n" +"* Personel Bordrosu\n" +"* Ödenek/Kesinti\n" +"* İzin yönetimi ile entegre\n" +"* Medikal izinler, seyehat izinleri, çocuk izinleri,..\n" +"* Bordro öneri ve raporu\n" +"* Çalışan Raporuna Göre Yıllık Maaş " #. module: base #: model:ir.module.module,description:base.module_mail_github @@ -2113,6 +2651,10 @@ msgid "" "This Module integrates all post commits, pull requests and activity of github issue to channels in Odoo.\n" " " msgstr "" +"\n" +"Github'u Odoo Tartışmasına Entegre Edin.\n" +"\n" +"Bu Modül, tüm gönderiyi entegre eder, ve istekleri Odoo'daki kanallara çeker." #. module: base #: model:ir.module.module,description:base.module_google_drive @@ -2124,6 +2666,9 @@ msgid "" "This module allows you to integrate google documents to any of your Odoo record quickly and easily using OAuth 2.0 for Installed Applications,\n" "You can configure your google Authorization Code from Settings > Configuration > General Settings by clicking on \"Generate Google Authorization Code\"\n" msgstr "" +"\n" +"Odoo kayıtlarına Google dokümanlarını entegre edin.\n" +"Bu modül, Google Dokümanlarını Odoo kaydınızın herhangi birisine, Yüklü Uygulamalar için OAuth 2.0'ı kullanarak hızlı ve kolay bir şekilde entegre etmenizi sağlar. Google Yetkilendirme Kodunuzu \"Google Yetkilendirme Kodu Oluştur\" a tıklayarak Ayarlar> Yapılandırma> Genel Ayarlar'dan yapılandırabilirsiniz.\n" #. module: base #: model:ir.module.module,description:base.module_account_invoicing @@ -2136,6 +2681,11 @@ msgid "" "You could use this simplified accounting in case you work with an (external) account to keep your books, and you still want to keep track of payments. This module also offers you an easy method of registering payments, without having to encode complete abstracts of account.\n" " " msgstr "" +"\n" +"Faturalama & Ödemeler\n" +"Odoo'daki özel ve kullanımı kolay Faturalama sistemi, muhasebeciniz olmasa bile, muhasebenizi takip etmenizi sağlar. Satıcılarınızı ve müşterilerinizi takip etmenin kolay bir yolunu sunar.\n" +"\n" +"Defterlerinizi saklamak için bir (harici) hesapla çalışmanız ve hala ödemelerinizi takip etmek istiyorsanız, bu basitleştirilmiş muhasebe yöntemini kullanabilirsiniz. Bu modül aynı zamanda, tüm hesap özetlerini kodlamak zorunda kalmadan ödemeleri kaydetmenin kolay bir yöntemini sunar." #. module: base #: model:ir.module.module,description:base.module_stock_landed_costs @@ -2146,6 +2696,10 @@ msgid "" "This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.\n" " " msgstr "" +"\n" +"Maliyet Yüklemeleri Yönetimi\n" +"\n" +"Bu modül, toplamalarda ekstra maliyetler eklemenize ve stok değerlemelerinizde hesaba katılabilmeleri için bu maliyetlerin stok hamleleri arasında bölünmesine karar vermenize olanak tanır." #. module: base #: model:ir.module.module,description:base.module_website_crm_score @@ -2160,6 +2714,13 @@ msgid "" " - Assign lead to salesteams: define your own filters and sort automatically your leads by saleteam.\n" " - Assign lead to salesmen: define filter by saleman and dispatch automatically your leads to the right saleman.\n" msgstr "" +"\n" +"Lider Puanlaması\n" +"\n" +"Bu modül size şunlar için izin verir..\n" +"- Web sitenizde belirli sayfa görüntülemelerini izlemenize\n" +"- Müşteri adayınıza skor atama: Müşteri adayınızı otomatik olarak sıralayın ve ilk önce daha önemli olanı düşünün\n" +"- Müşteri adaylarınızı satış personellerine atayın: satış personeli filtresini tanımlayın ve müşteri adaylarınızı otomatik olarak doğru satış personeline gönderin.\n" #. module: base #: model:ir.module.module,description:base.module_crm_project @@ -2171,6 +2732,10 @@ msgid "" "Link module to map leads to tasks\n" " " msgstr "" +"\n" +"Görevlere Liderlik Yap\n" +"\n" +"Bağlantı modülü haritaya götürür" #. module: base #: model:ir.module.module,description:base.module_board @@ -2203,6 +2768,10 @@ msgid "" "\n" " " msgstr "" +"\n" +"Canlı Sohbet Desteği\n" +"Mevcut sunucuyla iletişim kuracak ve çeşitli canlı sohbet operatörleri arasında ziyaretçi isteği gönderecek herhangi bir web sayfasında anlık mesajlaşma widget'ları bırakılmasına izin verin.\n" +"Müşterilerinize bu konuşmalarla yardımcı olun ve onları geri bildirimlerini analiz edin." #. module: base #: model:ir.module.module,description:base.module_mrp_maintenance @@ -2216,6 +2785,14 @@ msgid "" "* Equipments related to workcenters\n" "* MTBF, MTTR, ...\n" msgstr "" +"\n" +"MRP içinde Bakım\n" +"\n" +"* Engelleyici ve düzeltici bakım\n" +"* Bakım ihtiyacınızın farklı aşamalarını tanımlayın\n" +"* Bakım ihtiyacınızı planlayın (tekrarlayan önleyici)\n" +"* İşyeri ekipmanları\n" +"* MTBF, MTTR,..\n" #. module: base #: model:ir.module.module,description:base.module_account_3way_match @@ -2242,6 +2819,21 @@ msgid "" " - Exception (Received and invoiced quantities differ)\n" " " msgstr "" +"\n" +"Tedarikçi faturalarında 3 yönlü eşleştirmeyi yönetin.\n" +"\n" +"\n" +"İmalat sanayinde, insanlar genellikle satın almadan önce satıcı faturalarını alırlar, ancak mallar teslim edilene kadar faturayı ödemek istemezler.\n" +"\n" +"Bu durumun çözümü, satıcı faturanızı (sipariş edilen miktarlara göre) ürünü aldığınız zaman oluşturmaktır, ancak sadece alınan miktarlar (satın alma sipariş satırlarında) kayıtlı satıcı faturasıyla eşleştiğinde faturayı ödemeniz gerekir.\n" +"\n" +"Bu modül, her bir satıcı faturasının ödenip ödenmeyeceğini belirten bir \"ödeme serbestliği\" mekanizmasını sunar.\n" +"\n" +"Her satıcı faturası aşağıdaki üç durumdan birini alır:\n" +"\n" +" - Evet (Fatura ödenebilir)\n" +" - Hayır (Fatura ödenemez, henüz bir şey teslim edilmedi)\n" +" - İstisna (Alınan ve faturalanan miktarlar farklı)" #. module: base #: model:ir.module.module,description:base.module_stock_dropshipping @@ -2260,6 +2852,11 @@ msgid "" "internal transfer document is needed.\n" "\n" msgstr "" +"\n" +"Transit satış siparişlerini yönetin\n" +"\n" +"Bu modül, Transit satış ürünlerinin ve siparişlerinin yapılandırılmasına izin veren bir tedarik güzergahının yanı sıra önceden yapılandırılmış bir transit satış işletim türünü de ekler.\n" +"Transit satış kullanıldığında, mallar tedarikçilerden depoya gitmeden, doğrudan tedarikçiden müşterilere (doğrudan teslimat) aktarılır.\n" #. module: base #: model:ir.module.module,description:base.module_hr_expense @@ -2282,6 +2879,19 @@ msgid "" "This module also uses analytic accounting and is compatible with the invoice on timesheet module so that you are able to automatically re-invoice your customers' expenses if your work by project.\n" " " msgstr "" +"\n" +"Personel Giderlerini Yönetin\n" +"\n" +"Bu uygulama personellerinizin günlük giderlerinizi yönetmenize izin verir. Uygulama size personellerinizin ödeme notlarına erişimi hakkı ve size o notu onaylayıp, reddetme hakkı verir. Onaylamadan sonra, personel için bir fatura oluşturur.\n" +"Personel kendi harcamalarını kodlayabilir ve doğrulama akışı yöneticinin onayından sonra otomatik olarak muhasebeleşir.\n" +"\n" +"Bu akış şu şekilde uygulanır:\n" +"*Taslak gider\n" +"* Personelden, yöneticisine gönderilir.\n" +"* Yönetici tarafından kabul edilir.\n" +"* Muhasebeci onayından sonra, muhasebe girişi yapılır.\n" +"\n" +"Bu modül ayrıca analitik muhasebeyi kullanır ve zaman çizelgesi modülü üzerindeki fatura ile uyumludur, böylece projenize göre işiniz varsa müşterilerinizin masraflarını otomatik olarak yeniden faturalandırabilirsiniz." #. module: base #: model:ir.module.module,description:base.module_hr_holidays @@ -2340,6 +2950,34 @@ msgid "" "* Monthly Turnover (Graph)\n" " " msgstr "" +"\n" +"Satış taleplerini ve siparişlerini yönetin\n" +"\n" +"Bu uygulama, tüm satış siparişlerini ve geçmişini takip ederek satış hedeflerinizi etkili ve verimli bir şekilde yönetmenizi sağlar.\n" +"\n" +"O, tüm satış iş akışı ile baş eder:\n" +"\n" +"Teklif -> Satış Siparişi -> Fatura\n" +"\n" +"Tercihler ( sadece Depo Yönetimi kurulu ise)\n" +"\n" +"Depo Yönetimini yüklediyseniz, takip eden tercihleri kullanabilirsiniz:\n" +"\n" +"* Sevkıyat: Tek seferde yada parçalı teslimat seçimi.\n" +"* Faturalama: Faturalarınız nasıl ödeneceğini seçin.\n" +"* Incoterm: Uluslararası Ticari şartlar\n" +"\n" +"Esnek faturalama yöntemleri seçebilirsiniz.\n" +"\n" +"Talep üzerine: Fatura, ihtiyacınız olduğunda, Satış Siparişlerinden oluşturulur.\n" +"Teslimat Emrinde: Faturalar transferden oluşturulur (teslimat)\n" +"Teslimat Öncesi: Bir taslak fatura oluşturulur ve teslimattan önce ödenmesi gerekir.\n" +"\n" +"Bu modülle birlikte satış siparişlerinizi ve fatura raporlarınızı, kategorilerle, ara toplamlarla ya da kırılımlarla özelleştirebilirsiniz.\n" +"\n" +"Satış yönetim paneli şunları içerecektir,\n" +"* Taleplerim\n" +"* Aylık Kayıplarım (Grafik)" #. module: base #: model:ir.module.module,description:base.module_sale_stock @@ -2362,6 +3000,24 @@ msgid "" "* *On Delivery Order*: Invoices are generated from picking (delivery)\n" "* *Before Delivery*: A Draft invoice is created and must be paid before delivery\n" msgstr "" +"\n" +"Satış taleplerini ve siparişlerini yönetin\n" +"\n" +"Bu modül satış ve depo yönetimi uygulamaları arasında bir bağlantı sağlar.\n" +"\n" +"Tercihler\n" +"\n" +"\n" +"* Sevkıyat: Tek seferde yada parçalı teslimat seçimi.\n" +"* Faturalama: Faturalarınız nasıl ödeneceğini seçin.\n" +"* Incoterm: Uluslararası Ticari şartlar\n" +"\n" +"Esnek faturalama yöntemleri seçebilirsiniz.\n" +"\n" +"Talep üzerine: Fatura, ihtiyacınız olduğunda, Satış Siparişlerinden oluşturulur.\n" +"Teslimat Emrinde: Faturalar transferden oluşturulur (teslimat)\n" +"Teslimat Öncesi: Bir taslak fatura oluşturulur ve teslimattan önce ödenmesi gerekir.\n" +"\n" #. module: base #: model:ir.module.module,description:base.module_mass_mailing_event @@ -2373,6 +3029,10 @@ msgid "" "Bridge module adding UX requirements to ease mass mailing of event attendees.\n" " " msgstr "" +"\n" +"Toplu mail etkinliği katılımcıları\n" +"\n" +"Etkinlik katılımcılarının toplu e-postalarını kolaylaştırmak için UX gereksinimlerini ekleyen köprü modülü." #. module: base #: model:ir.module.module,description:base.module_mass_mailing_event_track @@ -2384,6 +3044,9 @@ msgid "" "Bridge module adding UX requirements to ease mass mailing of event track speakers.\n" " " msgstr "" +"\n" +"Toplu mail etkinliği izleme konuşmacıları\n" +"Olay izleme konuşmacılarının toplu postalanmasını kolaylaştırmak için UX gereksinimlerini ekleyen köprü modülü." #. module: base #: model:ir.module.module,description:base.module_mrp_mps @@ -2403,6 +3066,16 @@ msgid "" "safety stock, min/max to supply and to manually override the amount you will\n" "procure.\n" msgstr "" +"\n" +"Ana Üretim Çizelgesi\n" +"\n" +"Bazen yalnızca daha sonra oluşturulacak üretim siparişlerinin bileşenleri için satınalma siparişlerini oluşturmanız gerekir.\n" +"Ya da sadece satış siparişlerini alacağınız üretim siparişleri için.\n" +"Çözüm, satış tahminlerinizi tahmin etmek ve zaten bazı üretim siparişleri veya satın alma siparişleri oluşturacağınızı temel almaktır.\n" +"\n" +"Rapora eklemek istediğiniz ürünleri seçmeniz gerekiyor\n" +"Rapor için dönem seçebilirsiniz: gün, hafta, ay,...\n" +"Ayrıca, tedarik edilecek olan stok miktarını, min / max değerini tanımlamak ve tedarik edeceğiniz miktarı manuel olarak geçersiz kılmak da mümkündür.\n" #. module: base #: model:ir.module.module,description:base.module_l10n_mx @@ -2427,6 +3100,21 @@ msgid "" ".. _SAT: http://www.sat.gob.mx/\n" " " msgstr "" +"\n" +"Meksika için en düşük muhasebe yapılandırması.\n" +"\n" +"Bu Hesap Planı, Odoo'nun muhasebe özelliğini kullanabilmesi için minimum bir tekliftir.\n" +"\n" +"Bu, MX için tüm yerelleştirme gibi görünmüyor. Meksika'daki yerelleştirmede 0'dan başlamak için gereken en az veri.\n" +"\n" +"Bu modüller ve içeriği openerp-mexico ekibi tarafından sık sık güncellenmektedir.\n" +"\n" +"Bu modülle şunlara sahip olacaksınız:\n" +"\n" +"- Üretim ortamlarında test edilen minimum hesap çizelgesi.\n" +"- SAT_ gereksinimlerine uymak için en az vergi grafiği.\n" +"\n" +".. _SAT: http://www.sat.gob.mx/" #. module: base #: model:ir.module.module,description:base.module_analytic @@ -2441,6 +3129,12 @@ msgid "" "that have no counterpart in the general financial accounts.\n" " " msgstr "" +"\n" +"Analitik muhasebe nesnesini tanımlamak için modül.\n" +"\n" +"Odoo'da, analitik hesaplar genel hesaplarla ilişkilendirilir, ancak tamamen bağımsız olarak ele alınır.\n" +"\n" +"Böylece, genel finansal hesaplarda muadili olmayan farklı analitik işlemler girebilirsiniz." #. module: base #: model:ir.module.module,description:base.module_resource @@ -2454,6 +3148,10 @@ msgid "" "associated to every resource. It also manages the leaves of every resource.\n" " " msgstr "" +"\n" +"Kaynak Yönetimi Yönetimi\n" +"\n" +"Bir kaynak planlanabilen bir şeyi temsil eder (bir siparişte geliştirici veya imalat siparişleri üzerinde bir iş merkezi). Bu modül, her kaynağa bağlı bir kaynak takvimi yönetir.Ayrıca her kaynağın izinlerini yönetir." #. module: base #: model:ir.module.module,description:base.module_website_mail @@ -2462,6 +3160,9 @@ msgid "" "Module holding mail improvements for website.\n" "It is responsible of comments moderation for published documents (forum, slides, blog, ...)\n" msgstr "" +"\n" +"Websitesi için mail geliştirmelerini tutan modül.\n" +"Yayınlanmış dokümanlar için yorumların moderatörlüğünden sorumludur (forum, slaytlar, blog, ...)\n" #. module: base #: model:ir.module.module,description:base.module_account_reports_followup @@ -2493,6 +3194,10 @@ msgid "" "Improve the import of bank statement feature to support the SEPA recommanded Cash Management format (CAMT.053).\n" " " msgstr "" +"\n" +"Module to import CAMT bank statements.\n" +"\n" +"SEPA tarafından önerilen Nakit Yönetimi formatını (CAMT.053) desteklemek için banka ekstresi özelliğini içe aktarın." #. module: base #: model:ir.module.module,description:base.module_l10n_be_coda @@ -17365,7 +18070,7 @@ msgstr "Sierra Leone" #. module: base #: model:ir.module.module,shortdesc:base.module_website_sign msgid "Sign" -msgstr "" +msgstr "İmzala" #. module: base #: model:ir.model.fields,field_description:base.field_res_users__signature diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 38f49b255a0..616a5b93f72 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -177,7 +177,9 @@ class Partner(models.Model): [('contact', 'Contact'), ('invoice', 'Invoice address'), ('delivery', 'Shipping address'), - ('other', 'Other address')], string='Address Type', + ('other', 'Other address'), + ("private", "Private Address"), + ], string='Address Type', default='contact', help="Used to select automatically the right address according to the context in sales and purchases documents.") street = fields.Char() diff --git a/odoo/addons/base/security/base_security.xml b/odoo/addons/base/security/base_security.xml index 8d03802aadf..f3bf2f908dd 100644 --- a/odoo/addons/base/security/base_security.xml +++ b/odoo/addons/base/security/base_security.xml @@ -1,5 +1,9 @@ <?xml version="1.0"?> <odoo> + <record id="group_private_addresses" model="res.groups"> + <field name="name">Access to Private Addresses</field> + </record> + <data noupdate="1"> <record model="ir.rule" id="res_users_log_rule"> <field name="name">res.users.log per user</field> @@ -69,6 +73,37 @@ <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> </record> + <!-- Security restriction for private addresses --> + <record id="res_partner_rule_private_employee" model="ir.rule"> + <field name="name">res.partner.rule.private.employee</field> + <field name="model_id" ref="base.model_res_partner"/> + <field name="domain_force"> + [('type', '!=', 'private')] + </field> + <field name="groups" eval="[ + (4, ref('base.group_user')), + ]"/> + <field name="perm_read" eval="True"/> + <field name="perm_write" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="False"/> + </record> + <!-- Relex previous rule for group_private_addresses --> + <record id="res_partner_rule_private_group" model="ir.rule"> + <field name="name">res.partner.rule.private.group</field> + <field name="model_id" ref="base.model_res_partner"/> + <field name="domain_force"> + [('type', '=', 'private')] + </field> + <field name="groups" eval="[ + (4, ref('base.group_private_addresses')) + ]"/> + <field name="perm_read" eval="True"/> + <field name="perm_write" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="False"/> + </record> + <!-- Restrict modifications on ir.filters to owner only --> <record id="ir_filters_admin_all_rights_rule" model="ir.rule"> <field name="name">ir.filters.admin.all.rights</field> diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index a878b8c2994..28ad85b892a 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -391,6 +391,50 @@ </field> </record> + <!-- Special restricted view for private address, with limited "named" info that + can be traced back to the employee --> + <record id="res_partner_view_form_private" model="ir.ui.view"> + <field name="name">res.partner.view.form.private</field> + <field name="model">res.partner</field> + <field name="priority" eval="300"/> + <field name="arch" type="xml"> + <form string="Private Address Form"> + <sheet> + <field name="type" invisible="1"/> + <label for="name" class="oe_editonly"/> + <field name="name" required="0"/> + <group> + <group> + <label for="street" string="Address"/> + <div> + <div class="o_address_format" name="div_address"> + <field name="street" placeholder="Street..." class="o_address_street"/> + <field name="street2" placeholder="Street 2..." class="o_address_street"/> + <field name="city" placeholder="City" class="o_address_city"/> + <field name="state_id" class="o_address_state" placeholder="State" options='{"no_open": True}' context="{'country_id': country_id, 'zip': zip}"/> + <field name="zip" placeholder="ZIP" class="o_address_zip"/> + <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/> + </div> + </div> + </group> + <group> + <field name="phone" widget="phone"/> + <field name="mobile" widget="phone"/> + <field name="email"/> + </group> + </group> + <group string="Bank Accounts"> + <field name="bank_ids"> + <tree editable="bottom"> + <field name="acc_number"/> + </tree> + </field> + </group> + </sheet> + </form> + </field> + </record> + <record id="view_res_partner_filter" model="ir.ui.view"> <field name="name">res.partner.select</field> <field name="model">res.partner</field> diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml index 98d586d3d1f..6b36b8e5b73 100644 --- a/odoo/addons/base/views/res_users_views.xml +++ b/odoo/addons/base/views/res_users_views.xml @@ -236,7 +236,7 @@ <t t-name="kanban-box"> <div t-attf-class="oe_kanban_global_click"> <div class="o_kanban_image"> - <img t-att-src="kanban_image('res.users', 'image_medium', record.id.value)"/> + <img t-att-src="kanban_image('res.users', 'image_medium', record.id.raw_value)"/> </div> <div class="oe_kanban_details"> <ul> diff --git a/odoo/http.py b/odoo/http.py index e06f345964d..f984bcb44df 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -166,7 +166,7 @@ def redirect_with_hash(url, code=303): # FIXME: decide whether urls should be bytes or text, apparently # addons/website/controllers/main.py:91 calls this with a bytes url # but addons/web/controllers/main.py:481 uses text... (blows up on login) - url = pycompat.to_text(url) + url = pycompat.to_text(url).strip() if urls.url_parse(url, scheme='http').scheme not in ('http', 'https'): url = u'http://' + url url = url.replace("'", "%27").replace("<", "%3C") diff --git a/odoo/service/server.py b/odoo/service/server.py index 9e2b53d284b..d246a3d80f1 100644 --- a/odoo/service/server.py +++ b/odoo/service/server.py @@ -107,9 +107,11 @@ class ThreadedWSGIServerReloadable(LoggingBaseWSGIServerMixIn, werkzeug.serving. if os.environ.get('LISTEN_FDS') == '1' and os.environ.get('LISTEN_PID') == str(os.getpid()): self.reload_socket = True self.socket = socket.fromfd(SD_LISTEN_FDS_START, socket.AF_INET, socket.SOCK_STREAM) + _logger.info('HTTP service (werkzeug) running through socket activation') else: self.reload_socket = False super(ThreadedWSGIServerReloadable, self).server_bind() + _logger.info('HTTP service (werkzeug) running on %s:%s', self.server_name, self.server_port) def server_activate(self): if not self.reload_socket: @@ -203,6 +205,9 @@ class ThreadedServer(CommonServer): os._exit(0) # interrupt run() to start shutdown raise KeyboardInterrupt() + elif sig == signal.SIGXCPU: + sys.stderr.write("CPU time limit exceeded! Shutting down immediately\n") + os._exit(0) elif sig == signal.SIGHUP: # restart on kill -HUP odoo.phoenix = True @@ -253,7 +258,6 @@ class ThreadedServer(CommonServer): t = threading.Thread(target=self.http_thread, name="odoo.service.httpd") t.setDaemon(True) t.start() - _logger.info('HTTP service (werkzeug) running on %s:%s', self.interface, self.port) def start(self, stop=False): _logger.debug("Setting signal handlers") @@ -262,6 +266,7 @@ class ThreadedServer(CommonServer): signal.signal(signal.SIGTERM, self.signal_handler) signal.signal(signal.SIGCHLD, self.signal_handler) signal.signal(signal.SIGHUP, self.signal_handler) + signal.signal(signal.SIGXCPU, self.signal_handler) signal.signal(signal.SIGQUIT, dumpstacks) signal.signal(signal.SIGUSR1, log_ormcache_stats) elif os.name == 'nt': @@ -369,7 +374,7 @@ class GeventServer(CommonServer): signal.signal(signal.SIGQUIT, dumpstacks) signal.signal(signal.SIGUSR1, log_ormcache_stats) gevent.spawn(self.watchdog) - + self.httpd = WSGIServer((self.interface, self.port), self.app) _logger.info('Evented Service (longpolling) running on %s:%s', self.interface, self.port) try: diff --git a/odoo/tools/mail.py b/odoo/tools/mail.py index 31c42ebd8c9..d3291e648fb 100644 --- a/odoo/tools/mail.py +++ b/odoo/tools/mail.py @@ -10,7 +10,7 @@ import socket import threading import time -from email.header import decode_header +from email.header import decode_header, Header from email.utils import getaddresses, formataddr from lxml import etree @@ -521,11 +521,14 @@ def decode_smtp_header(smtp_header): text. email.header decode_header method return a decoded string and its charset for each decoded par of the header. This method unicodes the decoded header and join them in a complete string. """ + if isinstance(smtp_header, Header): + smtp_header = ustr(smtp_header) if smtp_header: text = decode_header(smtp_header.replace('\r', '')) # The joining space will not be needed as of Python 3.3 - # See https://hg.python.org/cpython/rev/8c03fe231877 - return ' '.join([ustr(x[0], x[1]) for x in text]) + # See https://github.com/python/cpython/commit/07ea53cb218812404cdbde820647ce6e4b2d0f8e + sep = ' ' if pycompat.PY2 else '' + return sep.join([ustr(x[0], x[1]) for x in text]) return u'' # was mail_thread.decode_header() |
