summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-07-29 14:10:30 +0200
committerChristophe Simonis <chs@odoo.com>2019-07-29 14:10:30 +0200
commitd5e1fd16b4fd796cc25b2b2d694dadb375110ce7 (patch)
tree35d130b4161985cd9ca3071a59980b52e8401be5 /addons
parentae71f95371b4a5c99c10a23e3553c5badc45a1ac (diff)
parentcda4f3c308ca233aead81f5ae97d250b5b7bf82f (diff)
[MERGE] forward port branch saas-12.4 up to cda4f3c308c
Diffstat (limited to 'addons')
-rw-r--r--addons/account/i18n/cs.po41
-rw-r--r--addons/account/i18n/it.po4
-rw-r--r--addons/account/i18n/ja.po4
-rw-r--r--addons/account/models/account_bank_statement.py6
-rw-r--r--addons/account/models/account_move.py25
-rw-r--r--addons/account/static/src/js/reconciliation/reconciliation_model.js75
-rw-r--r--addons/account/static/tests/reconciliation_tests.js65
-rw-r--r--addons/account/tests/test_account_move_in_invoice.py8
-rw-r--r--addons/account/tests/test_account_move_out_invoice.py6
-rw-r--r--addons/account/wizard/account_invoice_send.py17
-rw-r--r--addons/account/wizard/account_invoice_send_views.xml1
-rw-r--r--addons/account/wizard/account_move_reversal.py3
-rw-r--r--addons/account_bank_statement_import/i18n/cs.po3
-rw-r--r--addons/account_payment/views/account_portal_templates.xml2
-rw-r--r--addons/base_vat/models/res_partner.py2
-rw-r--r--addons/board/i18n/ar.po25
-rw-r--r--addons/contacts/i18n/ar.po20
-rw-r--r--addons/crm/i18n/km.po12
-rw-r--r--addons/crm/i18n/vi.po2
-rw-r--r--addons/crm_iap_lead_website/models/crm_reveal_rule.py12
-rw-r--r--addons/delivery/__manifest__.py1
-rw-r--r--addons/delivery/i18n/km.po2
-rw-r--r--addons/delivery/models/sale_order.py2
-rw-r--r--addons/delivery/static/src/js/delivery_translations.js16
-rw-r--r--addons/delivery/views/assets.xml10
-rw-r--r--addons/digest/i18n/ar.po89
-rw-r--r--addons/digest/i18n/km.po2
-rw-r--r--addons/event/i18n/km.po2
-rw-r--r--addons/event_sale/i18n/ar.po68
-rw-r--r--addons/fetchmail/i18n/ar.po79
-rw-r--r--addons/fleet/i18n/km.po4
-rw-r--r--addons/fleet/views/fleet_vehicle_cost_views.xml2
-rw-r--r--addons/gamification/i18n/cs.po15
-rw-r--r--addons/gamification/models/gamification_karma_rank.py15
-rw-r--r--addons/gamification/models/res_users.py84
-rw-r--r--addons/gamification/tests/__init__.py1
-rw-r--r--addons/gamification/tests/test_recompute_rank.py128
-rw-r--r--addons/google_calendar/i18n/ar.po47
-rw-r--r--addons/google_drive/i18n/ar.po54
-rw-r--r--addons/google_drive/i18n/km.po2
-rw-r--r--addons/hr/i18n/km.po2
-rw-r--r--addons/hr_attendance/i18n/cs.po2
-rw-r--r--addons/hr_expense/i18n/km.po15
-rw-r--r--addons/hr_expense/i18n/vi.po2
-rw-r--r--addons/hr_expense/models/hr_expense.py6
-rw-r--r--addons/hr_expense_check/i18n/ar.po13
-rw-r--r--addons/hr_gamification/i18n/ar.po51
-rw-r--r--addons/hr_gamification/i18n/cs.po2
-rw-r--r--addons/hr_holidays/i18n/km.po4
-rw-r--r--addons/hr_recruitment/i18n/cs.po2
-rw-r--r--addons/hr_recruitment/i18n/km.po2
-rw-r--r--addons/hr_recruitment/i18n/vi.po2
-rw-r--r--addons/hr_timesheet_attendance/i18n/ar.po20
-rw-r--r--addons/iap/i18n/ar.po43
-rw-r--r--addons/iap/i18n/cs.po8
-rw-r--r--addons/im_livechat/i18n/km.po4
-rw-r--r--addons/im_livechat_mail_bot/i18n/cs.po2
-rw-r--r--addons/im_support/i18n/ar.po8
-rw-r--r--addons/l10n_ae/data/account_tax_template_data.xml14
-rw-r--r--addons/l10n_ch/models/account_invoice.py2
-rw-r--r--addons/l10n_it_edi/data/account_invoice_demo.xml1
-rw-r--r--addons/l10n_multilang/i18n/km.po6
-rw-r--r--addons/l10n_za/__manifest__.py1
-rw-r--r--addons/lunch/i18n/km.po5
-rw-r--r--addons/mail/i18n/cs.po4
-rw-r--r--addons/mail/i18n/km.po83
-rw-r--r--addons/mail/i18n/vi.po2
-rw-r--r--addons/mail/models/mail_thread.py4
-rw-r--r--addons/mail/static/src/js/activity.js7
-rw-r--r--addons/mail/static/src/js/models/threads/dm_chat.js13
-rw-r--r--addons/mail/static/src/js/models/threads/document_thread.js4
-rw-r--r--addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js13
-rw-r--r--addons/mail/static/src/js/services/mail_document_thread_manager.js17
-rw-r--r--addons/mail/static/src/js/services/mail_notification_manager.js3
-rw-r--r--addons/mail/static/src/js/services/mail_status_manager.js32
-rw-r--r--addons/mail/static/src/js/services/mail_window_manager.js13
-rw-r--r--addons/mail/static/src/js/thread_windows/thread_window.js18
-rw-r--r--addons/mail/static/src/scss/abstract_thread_window.scss7
-rw-r--r--addons/mail/static/src/scss/discuss.scss3
-rw-r--r--addons/mail/static/src/xml/abstract_thread_window.xml2
-rw-r--r--addons/mail/static/src/xml/thread_window.xml19
-rw-r--r--addons/mail/static/tests/chatter_tests.js69
-rw-r--r--addons/mail/static/tests/document_thread_window_tests.js2
-rw-r--r--addons/mail/static/tests/thread_window/basic_thread_window_tests.js113
-rw-r--r--addons/mail/wizard/mail_compose_message.py1
-rw-r--r--addons/mail_bot/i18n/cs.po2
-rw-r--r--addons/maintenance/i18n/km.po15
-rw-r--r--addons/mass_mailing/i18n/km.po6
-rw-r--r--addons/mass_mailing/i18n/vi.po2
-rw-r--r--addons/mass_mailing_crm/i18n/ar.po22
-rw-r--r--addons/mass_mailing_event/i18n/ar.po11
-rw-r--r--addons/mrp/i18n/km.po10
-rw-r--r--addons/mrp_account/i18n/ar.po15
-rw-r--r--addons/note/i18n/km.po4
-rw-r--r--addons/pad/i18n/km.po2
-rw-r--r--addons/pad_project/i18n/ar.po19
-rw-r--r--addons/partner_autocomplete/i18n/ar.po50
-rw-r--r--addons/payment/i18n/cs.po33
-rw-r--r--addons/payment/i18n/km.po3
-rw-r--r--addons/payment/i18n/vi.po2
-rw-r--r--addons/payment/static/src/js/payment_translations.js10
-rw-r--r--addons/payment/views/assets.xml7
-rw-r--r--addons/payment/views/res_partner_views.xml3
-rw-r--r--addons/payment_adyen/i18n/ar.po53
-rw-r--r--addons/payment_authorize/models/authorize_request.py2
-rw-r--r--addons/payment_authorize/models/payment.py30
-rw-r--r--addons/payment_authorize/views/payment_views.xml1
-rw-r--r--addons/payment_buckaroo/i18n/ar.po44
-rw-r--r--addons/payment_ogone/i18n/ar.po56
-rw-r--r--addons/payment_payumoney/i18n/ar.po45
-rw-r--r--addons/payment_sips/i18n/ar.po57
-rw-r--r--addons/payment_transfer/i18n/ar.po22
-rw-r--r--addons/phone_validation/i18n/ar.po16
-rw-r--r--addons/point_of_sale/i18n/km.po41
-rw-r--r--addons/point_of_sale/models/pos_config.py2
-rw-r--r--addons/point_of_sale/static/src/css/customer_facing_display.css86
-rw-r--r--addons/point_of_sale/views/pos_templates.xml2
-rw-r--r--addons/portal/controllers/mail.py10
-rw-r--r--addons/portal/i18n/km.po10
-rw-r--r--addons/portal/static/src/scss/portal.scss10
-rw-r--r--addons/pos_discount/i18n/ar.po17
-rw-r--r--addons/pos_restaurant/i18n/km.po6
-rw-r--r--addons/pos_sale/i18n/km.po4
-rw-r--r--addons/product/i18n/km.po2
-rw-r--r--addons/product/i18n/vi.po2
-rw-r--r--addons/product/models/product_template.py4
-rw-r--r--addons/product/tests/test_variants.py283
-rw-r--r--addons/product_expiry/i18n/ar.po49
-rw-r--r--addons/product_expiry/i18n/km.po2
-rw-r--r--addons/product_margin/i18n/km.po2
-rw-r--r--addons/product_margin/models/product_product.py10
-rw-r--r--addons/project/i18n/km.po23
-rw-r--r--addons/project/i18n/vi.po4
-rw-r--r--addons/project/models/project.py2
-rw-r--r--addons/project_timesheet_holidays/i18n/ar.po37
-rw-r--r--addons/purchase/i18n/cs.po2
-rw-r--r--addons/purchase/i18n/ja.po2
-rw-r--r--addons/purchase/i18n/km.po20
-rw-r--r--addons/purchase/views/purchase_views.xml2
-rw-r--r--addons/purchase_requisition/i18n/km.po2
-rw-r--r--addons/repair/i18n/ar.po232
-rw-r--r--addons/repair/i18n/cs.po2
-rw-r--r--addons/repair/i18n/it.po17
-rw-r--r--addons/repair/i18n/km.po10
-rw-r--r--addons/sale/i18n/ja.po8
-rw-r--r--addons/sale/i18n/km.po48
-rw-r--r--addons/sale/i18n/vi.po2
-rw-r--r--addons/sale/models/sale.py5
-rw-r--r--addons/sale/security/sale_security.xml15
-rw-r--r--addons/sale/wizard/sale_make_invoice_advance.py2
-rw-r--r--addons/sale_crm/i18n/km.po2
-rw-r--r--addons/sale_expense/i18n/km.po2
-rw-r--r--addons/sale_management/i18n/ar.po96
-rw-r--r--addons/sale_management/i18n/vi.po6
-rw-r--r--addons/sale_management/models/sale_order.py6
-rw-r--r--addons/sale_management/views/sale_order_template_views.xml6
-rw-r--r--addons/sale_quotation_builder/i18n/cs.po2
-rw-r--r--addons/sale_stock/i18n/cs.po5
-rw-r--r--addons/sale_stock/i18n/km.po2
-rw-r--r--addons/sale_timesheet/i18n/cs.po5
-rw-r--r--addons/sale_timesheet/i18n/km.po6
-rw-r--r--addons/sales_team/i18n/km.po6
-rw-r--r--addons/sms/i18n/km.po2
-rw-r--r--addons/snailmail_account/tests/test_pingen_send.py25
-rw-r--r--addons/social_media/i18n/ar.po9
-rw-r--r--addons/stock/i18n/km.po10
-rw-r--r--addons/stock/i18n/sk.po4
-rw-r--r--addons/stock/i18n/vi.po2
-rw-r--r--addons/stock/models/product.py23
-rw-r--r--addons/stock/models/stock_move.py17
-rw-r--r--addons/stock/models/stock_move_line.py7
-rw-r--r--addons/stock/report/picking_templates.xml6
-rw-r--r--addons/stock/tests/test_move2.py21
-rw-r--r--addons/stock_account/tests/test_stockvaluation.py50
-rw-r--r--addons/stock_dropshipping/i18n/ar.po4
-rw-r--r--addons/survey/i18n/vi.po4
-rw-r--r--addons/theme_bootswatch/i18n/ar.po8
-rw-r--r--addons/transifex/i18n/ar.po10
-rw-r--r--addons/uom/i18n/ar.po11
-rw-r--r--addons/utm/i18n/ar.po4
-rw-r--r--addons/web/i18n/km.po10
-rw-r--r--addons/web/static/src/js/chrome/action_manager_act_window.js10
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js9
-rw-r--r--addons/web/static/src/js/views/form/form_renderer.js7
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_column_progressbar.js2
-rw-r--r--addons/web/static/src/js/views/list/list_editable_renderer.js66
-rw-r--r--addons/web/static/src/js/views/list/list_model.js13
-rw-r--r--addons/web/static/src/js/views/list/list_renderer.js20
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_model.js1
-rw-r--r--addons/web/static/src/js/views/view_dialogs.js18
-rw-r--r--addons/web/static/src/scss/layout_standard.scss3
-rw-r--r--addons/web/static/src/scss/list_view.scss18
-rw-r--r--addons/web/static/src/xml/kanban.xml2
-rw-r--r--addons/web/static/src/xml/menu.xml2
-rw-r--r--addons/web/static/tests/chrome/action_manager_tests.js35
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js12
-rw-r--r--addons/web/static/tests/views/form_tests.js59
-rw-r--r--addons/web/static/tests/views/list_tests.js135
-rw-r--r--addons/web/static/tests/views/pivot_tests.js68
-rw-r--r--addons/web_editor/i18n/km.po4
-rw-r--r--addons/web_editor/i18n/vi.po2
-rw-r--r--addons/web_editor/models/ir_ui_view.py18
-rw-r--r--addons/web_editor/static/src/js/wysiwyg/plugin/history.js6
-rw-r--r--addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js4
-rw-r--r--addons/website/i18n/cs.po2
-rw-r--r--addons/website/i18n/km.po8
-rw-r--r--addons/website/i18n/nl.po2
-rw-r--r--addons/website/i18n/vi.po2
-rw-r--r--addons/website/models/ir_ui_view.py4
-rw-r--r--addons/website/models/website_redirect.py2
-rw-r--r--addons/website/static/src/js/menu/edit.js23
-rw-r--r--addons/website/tests/test_views.py14
-rw-r--r--addons/website_blog/i18n/km.po2
-rw-r--r--addons/website_crm/i18n/km.po2
-rw-r--r--addons/website_crm_partner_assign/i18n/km.po4
-rw-r--r--addons/website_customer/i18n/vi.po2
-rw-r--r--addons/website_event/i18n/cs.po2
-rw-r--r--addons/website_event_track/i18n/ar.po12
-rw-r--r--addons/website_event_track/i18n/km.po2
-rw-r--r--addons/website_form/static/src/js/website_form.js2
-rw-r--r--addons/website_form/static/src/js/website_form_editor.js19
-rw-r--r--addons/website_gengo/i18n/ar.po58
-rw-r--r--addons/website_livechat/i18n/ar.po15
-rw-r--r--addons/website_mail/i18n/km.po2
-rw-r--r--addons/website_mass_mailing/i18n/km.po2
-rw-r--r--addons/website_partner/i18n/ar.po15
-rw-r--r--addons/website_profile/controllers/main.py1
-rw-r--r--addons/website_rating/i18n/ar.po11
-rw-r--r--addons/website_sale/controllers/main.py10
-rw-r--r--addons/website_sale/i18n/km.po10
-rw-r--r--addons/website_sale/security/website_sale.xml2
-rw-r--r--addons/website_sale/views/templates.xml1
-rw-r--r--addons/website_sale_delivery/i18n/ar.po4
-rw-r--r--addons/website_sale_stock/i18n/ar.po53
-rw-r--r--addons/website_slides/static/src/scss/slides_slide_fullscreen.scss2
-rw-r--r--addons/website_twitter/i18n/ar.po107
236 files changed, 3069 insertions, 1334 deletions
diff --git a/addons/account/i18n/cs.po b/addons/account/i18n/cs.po
index 61a1987d143..1de6c201372 100644
--- a/addons/account/i18n/cs.po
+++ b/addons/account/i18n/cs.po
@@ -2658,7 +2658,7 @@ msgstr "Šablona grafu"
#. module: account
#: model:ir.actions.act_window,name:account.open_account_charts_modules
msgid "Chart Templates"
-msgstr ""
+msgstr "Šablony grafů"
#. module: account
#: code:addons/account/models/company.py:320
@@ -4476,7 +4476,7 @@ msgstr "Filtr..."
#: model:ir.model.fields,field_description:account.field_account_analytic_line__general_account_id
#: model_terms:ir.ui.view,arch_db:account.view_account_analytic_line_filter_inherit_account
msgid "Financial Account"
-msgstr ""
+msgstr "Finanční účetnictví"
#. module: account
#: model_terms:ir.ui.view,arch_db:account.view_partner_property_form
@@ -4577,7 +4577,7 @@ msgstr "Pevná částka"
#. module: account
#: model:account.account.type,name:account.data_account_type_fixed_assets
msgid "Fixed Assets"
-msgstr ""
+msgstr "Dlouhodobý majetek"
#. module: account
#: model:ir.model.fields,help:account.field_account_reconcile_model__amount
@@ -4861,7 +4861,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_payment__has_invoices
msgid "Has Invoices"
-msgstr ""
+msgstr "Má faktury"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice__has_outstanding
@@ -4871,7 +4871,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_res_partner__has_unreconciled_entries
msgid "Has Unreconciled Entries"
-msgstr ""
+msgstr "Má nespárované položky"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_setup_bank_manual_config__qr_code_valid
@@ -4909,7 +4909,7 @@ msgstr ""
#. module: account
#: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "How total tax amount is computed in orders and invoices"
-msgstr ""
+msgstr "Jak se vypočítává celková částka daně v objednávkách a fakturách"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_abstract_payment__id
@@ -6426,6 +6426,9 @@ msgid ""
"Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n"
"Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings."
msgstr ""
+"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n"
+"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n"
+"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení."
#. module: account
#: model:ir.model.fields,help:account.field_account_abstract_payment__payment_method_id
@@ -6670,7 +6673,7 @@ msgstr ""
#. module: account
#: selection:account.cash.rounding,strategy:0
msgid "Modify tax amount"
-msgstr ""
+msgstr "Změnit výši daně"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
@@ -7108,7 +7111,7 @@ msgstr ""
#: code:addons/account/models/chart_template.py:185
#, python-format
msgid "Only administrators can load a charf of accounts"
-msgstr ""
+msgstr "Pouze správci mohou načíst graf účtů"
#. module: account
#: model:ir.model.fields,help:account.field_res_company__period_lock_date
@@ -7562,7 +7565,7 @@ msgstr "Způsob platby"
#: model_terms:ir.ui.view,arch_db:account.view_account_bank_journal_form
#: model_terms:ir.ui.view,arch_db:account.view_account_journal_form
msgid "Payment Method Types"
-msgstr ""
+msgstr "Druhy platebních metod"
#. module: account
#. openerp-web
@@ -7968,7 +7971,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_res_company__invoice_is_print
msgid "Print by default"
-msgstr ""
+msgstr "Tisk ve výchozím nastavení"
#. module: account
#: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form
@@ -7995,7 +7998,7 @@ msgstr "Kategorie výrobku"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_line__product_image
msgid "Product Image"
-msgstr ""
+msgstr "Obrázek produktu"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_report__product_qty
@@ -9132,7 +9135,7 @@ msgstr "Zdrojový dokument"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice__source_email
msgid "Source Email"
-msgstr ""
+msgstr "Zdrojový e-mail"
#. module: account
#: model:ir.model.fields,help:account.field_account_cash_rounding__strategy
@@ -9473,7 +9476,7 @@ msgstr ""
#: model:ir.model.fields,field_description:account.field_account_tax__tax_group_id
#: model:ir.model.fields,field_description:account.field_account_tax_template__tax_group_id
msgid "Tax Group"
-msgstr ""
+msgstr "Daňová skupina"
#. module: account
#. openerp-web
@@ -10793,6 +10796,8 @@ msgid ""
"Tracked values are stored in a separate model. This field allow to "
"reconstruct the tracking and to generate statistics on the model."
msgstr ""
+"Sledované hodnoty jsou uloženy v samostatném modelu. Toto pole umožňuje "
+"rekonstruovat sledování a generovat statistiky modelu."
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_send__tracking_value_ids
@@ -10858,7 +10863,7 @@ msgstr "Typ"
#. module: account
#: selection:account.cash.rounding,rounding_method:0
msgid "UP"
-msgstr ""
+msgstr "NAHORU"
#. module: account
#: code:addons/account/models/account.py:398
@@ -11357,7 +11362,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice_send__is_log
msgid "Whether the message is an internal note (comment mode only)"
-msgstr ""
+msgstr "Zda je zpráva interní poznámkou (pouze režim poznámek)"
#. module: account
#: model:ir.model.fields,help:account.field_account_journal__show_on_dashboard
@@ -11368,6 +11373,7 @@ msgstr "Zda se tento účetní deník zobrazuje na dashboardu nebo ne"
#: model:ir.model.fields,help:account.field_account_setup_bank_manual_config__new_journal_name
msgid "Will be used to name the Journal related to this bank account"
msgstr ""
+"Bude použito k pojmenování deníku týkajícího se tohoto bankovního účtu"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_common_journal_report__amount_currency
@@ -11743,6 +11749,9 @@ msgid ""
" to manage automatically the booking of accounting entries related to "
"differences between exchange rates."
msgstr ""
+"Měli byste v nastavení účetnictví nakonfigurovat „Deník pro směnný kurz“, "
+"který bude automaticky spravovat zaúčtování účetních položek souvisejících s"
+" rozdíly mezi směnnými kurzy."
#. module: account
#: code:addons/account/models/account_move.py:1626
@@ -11845,7 +11854,7 @@ msgstr ""
#. module: account
#: model_terms:ir.ui.view,arch_db:account.setup_bank_account_wizard
msgid "e.g Checking account"
-msgstr ""
+msgstr "např. Kontrola účtu"
#. module: account
#: model_terms:ir.ui.view,arch_db:account.view_account_reconcile_model_form
diff --git a/addons/account/i18n/it.po b/addons/account/i18n/it.po
index c1e4efccfbb..d35d8a69859 100644
--- a/addons/account/i18n/it.po
+++ b/addons/account/i18n/it.po
@@ -7,7 +7,7 @@
# Alessandro Camilli <alessandrocamilli@openforce.it>, 2018
# Daniele Faraglia <daniele.faraglia@gmail.com>, 2018
# Davide Corio <enlightx@gmail.com>, 2018
-# Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>, 2018
+# SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2018
# Manuela Feliciani <mfeliciani@alice.it>, 2018
# Luigi Di Naro <gigidn@gmail.com>, 2018
# Marco Calcagni <mcalcagni@dinamicheaziendali.it>, 2018
@@ -8663,7 +8663,7 @@ msgstr "Modello documento collegato"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_send__rating_ids
msgid "Related ratings"
-msgstr ""
+msgstr "Valutazioni collegate"
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice__residual_company_signed
diff --git a/addons/account/i18n/ja.po b/addons/account/i18n/ja.po
index 5d615f4f048..ed537005a33 100644
--- a/addons/account/i18n/ja.po
+++ b/addons/account/i18n/ja.po
@@ -328,6 +328,8 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Rounding Method</span>"
msgstr ""
+"<span class=\"o_form_label\">丸め方法</span>\n"
+" <span class=\"fa fa-lg fa-building-o\" title=\"ここに設定する値は会社依存。\" aria-label=\"ここに設定する値は会社依存。\" groups=\"base.group_multi_company\" role=\"img\"/>"
#. module: account
#: model_terms:ir.ui.view,arch_db:account.view_payment_term_line_form
@@ -3132,7 +3134,7 @@ msgstr ""
#. module: account
#: model_terms:ir.actions.act_window,help:account.action_invoice_tree1
msgid "Create a customer invoice"
-msgstr ""
+msgstr "顧客請求書を作成しましょう。"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py
index 0028be54c81..c4b5a113fcf 100644
--- a/addons/account/models/account_bank_statement.py
+++ b/addons/account/models/account_bank_statement.py
@@ -296,8 +296,6 @@ class AccountBankStatement(models.Model):
statements.write({'state': 'confirm', 'date_done': time.strftime("%Y-%m-%d %H:%M:%S")})
def button_journal_entries(self):
- context = dict(self._context or {})
- context['journal_id'] = self.journal_id.id
return {
'name': _('Journal Entries'),
'view_mode': 'tree,form',
@@ -305,7 +303,9 @@ class AccountBankStatement(models.Model):
'view_id': False,
'type': 'ir.actions.act_window',
'domain': [('id', 'in', self.mapped('move_line_ids').mapped('move_id').ids)],
- 'context': context,
+ 'context': {
+ 'journal_id': self.journal_id.id,
+ }
}
def button_open(self):
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
index 7fb0597aaff..eb7fccabe6c 100644
--- a/addons/account/models/account_move.py
+++ b/addons/account/models/account_move.py
@@ -7,7 +7,7 @@ from odoo.tools.misc import formatLang, format_date
from collections import OrderedDict
from datetime import date
-from itertools import groupby
+from itertools import groupby, chain
from stdnum.iso7064 import mod_97_10
from itertools import zip_longest
@@ -1210,8 +1210,11 @@ class AccountMove(models.Model):
return
self._cr.execute('''
- SELECT move.id
- FROM account_move move
+ WITH current_moves (id, name, state, company_id, journal_id, type) as ( values {} )
+ SELECT move2.id
+ FROM ( SELECT id, name, state, company_id, journal_id, type from account_move
+ UNION ALL SELECT id, name, state, company_id, journal_id, type from current_moves
+ ) move
INNER JOIN account_move move2 ON
move2.name = move.name
AND move2.company_id = move.company_id
@@ -1221,7 +1224,7 @@ class AccountMove(models.Model):
WHERE move.id IN %s
AND move.state = 'posted'
AND move2.state = 'posted'
- ''', [tuple(self.ids)])
+ '''.format(", ".join(["(%s, %s, %s, %s, %s, %s)"] * len(self))), list(chain(*self.mapped(lambda r: [r.id, r.name, r.state, r.company_id.id, r.journal_id.id, r.type]))) + [tuple(self.ids)])
res = self._cr.fetchone()
if res:
raise ValidationError(_('Posted journal entry must have an unique sequence number per company.'))
@@ -1233,18 +1236,22 @@ class AccountMove(models.Model):
return
self._cr.execute('''
- SELECT move.id
- FROM account_move move
+ WITH current_moves (id, ref, company_id, commercial_partner_id, type, invoice_date) as ( values {} )
+ SELECT move2.id
+ FROM ( SELECT id, ref, company_id, commercial_partner_id, type, invoice_date from account_move
+ UNION ALL SELECT id, ref, company_id, commercial_partner_id, type, invoice_date from current_moves
+ ) move
INNER JOIN account_move move2 ON
move2.ref = move.ref
AND move2.company_id = move.company_id
AND move2.commercial_partner_id = move.commercial_partner_id
AND move2.type = move.type
+ AND (move2.invoice_date = move.invoice_date OR move.invoice_date is NULL)
AND move2.id != move.id
WHERE move.id IN %s
AND move.type in ('in_invoice', 'in_refund')
AND move.ref IS NOT NULL
- ''', [tuple(self.ids)])
+ '''.format(", ".join(["(%s, %s, %s, %s, %s, CAST(%s as DATE))"] * len(self))), list(chain(*self.mapped(lambda r: [r.id, r.ref, r.company_id.id, r.commercial_partner_id.id, r.type, r.invoice_date or None]))) + [tuple(moves.ids)])
if self._cr.fetchone():
raise ValidationError(_('Duplicated vendor reference detected. You probably encoded twice the same vendor bill/credit note.'))
@@ -1793,8 +1800,8 @@ class AccountMove(models.Model):
move_vals_list = []
for move, default_values in zip(self, default_values_list):
default_values.update({
- 'type': reverse_type_map[self.type],
- 'reversed_entry_id': self.id,
+ 'type': reverse_type_map[move.type],
+ 'reversed_entry_id': move.id,
})
move_vals_list.append(move._reverse_move_vals(default_values, cancel=cancel))
reverse_moves = self.env['account.move'].create(move_vals_list)
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js
index bfea511f72e..10f7a3dc89e 100644
--- a/addons/account/static/src/js/reconciliation/reconciliation_model.js
+++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js
@@ -428,14 +428,7 @@ var StatementModel = BasicModel.extend({
if (self.context && self.context.active_model === 'account.journal' && self.context.active_ids) {
domainReconcile.push(['journal_id', 'in', [false].concat(self.context.active_ids)]);
}
- var def_reconcileModel = this._rpc({
- model: 'account.reconcile.model',
- method: 'search_read',
- domain: domainReconcile,
- })
- .then(function (reconcileModels) {
- self.reconcileModels = reconcileModels;
- });
+ var def_reconcileModel = this._loadReconciliationModel({domainReconcile: domainReconcile});
var def_account = this._rpc({
model: 'account.account',
method: 'search_read',
@@ -455,7 +448,59 @@ var StatementModel = BasicModel.extend({
return self._formatLine(self.statement.lines);
});
},
-
+ _readAnalyticTags: function (params) {
+ var self = this;
+ this.analyticTags = {};
+ if (!params || !params.res_ids || !params.res_ids.length) {
+ return $.when();
+ }
+ var fields = (params && params.fields || []).concat(['id', 'display_name']);
+ return this._rpc({
+ model: 'account.analytic.tag',
+ method: 'read',
+ args: [
+ params.res_ids,
+ fields,
+ ],
+ }).then(function (tags) {
+ for (var i=0; i<tags.length; i++) {
+ var tag = tags[i];
+ self.analyticTags[tag.id] = tag;
+ }
+ });
+ },
+ _loadReconciliationModel: function (params) {
+ var self = this;
+ return this._rpc({
+ model: 'account.reconcile.model',
+ method: 'search_read',
+ domain: params.domainReconcile || [],
+ })
+ .then(function (reconcileModels) {
+ var analyticTagIds = [];
+ for (var i=0; i<reconcileModels.length; i++) {
+ var modelTags = reconcileModels[i].analytic_tag_ids || [];
+ for (var j=0; j<modelTags.length; j++) {
+ if (analyticTagIds.indexOf(modelTags[j]) === -1) {
+ analyticTagIds.push(modelTags[j]);
+ }
+ }
+ }
+ return self._readAnalyticTags({res_ids: analyticTagIds}).then(function () {
+ for (var i=0; i<reconcileModels.length; i++) {
+ var recModel = reconcileModels[i];
+ var analyticTagData = [];
+ var modelTags = reconcileModels[i].analytic_tag_ids || [];
+ for (var j=0; j<modelTags.length; j++) {
+ var tagId = modelTags[j];
+ analyticTagData.push([tagId, self.analyticTags[tagId].display_name])
+ }
+ recModel.analytic_tag_ids = analyticTagData;
+ }
+ self.reconcileModels = reconcileModels;
+ });
+ });
+ },
_loadTaxes: function(){
var self = this;
self.taxes = {};
@@ -984,7 +1029,7 @@ var StatementModel = BasicModel.extend({
_formatMany2ManyTags: function (value) {
var res = [];
for (var i=0, len=value.length; i<len; i++) {
- res[i] = {data: {'id': value[i][0], 'display_name': value[i][1]}};
+ res[i] = {'id': value[i][0], 'display_name': value[i][1]};
}
return res;
},
@@ -1345,15 +1390,7 @@ var ManualModel = StatementModel.extend({
if (company_ids) {
domainReconcile.push(['company_id', 'in', company_ids]);
}
- var def_reconcileModel = this._rpc({
- model: 'account.reconcile.model',
- method: 'search_read',
- domain: domainReconcile,
- })
- .then(function (reconcileModels) {
- self.reconcileModels = reconcileModels;
- });
-
+ var def_reconcileModel = this._loadReconciliationModel({domainReconcile: domainReconcile});
var def_taxes = this._loadTaxes();
return Promise.all([def_reconcileModel, def_account, def_taxes]).then(function () {
diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js
index fb46b72719e..e946400afc3 100644
--- a/addons/account/static/tests/reconciliation_tests.js
+++ b/addons/account/static/tests/reconciliation_tests.js
@@ -137,8 +137,14 @@ var db = {
]
},
'account.analytic.tag': {
- fields: {},
- records: []
+ fields: {
+ id: {string: 'id', type: 'integer'},
+ display_name: {string: 'display_name', type: 'char'},
+ },
+ records: [
+ {id: 1, display_name: 'Come together'},
+ {id: 2, display_name: 'Right now'},
+ ],
},
'account.bank.statement': {
fields: {},
@@ -180,7 +186,8 @@ var db = {
second_amount: {string: "Second Amount", type: 'float', digits:0, help:"Fixed amount will count as a debit if it is negative, as a credit if it is positive.", default:100.0},
second_tax_ids: {string: "Second Tax", type: 'many2many', relation: 'account.tax'},
second_analytic_account_id: {string: "Second Analytic Account", type: 'many2one', relation:'account.analytic.account'},
- match_journal_ids: {string: "Journal Ids", type: 'many2many', relation: 'account.journal'}
+ match_journal_ids: {string: "Journal Ids", type: 'many2many', relation: 'account.journal'},
+ analytic_tag_ids: {string: 'Analytic tags', type: 'many2many', relation: 'account.analytic.tag'},
},
records: [
{'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 4, 'analytic_account_id': false, 'display_name': "Int\u00e9rrets", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': false, 'second_label': false, 'second_account_id': false, 'account_id': 282, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "fixed", 'name': "Int\u00e9rrets", 'amount': 0.0, 'second_amount': 100.0, 'match_journal_ids': []},
@@ -188,7 +195,7 @@ var db = {
{'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 5, 'analytic_account_id': false, 'display_name': "Fs bank", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': false, 'second_label': false, 'second_account_id': false, 'account_id': 284, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Fs bank", 'amount': 100.0, 'second_amount': 100.0},
{'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 8, 'analytic_account_id': false, 'display_name': "Caisse Sand.", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': "Caisse Sand.", 'second_label': false, 'second_account_id': false, 'account_id': 308, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Caisse Sand.", 'amount': 100.0, 'second_amount': 100.0, 'match_journal_ids': []},
{'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 3, 'analytic_account_id': false, 'display_name': "ATOS", 'rule_type': 'writeoff_button', 'second_tax_ids': [7], 'has_second_line': true, 'journal_id': false, 'label': "ATOS Banque", 'second_label': "ATOS Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [6], 'amount_type': "percentage", 'name': "ATOS", 'amount': 97.5, 'second_amount': 2.5},
- {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 10, 'analytic_account_id': false, 'display_name': "Double", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': true, 'journal_id': false, 'label': "Double Banque", 'second_label': "Double Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Double", 'amount': 97.5, 'second_amount': 2.5, 'match_journal_ids': []},
+ {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 10, 'analytic_account_id': false, 'display_name': "Double", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': true, 'journal_id': false, 'label': "Double Banque", 'second_label': "Double Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Double", 'amount': 97.5, 'second_amount': 2.5, 'match_journal_ids': [], 'analytic_tag_ids': [1,2]},
]
},
'account.reconciliation.widget': {
@@ -589,6 +596,7 @@ var ReconciliationRenderer = require('account.ReconciliationRenderer');
var demoData = require('account.reconciliation_tests.data');
var testUtils = require('web.test_utils');
+var testUtilsDom = require('web.test_utils_dom');
QUnit.module('account', {
beforeEach: function () {
@@ -1965,5 +1973,54 @@ QUnit.module('account', {
clientAction.destroy();
});
+
+ QUnit.test('Reconciliation Models handle analytic tags', async function (assert) {
+ assert.expect(6);
+
+ var clientAction = new ReconciliationClientAction.StatementAction(null, this.params.options);
+ testUtils.addMockEnvironment(clientAction, {
+ data: this.params.data,
+ mockRPC: function (route, args) {
+ if (args.method === 'process_bank_statement_line') {
+ var new_aml_dicts = args.args[1][0].new_aml_dicts;
+ assert.strictEqual(new_aml_dicts.length, 2);
+ // I personnally judge the following use case rotten, since
+ // the first and the second line wouldn't have the same tags
+ assert.deepEqual(new_aml_dicts[0].analytic_tag_ids, [[6, null, [1, 2]]]);
+ assert.deepEqual(new_aml_dicts[1].analytic_tag_ids, [[6, null, [2]]]);
+ }
+ return this._super(route, args);
+ },
+ session: {
+ currencies: {
+ 3: {
+ digits: [69, 2],
+ position: "before",
+ symbol: "$"
+ }
+ }
+ },
+ });
+
+ await clientAction.appendTo($('#qunit-fixture'));
+
+ // The first reconciliation "line" is where it happens
+ var widget = clientAction.widgets[0];
+
+ await testUtilsDom.click(widget.$('.toggle_create'));
+ await testUtilsDom.click(widget.$('.quick_add button:contains("Double")'));
+ assert.containsN(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge', 2,
+ 'Two tags are loaded');
+ assert.containsOnce(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge:contains("Come together")',
+ 'Tags should have a name');
+ assert.containsOnce(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge:contains("Right now")',
+ 'Tags should have a name');
+
+ await testUtilsDom.click(widget.$('.create_analytic_tag_ids .o_field_many2manytags .badge a.o_delete:first()'));
+
+ await testUtilsDom.click(widget.$('.o_reconcile'));
+
+ clientAction.destroy();
+ });
});
});
diff --git a/addons/account/tests/test_account_move_in_invoice.py b/addons/account/tests/test_account_move_in_invoice.py
index b14c1206f4b..79f2353c9e2 100644
--- a/addons/account/tests/test_account_move_in_invoice.py
+++ b/addons/account/tests/test_account_move_in_invoice.py
@@ -11,7 +11,7 @@ class TestAccountMoveInInvoiceOnchanges(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountMoveInInvoiceOnchanges, cls).setUpClass()
-
+
cls.invoice = cls.init_invoice('in_invoice')
cls.product_line_vals_1 = {
@@ -892,13 +892,13 @@ class TestAccountMoveInInvoiceOnchanges(InvoiceTestCommon):
**self.move_vals,
'date': move_reversal.date,
'state': 'draft',
- 'invoice_payment_ref': move_reversal.reason,
+ 'ref': 'Reversal of: %s, %s' % (self.invoice.name, move_reversal.reason),
'invoice_payment_state': 'not_paid',
})
move_reversal = self.env['account.move.reversal'].with_context(active_ids=self.invoice.ids).create({
'date': fields.Date.from_string('2019-02-01'),
- 'reason': 'no reason',
+ 'reason': 'because',
'refund_method': 'cancel',
})
reversal = move_reversal.reverse_moves()
@@ -934,7 +934,7 @@ class TestAccountMoveInInvoiceOnchanges(InvoiceTestCommon):
**self.move_vals,
'date': move_reversal.date,
'state': 'posted',
- 'invoice_payment_ref': move_reversal.reason,
+ 'ref': 'Reversal of: %s, %s' % (self.invoice.name, move_reversal.reason),
'invoice_payment_state': 'paid',
})
diff --git a/addons/account/tests/test_account_move_out_invoice.py b/addons/account/tests/test_account_move_out_invoice.py
index 50038eb9efc..3c097924b31 100644
--- a/addons/account/tests/test_account_move_out_invoice.py
+++ b/addons/account/tests/test_account_move_out_invoice.py
@@ -13,7 +13,7 @@ class TestAccountMoveOutInvoiceOnchanges(InvoiceTestCommon):
@classmethod
def setUpClass(cls):
super(TestAccountMoveOutInvoiceOnchanges, cls).setUpClass()
-
+
cls.invoice = cls.init_invoice('out_invoice')
cls.product_line_vals_1 = {
@@ -878,7 +878,7 @@ class TestAccountMoveOutInvoiceOnchanges(InvoiceTestCommon):
**self.move_vals,
'date': move_reversal.date,
'state': 'draft',
- 'invoice_payment_ref': move_reversal.reason,
+ 'ref': 'Reversal of: %s, %s' % (self.invoice.name, move_reversal.reason),
'invoice_payment_state': 'not_paid',
})
@@ -921,7 +921,7 @@ class TestAccountMoveOutInvoiceOnchanges(InvoiceTestCommon):
**self.move_vals,
'date': move_reversal.date,
'state': 'posted',
- 'invoice_payment_ref': move_reversal.reason,
+ 'ref': 'Reversal of: %s, %s' % (self.invoice.name, move_reversal.reason),
'invoice_payment_state': 'paid',
})
diff --git a/addons/account/wizard/account_invoice_send.py b/addons/account/wizard/account_invoice_send.py
index f33aac08807..5ad783b10bb 100644
--- a/addons/account/wizard/account_invoice_send.py
+++ b/addons/account/wizard/account_invoice_send.py
@@ -82,7 +82,22 @@ class AccountInvoiceSend(models.TransientModel):
def send_and_print_action(self):
self.ensure_one()
- self._send_email()
+ # Send the mails in the correct language by splitting the ids per lang.
+ # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted.
+ # basically self.body (which could be manually edited) extracts self.template_id,
+ # which is then not translated for each customer.
+ if self.composition_mode == 'mass_mail' and self.template_id:
+ active_ids = self.env.context.get('active_ids', self.res_id)
+ active_records = self.env[self.model].browse(active_ids)
+ langs = active_records.mapped('partner_id.lang')
+ default_lang = self.env.context.get('lang', 'en_US')
+ for lang in (set(langs) or [default_lang]):
+ active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids
+ self_lang = self.with_context(active_ids=active_ids_lang, lang=lang)
+ self_lang.onchange_template_id()
+ self_lang._send_email()
+ else:
+ self._send_email()
if self.is_print:
return self._print_document()
return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/account/wizard/account_invoice_send_views.xml b/addons/account/wizard/account_invoice_send_views.xml
index 28d4f03de25..016c6bf617f 100644
--- a/addons/account/wizard/account_invoice_send_views.xml
+++ b/addons/account/wizard/account_invoice_send_views.xml
@@ -14,6 +14,7 @@
<field name="invoice_ids" invisible="1"/>
<field name="email_from" invisible="1" />
<field name="mail_server_id" invisible="1"/>
+ <field name="reply_to" invisible="1"/>
<div name="option_print">
<field name="is_print" />
<b><label for="is_print"/></b>
diff --git a/addons/account/wizard/account_move_reversal.py b/addons/account/wizard/account_move_reversal.py
index 14d2a81257a..769e9178737 100644
--- a/addons/account/wizard/account_move_reversal.py
+++ b/addons/account/wizard/account_move_reversal.py
@@ -50,8 +50,7 @@ class AccountMoveReversal(models.TransientModel):
default_values_list = []
for move in moves:
default_values_list.append({
- 'ref': _('Reversal of: %s') % move.name,
- 'invoice_payment_ref': self.reason,
+ 'ref': _('Reversal of: %s, %s') % (move.name, self.reason),
'date': self.date or move.date,
'invoice_date': move.is_invoice(include_receipts=True) and (self.date or move.date) or False,
'journal_id': self.journal_id and self.journal_id.id or move.journal_id.id,
diff --git a/addons/account_bank_statement_import/i18n/cs.po b/addons/account_bank_statement_import/i18n/cs.po
index 7c937e76dfe..bb8bbe76699 100644
--- a/addons/account_bank_statement_import/i18n/cs.po
+++ b/addons/account_bank_statement_import/i18n/cs.po
@@ -435,6 +435,9 @@ msgid ""
"Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n"
"Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings."
msgstr ""
+"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n"
+"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n"
+"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení."
#. module: account_bank_statement_import
#: model:ir.model.fields,help:account_bank_statement_import.field_account_bank_statement_import_journal_creation__outbound_payment_method_ids
diff --git a/addons/account_payment/views/account_portal_templates.xml b/addons/account_payment/views/account_portal_templates.xml
index 53c126e1bfc..9bb739202bd 100644
--- a/addons/account_payment/views/account_portal_templates.xml
+++ b/addons/account_payment/views/account_portal_templates.xml
@@ -48,7 +48,7 @@
<div t-if="pms or acquirers" id="payment_method" class="text-left col-md-13">
<t t-call="payment.payment_tokens_list">
<t t-set="mode" t-value="'payment'"/>
- <t t-set="partner_id" t-value="request.env.user.partner_id.id"/>
+ <t t-set="partner_id" t-value="invoice.partner_id.id if request.env.user._is_public() else request.env.user.partner_id.id"/>
<t t-set="success_url" t-value="invoice.get_portal_url()"/>
<t t-set="error_url" t-value="invoice.get_portal_url()"/>
<t t-set="access_token" t-value="access_token or ''"/>
diff --git a/addons/base_vat/models/res_partner.py b/addons/base_vat/models/res_partner.py
index e35843606ee..6875a2e21c3 100644
--- a/addons/base_vat/models/res_partner.py
+++ b/addons/base_vat/models/res_partner.py
@@ -150,7 +150,7 @@ class ResPartner(models.Model):
vat = country_code + vat
return vat
- @api.constrains('vat')
+ @api.constrains('vat', 'country_id')
def check_vat(self):
if self.env.context.get('company_id'):
company = self.env['res.company'].browse(self.env.context['company_id'])
diff --git a/addons/board/i18n/ar.po b/addons/board/i18n/ar.po
index 8935ee83f2a..04b6de7f0f6 100644
--- a/addons/board/i18n/ar.po
+++ b/addons/board/i18n/ar.po
@@ -5,7 +5,6 @@
# Translators:
# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Martin Trigaux, 2018
-# Osoul <baruni@osoul.ly>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Zuhair Hammadi <zuhair12@gmail.com>, 2018
# Abdulmajeed Alomar <majeeed87@gmail.com>, 2018
@@ -31,6 +30,8 @@ msgid ""
"\"Add to\n"
" Dashboard\""
msgstr ""
+"\"إضافة إلى\n"
+" لوحة المعلومات\""
#. module: board
#. openerp-web
@@ -44,7 +45,7 @@ msgstr "&nbsp;"
#: code:addons/board/static/src/js/favorite_menu.js:103
#, python-format
msgid "'%s' added to dashboard"
-msgstr "تم إضافة '%s' إلى اللوحة"
+msgstr "تم إضافة '%s' للوحة المعلومات"
#. module: board
#. openerp-web
@@ -80,21 +81,21 @@ msgstr "لوحة"
#: code:addons/board/static/src/xml/board.xml:7
#, python-format
msgid "Change Layout"
-msgstr "تغيير النسق"
+msgstr "تغيير المخطط"
#. module: board
#. openerp-web
#: code:addons/board/static/src/xml/board.xml:5
#, python-format
msgid "Change Layout.."
-msgstr "تغيير النسق..."
+msgstr "تغيير المخطط..."
#. module: board
#. openerp-web
#: code:addons/board/static/src/xml/board.xml:36
#, python-format
msgid "Choose dashboard layout"
-msgstr "اختيار تصميم لوحة المعلومات"
+msgstr "اختيار مخطط لوحة المعلومات"
#. module: board
#. openerp-web
@@ -106,14 +107,14 @@ msgstr "لم يمكن إضافة الفلتر إلى لوحة المعلومات
#. module: board
#: model:ir.model.fields,field_description:board.field_board_board__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: board
#. openerp-web
#: code:addons/board/static/src/js/board_view.js:80
#, python-format
msgid "Edit Layout"
-msgstr "تعديل التنسق"
+msgstr "تحرير المخطط"
#. module: board
#: model:ir.model.fields,field_description:board.field_board_board__id
@@ -147,7 +148,7 @@ msgstr "لوحة معلوماتي"
#: code:addons/board/static/src/js/favorite_menu.js:104
#, python-format
msgid "Please refresh your browser for the changes to take effect."
-msgstr "الرجاء تحديث المتصفح الخاص بك حتى تصبح التغييرات سارية المفعول."
+msgstr "الرجاء تحديث متصفحك حتى تصبح التغييرات سارية المفعول."
#. module: board
#. openerp-web
@@ -157,6 +158,8 @@ msgid ""
"To add your first report into this dashboard, go to any\n"
" menu, switch to list or graph view, and click"
msgstr ""
+"لإضافة تقريرك الأول في لوحة المعلومات هذه، افتح أي\n"
+" قائمة، انتقل لطريقة العرض بالقائمة أو بالرسم البياني، واضغط"
#. module: board
#. openerp-web
@@ -166,17 +169,19 @@ msgid ""
"You can filter and group data before inserting into the\n"
" dashboard using the search options."
msgstr ""
+"يمكنك تصفية وتجميع البيانات قبل إدراجها في\n"
+" لوحة معلوماتك باستخدام خيارات البحث."
#. module: board
#. openerp-web
#: code:addons/board/static/src/xml/board.xml:49
#, python-format
msgid "Your personal dashboard is empty"
-msgstr ""
+msgstr "لوحة معلوماتك فارغة"
#. module: board
#. openerp-web
#: code:addons/board/static/src/xml/board.xml:53
#, python-format
msgid "in the extended search options."
-msgstr ""
+msgstr "في خيارات البحث الممتد."
diff --git a/addons/contacts/i18n/ar.po b/addons/contacts/i18n/ar.po
index fba40b5358f..c1c86c5ad67 100644
--- a/addons/contacts/i18n/ar.po
+++ b/addons/contacts/i18n/ar.po
@@ -3,19 +3,19 @@
# * contacts
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
-# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Abdulmajeed Alomar <majeeed87@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
-"PO-Revision-Date: 2018-09-18 09:49+0000\n"
-"Last-Translator: Abdulmajeed Alomar <majeeed87@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:17+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +32,7 @@ msgstr "الحسابات البنكية"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_action_res_bank_form
msgid "Banks"
-msgstr "المصارف"
+msgstr "البنوك"
#. module: contacts
#: model:ir.ui.menu,name:contacts.res_partner_menu_config
@@ -42,7 +42,7 @@ msgstr "الإعدادات"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_partner_category_form
msgid "Contact Tags"
-msgstr "علامات الاتصال"
+msgstr "وسوم جهة الاتصال"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_partner_title_contact
@@ -65,18 +65,18 @@ msgstr "الدول"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_country_group
msgid "Country Group"
-msgstr "مجموعة الدولة"
+msgstr "مجموعات الدول"
#. module: contacts
#: model_terms:ir.actions.act_window,help:contacts.action_contacts
#: model_terms:ir.actions.act_window,help:contacts.action_contacts_summary
msgid "Create a contact in your address book"
-msgstr ""
+msgstr "إنشاء جهة اتصال في دفتر العناوين"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_country_state_partner
msgid "Fed. States"
-msgstr "Fed. States"
+msgstr "الولايات الفيدرالية"
#. module: contacts
#: model:ir.ui.menu,name:contacts.menu_localisation
@@ -87,7 +87,7 @@ msgstr "التوطين"
#: model_terms:ir.actions.act_window,help:contacts.action_contacts
#: model_terms:ir.actions.act_window,help:contacts.action_contacts_summary
msgid "Odoo helps you to easily track all activities related to a customer."
-msgstr ""
+msgstr "يساعدك أودو على تتبع كل الأنشطة المتعلقة بالعملاء بسهولة."
#. module: contacts
#: model:ir.ui.menu,name:contacts.res_partner_industry_menu
diff --git a/addons/crm/i18n/km.po b/addons/crm/i18n/km.po
index 614e6a8fa21..a947ac6103d 100644
--- a/addons/crm/i18n/km.po
+++ b/addons/crm/i18n/km.po
@@ -1921,7 +1921,7 @@ msgstr ""
#. module: crm
#: model:ir.model,name:crm.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_activity_report__team_id
@@ -1935,13 +1935,13 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:crm.crm_opportunity_report_view_search
#: model_terms:ir.ui.view,arch_db:crm.view_crm_case_opportunities_filter
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: crm
#: code:addons/crm/models/crm_lead.py:1125
#, python-format
msgid "Sales Team Settings"
-msgstr ""
+msgstr "កំណត់ការលក់"
#. module: crm
#: model:ir.ui.menu,name:crm.crm_team_config
@@ -1969,7 +1969,7 @@ msgstr ""
#. module: crm
#: model_terms:ir.ui.view,arch_db:crm.view_crm_case_leads_filter
msgid "Search Leads"
-msgstr ""
+msgstr "ស្រាវជ្រាវ"
#. module: crm
#: model_terms:ir.ui.view,arch_db:crm.crm_lost_reason_view_search
@@ -1980,7 +1980,7 @@ msgstr ""
#. module: crm
#: model_terms:ir.ui.view,arch_db:crm.merge_opportunity_form
msgid "Select Leads/Opportunities"
-msgstr ""
+msgstr "ឧកាស"
#. module: crm
#: model:ir.actions.act_window,name:crm.action_lead_mass_mail
@@ -2000,7 +2000,7 @@ msgstr "សេវាកម្ម"
#. module: crm
#: model_terms:ir.actions.act_window,help:crm.crm_stage_action
msgid "Set a new stage in your opportunity pipeline"
-msgstr ""
+msgstr "ការកំណត់យុទ្ឋសាស្រ្តនៅក្នុងអាកាស"
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_stage__on_change
diff --git a/addons/crm/i18n/vi.po b/addons/crm/i18n/vi.po
index 36b7529f560..2bcb4a54903 100644
--- a/addons/crm/i18n/vi.po
+++ b/addons/crm/i18n/vi.po
@@ -719,7 +719,7 @@ msgstr "Thiết kế"
#. module: crm
#: model:ir.model,name:crm.model_digest_digest
msgid "Digest"
-msgstr ""
+msgstr "Tiêu"
#. module: crm
#: model_terms:ir.ui.view,arch_db:crm.view_create_opportunity_simplified
diff --git a/addons/crm_iap_lead_website/models/crm_reveal_rule.py b/addons/crm_iap_lead_website/models/crm_reveal_rule.py
index 3300b63f09b..b1d6fd23cfb 100644
--- a/addons/crm_iap_lead_website/models/crm_reveal_rule.py
+++ b/addons/crm_iap_lead_website/models/crm_reveal_rule.py
@@ -7,7 +7,7 @@ import logging
import re
from dateutil.relativedelta import relativedelta
-from odoo import api, fields, models, tools, _
+from odoo import api, fields, models, tools, _, _geoip_resolver
from odoo.addons.iap import jsonrpc
from odoo.addons.crm.models import crm_stage
from odoo.exceptions import ValidationError
@@ -74,8 +74,17 @@ class CRMRevealRule(models.Model):
raise ValidationError(_('Enter Valid Regex.'))
@api.model
+ def _assert_geoip(self):
+ if not _geoip_resolver:
+ message = _('Lead Generation requires a GeoIP resolver which could not be found on your system. Please consult https://pypi.org/project/GeoIP/.')
+ self.env['bus.bus'].sendone(
+ (self._cr.dbname, 'res.partner', self.env.user.partner_id.id),
+ {'type': 'simple_notification', 'title': _('Missing Library'), 'message': message, 'sticky': True, 'warning': True})
+
+ @api.model
def create(self, vals):
self.clear_caches() # Clear the cache in order to recompute _get_active_rules
+ self._assert_geoip()
return super(CRMRevealRule, self).create(vals)
def write(self, vals):
@@ -84,6 +93,7 @@ class CRMRevealRule(models.Model):
}
if set(vals.keys()) & fields_set:
self.clear_caches() # Clear the cache in order to recompute _get_active_rules
+ self._assert_geoip()
return super(CRMRevealRule, self).write(vals)
def unlink(self):
diff --git a/addons/delivery/__manifest__.py b/addons/delivery/__manifest__.py
index 22cb78e9af5..684395775b2 100644
--- a/addons/delivery/__manifest__.py
+++ b/addons/delivery/__manifest__.py
@@ -30,6 +30,7 @@ invoices from picking, the system is able to add and compute the shipping line.
'views/res_config_settings_views.xml',
'wizard/choose_delivery_package_views.xml',
'wizard/choose_delivery_carrier_views.xml',
+ 'views/assets.xml',
],
'demo': ['data/delivery_demo.xml'],
'installable': True,
diff --git a/addons/delivery/i18n/km.po b/addons/delivery/i18n/km.po
index 6a8cf9fce12..b2bc7ad4140 100644
--- a/addons/delivery/i18n/km.po
+++ b/addons/delivery/i18n/km.po
@@ -549,7 +549,7 @@ msgstr ""
#. module: delivery
#: model:ir.model.fields,field_description:delivery.field_delivery_price_rule__operator
msgid "Operator"
-msgstr ""
+msgstr "ប្រតិបត្តការណ៌"
#. module: delivery
#: model_terms:ir.ui.view,arch_db:delivery.choose_delivery_package_view_form
diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py
index e746c1b9d37..02c6bf605b3 100644
--- a/addons/delivery/models/sale_order.py
+++ b/addons/delivery/models/sale_order.py
@@ -151,7 +151,7 @@ class SaleOrderLine(models.Model):
def _compute_product_qty(self):
for line in self:
if not line.product_id or not line.product_uom or not line.product_uom_qty:
- return 0.0
+ continue
line.product_qty = line.product_uom._compute_quantity(line.product_uom_qty, line.product_id.uom_id)
def unlink(self):
diff --git a/addons/delivery/static/src/js/delivery_translations.js b/addons/delivery/static/src/js/delivery_translations.js
new file mode 100644
index 00000000000..565adbcb69f
--- /dev/null
+++ b/addons/delivery/static/src/js/delivery_translations.js
@@ -0,0 +1,16 @@
+// TODO Remove me >=saas-12.5, this is a disgrace
+// This is an hack to get the string_* and hover_* options translated on the
+// boolean_button terminology widget. The terms are translated through
+// _t(opt_terms.string_true) which will only work if the terms are already
+// present in the translation map.
+// This code does nothing but marks the strings as translatable
+var _t = function(x) { return x; };
+
+_t("Production Environment");
+_t("Switch to test environment");
+_t("Test Environment");
+_t("Switch to production environment");
+_t("Debug requests");
+_t("Disable debug");
+_t("No debug");
+_t("Enable debug");
diff --git a/addons/delivery/views/assets.xml b/addons/delivery/views/assets.xml
new file mode 100644
index 00000000000..851aaca55c9
--- /dev/null
+++ b/addons/delivery/views/assets.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <template id="assets_backend" name="delivery_assets_backend" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/delivery/static/src/js/delivery_translations.js"></script>
+ </xpath>
+ </template>
+
+</odoo>
diff --git a/addons/digest/i18n/ar.po b/addons/digest/i18n/ar.po
index b00d2a6647c..b720c2c87a7 100644
--- a/addons/digest/i18n/ar.po
+++ b/addons/digest/i18n/ar.po
@@ -12,7 +12,7 @@
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
#
msgid ""
msgstr ""
@@ -20,7 +20,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-02 10:05+0000\n"
"PO-Revision-Date: 2018-08-24 09:17+0000\n"
-"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2018\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -186,7 +186,7 @@ msgstr ""
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0
msgid "${', '.join(users.mapped('name'))} signed up. Say hello in the"
-msgstr ""
+msgstr "قام ${', '.join(users.mapped('name'))} بالاشتراك. رحب به في"
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0
@@ -195,12 +195,15 @@ msgid ""
" % set channel_id = object.env.ref('mail.channel_all_employees').id\n"
" <strong style=\"font-size: 16px;\">Did you know...?</strong>"
msgstr ""
+"% set users = object.env['res.users'].search([], limit=10, order='id desc')\n"
+" % set channel_id = object.env.ref('mail.channel_all_employees').id\n"
+" <strong style=\"font-size: 16px;\">هل تعلم...؟</strong>"
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_1
msgid ""
"<strong style=\"font-size: 16px;\">Get things done with activities</strong>"
-msgstr ""
+msgstr "<strong style=\"font-size: 16px;\">أنجز مشروعاتك من خلال الأنشطة</strong>"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -216,16 +219,17 @@ msgstr "مفعل"
#: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form
msgid "Add new users as recipient of a periodic email with key metrics"
msgstr ""
+"إدراج المستخدمين الجدد في قائمة استلام رسالة البريد الدورية بمقاييس رئيسية"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_tip__group_id
msgid "Authorized Group"
-msgstr ""
+msgstr "المجموعة المعتمدة"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__available_fields
msgid "Available Fields"
-msgstr ""
+msgstr "الحقول المتاحة"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__company_id
@@ -240,12 +244,12 @@ msgstr "ضبط الإعدادات"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form
msgid "Configure Digest Emails"
-msgstr ""
+msgstr "إعداد رسائل البريد التلخيصية"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_res_users_connected
msgid "Connected Users"
-msgstr ""
+msgstr "المستخدمون المتصلون"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -253,6 +257,8 @@ msgid ""
"Create or edit the mail template: you may get computed KPI's value using "
"these fields:"
msgstr ""
+"إنشاء أو تحرير قالب رسالة البريد الإلكتروني: قد تحصل على قيمة المؤشر الرئيسي"
+" المحسوبة باستخدام هذه الحقول:"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__create_uid
@@ -274,12 +280,12 @@ msgstr "العملة"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "Deactivate for everyone"
-msgstr ""
+msgstr "تعطيل للجميع"
#. module: digest
#: selection:digest.digest,state:0
msgid "Deactivated"
-msgstr ""
+msgstr "معطل"
#. module: digest
#: model:ir.model,name:digest.model_digest_digest
@@ -290,7 +296,7 @@ msgstr "الملخص"
#: model:ir.model.fields,field_description:digest.field_res_config_settings__digest_id
#: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form
msgid "Digest Email"
-msgstr ""
+msgstr "رسالة البريد التلخيصية"
#. module: digest
#: model:ir.actions.act_window,name:digest.digest_digest_action
@@ -300,23 +306,23 @@ msgstr ""
#: model:ir.model.fields,field_description:digest.field_res_config_settings__digest_emails
#: model:ir.ui.menu,name:digest.digest_menu
msgid "Digest Emails"
-msgstr ""
+msgstr "رسائل البريد التلخيصية"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.portal_digest_unsubscribed
msgid "Digest Subscriptions"
-msgstr ""
+msgstr "اشتراكات الرسائل التلخيصية"
#. module: digest
#: model:ir.model,name:digest.model_digest_tip
msgid "Digest Tips"
-msgstr ""
+msgstr "ملاحظات الملخص"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__display_name
#: model:ir.model.fields,field_description:digest.field_digest_tip__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__template_id
@@ -336,44 +342,44 @@ msgstr "تجميع حسب"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "How to customize your digest?"
-msgstr ""
+msgstr "كيف تعدل رسالتك التلخيصية؟"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__id
#: model:ir.model.fields,field_description:digest.field_digest_tip__id
msgid "ID"
-msgstr "المعرف"
+msgstr "المُعرف"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "In order to build your customized digest, follow these steps:"
-msgstr ""
+msgstr "اتبع هذه الخطوات لتكوين رسالتك التلخيصية المعدلة:"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__is_subscribed
msgid "Is user subscribed"
-msgstr ""
+msgstr "هو مستخدم مشترك"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_tree
msgid "KPI Digest"
-msgstr ""
+msgstr "ملخص مؤشرات الأداء"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "KPIs"
-msgstr ""
+msgstr "مؤشرات الأداء الرئيسية"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_mail_message_total_value
msgid "Kpi Mail Message Total Value"
-msgstr ""
+msgstr "قيمة مؤشر الأداء لعدد الرسائل"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_res_users_connected_value
msgid "Kpi Res Users Connected Value"
-msgstr ""
+msgstr "مؤشر الأداء لعدد المستخدمين المتصلين"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest____last_update
@@ -401,7 +407,7 @@ msgstr "الرسائل"
#. module: digest
#: selection:digest.digest,periodicity:0
msgid "Monthly"
-msgstr "شهريًا"
+msgstr "شهرياً"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__name
@@ -414,11 +420,13 @@ msgid ""
"New users are automatically added as recipient of the following digest "
"email."
msgstr ""
+"تلقائيًا، يتم إدراج المستخدمين الجدد في قائمة استلام الرسائل التلخيصية "
+"التالية."
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__next_run_date
msgid "Next Send Date"
-msgstr ""
+msgstr "تاريخ الإرسال التالي"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_digest__periodicity
@@ -440,7 +448,7 @@ msgstr "المستلمون"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "Select your KPIs in the KPI's tab."
-msgstr ""
+msgstr "اختر مؤشراتك الرئيسية في تبويب المؤشر الرئيسي."
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -465,17 +473,17 @@ msgstr "اشتراك"
#. module: digest
#: model:ir.model.fields,field_description:digest.field_digest_tip__tip_description
msgid "Tip description"
-msgstr ""
+msgstr "وصف تلميحي"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "Unsubscribe me"
-msgstr ""
+msgstr "إلغاء اشتراكي"
#. module: digest
#: model:ir.model.fields,help:digest.field_digest_tip__sequence
msgid "Used to display digest tip in email template base on order"
-msgstr ""
+msgstr "تستخدم لعرض ملاحظة تلخيصية في قالب البريد حسب الطلب"
#. module: digest
#: model:ir.model,name:digest.model_res_users
@@ -485,7 +493,7 @@ msgstr "المستخدمون"
#. module: digest
#: model:ir.model.fields,help:digest.field_digest_tip__user_ids
msgid "Users having already received this tip"
-msgstr ""
+msgstr "المستخدمون الذين استلموا بالفعل هذه الملحوظة"
#. module: digest
#: selection:digest.digest,periodicity:0
@@ -495,7 +503,7 @@ msgstr "أسبوعيًا"
#. module: digest
#: model:digest.digest,name:digest.digest_digest_default
msgid "Weekly Digest"
-msgstr ""
+msgstr "الملخص الأسبوعي"
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0
@@ -503,6 +511,8 @@ msgid ""
"You can ping colleagues by tagging them in your messages using \"@\". They "
"will be instantly notified.<br>"
msgstr ""
+"يمكنك إشعار زملاءك من خلال الإشارة إليهم في رسالتك باستخدام علامة \"@\". "
+"سيتم إخطارهم فورًا.<br>"
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_1
@@ -510,21 +520,23 @@ msgid ""
"You don't have any activity scheduled. Use activities on any business "
"document to schedule meetings, calls and todos."
msgstr ""
+"ليس لديك نشاطات مجدولة. استخدم الأنشطة في أي مستند عمل لجدولة الاجتماعات "
+"والمكالمات والإجراءات المطلوبة."
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.portal_digest_unsubscribed
msgid "You have been successfully unsubscribed from"
-msgstr ""
+msgstr "ألغيت بنجاح اشتراكك من"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
msgid "You may want to add new computed fields with Odoo Studio:"
-msgstr ""
+msgstr "ربما تحتاج لإضافة حقول محسوبة جديدة باستديو أودو:"
#. module: digest
#: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0
msgid "company's discussion channel."
-msgstr ""
+msgstr "قناة النقاش الخاصة بالمؤسسة."
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -533,6 +545,9 @@ msgid ""
" <code>kpi_myfield</code>\n"
" and display it in the KPI's tab;"
msgstr ""
+"قم أولًا بإنشاء حقل منطقي يُسمى\n"
+" <code>kpi_myfield</code>\n"
+" واعرضه في تبويب المؤشر الرئيسي؛"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -541,6 +556,9 @@ msgid ""
" <code>kpi_myfield_value</code>\n"
" that will compute your customized KPI."
msgstr ""
+"ثم أنشئ حقل محسوب يُسمى\n"
+" <code>kpi_myfield_value</code>\n"
+" ليحسب قيمة مؤشرك الرئيسي المعدلة."
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
@@ -549,3 +567,6 @@ msgid ""
" <code>digest</code>\n"
" object:"
msgstr ""
+"يجب إنشاء حقلين في\n"
+" الكائن\n"
+" التلخيصي:"
diff --git a/addons/digest/i18n/km.po b/addons/digest/i18n/km.po
index d0109d5f0ea..a3fb03aa077 100644
--- a/addons/digest/i18n/km.po
+++ b/addons/digest/i18n/km.po
@@ -427,7 +427,7 @@ msgstr ""
#: model:ir.model.fields,field_description:digest.field_digest_digest__user_ids
#: model:ir.model.fields,field_description:digest.field_digest_tip__user_ids
msgid "Recipients"
-msgstr ""
+msgstr "អ្នកទទួល"
#. module: digest
#: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form
diff --git a/addons/event/i18n/km.po b/addons/event/i18n/km.po
index 10336cfe296..be514d025a8 100644
--- a/addons/event/i18n/km.po
+++ b/addons/event/i18n/km.po
@@ -1852,7 +1852,7 @@ msgstr ""
#. module: event
#: model_terms:ir.ui.view,arch_db:event.view_event_form
msgid "Set To Draft"
-msgstr ""
+msgstr "កំណត់ជាសេចក្ដីព្រាង"
#. module: event
#: model_terms:ir.ui.view,arch_db:event.view_event_registration_form
diff --git a/addons/event_sale/i18n/ar.po b/addons/event_sale/i18n/ar.po
index 51f9d28ffb4..ca9aa94e231 100644
--- a/addons/event_sale/i18n/ar.po
+++ b/addons/event_sale/i18n/ar.po
@@ -37,7 +37,7 @@ msgstr "تطبيق"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_availability
msgid "Available Seat"
-msgstr ""
+msgstr "المقاعد المتوفرة"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_available
@@ -54,14 +54,14 @@ msgstr "قبل التأكيد"
msgid ""
"Choose an event and it will automatically create a registration for this "
"event."
-msgstr "اختر حدث وسيتم إنشاء تسجيل لهذا الحدث تلقائيا."
+msgstr "اختر فعالية وسيتم إنشاء تسجيل لها تلقائيًا."
#. module: event_sale
#: model:ir.model.fields,help:event_sale.field_sale_order_line__event_ticket_id
msgid ""
"Choose an event ticket and it will automatically create a registration for "
"this event ticket."
-msgstr "اختر تذكرة حدث وسيتم إنشاء تسجيل لتذكرة هذا الحدث تلقائيا."
+msgstr "اختر تذكرة فعالية وسيتم إنشاء تسجيل لها تلقائيًا."
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__create_uid
@@ -84,23 +84,25 @@ msgid ""
"you will not be able to sell tickets anymore. Set 0 to ignore this rule set "
"as unlimited."
msgstr ""
+"حدد عدد التذاكر المتوفرة. في حال وجود عدد كبير من التسجيلات لن تتمكن من بيع "
+"التذاكر. اجعل هذه القيمة 0 لتجاهل هذه القاعدة وتعيين عدد غير محدود للتذاكر."
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__display_name
#: model:ir.model.fields,field_description:event_sale.field_registration_editor__display_name
#: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: event_sale
#: model:ir.model,name:event_sale.model_registration_editor
msgid "Edit Attendee Details on Sales Confirmation"
-msgstr ""
+msgstr "تحرير بيانات الحاضر عند تأكيد عملية البيع"
#. module: event_sale
#: model:ir.model,name:event_sale.model_registration_editor_line
msgid "Edit Attendee Line on Sales Confirmation"
-msgstr ""
+msgstr "تحرير بند الحاضر عند تأكيد عملية البيع"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__editor_id
@@ -118,18 +120,18 @@ msgstr "البريد الإلكتروني"
#: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__event_id
#: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_id
msgid "Event"
-msgstr "الحدث"
+msgstr "الفعالية"
#. module: event_sale
#: model:ir.model,name:event_sale.model_event_type
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__event_type_id
msgid "Event Category"
-msgstr "فئة الحدث"
+msgstr "فئة الفعالية"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.event_ticket_form_view
msgid "Event Name"
-msgstr "اسم الحدث"
+msgstr "اسم الفعالية"
#. module: event_sale
#: model:ir.model,name:event_sale.model_event_registration
@@ -141,7 +143,7 @@ msgstr "تسجيل التنفيذ"
#. module: event_sale
#: model:ir.actions.act_window,name:event_sale.action_sale_order_event_registration
msgid "Event Registrations"
-msgstr ""
+msgstr "تسجيلات الفعالية"
#. module: event_sale
#: model:ir.model,name:event_sale.model_event_event_ticket
@@ -150,17 +152,17 @@ msgstr ""
#: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__event_ticket_id
#: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_ticket_id
msgid "Event Ticket"
-msgstr "تذكرة الحدث"
+msgstr "تذكرة الفعالية"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_product_product__event_ticket_ids
msgid "Event Tickets"
-msgstr "تذاكر الحدث"
+msgstr "تذاكر الفعالية"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.event_ticket_form_view
msgid "Event's Ticket"
-msgstr ""
+msgstr "تذكرة الفعالية"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.event_sale_product_template_form
@@ -172,7 +174,7 @@ msgstr "المناسبات"
#: code:addons/event_sale/models/event.py:254
#, python-format
msgid "Free"
-msgstr "حرّ"
+msgstr "مجاني"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__id
@@ -188,6 +190,8 @@ msgid ""
"If checked this product automatically creates an event registration at the "
"sales order confirmation."
msgstr ""
+"إذا كان هذا الخيار محددًا، ينشئ هذا المنتج تسجيلًا تلقائيًا بالفعالية عند "
+"تأكيد عملية البيع."
#. module: event_sale
#: model:ir.model,name:event_sale.model_account_invoice
@@ -203,7 +207,7 @@ msgstr "هو منتهي"
#: model:ir.model.fields,field_description:event_sale.field_product_template__event_ok
#: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_ok
msgid "Is an Event Ticket"
-msgstr ""
+msgstr "هي تذكرة فعالية"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket____last_update
@@ -229,7 +233,7 @@ msgstr "آخر تحديث في"
#. module: event_sale
#: selection:event.event.ticket,seats_availability:0
msgid "Limited"
-msgstr ""
+msgstr "محدود"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_max
@@ -248,13 +252,13 @@ msgstr "الاسم"
#: code:addons/event_sale/models/event.py:205
#, python-format
msgid "No more available seats for this ticket"
-msgstr ""
+msgstr "لا توجد مقاعد متاحة لهذه التذكرة"
#. module: event_sale
#: code:addons/event_sale/models/event.py:152
#, python-format
msgid "No more available seats for this ticket type."
-msgstr ""
+msgstr "لا توجد مقاعد متاحة لهذا النوع من التذاكر."
#. module: event_sale
#: code:addons/event_sale/models/event.py:250
@@ -270,7 +274,7 @@ msgstr "المصدر"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__registration_id
msgid "Original Registration"
-msgstr ""
+msgstr "التسجيل الأصلي"
#. module: event_sale
#: code:addons/event_sale/models/event.py:259
@@ -302,7 +306,7 @@ msgstr "تخفيض السعر"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__price_reduce_taxinc
msgid "Price Reduce Tax inc"
-msgstr ""
+msgstr "الخصم بإضافة الضريبة"
#. module: event_sale
#: model:ir.model,name:event_sale.model_product_product
@@ -328,7 +332,7 @@ msgstr "التسجيل"
#: code:addons/event_sale/models/event.py:51
#, python-format
msgid "Registration for %s"
-msgstr ""
+msgstr "تسجيل لـ%s"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__registration_ids
@@ -338,7 +342,7 @@ msgstr "التسجيلات"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_registration_editor__event_registration_ids
msgid "Registrations to Edit"
-msgstr ""
+msgstr "التسجيلات المراد تحريرها"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_reserved
@@ -370,12 +374,12 @@ msgstr "سطر أمر المبيعات"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_used
msgid "Seats Used"
-msgstr ""
+msgstr "المقاعد المستخدمة"
#. module: event_sale
#: model:event.type,name:event_sale.event_type_data_sale
msgid "Sell Online"
-msgstr ""
+msgstr "بع أونلاين"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.view_event_registration_editor_form
@@ -385,7 +389,7 @@ msgstr "تجاوز"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_registration__sale_order_id
msgid "Source Sales Order"
-msgstr ""
+msgstr "أمر البيع المصدر"
#. module: event_sale
#: model:event.event.ticket,name:event_sale.event_0_ticket_1
@@ -397,7 +401,7 @@ msgstr "قياسي"
#: code:addons/event_sale/models/event.py:257
#, python-format
msgid "The registration must be paid"
-msgstr ""
+msgstr "يجب سداد قيمة التسجيل"
#. module: event_sale
#: code:addons/event_sale/models/event.py:250
@@ -415,12 +419,12 @@ msgstr "نوع التذكرة"
#: code:addons/event_sale/models/event.py:157
#, python-format
msgid "Ticket cannot belong to both the event category and the event itself."
-msgstr ""
+msgstr "لا يمكن أن تنتمي التذكرة لفئة الفعالية وللفعالية نفسها."
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_type__use_ticketing
msgid "Ticketing"
-msgstr ""
+msgstr "بيع التذاكر"
#. module: event_sale
#: model:ir.model.fields,field_description:event_sale.field_event_type__event_ticket_ids
@@ -444,7 +448,7 @@ msgstr "الحجوزات غير المؤكدة"
#: model:product.product,uom_name:event_sale.product_product_event
#: model:product.template,uom_name:event_sale.product_product_event_product_template
msgid "Unit(s)"
-msgstr "وحدة(ات)"
+msgstr "وحدة"
#. module: event_sale
#: selection:event.event.ticket,seats_availability:0
@@ -466,14 +470,14 @@ msgstr "كجم"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.view_event_registration_editor_form
msgid "please give details about the registrations"
-msgstr ""
+msgstr "برجاء توفير تفاصيل عن التسجيلات"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.view_event_form_inherit_ticket
msgid "reserved +"
-msgstr ""
+msgstr "محجوز +"
#. module: event_sale
#: model_terms:ir.ui.view,arch_db:event_sale.view_event_form_inherit_ticket
msgid "unconfirmed"
-msgstr ""
+msgstr "غير مؤكد"
diff --git a/addons/fetchmail/i18n/ar.po b/addons/fetchmail/i18n/ar.po
index 905f8266bec..1b23eee1a0c 100644
--- a/addons/fetchmail/i18n/ar.po
+++ b/addons/fetchmail/i18n/ar.po
@@ -3,7 +3,6 @@
# * fetchmail
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
@@ -13,13 +12,15 @@
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Zuhair Hammadi <zuhair12@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
-"PO-Revision-Date: 2018-09-18 09:49+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:17+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -30,7 +31,7 @@ msgstr ""
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
msgid "Actions to Perform on Incoming Mails"
-msgstr "إجراءات لتنفيذها على الرسائل الواردة"
+msgstr "الإجراءات المراد تنفيذها على الرسائل الواردة"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__active
@@ -70,7 +71,7 @@ msgid ""
"Connections are encrypted with SSL/TLS through a dedicated port (default: "
"IMAPS=993, POP3S=995)"
msgstr ""
-"الإتصالات مشفرة بـ SSL/TLS من خلال منفذ مخصص (افتراضياً: IMPAS=993 "
+"الإتصالات مشفرة بـ SSL/TLS من خلال منفذ مخصص (افتراضيًا: IMPAS=993 "
",POP35=995 )"
#. module: fetchmail
@@ -91,17 +92,17 @@ msgstr "أنشئ في"
#. module: fetchmail
#: model:ir.model.fields,help:fetchmail.field_fetchmail_server__priority
msgid "Defines the order of processing, lower values mean higher priority"
-msgstr "تحديد ترتيب المعالجة, القيم الأقل تعني أولوية أعلى"
+msgstr "تحديد ترتيب عمليات المعالجة, القيم الأقل تعني أولوية أعلى"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_tree
msgid "Email Count"
-msgstr ""
+msgstr "عدد الرسائل"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
@@ -111,7 +112,7 @@ msgstr "جلب الآن"
#. module: fetchmail
#: model:ir.model.fields,help:fetchmail.field_fetchmail_server__server
msgid "Hostname or IP of the mail server"
-msgstr "اسم الجهاز أو رقم الآي بي لخادم البريد"
+msgstr "اسم الجهاز أو رقم IP سيرفر البريد"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__id
@@ -126,44 +127,44 @@ msgstr "بروتوكول IMAP"
#. module: fetchmail
#: selection:fetchmail.server,type:0
msgid "IMAP Server"
-msgstr "خادم IMAP"
+msgstr "سيرفر IMAP"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search
msgid "If SSL required."
-msgstr "إذا SSL مطلوبة."
+msgstr "إذا كانت SSL مطلوبة."
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_mail_mail__fetchmail_server_id
msgid "Inbound Mail Server"
-msgstr "خادم البريد الوارد"
+msgstr "سيرفر البريد الوارد"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.res_config_settings_view_form
msgid "Incoming Email Servers"
-msgstr ""
+msgstr "سيرفرات الرسائل الواردة"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search
msgid "Incoming Mail Server"
-msgstr "خادم الرسائل الواردة"
+msgstr "سيرفر البريد الوارد"
#. module: fetchmail
#: model:ir.actions.act_window,name:fetchmail.action_email_server_tree
#: model:ir.ui.menu,name:fetchmail.menu_action_fetchmail_server_tree
msgid "Incoming Mail Servers"
-msgstr "خوادم الرسائل الواردة"
+msgstr "سيرفرات البريد الوارد"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__attach
msgid "Keep Attachments"
-msgstr "حفظ المرفقات"
+msgstr "الاحتفاظ بالمرفقات"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__original
msgid "Keep Original"
-msgstr "حفظ الأصل"
+msgstr "الاحتفاظ بالأصل"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__date
@@ -188,19 +189,19 @@ msgstr "آخر تحديث في"
#. module: fetchmail
#: selection:fetchmail.server,type:0
msgid "Local Server"
-msgstr "الخادم المحلي"
+msgstr "السيرفر المحلي"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
msgid "Login Information"
-msgstr "معلومات تسجيل الدخول"
+msgstr "بيانات تسجيل الدخول"
#. module: fetchmail
#: model:ir.actions.server,name:fetchmail.ir_cron_mail_gateway_action_ir_actions_server
#: model:ir.cron,cron_name:fetchmail.ir_cron_mail_gateway_action
#: model:ir.cron,name:fetchmail.ir_cron_mail_gateway_action
msgid "Mail: Fetchmail Service"
-msgstr ""
+msgstr "البريد: خدمة جلب الرسائل"
#. module: fetchmail
#: model:ir.actions.act_window,name:fetchmail.act_server_history
@@ -221,7 +222,7 @@ msgstr "غير مؤكد"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.res_config_settings_view_form
msgid "Outgoing Email Servers"
-msgstr ""
+msgstr "سيرفرات الرسائل الصادرة"
#. module: fetchmail
#: model:ir.model,name:fetchmail.model_mail_mail
@@ -236,17 +237,17 @@ msgstr "بروتوكول POP"
#. module: fetchmail
#: selection:fetchmail.server,type:0
msgid "POP Server"
-msgstr "خادم POP"
+msgstr "سيرفر POP"
#. module: fetchmail
#: model:ir.model,name:fetchmail.model_fetchmail_server
msgid "POP/IMAP Server"
-msgstr "خادم POP/IMAP"
+msgstr "سيرفر POP/IMAP"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_tree
msgid "POP/IMAP Servers"
-msgstr "خوادم POP/IMAP"
+msgstr "سيرفات POP/IMAP"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__password
@@ -265,9 +266,9 @@ msgid ""
"document type. This will create new documents for new conversations, or "
"attach follow-up emails to the existing conversations (documents)."
msgstr ""
-"معالجة كل الرسائل الواردة كجزء من المحادثة وفقاً لنوع المستند. هذا سوف ينشأ "
-"مستندات جديدة لمحادثات جديدة، أو إرفاق رسائل بريد المتابعة الإلكترونية "
-"للمحادثات الموجودة (مستندات)."
+"معالجة كل الرسائل الواردة كجزء من المحادثة وفقًا لنوع هذا المستند. سوف ينشأ "
+"هذا مستندات جديدة لمحادثات جديدة، أو إرفاق رسائل بريد المتابعة الإلكترونية "
+"بالمحادثات (المستندات) الموجودة."
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
@@ -292,42 +293,42 @@ msgstr "نص برمجي"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search
msgid "Search Incoming Mail Servers"
-msgstr "بحث خاودم البريد الوارد"
+msgstr "بحث سيرفرات البريد الوارد"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
msgid "Server & Login"
-msgstr "الخادم و تسجيل الدخول"
+msgstr "السيرفر وتسجيل الدخول"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form
msgid "Server Information"
-msgstr "معلومات الخادم"
+msgstr "معلومات السيرفر"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__server
msgid "Server Name"
-msgstr "اسم الخادم"
+msgstr "اسم السيرفر"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__priority
msgid "Server Priority"
-msgstr "أولوية الخادم"
+msgstr "أولوية السيرفر"
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__type
msgid "Server Type"
-msgstr "نوع الخادم"
+msgstr "نوع السيرفر"
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search
msgid "Server type IMAP."
-msgstr "نوع خادم IMAP."
+msgstr "نوع سيرفر IMAP."
#. module: fetchmail
#: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search
msgid "Server type POP."
-msgstr "نوع خادم POP."
+msgstr "نوع سيرفر POP."
#. module: fetchmail
#: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__state
@@ -351,8 +352,8 @@ msgid ""
"attached to each processed message. This will usually double the size of "
"your message database."
msgstr ""
-"إذا كان يتوجب الاحتفاظ بنسخة اصلية كاملة من كل رسائل البريد كمرجع وارفاقها "
-"بكل الرسائل التي يم معالجتها. سيضاعف هذا عادة حجم الرسالة في قاعدة البيانات."
+"ما إن كان ينبغي الاحتفاظ بنسخة أصلية كاملة من كل رسائل البريد كمرجع وإرفاقها"
+" بكل الرسائل التي يتم معالجتها. عادةً، سيضاعف هذا حجم قاعدة بيانات رسائلك."
#. module: fetchmail
#: model:ir.model.fields,help:fetchmail.field_fetchmail_server__attach
@@ -360,5 +361,5 @@ msgid ""
"Whether attachments should be downloaded. If not enabled, incoming emails "
"will be stripped of any attachments before being processed"
msgstr ""
-"إذا كان يتوجب تنزيل المرفقات. إن لم تكن ممكنة، فإن الرسائل المستقبلة سوف يتم"
-" تجريدها من اي مرفقات قبل معالجتها"
+"ما إن كان ينبغي تحميل المرفقات. إن لم تكن مفعلة، سيتم تجريد الرسائل الواردة "
+"من أية مرفقات قبل معالجتها"
diff --git a/addons/fleet/i18n/km.po b/addons/fleet/i18n/km.po
index 78e7615a996..6d73c1d4af4 100644
--- a/addons/fleet/i18n/km.po
+++ b/addons/fleet/i18n/km.po
@@ -1068,7 +1068,7 @@ msgstr ""
#. module: fleet
#: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_log_contract_view_form
msgid "Invoice Date"
-msgstr ""
+msgstr "កាលបរិច្ចេទវិកយបត្រ"
#. module: fleet
#: model:ir.model.fields,field_description:fleet.field_fleet_vehicle_log_fuel__inv_ref
@@ -1840,7 +1840,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_log_contract_view_search
#: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_view_search
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: fleet
#: model:ir.model.fields,field_description:fleet.field_fleet_vehicle_model_brand__image_small
diff --git a/addons/fleet/views/fleet_vehicle_cost_views.xml b/addons/fleet/views/fleet_vehicle_cost_views.xml
index 88a1863c534..226c2baa744 100644
--- a/addons/fleet/views/fleet_vehicle_cost_views.xml
+++ b/addons/fleet/views/fleet_vehicle_cost_views.xml
@@ -212,7 +212,7 @@
<group>
<field name="date" string="Invoice Date"/>
<field name="start_date"/>
- <field name="expiration_date"/>
+ <field name="expiration_date" attrs="{'required': [('cost_frequency', '!=', 'no')]}"/>
</group>
</group>
<notebook>
diff --git a/addons/gamification/i18n/cs.po b/addons/gamification/i18n/cs.po
index 6f37d037a24..c032b348152 100644
--- a/addons/gamification/i18n/cs.po
+++ b/addons/gamification/i18n/cs.po
@@ -153,6 +153,8 @@ msgid ""
"<br/>Nobody has succeeded to reach every goal, no badge is rewarded for this"
" challenge."
msgstr ""
+"<br/>Nikomu se nepodařilo dosáhnout jakéhokoliv cíle, za tuto výzvu není "
+"odměněn žádný odznak."
#. module: gamification
#: code:addons/gamification/models/challenge.py:655
@@ -189,6 +191,8 @@ msgid ""
"<span class=\"o_stat_text\">Related</span>\n"
" <span class=\"o_stat_text\">Goals</span>"
msgstr ""
+"<span class=\"o_stat_text\">Související</span>\n"
+" <span class=\"o_stat_text\">Cíle</span>"
#. module: gamification
#: model:mail.template,body_html:gamification.simple_report_template
@@ -398,6 +402,9 @@ msgid ""
" It can be deserved automatically when some conditions are met or manually by users.\n"
" Some badges are harder than others to get with specific conditions."
msgstr ""
+"Odznak je symbol udělený uživateli jako znak odměny.\n"
+"To může být zaslouženo automaticky, když jsou splněny některé podmínky, nebo ručně uživateli.\n"
+"Některé odznaky je těžší získat než jiné v závislosti na specifickýxch podmákách."
#. module: gamification
#: model_terms:ir.actions.act_window,help:gamification.goal_definition_list_action
@@ -405,6 +412,8 @@ msgid ""
"A goal definition is a technical model of goal defining a condition to reach.\n"
" The dates, values to reach or users are defined in goal instance."
msgstr ""
+"Definice cíle je technický model cíle, který definuje podmínku pro dosažení cíle.\n"
+"Data, hodnoty k dosažení nebo uživatelé jsou definováni v instanci cíle."
#. module: gamification
#: model:ir.model.fields,help:gamification.field_gamification_challenge_line__condition
@@ -414,6 +423,8 @@ msgid ""
"A goal is considered as completed when the current value is compared to the "
"value to reach"
msgstr ""
+"Cíl je považován za dokončený, když je aktuální hodnota porovnána s "
+"hodnotou, která má být dosažena"
#. module: gamification
#: model_terms:ir.actions.act_window,help:gamification.goal_list_action
@@ -421,6 +432,8 @@ msgid ""
"A goal is defined by a user and a goal definition.\n"
" Goals can be created automatically by using challenges."
msgstr ""
+"Cíl je definován uživatelem a definicí cíle.\n"
+"Cíle lze vytvářet automaticky pomocí výzev."
#. module: gamification
#: selection:gamification.badge,rule_auth:0
@@ -972,7 +985,7 @@ msgstr ""
#. module: gamification
#: model:ir.model,name:gamification.model_gamification_badge_user_wizard
msgid "Gamification User Badge Wizard"
-msgstr ""
+msgstr "Průvodce odznakem uživatele Gamifikace"
#. module: gamification
#: model:ir.model,name:gamification.model_gamification_challenge_line
diff --git a/addons/gamification/models/gamification_karma_rank.py b/addons/gamification/models/gamification_karma_rank.py
index cbbe7bf19d1..f88712f3c44 100644
--- a/addons/gamification/models/gamification_karma_rank.py
+++ b/addons/gamification/models/gamification_karma_rank.py
@@ -55,8 +55,19 @@ class KarmaRank(models.Model):
return res
def write(self, vals):
+ if 'karma_min' in vals:
+ previous_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids
+ low = min(vals['karma_min'], self.karma_min)
+ high = max(vals['karma_min'], self.karma_min)
+
tools.image_resize_images(vals)
res = super(KarmaRank, self).write(vals)
- users = self.env['res.users'].sudo().search([('karma', '>', 0)])
- users._recompute_rank()
+
+ if 'karma_min' in vals:
+ after_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids
+ if previous_ranks != after_ranks:
+ users = self.env['res.users'].sudo().search([('karma', '>', 0)])
+ else:
+ users = self.env['res.users'].sudo().search([('karma', '>=', low), ('karma', '<=', high)])
+ users._recompute_rank()
return res
diff --git a/addons/gamification/models/res_users.py b/addons/gamification/models/res_users.py
index e262eec4a8e..3e8b6d8e1cd 100644
--- a/addons/gamification/models/res_users.py
+++ b/addons/gamification/models/res_users.py
@@ -7,9 +7,11 @@ import logging
_logger = logging.getLogger(__name__)
+
class Users(models.Model):
_inherit = 'res.users'
+
karma = fields.Integer('Karma', default=0)
badge_ids = fields.One2many('gamification.badge.user', 'user_id', string='Badges', copy=False)
gold_badge = fields.Integer('Gold badges count', compute="_get_user_badge_level")
@@ -59,18 +61,32 @@ class Users(models.Model):
return True
def _rank_changed(self):
- if self.rank_id.karma_min > 0:
- template = self.env.ref('gamification.mail_template_data_new_rank_reached', raise_if_not_found=False)
- if template:
- template.send_mail(self.id, force_send=True, notif_layout='mail.mail_notification_light')
+ """
+ Method that can be called on a batch of users with the same new rank
+ """
+ template = self.env.ref('gamification.mail_template_data_new_rank_reached', raise_if_not_found=False)
+ if template:
+ for u in self:
+ if u.rank_id.karma_min > 0:
+ template.send_mail(u.id, force_send=len(self) == 1, notif_layout='mail.mail_notification_light')
def _recompute_rank(self):
"""
The caller should filter the users on karma > 0 before calling this method
to avoid looping on every single users
+
+ Compute rank of each user by user.
+ For each user, check the rank of this user
"""
+
ranks = [{'rank': rank, 'karma_min': rank.karma_min} for rank in
self.env['gamification.karma.rank'].search([], order="karma_min DESC")]
+
+ # 3 is the number of search/requests used by rank in _recompute_rank_bulk()
+ if len(self) > len(ranks) * 3:
+ self._recompute_rank_bulk()
+ return
+
for user in self:
old_rank = user.rank_id
if user.karma == 0 and ranks:
@@ -86,6 +102,66 @@ class Users(models.Model):
if old_rank != user.rank_id:
user._rank_changed()
+ def _recompute_rank_bulk(self):
+ """
+ Compute rank of each user by rank.
+ For each rank, check which users need to be ranked
+
+ """
+ ranks = [{'rank': rank, 'karma_min': rank.karma_min} for rank in
+ self.env['gamification.karma.rank'].search([], order="karma_min DESC")]
+
+ users_todo = self
+
+ next_rank_id = False
+ # wtf, next_rank_id should be a related on rank_id.next_rank_id and life might get easier.
+ # And we only need to recompute next_rank_id on write with min_karma or in the create on rank model.
+ for r in ranks:
+ rank_id = r['rank'].id
+ dom = [
+ ('karma', '>=', r['karma_min']),
+ ('id', 'in', users_todo.ids),
+ '|', # noqa
+ '|', ('rank_id', '!=', rank_id), ('rank_id', '=', False),
+ '|', ('next_rank_id', '!=', next_rank_id), ('next_rank_id', '=', False if next_rank_id else -1),
+ ]
+ users = self.env['res.users'].search(dom)
+ if users:
+ users_to_notify = self.env['res.users'].search([
+ ('karma', '>=', r['karma_min']),
+ '|', ('rank_id', '!=', rank_id), ('rank_id', '=', False),
+ ('id', 'in', users.ids),
+ ])
+ users.write({
+ 'rank_id': rank_id,
+ 'next_rank_id': next_rank_id,
+ })
+ users_to_notify._rank_changed()
+ users_todo -= users
+
+ nothing_to_do_users = self.env['res.users'].search([
+ ('karma', '>=', r['karma_min']),
+ '|', ('rank_id', '=', rank_id), ('next_rank_id', '=', next_rank_id),
+ ('id', 'in', users_todo.ids),
+ ])
+ users_todo -= nothing_to_do_users
+ next_rank_id = r['rank'].id
+
+ if ranks:
+ lower_rank = ranks[-1]['rank']
+ users = self.env['res.users'].search([
+ ('karma', '>=', 0),
+ ('karma', '<', lower_rank.karma_min),
+ '|', ('rank_id', '!=', False), ('next_rank_id', '!=', lower_rank.id),
+ ('id', 'in', users_todo.ids),
+ ])
+ if users:
+ users.write({
+ 'rank_id': False,
+ 'next_rank_id': lower_rank.id,
+ })
+
+
def _get_next_rank(self):
""" For fresh users with 0 karma that don't have a rank_id and next_rank_id yet
this method returns the first karma rank (by karma ascending). This acts as a
diff --git a/addons/gamification/tests/__init__.py b/addons/gamification/tests/__init__.py
index 0219f6754d0..a6a599bf6c8 100644
--- a/addons/gamification/tests/__init__.py
+++ b/addons/gamification/tests/__init__.py
@@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_challenge
+from . import test_recompute_rank
diff --git a/addons/gamification/tests/test_recompute_rank.py b/addons/gamification/tests/test_recompute_rank.py
new file mode 100644
index 00000000000..c82fb4759fd
--- /dev/null
+++ b/addons/gamification/tests/test_recompute_rank.py
@@ -0,0 +1,128 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.tests import common
+from unittest.mock import patch
+
+
+class TestComputeRankCommon(common.TransactionCase):
+
+ def setUp(self):
+ super(TestComputeRankCommon, self).setUp()
+
+ def _patched_send_mail(*args, **kwargs):
+ pass
+
+ self.User = self.env['res.users'].with_context(no_reset_password=True, mail_create_nosubscribe=True)
+ self.users = self.User
+
+ patch_email = patch('odoo.addons.mail.models.mail_template.MailTemplate.send_mail', _patched_send_mail)
+ patch_email.start()
+ for k in range(-5, 1030, 30):
+ self.users += self.User.create({
+ 'name': str(k),
+ 'login': "test_recompute_rank_%s" % k,
+ 'karma': k,
+ })
+
+ self.env['gamification.karma.rank'].search([]).unlink()
+
+ self.rank_1 = self.env['gamification.karma.rank'].create({
+ 'name': 'rank 1',
+ 'karma_min': 0,
+ })
+
+ self.rank_2 = self.env['gamification.karma.rank'].create({
+ 'name': 'rank 2',
+ 'karma_min': 250,
+ })
+
+ self.rank_3 = self.env['gamification.karma.rank'].create({
+ 'name': 'rank 3',
+ 'karma_min': 500,
+ })
+ self.rank_4 = self.env['gamification.karma.rank'].create({
+ 'name': 'rank 4',
+ 'karma_min': 1000,
+ })
+
+ patch_email.stop()
+
+
+class test_recompute(TestComputeRankCommon):
+
+ def test_00_initial_compute(self):
+
+ self.assertEqual(len(self.users), 35)
+
+ self.assertEqual(
+ len(self.rank_1.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_1.karma_min and u.karma < self.rank_2.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_2.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_2.karma_min and u.karma < self.rank_3.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_3.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_3.karma_min and u.karma < self.rank_4.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_4.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_4.karma_min])
+ )
+
+ def test_01_switch_rank(self):
+
+ self.assertEqual(len(self.users), 35)
+
+ self.rank_3.karma_min = 100
+ # rank_1 -> rank_3 -> rank_2 -> rank_4
+
+ self.assertEqual(
+ len(self.rank_1.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_1.karma_min and u.karma < self.rank_3.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_3.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_3.karma_min and u.karma < self.rank_2.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_2.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_2.karma_min and u.karma < self.rank_4.karma_min])
+ )
+ self.assertEqual(
+ len(self.rank_4.user_ids & self.users),
+ len([u for u in self.users if u.karma >= self.rank_4.karma_min])
+ )
+
+ def test_02_update_rank_without_switch(self):
+ number_of_users = False
+
+ def _patched_recompute_rank(_self, *args, **kwargs):
+ nonlocal number_of_users
+ number_of_users = len(_self & self.users)
+
+ patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank', _patched_recompute_rank)
+ patch_bulk.start()
+ self.rank_3.karma_min = 700
+ self.assertEqual(number_of_users, 7, "Should just recompute for the 7 users between 500 and 700")
+ patch_bulk.stop()
+
+ def test_03_test_bulk_call(self):
+ self.assertEqual(len(self.users), 35)
+
+ def _patched_check_in_bulk(*args, **kwargs):
+ raise
+
+ patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank_bulk', _patched_check_in_bulk)
+ patch_bulk.start()
+
+ # call on 5 users should not trigger the bulk function
+ self.users[0:5]._recompute_rank()
+
+ # call on 50 users should trigger the bulk function
+ with self.assertRaises(Exception):
+ self.users[0:50]._recompute_rank()
+
+ patch_bulk.stop()
diff --git a/addons/google_calendar/i18n/ar.po b/addons/google_calendar/i18n/ar.po
index f1bff040aed..0e501e1013f 100644
--- a/addons/google_calendar/i18n/ar.po
+++ b/addons/google_calendar/i18n/ar.po
@@ -7,7 +7,6 @@
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Martin Trigaux, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
-# Osoul <baruni@osoul.ly>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Ahmed AL-Haddad <ahmed@utech-sa.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
@@ -45,7 +44,7 @@ msgstr "الحسابات"
msgid ""
"All events have been disconnected from your previous account. You can now "
"restart the synchronization"
-msgstr ""
+msgstr "تم فصل كافة الفعاليات عن حسابك السابق. يمكنك الآن إعادة بدء المزامنة"
#. module: google_calendar
#. openerp-web
@@ -55,6 +54,7 @@ msgid ""
"An administrator needs to configure Google Synchronization before you can "
"use it!"
msgstr ""
+"يجب أن يقوم أحد المشرفين بإعداد مزامنة جوجل قبل أن تتمكن من استخدامها!"
#. module: google_calendar
#. openerp-web
@@ -64,6 +64,8 @@ msgid ""
"An error occured while disconnecting events from your previous account. "
"Please retry or contact your administrator."
msgstr ""
+"حدث خطأ أثناء فصل الفعاليات عن حسابك السابق. برجاء إعادة المحاولة أو التواصل"
+" مع المشرف."
#. module: google_calendar
#: model_terms:ir.ui.view,arch_db:google_calendar.view_users_form
@@ -93,12 +95,12 @@ msgstr "سرية العميل"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__cal_client_id
msgid "Client_id"
-msgstr "رقم العميل"
+msgstr "Client_id"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__cal_client_secret
msgid "Client_key"
-msgstr ""
+msgstr "Client_key"
#. module: google_calendar
#: model:ir.model,name:google_calendar.model_res_config_settings
@@ -116,7 +118,7 @@ msgstr "الإعدادات"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_google_calendar__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: google_calendar
#. openerp-web
@@ -135,36 +137,36 @@ msgstr "الحدث"
#: code:addons/google_calendar/static/src/js/google_calendar.js:84
#, python-format
msgid "Event disconnection error"
-msgstr ""
+msgstr "خطأ في فصل الفعالية"
#. module: google_calendar
#. openerp-web
#: code:addons/google_calendar/static/src/js/google_calendar.js:80
#, python-format
msgid "Event disconnection success"
-msgstr ""
+msgstr "نجاح فصل الفعالية"
#. module: google_calendar
#: model:ir.model,name:google_calendar.model_google_calendar
msgid "Google Calendar"
-msgstr "تقويم غوغل"
+msgstr "تقويم جوجل"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_calendar_attendee__google_internal_event_id
msgid "Google Calendar Event Id"
-msgstr ""
+msgstr "معرف فعالية تقويم جوجل"
#. module: google_calendar
#: model:ir.actions.server,name:google_calendar.ir_cron_sync_all_cals_ir_actions_server
#: model:ir.cron,cron_name:google_calendar.ir_cron_sync_all_cals
#: model:ir.cron,name:google_calendar.ir_cron_sync_all_cals
msgid "Google Calendar: synchronization"
-msgstr ""
+msgstr "تقويم جوجل: المزامنة"
#. module: google_calendar
#: sql_constraint:calendar.attendee:0
msgid "Google ID should be unique!"
-msgstr ""
+msgstr "يجب أن يكون معرف جوجل فريدًا!"
#. module: google_calendar
#: code:addons/google_calendar/models/google_calendar.py:688
@@ -174,6 +176,9 @@ msgid ""
"\n"
" %s"
msgstr ""
+"فقدت الاتصال بجوجل... المزامنة القادمة ستكون مزامنة كاملة. \n"
+"\n"
+" %s"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_google_calendar__id
@@ -188,6 +193,7 @@ msgid ""
"In order to do this, you first need to disconnect all existing events from "
"the old account."
msgstr ""
+"لتتمكن من فعل هذا، عليك أولًا فصل كافة الفعاليات الموجودة من حسابك القديم."
#. module: google_calendar
#: model:ir.model.fields,help:google_calendar.field_res_users__google_calendar_cal_id
@@ -195,6 +201,8 @@ msgid ""
"Last Calendar ID who has been synchronized. If it is changed, we remove all "
"links between GoogleID and Odoo Google Internal ID"
msgstr ""
+"معرف آخر تقويم تمت مزامنته. إذا تغير، نزيل كافة الروابط بين GoogleID والمعرف"
+" الداخلي ما بين جوجل وأودو"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_google_calendar____last_update
@@ -204,12 +212,12 @@ msgstr "آخر تعديل في"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_last_sync_date
msgid "Last synchro date"
-msgstr ""
+msgstr "تاريخ آخر مزامنة"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_calendar_attendee__oe_synchro_date
msgid "Odoo Synchro Date"
-msgstr "تاريخ تزامن أودو"
+msgstr "تاريخ مزامنة أودو"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_calendar_event__oe_update_date
@@ -233,7 +241,7 @@ msgstr "تحديث الرمز"
#: code:addons/google_calendar/static/src/js/google_calendar.js:117
#, python-format
msgid "Sync with <b>Google</b>"
-msgstr ""
+msgstr "المزامنة مع <b>جوجل</b>"
#. module: google_calendar
#. openerp-web
@@ -243,6 +251,7 @@ msgid ""
"The Google Synchronization needs to be configured before you can use it, do "
"you want to do it now?"
msgstr ""
+"يجب إعداد مزامنة جوجل قبل أن تتمكن من استخدامها، هل تريد فعل هذا الآن؟"
#. module: google_calendar
#. openerp-web
@@ -251,17 +260,17 @@ msgstr ""
msgid ""
"The account you are trying to synchronize (%s) is not the same as the last "
"one used (%s)!"
-msgstr ""
+msgstr "الحساب الذي تحاول مزامنته (%s) مختلف عن آخر حساب استخدمته (%s)!"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_token_validity
msgid "Token Validity"
-msgstr ""
+msgstr "صلاحية كلمة السر"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__server_uri
msgid "URI for tuto"
-msgstr ""
+msgstr "رابط الدرس التدريبي"
#. module: google_calendar
#: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_token
@@ -278,10 +287,10 @@ msgstr "المستخدمون"
#: code:addons/google_calendar/static/src/js/google_calendar.js:42
#, python-format
msgid "You will be redirected to Google to authorize access to your calendar!"
-msgstr ""
+msgstr "سيتم إعادة توجيهك لجوجل للحصول على إذن الوصول لتقويمك!"
#. module: google_calendar
#: code:addons/google_calendar/models/google_calendar.py:296
#, python-format
msgid "Your token is invalid or has been revoked !"
-msgstr ""
+msgstr "كلمة السر غير صالحة أو تم إلغاءها!"
diff --git a/addons/google_drive/i18n/ar.po b/addons/google_drive/i18n/ar.po
index d3560a60135..2e1c1005ed4 100644
--- a/addons/google_drive/i18n/ar.po
+++ b/addons/google_drive/i18n/ar.po
@@ -7,8 +7,6 @@
# Mosaab Alzoubi <moceap@hotmail.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
-# Osoul <baruni@osoul.ly>, 2018
-# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Zuhair Hammadi <zuhair12@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
@@ -38,21 +36,27 @@ msgid ""
" - If you don't select \"Share with all users\", link of google document in \"More\" options will not appear for other users in opportunities of Sales Department.<br/>\n"
" - If filter is not specified, link of google document will appear in \"More\" option for all users for all opportunities."
msgstr ""
+"<b> لإنشاء فلتر جديد: </b> <br/>\n"
+" - افتح مستند أودو الذي تريد تطبيق الفلتر عليه. مثلًا: انتقل إلى الفرص وابحث في قسم المبيعات.<br/>\n"
+" - في واجهة العرض \"بحث\"، اختر الخيار \"حفظ الفلتر الحالي\"، وأدخل اسمًا (مثلًا: قسم المبيعات)<br/>\n"
+" - إذا اخترت \"مشاركة مع كافة المستخدمين\"، سيظهر رابط مستند جوجل في خيارات \"المزيد\" لكافة المستخدمين في فرص قسم المبيعات.<br/>\n"
+" - إذا لم تختر \"مشاركة مع كافة المستخدمين\"، فلن يظهر رابط مستند جوجل في خيارات \"المزيد\" للمستخدمين الآخرين في فرص قسم المبيعات.<br/>\n"
+" - إذا لم يتم تحديد الفلتر، سيظهر رابط مستند جوجل خيار \"المزيد\" لكافة المستخدمين بكافة الفرص."
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban
msgid "<strong>Active</strong>"
-msgstr ""
+msgstr "<strong>نشط</strong>"
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban
msgid "<strong>Model</strong>"
-msgstr ""
+msgstr "<strong>كائن</strong>"
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban
msgid "<strong>Template</strong>"
-msgstr ""
+msgstr "<strong>قالب</strong>"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__active
@@ -62,13 +66,13 @@ msgstr "نشط"
#. module: google_drive
#: model_terms:ir.actions.act_window,help:google_drive.action_google_drive_users_config
msgid "Add a new template"
-msgstr ""
+msgstr "إضافة قالب جديد"
#. module: google_drive
#: code:addons/google_drive/models/google_drive.py:42
#, python-format
msgid "At least one key cannot be found in your Google Drive name pattern."
-msgstr ""
+msgstr "تعذّر العثور علي مفتاح واحد علي الأقل في نمط اسم جوجل درايف."
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_res_config_settings__google_drive_authorization_code
@@ -81,6 +85,7 @@ msgid ""
"Choose how the new google drive will be named, on google side. Eg. "
"gdoc_%(field_name)s"
msgstr ""
+"اختر كيفية تسمية جوجل درايف الجديد، من ناحية جوجل. مثال: gdoc_%(field_name)s"
#. module: google_drive
#: model:ir.model,name:google_drive.model_res_config_settings
@@ -101,7 +106,7 @@ msgstr "أنشئ في"
#: code:addons/google_drive/models/google_drive.py:161
#, python-format
msgid "Creating google drive may only be done by one at a time."
-msgstr ""
+msgstr "يتم إنشاء جوجل درايف مرة واحدة فقط."
#. module: google_drive
#: model:ir.filters,name:google_drive.filter_partner
@@ -111,12 +116,12 @@ msgstr "العميل"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__filter_id
msgid "Filter"
-msgstr "الفرز"
+msgstr "فلتر"
#. module: google_drive
#: code:addons/google_drive/models/google_drive.py:61
@@ -128,30 +133,30 @@ msgstr "انتقل إلى لوحة الإعدادات"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_client_id
msgid "Google Client"
-msgstr "عميل غوغل"
+msgstr "عميل جوجل"
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_form
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_tree
msgid "Google Drive Configuration"
-msgstr " اعدادات سواقة غوغل"
+msgstr "إعدادات جوجل درايف"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__name_template
msgid "Google Drive Name Pattern"
-msgstr ""
+msgstr "نمط اسم جوجل درايف"
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.res_config_settings_view_form
msgid "Google Drive Templates"
-msgstr ""
+msgstr "قوالب جوجل درايف"
#. module: google_drive
#: code:addons/google_drive/models/google_drive.py:63
#: code:addons/google_drive/models/google_drive.py:84
#, python-format
msgid "Google Drive is not yet configured. Please contact your administrator."
-msgstr ""
+msgstr "لم يتم إعداد جوجل درايف بعد. برجاء التوصل مع مشرفك."
#. module: google_drive
#: model:ir.model,name:google_drive.model_google_drive_config
@@ -187,6 +192,10 @@ msgid ""
"checklist for each order in a foreign country, ... Its very easy to manage "
"them, link them to Odoo and use them to collaborate with your employees."
msgstr ""
+"اربط قوالب جوجل درايف الخاصة بك بأي سجل في أودو. إذا كان لديك مستندات معينة "
+"تريد أن يملأها المتعاون، مثلًا: استخدم الجداول الممتدة للتحكم في جودة منتجك "
+"أو لمراجعة قوائم الفحص لكل الأوامر الصادرة من دول أجنبية، من السهل إدارتهم، "
+"وربطهم بأودو واستخدامهم للتعاون مع موظفيك."
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__model_id
@@ -197,12 +206,12 @@ msgstr "النموذج"
#: code:addons/google_drive/models/google_drive.py:203
#, python-format
msgid "Please enter a valid Google Document URL."
-msgstr ""
+msgstr "برجاء إدخال رابط صالح لمستند جوجل."
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__model
msgid "Related Model"
-msgstr ""
+msgstr "الكائن ذو الصلة"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_resource_id
@@ -215,7 +224,7 @@ msgstr "هوية المصدر"
msgid ""
"Something went wrong during the token generation. Please request again an "
"authorization code ."
-msgstr ""
+msgstr "حدث خطأ أثناء إنشاء كلمة السر. الرجاء طلب رمز ترخيص مرة أخرى."
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__name
@@ -236,7 +245,7 @@ msgstr "قوالب"
#: code:addons/google_drive/models/google_drive.py:99
#, python-format
msgid "The Google Template cannot be found. Maybe it has been deleted."
-msgstr "قالب غوغل لم يوجد. لربما حذف."
+msgstr "تعذّر إيجاد قالب جوجل. ربما يكون حُذف."
#. module: google_drive
#: model:ir.model.fields,help:google_drive.field_res_config_settings__google_drive_uri
@@ -251,6 +260,10 @@ msgid ""
" in the Google Drive name field, the document in your Google Drive and in Odoo attachment will be named\n"
" 'Deco_Addict_SO0001_Sales'."
msgstr ""
+"يمكن لاسم المستند المرفق استخدام بيانات ثابتة أو متغيرة. للتمييز بين المستندات في\n"
+" جوجل درايف، استخدم الكلمات والحقول الثابتة. فمثلًا، في المثال أعلاه، إذا كتبت Deco_Addict_%(name)s_Sales\n"
+" في حقل اسم جوجل درايف، سيكون اسم المستند في جوجل درايف وفي مرفق أودو\n"
+" 'Deco_Addict_SO0001_Sales'."
#. module: google_drive
#: code:addons/google_drive/models/google_drive.py:135
@@ -258,7 +271,7 @@ msgstr ""
msgid ""
"The permission 'reader' for 'anyone with the link' has not been written on "
"the document"
-msgstr ""
+msgstr "لم يُمنح الإذن 'قارئ' لـ'أي شخص يملك الرابط' بهذا المستند"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_res_config_settings__google_drive_uri
@@ -272,6 +285,7 @@ msgid ""
"You haven't configured 'Authorization Code' generated from google, Please "
"generate and configure it ."
msgstr ""
+"لم تقم بإعداد 'رمز الترخيص' الذي تم إنشاؤه من جوجل، الرجاء إنشاءه وإعداده."
#. module: google_drive
#: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_form
diff --git a/addons/google_drive/i18n/km.po b/addons/google_drive/i18n/km.po
index 56fe74bec40..06471e392fd 100644
--- a/addons/google_drive/i18n/km.po
+++ b/addons/google_drive/i18n/km.po
@@ -114,7 +114,7 @@ msgstr ""
#: code:addons/google_drive/models/google_drive.py:82
#, python-format
msgid "Go to the configuration panel"
-msgstr ""
+msgstr "ចូលទៅផ្ទាំងការតំឡើង"
#. module: google_drive
#: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_client_id
diff --git a/addons/hr/i18n/km.po b/addons/hr/i18n/km.po
index 97ffc8d7d64..aab3840d85c 100644
--- a/addons/hr/i18n/km.po
+++ b/addons/hr/i18n/km.po
@@ -179,7 +179,7 @@ msgstr ""
#. module: hr
#: model:ir.model.fields,field_description:hr.field_mail_alias__alias_contact
msgid "Alias Contact Security"
-msgstr ""
+msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន"
#. module: hr
#: model_terms:hr.job,website_description:hr.job_consultant
diff --git a/addons/hr_attendance/i18n/cs.po b/addons/hr_attendance/i18n/cs.po
index 36855ef34dc..b621383798a 100644
--- a/addons/hr_attendance/i18n/cs.po
+++ b/addons/hr_attendance/i18n/cs.po
@@ -181,7 +181,7 @@ msgstr ""
#. module: hr_attendance
#: model_terms:ir.ui.view,arch_db:hr_attendance.hr_attendance_view_filter
msgid "Check Out Date"
-msgstr ""
+msgstr "Zkontrolovat datum"
#. module: hr_attendance
#: model_terms:ir.ui.view,arch_db:hr_attendance.res_config_settings_view_form
diff --git a/addons/hr_expense/i18n/km.po b/addons/hr_expense/i18n/km.po
index 137e7180019..e168829babb 100644
--- a/addons/hr_expense/i18n/km.po
+++ b/addons/hr_expense/i18n/km.po
@@ -691,7 +691,7 @@ msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__hide_payment_method
msgid "Hide Payment Method"
-msgstr ""
+msgstr "លាក់វិធីសាស្ត្រទូទាត់"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__hr_expense_ids
@@ -1044,7 +1044,7 @@ msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__payment_method_id
msgid "Payment Type"
-msgstr ""
+msgstr "ប្រភេទការទូទាត់"
#. module: hr_expense
#: selection:hr.expense,activity_state:0
@@ -1063,7 +1063,7 @@ msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_sheet_form
msgid "Post Journal Entries"
-msgstr ""
+msgstr "បង្ហាញធាតុទិន្នានុប្បវតិ"
#. module: hr_expense
#: selection:hr.expense.sheet,state:0
@@ -1135,6 +1135,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet
msgid "Ref."
msgstr ""
+"សេចក្តីយោង\n"
+" \n"
+" "
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
@@ -1236,13 +1239,13 @@ msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__show_partner_bank_account
msgid "Show Partner Bank Account"
-msgstr ""
+msgstr "បង្ហាញគណនីធនាគារដៃគូ"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_sheet_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_product_template__can_be_expensed
@@ -1294,7 +1297,7 @@ msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__untaxed_amount
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__tax_ids
diff --git a/addons/hr_expense/i18n/vi.po b/addons/hr_expense/i18n/vi.po
index b0976382098..5b93e039ef5 100644
--- a/addons/hr_expense/i18n/vi.po
+++ b/addons/hr_expense/i18n/vi.po
@@ -1347,6 +1347,8 @@ msgid ""
"Technical field used to know whether the field `partner_bank_account_id` "
"needs to be displayed or not in the payments form views"
msgstr ""
+"Technical field used to know whether the field `partner_bank_account_id` "
+"needs to be displayed or not in the payments form views"
#. module: hr_expense
#. openerp-web
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index 73a67f5df47..7de93802d74 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -65,7 +65,7 @@ class HrExpense(models.Model):
payment_mode = fields.Selection([
("own_account", "Employee (to reimburse)"),
("company_account", "Company")
- ], default='own_account', states={'done': [('readonly', True)], 'post': [('readonly', True)], 'submitted': [('readonly', True)]}, string="Paid By")
+ ], default='own_account', states={'done': [('readonly', True)], 'approved': [('readonly', True)], 'reported': [('readonly', True)]}, string="Paid By")
attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number')
state = fields.Selection([
('draft', 'To Submit'),
@@ -336,8 +336,8 @@ class HrExpense(models.Model):
'currency_id': expense.currency_id.id if different_currency else False,
}
move_line_values.append(move_line_src)
- total_amount -= move_line_src['debit']
- total_amount_currency -= move_line_src['amount_currency'] or move_line_src['debit']
+ total_amount += -move_line_src['debit'] or move_line_src['credit']
+ total_amount_currency += -move_line_src['amount_currency'] if move_line_src['currency_id'] else (-move_line_src['debit'] or move_line_src['credit'])
# taxes move lines
for tax in taxes['taxes']:
diff --git a/addons/hr_expense_check/i18n/ar.po b/addons/hr_expense_check/i18n/ar.po
index fa5c568e6b3..4546515c996 100644
--- a/addons/hr_expense_check/i18n/ar.po
+++ b/addons/hr_expense_check/i18n/ar.po
@@ -3,15 +3,16 @@
# * hr_expense_check
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Mustafa J. Kadhem <safi2266@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:18+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,7 +38,7 @@ msgstr "حدد هذا الاختيار إذا كان دفتر شيكاتك غيØ
#. module: hr_expense_check
#: model:ir.model,name:hr_expense_check.model_hr_expense_sheet_register_payment_wizard
msgid "Expense Register Payment Wizard"
-msgstr ""
+msgstr "معالج سداد سجل المصروفات"
#. module: hr_expense_check
#: model:ir.model.fields,field_description:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__check_manual_sequencing
@@ -57,10 +58,10 @@ msgstr ""
#. module: hr_expense_check
#: model:ir.model.fields,field_description:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__payment_method_code_2
msgid "Payment Method Code 2"
-msgstr ""
+msgstr "كود طريقة السداد 2"
#. module: hr_expense_check
#: model:ir.model.fields,help:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__payment_method_code_2
msgid ""
"Technical field used to adapt the interface to the payment type selected."
-msgstr "الحقل التقني يُستخدم لتهيئة الواجهة لنوع السداد المُختار"
+msgstr "حقل تقني يُستخدم لتهيئة الواجهة لنوع السداد المُختار."
diff --git a/addons/hr_gamification/i18n/ar.po b/addons/hr_gamification/i18n/ar.po
index 2e1f9831145..4e2e6b9dead 100644
--- a/addons/hr_gamification/i18n/ar.po
+++ b/addons/hr_gamification/i18n/ar.po
@@ -3,18 +3,19 @@
# * hr_gamification
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Martin Trigaux, 2018
# Fahad Alqahtani <fahad@cloudland.sa>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:19+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -28,13 +29,15 @@ msgid ""
"A goal is defined by a user and a goal type.\n"
" Goals can be created automatically by using challenges."
msgstr ""
+"يُعرف الهدف بواسطة المستخدم والنوع التابع له.\n"
+" يمكن إنشاء الأهداف تلقائيًا باستخدام التحديات."
#. module: hr_gamification
#: model:ir.model.fields,help:hr_gamification.field_hr_employee__badge_ids
msgid ""
"All employee badges, linked to the employee either directly or through the "
"user"
-msgstr ""
+msgstr "كافة شارات الموظف، المرتبطة بالموظف إما مباشرة أو من خلال المستخدم"
#. module: hr_gamification
#: model_terms:ir.actions.act_window,help:hr_gamification.challenge_list_action2
@@ -43,6 +46,9 @@ msgid ""
" The challenge can use a period (weekly, monthly...) for automatic creation of goals.\n"
" The goals are created for the specified users or member of the group."
msgstr ""
+"قم بتعيين قائمة من الأهداف لمجموعة محددة من المستخدمين لتقييمهم.\n"
+" قد يكون التحدي دوريًا (أسبوعيًا أو شهريًا) ليتم إنشاء الأهداف تلقائيًا.\n"
+" يتم إنشاء الأهداف للمستخدمين المحددين أو لأعضاء مجموعة ما."
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_res_users__badge_ids
@@ -55,13 +61,12 @@ msgstr "الشارات"
msgid ""
"Badges are rewards of good work. Give them to people you believe deserve it."
msgstr ""
-"الشارات هي مكافئات أو منح للدلالة على العمل الجيد. امنح الشارات لمن ترى أنهم"
-" يستحقونها."
+"الشارات هي مكافآت على العمل الجيد. امنح الشارات لمن ترى أنهم يستحقونها."
#. module: hr_gamification
#: model:ir.model.fields,help:hr_gamification.field_hr_employee__direct_badge_ids
msgid "Badges directly linked to the employee"
-msgstr ""
+msgstr "الشارات المرتبطة مباشرةً بهذا الموظف"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward
@@ -78,22 +83,22 @@ msgstr "التحديات"
#. module: hr_gamification
#: model_terms:ir.actions.act_window,help:hr_gamification.challenge_list_action2
msgid "Create a new challenge"
-msgstr ""
+msgstr "إنشاء تحدي جديد"
#. module: hr_gamification
#: model_terms:ir.actions.act_window,help:hr_gamification.goals_menu_groupby_action2
msgid "Create a new goal"
-msgstr ""
+msgstr "إنشاء هدف جديد"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward
msgid "Describe what they did and why it matters (will be public)"
-msgstr "صف مافعلوه وما أهميته (سيكون عاماً)"
+msgstr "صف ما فعلوه وما أهميته (سيكون عامًا)"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__direct_badge_ids
msgid "Direct Badge"
-msgstr ""
+msgstr "الشارة المباشرة"
#. module: hr_gamification
#: model:ir.model,name:hr_gamification.model_hr_employee
@@ -110,22 +115,22 @@ msgstr "شارات الموظف"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__goal_ids
msgid "Employee HR Goals"
-msgstr "أهداف الموظفين"
+msgstr "أهداف الموظف للموارد البشرية"
#. module: hr_gamification
#: model:ir.model,name:hr_gamification.model_gamification_badge
msgid "Gamification Badge"
-msgstr ""
+msgstr "شارة التنافسية"
#. module: hr_gamification
#: model:ir.model,name:hr_gamification.model_gamification_badge_user
msgid "Gamification User Badge"
-msgstr ""
+msgstr "شارة مستخدم التنافسية"
#. module: hr_gamification
#: model:ir.model,name:hr_gamification.model_gamification_badge_user_wizard
msgid "Gamification User Badge Wizard"
-msgstr ""
+msgstr "معالج شارة مستخدم التنافسية"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_res_users__goal_ids
@@ -141,22 +146,22 @@ msgstr "تاريخ الأهداف"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form
msgid "Grant a Badge"
-msgstr "امنح شارة"
+msgstr "منح شارة"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form
msgid "Grant this employee his first badge"
-msgstr ""
+msgstr "منح هذا المستخدم شارته الأولى"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.hr_badge_form_view
msgid "Granted"
-msgstr ""
+msgstr "ممنوح"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_gamification_badge__granted_employees_count
msgid "Granted Employees Count"
-msgstr ""
+msgstr "عدد الموظفين الممنوحين شارات"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__has_badges
@@ -188,7 +193,7 @@ msgstr "مكافأة الموظف بـ"
#: code:addons/hr_gamification/models/gamification.py:18
#, python-format
msgid "The selected employee does not correspond to the selected user."
-msgstr "الموظف المحدد لا يتفق مع المستخدم المحدد."
+msgstr "الموظف المختار غير متوافق مع المستخدم المختار."
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_gamification_badge_user_wizard__user_id
@@ -203,19 +208,19 @@ msgstr "المستخدمون"
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward
msgid "What are you thankful for?"
-msgstr ""
+msgstr "علام أنت ممتن؟"
#. module: hr_gamification
#: code:addons/hr_gamification/wizard/gamification_badge_user_wizard.py:22
#, python-format
msgid "You can not send a badge to yourself."
-msgstr ""
+msgstr "لا يمكنك إرسال شارة لنفسك."
#. module: hr_gamification
#: code:addons/hr_gamification/wizard/gamification_badge_user_wizard.py:19
#, python-format
msgid "You can send badges only to employees linked to a user."
-msgstr "يمكنك ارسال الشارات فقط للموظفين المرتبطين بمستخدم."
+msgstr "يمكنك إرسال الشارات للموظفين المرتبطين بمستخدم فقط."
#. module: hr_gamification
#: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form
diff --git a/addons/hr_gamification/i18n/cs.po b/addons/hr_gamification/i18n/cs.po
index 2849c089a7f..604df512b16 100644
--- a/addons/hr_gamification/i18n/cs.po
+++ b/addons/hr_gamification/i18n/cs.po
@@ -124,7 +124,7 @@ msgstr ""
#. module: hr_gamification
#: model:ir.model,name:hr_gamification.model_gamification_badge_user_wizard
msgid "Gamification User Badge Wizard"
-msgstr ""
+msgstr "Průvodce odznakem uživatele Gamifikace"
#. module: hr_gamification
#: model:ir.model.fields,field_description:hr_gamification.field_res_users__goal_ids
diff --git a/addons/hr_holidays/i18n/km.po b/addons/hr_holidays/i18n/km.po
index 749556a064e..04869b11cd8 100644
--- a/addons/hr_holidays/i18n/km.po
+++ b/addons/hr_holidays/i18n/km.po
@@ -1117,7 +1117,7 @@ msgstr ""
#: code:addons/hr_holidays/report/holidays_summary_report.py:113
#, python-format
msgid "Form content is missing, this report cannot be printed."
-msgstr ""
+msgstr "កំហុសទម្រង់សំណុំបែបបទរបាយការណ៍នេះមិនអាចបោះពុម្ពបានទេ"
#. module: hr_holidays
#: model:ir.model.fields,field_description:hr_holidays.field_hr_holidays_summary_dept__date_from
@@ -2069,7 +2069,7 @@ msgstr "លំដាប់"
#: model_terms:ir.ui.view,arch_db:hr_holidays.view_hr_holidays_filter
#: model_terms:ir.ui.view,arch_db:hr_holidays.view_hr_leave_allocation_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: hr_holidays
#: model:hr.leave.type,name:hr_holidays.holiday_status_sl
diff --git a/addons/hr_recruitment/i18n/cs.po b/addons/hr_recruitment/i18n/cs.po
index ead6456bba8..ee8176a556b 100644
--- a/addons/hr_recruitment/i18n/cs.po
+++ b/addons/hr_recruitment/i18n/cs.po
@@ -1335,7 +1335,7 @@ msgstr ""
#. module: hr_recruitment
#: model_terms:ir.ui.view,arch_db:hr_recruitment.hr_employee_view_search
msgid "Newly Hired"
-msgstr ""
+msgstr "Nově přijat"
#. module: hr_recruitment
#: model:ir.actions.act_window,name:hr_recruitment.hr_employee_action_from_department
diff --git a/addons/hr_recruitment/i18n/km.po b/addons/hr_recruitment/i18n/km.po
index 6d9cf4734d8..c054012f11f 100644
--- a/addons/hr_recruitment/i18n/km.po
+++ b/addons/hr_recruitment/i18n/km.po
@@ -1721,7 +1721,7 @@ msgstr ""
#. module: hr_recruitment
#: model_terms:ir.ui.view,arch_db:hr_recruitment.view_crm_case_jobs_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: hr_recruitment
#: model:ir.model.fields,field_description:hr_recruitment.field_hr_applicant__source_id
diff --git a/addons/hr_recruitment/i18n/vi.po b/addons/hr_recruitment/i18n/vi.po
index e22ed6d0054..80a066bb4a2 100644
--- a/addons/hr_recruitment/i18n/vi.po
+++ b/addons/hr_recruitment/i18n/vi.po
@@ -765,7 +765,7 @@ msgstr "Miêu tả"
#. module: hr_recruitment
#: model:ir.model,name:hr_recruitment.model_digest_digest
msgid "Digest"
-msgstr ""
+msgstr "Tiêu"
#. module: hr_recruitment
#: model_terms:ir.ui.view,arch_db:hr_recruitment.hr_job_simple_form
diff --git a/addons/hr_timesheet_attendance/i18n/ar.po b/addons/hr_timesheet_attendance/i18n/ar.po
index 8644e0b8245..29fc197927a 100644
--- a/addons/hr_timesheet_attendance/i18n/ar.po
+++ b/addons/hr_timesheet_attendance/i18n/ar.po
@@ -3,18 +3,18 @@
# * hr_timesheet_attendance
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Martin Trigaux, 2018
-# Osoul <baruni@osoul.ly>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Osama Ahmaro <osamaahmaro@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:19+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,12 +31,12 @@ msgstr "التاريخ"
#. module: hr_timesheet_attendance
#: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: hr_timesheet_attendance
#: model:ir.actions.act_window,name:hr_timesheet_attendance.action_hr_timesheet_attendance_report
msgid "HR Timesheet/Attendance Report"
-msgstr ""
+msgstr "تقرير سجل النشاط/الحضور"
#. module: hr_timesheet_attendance
#: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__id
@@ -51,12 +51,12 @@ msgstr "آخر تعديل في"
#. module: hr_timesheet_attendance
#: model:ir.ui.menu,name:hr_timesheet_attendance.menu_hr_timesheet_attendance_report
msgid "Timesheet / Attendance"
-msgstr ""
+msgstr "سجل النشاط / الحضور"
#. module: hr_timesheet_attendance
#: model:ir.model,name:hr_timesheet_attendance.model_hr_timesheet_attendance_report
msgid "Timesheet Attendance Report"
-msgstr ""
+msgstr "تقرير حضور سجل النشاط"
#. module: hr_timesheet_attendance
#: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__total_attendance
@@ -71,7 +71,7 @@ msgstr "مجموع الاختلافات"
#. module: hr_timesheet_attendance
#: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__total_timesheet
msgid "Total Timesheet"
-msgstr "سجل الدوام الكلي"
+msgstr "سجل النشاط الكلي"
#. module: hr_timesheet_attendance
#: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__user_id
@@ -82,4 +82,4 @@ msgstr "المستخدم"
#: model_terms:ir.ui.view,arch_db:hr_timesheet_attendance.view_hr_timesheet_attendance_report_pivot
#: model_terms:ir.ui.view,arch_db:hr_timesheet_attendance.view_hr_timesheet_attendance_report_search
msgid "timesheet attendance"
-msgstr ""
+msgstr "حضور سجل النشاط"
diff --git a/addons/iap/i18n/ar.po b/addons/iap/i18n/ar.po
index e495330ae8c..6e6afcc495d 100644
--- a/addons/iap/i18n/ar.po
+++ b/addons/iap/i18n/ar.po
@@ -3,18 +3,19 @@
# * iap
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
# Osoul <baruni@osoul.ly>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-02 10:05+0000\n"
-"PO-Revision-Date: 2018-10-02 10:05+0000\n"
-"Last-Translator: Osama Ahmaro <osamaahmaro@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:19+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,26 +26,26 @@ msgstr ""
#. module: iap
#: model_terms:ir.ui.view,arch_db:iap.iap_account_view_form
msgid "Account Information"
-msgstr ""
+msgstr "معلومات الحساب"
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__account_token
msgid "Account Token"
-msgstr ""
+msgstr "كلمة سر الحساب"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/js/crash_manager.js:23
#, python-format
msgid "Buy credits at Odoo"
-msgstr ""
+msgstr "شراء رصيد في أودو"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:41
#, python-format
msgid "Buy more credits"
-msgstr ""
+msgstr "شراء رصيد أكثر"
#. module: iap
#. openerp-web
@@ -58,7 +59,7 @@ msgstr "إلغاء"
#: code:addons/iap/static/src/xml/iap_templates.xml:28
#, python-format
msgid "Checking remaining credit ..."
-msgstr ""
+msgstr "جارٍ التحقق من الرصيد المتبقي..."
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__company_id
@@ -78,25 +79,25 @@ msgstr "أنشئ في"
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: iap
#: model:ir.ui.menu,name:iap.iap_root_menu
msgid "IAP"
-msgstr ""
+msgstr "IAP"
#. module: iap
#: model:ir.actions.act_window,name:iap.iap_account_action
#: model:ir.model,name:iap.model_iap_account
#: model_terms:ir.ui.view,arch_db:iap.iap_account_view_form
msgid "IAP Account"
-msgstr ""
+msgstr "حساب IAP"
#. module: iap
#: model:ir.ui.menu,name:iap.iap_account_menu
#: model_terms:ir.ui.view,arch_db:iap.iap_account_view_tree
msgid "IAP Accounts"
-msgstr ""
+msgstr "حسابات IAP"
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__id
@@ -108,28 +109,28 @@ msgstr "المعرف"
#: code:addons/iap/static/src/xml/iap_templates.xml:21
#, python-format
msgid "In-App Purchases"
-msgstr ""
+msgstr "عمليات شراء داخل التطبيق"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/js/crash_manager.js:51
#, python-format
msgid "Insufficient Balance"
-msgstr ""
+msgstr "رصيد غير كاف"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:31
#, python-format
msgid "Insufficient credit"
-msgstr ""
+msgstr "رصيد غير كاف"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:14
#, python-format
msgid "Insufficient credit to perform this service."
-msgstr ""
+msgstr "الرصيد غير كافٍ لإجراء هذه الخدمة."
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account____last_update
@@ -151,30 +152,30 @@ msgstr "آخر تحديث في"
#: code:addons/iap/static/src/xml/iap_templates.xml:34
#, python-format
msgid "Remaining :"
-msgstr ""
+msgstr "المتبقي:"
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__service_name
msgid "Service Name"
-msgstr ""
+msgstr "اسم الخدمة"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/js/crash_manager.js:23
#, python-format
msgid "Start a Trial at Odoo"
-msgstr ""
+msgstr "بدء نسخة تجريبية في أودو"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:37
#, python-format
msgid "Temporarily unavailable"
-msgstr ""
+msgstr "غير متاح مؤقتًا"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:34
#, python-format
msgid "credits"
-msgstr ""
+msgstr "رصيد"
diff --git a/addons/iap/i18n/cs.po b/addons/iap/i18n/cs.po
index 1f7625dff4c..07253cb86eb 100644
--- a/addons/iap/i18n/cs.po
+++ b/addons/iap/i18n/cs.po
@@ -42,7 +42,7 @@ msgstr ""
#: code:addons/iap/static/src/xml/iap_templates.xml:41
#, python-format
msgid "Buy more credits"
-msgstr ""
+msgstr "Koupit více kreditů"
#. module: iap
#. openerp-web
@@ -149,7 +149,7 @@ msgstr "Naposled upraveno"
#: code:addons/iap/static/src/xml/iap_templates.xml:34
#, python-format
msgid "Remaining :"
-msgstr ""
+msgstr "Zbývající:"
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account__service_name
@@ -168,11 +168,11 @@ msgstr ""
#: code:addons/iap/static/src/xml/iap_templates.xml:37
#, python-format
msgid "Temporarily unavailable"
-msgstr ""
+msgstr "dočasně nedostupné"
#. module: iap
#. openerp-web
#: code:addons/iap/static/src/xml/iap_templates.xml:34
#, python-format
msgid "credits"
-msgstr ""
+msgstr "kredity"
diff --git a/addons/im_livechat/i18n/km.po b/addons/im_livechat/i18n/km.po
index 6d7293dd29a..b784d9c7806 100644
--- a/addons/im_livechat/i18n/km.po
+++ b/addons/im_livechat/i18n/km.po
@@ -392,7 +392,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:im_livechat.mail_channel_view_form
#: model_terms:ir.ui.view,arch_db:im_livechat.mail_channel_view_tree
msgid "History"
-msgstr ""
+msgstr "ប្រវត្តិ"
#. module: im_livechat
#: model:ir.model.fields,field_description:im_livechat.field_im_livechat_report_channel__start_date_hour
@@ -635,7 +635,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:im_livechat.im_livechat_report_channel_view_search
#: model_terms:ir.ui.view,arch_db:im_livechat.im_livechat_report_operator_view_search
msgid "Operator"
-msgstr ""
+msgstr "ប្រតិបត្តការណ៌"
#. module: im_livechat
#: model:ir.ui.menu,name:im_livechat.menu_reporting_livechat_operator
diff --git a/addons/im_livechat_mail_bot/i18n/cs.po b/addons/im_livechat_mail_bot/i18n/cs.po
index 6c45c056677..0a8f48020b6 100644
--- a/addons/im_livechat_mail_bot/i18n/cs.po
+++ b/addons/im_livechat_mail_bot/i18n/cs.po
@@ -40,7 +40,7 @@ msgstr ""
#. module: im_livechat_mail_bot
#: model:ir.model,name:im_livechat_mail_bot.model_mail_bot
msgid "Mail Bot"
-msgstr ""
+msgstr "e-mailový robot"
#. module: im_livechat_mail_bot
#: selection:res.users,odoobot_state:0
diff --git a/addons/im_support/i18n/ar.po b/addons/im_support/i18n/ar.po
index 8470af6b0de..94025fa6298 100644
--- a/addons/im_support/i18n/ar.po
+++ b/addons/im_support/i18n/ar.po
@@ -24,7 +24,7 @@ msgstr ""
#: code:addons/im_support/static/src/js/support_channel.js:48
#, python-format
msgid " (offline)"
-msgstr ""
+msgstr " (لا يوجد اتصال)"
#. module: im_support
#: model:ir.model,name:im_support.model_ir_http
@@ -34,7 +34,7 @@ msgstr ""
#. module: im_support
#: model_terms:ir.ui.view,arch_db:im_support.support_qunit_suite
msgid "IM Support Tests"
-msgstr ""
+msgstr "اختبارات دعم المحادثات الفورية"
#. module: im_support
#. openerp-web
@@ -44,6 +44,8 @@ msgid ""
"None of our operators are available. <a href='https://www.odoo.com/help' "
"target='_blank'>Submit a ticket</a> to ask your question now."
msgstr ""
+"جميع ممثلينا مشغولون الآن. <a href='https://www.odoo.com/help' "
+"target='_blank'>أرسل تذكرة</a> لطرح سؤالك الآن."
#. module: im_support
#. openerp-web
@@ -65,4 +67,4 @@ msgstr "الدعم"
#: code:addons/im_support/static/src/js/mail_manager.js:153
#, python-format
msgid "The Support server can't be reached."
-msgstr ""
+msgstr "تعذّر الوصول لسيرفر الدعم."
diff --git a/addons/l10n_ae/data/account_tax_template_data.xml b/addons/l10n_ae/data/account_tax_template_data.xml
index 15ae5ae9869..5614c43941f 100644
--- a/addons/l10n_ae/data/account_tax_template_data.xml
+++ b/addons/l10n_ae/data/account_tax_template_data.xml
@@ -386,7 +386,7 @@
]"/>
</record>
<record id="uae_sale_tax_reverse_charge_abu_dhabi" model="account.tax.template">
- <field name="name">Reverse Charge Provision (Abi Dhabi)</field>
+ <field name="name">Reverse Charge Provision (Abu Dhabi)</field>
<field name="type_tax_use">sale</field>
<field name="amount">5</field>
<field name="amount_type">percent</field>
@@ -829,6 +829,18 @@
}),
]"/>
</record>
+ <record id="uae_purchase_tax_5_child_global" model="account.tax.template">
+ <field name="name">TVA 5%</field>
+ <field name="type_tax_use">none</field>
+ <field name="amount">5</field>
+ <field name="amount_type">percent</field>
+ <field name="description">TVA 5%</field>
+ <field name="account_id" ref="uae_account_3726"/>
+ <field name="refund_account_id" ref="uae_account_3726"/>
+ <field name="tax_group_id" ref="ae_tax_group_5"/>
+ <field name="tag_ids" eval="[(6,0,[ref('tag_ae_02')])]"/>
+ <field name="chart_template_id" ref="uae_chart_template_standard"/>
+ </record>
<record id="uae_purchase_tax_reverse_charge" model="account.tax.template">
<field name="name">Reverse Charge Provision</field>
<field name="type_tax_use">purchase</field>
diff --git a/addons/l10n_ch/models/account_invoice.py b/addons/l10n_ch/models/account_invoice.py
index 62e26b3250e..3b72a00c1d4 100644
--- a/addons/l10n_ch/models/account_invoice.py
+++ b/addons/l10n_ch/models/account_invoice.py
@@ -26,7 +26,7 @@ class AccountMove(models.Model):
l10n_ch_isr_valid = fields.Boolean(compute='_compute_l10n_ch_isr_valid', help='Boolean value. True iff all the data required to generate the ISR are present')
l10n_ch_isr_sent = fields.Boolean(defaut=False, help="Boolean value telling whether or not the ISR corresponding to this invoice has already been printed or sent by mail.")
- l10n_ch_currency_name = fields.Char(related='currency_id.name', readonly=False, string="Currency Name", help="The name of this invoice's currency") #This field is used in the "invisible" condition field of the 'Print ISR' button.
+ l10n_ch_currency_name = fields.Char(related='currency_id.name', readonly=True, string="Currency Name", help="The name of this invoice's currency") #This field is used in the "invisible" condition field of the 'Print ISR' button.
@api.depends('invoice_partner_bank_id.bank_id.l10n_ch_postal_eur', 'invoice_partner_bank_id.bank_id.l10n_ch_postal_chf')
def _compute_l10n_ch_isr_postal(self):
diff --git a/addons/l10n_it_edi/data/account_invoice_demo.xml b/addons/l10n_it_edi/data/account_invoice_demo.xml
index 81cef201c47..06be31a1ba3 100644
--- a/addons/l10n_it_edi/data/account_invoice_demo.xml
+++ b/addons/l10n_it_edi/data/account_invoice_demo.xml
@@ -3,7 +3,6 @@
<data noupdate="1">
<!-- add VAT, codice fiscal and tax system for main company -->
<record id="base.main_company" model="res.company">
- <field name="country_id" ref="base.it"/>
<field name="vat">IT00410128888</field>
<field name="l10n_it_codice_fiscale">0123456789987654</field>
<field name="l10n_it_tax_system">RF01</field>
diff --git a/addons/l10n_multilang/i18n/km.po b/addons/l10n_multilang/i18n/km.po
index f689587b847..06d456d37d4 100644
--- a/addons/l10n_multilang/i18n/km.po
+++ b/addons/l10n_multilang/i18n/km.po
@@ -65,7 +65,7 @@ msgstr ""
#. module: l10n_multilang
#: model:ir.model.fields,field_description:l10n_multilang.field_account_fiscal_position_template__name
msgid "Fiscal Position Template"
-msgstr ""
+msgstr "គំរូទីតាំងថសារពើរពន្ធ"
#. module: l10n_multilang
#: model:ir.model,name:l10n_multilang.model_base_language_install
@@ -90,7 +90,7 @@ msgstr ""
#. module: l10n_multilang
#: model:ir.model.fields,help:l10n_multilang.field_account_fiscal_position__note
msgid "Legal mentions that have to be printed on the invoices."
-msgstr ""
+msgstr "ច្បាប់បានចែងថា ត្រូវតែព្រីនលើវិក័យប័ត្រ។"
#. module: l10n_multilang
#: model:ir.model.fields,field_description:l10n_multilang.field_account_account__name
@@ -144,7 +144,7 @@ msgstr ""
#. module: l10n_multilang
#: model:ir.model,name:l10n_multilang.model_account_account_template
msgid "Templates for Accounts"
-msgstr ""
+msgstr "គំរូសម្រាប់គណនី"
#. module: l10n_multilang
#: model:ir.model,name:l10n_multilang.model_account_tax_template
diff --git a/addons/l10n_za/__manifest__.py b/addons/l10n_za/__manifest__.py
index 692ffecfc47..e7532f03eac 100644
--- a/addons/l10n_za/__manifest__.py
+++ b/addons/l10n_za/__manifest__.py
@@ -15,6 +15,7 @@ This is the latest basic South African localisation necessary to run Odoo in ZA:
'website': 'https://www.paradigmdigital.co.za',
'depends': ['account', 'base_vat'],
'data': [
+ 'data/account.account.tag.csv',
'data/account_tax_report_data.xml',
'data/account.tax.group.csv',
'data/account_chart_template_data.xml',
diff --git a/addons/lunch/i18n/km.po b/addons/lunch/i18n/km.po
index b09a03c0e0e..ce05c6544dd 100644
--- a/addons/lunch/i18n/km.po
+++ b/addons/lunch/i18n/km.po
@@ -787,6 +787,8 @@ msgid ""
"Payments are used to register liquidity movements. You can process those "
"payments by your own means or by using installed facilities."
msgstr ""
+"ការទូទាត់ត្រូវបានប្រើដើម្បីកត់ត្រាចលនាសាច់ប្រាក់។ "
+"អ្នកអាចដំណើរការការទូទាត់ទាំងនោះដោយមធ្យោបាយរបស់អ្នកផ្ទាល់ឬដោយប្រើឧបករណ៍ដែលបានដំឡើង។"
#. module: lunch
#: model:ir.model.fields,field_description:lunch.field_lunch_order__previous_order_ids
@@ -908,6 +910,9 @@ msgstr ""
#: model_terms:ir.actions.act_window,help:lunch.lunch_cashmove_action_payment
msgid "Register a payment"
msgstr ""
+"ចុះឈ្មោះការបង់ប្រាក់\n"
+" \n"
+" "
#. module: lunch
#: model:ir.model.fields,field_description:lunch.field_lunch_alert__saturday
diff --git a/addons/mail/i18n/cs.po b/addons/mail/i18n/cs.po
index a9cd7a68cbe..f7c66d5d02e 100644
--- a/addons/mail/i18n/cs.po
+++ b/addons/mail/i18n/cs.po
@@ -5220,6 +5220,8 @@ msgid ""
"Tracked values are stored in a separate model. This field allow to "
"reconstruct the tracking and to generate statistics on the model."
msgstr ""
+"Sledované hodnoty jsou uloženy v samostatném modelu. Toto pole umožňuje "
+"rekonstruovat sledování a generovat statistiky modelu."
#. module: mail
#: model:ir.model.fields,field_description:mail.field_ir_model_fields__track_visibility
@@ -5625,7 +5627,7 @@ msgstr ""
#. module: mail
#: model:ir.model.fields,help:mail.field_mail_compose_message__is_log
msgid "Whether the message is an internal note (comment mode only)"
-msgstr ""
+msgstr "Zda je zpráva interní poznámkou (pouze režim poznámek)"
#. module: mail
#: model:ir.model.fields,help:mail.field_ir_model__is_mail_thread
diff --git a/addons/mail/i18n/km.po b/addons/mail/i18n/km.po
index 4d011c7803a..aaacbc66ea8 100644
--- a/addons/mail/i18n/km.po
+++ b/addons/mail/i18n/km.po
@@ -470,7 +470,7 @@ msgstr ""
#: code:addons/mail/static/src/xml/activity.xml:37
#, python-format
msgid "Activity type"
-msgstr ""
+msgstr "ប្រភេទឯកសារ"
#. module: mail
#. openerp-web
@@ -619,7 +619,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_channel__alias_contact
#: model:ir.model.fields,field_description:mail.field_res_users__alias_contact
msgid "Alias Contact Security"
-msgstr ""
+msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_res_config_settings__alias_domain
@@ -631,7 +631,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_alias_mixin__alias_name
#: model:ir.model.fields,field_description:mail.field_mail_channel__alias_name
msgid "Alias Name"
-msgstr ""
+msgstr "ឈ្មោះក្លែក្លាយ"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_alias__alias_domain
@@ -645,7 +645,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_alias_mixin__alias_model_id
#: model:ir.model.fields,field_description:mail.field_mail_channel__alias_model_id
msgid "Aliased Model"
-msgstr ""
+msgstr "គំរូឈ្មោះក្លែងក្លាយ"
#. module: mail
#: model:ir.actions.act_window,name:mail.action_view_mail_alias
@@ -713,6 +713,8 @@ msgid ""
"Answers do not go in the original document discussion thread. This has an "
"impact on the generated message-id."
msgstr ""
+"ចម្លើយមិនចូលទៅក្នុងខ្សែស្រឡាយការពិភាក្សាឯកសារដើមទេ។ "
+"នេះមានផលប៉ះពាល់ដល់លេខសម្គាល់សារដែលបានបង្កើត​ "
#. module: mail
#: model:ir.model.fields,field_description:mail.field_email_template_preview__model_id
@@ -1159,7 +1161,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__child_ids
#: model:ir.model.fields,field_description:mail.field_mail_message__child_ids
msgid "Child Messages"
-msgstr ""
+msgstr "សារកុមារ"
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.email_template_preview_form
@@ -1237,7 +1239,7 @@ msgstr "សរសេរអុីម៉ែល"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_compose_message__composition_mode
msgid "Composition mode"
-msgstr ""
+msgstr "របៀបផ្សំ"
#. module: mail
#: model:ir.model,name:mail.model_res_config_settings
@@ -1284,7 +1286,7 @@ msgstr "មាតិកា"
#: model:ir.model.fields,field_description:mail.field_mail_mail__body
#: model:ir.model.fields,field_description:mail.field_mail_message__body
msgid "Contents"
-msgstr ""
+msgstr "មាតិកា"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_channel_partner__fold_state
@@ -1429,7 +1431,7 @@ msgstr "កាលបរិច្ឆេត"
#: code:addons/mail/static/src/xml/chatter.xml:93
#, python-format
msgid "Dates"
-msgstr ""
+msgstr "កាលបរិច្ឆេទ"
#. module: mail
#: selection:ir.actions.server,activity_date_deadline_range_type:0
@@ -1668,6 +1670,7 @@ msgid ""
"Do not keep a copy of the email in the document communication history (mass "
"mailing only)"
msgstr ""
+"កុំរក្សាទុកច្បាប់ចំលងនៃអ៊ីមែលនៅក្នុងប្រវត្តិទំនាក់ទំនងឯកសារ (ផ្ញើរតាមមហាជន)"
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.view_document_file_kanban
@@ -1877,6 +1880,9 @@ msgid ""
"Email address of the sender. This field is set when no matching partner is "
"found and replaces the author_id field in the chatter."
msgstr ""
+"អាសយដ្ឋានអ៊ីមែលរបស់អ្នកផ្ញើ។ "
+"កន្លែងនេះត្រូវបានកំណត់នៅពេលគ្មានដៃគូដែលផ្គូផ្គងត្រូវបានរកឃើញនិងជំនួសកន្លែង "
+"author_id នៅក្នុង chatter ។"
#. module: mail
#: selection:mail.notification,failure_type:0
@@ -2045,7 +2051,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__starred_partner_ids
#: model:ir.model.fields,field_description:mail.field_mail_message__starred_partner_ids
msgid "Favorited By"
-msgstr ""
+msgstr "ចំណូលចិត្តដោយ"
#. module: mail
#. openerp-web
@@ -2194,7 +2200,7 @@ msgstr ""
#: code:addons/mail/static/src/xml/systray.xml:98
#, python-format
msgid "Future"
-msgstr ""
+msgstr "អនាគត"
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_search
@@ -2222,7 +2228,7 @@ msgstr ""
#: code:addons/mail/models/res_users.py:88
#, python-format
msgid "Go to the configuration panel"
-msgstr ""
+msgstr "ចូលទៅផ្ទាំងការតំឡើង"
#. module: mail
#: selection:ir.actions.act_window.view,view_mode:0
@@ -2359,7 +2365,7 @@ msgstr "ID"
msgid ""
"ID of the parent record holding the alias (example: project holding the task"
" creation alias)"
-msgstr ""
+msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_activity__icon
@@ -2485,7 +2491,7 @@ msgstr ""
#: code:addons/mail/static/src/xml/discuss.xml:216
#, python-format
msgid "Inbox"
-msgstr ""
+msgstr "សំបុត្រប្រអប់"
#. module: mail
#: model:ir.model.fields,help:mail.field_mail_activity__automated
@@ -2498,7 +2504,7 @@ msgstr ""
#: code:addons/mail/static/src/xml/activity.xml:33
#, python-format
msgid "Info"
-msgstr ""
+msgstr "ពត៌មាន"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_activity_type__initial_res_model_id
@@ -2847,7 +2853,7 @@ msgstr ""
#: code:addons/mail/static/src/xml/thread.xml:55
#, python-format
msgid "Loading"
-msgstr ""
+msgstr "ដំណើរការ"
#. module: mail
#. openerp-web
@@ -2883,7 +2889,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_form_popup
#: model_terms:ir.ui.view,arch_db:mail.view_server_action_form_template
msgid "Log a note..."
-msgstr ""
+msgstr "កត់ចំណំា"
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_form_popup
@@ -3140,7 +3146,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__record_name
#: model:ir.model.fields,field_description:mail.field_mail_message__record_name
msgid "Message Record Name"
-msgstr ""
+msgstr "ឈ្មោះកំណត់ត្រាសារ"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_message_subtype__name
@@ -3200,20 +3206,22 @@ msgid ""
"Message type: email for email message, notification for system message, "
"comment for other messages such as user replies"
msgstr ""
+"ប្រភេទសារ: សារអេឡិចត្រូនិចសម្រាប់សារអ៊ីម៉ែល, ការជូនដំណឹងសម្រាប់ប្រព័ន្ធសារ, "
+"មតិយោបល់សម្រាប់សារផ្សេងទៀតដូចជាការឆ្លើយតបរបស់អ្នកប្រើ"
#. module: mail
#: model:ir.model.fields,help:mail.field_mail_compose_message__message_id
#: model:ir.model.fields,help:mail.field_mail_mail__message_id
#: model:ir.model.fields,help:mail.field_mail_message__message_id
msgid "Message unique identifier"
-msgstr ""
+msgstr "អ្នកកំណត់អត្តសញ្ញាណតែមួយគត់សារ"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_compose_message__message_id
#: model:ir.model.fields,field_description:mail.field_mail_mail__message_id
#: model:ir.model.fields,field_description:mail.field_mail_message__message_id
msgid "Message-Id"
-msgstr ""
+msgstr "សារលេខសម្គាល់"
#. module: mail
#: model:ir.actions.act_window,name:mail.action_view_mail_message
@@ -3300,7 +3308,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__moderator_id
#: model:ir.model.fields,field_description:mail.field_mail_message__moderator_id
msgid "Moderated By"
-msgstr ""
+msgstr "សម្របសម្រួលដោយ"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_channel__moderation_ids
@@ -3340,7 +3348,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__moderation_status
#: model:ir.model.fields,field_description:mail.field_mail_message__moderation_status
msgid "Moderation Status"
-msgstr ""
+msgstr "សម្របសម្រួលបច្ចុប្បន្នភាព"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_res_users__moderation_counter
@@ -3395,7 +3403,7 @@ msgstr "ឈ្មោះ"
#: model:ir.model.fields,help:mail.field_mail_mail__record_name
#: model:ir.model.fields,help:mail.field_mail_message__record_name
msgid "Name get of the related document."
-msgstr ""
+msgstr "ឈ្មោះទទួលឯកសារពាក់ព័ន្ធ។"
#. module: mail
#: model:ir.model.fields,help:mail.field_email_template_preview__report_name
@@ -3414,14 +3422,14 @@ msgstr ""
#: model:ir.model.fields,help:mail.field_mail_message__needaction
#: model_terms:ir.ui.view,arch_db:mail.view_message_search
msgid "Need Action"
-msgstr ""
+msgstr "ត្រូវការសកម្មភាព"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_compose_message__need_moderation
#: model:ir.model.fields,field_description:mail.field_mail_mail__need_moderation
#: model:ir.model.fields,field_description:mail.field_mail_message__need_moderation
msgid "Need moderation"
-msgstr ""
+msgstr "ត្រូវការល្មម"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_notification__res_partner_id
@@ -3613,7 +3621,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__no_auto_thread
#: model:ir.model.fields,field_description:mail.field_mail_message__no_auto_thread
msgid "No threading for answers"
-msgstr ""
+msgstr "គ្មានខ្សែស្រឡាយសម្រាប់ចម្លើយ"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_ir_actions_server__activity_note
@@ -3650,17 +3658,17 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_message__notification_ids
#: model:ir.model.fields,field_description:mail.field_mail_resend_message__notification_ids
msgid "Notifications"
-msgstr ""
+msgstr "កំណត់សំគាល់"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_compose_message__notify
msgid "Notify followers"
-msgstr ""
+msgstr "តាមដានកំណត់សំគាល់"
#. module: mail
#: model:ir.model.fields,help:mail.field_mail_compose_message__notify
msgid "Notify followers of the document (mass post only)"
-msgstr ""
+msgstr "ជូនដំណឹងអ្នកតាមដានឯកសារ (ប្រកាសតែប៉ុណ្ណោះ)"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_blacklist__message_needaction_counter
@@ -3834,6 +3842,9 @@ msgid ""
"attached, even if they did not reply to it. If set, this will disable the "
"creation of new records completely."
msgstr ""
+"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) "
+"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ "
+"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។"
#. module: mail
#: model:ir.model.fields,help:mail.field_email_template_preview__mail_server_id
@@ -3892,7 +3903,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__mail_server_id
#: model:ir.model.fields,field_description:mail.field_mail_message__mail_server_id
msgid "Outgoing mail server"
-msgstr ""
+msgstr "ម៉ាស៊ីនបម្រើសំបុត្រចេញ"
#. module: mail
#: selection:mail.activity,state:0
@@ -4149,7 +4160,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mail.email_template_form
#, python-format
msgid "Preview"
-msgstr ""
+msgstr "ពីមុន"
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.email_template_preview_form
@@ -4252,7 +4263,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form
#: model_terms:ir.ui.view,arch_db:mail.view_message_form
msgid "Recipients"
-msgstr ""
+msgstr "អ្នកទទួល"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_activity__recommended_activity_type_id
@@ -4316,7 +4327,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_message__res_id
#: model:ir.model.fields,field_description:mail.field_mail_wizard_invite__res_id
msgid "Related Document ID"
-msgstr ""
+msgstr "លេខសម្គាល់ឯកសារដែលទាក់ទង"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_email_template_preview__model
@@ -4486,7 +4497,7 @@ msgstr ""
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form
msgid "Save as new template"
-msgstr ""
+msgstr "រក្សាទុកជាគំរូថ្មី"
#. module: mail
#. openerp-web
@@ -4727,7 +4738,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_search
#: model_terms:ir.ui.view,arch_db:mail.res_partner_view_search_inherit_mail
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: mail
#: code:addons/mail/models/mail_channel.py:914
@@ -4861,7 +4872,7 @@ msgstr ""
#. module: mail
#: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form
msgid "Subject..."
-msgstr ""
+msgstr "ប្រធានបទ ..."
#. module: mail
#. openerp-web
@@ -5127,6 +5138,8 @@ msgid ""
"Tracked values are stored in a separate model. This field allow to "
"reconstruct the tracking and to generate statistics on the model."
msgstr ""
+"តម្លៃដែលបានតាមដានត្រូវបានរក្សាទុកក្នុងគំរូដាច់ដោយឡែកមួយ។ "
+"កន្លែងនេះអនុញ្ញាតឱ្យធ្វើការជួសជុលឡើងវិញនិងបង្កើតស្ថិតិលើគំរូ។"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_ir_model_fields__track_visibility
diff --git a/addons/mail/i18n/vi.po b/addons/mail/i18n/vi.po
index 4bbf29e95d9..c5d554021e1 100644
--- a/addons/mail/i18n/vi.po
+++ b/addons/mail/i18n/vi.po
@@ -3471,7 +3471,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_mail__moderation_status
#: model:ir.model.fields,field_description:mail.field_mail_message__moderation_status
msgid "Moderation Status"
-msgstr ""
+msgstr "Trạng thái kiểm duyệt"
#. module: mail
#: model:ir.model.fields,field_description:mail.field_res_users__moderation_counter
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index 37720077b66..757a77735f3 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -2017,8 +2017,8 @@ class MailThread(models.AbstractModel):
message_format_values = False
if inbox_pids:
message_format_values = message.message_format()[0]
- for partner in self.env['res.partner'].browse(inbox_pids):
- bus_notifications.append([(self._cr.dbname, 'ir.needaction', partner), dict(message_format_values)])
+ for partner_id in inbox_pids:
+ bus_notifications.append([(self._cr.dbname, 'ir.needaction', partner_id), dict(message_format_values)])
if channel_ids:
bus_notifications += self.env['mail.channel'].sudo().browse(channel_ids)._channel_message_notifications(message, message_format_values)
if bus_notifications:
diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js
index 93c6ca58d1c..79bb48819d5 100644
--- a/addons/mail/static/src/js/activity.js
+++ b/addons/mail/static/src/js/activity.js
@@ -382,7 +382,7 @@ var BasicActivity = AbstractField.extend({
container: $markDoneBtn,
title : _t("Feedback"),
html: true,
- trigger:'click',
+ trigger: 'manual',
placement: 'right', // FIXME: this should work, maybe a bug in the popper lib
content : function () {
var $popover = $(QWeb.render('mail.activity_feedback_form', {
@@ -399,6 +399,11 @@ var BasicActivity = AbstractField.extend({
$popover.find('#activity_feedback').focus();
self._bindPopoverFocusout($(this));
}).popover('show');
+ } else {
+ var popover = $markDoneBtn.data('bs.popover');
+ if ($('#' + popover.tip.id).length === 0) {
+ popover.show();
+ }
}
},
/**
diff --git a/addons/mail/static/src/js/models/threads/dm_chat.js b/addons/mail/static/src/js/models/threads/dm_chat.js
index c0ba9c527b0..78cc01a7044 100644
--- a/addons/mail/static/src/js/models/threads/dm_chat.js
+++ b/addons/mail/static/src/js/models/threads/dm_chat.js
@@ -101,6 +101,19 @@ var DMChat = TwoUserChannel.extend(ChannelSeenMixin, {
getStatus: function () {
return this.call('mail_service', 'getImStatus', { partnerID: this._directPartnerID });
},
+
+ /**
+ * @param {Object} data
+ * @param {string} data.outOfOfficeMessage
+ * @param {string} data.outOfOfficeDateEnd
+ */
+ updateOutOfOfficeInfo: function (data) {
+ this._outOfOfficeMessage = data.outOfOfficeMessage;
+ this._outOfOfficeDateEnd = data.outOfOfficeDateEnd;
+ this.call('mail_service', 'getMailBus').trigger('updated_out_of_office', {
+ threadID: this.getID(),
+ });
+ }
});
return DMChat;
diff --git a/addons/mail/static/src/js/models/threads/document_thread.js b/addons/mail/static/src/js/models/threads/document_thread.js
index 08e441610ee..b4f1df097cf 100644
--- a/addons/mail/static/src/js/models/threads/document_thread.js
+++ b/addons/mail/static/src/js/models/threads/document_thread.js
@@ -329,7 +329,9 @@ var DocumentThread = Thread.extend({
.then(function (messages) {
messages[0].model = resModel;
messages[0].res_id = resID;
- self.call('mail_service', 'addMessage', messages[0]);
+ self.call('mail_service', 'addMessage', messages[0], {
+ postedFromDocumentThread: true,
+ });
return messages[0];
});
});
diff --git a/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js b/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js
index 7d97538dbb9..3c98836dc70 100644
--- a/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js
+++ b/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js
@@ -171,11 +171,15 @@ var ThreadTypingMixin = {
if (this._isTypingMyselfInfo(params)) {
return;
}
+ var partnerID = params.partnerID;
this._othersTypingTimers.registerTimer({
- timeoutCallbackArguments: [params.partnerID],
- timerID: params.partnerID,
+ timeoutCallbackArguments: [partnerID],
+ timerID: partnerID,
});
- this._typingPartnerIDs.push(params.partnerID);
+ if (_.contains(this._typingPartnerIDs, partnerID)) {
+ return;
+ }
+ this._typingPartnerIDs.push(partnerID);
this._warnUpdatedTypingPartners();
},
/**
@@ -209,6 +213,9 @@ var ThreadTypingMixin = {
unregisterTyping: function (params) {
var partnerID = params.partnerID;
this._othersTypingTimers.unregisterTimer({ timerID: partnerID });
+ if (!_.contains(this._typingPartnerIDs, partnerID)) {
+ return;
+ }
this._typingPartnerIDs = _.reject(this._typingPartnerIDs, function (id) {
return id === partnerID;
});
diff --git a/addons/mail/static/src/js/services/mail_document_thread_manager.js b/addons/mail/static/src/js/services/mail_document_thread_manager.js
index f1d9eefb44a..acf06461a04 100644
--- a/addons/mail/static/src/js/services/mail_document_thread_manager.js
+++ b/addons/mail/static/src/js/services/mail_document_thread_manager.js
@@ -48,23 +48,16 @@ MailManager.include({
*
* @override
* @param {Object} data
- * @param {Array} [data.author_id] [int, string] where int is server ID of
- * the author, and string is the name of the author.
* @param {integer} data.id server ID of the message
- * @param {string} [data.model] the model name of the document that this
- * message is related to.
- * @param {integer} [data.res_id] the ID of the document that this message
- * is related to.
- *
+ * @param {Object} [options]
+ * @param {boolean} [options.postedFromDocumentThread=false]
*/
- addMessage: function (data) {
+ addMessage: function (data, options) {
var message = this.getMessage(data.id);
if (
!message &&
- data.res_id &&
- data.model &&
- data.author_id &&
- data.author_id[0] === session.partner_id
+ options &&
+ options.postedFromDocumentThread
) {
var key = this.DOCUMENT_THREAD_MESSAGE_KEY;
this.call('local_storage', 'setItem', key, data);
diff --git a/addons/mail/static/src/js/services/mail_notification_manager.js b/addons/mail/static/src/js/services/mail_notification_manager.js
index caf0c3c4e12..c22276867b1 100644
--- a/addons/mail/static/src/js/services/mail_notification_manager.js
+++ b/addons/mail/static/src/js/services/mail_notification_manager.js
@@ -417,6 +417,9 @@ MailManager.include({
this._handlePartnerUserConnectionNotification(data);
} else if (data.info === 'channel_seen') {
this._handlePartnerChannnelSeenNotification(data);
+ } else if (data.type === 'simple_notification') {
+ var title = _.escape(data.title), message = _.escape(data.message);
+ data.warning ? this.do_warn(title, message, data.sticky) : this.do_notify(title, message, data.sticky);
} else {
this._handlePartnerChannelNotification(data);
}
diff --git a/addons/mail/static/src/js/services/mail_status_manager.js b/addons/mail/static/src/js/services/mail_status_manager.js
index 7891461c9af..a40299a02d5 100644
--- a/addons/mail/static/src/js/services/mail_status_manager.js
+++ b/addons/mail/static/src/js/services/mail_status_manager.js
@@ -54,13 +54,45 @@ MailManager.include({
updateImStatus: function (statusList) {
var updatedIDs = [];
var self = this;
+ var dmChat;
+ var toUpdateOutOfOfficeChatIDs = [];
_.each(statusList, function (status) {
if (self._imStatus[status.id] === status.im_status) {
return;
}
+ if (
+ status.im_status.indexOf('leave') !== -1 ||
+ (
+ self._imStatus[status.id] &&
+ self._imStatus[status.id].indexOf('leave') !== -1
+ )
+ ) {
+ dmChat = self.getDMChatFromPartnerID(status.id);
+ if (dmChat) {
+ toUpdateOutOfOfficeChatIDs.push(dmChat.getID());
+ }
+ }
updatedIDs.push(status.id);
self._imStatus[status.id] = status.im_status;
});
+ if (!_.isEmpty(toUpdateOutOfOfficeChatIDs)) {
+ this._rpc({
+ model: 'mail.channel',
+ method: 'channel_info',
+ args: [toUpdateOutOfOfficeChatIDs],
+ }).then(function (channelsInfo) {
+ _.each(channelsInfo, function (channelInfo) {
+ dmChat = self.getChannel(channelInfo.id);
+ if (!dmChat) {
+ return;
+ }
+ dmChat.updateOutOfOfficeInfo({
+ outOfOfficeMessage: channelInfo.direct_partner[0].out_of_office_message,
+ outOfOfficeDateEnd: channelInfo.direct_partner[0].out_of_office_date_end,
+ });
+ });
+ });
+ }
if (! _.isEmpty(updatedIDs)) {
this._mailBus.trigger('updated_im_status', updatedIDs); // useful for thread window header
this._renderImStatus(updatedIDs);
diff --git a/addons/mail/static/src/js/services/mail_window_manager.js b/addons/mail/static/src/js/services/mail_window_manager.js
index 6214fc8b5b7..81f0ef7e97c 100644
--- a/addons/mail/static/src/js/services/mail_window_manager.js
+++ b/addons/mail/static/src/js/services/mail_window_manager.js
@@ -344,6 +344,7 @@ MailManager.include({
.on('is_thread_bottom_visible', this, this._onIsThreadBottomVisible)
.on('unsubscribe_from_channel', this, this._onUnsubscribeFromChannel)
.on('updated_im_status', this, this._onUpdatedImStatus)
+ .on('updated_out_of_office', this, this._onUpdatedOutOfOffice)
.on('update_thread_unread_counter', this, this._onUpdateThreadUnreadCounter);
core.bus.on('resize', this, _.debounce(this._repositionThreadWindows.bind(this), 100));
@@ -701,6 +702,18 @@ MailManager.include({
});
},
/**
+ * @private
+ * @param {Object} data
+ * @param {integer} data.threadID
+ */
+ _onUpdatedOutOfOffice: function (data) {
+ var threadWindow = this._getThreadWindow(data.threadID);
+ if (!threadWindow) {
+ return;
+ }
+ threadWindow.renderOutOfOffice();
+ },
+ /**
* Called when a thread has its unread counter that has changed.
* The unread counter on the thread windows should be updated.
*
diff --git a/addons/mail/static/src/js/thread_windows/thread_window.js b/addons/mail/static/src/js/thread_windows/thread_window.js
index 9999014a08d..16d5cd31c86 100644
--- a/addons/mail/static/src/js/thread_windows/thread_window.js
+++ b/addons/mail/static/src/js/thread_windows/thread_window.js
@@ -6,6 +6,7 @@ var BasicComposer = require('mail.composer.Basic');
var core = require('web.core');
+var QWeb = core.qweb;
var _t = core._t;
/**
@@ -153,6 +154,23 @@ var ThreadWindow = AbstractThreadWindow.extend({
removePassive: function () {
this._passive = false;
},
+ renderOutOfOffice: function () {
+ var $outOfOffice = this.$('.o_out_of_office');
+ if (!this.getOutOfOfficeInfo() && !this.getOutOfOfficeMessage()) {
+ if ($outOfOffice.length) {
+ $outOfOffice.remove();
+ }
+ return;
+ }
+ var $newOutOfOffice = $(QWeb.render('mail.thread_window.OutOfOffice', {
+ widget: this,
+ }));
+ if ($outOfOffice.length) {
+ $outOfOffice.replaceWith($newOutOfOffice);
+ } else {
+ $newOutOfOffice.insertAfter(this.$('.o_thread_window_header'));
+ }
+ },
/**
* Update this thread window
*
diff --git a/addons/mail/static/src/scss/abstract_thread_window.scss b/addons/mail/static/src/scss/abstract_thread_window.scss
index f49797e928f..ab868b5dc18 100644
--- a/addons/mail/static/src/scss/abstract_thread_window.scss
+++ b/addons/mail/static/src/scss/abstract_thread_window.scss
@@ -39,8 +39,9 @@ $o-mail-thread-window-zindex: $zindex-modal + 1 !default;
padding: 8px;
@include media-breakpoint-down(sm) {
+ align-items: center;
height: $o-mail-chat-header-height;
- padding-top: 12px;
+ padding: 0;
border-radius: 0px;
.o_thread_window_title {
font-size: 16px;
@@ -48,7 +49,9 @@ $o-mail-thread-window-zindex: $zindex-modal + 1 !default;
}
.o_thread_window_close {
- font-size: 17px;
+ $o-close-font-size: 17px;
+ padding: (($o-mail-chat-header-height - $o-close-font-size) / 2);
+ font-size: $o-close-font-size;
color: white;
}
}
diff --git a/addons/mail/static/src/scss/discuss.scss b/addons/mail/static/src/scss/discuss.scss
index 8c5780a7185..6092ab733fc 100644
--- a/addons/mail/static/src/scss/discuss.scss
+++ b/addons/mail/static/src/scss/discuss.scss
@@ -287,7 +287,8 @@
}
.o_mail_discuss_content {
- flex: 1 0 0;
+ flex: 1 1 auto;
+ min-height: 0;
margin-left: 10px;
margin-right: 10px;
background-color: transparent;
diff --git a/addons/mail/static/src/xml/abstract_thread_window.xml b/addons/mail/static/src/xml/abstract_thread_window.xml
index 89c45323c7a..9bc83b79242 100644
--- a/addons/mail/static/src/xml/abstract_thread_window.xml
+++ b/addons/mail/static/src/xml/abstract_thread_window.xml
@@ -66,7 +66,7 @@
-->
<t t-name="mail.AbstractThreadWindow.HeaderContent">
<span t-if="widget.isMobile()">
- <a href="#" class="o_thread_window_close fa fa-1x fa-arrow-left mr4" aria-label="Close chat window" title="Close chat window"/>
+ <a href="#" class="o_thread_window_close fa fa-1x fa-arrow-left" aria-label="Close chat window" title="Close chat window"/>
</span>
<span class="o_thread_window_title">
<t t-if="status" t-call="mail.UserStatus"/>
diff --git a/addons/mail/static/src/xml/thread_window.xml b/addons/mail/static/src/xml/thread_window.xml
index 76a130d1ba2..a9e2131cbdb 100644
--- a/addons/mail/static/src/xml/thread_window.xml
+++ b/addons/mail/static/src/xml/thread_window.xml
@@ -6,13 +6,7 @@
-->
<t t-name="mail.ThreadWindow" t-extend="mail.AbstractThreadWindow">
<t t-jquery=".o_thread_window_header" t-operation="after">
- <div class="o_out_of_office" t-if="widget.getOutOfOfficeInfo() or widget.getOutOfOfficeMessage()">
- <div class="o_out_of_office_info" t-if="widget.getOutOfOfficeInfo()" t-esc="widget.getOutOfOfficeInfo()"/>
- <div class="o_out_of_office_text o_text_wrap" t-if="widget.getOutOfOfficeMessage()">
- <t t-esc="widget.getOutOfOfficeMessage()"/>
- <a href="#" class="o_out_of_office_read_more_less_button">Read more</a>
- </div>
- </div>
+ <t t-call="mail.thread_window.OutOfOffice" t-if="widget.getOutOfOfficeInfo() or widget.getOutOfOfficeMessage()"/>
<div t-if="!widget.hasThread()" class="o_thread_search_input">
<span> To: </span>
<input type="text" placeholder="User name"/>
@@ -21,6 +15,17 @@
</t>
<!--
+ @param {mail.ThreadWindow} widget
+ -->
+ <div class="o_out_of_office" t-name="mail.thread_window.OutOfOffice">
+ <div class="o_out_of_office_info" t-if="widget.getOutOfOfficeInfo()" t-esc="widget.getOutOfOfficeInfo()"/>
+ <div class="o_out_of_office_text o_text_wrap" t-if="widget.getOutOfOfficeMessage()">
+ <t t-esc="widget.getOutOfOfficeMessage()"/>
+ <a href="#" class="o_out_of_office_read_more_less_button">Read more</a>
+ </div>
+ </div>
+
+ <!--
@param {string} expandTitle text to display on mouse hover (title attribute)
-->
<t t-extend="mail.AbstractThreadWindow.HeaderContent">
diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js
index 354cff95a75..bb569645c4d 100644
--- a/addons/mail/static/tests/chatter_tests.js
+++ b/addons/mail/static/tests/chatter_tests.js
@@ -7,6 +7,7 @@ var core = require('web.core');
var FormView = require('web.FormView');
var KanbanView = require('web.KanbanView');
var testUtils = require('web.test_utils');
+var concurrency = require('web.concurrency');
var createView = testUtils.createView;
@@ -1858,6 +1859,74 @@ QUnit.test('form activity widget: schedule next activity', async function (asser
form.destroy();
});
+QUnit.test('form activity widget: do not close activity popover on click', async function (assert) {
+ assert.expect(3);
+ this.data.partner.records[0].activity_ids = [1];
+ this.data.partner.records[0].activity_state = 'today';
+ this.data['mail.activity'].records = [{
+ id: 1,
+ display_name: "An activity",
+ date_deadline: moment().format("YYYY-MM-DD"), // now
+ can_write: true,
+ state: "today",
+ user_id: 2,
+ create_user_id: 2,
+ activity_type_id: 2,
+ }];
+
+ const form = await createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ services: this.services,
+ arch: `<form string="Partners">
+ <sheet>
+ <field name="foo"/>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ <field name="activity_ids" widget="mail_activity"/>
+ </div>
+ </form>`,
+ res_id: 2,
+ mockRPC(route, args) {
+ if (route === '/web/dataset/call_kw/mail.activity/action_feedback_schedule_next') {
+ return Promise.resolve();
+ }
+ return this._super.apply(this, arguments);
+ },
+ intercepts: {
+ do_action(ev) {
+ ev.data.options.on_close();
+ },
+ },
+ });
+
+ //Schedule next activity
+ await testUtils.dom.click(form.$('.o_mail_activity .o_mark_as_done[data-activity-id=1]'));
+
+ for (let i = 0; i < 2; i++) {
+ // click twice in feedback area
+ await testUtils.dom.click(form.$('.o_mail_activity_feedback.popover textarea'));
+ const $popover = form.$('.o_mail_activity_feedback.popover');
+ const $PopoverInDom = form.$(`#${$popover.attr('id')}`);
+ assert.isVisible(
+ $PopoverInDom,
+ "the feedback popover should still be visible on click");
+ }
+ await concurrency.delay(250); // wait for popover transition
+ const $popover = form.$('.o_mail_activity_feedback.popover');
+ if (!$popover) {
+ throw new Error("popover should be in DOM");
+ }
+ const $PopoverInDom = form.$(`#${$popover.attr('id')}`);
+ assert.isVisible(
+ $PopoverInDom,
+ "the feedback popover should still be visible on click");
+
+ form.destroy();
+});
+
QUnit.test('form activity widget: edit next activity', async function (assert) {
assert.expect(3);
diff --git a/addons/mail/static/tests/document_thread_window_tests.js b/addons/mail/static/tests/document_thread_window_tests.js
index 51daf3a23b1..86d06ba36c4 100644
--- a/addons/mail/static/tests/document_thread_window_tests.js
+++ b/addons/mail/static/tests/document_thread_window_tests.js
@@ -48,7 +48,7 @@ QUnit.module('Document Thread', {
},
records: [{
id: 1,
- author_id: [1, 'Me'],
+ author_id: [partnerID, 'Me'],
body: '<p>Some Message on a document</p>',
channel_ids: [],
model: 'some.res.model',
diff --git a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js b/addons/mail/static/tests/thread_window/basic_thread_window_tests.js
index d5af9cf5357..7c3cfbdc793 100644
--- a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js
+++ b/addons/mail/static/tests/thread_window/basic_thread_window_tests.js
@@ -726,6 +726,119 @@ QUnit.test('no out-of-office status in thread window', async function (assert) {
parent.destroy();
});
+QUnit.test('auto-update out-of-office info on im_status change', async function (assert) {
+ assert.expect(5);
+
+ var imStatusDefs = [testUtils.makeTestPromise(), testUtils.makeTestPromise()];
+ var channelInfoDefs = [testUtils.makeTestPromise(), testUtils.makeTestPromise()];
+ var timeoutMock = mailTestUtils.patchMailTimeouts();
+ var step = 0;
+
+ this.data = {
+ 'mail.message': {
+ fields: {},
+ records: [],
+ },
+ initMessaging: {
+ channel_slots: {
+ channel_channel: [{
+ id: 1,
+ name: "DM",
+ channel_type: "chat",
+ message_unread_counter: 0,
+ direct_partner: [{
+ id: 666,
+ name: 'DemoUser1',
+ im_status: 'online',
+ }],
+ }],
+ },
+ },
+ };
+
+ var parent = this.createParent({
+ data: this.data,
+ services: this.services,
+ mockRPC: function (route, args) {
+ if (route === '/longpolling/im_status') {
+ step++;
+ if (step === 1) {
+ imStatusDefs[0].resolve();
+ return Promise.resolve([
+ {
+ id: 666,
+ im_status: 'leave',
+ },
+ ]);
+ } else if (step === 2) {
+ imStatusDefs[1].resolve();
+ return Promise.resolve([
+ {
+ id: 666,
+ im_status: 'online',
+ },
+ ]);
+ }
+ }
+ if (args.method === 'channel_info') {
+ if (step === 1) {
+ channelInfoDefs[0].resolve();
+ return Promise.resolve([{
+ id: 1,
+ direct_partner: [{
+ out_of_office_message: "Leave me alone",
+ out_of_office_date_end: false,
+ }],
+ }]);
+ }
+ else if (step === 2) {
+ channelInfoDefs[1].resolve();
+ return Promise.resolve([{
+ id: 1,
+ direct_partner: [{
+ out_of_office_message: false,
+ out_of_office_date_end: false,
+ }],
+ }]);
+ }
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ await testUtils.nextTick();
+
+ // detach channel 1, so that it opens corresponding thread window.
+ parent.call('mail_service', 'getChannel', 1).detach();
+ await testUtils.nextTick();
+
+ assert.containsNone($, '.o_out_of_office',
+ "should contain no out of office section on chat window initially");
+
+ timeoutMock.addTime(51*1000); // wait for next im status fetch
+
+ await Promise.all([imStatusDefs[0], channelInfoDefs[0]]);
+ await testUtils.nextTick();
+ assert.containsOnce($, '.o_out_of_office',
+ "should contain out of office section on chat window");
+ assert.containsOnce($, '.o_out_of_office > .o_out_of_office_text',
+ "should contain out of office text on chat window");
+ assert.ok(
+ $('.o_out_of_office > .o_out_of_office_text')
+ .text()
+ .replace(/\s/g, "")
+ .indexOf("Leavemealone") !== -1,
+ "should contain out of office text on chat window");
+ timeoutMock.addTime(51*1000); // wait for next im status fetch
+
+ await Promise.all([imStatusDefs[1], channelInfoDefs[1]]);
+ await testUtils.nextTick();
+ assert.containsNone($, '.o_out_of_office',
+ "should no longer contain out of office section on chat window");
+
+ timeoutMock.runPendingTimeouts();
+ parent.destroy();
+});
+
});
});
});
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index ac05a1cf2a0..2abc898f368 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -324,6 +324,7 @@ class MailComposer(models.TransientModel):
'attachment_ids': [attach.id for attach in self.attachment_ids],
'author_id': self.author_id.id,
'email_from': self.email_from,
+ 'reply_to': self.reply_to,
'record_name': self.record_name,
'no_auto_thread': self.no_auto_thread,
'mail_server_id': self.mail_server_id.id,
diff --git a/addons/mail_bot/i18n/cs.po b/addons/mail_bot/i18n/cs.po
index 058f1da8015..b60684453f5 100644
--- a/addons/mail_bot/i18n/cs.po
+++ b/addons/mail_bot/i18n/cs.po
@@ -129,7 +129,7 @@ msgstr "Naposled změněno"
#. module: mail_bot
#: model:ir.model,name:mail_bot.model_mail_bot
msgid "Mail Bot"
-msgstr ""
+msgstr "e-mailový robot"
#. module: mail_bot
#: code:addons/mail_bot/models/mail_bot.py:45
diff --git a/addons/maintenance/i18n/km.po b/addons/maintenance/i18n/km.po
index 8dd3ab5d1ab..9d04fa7a7e2 100644
--- a/addons/maintenance/i18n/km.po
+++ b/addons/maintenance/i18n/km.po
@@ -154,12 +154,12 @@ msgstr ""
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_contact
msgid "Alias Contact Security"
-msgstr ""
+msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន"
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_name
msgid "Alias Name"
-msgstr ""
+msgstr "ឈ្មោះក្លែក្លាយ"
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_domain
@@ -169,7 +169,7 @@ msgstr ""
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_model_id
msgid "Aliased Model"
-msgstr ""
+msgstr "គំរូឈ្មោះក្លែងក្លាយ"
#. module: maintenance
#: model_terms:ir.ui.view,arch_db:maintenance.maintenance_team_kanban
@@ -184,7 +184,7 @@ msgstr ""
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_request__archive
msgid "Archive"
-msgstr ""
+msgstr "សម្រេចគោលដៅ"
#. module: maintenance
#: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_request_view_search
@@ -565,7 +565,7 @@ msgstr "ID"
msgid ""
"ID of the parent record holding the alias (example: project holding the task"
" creation alias)"
-msgstr ""
+msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់"
#. module: maintenance
#: model:ir.model.fields,help:maintenance.field_maintenance_equipment__message_unread
@@ -950,6 +950,9 @@ msgid ""
"attached, even if they did not reply to it. If set, this will disable the "
"creation of new records completely."
msgstr ""
+"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) "
+"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ "
+"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។"
#. module: maintenance
#: model:ir.ui.menu,name:maintenance.menu_m_reports_oee
@@ -1185,7 +1188,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_request_view_search
#: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_view_search
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: maintenance
#: model:maintenance.equipment.category,name:maintenance.equipment_software
diff --git a/addons/mass_mailing/i18n/km.po b/addons/mass_mailing/i18n/km.po
index bc7a106267c..6127e001113 100644
--- a/addons/mass_mailing/i18n/km.po
+++ b/addons/mass_mailing/i18n/km.po
@@ -770,7 +770,7 @@ msgstr ""
#. module: mass_mailing
#: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_campaign_form
msgid "Duplicate"
-msgstr ""
+msgstr "ត្រួត"
#. module: mass_mailing
#: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_list_kanban
@@ -1162,7 +1162,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mass_mailing.field_mail_mass_mailing_list_contact_rel__list_id
#: model:ir.model.fields,field_description:mass_mailing.field_survey_mail_compose_message__mailing_list_ids
msgid "Mailing List"
-msgstr ""
+msgstr "តារាងសំបុត្រ"
#. module: mass_mailing
#: model:ir.actions.act_window,name:mass_mailing.action_view_mass_mailing_contacts
@@ -1685,7 +1685,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_form
#: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_list_form
msgid "Recipients"
-msgstr ""
+msgstr "អ្នកទទួល"
#. module: mass_mailing
#: model:ir.model.fields,field_description:mass_mailing.field_mail_mass_mailing__mailing_model_id
diff --git a/addons/mass_mailing/i18n/vi.po b/addons/mass_mailing/i18n/vi.po
index 88d904e8298..95afa1d6694 100644
--- a/addons/mass_mailing/i18n/vi.po
+++ b/addons/mass_mailing/i18n/vi.po
@@ -1326,7 +1326,7 @@ msgstr "Liên hệ gửi email hàng loạt"
#: model:ir.model.fields,field_description:mass_mailing.field_mail_compose_message__mass_mailing_name
#: model:ir.model.fields,field_description:mass_mailing.field_survey_mail_compose_message__mass_mailing_name
msgid "Mass Mailing Name"
-msgstr ""
+msgstr "Tên gửi mail hàng loạt"
#. module: mass_mailing
#: model:ir.model,name:mass_mailing.model_mass_mailing_schedule_date
diff --git a/addons/mass_mailing_crm/i18n/ar.po b/addons/mass_mailing_crm/i18n/ar.po
index fc6d7c8b889..7154e190678 100644
--- a/addons/mass_mailing_crm/i18n/ar.po
+++ b/addons/mass_mailing_crm/i18n/ar.po
@@ -3,15 +3,15 @@
# * mass_mailing_crm
#
# Translators:
-# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-08 06:49+0000\n"
-"PO-Revision-Date: 2018-10-08 06:49+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:20+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,35 +22,35 @@ msgstr ""
#. module: mass_mailing_crm
#: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_lead_count
msgid "Lead Count"
-msgstr ""
+msgstr "عدد الترشيحات"
#. module: mass_mailing_crm
#: model:mail.mass_mailing,name:mass_mailing_crm.mass_mail_lead_0
#: model:utm.source,name:mass_mailing_crm.mass_mail_lead_0_utm_source
msgid "Lead Newsletter"
-msgstr ""
+msgstr "النشرة البريدية للترشيح"
#. module: mass_mailing_crm
#: model_terms:ir.ui.view,arch_db:mass_mailing_crm.mail_mass_mailing_view_form
msgid "Leads"
-msgstr "المرشحيين "
+msgstr "الترشيحات"
#. module: mass_mailing_crm
#: model:ir.model,name:mass_mailing_crm.model_mail_mass_mailing
msgid "Mass Mailing"
-msgstr "المراسلات"
+msgstr "المراسلات الجماعية"
#. module: mass_mailing_crm
#: model_terms:ir.ui.view,arch_db:mass_mailing_crm.mail_mass_mailing_view_form
msgid "Opportunities"
-msgstr "الفرص "
+msgstr "الفرص"
#. module: mass_mailing_crm
#: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_opportunities_count
msgid "Opportunities Count"
-msgstr ""
+msgstr "عدد الفرص"
#. module: mass_mailing_crm
#: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_lead_activated
msgid "Use Leads"
-msgstr ""
+msgstr "استخدام الترشيحات"
diff --git a/addons/mass_mailing_event/i18n/ar.po b/addons/mass_mailing_event/i18n/ar.po
index 30b6033b7d7..861cd8c05d5 100644
--- a/addons/mass_mailing_event/i18n/ar.po
+++ b/addons/mass_mailing_event/i18n/ar.po
@@ -3,8 +3,7 @@
# * mass_mailing_event
#
# Translators:
-# Martin Trigaux, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
#
msgid ""
msgstr ""
@@ -12,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
"PO-Revision-Date: 2018-08-24 09:20+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,14 +22,14 @@ msgstr ""
#. module: mass_mailing_event
#: model_terms:ir.ui.view,arch_db:mass_mailing_event.event_event_view_form_inherit_mass_mailing
msgid "<span class=\"o_stat_text\">Mail Attendees</span>"
-msgstr ""
+msgstr "<span class=\"o_stat_text\">إرسال رسالة للحضور</span>"
#. module: mass_mailing_event
#: model:ir.model,name:mass_mailing_event.model_event_event
msgid "Event"
-msgstr "الحدث"
+msgstr "الفعالية"
#. module: mass_mailing_event
#: model:ir.model,name:mass_mailing_event.model_mail_mass_mailing
msgid "Mass Mailing"
-msgstr "المراسلات"
+msgstr "المراسلات الجماعية"
diff --git a/addons/mrp/i18n/km.po b/addons/mrp/i18n/km.po
index ee0f635d6e1..9e19ca8aa31 100644
--- a/addons/mrp/i18n/km.po
+++ b/addons/mrp/i18n/km.po
@@ -1636,7 +1636,7 @@ msgstr ""
#. module: mrp
#: model_terms:ir.ui.view,arch_db:mrp.mrp_production_form_view
msgid "Lock"
-msgstr ""
+msgstr "ចាក់សោរ"
#. module: mrp
#: model:ir.model.fields,field_description:mrp.field_mrp_workcenter_productivity__loss_id
@@ -1914,7 +1914,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mrp.mrp_production_form_view
#: model_terms:ir.ui.view,arch_db:mrp.mrp_production_workorder_form_view_inherit
msgid "Miscellaneous"
-msgstr ""
+msgstr "ផ្សេងៗ"
#. module: mrp
#: model:ir.model.fields,field_description:mrp.field_mrp_product_produce_line__move_id
@@ -2192,7 +2192,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mrp.workcenter_line_pivot
#, python-format
msgid "Operations"
-msgstr ""
+msgstr "ប្រតិបត្តិការ"
#. module: mrp
#: model_terms:ir.ui.view,arch_db:mrp.report_mrporder
@@ -2733,7 +2733,7 @@ msgstr ""
#: code:addons/mrp/static/src/xml/mrp.xml:10
#, python-format
msgid "Quantity:"
-msgstr ""
+msgstr "បរិមាណ:"
#. module: mrp
#: model_terms:ir.ui.view,arch_db:mrp.view_mrp_production_filter
@@ -3079,7 +3079,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mrp.mrp_unbuild_search_view
#: model_terms:ir.ui.view,arch_db:mrp.view_mrp_production_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: mrp
#: model:product.product,description:mrp.product_product_computer_desk_head
diff --git a/addons/mrp_account/i18n/ar.po b/addons/mrp_account/i18n/ar.po
index 09e8be7c35a..1deb88a1904 100644
--- a/addons/mrp_account/i18n/ar.po
+++ b/addons/mrp_account/i18n/ar.po
@@ -5,14 +5,15 @@
# Translators:
# Mohammed Albasha <m.albasha.ma@gmail.com>, 2018
# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-02 10:06+0000\n"
-"PO-Revision-Date: 2018-10-02 10:06+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:21+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +28,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_product_view_form_normal_inherit_extended
#: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_variant_easy_edit_view_bom_inherit
msgid "Compute Price from BoM"
-msgstr ""
+msgstr "احتساب السعر من قائمة المواد"
#. module: mrp_bom_cost
#: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_product_ext_form_view2
@@ -37,8 +38,8 @@ msgid ""
"Compute the price of the product using products and operations of related "
"bill of materials, for manufactured products only."
msgstr ""
-"يحسب سعر المنتج باستخدام المنتجات والعمليات المقترن بفاتورة المواد "
-"والمنتجات المصنعة فقط."
+"يحتسب سعر المنتج باستخدام المنتجات والعمليات في قائمة المواد ذات الصلة، "
+"للمنتجات المصنعة فقط."
#. module: mrp_bom_cost
#: model:ir.model,name:mrp_bom_cost.model_product_product
@@ -57,3 +58,5 @@ msgid ""
"The inventory valuation of some products %s is automated. You can only "
"update their cost from the product form."
msgstr ""
+"تمت أتمتة تقييم المخزون لبعض المنتجات %s. لا يمكنك تحديث تكلفتهم إلا من خلال"
+" نموذج المنتج."
diff --git a/addons/note/i18n/km.po b/addons/note/i18n/km.po
index ecfad101c71..c9b09a8a839 100644
--- a/addons/note/i18n/km.po
+++ b/addons/note/i18n/km.po
@@ -78,7 +78,7 @@ msgstr ""
#. module: note
#: model_terms:ir.ui.view,arch_db:note.view_note_note_filter
msgid "Archive"
-msgstr ""
+msgstr "សម្រេចគោលដៅ"
#. module: note
#: model:ir.model.fields,field_description:note.field_note_note__message_attachment_count
@@ -433,7 +433,7 @@ msgstr ""
#. module: note
#: model_terms:ir.ui.view,arch_db:note.view_note_note_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: note
#: model:ir.model.fields,field_description:note.field_note_note__stage_id
diff --git a/addons/pad/i18n/km.po b/addons/pad/i18n/km.po
index ea1bd975ce2..091c768ed47 100644
--- a/addons/pad/i18n/km.po
+++ b/addons/pad/i18n/km.po
@@ -65,7 +65,7 @@ msgstr "កាលបរិច្ឆេតកែប្រែចុងក្រោ
#: code:addons/pad/static/src/js/pad.js:147
#, python-format
msgid "Loading"
-msgstr ""
+msgstr "ដំណើរការ"
#. module: pad
#: model:ir.model.fields,field_description:pad.field_res_company__pad_key
diff --git a/addons/pad_project/i18n/ar.po b/addons/pad_project/i18n/ar.po
index 8f64614bbbc..7ae96c2d9c3 100644
--- a/addons/pad_project/i18n/ar.po
+++ b/addons/pad_project/i18n/ar.po
@@ -3,15 +3,16 @@
# * pad_project
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.2\n"
+"Project-Id-Version: Odoo Server saas~11.5\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: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:21+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +23,7 @@ msgstr ""
#. module: pad_project
#: model:ir.model.fields,field_description:pad_project.field_project_task__description_pad
msgid "Pad URL"
-msgstr ""
+msgstr "رابط باد"
#. module: pad_project
#: model:ir.model,name:pad_project.model_project_project
@@ -37,15 +38,15 @@ msgstr "المهمة"
#. module: pad_project
#: model:ir.model.fields,field_description:pad_project.field_project_task__use_pad
msgid "Use collaborative pad"
-msgstr ""
+msgstr "استخدام منصات تعاونية"
#. module: pad_project
#: model:ir.model.fields,help:pad_project.field_project_project__use_pads
#: model:ir.model.fields,help:pad_project.field_project_task__use_pad
msgid "Use collaborative pad for the tasks on this project."
-msgstr ""
+msgstr "استخدام منصات تعاونية لمهمات هذا المشروع."
#. module: pad_project
#: model:ir.model.fields,field_description:pad_project.field_project_project__use_pads
msgid "Use collaborative pads"
-msgstr ""
+msgstr "استخدام منصات تعاونية"
diff --git a/addons/partner_autocomplete/i18n/ar.po b/addons/partner_autocomplete/i18n/ar.po
index ec558be1bc0..8637a950b78 100644
--- a/addons/partner_autocomplete/i18n/ar.po
+++ b/addons/partner_autocomplete/i18n/ar.po
@@ -26,7 +26,7 @@ msgstr ""
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
msgid "(Time Now)"
-msgstr ""
+msgstr "(الوقت الآن)"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form
@@ -34,6 +34,8 @@ msgid ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Buy more credits"
msgstr ""
+"<i class=\"fa fa-arrow-right\"/>\n"
+" شراء رصيد"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form
@@ -41,6 +43,8 @@ msgid ""
"<i class=\"fa fa-exclamation-triangle text-warning\"/> &amp;nbsp; You don't "
"have credits to auto-complete companies' data anymore."
msgstr ""
+"<i class=\"fa fa-exclamation-triangle text-warning\"/> &amp;nbsp; لم تعد "
+"تملك رصيدًا كافيًا لإكمال بيانات المؤسسات تلقائيًا."
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -48,6 +52,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-building text-primary\"/>\n"
" <b>Company type:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-building text-primary\"/>\n"
+" <b>نوع المؤسسة:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -55,6 +61,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-calendar text-primary\"/>\n"
" <b>Founded:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-calendar text-primary\"/>\n"
+" <b>أُسست:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -62,6 +70,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-cube text-primary\"/>\n"
" <b>Technology Used :</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-cube text-primary\"/>\n"
+" <b>التقنية المستخدمة:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -69,6 +79,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-envelope text-primary\"/>\n"
" <b>Email :</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-envelope text-primary\"/>\n"
+" <b>البريد الإلكتروني:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -76,6 +88,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-globe text-primary\"/>\n"
" <b>Timezone :</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-globe text-primary\"/>\n"
+" <b>المنطقة الزمنية:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -83,6 +97,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-industry text-primary\"/>\n"
" <b>Sector:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-industry text-primary\"/>\n"
+" <b>القطاع:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -90,6 +106,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n"
" <b>Annual revenue:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n"
+" <b>العائد السنوي:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -97,6 +115,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n"
" <b>Estimated annual revenue:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n"
+" <b>العائد السنوي المقدر:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -104,6 +124,8 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-phone text-primary\"/>\n"
" <b>Phone :</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-phone text-primary\"/>\n"
+" <b>الهاتف:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
@@ -111,16 +133,18 @@ msgid ""
"<i class=\"fa fa-fw mr-2 fa-users text-primary\"/>\n"
" <b>Employees:</b>"
msgstr ""
+"<i class=\"fa fa-fw mr-2 fa-users text-primary\"/>\n"
+" <b>الموظفون:</b>"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form
msgid "<span>&amp;times;</span>"
-msgstr ""
+msgstr "<span>أوقات</span>"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner__additional_info
msgid "Additional info"
-msgstr ""
+msgstr "معلومات إضافية"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form
@@ -136,7 +160,7 @@ msgstr "المؤسسات"
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_company__partner_gid
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner__partner_gid
msgid "Company database ID"
-msgstr ""
+msgstr "معرف قاعدة بيانات المؤسسة"
#. module: partner_autocomplete
#: model:ir.model,name:partner_autocomplete.model_res_config_settings
@@ -161,7 +185,7 @@ msgstr "أنشئ في"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__id
@@ -171,12 +195,12 @@ msgstr "المعرف"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_config_settings__partner_autocomplete_insufficient_credit
msgid "Insufficient credit"
-msgstr ""
+msgstr "رصيد غير كاف"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__synched
msgid "Is synched"
-msgstr ""
+msgstr "متزامن"
#. module: partner_autocomplete
#: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync____last_update
@@ -203,17 +227,17 @@ msgstr "الشريك"
#: model:ir.cron,cron_name:partner_autocomplete.ir_cron_partner_autocomplete
#: model:ir.cron,name:partner_autocomplete.ir_cron_partner_autocomplete
msgid "Partner Autocomplete : Sync with remote DB"
-msgstr ""
+msgstr "إكمال الشريك تلقائيًا: المزامنة مع قاعدة بيانات بعيدة"
#. module: partner_autocomplete
#: model:ir.model,name:partner_autocomplete.model_res_partner_autocomplete_sync
msgid "Partner Autocomplete Sync"
-msgstr ""
+msgstr "مزامنة إكمال الشريك تلقائيًا"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
msgid "Partner created by Odoo Partner Autocomplete Service"
-msgstr ""
+msgstr "تم إنشاء الشريك من خلال خدمة إكمال الشريك تلقائيًا المقدمة من أودو"
#. module: partner_autocomplete
#. openerp-web
@@ -227,14 +251,14 @@ msgstr ""
#: code:addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js:22
#, python-format
msgid "Searching Autocomplete..."
-msgstr ""
+msgstr "البحث في الإكمال التلقائي..."
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
msgid "Twitter :"
-msgstr ""
+msgstr "تويتر:"
#. module: partner_autocomplete
#: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template
msgid "followers)"
-msgstr ""
+msgstr "المتابعون)"
diff --git a/addons/payment/i18n/cs.po b/addons/payment/i18n/cs.po
index 5ff07bdef66..ef01c997889 100644
--- a/addons/payment/i18n/cs.po
+++ b/addons/payment/i18n/cs.po
@@ -131,7 +131,7 @@ msgstr ""
#. module: payment
#: model_terms:ir.ui.view,arch_db:payment.view_partners_form_payment_defaultcreditcard
msgid "<span class=\"o_stat_text\">Credit card(s)</span>"
-msgstr ""
+msgstr "<span class=\"o_stat_text\">Kreditní karta(y)</span>"
#. module: payment
#: model_terms:ir.ui.view,arch_db:payment.acquirer_form
@@ -248,7 +248,7 @@ msgstr ""
#: code:addons/payment/models/account_payment.py:57
#, python-format
msgid "A token is required to create a new payment transaction."
-msgstr ""
+msgstr "K vytvoření nové platební transakce je vyžadován token."
#. module: payment
#: code:addons/payment/models/payment_acquirer.py:657
@@ -266,7 +266,7 @@ msgstr ""
#: code:addons/payment/models/account_invoice.py:36
#, python-format
msgid "A transaction can't be linked to invoices having different currencies."
-msgstr ""
+msgstr "Transakci nelze propojit s fakturami s různými měnami."
#. module: payment
#: code:addons/payment/models/account_invoice.py:41
@@ -383,7 +383,7 @@ msgstr ""
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__authorize_implemented
msgid "Authorize Mechanism Supported"
-msgstr ""
+msgstr "Podporován mechanismus autorizace"
#. module: payment
#: model:payment.acquirer,name:payment.payment_acquirer_authorize
@@ -480,7 +480,7 @@ msgstr "Platbu nelze nastavit"
#: code:addons/payment/controllers/portal.py:225
#, python-format
msgid "Cannot setup the payment."
-msgstr ""
+msgstr "Nelze nastavit platbu."
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__capture_manually
@@ -496,7 +496,7 @@ msgstr ""
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__capture_manually
msgid "Capture the amount from Odoo, when the delivery is completed."
-msgstr ""
+msgstr "Zachytit částku z Odoo, když je doručení dokončeno."
#. module: payment
#: model_terms:ir.ui.view,arch_db:payment.payment_acquirer_onboarding_wizard_form
@@ -507,7 +507,7 @@ msgstr ""
#: model:ir.actions.act_window,name:payment.action_open_payment_onboarding_payment_acquirer_wizard
#: model_terms:ir.ui.view,arch_db:payment.payment_acquirer_onboarding_wizard_form
msgid "Choose a payment method"
-msgstr ""
+msgstr "Zvolte způsob platby"
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_transaction__partner_city
@@ -688,7 +688,7 @@ msgstr "Hotovo"
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__done_msg
msgid "Done Message"
-msgstr ""
+msgstr "Zpráva o dokončení"
#. module: payment
#: selection:payment.transaction,state:0
@@ -818,6 +818,8 @@ msgid ""
"If you leave it empty, the payment acquirer will be available for all the "
"countries."
msgstr ""
+"Pokud ji necháte prázdnou, bude příjemce platby k dispozici pro všechny "
+"země."
#. module: payment
#. openerp-web
@@ -939,12 +941,12 @@ msgstr ""
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_icon__acquirer_ids
msgid "List of Acquirers supporting this payment icon."
-msgstr ""
+msgstr "Seznam příjemců podporujících tuto ikonu platby."
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__website_published
msgid "Make this payment acquirer available (Customer invoices, etc.)"
-msgstr ""
+msgstr "Zpřístupnit tohoto příjemce platby (faktury zákazníka atd.)"
#. module: payment
#: model_terms:ir.ui.view,arch_db:payment.pay_methods
@@ -973,6 +975,9 @@ msgid ""
"Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n"
"Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings."
msgstr ""
+"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n"
+"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n"
+"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení."
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__image_medium
@@ -1001,12 +1006,12 @@ msgstr ""
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__pre_msg
msgid "Message displayed to explain and help the payment process."
-msgstr ""
+msgstr "Zobrazí se zpráva, která vysvětluje a pomáhá platebnímu procesu."
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__error_msg
msgid "Message displayed, if error is occur during the payment process."
-msgstr ""
+msgstr "Zobrazí se zpráva, pokud během procesu platby dojde k chybě."
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__cancel_msg
@@ -1019,6 +1024,8 @@ msgid ""
"Message displayed, if order is done successfully after having done the "
"payment process."
msgstr ""
+"Zobrazí se zpráva, pokud je po úspěšném provedení platby úspěšně provedena "
+"objednávka."
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_acquirer__pending_msg
@@ -1056,7 +1063,7 @@ msgstr "Název"
#. module: payment
#: model:ir.model.fields,help:payment.field_payment_token__name
msgid "Name of the payment token"
-msgstr ""
+msgstr "Název tokenu platby"
#. module: payment
#: selection:payment.acquirer,save_token:0
diff --git a/addons/payment/i18n/km.po b/addons/payment/i18n/km.po
index 6d58360ab21..5f29c4d94dc 100644
--- a/addons/payment/i18n/km.po
+++ b/addons/payment/i18n/km.po
@@ -1247,6 +1247,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:payment.pay_methods
msgid "Payment Methods"
msgstr ""
+"វិធី​ទូទាត់លុយ\n"
+" \n"
+" "
#. module: payment
#: model:ir.model,name:payment.model_payment_token
diff --git a/addons/payment/i18n/vi.po b/addons/payment/i18n/vi.po
index dc7bdb9d8fd..9a291bce4a3 100644
--- a/addons/payment/i18n/vi.po
+++ b/addons/payment/i18n/vi.po
@@ -765,7 +765,7 @@ msgstr "Cố định phí quốc tế"
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__inbound_payment_method_ids
msgid "For Incoming Payments"
-msgstr ""
+msgstr "Thanh toán doanh thu"
#. module: payment
#: selection:payment.transaction,type:0
diff --git a/addons/payment/static/src/js/payment_translations.js b/addons/payment/static/src/js/payment_translations.js
new file mode 100644
index 00000000000..199dcc2a276
--- /dev/null
+++ b/addons/payment/static/src/js/payment_translations.js
@@ -0,0 +1,10 @@
+// TODO Remove me >=saas-12.5, this is a disgrace
+// This is an hack to get the string_true and hover_false options translated on
+// the boolean_button terminology widget. The terms are translated through
+// _t(opt_terms.string_true) which will only work if the terms are already
+// present in the translation map.
+// This code does nothing but marks the strings as translatable
+var _t = function(x) { return x; };
+
+_t("Published");
+_t("Publish");
diff --git a/addons/payment/views/assets.xml b/addons/payment/views/assets.xml
index 62fe9d2455f..49cc88c5536 100644
--- a/addons/payment/views/assets.xml
+++ b/addons/payment/views/assets.xml
@@ -13,4 +13,11 @@
<script type="text/javascript" src="/payment/static/src/js/payment_processing.js"></script>
</xpath>
</template>
+
+ <template id="assets_backend" name="payment_assets_backend" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/payment/static/src/js/payment_translations.js"></script>
+ </xpath>
+ </template>
+
</odoo>
diff --git a/addons/payment/views/res_partner_views.xml b/addons/payment/views/res_partner_views.xml
index 8417793f24a..bd936c8340d 100644
--- a/addons/payment/views/res_partner_views.xml
+++ b/addons/payment/views/res_partner_views.xml
@@ -13,7 +13,8 @@
<button type="action" class="oe_stat_button"
icon="fa-credit-card"
name="%(payment.payment_token_action)d"
- context="{'search_default_partner_id': active_id}">
+ context="{'search_default_partner_id': active_id}"
+ attrs="{'invisible': [('payment_token_count', '=', 0)]}">
<div class="o_form_field o_stat_info">
<span class="o_stat_value">
<field name="payment_token_count" widget="statinfo" nolabel="1"/>
diff --git a/addons/payment_adyen/i18n/ar.po b/addons/payment_adyen/i18n/ar.po
index 3614a9197bf..3e05f79636c 100644
--- a/addons/payment_adyen/i18n/ar.po
+++ b/addons/payment_adyen/i18n/ar.po
@@ -3,18 +3,17 @@
# * payment_adyen
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# AMAAL RU <Fabu1410@yahoo.com>, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.4\n"
+"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-02 09:56+0000\n"
-"PO-Revision-Date: 2018-08-02 09:56+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:21+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,36 +25,36 @@ msgstr ""
#: code:addons/payment_adyen/models/payment.py:187
#, python-format
msgid "; multiple order found"
-msgstr "تم ايجاد طلبات متعدده"
+msgstr "؛ تم العثور على طلبات متعددة"
#. module: payment_adyen
#: code:addons/payment_adyen/models/payment.py:185
#, python-format
msgid "; no order found"
-msgstr "لايوجد طلبات"
+msgstr "; لم يُعثر على طلبات"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_adyen
#: code:addons/payment_adyen/models/payment.py:229
#, python-format
msgid "Adyen: feedback error"
-msgstr ""
+msgstr "Adyen: خطأ بالتغذية الرجعية"
#. module: payment_adyen
#: code:addons/payment_adyen/models/payment.py:197
#, python-format
msgid "Adyen: invalid merchantSig, received %s, computed %s"
-msgstr ""
+msgstr "Adyen: merchantSig غير صالح، المستلم %s, المحسوب %s"
#. module: payment_adyen
#: code:addons/payment_adyen/models/payment.py:183
#, python-format
msgid "Adyen: received data for reference %s"
-msgstr ""
+msgstr "Adyen: البيانات المستلمة لرقم الإشارة %s"
#. module: payment_adyen
#: code:addons/payment_adyen/models/payment.py:176
@@ -63,27 +62,27 @@ msgstr ""
msgid ""
"Adyen: received data with missing reference (%s) or missing pspReference "
"(%s)"
-msgstr ""
+msgstr "Adyen: البيانات المستلمة ينقصها رقم إشارة (%s) أو pspReference (%s)"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_adyen
#: model_terms:ir.ui.view,arch_db:payment_adyen.acquirer_form_adyen
msgid "How to configure your Adyen account?"
-msgstr ""
+msgstr "كيف تقوم بإعداد حسابك على Adyen؟"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_adyen
#: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_merchant_account
@@ -93,17 +92,17 @@ msgstr "حساب التاجر"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_adyen
#: model:ir.model,name:payment_adyen.model_payment_acquirer
msgid "Payment Acquirer"
-msgstr "طريقة السداد الإلكتروني"
+msgstr "معالج السداد"
#. module: payment_adyen
#: model:ir.model,name:payment_adyen.model_payment_transaction
@@ -113,7 +112,7 @@ msgstr "معاملة السداد"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Paypal"
-msgstr "المستحق"
+msgstr "Paypal"
#. module: payment_adyen
#: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__provider
@@ -123,24 +122,24 @@ msgstr "المزود"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_adyen
#: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_skin_code
msgid "Skin Code"
-msgstr ""
+msgstr "Skin Code"
#. module: payment_adyen
#: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_skin_hmac_key
msgid "Skin HMAC Key"
-msgstr ""
+msgstr "Skin HMAC Key"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_adyen
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
diff --git a/addons/payment_authorize/models/authorize_request.py b/addons/payment_authorize/models/authorize_request.py
index 922d9df1bf1..e3e65648ee0 100644
--- a/addons/payment_authorize/models/authorize_request.py
+++ b/addons/payment_authorize/models/authorize_request.py
@@ -226,7 +226,7 @@ class AuthorizeAPI():
etree.SubElement(customer, "email").text = partner.email or ''
response = self._authorize_request(root)
res = dict()
- if not response.find('customerProfileId'):
+ if response.find('customerProfileId') is None: # Warning: do not use bool(etree) as the semantics is very misleading
_logger.warning(
'Unable to create customer payment profile, data missing from transaction. Transaction_id: %s - Partner_id: %s'
% (transaction_id, partner)
diff --git a/addons/payment_authorize/models/payment.py b/addons/payment_authorize/models/payment.py
index 9b74ee6d7e7..1385e9ea237 100644
--- a/addons/payment_authorize/models/payment.py
+++ b/addons/payment_authorize/models/payment.py
@@ -25,6 +25,7 @@ class PaymentAcquirerAuthorize(models.Model):
provider = fields.Selection(selection_add=[('authorize', 'Authorize.Net')])
authorize_login = fields.Char(string='API Login Id', required_if_provider='authorize', groups='base.group_user')
authorize_transaction_key = fields.Char(string='API Transaction Key', required_if_provider='authorize', groups='base.group_user')
+ authorize_signature_key = fields.Char(string='API Signature Key', groups='base.group_user', compute="_compute_auth_signature_key", inverse="_inverse_auth_signature_key")
def _get_feature_support(self):
"""Get advanced feature support by provider.
@@ -42,6 +43,16 @@ class PaymentAcquirerAuthorize(models.Model):
res['tokenize'].append('authorize')
return res
+ def _compute_auth_signature_key(self):
+ ICP = self.env['ir.config_parameter'].sudo()
+ for acquirer in self.filtered(lambda a: a.provider == 'authorize'):
+ acquirer.authorize_signature_key = ICP.get_param('payment_authorize.signature_key_%s' % acquirer.id)
+
+ def _inverse_auth_signature_key(self):
+ ICP = self.env['ir.config_parameter'].sudo()
+ for acquirer in self.filtered(lambda a: a.provider == 'authorize'):
+ ICP.set_param('payment_authorize.signature_key_%s' % acquirer.id, acquirer.authorize_signature_key)
+
def _get_authorize_urls(self, environment):
""" Authorize URLs """
if environment == 'prod':
@@ -57,13 +68,22 @@ class PaymentAcquirerAuthorize(models.Model):
values['x_amount'],
values['x_currency_code']]).encode('utf-8')
- # [BACKWARD COMPATIBILITY] Check that the merchant did update his transaction
- # key to signature key (end of MD5 support from Authorize.net)
+ # [BACKWARD COMPATIBILITY, 2nd edition]
# The signature key is now '128-character hexadecimal format', while the
# transaction key was only 16-character.
- if len(values['x_trans_key']) == 128:
- key = bytes.fromhex(values['x_trans_key'])
- return hmac.new(key, data, hashlib.sha512).hexdigest().upper()
+ # One of 2 things should have happened:
+ # 1/ the Transaction Key has been replaced with the Signature Key value (patch from March 2019)
+ # => Use that to sign, but server-to-server won't work since it uses transaction key
+ # as its credentials
+ # 2/ the Signature key is a new field (patch from July 2019)
+ # => Use that field for the signature
+
+ # FORWARD-PORT NOTE: forward part to saas-12.4 but no further
+ if len(values['x_trans_key']) == 128 and not self.authorize_signature_key:
+ self.authorize_signature_key = values['x_trans_key'] # store in the correct field
+ return hmac.new(bytes.fromhex(values['x_trans_key']), data, hashlib.sha512).hexdigest().upper()
+ elif self.authorize_signature_key:
+ return hmac.new(bytes.fromhex(self.authorize_signature_key), data, hashlib.sha512).hexdigest().upper()
else:
return hmac.new(values['x_trans_key'].encode('utf-8'), data, hashlib.md5).hexdigest()
diff --git a/addons/payment_authorize/views/payment_views.xml b/addons/payment_authorize/views/payment_views.xml
index 0237325e0c2..b60385ed9f0 100644
--- a/addons/payment_authorize/views/payment_views.xml
+++ b/addons/payment_authorize/views/payment_views.xml
@@ -9,6 +9,7 @@
<group attrs="{'invisible': [('provider', '!=', 'authorize')]}">
<field name="authorize_login"/>
<field name="authorize_transaction_key" password="True"/>
+ <field name="authorize_signature_key" password="True"/>
<a colspan="2" href="https://www.odoo.com/documentation/user/online/ecommerce/shopper_experience/authorize.html" target="_blank">How to get paid with Authorize.Net</a>
</group>
</xpath>
diff --git a/addons/payment_buckaroo/i18n/ar.po b/addons/payment_buckaroo/i18n/ar.po
index eecf6eb7694..2e9f8cfd04c 100644
--- a/addons/payment_buckaroo/i18n/ar.po
+++ b/addons/payment_buckaroo/i18n/ar.po
@@ -3,18 +3,18 @@
# * payment_buckaroo
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Fahad Alqahtani <fahad@cloudland.sa>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# AMAAL RU <Fabu1410@yahoo.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.4\n"
+"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-02 09:56+0000\n"
-"PO-Revision-Date: 2018-08-02 09:56+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:22+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,40 +26,40 @@ msgstr ""
#: code:addons/payment_buckaroo/models/payment.py:141
#, python-format
msgid "; multiple order found"
-msgstr "تم ايجاد طلبات متعدده"
+msgstr "؛ تم العثور على طلبات متعددة"
#. module: payment_buckaroo
#: code:addons/payment_buckaroo/models/payment.py:139
#, python-format
msgid "; no order found"
-msgstr "لايوجد طلبات"
+msgstr "; لم يُعثر على طلبات"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_buckaroo
#: code:addons/payment_buckaroo/models/payment.py:148
#, python-format
msgid "Buckaroo: invalid shasign, received %s, computed %s, for data %s"
-msgstr ""
+msgstr "Buckaroo: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s"
#. module: payment_buckaroo
#: code:addons/payment_buckaroo/models/payment.py:137
#, python-format
msgid "Buckaroo: received data for reference %s"
-msgstr ""
+msgstr "Buckaroo: البيانات المستلمة لرقم الإشارة %s"
#. module: payment_buckaroo
#: code:addons/payment_buckaroo/models/payment.py:131
@@ -68,26 +68,28 @@ msgid ""
"Buckaroo: received data with missing reference (%s) or pay_id (%s) or "
"shasign (%s)"
msgstr ""
+"Buckaroo: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign "
+"(%s)"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_buckaroo
#: model:ir.model,name:payment_buckaroo.model_payment_acquirer
msgid "Payment Acquirer"
-msgstr "طريقة السداد الإلكتروني"
+msgstr "معالج السداد"
#. module: payment_buckaroo
#: model:ir.model,name:payment_buckaroo.model_payment_transaction
@@ -112,19 +114,19 @@ msgstr "المفتاح السري (SecretKey)"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_buckaroo
#: model:ir.model.fields,field_description:payment_buckaroo.field_payment_acquirer__brq_websitekey
msgid "WebsiteKey"
-msgstr ""
+msgstr "مفتاح الموقع"
#. module: payment_buckaroo
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
diff --git a/addons/payment_ogone/i18n/ar.po b/addons/payment_ogone/i18n/ar.po
index 0acbc1dee5f..7abf2750f57 100644
--- a/addons/payment_ogone/i18n/ar.po
+++ b/addons/payment_ogone/i18n/ar.po
@@ -3,19 +3,19 @@
# * payment_ogone
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# AMAAL RU <Fabu1410@yahoo.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:22+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,48 +27,48 @@ msgstr ""
#: code:addons/payment_ogone/models/payment.py:242
#, python-format
msgid "; multiple order found"
-msgstr "تم ايجاد طلبات متعدده"
+msgstr "؛ تم العثور على طلبات متعددة"
#. module: payment_ogone
#: code:addons/payment_ogone/models/payment.py:240
#, python-format
msgid "; no order found"
-msgstr "لايوجد طلبات"
+msgstr "; لم يُعثر على طلبات"
#. module: payment_ogone
#: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_userid
msgid "API User ID"
-msgstr "معرف مستخدم واجهة برمجة التطبيقات API"
+msgstr "معرف مستخدم واجهة برمجة التطبيقات"
#. module: payment_ogone
#: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_password
msgid "API User Password"
-msgstr "كلمة مرور المستخدم الخاصة بواجهة برمجة التطبيقات API"
+msgstr "كلمة مرور المستخدم الخاصة بواجهة برمجة التطبيقات"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_ogone
#: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_alias_usage
msgid "Alias Usage"
-msgstr ""
+msgstr "استخدام اللقب"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_ogone
#: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form
msgid "CVC"
-msgstr ""
+msgstr "رمز التحقق من البطاقة"
#. module: payment_ogone
#: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form
@@ -78,17 +78,17 @@ msgstr "رقم البطاقة"
#. module: payment_ogone
#: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form
msgid "Cardholder name"
-msgstr ""
+msgstr "اسم حامل البطاقة"
#. module: payment_ogone
#: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form
msgid "Expires (MM / YY)"
-msgstr ""
+msgstr "تنتهي صلاحيته في (MM / YY)"
#. module: payment_ogone
#: model_terms:ir.ui.view,arch_db:payment_ogone.acquirer_form_ogone
msgid "How to configure your Ogone account?"
-msgstr ""
+msgstr "كيف تقوم بإعداد حسابك على Ogone؟"
#. module: payment_ogone
#: model:ir.model.fields,help:payment_ogone.field_payment_acquirer__ogone_alias_usage
@@ -96,28 +96,30 @@ msgid ""
"If you want to use Ogone Aliases, this default Alias Usage will be presented"
" to the customer as the reason you want to keep his payment data"
msgstr ""
+"إذا أردت استخدام ألقاب Ogone، سيتم تقديم استخدام اللقب الافتراضي هذا للعميل "
+"كسبب لرغبتك في الاحتفاظ ببيانات عمليات السداد التي يقوم بها"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_ogone
#: code:addons/payment_ogone/models/payment.py:249
#, python-format
msgid "Ogone: invalid shasign, received %s, computed %s, for data %s"
-msgstr ""
+msgstr "Ogone: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s"
#. module: payment_ogone
#: code:addons/payment_ogone/models/payment.py:238
#, python-format
msgid "Ogone: received data for reference %s"
-msgstr ""
+msgstr "Ogone: البيانات المستلمة لرقم الإشارة %s"
#. module: payment_ogone
#: code:addons/payment_ogone/models/payment.py:231
@@ -126,6 +128,8 @@ msgid ""
"Ogone: received data with missing reference (%s) or pay_id (%s) or shasign "
"(%s)"
msgstr ""
+"Ogone: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign "
+"(%s)"
#. module: payment_ogone
#: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_pspid
@@ -135,17 +139,17 @@ msgstr "PSPID"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_ogone
#: model:ir.model,name:payment_ogone.model_payment_acquirer
msgid "Payment Acquirer"
-msgstr "طريقة السداد الإلكتروني"
+msgstr "معالج السداد"
#. module: payment_ogone
#: model:ir.model,name:payment_ogone.model_payment_token
msgid "Payment Token"
-msgstr ""
+msgstr "كلمة سر السداد"
#. module: payment_ogone
#: model:ir.model,name:payment_ogone.model_payment_transaction
@@ -175,14 +179,14 @@ msgstr "SHA Key OUT"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_ogone
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
diff --git a/addons/payment_payumoney/i18n/ar.po b/addons/payment_payumoney/i18n/ar.po
index fc7f9053f91..1036fb77525 100644
--- a/addons/payment_payumoney/i18n/ar.po
+++ b/addons/payment_payumoney/i18n/ar.po
@@ -3,16 +3,16 @@
# * payment_payumoney
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.4\n"
+"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-02 09:56+0000\n"
-"PO-Revision-Date: 2018-08-02 09:56+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:22+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,60 +23,61 @@ msgstr ""
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_payumoney
#: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__payumoney_merchant_key
msgid "Merchant Key"
-msgstr ""
+msgstr "معرف التاجر"
#. module: payment_payumoney
#: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__payumoney_merchant_salt
msgid "Merchant Salt"
-msgstr ""
+msgstr "Merchant Salt"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_payumoney
#: code:addons/payment_payumoney/models/payment.py:108
#, python-format
msgid "PayUmoney: invalid shasign, received %s, computed %s, for data %s"
-msgstr ""
+msgstr "PayUmoney: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s"
#. module: payment_payumoney
#: code:addons/payment_payumoney/models/payment.py:102
#, python-format
msgid "PayUmoney: received data for reference %s; multiple orders found"
msgstr ""
+"PayUmoney: البيانات المستلمة لرقم الإشارة %s، تم العثور على طلبات متعددة"
#. module: payment_payumoney
#: code:addons/payment_payumoney/models/payment.py:99
#, python-format
msgid "PayUmoney: received data for reference %s; no order found"
-msgstr ""
+msgstr "PayUmoney: البيانات المستلمة لرقم الإشارة %s، لم يُعثر على طلبات"
#. module: payment_payumoney
#: code:addons/payment_payumoney/models/payment.py:94
@@ -85,11 +86,13 @@ msgid ""
"PayUmoney: received data with missing reference (%s) or pay_id (%s) or "
"shashign (%s)"
msgstr ""
+"PayUmoney: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign"
+" (%s)"
#. module: payment_payumoney
#: model:ir.model,name:payment_payumoney.model_payment_acquirer
msgid "Payment Acquirer"
-msgstr "طريقة السداد الإلكتروني"
+msgstr "معالج السداد"
#. module: payment_payumoney
#: model:ir.model,name:payment_payumoney.model_payment_transaction
@@ -99,7 +102,7 @@ msgstr "معاملة السداد"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Paypal"
-msgstr "المستحق"
+msgstr "Paypal"
#. module: payment_payumoney
#: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__provider
@@ -109,14 +112,14 @@ msgstr "المزود"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_payumoney
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
diff --git a/addons/payment_sips/i18n/ar.po b/addons/payment_sips/i18n/ar.po
index fb33092fe78..89e78748fac 100644
--- a/addons/payment_sips/i18n/ar.po
+++ b/addons/payment_sips/i18n/ar.po
@@ -3,17 +3,16 @@
# * payment_sips
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# AMAAL RU <Fabu1410@yahoo.com>, 2018
-# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.4\n"
+"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-02 09:56+0000\n"
-"PO-Revision-Date: 2018-08-02 09:56+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:22+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,70 +24,70 @@ msgstr ""
#: code:addons/payment_sips/models/payment.py:164
#, python-format
msgid "; multiple order found"
-msgstr "تم ايجاد طلبات متعدده"
+msgstr "؛ تم العثور على طلبات متعددة"
#. module: payment_sips
#: code:addons/payment_sips/models/payment.py:162
#, python-format
msgid "; no order found"
-msgstr "لايوجد طلبات"
+msgstr "; لم يُعثر على طلبات"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_sips
#: code:addons/payment_sips/models/payment.py:75
#, python-format
msgid "Currency not supported by Wordline"
-msgstr "العمله غير معتمده في الخط الافقي"
+msgstr "Wordline لا يدعم هذه العملة"
#. module: payment_sips
#: code:addons/payment_sips/models/payment.py:56
#, python-format
msgid "Incorrect payment acquirer provider"
-msgstr ""
+msgstr "خطأ بمزود معالج السداد"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_version
msgid "Interface Version"
-msgstr ""
+msgstr "إصدار الواجهة"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_merchant_id
msgid "Merchant ID"
-msgstr ""
+msgstr "معرف التاجر"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_sips
#: model:ir.model,name:payment_sips.model_payment_acquirer
msgid "Payment Acquirer"
-msgstr "طريقة السداد الإلكتروني"
+msgstr "معالج السداد"
#. module: payment_sips
#: model:ir.model,name:payment_sips.model_payment_transaction
@@ -98,12 +97,12 @@ msgstr "معاملة السداد"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Paypal"
-msgstr "المستحق"
+msgstr "Paypal"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_prod_url
msgid "Production url"
-msgstr ""
+msgstr "رابط الإنتاج"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__provider
@@ -113,35 +112,35 @@ msgstr "المزود"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_secret
msgid "Secret Key"
-msgstr ""
+msgstr "مفتاح سري"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_sips
#: code:addons/payment_sips/models/payment.py:160
#, python-format
msgid "Sips: received data for reference %s"
-msgstr ""
+msgstr "Sips: البيانات المستلمة لرقم الإشارة %s"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_sips
#: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_test_url
msgid "Test url"
-msgstr ""
+msgstr "رابط الاختبار"
#. module: payment_sips
#: model:ir.model.fields,help:payment_sips.field_payment_acquirer__sips_merchant_id
msgid "Used for production only"
-msgstr ""
+msgstr "يستخدم للإنتاج فقط"
#. module: payment_sips
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
diff --git a/addons/payment_transfer/i18n/ar.po b/addons/payment_transfer/i18n/ar.po
index 60418a5f4ea..92a33df6c65 100644
--- a/addons/payment_transfer/i18n/ar.po
+++ b/addons/payment_transfer/i18n/ar.po
@@ -3,12 +3,12 @@
# * payment_transfer
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# AMAAL RU <Fabu1410@yahoo.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Yihya Hugirat <hugirat@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
#
msgid ""
msgstr ""
@@ -16,7 +16,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
"PO-Revision-Date: 2018-08-24 09:22+0000\n"
-"Last-Translator: Yihya Hugirat <hugirat@gmail.com>, 2018\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -59,12 +59,12 @@ msgstr ""
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Adyen"
-msgstr ""
+msgstr "Adyen"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Authorize.Net"
-msgstr ""
+msgstr "Authorize.Net"
#. module: payment_transfer
#: code:addons/payment_transfer/models/payment.py:39
@@ -81,22 +81,22 @@ msgstr "الحسابات البنكية"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Buckaroo"
-msgstr ""
+msgstr "Buckaroo"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Manual Configuration"
-msgstr ""
+msgstr "الإعدادات اليدوية"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Ogone"
-msgstr ""
+msgstr "Ogone"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "PayUmoney"
-msgstr ""
+msgstr "PayUmoney"
#. module: payment_transfer
#: model:ir.model,name:payment_transfer.model_payment_acquirer
@@ -121,17 +121,17 @@ msgstr "المزود"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Sips"
-msgstr ""
+msgstr "Sips"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Stripe"
-msgstr ""
+msgstr "Stripe"
#. module: payment_transfer
#: selection:payment.acquirer,provider:0
msgid "Wire Transfer"
-msgstr ""
+msgstr "تحويل بنكي"
#. module: payment_transfer
#: code:addons/payment_transfer/models/payment.py:79
diff --git a/addons/phone_validation/i18n/ar.po b/addons/phone_validation/i18n/ar.po
index 43b2bb6cafd..3074e17f095 100644
--- a/addons/phone_validation/i18n/ar.po
+++ b/addons/phone_validation/i18n/ar.po
@@ -24,7 +24,7 @@ msgstr ""
#. module: phone_validation
#: selection:res.company,phone_international_format:0
msgid "Add international prefix"
-msgstr ""
+msgstr "إضافة بادئة دولية"
#. module: phone_validation
#: model:ir.model.fields,help:phone_validation.field_res_company__phone_international_format
@@ -42,7 +42,7 @@ msgstr "المؤسسات"
#. module: phone_validation
#: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: phone_validation
#: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin__id
@@ -53,13 +53,13 @@ msgstr "المعرف"
#: code:addons/phone_validation/tools/phone_validation.py:23
#, python-format
msgid "Impossible number %s: probably invalid number of digits"
-msgstr ""
+msgstr "رقم مستحيل %s: ربما يكون عدد الأرقام غير صالح"
#. module: phone_validation
#: code:addons/phone_validation/tools/phone_validation.py:25
#, python-format
msgid "Invalid number %s: probably incorrect prefix"
-msgstr ""
+msgstr "رقم مستحيل %s: ربما تكون البادئة غير صحيحة"
#. module: phone_validation
#: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin____last_update
@@ -74,12 +74,12 @@ msgstr "أرقام محلية"
#. module: phone_validation
#: selection:res.company,phone_international_format:0
msgid "No prefix"
-msgstr ""
+msgstr "لا توجد بادئة"
#. module: phone_validation
#: model:ir.model,name:phone_validation.model_phone_validation_mixin
msgid "Phone Validation Mixin"
-msgstr ""
+msgstr "Phone Validation Mixin"
#. module: phone_validation
#: code:addons/phone_validation/tools/phone_validation.py:44
@@ -88,6 +88,8 @@ msgid ""
"Unable to format %s:\n"
"%s"
msgstr ""
+"تعذّر تنسيق %s:\n"
+"%s"
#. module: phone_validation
#: code:addons/phone_validation/tools/phone_validation.py:20
@@ -96,3 +98,5 @@ msgid ""
"Unable to parse %s:\n"
"%s"
msgstr ""
+"تعذّر تحليل %s:\n"
+"%s"
diff --git a/addons/point_of_sale/i18n/km.po b/addons/point_of_sale/i18n/km.po
index c27627ce62d..a5c589a93dd 100644
--- a/addons/point_of_sale/i18n/km.po
+++ b/addons/point_of_sale/i18n/km.po
@@ -555,7 +555,7 @@ msgstr "របាយការណ៍ធនាគារ"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_account_bank_statement_cashbox
msgid "Bank Statement Cashbox"
-msgstr ""
+msgstr "របាយការណ៍ប័ណ្ណធនាគារ"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_account_bank_statement_line
@@ -651,12 +651,12 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_cash_box_in
msgid "Cash Box In"
-msgstr ""
+msgstr "លុយក្នុងដៃ"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_cash_box_out
msgid "Cash Box Out"
-msgstr ""
+msgstr "លុយក្រៅប្រអប់"
#. module: point_of_sale
#: code:addons/point_of_sale/models/pos_session.py:318
@@ -684,7 +684,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_account_cashbox_line
msgid "CashBox Line"
-msgstr ""
+msgstr "បន្ទាត់ CashBox"
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.account_cashbox_line_view_tree
@@ -1427,7 +1427,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:550
#, python-format
msgid "Due"
-msgstr ""
+msgstr "ទៅកាន់"
#. module: point_of_sale
#. openerp-web
@@ -1501,7 +1501,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__cash_register_balance_end_real
msgid "Ending Balance"
-msgstr ""
+msgstr "សមតុល្យចុងក្រោយ"
#. module: point_of_sale
#: code:addons/point_of_sale/models/pos_category.py:13
@@ -1568,7 +1568,7 @@ msgstr ""
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__fiscal_position_ids
#: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form
msgid "Fiscal Positions"
-msgstr ""
+msgstr "តំណែងសារពើពន្ធ"
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form
@@ -1809,7 +1809,7 @@ msgstr ""
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__module_account
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__invoice_group
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form
@@ -1952,7 +1952,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:38
#, python-format
msgid "Loading"
-msgstr ""
+msgstr "ដំណើរការ"
#. module: point_of_sale
#: selection:barcode.rule,type:0
@@ -2064,7 +2064,7 @@ msgstr ""
#: model:product.product,name:point_of_sale.product_product_consumable
#: model:product.template,name:point_of_sale.product_product_consumable_product_template
msgid "Miscellaneous"
-msgstr ""
+msgstr "ផ្សេងៗ"
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.customer_facing_display_html
@@ -2205,7 +2205,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:point_of_sale.customer_facing_display_html
#: model_terms:pos.config,customer_facing_display_html:point_of_sale.pos_config_main
msgid "Odoo Logo"
-msgstr ""
+msgstr "Odoo និមិត្តសញ្ញា"
#. module: point_of_sale
#. openerp-web
@@ -2551,6 +2551,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form
msgid "Payment Methods"
msgstr ""
+"វិធី​ទូទាត់លុយ\n"
+" \n"
+" "
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__journal_id
@@ -2560,7 +2563,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__payment_name
msgid "Payment Reference"
-msgstr ""
+msgstr "សេចក្ដីយោងការបង់ប្រាក់"
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__iface_payment_terminal
@@ -3020,7 +3023,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__product_qty
msgid "Product Quantity"
-msgstr ""
+msgstr "បរិមាណផលិតផល"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_product_template
@@ -3094,7 +3097,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_pos_box_in
msgid "Put Money In"
-msgstr ""
+msgstr "ដាក់លុយចូល"
#. module: point_of_sale
#. openerp-web
@@ -3583,13 +3586,13 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__cash_register_balance_start
msgid "Starting Balance"
-msgstr ""
+msgstr "សមតុល្យផ្តើម"
#. module: point_of_sale
#: model:ir.actions.report,name:point_of_sale.action_report_account_statement
#: model_terms:ir.ui.view,arch_db:point_of_sale.report_statement
msgid "Statement"
-msgstr ""
+msgstr "របាយការណ៍"
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_pos_form
@@ -3599,7 +3602,7 @@ msgstr ""
#. module: point_of_sale
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_form
msgid "Statements"
-msgstr ""
+msgstr "របាយការណ៍"
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__state
@@ -3633,7 +3636,7 @@ msgstr "ផ្លូវ"
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__price_subtotal_incl
#, python-format
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: point_of_sale
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__price_subtotal
@@ -3719,7 +3722,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_pos_box_out
msgid "Take Money Out"
-msgstr ""
+msgstr "យកប្រាក់ចេញ"
#. module: point_of_sale
#. openerp-web
diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py
index 38214d8baa8..aee62049864 100644
--- a/addons/point_of_sale/models/pos_config.py
+++ b/addons/point_of_sale/models/pos_config.py
@@ -460,6 +460,8 @@ class PosConfig(models.Model):
def open_ui(self):
""" open the pos interface """
self.ensure_one()
+ # check all constraints, raises if any is not met
+ self._validate_fields(self._fields)
return {
'type': 'ir.actions.act_url',
'url': '/pos/web/',
diff --git a/addons/point_of_sale/static/src/css/customer_facing_display.css b/addons/point_of_sale/static/src/css/customer_facing_display.css
index 2d572060342..d9be0c89c35 100644
--- a/addons/point_of_sale/static/src/css/customer_facing_display.css
+++ b/addons/point_of_sale/static/src/css/customer_facing_display.css
@@ -451,19 +451,19 @@ body.editor_enable .pos-hidden {
top: 35px;
}
}
-body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul {
+body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu {
min-width: 100px;
max-width: 100px;
}
-body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > .o_main_header {
+body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > .o_main_header {
display: none;
}
-body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > li > a {
+body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > a {
position: relative;
padding: 14px 0!important;
margin-bottom: 1px;
}
-body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > li > a:before {
+body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > a:before {
color: #05eb05;
}
body.editor_enable #oe_manipulators .no_parent_options .snippet-option-pos_palette,
@@ -491,10 +491,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #3E3E3E;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01 {
background: #f6f6f6 !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01:after {
content: "";
position: absolute;
top: 0;
@@ -503,7 +503,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #3E3E3E;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01:before {
text-shadow: 0 0 1px #090909;
}
.pos-palette_02 .pos-payment_info {
@@ -527,10 +527,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #364152;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02 {
background: #ecf2f6 !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02:after {
content: "";
position: absolute;
top: 0;
@@ -539,7 +539,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #364152;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02:before {
text-shadow: 0 0 1px #130d09;
}
.pos-palette_03 .pos-payment_info {
@@ -563,10 +563,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #1BA39C;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03:after {
content: "";
position: absolute;
top: 0;
@@ -575,7 +575,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #1BA39C;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_04 .pos-payment_info {
@@ -599,10 +599,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #0b7b6c;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04 {
background: #efeeec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04:after {
content: "";
position: absolute;
top: 0;
@@ -611,7 +611,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #0b7b6c;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04:before {
text-shadow: 0 0 1px #101113;
}
.pos-palette_05 .pos-payment_info {
@@ -635,10 +635,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #E26868;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05:after {
content: "";
position: absolute;
top: 0;
@@ -647,7 +647,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #E26868;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_06 .pos-payment_info {
@@ -671,10 +671,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #9E373B;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06 {
background: #f6f6f6 !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06:after {
content: "";
position: absolute;
top: 0;
@@ -683,7 +683,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #9E373B;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06:before {
text-shadow: 0 0 1px #090909;
}
.pos-palette_07 .pos-payment_info {
@@ -707,10 +707,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #ce9934;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07:after {
content: "";
position: absolute;
top: 0;
@@ -719,7 +719,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #ce9934;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_08 .pos-payment_info {
@@ -743,10 +743,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #a48c77;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08:after {
content: "";
position: absolute;
top: 0;
@@ -755,7 +755,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #a48c77;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_09 .pos-payment_info {
@@ -779,10 +779,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: linear-gradient(30deg, #014d43, #127e71);
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09:after {
content: "";
position: absolute;
top: 0;
@@ -791,7 +791,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: linear-gradient(30deg, #014d43, #127e71);
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_10 .pos-payment_info {
@@ -815,10 +815,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: linear-gradient(30deg, #e2316c, #ea4c89);
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10:after {
content: "";
position: absolute;
top: 0;
@@ -827,7 +827,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: linear-gradient(30deg, #e2316c, #ea4c89);
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_11 .pos-payment_info {
@@ -851,10 +851,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: linear-gradient(30deg, #362b3d, #5b4a63);
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11 {
background: #ececec !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11:after {
content: "";
position: absolute;
top: 0;
@@ -863,7 +863,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: linear-gradient(30deg, #362b3d, #5b4a63);
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11:before {
text-shadow: 0 0 1px #131313;
}
.pos-palette_12 .pos-payment_info {
@@ -887,10 +887,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: #434343;
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12 {
background: #5b5b5b !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12:after {
content: "";
position: absolute;
top: 0;
@@ -899,7 +899,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: #434343;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12:before {
text-shadow: 0 0 1px #a4a4a4;
}
.pos-palette_13 .pos-payment_info {
@@ -923,10 +923,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
background: linear-gradient(30deg, #1a1b1f, #3d3f45);
}
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13 {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13 {
background: #a2a2ab !important;
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13:after {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13:after {
content: "";
position: absolute;
top: 0;
@@ -935,6 +935,6 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header {
left: 50px;
background: linear-gradient(30deg, #1a1b1f, #3d3f45);
}
-#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13:before {
+#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13:before {
text-shadow: 0 0 1px #5d5d54;
}
diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml
index 05804c58711..a4050ebd3dc 100644
--- a/addons/point_of_sale/views/pos_templates.xml
+++ b/addons/point_of_sale/views/pos_templates.xml
@@ -111,7 +111,7 @@
</div>
<div data-js='pos_background' data-selector=".pos-company_logo, .pos-adv">
- <a href="#" class="dropdown-item" data-choose-image="true" data-no-preview="true"><b>Set Custom Image...</b></a>
+ <a href="#" class="dropdown-item font-weight-bold" data-choose-image="true" data-no-preview="true">Set Custom Image...</a>
<a href="#" class="dropdown-item d-none pos-use_default_logo" data-background="">Default company logo</a>
<div class="dropdown-divider"/>
<a href="#" class="dropdown-item" data-toggle-class="pos-hidden"><i class="fa fa-eye-slash"/>Hide</a>
diff --git a/addons/portal/controllers/mail.py b/addons/portal/controllers/mail.py
index c694caec6df..dec8fccff5c 100644
--- a/addons/portal/controllers/mail.py
+++ b/addons/portal/controllers/mail.py
@@ -76,7 +76,7 @@ def _message_post_helper(res_model, res_id, message, token='', nosubscribe=True,
raise NotFound()
# Signed Token Case: author_id is forced
elif kw.get('hash') and kw.get('pid'):
- author_id = kw.get('pid')
+ author_id = int(kw.get('pid'))
kw.pop('csrf_token', None)
kw.pop('redirect', None)
@@ -85,12 +85,8 @@ def _message_post_helper(res_model, res_id, message, token='', nosubscribe=True,
kw.pop('hash', None)
kw.pop('pid', None)
return record.with_context(mail_create_nosubscribe=nosubscribe).message_post(
- body=message,
- message_type=kw.pop('message_type', "comment"),
- subtype=kw.pop('subtype', "mt_comment"),
- author_id=author_id,
- **kw
- )
+ body=message, message_type=kw.pop('message_type', "comment"),
+ subtype=kw.pop('subtype', "mt_comment"), author_id=author_id, **kw)
class PortalChatter(http.Controller):
diff --git a/addons/portal/i18n/km.po b/addons/portal/i18n/km.po
index 51c96c312d5..ef5ef286f78 100644
--- a/addons/portal/i18n/km.po
+++ b/addons/portal/i18n/km.po
@@ -275,7 +275,7 @@ msgstr "បង្កើតនៅ"
#. module: portal
#: model:ir.model.fields,help:portal.field_portal_mixin__access_url
msgid "Customer Portal URL"
-msgstr ""
+msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន"
#. module: portal
#: model_terms:ir.ui.view,arch_db:portal.portal_share_template
@@ -438,7 +438,7 @@ msgstr ""
#. module: portal
#: model_terms:ir.ui.view,arch_db:portal.portal_record_sidebar
msgid "Odoo Logo"
-msgstr ""
+msgstr "Odoo និមិត្តសញ្ញា"
#. module: portal
#. openerp-web
@@ -455,7 +455,7 @@ msgstr "ទូរស័ព្ទ"
#. module: portal
#: model:ir.model.fields,field_description:portal.field_portal_mixin__access_url
msgid "Portal Access URL"
-msgstr ""
+msgstr "URL ចូលដំណើរការវិបផតថល"
#. module: portal
#: model:ir.model,name:portal.model_portal_mixin
@@ -500,12 +500,12 @@ msgstr ""
#. module: portal
#: model:ir.model.fields,field_description:portal.field_portal_share__partner_ids
msgid "Recipients"
-msgstr ""
+msgstr "អ្នកទទួល"
#. module: portal
#: model:ir.model.fields,field_description:portal.field_portal_share__res_id
msgid "Related Document ID"
-msgstr ""
+msgstr "លេខសម្គាល់ឯកសារដែលទាក់ទង"
#. module: portal
#: model:ir.model.fields,field_description:portal.field_portal_share__res_model
diff --git a/addons/portal/static/src/scss/portal.scss b/addons/portal/static/src/scss/portal.scss
index 87c64e73576..5f24609f233 100644
--- a/addons/portal/static/src/scss/portal.scss
+++ b/addons/portal/static/src/scss/portal.scss
@@ -264,14 +264,14 @@ img.o_we_custom_image {
background-color: #169C78;
color: white;
.text-muted {
- color: #ddd;
+ color: #ddd !important;
}
}
.oe_blue_light {
background-color: #41b6ab;
color: white;
.text-muted {
- color: #ddd;
+ color: #ddd !important;
}
}
.oe_blue {
@@ -282,21 +282,21 @@ img.o_we_custom_image {
background-color: #f05442;
color: white;
.text-muted {
- color: #ddd;
+ color: #ddd !important;
}
}
.oe_purple {
background-color: #b163a3;
color: white;
.text-muted {
- color: #ddd;
+ color: #ddd !important;
}
}
.oe_red {
background-color: #9C1b31;
color: white;
.text-muted {
- color: #ddd;
+ color: #ddd !important;
}
}
.oe_none {
diff --git a/addons/pos_discount/i18n/ar.po b/addons/pos_discount/i18n/ar.po
index 962d728dae4..86c5abc50c5 100644
--- a/addons/pos_discount/i18n/ar.po
+++ b/addons/pos_discount/i18n/ar.po
@@ -3,17 +3,18 @@
# * pos_discount
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Martin Trigaux, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# mohamed eboda <m.eboda@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:16+0000\n"
-"PO-Revision-Date: 2018-09-21 13:16+0000\n"
-"Last-Translator: mohamed eboda <m.eboda@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:22+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,7 +25,7 @@ msgstr ""
#. module: pos_discount
#: model:ir.model.fields,help:pos_discount.field_pos_config__iface_discount
msgid "Allow the cashier to give discounts on the whole order."
-msgstr "السماح لأمين الصندوق بعمل تخفيض على امر البيع"
+msgstr "السماح للكاشير بعمل خصومات على الأمر بالكامل."
#. module: pos_discount
#. openerp-web
@@ -36,7 +37,7 @@ msgstr "الخصم"
#. module: pos_discount
#: model_terms:ir.ui.view,arch_db:pos_discount.pos_config_view_form_inherit_pos_discount
msgid "Discount %"
-msgstr ""
+msgstr "خصم %"
#. module: pos_discount
#. openerp-web
@@ -57,7 +58,7 @@ msgstr "منتج الخصم"
#: code:addons/pos_discount/static/src/js/discount.js:28
#, python-format
msgid "No discount product found"
-msgstr ""
+msgstr "لا يوجد منتج لتطبيق خصم عليه"
#. module: pos_discount
#: model:ir.model.fields,field_description:pos_discount.field_pos_config__iface_discount
@@ -82,8 +83,10 @@ msgid ""
"The discount product seems misconfigured. Make sure it is flagged as 'Can be"
" Sold' and 'Available in Point of Sale'."
msgstr ""
+"يبدو أن منتج الخصم لم يتم ضبطه بشكل صحيح. تأكد من تفعيل خياري 'قابل للبيع' "
+"و'متاح في نقطة البيع'."
#. module: pos_discount
#: model:ir.model.fields,help:pos_discount.field_pos_config__discount_product_id
msgid "The product used to model the discount."
-msgstr ""
+msgstr "المنتج المستخدم كمثال على تطبيق الخصم."
diff --git a/addons/pos_restaurant/i18n/km.po b/addons/pos_restaurant/i18n/km.po
index bc04f86fca4..25933ead85d 100644
--- a/addons/pos_restaurant/i18n/km.po
+++ b/addons/pos_restaurant/i18n/km.po
@@ -330,7 +330,7 @@ msgstr ""
#: code:addons/pos_restaurant/static/src/xml/floors.xml:116
#, python-format
msgid "Duplicate"
-msgstr ""
+msgstr "ត្រួត"
#. module: pos_restaurant
#: model_terms:ir.actions.act_window,help:pos_restaurant.action_restaurant_printer_form
@@ -532,7 +532,7 @@ msgstr ""
#. module: pos_restaurant
#: model_terms:pos.config,customer_facing_display_html:pos_restaurant.pos_config_restaurant
msgid "Odoo Logo"
-msgstr ""
+msgstr "Odoo និមិត្តសញ្ញា"
#. module: pos_restaurant
#. openerp-web
@@ -778,7 +778,7 @@ msgstr ""
#: code:addons/pos_restaurant/static/src/xml/printbill.xml:118
#, python-format
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: pos_restaurant
#. openerp-web
diff --git a/addons/pos_sale/i18n/km.po b/addons/pos_sale/i18n/km.po
index d407ee871a8..3ed2b3711a3 100644
--- a/addons/pos_sale/i18n/km.po
+++ b/addons/pos_sale/i18n/km.po
@@ -141,7 +141,7 @@ msgstr ""
#. module: pos_sale
#: model:ir.model,name:pos_sale.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: pos_sale
#: selection:sale.report,state:0
@@ -157,7 +157,7 @@ msgstr ""
#: model:ir.model.fields,field_description:pos_sale.field_pos_config__crm_team_id
#: model:ir.model.fields,field_description:pos_sale.field_pos_session__crm_team_id
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: pos_sale
#: code:addons/pos_sale/models/crm_team.py:119
diff --git a/addons/product/i18n/km.po b/addons/product/i18n/km.po
index 8c7def18878..2b4c0b2efda 100644
--- a/addons/product/i18n/km.po
+++ b/addons/product/i18n/km.po
@@ -1907,7 +1907,7 @@ msgstr ""
#. module: product
#: model_terms:ir.ui.view,arch_db:product.product_template_search_view
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: product
#: model:ir.model.fields,field_description:product.field_res_config_settings__group_product_pricelist
diff --git a/addons/product/i18n/vi.po b/addons/product/i18n/vi.po
index 5c84543861e..7a5d2bf7658 100644
--- a/addons/product/i18n/vi.po
+++ b/addons/product/i18n/vi.po
@@ -1416,7 +1416,7 @@ msgstr "Danh mục cha"
#. module: product
#: model:ir.model.fields,field_description:product.field_product_category__parent_path
msgid "Parent Path"
-msgstr ""
+msgstr "Parent Path"
#. module: product
#: model:product.product,name:product.product_product_9
diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py
index 2a55e3fc9cc..a9530f1f01f 100644
--- a/addons/product/models/product_template.py
+++ b/addons/product/models/product_template.py
@@ -521,10 +521,12 @@ class ProductTemplate(models.Model):
# deleted
valid_value_ids = tmpl_id.valid_product_attribute_value_wnva_ids
valid_attribute_ids = tmpl_id.valid_product_attribute_wnva_ids
+ seen_attributes = set(p.attribute_value_ids for p in tmpl_id.product_variant_ids if p.active)
for product_id in tmpl_id.product_variant_ids:
if product_id._has_valid_attributes(valid_attribute_ids, valid_value_ids):
- if not product_id.active:
+ if not product_id.active and product_id.attribute_value_ids not in seen_attributes:
variants_to_activate += product_id
+ seen_attributes.add(product_id.attribute_value_ids)
else:
variants_to_unlink += product_id
diff --git a/addons/product/tests/test_variants.py b/addons/product/tests/test_variants.py
index 7f9d232fd46..ccddf89c662 100644
--- a/addons/product/tests/test_variants.py
+++ b/addons/product/tests/test_variants.py
@@ -542,3 +542,286 @@ class TestVariantsImages(common.TestProductCommon):
self.assertEqual(self.template.image, self.images['red'])
self.assertEqual(self.variants[0].image_raw_original, False)
self.assertEqual(self.variants[0].image, self.images['red'])
+
+
+class TestVariantsArchive(common.TestProductCommon):
+ """Once a variant is used on orders/invoices, etc, they can't be unlinked.
+ As a result, updating attributes on a product template would simply archive the variants instead.
+ We make sure that at each update, we have the correct number of active and inactive records.
+
+ In these tests, we use the commands sent by the JS framework to the ORM when using the interface
+ (even though using 3 commands would simplify the code compared to 2 commands).
+
+ Note that: we don't overly test the ids of archived / modified variants.
+ In some cases _create_product_variants reuse existing variants and in other create new ones,
+ in a way that is not very predictable (without reading the code).
+ We do not enshrine the current behaviour in the tests (yet) as it could change with only moderate functional impact.
+ Consequently, if it is intentional the number of archived variants could change,
+ in that case update the test; it is there to make sure that a fix is not going to break anything silently.
+ The most important is to keep correct numbers of active variants.
+ """
+ def setUp(self):
+ res = super(TestVariantsArchive, self).setUp()
+
+ attribute_values = {
+ 'color': ['white', 'black'],
+ 'size': ['s', 'm'],
+ }
+
+ self.attributes = {}
+ for attr, attr_values in attribute_values.items():
+ attribute = self.env['product.attribute'].create({'name': attr})
+ values = [self.env['product.attribute.value'].create({'name': name, 'attribute_id': attribute.id})
+ for name in attr_values]
+ self.attributes.update({attr: {'a': attribute, 'v': values}})
+
+ attribute_line_ids = [(0, 0, {
+ 'attribute_id': attr['a'].id,
+ 'value_ids': [(6, 0, [v.id for v in attr['v']])],
+ }) for attr in self.attributes.values()]
+
+ self.template = self.env['product.template'].create({
+ 'name': 'consume product',
+ 'attribute_line_ids': attribute_line_ids,
+ })
+
+ return res
+
+ def test_update_variant_unlink(self):
+ """Variants are not used anywhere, so removing an attribute line would
+ unlink the variants and create new ones. Nothing too fancy here.
+ """
+ lines = self.template.attribute_line_ids
+ self.assertEqual(len(self.template.product_variant_ids), 4)
+ # we keep lines[0], remove and copy lines[1]
+ line_copy_command = {'attribute_id': lines[1].attribute_id.id, 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]}
+ self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(self.template.product_variant_ids), len(lines[0].value_ids),
+ "Since we only kept line[0], we should have as many variants as it has values")
+ archived_products = self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])
+ self.assertFalse(archived_products,
+ "Since they are used nowhere, there should not be any archived variant.")
+ # we re-add the line we just removed, so we should get new variants
+ self.template.write({
+ 'attribute_line_ids': [
+ (4, lines[0].id),
+ (0, 'virtual', line_copy_command),
+ ]})
+ self.assertEqual(len(self.template.product_variant_ids), 4)
+
+ def test_update_variant_archive_1_value(self):
+ """We do the same operations on the template as in test_update_variant_unlink,
+ except we simulate that the variants can't be unlinked.
+ It follows that variants should be archived instead, so the results should all be different from previous test.
+ In this test we have a line that have only one possible value:
+ this is handled differently than the case where we have more than one,
+ since in principle it does not add new variants.
+ """
+ # we create a new template with a line with only one attribute.
+ # Since this does not create any additional variants, the behaviour is a little bit different:
+ # it tries to add the new attribute to existing variants if possible
+ attribute_line_ids = [(0, 0, {
+ 'attribute_id': attr['a'].id,
+ 'value_ids': [(6, 0, [v.id for v in (attr['v'] if attr['a'].display_name == 'color' else attr['v'][:1])])],
+ }) for attr in self.attributes.values()]
+
+ template = self.env['product.template'].create({
+ 'name': 'consume product',
+ 'attribute_line_ids': attribute_line_ids,
+ })
+
+ # create a patch to make as if one variant was undeletable
+ # (e.g. present in a field with ondelete=restrict)
+ Product = self.env['product.product']
+ no_remove = template.product_variant_ids[0].id
+ def unlink(self):
+ if self.id == no_remove:
+ raise Exception('just')
+ else:
+ return super(Product.__class__, self).unlink()
+ Product._patch_method('unlink', unlink)
+
+ variants_ids_history = []
+
+ self.assertEqual(len(template.product_variant_ids), 2)
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ lines = template.attribute_line_ids
+ # we keep lines[0], remove and copy lines[1], which is the one with only one possible value
+ line_copy_command = {'attribute_id': lines[1].attribute_id.id,
+ 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]}
+ template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(lines[0].value_ids), 2)
+ self.assertEqual(len(template.product_variant_ids), len(lines[0].value_ids),
+ "Since we only kept line[0], we should have as many variants as it has values")
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ archived_products_1 = self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', template.id)])
+ self.assertEqual(len(archived_products_1), 1,
+ "One variant should have been unlinked, not the other.")
+ # we re-add the line we just removed, so we should get new variants
+ template.write({
+ 'attribute_line_ids': [
+ (4, lines[0].id),
+ (0, 'virtual', line_copy_command),
+ ]})
+ self.assertEqual(len(template.product_variant_ids), 2)
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ archived_products_2 = self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', template.id)])
+ self.assertEqual(len(archived_products_2), 1,
+ "We did not reactivate this variant.")
+
+ # tests on ids, see the doc_string
+ self.assertEqual(archived_products_1, archived_products_2)
+ self.assertEqual(len(set(variants_ids_history[0] + variants_ids_history[1])), 4,
+ "After the first update, we have new active variants.")
+ self.assertEqual(len(set(variants_ids_history[1] + variants_ids_history[2])), 2,
+ "After the second update, we kept the same active variants.")
+
+ Product._revert_method('unlink')
+
+ def test_update_variant_archive_2_value(self):
+ """We do the same operations on the template as in test_update_variant_unlink,
+ except we simulate that the variants can't be unlinked.
+ It follows that variants should be archived instead, so the results should all be different from previous test.
+ """
+ Product = self.env['product.product']
+ def unlink(slef):
+ raise Exception('just')
+ Product._patch_method('unlink', unlink)
+ variants_ids_history = []
+
+ self.assertEqual(len(self.template.product_variant_ids), 4)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+
+ lines = self.template.attribute_line_ids
+ # we keep lines[0], remove and copy lines[1]
+ line_copy_command = {'attribute_id': lines[1].attribute_id.id,
+ 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]}
+ line_second_copy_command = {'attribute_id': lines[1].attribute_id.id,
+ 'value_ids': [(6, False, lines[1].value_ids[:1].mapped('id'))]}
+ self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(self.template.product_variant_ids), len(lines[0].value_ids),
+ "Since we only kept line[0], we should have as many variants as it has values")
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+
+ archived_products = []
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.assertEqual(len(archived_products[0]), 4,
+ "Since they can't be unlinked, all variants should be archived.")
+ # we re-add the line we just removed, so we should get new variants
+ self.template.write({
+ 'attribute_line_ids': [
+ (4, lines[0].id),
+ (0, 'virtual', line_copy_command),
+ ]})
+ self.assertEqual(len(self.template.product_variant_ids), 4)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.assertEqual(len(archived_products[1]), 2,
+ "Since they can't be unlinked, all previous variants should be archived.")
+
+ # we redo the whole remove/readd to check
+ lines = self.template.attribute_line_ids
+ self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(self.template.product_variant_ids), 2)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.template.write({
+ 'attribute_line_ids': [
+ (4, lines[0].id),
+ (0, 'virtual', line_copy_command),
+ ]})
+ self.assertEqual(len(self.template.product_variant_ids), 4)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.assertEqual(len(archived_products[3]), 2)
+
+ # now we test when we try to add the value back on existing products
+ lines = self.template.attribute_line_ids
+ self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(self.template.product_variant_ids), 2)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.assertEqual(len(archived_products[4]), 4)
+ # this time we only add one of the two attributes we've been removing
+ self.template.write({
+ 'attribute_line_ids': [
+ (4, lines[0].id),
+ (0, 'virtual', line_second_copy_command),
+ ]})
+ self.assertEqual(len(self.template.product_variant_ids), 2)
+ variants_ids_history.append(self.template.product_variant_ids.ids)
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]))
+ self.assertEqual(len(archived_products[5]), 4)
+
+ Product._revert_method('unlink')
+
+ def test_update_variant_archive_3_value(self):
+ """In this one, we have unique values for one lines, and one line with two values.
+ We first remove the unique line to populate archived variants, then remove the two values line.
+ Finally, we re-add athe two lines, bringing us back to the first situation:
+ we should not have any more than two variants (rest should be archived)
+ """
+ attribute_line_ids = [(0, 0, {
+ 'attribute_id': attr['a'].id,
+ 'value_ids': [(6, 0, [v.id for v in (attr['v'] if attr['a'].display_name == 'color' else attr['v'][:1])])],
+ }) for attr in self.attributes.values()]
+
+ template = self.env['product.template'].create({
+ 'name': 'consume product',
+ 'attribute_line_ids': attribute_line_ids,
+ })
+
+ Product = self.env['product.product']
+ def unlink(slef):
+ raise Exception('just')
+ Product._patch_method('unlink', unlink)
+
+ variants_ids_history = []
+ self.assertEqual(len(template.product_variant_ids), 2)
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ lines = template.attribute_line_ids
+
+ template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]})
+ self.assertEqual(len(template.product_variant_ids), len(lines[0].value_ids),
+ "Since we only kept line[0], we should have as many variants as it has values")
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ archived_products = []
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', template.id)]))
+ self.assertEqual(len(archived_products[0]), 2,
+ "Since they can't be unlinked, all variants should be archived.")
+
+ template.write({'attribute_line_ids': [(2, lines[0].id)]})
+ self.assertEqual(len(template.product_variant_ids), 1)
+ variants_ids_history.append(template.product_variant_ids.ids)
+
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', template.id)]))
+ self.assertEqual(len(archived_products[1]), 4,
+ "Since they can't be unlinked, all previous variants should be archived.")
+
+ # we re-add everything:
+ template.write({'attribute_line_ids': attribute_line_ids})
+
+ archived_products.append(self.env['product.product'].search(
+ [('active', '=', False), ('product_tmpl_id', '=', template.id)]))
+ self.assertEqual(len(template.product_variant_ids), 2)
+ self.assertEqual(len(archived_products[2]), 3,
+ "We should have re-activated one variant only.")
+
+ Product._revert_method('unlink')
diff --git a/addons/product_expiry/i18n/ar.po b/addons/product_expiry/i18n/ar.po
index 0f41722b037..3598197d0e6 100644
--- a/addons/product_expiry/i18n/ar.po
+++ b/addons/product_expiry/i18n/ar.po
@@ -3,17 +3,17 @@
# * product_expiry
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Martin Trigaux, 2018
# Mohammed Albasha <m.albasha.ma@gmail.com>, 2018
-# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:23+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -28,11 +28,13 @@ msgid ""
"<span class=\"badge badge-danger\" attrs=\"{'invisible': "
"[('product_expiry_alert', '=', False)]}\">Expiration Alert</span>"
msgstr ""
+"<span class=\"badge badge-danger\" attrs=\"{'invisible': "
+"[('product_expiry_alert', '=', False)]}\">تنبيه انتهاء الصلاحية</span>"
#. module: product_expiry
#: model_terms:ir.ui.view,arch_db:product_expiry.view_product_form_expiry
msgid "<span>days</span>"
-msgstr ""
+msgstr "<span>أيام</span>"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__alert_date
@@ -42,12 +44,12 @@ msgstr "تاريخ التنبيه"
#. module: product_expiry
#: model:mail.activity.type,name:product_expiry.mail_activity_type_alert_date_reached
msgid "Alert Date Reached"
-msgstr ""
+msgstr "تم الوصول لتاريخ التنبيه"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__use_date
msgid "Best before Date"
-msgstr "مثالي قبل التاريخ"
+msgstr "مثالي قبل تاريخ"
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_stock_production_lot__alert_date
@@ -55,6 +57,8 @@ msgid ""
"Date to determine the expired lots and serial numbers using the filter "
"\"Expiration Alerts\"."
msgstr ""
+"تاريخ تحديد أرقام اللوط والأرقام المسلسلة للمنتجات منتهية الصلاحية باستخدام "
+"فلتر \"تنبيهات انتهاء الصلاحية\"."
#. module: product_expiry
#: model_terms:ir.ui.view,arch_db:product_expiry.view_move_form_expiry
@@ -71,12 +75,12 @@ msgstr "تاريخ انتهاء الصلاحية"
#. module: product_expiry
#: model_terms:ir.ui.view,arch_db:product_expiry.search_product_lot_filter_inherit_product_expiry
msgid "Expiration Alerts"
-msgstr ""
+msgstr "تنبيهات انتهاء الصلاحية"
#. module: product_expiry
#: model:ir.model,name:product_expiry.model_stock_production_lot
msgid "Lot/Serial"
-msgstr "اللوط/المسلسل"
+msgstr "رقم اللوط/الرقم المسلسل"
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__alert_time
@@ -84,6 +88,7 @@ msgstr "اللوط/المسلسل"
msgid ""
"Number of days before an alert should be raised on the lot/serial number."
msgstr ""
+"عدد الأيام المتبقية حتى يتوجب إصدار تنبيه على رقم اللوط/الرقم المسلسل."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__life_time
@@ -92,6 +97,8 @@ msgid ""
"Number of days before the goods may become dangerous and must not be "
"consumed. It will be computed on the lot/serial number."
msgstr ""
+"عدد الأيام المتبقية حتى تصبح البضاعة خطيرة وغير صالحة للاستهلاك الآدمي. سيتم"
+" احتسابه من خلال رقم اللوط/الرقم المسلسل."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__removal_time
@@ -100,6 +107,8 @@ msgid ""
"Number of days before the goods should be removed from the stock. It will be"
" computed on the lot/serial number."
msgstr ""
+"عدد الأيام المتبقية حتى يتوجب إزالة البضاعة من المخزون. سيتم احتسابه من خلال"
+" رقم اللوط/الرقم المسلسل."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__use_time
@@ -108,11 +117,13 @@ msgid ""
"Number of days before the goods starts deteriorating, without being "
"dangerous yet. It will be computed using the lot/serial number."
msgstr ""
+"عدد الأيام المتبقية حتى تبدأ البضاعة في التلف، لكنها تكون غير خطيرة بعد. "
+"سيتم احتسابه من خلال رقم اللوط/الرقم المسلسل."
#. module: product_expiry
#: model:ir.model,name:product_expiry.model_procurement_group
msgid "Procurement Group"
-msgstr "مجموعه التوريدات "
+msgstr "مجموعه التوريدات"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_product_product__alert_time
@@ -123,13 +134,13 @@ msgstr "فترة التنبيه على المنتج"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__product_expiry_alert
msgid "Product Expiry Alert"
-msgstr ""
+msgstr "تنبيه انتهاء صلاحية المنتج"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_product_product__life_time
#: model:ir.model.fields,field_description:product_expiry.field_product_template__life_time
msgid "Product Life Time"
-msgstr "العمر الافتراضي"
+msgstr "العمر الافتراضي للمنتج"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_product_product__removal_time
@@ -162,13 +173,13 @@ msgstr "تاريخ الإزالة"
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_stock_production_lot__product_expiry_alert
msgid "The Alert Date has been reached."
-msgstr ""
+msgstr "تم الوصول لتاريخ التنبيه."
#. module: product_expiry
#: code:addons/product_expiry/models/production_lot.py:84
#, python-format
msgid "The alert date has been reached for this lot/serial number"
-msgstr ""
+msgstr "تم الوصول لتاريخ التنبيه لرقم اللوط/الرقم المسلسل هذا"
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_stock_production_lot__life_date
@@ -176,8 +187,8 @@ msgid ""
"This is the date on which the goods with this Serial Number may become "
"dangerous and must not be consumed."
msgstr ""
-"هذا هو التاريخ التي ستصبح فيه المنتجات غير صالحة للاستهلاك الآدمي أو تصبح "
-"خطرة فيه."
+"هذا هو التاريخ التي قد تصبح فيه البضاعة التي تحمل هذا الرقم المسلسل خطيرة "
+"وغير صالحة للاستهلاك الآدمي."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_stock_production_lot__removal_date
@@ -186,7 +197,7 @@ msgid ""
"This is the date on which the goods with this Serial Number should be "
"removed from the stock."
msgstr ""
-"هذا هو التاريخ الذي يجب إزالة المنتجات التي تحمل هذا الرقم المسلسل من "
+"هذا هو التاريخ الذي يجب فيه إزالة البضاعة التي تحمل هذا الرقم المسلسل من "
"المخزون."
#. module: product_expiry
@@ -195,5 +206,5 @@ msgid ""
"This is the date on which the goods with this Serial Number start "
"deteriorating, without being dangerous yet."
msgstr ""
-"هذا هو التاريخ الذي تبدأ فيه المنتجات التي تحمل هذا الرقم المسلسل في التلف، "
-"ولكنها لن تصبح خطرة عند هذا التاريخ."
+"هذا هو التاريخ الذي تبدأ فيه البضاعة التي تحمل هذا الرقم المسلسل في التلف، "
+"لكنها تكون غير خطيرة بعد."
diff --git a/addons/product_expiry/i18n/km.po b/addons/product_expiry/i18n/km.po
index 42aac5e872d..ab52b4ce873 100644
--- a/addons/product_expiry/i18n/km.po
+++ b/addons/product_expiry/i18n/km.po
@@ -55,7 +55,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:product_expiry.view_move_form_expiry_simple
#: model_terms:ir.ui.view,arch_db:product_expiry.view_product_form_expiry
msgid "Dates"
-msgstr ""
+msgstr "កាលបរិច្ឆេទ"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__life_date
diff --git a/addons/product_margin/i18n/km.po b/addons/product_margin/i18n/km.po
index f9f01236fda..1f34440a23d 100644
--- a/addons/product_margin/i18n/km.po
+++ b/addons/product_margin/i18n/km.po
@@ -237,7 +237,7 @@ msgstr ""
#. module: product_margin
#: model_terms:ir.ui.view,arch_db:product_margin.view_product_margin_form
msgid "Purchases"
-msgstr ""
+msgstr "ការទិញ"
#. module: product_margin
#: model_terms:ir.ui.view,arch_db:product_margin.view_product_margin_form
diff --git a/addons/product_margin/models/product_product.py b/addons/product_margin/models/product_product.py
index 362fc1fbccb..8065dc32d27 100644
--- a/addons/product_margin/models/product_product.py
+++ b/addons/product_margin/models/product_product.py
@@ -107,8 +107,9 @@ class ProductProduct(models.Model):
#Cost price is calculated afterwards as it is a property
sqlstr = """
+ WITH currency_rate AS ({})
SELECT
- SUM(l.price_unit * l.quantity)/NULLIF(SUM(l.quantity),0) AS avg_unit_price,
+ SUM(l.price_unit / (CASE COALESCE(cr.rate, 0) WHEN 0 THEN 1.0 ELSE cr.rate END) * l.quantity) / NULLIF(SUM(l.quantity),0) AS avg_unit_price,
SUM(l.quantity) AS num_qty,
SUM(l.balance) AS total,
SUM(l.quantity * pt.list_price) AS sale_expected
@@ -116,6 +117,11 @@ class ProductProduct(models.Model):
LEFT JOIN account_move i ON (l.move_id = i.id)
LEFT JOIN product_product product ON (product.id=l.product_id)
LEFT JOIN product_template pt ON (pt.id = product.product_tmpl_id)
+ left join currency_rate cr on
+ (cr.currency_id = i.currency_id and
+ cr.company_id = i.company_id and
+ cr.date_start <= COALESCE(i.invoice_date, NOW()) and
+ (cr.date_end IS NULL OR cr.date_end > COALESCE(i.invoice_date, NOW())))
WHERE l.product_id = %s
AND i.state IN %s
AND i.invoice_payment_state IN %s
@@ -123,7 +129,7 @@ class ProductProduct(models.Model):
AND i.invoice_date BETWEEN %s AND %s
AND i.company_id = %s
AND l.display_type IS NULL
- """
+ """.format(self.env['res.currency']._select_companies_rates())
invoice_types = ('out_invoice', 'in_refund')
self.env.cr.execute(sqlstr, (val.id, states, invoice_payment_states, invoice_types, date_from, date_to, company_id))
result = self.env.cr.fetchall()[0]
diff --git a/addons/project/i18n/km.po b/addons/project/i18n/km.po
index b3913cf1961..5deb5839780 100644
--- a/addons/project/i18n/km.po
+++ b/addons/project/i18n/km.po
@@ -356,12 +356,12 @@ msgstr ""
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__alias_contact
msgid "Alias Contact Security"
-msgstr ""
+msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__alias_name
msgid "Alias Name"
-msgstr ""
+msgstr "ឈ្មោះក្លែក្លាយ"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__alias_domain
@@ -371,7 +371,7 @@ msgstr ""
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__alias_model_id
msgid "Aliased Model"
-msgstr ""
+msgstr "គំរូឈ្មោះក្លែងក្លាយ"
#. module: project
#: code:addons/project/controllers/portal.py:111
@@ -798,7 +798,7 @@ msgstr ""
#: model:ir.model.fields,help:project.field_project_project__access_url
#: model:ir.model.fields,help:project.field_project_task__access_url
msgid "Customer Portal URL"
-msgstr ""
+msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន"
#. module: project
#: model:ir.actions.act_window,name:project.rating_rating_action_project_report
@@ -1243,7 +1243,7 @@ msgstr "ID"
msgid ""
"ID of the parent record holding the alias (example: project holding the task"
" creation alias)"
-msgstr ""
+msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់"
#. module: project
#. openerp-web
@@ -1352,7 +1352,7 @@ msgstr ""
#: code:addons/project/static/src/js/project_task_kanban_examples.js:51
#, python-format
msgid "Inbox"
-msgstr ""
+msgstr "សំបុត្រប្រអប់"
#. module: project
#: model:ir.model.fields,help:project.field_project_project__alias_id
@@ -1514,7 +1514,7 @@ msgstr ""
#: code:addons/project/static/src/js/project_task_kanban_examples.js:64
#, python-format
msgid "Live"
-msgstr ""
+msgstr "រស់នៅ"
#. module: project
#: model_terms:ir.ui.view,arch_db:project.res_config_settings_view_form
@@ -1582,7 +1582,7 @@ msgstr ""
#. module: project
#: model_terms:ir.ui.view,arch_db:project.view_project_project_filter
msgid "My Favorites"
-msgstr ""
+msgstr "ចំណូលចិត្តរបស់ខ្ថុំ"
#. module: project
#: model_terms:ir.ui.view,arch_db:project.view_task_search_form
@@ -1819,6 +1819,9 @@ msgid ""
"attached, even if they did not reply to it. If set, this will disable the "
"creation of new records completely."
msgstr ""
+"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) "
+"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ "
+"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។"
#. module: project
#: model_terms:ir.actions.act_window,help:project.open_view_project_all
@@ -1951,7 +1954,7 @@ msgstr ""
#: model:ir.model.fields,field_description:project.field_project_project__access_url
#: model:ir.model.fields,field_description:project.field_project_task__access_url
msgid "Portal Access URL"
-msgstr ""
+msgstr "URL ចូលដំណើរការវិបផតថល"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__priority
@@ -2369,7 +2372,7 @@ msgstr ""
#. module: project
#: model_terms:ir.ui.view,arch_db:project.view_task_search_form
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: project
#. openerp-web
diff --git a/addons/project/i18n/vi.po b/addons/project/i18n/vi.po
index 5612576901e..49893847088 100644
--- a/addons/project/i18n/vi.po
+++ b/addons/project/i18n/vi.po
@@ -924,7 +924,7 @@ msgstr "Phát triển"
#. module: project
#: model:ir.model,name:project.model_digest_digest
msgid "Digest"
-msgstr ""
+msgstr "Tiêu"
#. module: project
#. openerp-web
@@ -2617,7 +2617,7 @@ msgstr ""
#. module: project
#: model:ir.model.fields,field_description:project.field_res_config_settings__module_hr_timesheet
msgid "Task Logs"
-msgstr ""
+msgstr "Nhật kí công việc"
#. module: project
#: model:ir.filters,name:project.filter_task_report_task_pipe
diff --git a/addons/project/models/project.py b/addons/project/models/project.py
index d8efafdd47f..e5e67c382bd 100644
--- a/addons/project/models/project.py
+++ b/addons/project/models/project.py
@@ -264,7 +264,7 @@ class Project(models.Model):
defaults = self._map_tasks_default_valeus(task)
if task.parent_id:
# set the parent to the duplicated task
- defaults['parent_id'] = old_to_new_tasks[task.parent_id.id]
+ defaults['parent_id'] = old_to_new_tasks.get(task.parent_id.id, False)
new_task = task.copy(defaults)
old_to_new_tasks[task.id] = new_task.id
tasks += new_task
diff --git a/addons/project_timesheet_holidays/i18n/ar.po b/addons/project_timesheet_holidays/i18n/ar.po
index 697c8c256d3..721407d60f9 100644
--- a/addons/project_timesheet_holidays/i18n/ar.po
+++ b/addons/project_timesheet_holidays/i18n/ar.po
@@ -3,19 +3,18 @@
# * project_timesheet_holidays
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
-# Martin Trigaux, 2018
# Osoul <baruni@osoul.ly>, 2018
-# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:23+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -26,7 +25,7 @@ msgstr ""
#. module: project_timesheet_holidays
#: model:ir.model,name:project_timesheet_holidays.model_account_analytic_line
msgid "Analytic Line"
-msgstr "البنود التحليلية"
+msgstr "البند التحليلي"
#. module: project_timesheet_holidays
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave__timesheet_ids
@@ -39,7 +38,7 @@ msgstr "البنود التحليلية"
msgid ""
"Both the internal project and task are required to generate timesheet for "
"the leaves."
-msgstr ""
+msgstr "تحتاج للمشروع الداخلي والمهمة كليهما لإنشاء سجل نشاط للإجازات."
#. module: project_timesheet_holidays
#: model:ir.model,name:project_timesheet_holidays.model_res_company
@@ -55,12 +54,12 @@ msgstr "ضبط الإعدادات"
#: model:ir.model.fields,help:project_timesheet_holidays.field_res_company__leave_timesheet_project_id
#: model:ir.model.fields,help:project_timesheet_holidays.field_res_config_settings__leave_timesheet_project_id
msgid "Default project value for timesheet generated from leave type."
-msgstr ""
+msgstr "قيمة المشروع الافتراضية لسجل النشاط الناشئ من نوع الإجازة."
#. module: project_timesheet_holidays
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_generate
msgid "Generate Timesheet"
-msgstr ""
+msgstr "إنشاء سجل نشاط"
#. module: project_timesheet_holidays
#: model:ir.model.fields,help:project_timesheet_holidays.field_hr_leave_type__timesheet_generate
@@ -68,6 +67,8 @@ msgid ""
"If checked, when validating a leave, timesheet will be generated in the "
"Vacation Project of the company."
msgstr ""
+"إذا كان محددًا، عند اعتماد إجازة، سيتم إنشاء سجل نشاط في مشروع العطلة الخاص "
+"بالمؤسسة."
#. module: project_timesheet_holidays
#: code:addons/project_timesheet_holidays/models/res_company.py:30
@@ -76,39 +77,39 @@ msgstr ""
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings__leave_timesheet_project_id
#, python-format
msgid "Internal Project"
-msgstr ""
+msgstr "مشروع داخلي"
#. module: project_timesheet_holidays
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_task_id
msgid "Internal Task for timesheet"
-msgstr ""
+msgstr "مهمة داخلية لسجل النشاط"
#. module: project_timesheet_holidays
#: model:ir.model,name:project_timesheet_holidays.model_hr_leave
msgid "Leave"
-msgstr "مغادرة"
+msgstr "إجازة"
#. module: project_timesheet_holidays
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_account_analytic_line__holiday_id
msgid "Leave Request"
-msgstr "طلب الاجازة"
+msgstr "طلب الإجازة"
#. module: project_timesheet_holidays
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_company__leave_timesheet_task_id
#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings__leave_timesheet_task_id
msgid "Leave Task"
-msgstr ""
+msgstr "مهمة الإجازة"
#. module: project_timesheet_holidays
#: model:ir.model,name:project_timesheet_holidays.model_hr_leave_type
msgid "Leave Type"
-msgstr "نوع الاجازة"
+msgstr "نوع الإجازة"
#. module: project_timesheet_holidays
#: code:addons/project_timesheet_holidays/models/res_company.py:40
#, python-format
msgid "Leaves"
-msgstr "مغادرات"
+msgstr "الإجازات"
#. module: project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:project_timesheet_holidays.res_config_settings_view_form
@@ -124,7 +125,7 @@ msgstr "المهمة"
#: model:ir.model.fields,help:project_timesheet_holidays.field_hr_leave_type__timesheet_project_id
msgid ""
"The project will contain the timesheet generated when a leave is validated."
-msgstr ""
+msgstr "سيحتوي المشروع على سجل النشاط الناشئ عند اعتماد إجازة."
#. module: project_timesheet_holidays
#: code:addons/project_timesheet_holidays/models/account_analytic.py:16
@@ -132,4 +133,4 @@ msgstr ""
msgid ""
"You cannot delete timesheet lines attached to a leaves. Please cancel the "
"leaves instead."
-msgstr ""
+msgstr "لا يمكنك حذف سجل نشاط مرتبط بإجازة. برجاء إلغاء الإجازة بدلًا من هذا."
diff --git a/addons/purchase/i18n/cs.po b/addons/purchase/i18n/cs.po
index 57d0150cdac..c711950c911 100644
--- a/addons/purchase/i18n/cs.po
+++ b/addons/purchase/i18n/cs.po
@@ -1178,7 +1178,7 @@ msgstr "Kategorie výrobku"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order_line__product_image
msgid "Product Image"
-msgstr ""
+msgstr "Obrázek produktu"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_report__unit_quantity
diff --git a/addons/purchase/i18n/ja.po b/addons/purchase/i18n/ja.po
index d3351ff4038..824de994fcd 100644
--- a/addons/purchase/i18n/ja.po
+++ b/addons/purchase/i18n/ja.po
@@ -1286,7 +1286,7 @@ msgstr ""
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_config_settings__po_order_approval
msgid "Purchase Order Approval"
-msgstr ""
+msgstr "購買オーダ承認"
#. module: purchase
#: model_terms:ir.ui.view,arch_db:purchase.report_purchaseorder_document
diff --git a/addons/purchase/i18n/km.po b/addons/purchase/i18n/km.po
index b62c7a4970a..c3c7e3e5fd4 100644
--- a/addons/purchase/i18n/km.po
+++ b/addons/purchase/i18n/km.po
@@ -533,7 +533,7 @@ msgstr "រូបិយវត្ថុ"
#. module: purchase
#: model:ir.model.fields,help:purchase.field_purchase_order__access_url
msgid "Customer Portal URL"
-msgstr ""
+msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_bill_union__date
@@ -763,7 +763,7 @@ msgstr ""
#. module: purchase
#: model_terms:ir.ui.view,arch_db:purchase.res_config_settings_view_form_purchase
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order__message_is_follower
@@ -820,7 +820,7 @@ msgstr ""
#. module: purchase
#: model_terms:ir.ui.view,arch_db:purchase.purchase_order_form
msgid "Lock"
-msgstr ""
+msgstr "ចាក់សោរ"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_config_settings__lock_confirmed_po
@@ -1114,7 +1114,7 @@ msgstr ""
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order__payment_term_id
msgid "Payment Terms"
-msgstr ""
+msgstr "លក្ខ័ណការទូទាត់"
#. module: purchase
#: selection:purchase.order,activity_state:0
@@ -1124,7 +1124,7 @@ msgstr ""
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order__access_url
msgid "Portal Access URL"
-msgstr ""
+msgstr "URL ចូលដំណើរការវិបផតថល"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_product_category__property_account_creditor_price_difference_categ
@@ -1173,7 +1173,7 @@ msgstr ""
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_report__unit_quantity
msgid "Product Quantity"
-msgstr ""
+msgstr "បរិមាណផលិតផល"
#. module: purchase
#: model:ir.model,name:purchase.model_product_template
@@ -1361,7 +1361,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_filter
#: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_search
msgid "Purchase Representative"
-msgstr ""
+msgstr "អ្នកតំណាងការទិញ"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_config_settings__group_warning_purchase
@@ -1403,7 +1403,7 @@ msgstr ""
#. module: purchase
#: model_terms:ir.ui.view,arch_db:purchase.res_partner_view_purchase_buttons
msgid "Purchases"
-msgstr ""
+msgstr "ការទិញ"
#. module: purchase
#: model:ir.model,name:purchase.model_purchase_bill_union
@@ -1635,7 +1635,7 @@ msgstr ""
#. module: purchase
#: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_bill_union__reference
@@ -1667,7 +1667,7 @@ msgstr ""
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order_line__price_subtotal
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_partner__property_purchase_currency_id
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index eba32f0b995..3c5cc0860ae 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -170,7 +170,7 @@
placeholder="Name, TIN, Email, or Reference"
/>
<field name="partner_ref"/>
- <field name="currency_id" groups="base.group_multi_currency"/>
+ <field name="currency_id" groups="base.group_multi_currency" force_save="1"/>
</group>
<group>
<field name="date_order" attrs="{'invisible': [('state','=','purchase')]}"/>
diff --git a/addons/purchase_requisition/i18n/km.po b/addons/purchase_requisition/i18n/km.po
index a701faa172c..8d97a1cb5ce 100644
--- a/addons/purchase_requisition/i18n/km.po
+++ b/addons/purchase_requisition/i18n/km.po
@@ -557,7 +557,7 @@ msgstr ""
#: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition__user_id
#: model_terms:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
msgid "Purchase Representative"
-msgstr ""
+msgstr "អ្នកតំណាងការទិញ"
#. module: purchase_requisition
#: model:ir.model,name:purchase_requisition.model_purchase_requisition
diff --git a/addons/repair/i18n/ar.po b/addons/repair/i18n/ar.po
index 5a44e5b6d51..6d139f1c280 100644
--- a/addons/repair/i18n/ar.po
+++ b/addons/repair/i18n/ar.po
@@ -8,7 +8,6 @@
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
-# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Osoul <baruni@osoul.ly>, 2018
# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018
# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
@@ -43,6 +42,8 @@ msgstr ""
#: model:mail.template,subject:repair.mail_template_repair_quotation
msgid "${object.partner_id.name} Repair Orders (Ref ${object.name or 'n/a' })"
msgstr ""
+"${object.partner_id.name} أوامر التصليح (رقم الإشارة ${object.name or 'n/a' "
+"})"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -64,6 +65,12 @@ msgid ""
"* The 'Done' status is set when repairing is completed.\n"
"* The 'Cancelled' status is used when user cancel repair order."
msgstr ""
+"* تستخدم الحالة 'مسودة' عندما ينشئ المستخدم أمر تصليح جديد غير مؤكد.\n"
+"* تستخدم الحالة 'مؤكد' عندما يقوم المستخدم بتأكيد أمر التصليح.\n"
+"* تستخدم الحالة 'جاهز للتصليح' لبدء التصليح، لا يمكن للمستخدم بدء التصليح سوى بعد تأكيد أمر التصليح.\n"
+"* تستخدم الحالة 'ينتظر الفوترة' لإنشاء الفاتورة قبل أو بعد انتهاء عملية التصليح.\n"
+"* ينتقل أمر التصليح للحالة 'منتهي' عند إكتمال عملية التصليح.\n"
+"* تستخدم الحالة 'ملغي' عندما يقوم المستخدم بإلغاء أمر التصليح."
#. module: repair
#: model:mail.template,body_html:repair.mail_template_repair_quotation
@@ -87,6 +94,24 @@ msgid ""
" </p>\n"
"</div>"
msgstr ""
+"<?xml version=\"1.0\"?>\n"
+"<div style=\"margin: 0px; padding: 0px;\">\n"
+" <p style=\"margin: 0px; padding: 0px;font-size: 13px;\">\n"
+" مرحبًا ${object.partner_id.name}،<br/>\n"
+" إليك أمر الأصلاح الخاص بك ${doc_name} <strong>${object.name}</strong>\n"
+" % if object.origin:\n"
+" (برقم الإشارة: ${object.origin} )\n"
+" % endif\n"
+" % if object.invoice_method != 'none':\n"
+" وقيمته <strong>${format_amount(object.amount_total, object.pricelist_id.currency_id)}.</strong><br/>\n"
+" % else:\n"
+" .<br/>\n"
+" % endif\n"
+" يمكنك الرد على هذه الرسالة إذا كان لديك أية أسئلة.\n"
+" <br/><br/>\n"
+" شكرًا لك،\n"
+" </p>\n"
+"</div>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -99,21 +124,23 @@ msgid ""
"<span class=\"o_form_label\">This operation will cancel the Repair process, "
"but will not cancel it's Invoice. Do you want to continue?</span>"
msgstr ""
+"<span class=\"o_form_label\">ستلغي هذه العملية عملية التصليح، لكنها لن تلغي "
+"فاتورتها. هل تريد الاستمرار؟</span>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Lot/Serial Number:</strong>"
-msgstr ""
+msgstr "<strong>رقم اللوط/الرقم المسلسل:</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Operations</strong>"
-msgstr ""
+msgstr "</strong>العمليات</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Parts</strong>"
-msgstr ""
+msgstr "<strong>الأجزاء</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -123,12 +150,12 @@ msgstr "<strong>تاريخ الطباعة:</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Product to Repair:</strong>"
-msgstr "<strong>منتج للتعديل:</strong>"
+msgstr "<strong>المنتج المراد تصليحه:</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Shipping address :</strong>"
-msgstr ""
+msgstr "<strong>عنوان الشحن:</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -143,12 +170,12 @@ msgstr "<strong>الإجمالي</strong>"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "<strong>Warranty:</strong>"
-msgstr ""
+msgstr "<strong>الضمان:</strong>"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__message_needaction
msgid "Action Needed"
-msgstr "الإجراء المطلوب"
+msgstr "إجراء مطلوب"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__activity_ids
@@ -168,12 +195,12 @@ msgstr "إضافة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Add internal notes..."
-msgstr "اضافه ملاحظات داخليه "
+msgstr "إضافة ملاحظات داخلية..."
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Add quotation notes..."
-msgstr "اضافه ملاحظات عروض الاسعار "
+msgstr "إضافة ملاحظات عروض الأسعار..."
#. module: repair
#: selection:repair.order,invoice_method:0
@@ -200,13 +227,13 @@ msgstr "إلغاء"
#: model:ir.model,name:repair.model_repair_cancel
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Cancel Repair"
-msgstr "إلغي التصليح"
+msgstr "إلغاء التصليح"
#. module: repair
#: model:ir.actions.act_window,name:repair.action_cancel_repair
#: model_terms:ir.ui.view,arch_db:repair.view_cancel_repair
msgid "Cancel Repair Order"
-msgstr "الغاء امر التصليح"
+msgstr "إلغاء أمر التصليح"
#. module: repair
#: selection:repair.line,state:0 selection:repair.order,state:0
@@ -217,7 +244,7 @@ msgstr "ملغي"
#: code:addons/repair/models/repair.py:244
#, python-format
msgid "Cannot cancel completed repairs."
-msgstr ""
+msgstr "لا يمكن إلغاء عملية تصليح مكتملة."
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__partner_id
@@ -225,6 +252,9 @@ msgid ""
"Choose partner for whom the order will be invoiced and delivered. You can "
"find a partner by its Name, TIN, Email or Internal Reference."
msgstr ""
+"اختر الشريك الذي سيتم فوترة وتسليم أمر التصليح إليه. يمكنك إيجاد الشريك من "
+"خلال الاسم أو الرقم التعريفي لدافع الضرائب (TIN)، أو البريد الالكتروني، أو "
+"رقم الإشارة الداخلي."
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__company_id
@@ -235,7 +265,7 @@ msgstr "المؤسسة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Confirm Repair"
-msgstr "اكد على التصليح"
+msgstr "تأكيد التصليح"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
@@ -251,8 +281,8 @@ msgid ""
"Couldn't find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist."
msgstr ""
-"لا يمكن العثور على خط قائمة الأسعار مطابقة هذا المنتج وكميته.\n"
-"لديك لتغيير أي من المنتجات، وكمية أو قائمة الأسعار. "
+"لا يمكن العثور على بند قائمة أسعار مطابق لهذا المنتج والكمية.\n"
+"عليك تغيير المنتج، أو الكمية أو قائمة الأسعار."
#. module: repair
#: model:ir.actions.act_window,name:repair.act_repair_invoice
@@ -264,12 +294,12 @@ msgstr "إنشاء فاتورة"
#. module: repair
#: model:ir.model,name:repair.model_repair_order_make_invoice
msgid "Create Mass Invoice (repair)"
-msgstr ""
+msgstr "إنشاء فاتورة جماعية (للتصليح)"
#. module: repair
#: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree
msgid "Create a new reparation order"
-msgstr ""
+msgstr "إنشاء أمر تصنيع جديد"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_make_invoice
@@ -304,7 +334,7 @@ msgstr "العميل"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__default_address_id
msgid "Default Address"
-msgstr ""
+msgstr "العنوان الافتراضي"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__address_id
@@ -331,17 +361,17 @@ msgstr "مكان الوصول"
#: model:ir.model.fields,field_description:repair.field_repair_order_make_invoice__display_name
#: model:ir.model.fields,field_description:repair.field_stock_warn_insufficient_qty_repair__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_make_invoice
msgid "Do you really want to create the invoice(s)?"
-msgstr "هل تريد فعلاً إنشاء الفاتورة/الفواتبر؟"
+msgstr "هل تريد فعلًا إنشاء هذه الفواتير؟"
#. module: repair
#: selection:repair.line,state:0
msgid "Done"
-msgstr "تم"
+msgstr "منتهي"
#. module: repair
#: selection:repair.line,state:0
@@ -351,12 +381,12 @@ msgstr "مسودة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "End Repair"
-msgstr "انهي التصليح"
+msgstr "إنهاء التصليح"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__tracking
msgid "Ensure the traceability of a storable product in your warehouse."
-msgstr ""
+msgstr "تأكد من إمكانية تتبع المنتج القابل للتخزين في مخزنك."
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
@@ -386,7 +416,7 @@ msgstr "المتابعون (الشركاء)"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Future Activities"
-msgstr "الأنشطة القادمة"
+msgstr "الأنشطة المستقبلية"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
@@ -396,7 +426,7 @@ msgstr "تجميع حسب"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order_make_invoice__group
msgid "Group by partner invoice address"
-msgstr "تجميع حسب عنوان ارسال الفواتير"
+msgstr "تجميع حسب عنوان فواتير الشريك"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
@@ -416,17 +446,17 @@ msgstr "المعرف"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_unread
msgid "If checked new messages require your attention."
-msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة."
+msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها."
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_needaction
msgid "If checked, new messages require your attention."
-msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة."
+msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها."
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_has_error
msgid "If checked, some messages have a delivery error."
-msgstr "إذا تم تحديده ، فإن بعض الرسائل بها خطأ في التسليم."
+msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل."
#. module: repair
#: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree
@@ -435,15 +465,15 @@ msgid ""
" add or replace and record the time you spent on the different\n"
" operations."
msgstr ""
-"في النظام الإصلاح، يمكنك التفصيل المكونات التي تزيل،\n"
-"إضافة أو استبدال وتسجيل الوقت الذي قضيته على مختلف\n"
-"عمليات."
+"في أمر التصليح، يمكنك تفصيل المكونات التي تريد إزالتها،\n"
+" أو إضافتها أو استبدالها، كما يمكنك تسجيل الوقت المستغرق على العمليات\n"
+" المختلفة."
#. module: repair
#: code:addons/repair/models/repair.py:210
#, python-format
msgid "Insufficient Quantity"
-msgstr ""
+msgstr "كمية غير كافية"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__internal_notes
@@ -464,7 +494,7 @@ msgstr "الفاتورة"
#. module: repair
#: selection:repair.order,state:0
msgid "Invoice Exception"
-msgstr "خلل في الفاتورة"
+msgstr "خطأ في الفاتورة"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__invoice_line_id
@@ -480,7 +510,7 @@ msgstr "منهجية الفاتورة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "Invoice address:"
-msgstr "عنوان الفواتير:"
+msgstr "عنوان الفاتورة:"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -504,7 +534,7 @@ msgstr "الكمية المفوترة"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__partner_invoice_id
msgid "Invoicing Address"
-msgstr "عنوان الفواتير"
+msgstr "عنوان الفوترة"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__message_is_follower
@@ -556,7 +586,7 @@ msgstr "المكان"
#: model:ir.model.fields,field_description:repair.field_repair_line__lot_id
#: model:ir.model.fields,field_description:repair.field_repair_order__lot_id
msgid "Lot/Serial"
-msgstr "اللوط/المسلسل"
+msgstr "رقم اللوط/الرقم المسلسل"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__message_main_attachment_id
@@ -581,7 +611,7 @@ msgstr "حركة"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__move_id
msgid "Move created by the repair order"
-msgstr "تحرك تم إنشاؤه بواسطه أمر التجهيز "
+msgstr "تحرك تم إنشاؤه بواسطه أمر التصليح"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
@@ -591,12 +621,12 @@ msgstr "أنشطتي"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__activity_date_deadline
msgid "Next Activity Deadline"
-msgstr "الموعد النهائي للنشاط القادم"
+msgstr "الموعد النهائي للنشاط التالي"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__activity_summary
msgid "Next Activity Summary"
-msgstr "ملخص النشاط القادم"
+msgstr "ملخص النشاط التالي"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__activity_type_id
@@ -626,20 +656,20 @@ msgstr "لا يوجد حساب محدد للمنتج \"%s\"."
#: code:addons/repair/models/repair.py:658
#, python-format
msgid "No pricelist found."
-msgstr ""
+msgstr "لم نتمكن من إيجاد أية قوائم أسعار."
#. module: repair
#: code:addons/repair/models/repair.py:355
#, python-format
msgid "No product defined on fees."
-msgstr ""
+msgstr "لا يوجد منتج معرف للرسوم."
#. module: repair
#: code:addons/repair/models/repair.py:605
#: code:addons/repair/models/repair.py:665
#, python-format
msgid "No valid pricelist line found."
-msgstr ""
+msgstr "لم نتمكن من إيجاد أية بنود صالحة بقائمة الأسعار."
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
@@ -654,17 +684,17 @@ msgstr "عدد الإجراءات"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__message_has_error_counter
msgid "Number of error"
-msgstr "عدد الاخطاء"
+msgstr "عدد الأخطاء"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_needaction_counter
msgid "Number of messages which requires an action"
-msgstr "عدد الرسائل التي تتطلب اجراء"
+msgstr "عدد الرسائل التي تتطلب إجراء"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_has_error_counter
msgid "Number of messages with delivery error"
-msgstr "عدد الرسائل مع خطأ في التسليم"
+msgstr "عدد الرسائل الحادث بها خطأ في التسليم"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__message_unread_counter
@@ -675,7 +705,7 @@ msgstr "عدد الرسائل الجديدة"
#: code:addons/repair/models/repair.py:232
#, python-format
msgid "Only draft repairs can be confirmed."
-msgstr ""
+msgstr "لا يمكن تأكيد أوامر التصليح إلا إذا كانت في حالة المسودة."
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__fees_lines
@@ -697,7 +727,7 @@ msgstr "الشريك"
#: model:ir.model.fields,field_description:repair.field_repair_order__operations
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Parts"
-msgstr ""
+msgstr "الأجزاء"
#. module: repair
#: selection:repair.order,activity_state:0
@@ -707,22 +737,22 @@ msgstr "مخطط"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "Price"
-msgstr "سعر"
+msgstr "السعر"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__pricelist_id
msgid "Pricelist"
-msgstr "قائمه الاسعار"
+msgstr "قائمة الأسعار"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__pricelist_id
msgid "Pricelist of the selected partner."
-msgstr "لائحة الأسعار للشريك المحدد. "
+msgstr "قائمة أسعار الشريك المحدد."
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Print Quotation"
-msgstr ""
+msgstr "طباعة عرض السعر"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__product_id
@@ -747,17 +777,17 @@ msgstr "وحدة قياس المنتج"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__product_id
msgid "Product to Repair"
-msgstr "منتج مطلوب تصليحه"
+msgstr "المنتج المطلوب تصليحه"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__lot_id
msgid "Products repaired are all belonging to this lot"
-msgstr "المنتجات التى تم إصلاحها جميعهم ينتمون إلى هذا اللوت "
+msgstr "تنتمي كافة المنتجات التى تم تصليحها لرقم اللوط هذا"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_stock_warn_insufficient_qty_repair__quant_ids
msgid "Quant"
-msgstr ""
+msgstr "الكمية"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__product_uom_qty
@@ -770,22 +800,22 @@ msgstr "الكمية"
#. module: repair
#: selection:repair.order,state:0
msgid "Quotation"
-msgstr "عرض مبدئي"
+msgstr "عرض سعر"
#. module: repair
#: model:ir.actions.report,name:repair.action_report_repair_order
msgid "Quotation / Order"
-msgstr "أمر المبيعات"
+msgstr "عرض السعر/الأمر"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__quotation_notes
msgid "Quotation Notes"
-msgstr "ملاحظات عن التسعير"
+msgstr "إضافة ملاحظات عروض الأسعار"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Quotations"
-msgstr "طلب شراء مبدئي"
+msgstr "عروض الأسعار"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
@@ -811,86 +841,86 @@ msgstr "التصليح"
#. module: repair
#: model:ir.model,name:repair.model_repair_fee
msgid "Repair Fees"
-msgstr ""
+msgstr "رسوم التصليح"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Repair Line"
-msgstr "خط التصليح"
+msgstr "بند أمر التصليح"
#. module: repair
#: model:ir.model,name:repair.model_repair_line
msgid "Repair Line (parts)"
-msgstr ""
+msgstr "بند أمر التصليح (الأجزاء)"
#. module: repair
#: model:ir.model,name:repair.model_repair_order
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Repair Order"
-msgstr "امر التصليح"
+msgstr "أمر التصليح"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "Repair Order #:"
-msgstr "تعديل الطلب #:"
+msgstr "أمر التصليح رقم:"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__repair_id
#: model:ir.model.fields,field_description:repair.field_repair_line__repair_id
msgid "Repair Order Reference"
-msgstr "مرجع امر التصليح"
+msgstr "رقم إشارة أمر التصليح"
#. module: repair
#: model:ir.actions.act_window,name:repair.action_repair_order_tree
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Repair Orders"
-msgstr "اوامر التصليح"
+msgstr "أوامر التصليح"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
msgid "Repair Quotation #:"
-msgstr "تعديل التسعيرة #:"
+msgstr "عرض سعر التصليح رقم:"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__name
msgid "Repair Reference"
-msgstr "مرجع التصليح"
+msgstr "رقم إشارة التصليح"
#. module: repair
#: code:addons/repair/models/repair.py:196
#, python-format
msgid "Repair must be canceled in order to reset it to draft."
-msgstr ""
+msgstr "يجب أن يكون أمر التصليح ملغيًا لكي يُعين كمسودة."
#. module: repair
#: code:addons/repair/models/repair.py:404
#, python-format
msgid "Repair must be confirmed before starting reparation."
-msgstr ""
+msgstr "يجب تأكيد أمر التصليح قبل بدء عملية التصليح."
#. module: repair
#: code:addons/repair/models/repair.py:432
#, python-format
msgid "Repair must be repaired in order to make the product moves."
-msgstr ""
+msgstr "يجب تنفيذ أمر التصليح لتتمكن من إنشاء تحركات المنتج."
#. module: repair
#: code:addons/repair/models/repair.py:415
#, python-format
msgid "Repair must be under repair in order to end reparation."
-msgstr ""
+msgstr "يجب أن يكون أمر التصليح قيد العمل لتتمكن من إنهاءه."
#. module: repair
#: code:addons/repair/wizard/repair_cancel.py:20
#, python-format
msgid "Repair order is not invoiced."
-msgstr "لم يتم انشاء الفاتورة لامر التصليح"
+msgstr "أمر التصليح غير مفوتر."
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__repaired
#: selection:repair.order,state:0
msgid "Repaired"
-msgstr "تم اصلاحه"
+msgstr "تم تصليحه"
#. module: repair
#: model:ir.ui.menu,name:repair.menu_repair_order
@@ -901,7 +931,7 @@ msgstr "تعديلات"
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_tree
msgid "Repairs order"
-msgstr "امر التصليحات"
+msgstr "أمر التصليحات"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__activity_user_id
@@ -911,7 +941,7 @@ msgstr "المستخدم المسئول"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Search Repair Orders"
-msgstr ""
+msgstr "البحث في أوامر التصليح"
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__invoice_method
@@ -920,20 +950,20 @@ msgid ""
"invoice before or after the repair is done respectively. 'No invoice' means "
"you don't want to generate invoice for this repair order."
msgstr ""
-"اختيار 'قبل إصلاح \"أو\" بعد إصلاح \"سوف تسمح لك لتوليد فاتورة قبل أو بعد "
-"الانتهاء من إصلاح على التوالي. 'لا يوجد فاتورة' يعني أنك لا تريد أن تولد "
-"الفواتير لهذا أمر ال اصلاح . "
+"سيسمح لك اختيار 'قبل تصليح' أو 'بعد تصليح' بإنشاء فاتورة قبل أو بعد الانتهاء"
+" من التصليح. 'لا يوجد فاتورة' يعني أنك لا تريد إنشاء فواتير لأمر التصليح "
+"هذا."
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Send Quotation"
-msgstr ""
+msgstr "إرسال عرض السعر"
#. module: repair
#: code:addons/repair/models/repair.py:545
#, python-format
msgid "Serial number is required for operation line with product '%s'"
-msgstr "مطلوب رقم تسلسلي لخط العملية مع المنتج '%s'"
+msgstr "مطلوب رقم مسلسل لبند عملية المنتج '%s'"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
@@ -943,8 +973,7 @@ msgstr "تعيين كمسودة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
-"عرض كافة السجلات التي تاريخ الإجراء التالي فيها يسبق تاريخ اليوم الجاري"
+msgstr "عرض كافة السجلات المُعين لها تاريخ إجراء تالي يسبق تاريخ اليوم الجاري"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_line__location_id
@@ -954,7 +983,7 @@ msgstr "مكان المورد"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Start Repair"
-msgstr "ابدأ التصليح"
+msgstr "بدء التصليح"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_line__state
@@ -974,7 +1003,7 @@ msgstr ""
"الحالة على أساس الأنشطة\n"
"المتأخرة: تاريخ الاستحقاق مر\n"
"اليوم: تاريخ النشاط هو اليوم\n"
-"المخطط: الأنشطة المستقبلية"
+"المخطط: الأنشطة المستقبلية."
#. module: repair
#: model:ir.model,name:repair.model_stock_move
@@ -985,7 +1014,7 @@ msgstr "حركة المخزون"
#: model:ir.model.fields,field_description:repair.field_repair_fee__price_subtotal
#: model:ir.model.fields,field_description:repair.field_repair_line__price_subtotal
msgid "Subtotal"
-msgstr "المجموع"
+msgstr "الإجمالي الفرعي"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -1003,7 +1032,7 @@ msgstr "الضرائب"
#. module: repair
#: sql_constraint:repair.order:0
msgid "The name of the Repair Order must be unique!"
-msgstr "أسم أمر الاصلا لابد أن يكون فريدا .!"
+msgstr "يجب أن يكون اسم أمر التصليح فريدًا!"
#. module: repair
#: code:addons/repair/models/repair.py:172
@@ -1011,13 +1040,13 @@ msgstr "أسم أمر الاصلا لابد أن يكون فريدا .!"
msgid ""
"The product unit of measure you chose has a different category than the "
"product unit of measure."
-msgstr ""
+msgstr "فئة وحدة القياس التى اخترتها مختلفة عن وحدة قياس المنتج."
#. module: repair
#: code:addons/repair/models/repair.py:246
#, python-format
msgid "The repair order is already invoiced."
-msgstr ""
+msgstr "تمت فوترة أمر التصليح بالفعل."
#. module: repair
#: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree
@@ -1026,9 +1055,9 @@ msgid ""
" order to know if whether the repair should be invoiced to the\n"
" customer or not."
msgstr ""
-"يستخدم النظام الإصلاح تاريخ الضمان على الرقم التسلسلي\n"
-"لمعرفة ما إذا ما إذا كان ينبغي أعطى فواتير إصلاح \n"
-"للعميل أم لا."
+"تستخدم أوامر التصليح تاريخ الضمان على الرقم المسلسل\n"
+" لمعرفة ما إذا كان ينبغي إنشاء فواتير للعميل مقابل التصليح\n"
+" أم لا."
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_line__state
@@ -1036,16 +1065,17 @@ msgid ""
"The status of a repair line is set automatically to the one of the linked "
"repair order."
msgstr ""
+"تحدد حالة بند أمر التصليح تلقائيًا تبعًا لحالة أمر التصليح المرتبط به."
#. module: repair
#: model:ir.model.fields,help:repair.field_repair_order__location_id
msgid "This is the location where the product to repair is located."
-msgstr ""
+msgstr "هذا هو موقع المنتج المراد تصليحه."
#. module: repair
#: selection:repair.order,state:0
msgid "To be Invoiced"
-msgstr "ليتم عمل الفاتورة"
+msgstr "مطلوب فوترته"
#. module: repair
#: selection:repair.order,activity_state:0
@@ -1070,7 +1100,7 @@ msgstr "المبلغ الإجمالي"
#. module: repair
#: model:ir.model,name:repair.model_stock_traceability_report
msgid "Traceability Report"
-msgstr ""
+msgstr "تقرير التتبع"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__tracking
@@ -1085,7 +1115,7 @@ msgstr "النوع"
#. module: repair
#: selection:repair.order,state:0
msgid "Under Repair"
-msgstr "تحت التصليح"
+msgstr "قيد التصليح"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__price_unit
@@ -1097,7 +1127,7 @@ msgstr "سعر الوحدة"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Unit of Measure"
-msgstr "وحده القياس "
+msgstr "وحدة القياس"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__message_unread
@@ -1122,7 +1152,7 @@ msgstr "المبلغ بدون ضرائب"
#. module: repair
#: model:ir.model,name:repair.model_stock_warn_insufficient_qty_repair
msgid "Warn Insufficient Repair Quantity"
-msgstr ""
+msgstr "التحذير من كمية تصليح غير كافية"
#. module: repair
#: code:addons/repair/models/repair.py:172
@@ -1134,7 +1164,7 @@ msgstr "تحذير"
#: model:ir.model.fields,field_description:repair.field_repair_order__guarantee_limit
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Warranty Expiration"
-msgstr "انتهاء الضمان "
+msgstr "انتهاء فترة الضمان"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__website_message_ids
@@ -1159,9 +1189,11 @@ msgid ""
"You have to select a pricelist in the Repair form !\n"
" Please set one before choosing a product."
msgstr ""
+"يجب اختيار قائمة أسعار فى نموذج التصليح!\n"
+"برجاء تعيين واحدة قبل اختيار المنتج."
#. module: repair
#: code:addons/repair/models/repair.py:296
#, python-format
msgid "You have to select an invoice address in the repair form."
-msgstr ""
+msgstr "يجب اختيار عنوان للفاتورة في نموذج التصليح."
diff --git a/addons/repair/i18n/cs.po b/addons/repair/i18n/cs.po
index aeac20bbfca..c689996a030 100644
--- a/addons/repair/i18n/cs.po
+++ b/addons/repair/i18n/cs.po
@@ -797,7 +797,7 @@ msgstr ""
#. module: repair
#: model:ir.model,name:repair.model_repair_fee
msgid "Repair Fees"
-msgstr ""
+msgstr "Poplatky za opravy"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
diff --git a/addons/repair/i18n/it.po b/addons/repair/i18n/it.po
index a147a70cddb..75b00321ff2 100644
--- a/addons/repair/i18n/it.po
+++ b/addons/repair/i18n/it.po
@@ -10,8 +10,7 @@
# Lorenzo Battistini <lorenzo.battistini@agilebg.com>, 2018
# Luigi Di Naro <gigidn@gmail.com>, 2018
# Simone Bernini <simone@aperturelabs.it>, 2018
-# Giacomo Grasso <giacomo.grasso.82@gmail.com>, 2018
-# Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>, 2018
+# SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2018
# Christian <chris@effeci.info>, 2018
# Paolo Valier, 2018
# David Minneci <david@numeko.it>, 2018
@@ -681,7 +680,7 @@ msgstr "Operazioni"
#. module: repair
#: selection:repair.order,activity_state:0
msgid "Overdue"
-msgstr "Scaduto"
+msgstr "In ritardo"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
@@ -697,7 +696,7 @@ msgstr "Componenti"
#. module: repair
#: selection:repair.order,activity_state:0
msgid "Planned"
-msgstr "Pianificato"
+msgstr "Pianificata"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
@@ -967,10 +966,10 @@ msgid ""
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
-"Stato basato sulle attività:\n"
-"In ritardo: la data pianificata è scaduta\n"
-"Oggi: la data dell'attività è oggi\n"
-"Pianificata: attività future."
+"Stato basato sulle attività\n"
+"In ritardo: data di scadenza già superata\n"
+"Oggi: attività in data odierna\n"
+"Pianificato: attività future."
#. module: repair
#: model:ir.model,name:repair.model_stock_move
@@ -1048,7 +1047,7 @@ msgstr "Oggi"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Today Activities"
-msgstr "Attività di Oggi"
+msgstr "Attività odierne"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__amount_total
diff --git a/addons/repair/i18n/km.po b/addons/repair/i18n/km.po
index db1614e4c04..55632abafa3 100644
--- a/addons/repair/i18n/km.po
+++ b/addons/repair/i18n/km.po
@@ -386,7 +386,7 @@ msgstr ""
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "History"
-msgstr ""
+msgstr "ប្រវត្តិ"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_cancel__id
@@ -663,7 +663,7 @@ msgstr ""
#: model:ir.model.fields,field_description:repair.field_repair_order__fees_lines
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form
msgid "Operations"
-msgstr ""
+msgstr "ប្រតិបត្តិការ"
#. module: repair
#: selection:repair.order,activity_state:0
@@ -717,7 +717,7 @@ msgstr "ផលិតផល"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_order__product_qty
msgid "Product Quantity"
-msgstr ""
+msgstr "បរិមាណផលិតផល"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_fee__product_uom
@@ -922,7 +922,7 @@ msgstr ""
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: repair
#: model:ir.model.fields,field_description:repair.field_repair_line__location_id
@@ -959,7 +959,7 @@ msgstr ""
#: model:ir.model.fields,field_description:repair.field_repair_fee__price_subtotal
#: model:ir.model.fields,field_description:repair.field_repair_line__price_subtotal
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: repair
#: model_terms:ir.ui.view,arch_db:repair.report_repairorder
diff --git a/addons/sale/i18n/ja.po b/addons/sale/i18n/ja.po
index 68a1a75ebfd..0c006f85e25 100644
--- a/addons/sale/i18n/ja.po
+++ b/addons/sale/i18n/ja.po
@@ -1093,13 +1093,13 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_res_config_settings__use_quotation_validity_days
msgid "Default Quotation Validity"
-msgstr ""
+msgstr "デフォルト見積有効期間"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_res_company__quotation_validity_days
#: model:ir.model.fields,field_description:sale.field_res_config_settings__quotation_validity_days
msgid "Default Quotation Validity (Days)"
-msgstr ""
+msgstr "デフォルト見積有効期間(日)"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_res_config_settings__use_sale_note
@@ -3189,7 +3189,7 @@ msgstr "請求ターゲットを設定"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
msgid "Set a default validity on your quotations"
-msgstr ""
+msgstr "見積にデフォルトの有効期間を設定"
#. module: sale
#. openerp-web
@@ -4014,7 +4014,7 @@ msgstr ""
msgid ""
"You must define a product for everything you purchase,\n"
" whether it's a physical product, a consumable or services."
-msgstr ""
+msgstr "在庫管理対象、消耗品、サービスに関わらず、購買するもの全てにつきプロダクトを作成してください。"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template
diff --git a/addons/sale/i18n/km.po b/addons/sale/i18n/km.po
index 8d27ad1facd..f4dec487c6d 100644
--- a/addons/sale/i18n/km.po
+++ b/addons/sale/i18n/km.po
@@ -592,7 +592,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__analytic_line_ids
msgid "Analytic lines"
-msgstr ""
+msgstr "បន្ទាត់វិភាគ"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_onboarding_quotation_layout_form
@@ -851,12 +851,12 @@ msgstr "កំណត់ផ្លាស់ប្តូរ"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Configure a product"
-msgstr ""
+msgstr "កំណត់ផលិតផល"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_open_sale_onboarding_quotation_layout
msgid "Configure your document layout"
-msgstr ""
+msgstr "កំណត់ប្លង់ឯកសាររបស់អ្នក"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
@@ -1008,7 +1008,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,help:sale.field_sale_order__access_url
msgid "Customer Portal URL"
-msgstr ""
+msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__client_order_ref
@@ -1018,7 +1018,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_taxes_id
msgid "Customer Taxes"
-msgstr ""
+msgstr "ពន្ធអតិថិជន"
#. module: sale
#: model:ir.ui.menu,name:sale.res_partner_menu
@@ -1035,7 +1035,7 @@ msgstr ""
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.onboarding_quotation_layout_step
msgid "Customize"
-msgstr ""
+msgstr "អតិថិជន"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.onboarding_quotation_layout_step
@@ -1505,7 +1505,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_account_id
msgid "Income Account"
-msgstr ""
+msgstr "គណនីចំណូល"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
@@ -1569,7 +1569,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_lines
msgid "Invoice Lines"
-msgstr ""
+msgstr "វិកយបត្រខែ្ស"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_view_sale_advance_payment_inv
@@ -1585,7 +1585,7 @@ msgstr ""
#: model:ir.model.fields,field_description:sale.field_sale_order__invoice_status
#: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_status
msgid "Invoice Status"
-msgstr ""
+msgstr "ស្ថានភាពវិក័យប័ត្រ"
#. module: sale
#: model:ir.model.fields,help:sale.field_sale_order__partner_invoice_id
@@ -1650,12 +1650,12 @@ msgstr "វិកិយប័ត្រ"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_account_invoice_report_salesteam
msgid "Invoices Analysis"
-msgstr ""
+msgstr "វិភាគវិក័យប័ត្រ"
#. module: sale
#: model:ir.model,name:sale.model_account_invoice_report
msgid "Invoices Statistics"
-msgstr ""
+msgstr "ស្ថិតិវិក្កយបត្រ"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_sale_advance_payment_inv
@@ -1676,7 +1676,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_product_template__invoice_policy
@@ -1812,7 +1812,7 @@ msgstr ""
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Lock"
-msgstr ""
+msgstr "ចាក់សោរ"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_res_config_settings__auto_done_setting
@@ -2376,12 +2376,12 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__reference
msgid "Payment Ref."
-msgstr ""
+msgstr "សេចក្ដីយោងការបង់ប្រាក់"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__payment_term_id
msgid "Payment Terms"
-msgstr ""
+msgstr "លក្ខ័ណការទូទាត់"
#. module: sale
#: model:ir.model,name:sale.model_payment_transaction
@@ -2425,7 +2425,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__access_url
msgid "Portal Access URL"
-msgstr ""
+msgstr "URL ចូលដំណើរការវិបផតថល"
#. module: sale
#: selection:sale.report,state:0
@@ -2440,7 +2440,7 @@ msgstr ""
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Preview"
-msgstr ""
+msgstr "ពីមុន"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.product_configurator_configure_optional_products
@@ -2572,7 +2572,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_report_all_channels_sales__product_qty
msgid "Product Quantity"
-msgstr ""
+msgstr "បរិមាណផលិតផល"
#. module: sale
#: model:ir.model,name:sale.model_product_template
@@ -2655,7 +2655,7 @@ msgstr "ចំនួន"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_order_form
msgid "Quantity:"
-msgstr ""
+msgstr "បរិមាណ:"
#. module: sale
#: code:addons/sale/models/sale.py:262
@@ -2903,7 +2903,7 @@ msgstr ""
#. module: sale
#: model:ir.model,name:sale.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: sale
#: selection:sale.report,state:0
@@ -3000,7 +3000,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale.view_order_product_search
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: sale
#: model:ir.ui.menu,name:sale.report_sales_team
@@ -3229,7 +3229,7 @@ msgstr ""
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
@@ -3363,7 +3363,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order_line__price_subtotal
msgid "Subtotal"
-msgstr ""
+msgstr "សរុប"
#. module: sale
#: model:ir.model.fields,help:sale.field_crm_team__invoiced_target
@@ -3375,7 +3375,7 @@ msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__amount_by_group
msgid "Tax amount by group"
-msgstr ""
+msgstr "ចំនួនពន្ធតាមក្រុម"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_order__amount_tax
diff --git a/addons/sale/i18n/vi.po b/addons/sale/i18n/vi.po
index 51c06ce54b2..a9046eef3ea 100644
--- a/addons/sale/i18n/vi.po
+++ b/addons/sale/i18n/vi.po
@@ -3459,7 +3459,7 @@ msgstr "Các thuế được dùng cho các khoản đặt cọc"
#. module: sale
#: model:ir.model.fields,help:sale.field_sale_order_line__display_type
msgid "Technical field for UX purpose."
-msgstr ""
+msgstr "Trường kỹ thuật cho mục đích UX."
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index 35df22a57af..70c9c036092 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -214,7 +214,10 @@ class SaleOrder(models.Model):
if not order.company_id:
order.currency_rate = order.currency_id.with_context(date=order.date_order).rate or 1.0
continue
- order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order)
+ elif order.company_id.currency_id and order.currency_id: # the following crashes if any one is undefined
+ order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order)
+ else:
+ order.currency_rate = 1.0
def _compute_access_url(self):
super(SaleOrder, self)._compute_access_url()
diff --git a/addons/sale/security/sale_security.xml b/addons/sale/security/sale_security.xml
index 44fe53fa1e8..5a0ff95b13c 100644
--- a/addons/sale/security/sale_security.xml
+++ b/addons/sale/security/sale_security.xml
@@ -59,6 +59,21 @@
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
+ <!-- Payments -->
+ <record id="payment_transaction_salesman_rule" model="ir.rule">
+ <field name="name">Access every payment transaction</field>
+ <field name="model_id" ref="payment.model_payment_transaction"/>
+ <field name="domain_force">[(1, '=', 1)]</field>
+ <field name="groups" eval="[(4, ref('sales_team.group_sale_salesman'))]"/>
+ </record>
+
+ <record id="payment_token_salesman_rule" model="ir.rule">
+ <field name="name">Access every payment token</field>
+ <field name="model_id" ref="payment.model_payment_token"/>
+ <field name="domain_force">[(1, '=', 1)]</field>
+ <field name="groups" eval="[(4, ref('sales_team.group_sale_salesman'))]"/>
+ </record>
+
<!-- Portal Access Rules -->
<record id="sale_order_rule_portal" model="ir.rule">
<field name="name">Portal Personal Quotations/Sales Orders</field>
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index 37347617ecb..73d5e0b63d7 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -18,7 +18,7 @@ class SaleAdvancePaymentInv(models.TransientModel):
@api.model
def _default_product_id(self):
product_id = self.env['ir.config_parameter'].sudo().get_param('sale.default_deposit_product_id')
- return self.env['product.product'].browse(int(product_id))
+ return self.env['product.product'].browse(int(product_id)).exists()
@api.model
def _default_deposit_account_id(self):
diff --git a/addons/sale_crm/i18n/km.po b/addons/sale_crm/i18n/km.po
index 8041a4dffd4..d03da4e97a8 100644
--- a/addons/sale_crm/i18n/km.po
+++ b/addons/sale_crm/i18n/km.po
@@ -120,7 +120,7 @@ msgstr ""
#. module: sale_crm
#: model:ir.model,name:sale_crm.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: sale_crm
#: model:ir.model.fields,field_description:sale_crm.field_account_invoice__source_id
diff --git a/addons/sale_expense/i18n/km.po b/addons/sale_expense/i18n/km.po
index 499529764f7..17b4242965b 100644
--- a/addons/sale_expense/i18n/km.po
+++ b/addons/sale_expense/i18n/km.po
@@ -50,7 +50,7 @@ msgstr ""
#. module: sale_expense
#: model_terms:ir.ui.view,arch_db:sale_expense.product_product_view_form_inherit_sale_expense
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: sale_expense
#: model:ir.model,name:sale_expense.model_sale_order
diff --git a/addons/sale_management/i18n/ar.po b/addons/sale_management/i18n/ar.po
index 8eb1509c2be..6ace68b5b06 100644
--- a/addons/sale_management/i18n/ar.po
+++ b/addons/sale_management/i18n/ar.po
@@ -5,13 +5,12 @@
# Translators:
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018
+# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
-# AMAAL RU <Fabu1410@yahoo.com>, 2018
# Zuhair Hammadi <zuhair12@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Martin Trigaux, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
-# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
# Osoul <baruni@osoul.ly>, 2018
# Mustafa Rawi <mustafa@cubexco.com>, 2018
@@ -39,7 +38,7 @@ msgstr "% خصم"
#. module: sale_management
#: model:sale.order.template.line,name:sale_management.sale_order_template_line_1
msgid "4 Person Desk"
-msgstr ""
+msgstr "مكتب لأربعة أشخاص"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form
@@ -57,7 +56,7 @@ msgstr "<span>الخصم</span>"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.report_saleorder_document_inherit_sale_management
msgid "<span>Optional Products</span>"
-msgstr ""
+msgstr "<span>منتجات اختيارية</span>"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__active
@@ -67,7 +66,7 @@ msgstr "نشط"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
msgid "Add a note"
-msgstr "أضف ملاحظة"
+msgstr "إضافة ملاحظة"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote
@@ -83,22 +82,22 @@ msgstr "إضافة قسم"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management
msgid "Add one"
-msgstr ""
+msgstr "إضافة واحدة"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management
msgid "Add to cart"
-msgstr ""
+msgstr "أضف إلى عربة التسوق"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote
msgid "Add to order lines"
-msgstr ""
+msgstr "إضافته لبنود الأمر"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_digest_digest__kpi_all_sale_total
msgid "All Sales"
-msgstr ""
+msgstr "كافة المبيعات"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_search
@@ -108,12 +107,12 @@ msgstr "مؤرشف"
#. module: sale_management
#: model:ir.ui.menu,name:sale_management.menu_catalog_variants_action
msgid "Attribute Values"
-msgstr "قيم الصفات"
+msgstr "قيم الخاصية"
#. module: sale_management
#: model:ir.ui.menu,name:sale_management.menu_product_attribute_action
msgid "Attributes"
-msgstr "الصفات"
+msgstr "الخصائص"
#. module: sale_management
#: model:ir.model,name:sale_management.model_res_config_settings
@@ -128,7 +127,7 @@ msgstr "تأكيد"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__mail_template_id
msgid "Confirmation Mail"
-msgstr ""
+msgstr "رسالة التأكيد"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_view_form
@@ -138,12 +137,12 @@ msgstr "إنشاء فاتورة"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form
msgid "Create standardized offers with default products"
-msgstr ""
+msgstr "إنشاء عروض قياسية بالمنتجات الافتراضية"
#. module: sale_management
#: model_terms:ir.actions.act_window,help:sale_management.sale_order_template_action
msgid "Create your quotation template"
-msgstr ""
+msgstr "إنشاء قالب عرض السعر"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__create_uid
@@ -164,7 +163,7 @@ msgstr "أنشئ في"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_res_config_settings__default_sale_order_template_id
msgid "Default Template"
-msgstr ""
+msgstr "القالب الافتراضي"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__name
@@ -179,6 +178,8 @@ msgstr "الوصف"
#: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form
msgid "Design your quotation templates using building blocks<br/>"
msgstr ""
+"تصميم قوالب عروض أسعارك باستخدام بلوكات البناء<br/>\n"
+" <em attrs=\"{'invisible': [('module_sale_quotation_builder','=',False)]}\">تحذير: هذا الخيار سيثبت تطبيق الموقع.</em>"
#. module: sale_management
#: model:ir.model,name:sale_management.model_digest_digest
@@ -198,7 +199,7 @@ msgstr "الخصم (%)"
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__display_name
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__display_type
@@ -216,17 +217,17 @@ msgstr ""
msgid ""
"Forbidden product, unit price, quantity, and UoM on non-accountable sale "
"quote line"
-msgstr ""
+msgstr "المنتج أو سعر الوحدة أو الكمية أو وحدة القياس محظور في بند غير مقبول."
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_option__sequence
msgid "Gives the sequence order when displaying a list of optional products."
-msgstr ""
+msgstr "يعرض ترتيب التسلسل عند عرض قائمة المنتجات الاختيارية."
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template_line__sequence
msgid "Gives the sequence order when displaying a list of sale quote lines."
-msgstr ""
+msgstr "يعرض ترتيب التسلسل عند عرض قائمة بنود عروض أسعار المبيعات."
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__id
@@ -241,12 +242,12 @@ msgstr "المعرف"
msgid ""
"If unchecked, it will allow you to hide the quotation template without "
"removing it."
-msgstr ""
+msgstr "عند إلغاء اختياره، يمكنك إخفاء قالب عرض السعر دون حذفه."
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_digest_digest__kpi_all_sale_total_value
msgid "Kpi All Sale Total Value"
-msgstr ""
+msgstr "القيمة الإجمالية للمؤشر الرئيسي لكافة المبيعات"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option____last_update
@@ -286,7 +287,7 @@ msgstr "البنود"
#. module: sale_management
#: sql_constraint:sale.order.template.line:0
msgid "Missing required product and UoM on accountable sale quote line."
-msgstr ""
+msgstr "المنتج ووحدة القياس فارغين في بند أمر بيع سيتم إنشاء فاتورة له."
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
@@ -297,12 +298,12 @@ msgstr "ملاحظة"
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template__number_of_days
msgid "Number of days for the validity date computation of the quotation"
-msgstr ""
+msgstr "عدد أيام احتساب تاريخ الصلاحية لعرض الأسعار"
#. module: sale_management
#: model:sale.order.template.option,name:sale_management.sale_order_template_option_1
msgid "Office Chair"
-msgstr ""
+msgstr "كرسي مكتب"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__require_payment
@@ -312,7 +313,7 @@ msgstr "السداد عبر الإنترنت"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__require_signature
msgid "Online Signature"
-msgstr ""
+msgstr "التوقيع الإلكتروني"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__sale_order_template_option_ids
@@ -356,12 +357,12 @@ msgstr "الكمية"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_res_config_settings__module_sale_quotation_builder
msgid "Quotation Builder"
-msgstr ""
+msgstr "مكوّن عرض السعر"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__number_of_days
msgid "Quotation Duration"
-msgstr ""
+msgstr "مدة عرض السعر"
#. module: sale_management
#: model:ir.model,name:sale_management.model_sale_order_template
@@ -375,23 +376,23 @@ msgstr "قالب عرض السعر"
#. module: sale_management
#: model:ir.model,name:sale_management.model_sale_order_template_line
msgid "Quotation Template Line"
-msgstr ""
+msgstr "بند قالب عرض السعر"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
msgid "Quotation Template Lines"
-msgstr "بنود قالب العرض"
+msgstr "بنود قالب عرض السعر"
#. module: sale_management
#: model:ir.model,name:sale_management.model_sale_order_template_option
msgid "Quotation Template Option"
-msgstr ""
+msgstr "خيار قالب عرض السعر"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__sale_order_template_id
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__sale_order_template_id
msgid "Quotation Template Reference"
-msgstr ""
+msgstr "رقم إشارة قالب عرض السعر"
#. module: sale_management
#: model:ir.actions.act_window,name:sale_management.sale_order_template_action
@@ -400,12 +401,12 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form
#: model:res.groups,name:sale_management.group_sale_order_template
msgid "Quotation Templates"
-msgstr "قوالب العرض"
+msgstr "قوالب عرض السعر"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
msgid "Quotation expires after"
-msgstr ""
+msgstr "تنتهي صلاحية عرض السعر بعد"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management
@@ -415,21 +416,21 @@ msgstr "إزالة"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management
msgid "Remove one"
-msgstr ""
+msgstr "إزالة واحدة"
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template__require_signature
msgid ""
"Request a online signature to the customer in order to confirm orders "
"automatically."
-msgstr ""
+msgstr "طلب توقيع العميل إلكترونيًا لتأكيد الأوامر تلقائيًا."
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template__require_payment
msgid ""
"Request an online payment to the customer in order to confirm orders "
"automatically."
-msgstr ""
+msgstr "طلب تسديد العميل للمستحقات إلكترونيًا لتأكيد الأوامر تلقائيًا."
#. module: sale_management
#: model:ir.model,name:sale_management.model_sale_order_option
@@ -449,22 +450,22 @@ msgstr "المبيعات"
#. module: sale_management
#: model:ir.model,name:sale_management.model_sale_order_line
msgid "Sales Order Line"
-msgstr "سطر أمر المبيعات"
+msgstr "بند أمر المبيعات"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__order_id
msgid "Sales Order Reference"
-msgstr ""
+msgstr "رقم إشارة أمر المبيعات"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote
msgid "Sales Quotation Template Lines"
-msgstr ""
+msgstr "بنود قالب عرض سعر المبيعات"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_search
msgid "Search Quotation Template"
-msgstr ""
+msgstr "البحث في قوالب عروض الأسعار"
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
@@ -481,7 +482,7 @@ msgstr "التسلسل"
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template_line__display_type
msgid "Technical field for UX purpose."
-msgstr "حقل تقني لهدف خبرة المستخدم"
+msgstr "حقل تقني يهدف لتحسين تجربة المستخدم."
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__note
@@ -494,6 +495,8 @@ msgid ""
"The Administrator can set default Terms & Conditions in Sales Settings. "
"Terms set here will show up instead if you select this quotation template."
msgstr ""
+"يمكن للمسؤول تعيين الشروط والأحكام الافتراضية في إعدادات المبيعات. ستظهر "
+"الشروط المعينة هنا بدلًا منها إذا اخترت قالب عرض الأسعار هذا."
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template__mail_template_id
@@ -501,6 +504,8 @@ msgid ""
"This e-mail template will be sent on confirmation. Leave empty to send "
"nothing."
msgstr ""
+"سيتم إرسال هذا القالب البريدي عند التأكيد. اتركه خاليًا لكي لا يتم إرسال "
+"شيء."
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__price_unit
@@ -513,13 +518,13 @@ msgstr "سعر الوحدة"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__product_uom_id
msgid "Unit of Measure"
-msgstr "وحده القياس "
+msgstr "وحدة القياس"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__uom_id
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__uom_id
msgid "Unit of Measure "
-msgstr "وحدة قياس "
+msgstr "وحده القياس "
#. module: sale_management
#: model_terms:ir.actions.act_window,help:sale_management.sale_order_template_action
@@ -528,12 +533,15 @@ msgid ""
" Send these quotes by email and let your customers sign online.\n"
" Use cross-selling and discounts to push and boost your sales."
msgstr ""
+"استخدم القوالب لإنشاء عروض أسعار احترافية منقحة في دقائق.\n"
+" يمكنك إرسال عروض الأسعار عن طريق البريد الكتروني والسماح للعملاء بتسجيل الدخول عبر الإنترنت.\n"
+" استخدم نظام البيع المتقاطع والخصومات لدفع وتحسين مبيعاتك."
#. module: sale_management
#: code:addons/sale_management/models/sale_order.py:178
#, python-format
msgid "You cannot add options to a confirmed order."
-msgstr "لايمكن اضافه خيارات لامر موكد"
+msgstr "لا يمكنك إضافة خيارات لأمر مؤكد."
#. module: sale_management
#: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form
diff --git a/addons/sale_management/i18n/vi.po b/addons/sale_management/i18n/vi.po
index fa63f042566..556a45d0288 100644
--- a/addons/sale_management/i18n/vi.po
+++ b/addons/sale_management/i18n/vi.po
@@ -176,7 +176,7 @@ msgstr ""
#. module: sale_management
#: model:ir.model,name:sale_management.model_digest_digest
msgid "Digest"
-msgstr ""
+msgstr "Tiêu"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_option__discount
@@ -349,7 +349,7 @@ msgstr "Số lượng"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_res_config_settings__module_sale_quotation_builder
msgid "Quotation Builder"
-msgstr ""
+msgstr "Xây dựng báo giá"
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__number_of_days
@@ -474,7 +474,7 @@ msgstr "Trình tự"
#. module: sale_management
#: model:ir.model.fields,help:sale_management.field_sale_order_template_line__display_type
msgid "Technical field for UX purpose."
-msgstr ""
+msgstr "Trường kỹ thuật cho mục đích UX."
#. module: sale_management
#: model:ir.model.fields,field_description:sale_management.field_sale_order_template__note
diff --git a/addons/sale_management/models/sale_order.py b/addons/sale_management/models/sale_order.py
index 0db13c893ac..0ebda656e29 100644
--- a/addons/sale_management/models/sale_order.py
+++ b/addons/sale_management/models/sale_order.py
@@ -79,7 +79,11 @@ class SaleOrder(models.Model):
price = self.pricelist_id.with_context(uom=line.product_uom_id.id).get_product_price(line.product_id, 1, False)
if self.pricelist_id.discount_policy == 'without_discount' and line.price_unit:
discount = (line.price_unit - price) / line.price_unit * 100
- price = line.price_unit
+ # negative discounts (= surcharge) are included in the display price
+ if discount < 0:
+ discount = 0
+ else:
+ price = line.price_unit
else:
price = line.price_unit
diff --git a/addons/sale_management/views/sale_order_template_views.xml b/addons/sale_management/views/sale_order_template_views.xml
index 8df464d2805..290c604d9ec 100644
--- a/addons/sale_management/views/sale_order_template_views.xml
+++ b/addons/sale_management/views/sale_order_template_views.xml
@@ -55,7 +55,7 @@
<div>
<field name="product_uom_qty" class="oe_inline"/>
</div>
- <field name="price_unit" invisible="1"/>
+ <field name="price_unit"/>
<label for="discount" groups="sale.group_discount_per_so_line"/>
<div groups="sale.group_discount_per_so_line">
<field name="discount" class="oe_inline"/> %%
@@ -93,7 +93,7 @@
attrs="{'required': [('display_type', '=', False)]}"
/>
<field name="discount" groups="sale.group_discount_per_so_line"/>
- <field name="price_unit" invisible="1"/>
+ <field name="price_unit"/>
</tree>
</field>
</page>
@@ -105,7 +105,7 @@
<field name="quantity"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="uom_id" groups="uom.group_uom"/>
- <field name="price_unit" invisible="1"/>
+ <field name="price_unit"/>
<field name="discount" groups="sale.group_discount_per_so_line"/>
</tree>
</field>
diff --git a/addons/sale_quotation_builder/i18n/cs.po b/addons/sale_quotation_builder/i18n/cs.po
index f1cdbc51e90..bdb66656562 100644
--- a/addons/sale_quotation_builder/i18n/cs.po
+++ b/addons/sale_quotation_builder/i18n/cs.po
@@ -109,7 +109,7 @@ msgstr "Volitelný produkt:"
#. module: sale_quotation_builder
#: model_terms:sale.order.template,website_description:sale_quotation_builder.sale_order_template_default
msgid "Our Offer"
-msgstr ""
+msgstr "Naše nabídka"
#. module: sale_quotation_builder
#: model_terms:sale.order.template,website_description:sale_quotation_builder.sale_order_template_default
diff --git a/addons/sale_stock/i18n/cs.po b/addons/sale_stock/i18n/cs.po
index a322ab65e9a..932b6f253c8 100644
--- a/addons/sale_stock/i18n/cs.po
+++ b/addons/sale_stock/i18n/cs.po
@@ -102,6 +102,11 @@ msgid ""
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
" - Stock Moves: the quantity comes from confirmed pickings\n"
msgstr ""
+"Podle konfigurace produktu může být dodané množství automaticky vypočítáno pomocí mechanismu:\n"
+"- Ruční: množství je nastaveno ručně na lince\n"
+"- Analytické z nákladů: množství je množství z účtovaných nákladů\n"
+"- Časový rozvrh: množství je součtem hodin zaznamenaných na úkolech spojených s touto prodejní linkou\n"
+"- Skladové pohyby: množství pochází z potvrzených vychystávání\n"
#. module: sale_stock
#: model:ir.ui.menu,name:sale_stock.menu_aftersale
diff --git a/addons/sale_stock/i18n/km.po b/addons/sale_stock/i18n/km.po
index f524f4bbbaa..248c9a4396e 100644
--- a/addons/sale_stock/i18n/km.po
+++ b/addons/sale_stock/i18n/km.po
@@ -248,7 +248,7 @@ msgstr ""
#. module: sale_stock
#: model:ir.ui.menu,name:sale_stock.menu_invoiced
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: sale_stock
#: model:ir.model,name:sale_stock.model_stock_production_lot
diff --git a/addons/sale_timesheet/i18n/cs.po b/addons/sale_timesheet/i18n/cs.po
index da937dc9431..294d203ce97 100644
--- a/addons/sale_timesheet/i18n/cs.po
+++ b/addons/sale_timesheet/i18n/cs.po
@@ -86,6 +86,11 @@ msgid ""
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
" - Stock Moves: the quantity comes from confirmed pickings\n"
msgstr ""
+"Podle konfigurace produktu může být dodané množství automaticky vypočítáno pomocí mechanismu:\n"
+"- Ruční: množství je nastaveno ručně na lince\n"
+"- Analytické z nákladů: množství je množství z účtovaných nákladů\n"
+"- Časový rozvrh: množství je součtem hodin zaznamenaných na úkolech spojených s touto prodejní linkou\n"
+"- Skladové pohyby: množství pochází z potvrzených vychystávání\n"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__amount_to_invoice
diff --git a/addons/sale_timesheet/i18n/km.po b/addons/sale_timesheet/i18n/km.po
index ce0e94e6506..724518f367e 100644
--- a/addons/sale_timesheet/i18n/km.po
+++ b/addons/sale_timesheet/i18n/km.po
@@ -115,7 +115,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__analytic_line_ids
msgid "Analytic lines"
-msgstr ""
+msgstr "បន្ទាត់វិភាគ"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_assign_so_line_view_form
@@ -211,7 +211,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Billing"
-msgstr ""
+msgstr "ការចេញវិក្កយបត្រ"
#. module: sale_timesheet
#: model:ir.filters,name:sale_timesheet.timesheet_filter_billing
@@ -480,7 +480,7 @@ msgstr "វិកិយប័ត្រ"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__is_project_map_empty
diff --git a/addons/sales_team/i18n/km.po b/addons/sales_team/i18n/km.po
index 0708a92f69e..7d854e23182 100644
--- a/addons/sales_team/i18n/km.po
+++ b/addons/sales_team/i18n/km.po
@@ -322,7 +322,7 @@ msgstr "ខែ"
#. module: sales_team
#: model_terms:ir.ui.view,arch_db:sales_team.crm_team_salesteams_search
msgid "My Favorites"
-msgstr ""
+msgstr "ចំណូលចិត្តរបស់ខ្ថុំ"
#. module: sales_team
#: code:addons/sales_team/models/crm_team.py:260
@@ -378,7 +378,7 @@ msgstr ""
#. module: sales_team
#: model:ir.model,name:sales_team.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: sales_team
#: model:ir.model.fields,field_description:sales_team.field_crm_team__name
@@ -386,7 +386,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sales_team.crm_team_view_form
#: model_terms:ir.ui.view,arch_db:sales_team.crm_team_view_tree
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_res_users__sale_team_id
diff --git a/addons/sms/i18n/km.po b/addons/sms/i18n/km.po
index 39fd653aa91..0a4fc14bc8d 100644
--- a/addons/sms/i18n/km.po
+++ b/addons/sms/i18n/km.po
@@ -104,7 +104,7 @@ msgstr ""
#. module: sms
#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients
msgid "Recipients"
-msgstr ""
+msgstr "អ្នកទទួល"
#. module: sms
#: model:ir.model,name:sms.model_sms_api
diff --git a/addons/snailmail_account/tests/test_pingen_send.py b/addons/snailmail_account/tests/test_pingen_send.py
index 3da39214358..5f2bf0b55e1 100644
--- a/addons/snailmail_account/tests/test_pingen_send.py
+++ b/addons/snailmail_account/tests/test_pingen_send.py
@@ -33,34 +33,15 @@ class TestPingenSend(AccountingTestCase):
def create_invoice(self):
""" Create a sample invoice """
- currency = self.env.ref('base.EUR')
- partner_agrolait = self.env.ref("base.res_partner_2")
- product = self.env.ref("product.product_product_4")
-
- account_receivable = self.env['account.account'].create({
- 'code': 'TESTPINGEN1',
- 'name': 'Test Receivable Account',
- 'user_type_id': self.env.ref('account.data_account_type_receivable').id,
- 'reconcile': True
- })
- account_income = self.env['account.account'].create({
- 'code': 'TESTPINGEN2',
- 'name': 'Test Account',
- 'user_type_id': self.env.ref('account.data_account_type_direct_costs').id
- })
-
invoice = self.env['account.move'].with_context(default_type='out_invoice').create({
'type': 'out_invoice',
- 'partner_id': partner_agrolait.id,
- 'currency_id': currency.id,
- 'name': 'invoice to client',
- 'account_id': account_receivable.id,
+ 'partner_id': self.env.ref("base.res_partner_2").id,
+ 'currency_id': self.env.ref('base.EUR').id,
'invoice_date': '2018-12-11',
'invoice_line_ids': [(0, 0, {
- 'product_id': product.id,
+ 'product_id': self.env.ref("product.product_product_4").id,
'quantity': 1,
'price_unit': 42,
- 'account_id': account_income.id,
})],
})
diff --git a/addons/social_media/i18n/ar.po b/addons/social_media/i18n/ar.po
index de6837bba88..3fcb9738e2e 100644
--- a/addons/social_media/i18n/ar.po
+++ b/addons/social_media/i18n/ar.po
@@ -3,16 +3,17 @@
# * social_media
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Osoul <baruni@osoul.ly>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
-"PO-Revision-Date: 2018-09-18 09:49+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:25+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -43,7 +44,7 @@ msgstr "حساب جوجل+"
#. module: social_media
#: model:ir.model.fields,field_description:social_media.field_res_company__social_instagram
msgid "Instagram Account"
-msgstr ""
+msgstr "حساب إنستجرام"
#. module: social_media
#: model:ir.model.fields,field_description:social_media.field_res_company__social_linkedin
diff --git a/addons/stock/i18n/km.po b/addons/stock/i18n/km.po
index 2a5581957a9..bd27f884d71 100644
--- a/addons/stock/i18n/km.po
+++ b/addons/stock/i18n/km.po
@@ -500,7 +500,7 @@ msgstr ""
#. module: stock
#: model_terms:ir.ui.view,arch_db:stock.view_stock_rule_form
msgid "Applicability"
-msgstr ""
+msgstr "ការអនុវត្ត"
#. module: stock
#: model_terms:ir.ui.view,arch_db:stock.stock_location_route_form_view
@@ -2836,7 +2836,7 @@ msgstr ""
#. module: stock
#: model_terms:ir.ui.view,arch_db:stock.view_picking_form
msgid "Lock"
-msgstr ""
+msgstr "ចាក់សោរ"
#. module: stock
#: model_terms:ir.ui.view,arch_db:stock.product_category_form_view_inherit
@@ -3112,7 +3112,7 @@ msgstr ""
#: model:ir.model.fields,field_description:stock.field_stock_package_destination__move_line_ids
#: model:ir.model.fields,field_description:stock.field_stock_package_level__move_line_ids
msgid "Move Line"
-msgstr ""
+msgstr "ផ្លាស់ទីបន្ទាត់"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__move_line_nosuggest_ids
@@ -3457,7 +3457,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:stock.view_picking_form
#: model_terms:ir.ui.view,arch_db:stock.view_template_property_form
msgid "Operations"
-msgstr ""
+msgstr "ប្រតិបត្តិការ"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_type_list
@@ -5088,7 +5088,7 @@ msgstr ""
#. module: stock
#: model_terms:ir.ui.view,arch_db:stock.view_picking_internal_search
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_rules_report__warehouse_ids
diff --git a/addons/stock/i18n/sk.po b/addons/stock/i18n/sk.po
index 299e58cc425..b5ba7bd1240 100644
--- a/addons/stock/i18n/sk.po
+++ b/addons/stock/i18n/sk.po
@@ -2315,7 +2315,7 @@ msgstr "Spracováva sa"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_warehouse__in_type_id
msgid "In Type"
-msgstr "V Type"
+msgstr "Typ vstupu"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_inventory__exhausted
@@ -3896,7 +3896,7 @@ msgstr "Vybrať"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_warehouse__pick_type_id
msgid "Pick Type"
-msgstr "Vybrať typ"
+msgstr "Typ výberu"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_overprocessed_transfer__picking_id
diff --git a/addons/stock/i18n/vi.po b/addons/stock/i18n/vi.po
index aa52e40e661..5517846c353 100644
--- a/addons/stock/i18n/vi.po
+++ b/addons/stock/i18n/vi.po
@@ -3911,7 +3911,7 @@ msgstr "Địa điểm Cha"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_location__parent_path
msgid "Parent Path"
-msgstr ""
+msgstr "Parent Path"
#. module: stock
#: selection:procurement.group,move_type:0
diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py
index 2c5e895677a..0d01952915b 100644
--- a/addons/stock/models/product.py
+++ b/addons/stock/models/product.py
@@ -182,10 +182,23 @@ class Product(models.Model):
company_id = self.env.company.id
return (
[('location_id.company_id', '=', company_id), ('location_id.usage', 'in', ['internal', 'transit'])],
- [('location_id.company_id', '=', False), ('location_dest_id.company_id', '=', company_id)],
- [('location_id.company_id', '=', company_id), ('location_dest_id.company_id', '=', False),
- ])
-
+ ['&',
+ ('location_dest_id.company_id', '=', company_id),
+ '|',
+ ('location_id.company_id', '=', False),
+ '&',
+ ('location_id.usage', 'in', ['inventory', 'production']),
+ ('location_id.company_id', '=', company_id),
+ ],
+ ['&',
+ ('location_id.company_id', '=', company_id),
+ '|',
+ ('location_dest_id.company_id', '=', False),
+ '&',
+ ('location_dest_id.usage', 'in', ['inventory', 'production']),
+ ('location_dest_id.company_id', '=', company_id),
+ ]
+ )
def _search_ids(model, values, force_company_id):
ids = set()
domain = []
@@ -410,6 +423,7 @@ class Product(models.Model):
action['context'] = {'default_product_id': self.id}
return action
+ # Be aware that the exact same function exists in product.template
def action_open_quants(self):
location_domain = self._get_domain_locations()[0]
domain = expression.AND([[('product_id', 'in', self.ids)], location_domain])
@@ -644,6 +658,7 @@ class ProductTemplate(models.Model):
raise UserError(_("You can not change the type of a product that is currently reserved on a stock move. If you need to change the type, you should first unreserve the stock move."))
return super(ProductTemplate, self).write(vals)
+ # Be aware that the exact same function exists in product.product
def action_open_quants(self):
return self.product_variant_ids.action_open_quants()
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py
index f71c6c29494..421a3067553 100644
--- a/addons/stock/models/stock_move.py
+++ b/addons/stock/models/stock_move.py
@@ -1123,7 +1123,7 @@ class StockMove(models.Model):
self.mapped('picking_id')._check_entire_pack()
def _action_cancel(self):
- if any(move.state == 'done' for move in self):
+ if any(move.state == 'done' and not move.scrapped for move in self):
raise UserError(_('You cannot cancel a stock move that has been set to \'Done\'.'))
moves_to_cancel = self.filtered(lambda m: m.state != 'cancel')
# self cannot contain moves that are either cancelled or done, therefore we can safely
@@ -1145,6 +1145,7 @@ class StockMove(models.Model):
def _prepare_extra_move_vals(self, qty):
vals = {
+ 'procure_method': 'make_to_stock',
'origin_returned_move_id': self.origin_returned_move_id.id,
'product_uom_qty': qty,
'picking_id': self.picking_id.id,
@@ -1171,13 +1172,17 @@ class StockMove(models.Model):
rounding_method='HALF-UP')
extra_move_vals = self._prepare_extra_move_vals(extra_move_quantity)
extra_move = self.copy(default=extra_move_vals)
- if extra_move.picking_id:
+
+ merge_into_self = all(self[field] == extra_move[field] for field in self._prepare_merge_moves_distinct_fields())
+
+ if merge_into_self and extra_move.picking_id:
extra_move = extra_move._action_confirm(merge_into=self)
+ return extra_move
else:
extra_move = extra_move._action_confirm()
# link it to some move lines. We don't need to do it for move since they should be merged.
- if self.exists() and not self.picking_id:
+ if not merge_into_self:
for move_line in self.move_line_ids.filtered(lambda ml: ml.qty_done):
if float_compare(move_line.qty_done, extra_move_quantity, precision_rounding=rounding) <= 0:
# move this move line to our extra move
@@ -1194,7 +1199,7 @@ class StockMove(models.Model):
extra_move_quantity -= extra_move_quantity
if extra_move_quantity == 0.0:
break
- return extra_move
+ return extra_move | self
def _unreserve_initial_demand(self, new_move):
pass
@@ -1215,9 +1220,7 @@ class StockMove(models.Model):
for move in moves:
if move.state == 'cancel' or move.quantity_done <= 0:
continue
- # extra move will not be merged in mrp
- if not move.picking_id:
- moves_todo |= move
+
moves_todo |= move._create_extra_move()
# Split moves where necessary and move quants
diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py
index 53eddd5fe81..7e49e5c6f53 100644
--- a/addons/stock/models/stock_move_line.py
+++ b/addons/stock/models/stock_move_line.py
@@ -500,7 +500,7 @@ class StockMoveLine(models.Model):
if quantity > available_quantity:
# We now have to find the move lines that reserved our now unavailable quantity. We
# take care to exclude ourselves and the move lines were work had already been done.
- oudated_move_lines_domain = [
+ outdated_move_lines_domain = [
('move_id.state', 'not in', ['done', 'cancel']),
('product_id', '=', product_id.id),
('lot_id', '=', lot_id.id if lot_id else False),
@@ -510,14 +510,15 @@ class StockMoveLine(models.Model):
('product_qty', '>', 0.0),
('id', 'not in', ml_to_ignore.ids),
]
- oudated_candidates = self.env['stock.move.line'].search(oudated_move_lines_domain)
+ current_picking_first = lambda cand: cand.picking_id != self.move_id.picking_id
+ outdated_candidates = self.env['stock.move.line'].search(outdated_move_lines_domain).sorted(current_picking_first)
# As the move's state is not computed over the move lines, we'll have to manually
# recompute the moves which we adapted their lines.
move_to_recompute_state = self.env['stock.move']
rounding = self.product_uom_id.rounding
- for candidate in oudated_candidates:
+ for candidate in outdated_candidates:
if float_compare(candidate.product_qty, quantity, precision_rounding=rounding) <= 0:
quantity -= candidate.product_qty
move_to_recompute_state |= candidate.move_id
diff --git a/addons/stock/report/picking_templates.xml b/addons/stock/report/picking_templates.xml
index 5ddc0876e24..b27daf2fae1 100644
--- a/addons/stock/report/picking_templates.xml
+++ b/addons/stock/report/picking_templates.xml
@@ -18,11 +18,11 @@
^FO100,50
^A0N,44,33^FD<t t-esc="move_line.product_id.display_name"/>^FS
^FO100,100
-<t t-if="move_line.product_id.tracking != 'none' and move_line.lot_name">
-^A0N,44,33^FDLN/SN: <t t-esc="move_line.lot_name"/>^FS
+<t t-if="move_line.product_id.tracking != 'none' and (move_line.lot_id or move_line.lot_name)">
+^A0N,44,33^FDLN/SN: <t t-esc="move_line.lot_id.name or move_line.lot_name"/>^FS
^FO100,150^BY3
^BCN,100,Y,N,N
-^FD<t t-esc="move_line.lot_name"/>^FS
+^FD<t t-esc="move_line.lot_id.name or move_line.lot_name"/>^FS
</t>
<t t-if="move_line.product_id.tracking == 'none' and move_line.product_id.barcode">
^BCN,100,Y,N,N
diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py
index d0dcae56666..630b2ba16ae 100644
--- a/addons/stock/tests/test_move2.py
+++ b/addons/stock/tests/test_move2.py
@@ -188,6 +188,27 @@ class TestPickShip(TestStockCommon):
# the client picking should not be assigned anymore, as we returned partially what we took
self.assertEqual(picking_client.state, 'confirmed')
+ def test_mto_moves_extra_qty(self):
+ """ Ensure that a move in MTO will support an extra quantity. The extra
+ move should be created in MTS and should not be merged in the initial
+ move if it's in MTO. It should also avoid to trigger the rules.
+ """
+ picking_pick, picking_client = self.create_pick_ship()
+ stock_location = self.env['stock.location'].browse(self.stock_location)
+ self.productA.write({'route_ids': [(4, self.env.ref('stock.route_warehouse0_mto').id)]})
+ self.env['stock.quant']._update_available_quantity(self.productA, stock_location, 10.0)
+ picking_pick.action_assign()
+ picking_pick.move_lines[0].move_line_ids[0].qty_done = 15.0
+ picking_pick.action_done()
+ self.assertEqual(picking_pick.state, 'done')
+ self.assertEqual(picking_client.state, 'assigned')
+
+ picking_client.move_lines[0].move_line_ids[0].qty_done = 15.0
+ picking_client.move_lines._action_done()
+ self.assertEqual(len(picking_client.move_lines), 2)
+ self.assertEqual(picking_client.move_lines.mapped('procure_method'), ['make_to_order', 'make_to_stock'])
+ self.assertEqual(picking_client.move_lines.mapped('product_uom_qty'), [10.0, 5.0])
+
def test_mto_moves_return_extra(self):
picking_pick, picking_client = self.create_pick_ship()
stock_location = self.env['stock.location'].browse(self.stock_location)
diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py
index 3d8d1244739..e12b8fa29f9 100644
--- a/addons/stock_account/tests/test_stockvaluation.py
+++ b/addons/stock_account/tests/test_stockvaluation.py
@@ -3467,7 +3467,7 @@ class TestStockValuation(SavepointCase):
self.product1.standard_price = 15
self.product1.categ_id.property_cost_method = 'fifo'
inventory_location = self.product1.property_stock_inventory
- inventory_location.company_id = self.env.user.company_id.id
+ inventory_location.company_id = self.env.company.id
# Start Inventory: 12 units
move1 = self.env['stock.move'].create({
@@ -3503,3 +3503,51 @@ class TestStockValuation(SavepointCase):
self.assertAlmostEqual(move1.stock_valuation_layer_ids.remaining_qty, 0.0)
self.assertAlmostEqual(self.product1.value_svl, 0.0)
+
+ def test_at_date_average_1(self):
+ """ Set a company on the inventory loss, take items from there then put items there, check
+ the values and quantities at date.
+ """
+ now = Datetime.now()
+ date1 = now - timedelta(days=8)
+ date2 = now - timedelta(days=7)
+
+ self.product1.standard_price = 10
+ self.product1.product_tmpl_id.cost_method = 'average'
+ inventory_location = self.product1.property_stock_inventory
+ inventory_location.company_id = self.env.company.id
+
+ move1 = self.env['stock.move'].create({
+ 'name': 'Adjustment of 10 units',
+ 'location_id': inventory_location.id,
+ 'location_dest_id': self.stock_location.id,
+ 'product_id': self.product1.id,
+ 'product_uom': self.uom_unit.id,
+ 'product_uom_qty': 10.0,
+ })
+ move1._action_confirm()
+ move1._action_assign()
+ move1.move_line_ids.qty_done = 10.0
+ move1._action_done()
+ move1.date = date1
+ move1.stock_valuation_layer_ids.write({'create_date': date1})
+
+ move2 = self.env['stock.move'].create({
+ 'name': 'Sell 5 units',
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': inventory_location.id,
+ 'product_id': self.product1.id,
+ 'product_uom': self.uom_unit.id,
+ 'product_uom_qty': 5.0,
+ })
+ move2._action_confirm()
+ move2._action_assign()
+ move2.move_line_ids.qty_done = 5.0
+ move2._action_done()
+ move2.date = date2
+ move2.stock_valuation_layer_ids.write({'create_date': date2})
+
+ self.assertEqual(self.product1.with_context(to_date=Datetime.to_string(date1)).quantity_svl, 10)
+ self.assertEqual(self.product1.with_context(to_date=Datetime.to_string(date1)).value_svl, 100)
+ self.assertEqual(self.product1.with_context(to_date=Datetime.to_string(date2)).quantity_svl, 5)
+ self.assertEqual(self.product1.with_context(to_date=Datetime.to_string(date2)).value_svl, 50)
diff --git a/addons/stock_dropshipping/i18n/ar.po b/addons/stock_dropshipping/i18n/ar.po
index edc885f277b..6f6f670a679 100644
--- a/addons/stock_dropshipping/i18n/ar.po
+++ b/addons/stock_dropshipping/i18n/ar.po
@@ -29,7 +29,7 @@ msgstr "النقل المباشر"
#. module: stock_dropshipping
#: model:ir.model.fields,field_description:stock_dropshipping.field_sale_order_line__purchase_line_ids
msgid "Generated Purchase Lines"
-msgstr ""
+msgstr "بنود الشراء المنشأة"
#. module: stock_dropshipping
#: model:ir.model,name:stock_dropshipping.model_purchase_order_line
@@ -42,6 +42,8 @@ msgid ""
"Purchase line generated by this Sales item on order confirmation, or when "
"the quantity was increased."
msgstr ""
+"بند الشراء الذي أنشأه عنصر المبيعات هذا عند تأكيد الأمر، أو عند زيادة "
+"الكمية."
#. module: stock_dropshipping
#: model:ir.model,name:stock_dropshipping.model_sale_order_line
diff --git a/addons/survey/i18n/vi.po b/addons/survey/i18n/vi.po
index 34740332325..8f4f87a00a8 100644
--- a/addons/survey/i18n/vi.po
+++ b/addons/survey/i18n/vi.po
@@ -1300,7 +1300,7 @@ msgstr ""
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message__moderation_status
msgid "Moderation Status"
-msgstr ""
+msgstr "Trạng thái kiểm duyệt"
#. module: survey
#: selection:survey.question,type:0
@@ -1746,7 +1746,7 @@ msgstr "Đối tượng Tài liệu liên quan"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message__rating_ids
msgid "Related ratings"
-msgstr ""
+msgstr "Xếp hạng liên quan"
#. module: survey
#: model:ir.model.fields,help:survey.field_survey_mail_compose_message__reply_to
diff --git a/addons/theme_bootswatch/i18n/ar.po b/addons/theme_bootswatch/i18n/ar.po
index 3ad43b398d7..52d3bf2b5dd 100644
--- a/addons/theme_bootswatch/i18n/ar.po
+++ b/addons/theme_bootswatch/i18n/ar.po
@@ -4,13 +4,15 @@
#
# Translators:
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:18+0000\n"
-"PO-Revision-Date: 2018-09-21 13:18+0000\n"
-"Last-Translator: Akram Alfusayal <akram_ma@hotmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:26+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +23,7 @@ msgstr ""
#. module: theme_bootswatch
#: model:ir.model,name:theme_bootswatch.model_theme_utils
msgid "Theme Utils"
-msgstr ""
+msgstr "أدوات السمة"
#. module: theme_bootswatch
#: model:ir.actions.act_url,name:theme_bootswatch.action_website
diff --git a/addons/transifex/i18n/ar.po b/addons/transifex/i18n/ar.po
index a6bdacbd8ee..180604872c1 100644
--- a/addons/transifex/i18n/ar.po
+++ b/addons/transifex/i18n/ar.po
@@ -4,13 +4,15 @@
#
# Translators:
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:17+0000\n"
-"PO-Revision-Date: 2018-09-21 13:17+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:33+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,12 +24,12 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:transifex.ir_translation_dialog_view_tree_transifex
#: model_terms:ir.ui.view,arch_db:transifex.ir_translation_view_tree_transifex
msgid "Transifex"
-msgstr ""
+msgstr "Transifex"
#. module: transifex
#: model:ir.model.fields,field_description:transifex.field_ir_translation__transifex_url
msgid "Transifex URL"
-msgstr ""
+msgstr "رابط Transifex"
#. module: transifex
#: model:ir.model,name:transifex.model_ir_translation
diff --git a/addons/uom/i18n/ar.po b/addons/uom/i18n/ar.po
index cd0775e7a48..94bb114e024 100644
--- a/addons/uom/i18n/ar.po
+++ b/addons/uom/i18n/ar.po
@@ -3,7 +3,6 @@
# * uom
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Martin Trigaux, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
@@ -13,13 +12,15 @@
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Zuhair Hammadi <zuhair12@gmail.com>, 2018
# aymen rahmani <aymen.isims@gmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
-"PO-Revision-Date: 2018-09-18 09:49+0000\n"
-"Last-Translator: aymen rahmani <aymen.isims@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:33+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -63,6 +64,8 @@ msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
+"لا يمكن التحويل بين وحدات القياس إلا إذا كانت تنتمي لنفس الفئة. سيتم إجراء "
+"التحويل بناءً على النسب."
#. module: uom
#: model:ir.model.fields,field_description:uom.field_uom_category__create_uid
@@ -163,7 +166,7 @@ msgstr "وحدة قياس المنتج"
#. module: uom
#: model:ir.model,name:uom.model_uom_category
msgid "Product UoM Categories"
-msgstr ""
+msgstr "فئات وحدات قياس المنتج"
#. module: uom
#: model:ir.model.fields,field_description:uom.field_uom_uom__factor
diff --git a/addons/utm/i18n/ar.po b/addons/utm/i18n/ar.po
index 2d4c4095ae8..e6b0bec19e7 100644
--- a/addons/utm/i18n/ar.po
+++ b/addons/utm/i18n/ar.po
@@ -144,7 +144,7 @@ msgstr "آخر تحديث في"
#. module: utm
#: model:utm.source,name:utm.utm_source_mailing
msgid "Lead Newsletter"
-msgstr ""
+msgstr "النشرة البريدية للترشيح"
#. module: utm
#: model:ir.ui.menu,name:utm.menu_link_tracker_root
@@ -219,7 +219,7 @@ msgstr "تويتر"
#. module: utm
#: model:ir.model,name:utm.model_utm_campaign
msgid "UTM Campaign"
-msgstr ""
+msgstr "حملة UTM"
#. module: utm
#: model:ir.model,name:utm.model_utm_medium
diff --git a/addons/web/i18n/km.po b/addons/web/i18n/km.po
index ad4e16ada6e..292c6c554c0 100644
--- a/addons/web/i18n/km.po
+++ b/addons/web/i18n/km.po
@@ -526,7 +526,7 @@ msgstr "កំណត់យក"
#: code:addons/web/static/src/js/views/list/list_controller.js:154
#, python-format
msgid "Archive"
-msgstr ""
+msgstr "សម្រេចគោលដៅ"
#. module: web
#. openerp-web
@@ -1239,7 +1239,7 @@ msgstr ""
#: code:addons/web/static/src/js/views/form/form_controller.js:184
#, python-format
msgid "Duplicate"
-msgstr ""
+msgstr "ត្រួត"
#. module: web
#. openerp-web
@@ -1440,7 +1440,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1353
#, python-format
msgid "Favorites"
-msgstr ""
+msgstr "ចំណូលចិត្ត"
#. module: web
#. openerp-web
@@ -1901,14 +1901,14 @@ msgstr ""
#: code:addons/web/static/src/xml/kanban.xml:42
#, python-format
msgid "Load more... ("
-msgstr ""
+msgstr "ផ្ទុកបន្ថែម"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome/loading.js:58
#, python-format
msgid "Loading"
-msgstr ""
+msgstr "ដំណើរការ"
#. module: web
#. openerp-web
diff --git a/addons/web/static/src/js/chrome/action_manager_act_window.js b/addons/web/static/src/js/chrome/action_manager_act_window.js
index ef9273bb484..1a08bf59a9a 100644
--- a/addons/web/static/src/js/chrome/action_manager_act_window.js
+++ b/addons/web/static/src/js/chrome/action_manager_act_window.js
@@ -295,6 +295,7 @@ ActionManager.include({
}
var lazyViewDef;
+ var lazyControllerID;
if (lazyView) {
// if the main view is lazy-loaded, its (lazy-loaded) controller is inserted
// into the controller stack (so that breadcrumbs can be correctly computed),
@@ -304,6 +305,7 @@ ActionManager.include({
// this controller being lazy-loaded, this call is actually sync
lazyViewDef = self._createViewController(action, lazyView.type, {}, {lazy: true})
.then(function (lazyLoadedController) {
+ lazyControllerID = lazyLoadedController.jsID;
self.controllerStack.push(lazyLoadedController.jsID);
});
}
@@ -322,7 +324,13 @@ ActionManager.include({
action.controllerID = controller.jsID;
return self._executeAction(action, options);
})
- .guardedCatch(self._destroyWindowAction.bind(self, action));
+ .guardedCatch(function () {
+ if (lazyControllerID) {
+ var index = self.controllerStack.indexOf(lazyControllerID);
+ self.controllerStack = self.controllerStack.slice(0, index);
+ }
+ self._destroyWindowAction(action);
+ });
});
},
/**
diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js
index 83edf12212b..c80f939ddee 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -661,9 +661,12 @@ var FormController = BasicController.extend({
* @private
* @param {OdooEvent} event
*/
- _onFormDialogDiscarded: function(e) {
- e.stopPropagation();
- this.renderer.focusLastActivatedWidget();
+ _onFormDialogDiscarded: function(ev) {
+ ev.stopPropagation();
+ var isFocused = this.renderer.focusLastActivatedWidget();
+ if (ev.data.callback) {
+ ev.data.callback(_.str.toBool(isFocused));
+ }
},
/**
* Opens a one2many record (potentially new) in a dialog. This handler is
diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js
index 98331c9b409..7f37d1b9059 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -195,8 +195,11 @@ var FormRenderer = BasicRenderer.extend({
* field.
*/
focusLastActivatedWidget: function () {
- this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1,
- { noAutomaticCreate: true });
+ if (this.lastActivatedFieldIndex !== -1) {
+ return this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1,
+ { noAutomaticCreate: true });
+ }
+ return false;
},
/**
* returns the active tab pages for each notebook
diff --git a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
index 0c484931aae..6a9caa99a39 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
@@ -150,7 +150,7 @@ var KanbanColumnProgressBar = Widget.extend({
});
// Adapt active state
- $bar.toggleClass('active progress-bar-striped', key === self.activeFilter);
+ $bar.toggleClass('progress-bar-animated progress-bar-striped', key === self.activeFilter);
// Adapt width
$bar.removeClass('o_bar_has_records transition-off');
diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js
index 3e60403fab2..2740c8e1567 100644
--- a/addons/web/static/src/js/views/list/list_editable_renderer.js
+++ b/addons/web/static/src/js/views/list/list_editable_renderer.js
@@ -480,34 +480,41 @@ ListRenderer.include({
* Returns the relative width according to the widget or the field type.
* @see _renderHeader
*
- * @param {Object} column a `field` arch node
+ * @param {Object} column an arch node
+ * @returns {integer | string} either a weight factor (number) or a css
+ * width description (string)
*/
_getColumnWidthFactor: function (column) {
- if (column.attrs.width) {
- // the width attribute has precedence on the width factor
- return 0;
+ if (!this.state.fieldsInfo.list[column.attrs.name]) {
+ // Unnamed columns get default value
+ return 1;
+ }
+ var field = this.state.fields[column.attrs.name];
+ if (!field) {
+ // this is not a field. Probably a button or something of unknown
+ // width.
+ return 1;
}
- var fieldType = this.state.fields[column.attrs.name].type;
var widget = this.state.fieldsInfo.list[column.attrs.name].Widget.prototype;
if ('widthFactor' in widget) {
return widget.widthFactor;
}
- switch (fieldType) {
+ switch (field.type) {
case 'binary': return 1;
- case 'boolean': return 0.4;
+ case 'boolean': return '40px';
case 'char': return 1;
- case 'date': return 1;
- case 'datetime': return 1.5;
- case 'float': return 1;
+ case 'date': return '100px';
+ case 'datetime': return '150px';
+ case 'float': return '100px';
case 'html': return 3;
- case 'integer': return 0.8;
- case 'many2many': return 2.2;
- case 'many2one': return 1.5;
+ case 'integer': return '80px';
+ case 'many2many': return 2;
+ case 'many2one': return 2;
case 'monetary': return 1.2;
- case 'one2many': return 2.2;
+ case 'one2many': return 2.5;
case 'reference': return 1.5;
case 'selection': return 1.5;
- case 'text': return 3;
+ case 'text': return 2.5;
default: return 1;
}
},
@@ -720,24 +727,26 @@ ListRenderer.include({
});
},
/**
- * Overridden to set weights on columns for the fixed layout.
+ * Overridden to set weights or explicit width on columns for the fixed layout.
*
* @override
* @private
*/
_processColumns: function () {
this._super.apply(this, arguments);
-
if (this.editable) {
var self = this;
this.columns.forEach(function (column) {
- if (column.attrs.width_factor) {
+ if (column.attrs.width) {
+ // nothing to do
+ } else if (column.attrs.width_factor) {
column.attrs.widthFactor = parseFloat(column.attrs.width_factor, 10);
} else {
- if (column.tag === 'field') {
- column.attrs.widthFactor = self._getColumnWidthFactor(column);
+ var factor = self._getColumnWidthFactor(column);
+ if (typeof factor === 'string') {
+ column.attrs.width = factor;
} else {
- column.attrs.widthFactor = 1;
+ column.attrs.widthFactor = factor;
}
}
});
@@ -818,15 +827,18 @@ ListRenderer.include({
var $thead = this._super.apply(this, arguments);
if (this.editable) {
+ // we compute the sum of the weights for each columns, excluding
+ // those with a fixed width.
var totalWidth = this.columns.reduce(function (acc, column) {
- return acc + column.attrs.widthFactor;
+ return acc + (column.attrs.widthFactor || 0);
}, 0);
this.columns.forEach(function (column) {
- var $cell = $thead.find('th[data-name=' + column.attrs.name + ']');
- if (column.attrs.width) {
- $cell.css('width', column.attrs.width);
- } else if (column.attrs.widthFactor) {
- $cell.css('width', (column.attrs.widthFactor / totalWidth * 100) + '%');
+ if (column.attrs.width || column.attrs.widthFactor) {
+ var width = column.attrs.width || ((column.attrs.widthFactor / totalWidth * 100) + '%');
+ var $th = $thead.find('th[data-name=' + column.attrs.name + ']');
+ if ($th.data('name')) {
+ $th.css('width', width);
+ }
}
});
}
diff --git a/addons/web/static/src/js/views/list/list_model.js b/addons/web/static/src/js/views/list/list_model.js
index 41178498c96..25fdf28954c 100644
--- a/addons/web/static/src/js/views/list/list_model.js
+++ b/addons/web/static/src/js/views/list/list_model.js
@@ -52,17 +52,19 @@ odoo.define('web.ListModel', function (require) {
var model = records[0].model;
var recordResIds = _.pluck(records, 'res_id');
var fieldNames = records[0].getFieldNames();
+ var context = records[0].getContext();
return this._rpc({
model: model,
method: 'write',
args: [recordResIds, changes],
- context: records[0].getContext(),
+ context: context,
}).then(function () {
return self._rpc({
model: model,
method: 'read',
args: [recordResIds, fieldNames],
+ context: context,
});
}).then(function (results) {
results.forEach(function (data) {
@@ -94,14 +96,7 @@ odoo.define('web.ListModel', function (require) {
options = options || {};
options.fetchRecordsWithGroups = true;
return this._super(list, options).then(function (result) {
- var prom;
- if (!list.parentID) {
- // groupbys buttons are only displayed on the first level of
- // groupby so no need to fetch the extra fields for inner
- // groups
- prom = self._readGroupExtraFields(list);
- }
- return Promise.resolve(prom).then(_.constant(result));
+ return self._readGroupExtraFields(list).then(_.constant(result));
});
},
/**
diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js
index b4d6e5e036b..8ed13c4d7da 100644
--- a/addons/web/static/src/js/views/list/list_renderer.js
+++ b/addons/web/static/src/js/views/list/list_renderer.js
@@ -599,16 +599,22 @@ var ListRenderer = BasicRenderer.extend({
var colspanBeforeAggregate;
if (firstAggregateIndex !== -1) {
// if there are aggregates, the first $th goes until the first
- // aggregate then all cells between aggregates are rendered, then
- // there is a last $th for the pager
+ // aggregate then all cells between aggregates are rendered
colspanBeforeAggregate = firstAggregateIndex;
var lastAggregateIndex = _.findLastIndex(this.columns, function (column) {
return column.tag === 'field' && _.contains(aggregateKeys, column.attrs.name);
});
cells = cells.concat(aggregateCells.slice(firstAggregateIndex, lastAggregateIndex + 1));
- cells.push($('<th>').attr('colspan', this.columns.length - 1 - lastAggregateIndex));
+ var colSpan = this.columns.length - 1 - lastAggregateIndex;
+ if (colSpan > 0) {
+ cells.push($('<th>').attr('colspan', colSpan));
+ }
} else {
- colspanBeforeAggregate = this.columns.length;
+ var colN = this.columns.length;
+ colspanBeforeAggregate = colN > 1 ? colN - 1 : 1;
+ if (colN > 1) {
+ cells.push($('<th>'));
+ }
}
if (this.hasSelectors) {
colspanBeforeAggregate += 1;
@@ -616,11 +622,11 @@ var ListRenderer = BasicRenderer.extend({
$th.attr('colspan', colspanBeforeAggregate);
if (group.isOpen && !group.groupedBy.length && (group.count > group.data.length)) {
- var $lastCell = cells[cells.length - 1];
var $pager = this._renderGroupPager(group);
- $lastCell.addClass('o_group_pager').append($pager);
+ var $lastCell = cells[cells.length - 1];
+ $lastCell.append($pager);
}
- if (groupLevel === 0 && group.isOpen && this.groupbys[groupBy]) {
+ if (group.isOpen && this.groupbys[groupBy]) {
var $buttons = this._renderGroupButtons(group, this.groupbys[groupBy]);
if ($buttons.length) {
var $buttonSection = $('<div>', {
diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js
index bf7c70e2859..a544ab15593 100644
--- a/addons/web/static/src/js/views/pivot/pivot_model.js
+++ b/addons/web/static/src/js/views/pivot/pivot_model.js
@@ -430,6 +430,7 @@ var PivotModel = AbstractModel.extend({
}
if ('domain' in params) {
this.data.domain = params.domain;
+ this.initialDomain = params.domain;
} else {
this.data.domain = this.initialDomain;
}
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js
index 1fb20232495..2eb3b7787e8 100644
--- a/addons/web/static/src/js/views/view_dialogs.js
+++ b/addons/web/static/src/js/views/view_dialogs.js
@@ -243,8 +243,13 @@ var FormViewDialog = ViewDialog.extend({
* @override
*/
_focusOnClose: function() {
- this.trigger_up('form_dialog_discarded');
- return true;
+ var isFocusSet = false;
+ this.trigger_up('form_dialog_discarded', {
+ callback: function (isFocused) {
+ isFocusSet = isFocused;
+ },
+ });
+ return isFocusSet;
},
/**
@@ -426,8 +431,13 @@ var SelectCreateDialog = ViewDialog.extend({
* @override
*/
_focusOnClose: function() {
- this.trigger_up('form_dialog_discarded');
- return true;
+ var isFocusSet = false;
+ this.trigger_up('form_dialog_discarded', {
+ callback: function (isFocused) {
+ isFocusSet = isFocused;
+ },
+ });
+ return isFocusSet;
},
});
diff --git a/addons/web/static/src/scss/layout_standard.scss b/addons/web/static/src/scss/layout_standard.scss
index e992d25b796..5cedf578c48 100644
--- a/addons/web/static/src/scss/layout_standard.scss
+++ b/addons/web/static/src/scss/layout_standard.scss
@@ -1,5 +1,8 @@
.o_standard_footer {
margin-top: 200px;
+ .list-inline-item {
+ white-space: nowrap;
+ }
}
.o_report_layout_standard {
diff --git a/addons/web/static/src/scss/list_view.scss b/addons/web/static/src/scss/list_view.scss
index 3d25258eac5..a18d9f70083 100644
--- a/addons/web/static/src/scss/list_view.scss
+++ b/addons/web/static/src/scss/list_view.scss
@@ -125,18 +125,18 @@
padding-bottom: 0;
}
}
- .o_group_pager {
- position: relative;
+ .o_pager {
+ cursor: text;
+ user-select: none;
+ text-align: right;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ margin-top: -2px;
+ margin-bottom: -2px;
- .o_pager {
- @include o-position-absolute(0, 16px);
- cursor: text;
- user-select: none;
- padding-top: 3px !important;
- padding-bottom: 0 !important;
- }
.o_pager_previous, .o_pager_next {
max-height: 30px;
+ padding: 0 5px;
background-color: $o-list-group-header-color;
&:hover {
background-color: darken($o-list-group-header-color, 10%);
diff --git a/addons/web/static/src/xml/kanban.xml b/addons/web/static/src/xml/kanban.xml
index 57104b4e8ad..aadda505b44 100644
--- a/addons/web/static/src/xml/kanban.xml
+++ b/addons/web/static/src/xml/kanban.xml
@@ -110,7 +110,7 @@
<div class="o_kanban_counter_progress progress">
<t t-foreach="widget.colors" t-as="color">
<t t-set="count" t-value="widget.subgroupCounts and widget.subgroupCounts[color] or 0"/>
- <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' active progress-bar-striped' : ''}"
+ <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' progress-bar-animated progress-bar-striped' : ''}"
t-att-data-filter="color"
t-attf-data-original-title="#{count} #{color}"
aria-valuemin="0" aria-valuemax="100" t-att-aria-valuenow="count*100" role="progressbar"
diff --git a/addons/web/static/src/xml/menu.xml b/addons/web/static/src/xml/menu.xml
index 6a4749d1c25..086d676e02a 100644
--- a/addons/web/static/src/xml/menu.xml
+++ b/addons/web/static/src/xml/menu.xml
@@ -20,7 +20,7 @@
</a>
<div class="dropdown-menu" role="menu">
<t t-foreach="widget.getApps()" t-as="app">
- <a role="menuitem"
+ <a role="menuitem" t-attf-href="#menu_id=#{app.menuID}"
class="dropdown-item o_app"
t-att-data-menu-id="app.menuID"
t-att-data-menu-xmlid="app.xmlID"
diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js
index 6b572af4285..26ec7b1562b 100644
--- a/addons/web/static/tests/chrome/action_manager_tests.js
+++ b/addons/web/static/tests/chrome/action_manager_tests.js
@@ -943,6 +943,41 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test('lazy loaded multi record view with failing mono record one', async function (assert) {
+ assert.expect(4);
+
+ var actionManager = await createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (args.method === 'read') {
+ return Promise.reject();
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ await actionManager.loadState({
+ action: 3,
+ id: 2,
+ view_type: 'form',
+ }).then(function () {
+ assert.ok(false, 'should not resolve the deferred');
+ }).catch(function () {
+ assert.ok(true, 'should reject the deferred');
+ });
+
+ assert.containsNone(actionManager, '.o_form_view');
+ assert.containsNone(actionManager, '.o_list_view');
+
+ await actionManager.doAction(1);
+
+ assert.containsOnce(actionManager, '.o_kanban_view');
+
+ actionManager.destroy();
+ });
+
QUnit.test('change the viewType of the current action', async function (assert) {
assert.expect(13);
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 229d020bfbd..7f6fd2ede71 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -313,8 +313,8 @@ QUnit.module('relational_fields', {
await testUtils.form.clickEdit(form);
await testUtils.dom.click(form.$('.o_external_button'));
- var $originalModal = $('.modal-dialog');
- var $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $originalModal = $('.modal');
+ var $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($originalModal.length, 1, 'There should be one modal');
assert.equal($originalModal[0], $focusedModal[0], 'Modal is focused');
@@ -322,8 +322,8 @@ QUnit.module('relational_fields', {
// Open many2one modal of field in many2one modal
await testUtils.dom.click($originalModal.find('.o_external_button'));
- var $modals = $('.modal-dialog');
- $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $modals = $('.modal');
+ $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($modals.length, 2, 'There should be two modals');
assert.equal($modals[1], $focusedModal[0], 'Last modal is focused');
@@ -331,8 +331,8 @@ QUnit.module('relational_fields', {
// Close second modal
await testUtils.dom.click($modals.last().find('button[class="close"]'));
- var $modal = $('.modal-dialog');
- $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $modal = $('.modal');
+ $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($modal.length, 1, 'There should be one modal');
assert.equal($modal[0], $originalModal[0], 'First modal is still opened');
diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js
index c1ffac7bd6f..f6d625b3d6d 100644
--- a/addons/web/static/tests/views/form_tests.js
+++ b/addons/web/static/tests/views/form_tests.js
@@ -4844,6 +4844,65 @@ QUnit.module('Views', {
form.destroy();
});
+ QUnit.module('focus and scroll test', async function () {
+ QUnit.test('no focus set on form when closing many2one modal if lastActivatedFieldIndex is not set', async function (assert) {
+ assert.expect(8);
+
+ var form = await createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="display_name"/>' +
+ '<field name="foo"/>' +
+ '<field name="bar"/>' +
+ '<field name="p"/>' +
+ '<field name="timmy"/>' +
+ '<field name="product_ids"/>' +
+ '<field name="trululu"/>' +
+ '</form>',
+ res_id: 2,
+ archs: {
+ 'partner,false,list': '<tree><field name="display_name"/></tree>',
+ 'partner_type,false,list': '<tree><field name="name"/></tree>',
+ 'partner,false,form': '<form><field name="trululu"/></form>',
+ 'product,false,list': '<tree><field name="name"/></tree>',
+ },
+ mockRPC: function (route, args) {
+ if (args.method === 'get_formview_id') {
+ return Promise.resolve(false);
+ }
+ return this._super(route, args);
+ },
+ });
+
+ // set max-height to have scroll forcefully so that we can test scroll position after modal close
+ $('.o_content').css({'overflow': 'auto', 'max-height': '300px'});
+ // Open many2one modal, lastActivatedFieldIndex will not set as we directly click on external button
+ await testUtils.form.clickEdit(form);
+ assert.strictEqual($(".o_content").scrollTop(), 0, "scroll position should be 0");
+
+ form.$(".o_field_many2one[name='trululu'] .o_input").focus();
+ assert.notStrictEqual($(".o_content").scrollTop(), 0, "scroll position should not be 0");
+
+ await testUtils.dom.click(form.$('.o_external_button'));
+ // Close modal
+ await testUtils.dom.click($('.modal').last().find('button[class="close"]'));
+ assert.notStrictEqual($(".o_content").scrollTop(), 0,
+ "scroll position should not be 0 after closing modal");
+ assert.containsNone(document.body, '.modal', 'There should be no modal');
+ assert.doesNotHaveClass($('body'), 'modal-open', 'Modal is not said opened');
+ assert.strictEqual(form.renderer.lastActivatedFieldIndex, -1,
+ "lastActivatedFieldIndex is -1");
+ assert.equal(document.activeElement, $('body')[0],
+ 'body is focused, should not set focus on form widget');
+ assert.notStrictEqual(document.activeElement, form.$('.o_field_many2one[name="trululu"] .o_input'),
+ 'field widget should not be focused when lastActivatedFieldIndex is -1');
+
+ form.destroy();
+ });
+ });
+
QUnit.test('in create mode, autofocus fields are focused', async function (assert) {
assert.expect(1);
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 2447be64837..cf76ee363f7 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -553,10 +553,29 @@ QUnit.module('Views', {
hasSelectors: false,
});
- assert.strictEqual(list.$('.o_group_header:first').children().length, 1,
- "group header should have exactly 1 column");
+ assert.strictEqual(list.$('.o_group_header:first').children().length, 2,
+ "group header should have exactly 2 column");
+ assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "1",
+ "the header should not span the whole table");
+ list.destroy();
+ });
+
+ QUnit.test('basic grouped list rendering 3 cols without selector', async function (assert) {
+ assert.expect(2);
+
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree ><field name="foo"/><field name="bar"/><field name="text"/></tree>',
+ groupBy: ['bar'],
+ hasSelectors: false,
+ });
+
+ assert.strictEqual(list.$('.o_group_header:first').children().length, 2,
+ "group header should have exactly 2 columns");
assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "2",
- "the header should span the whole table");
+ "the first header should span two columns");
list.destroy();
});
@@ -572,10 +591,29 @@ QUnit.module('Views', {
hasSelectors: true,
});
- assert.strictEqual(list.$('.o_group_header:first').children().length, 1,
- "group header should have exactly 1 column");
+ assert.strictEqual(list.$('.o_group_header:first').children().length, 2,
+ "group header should have exactly 2 columns");
+ assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "2",
+ "the header should not span the whole table");
+ list.destroy();
+ });
+
+ QUnit.test('basic grouped list rendering 3 cols with selector', async function (assert) {
+ assert.expect(2);
+
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree ><field name="foo"/><field name="bar"/><field name="text"/></tree>',
+ groupBy: ['bar'],
+ hasSelectors: true,
+ });
+
+ assert.strictEqual(list.$('.o_group_header:first').children().length, 2,
+ "group header should have exactly 2 columns");
assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "3",
- "the header should span the whole table");
+ "the header should not span the whole table");
list.destroy();
});
@@ -1391,6 +1429,39 @@ QUnit.module('Views', {
list.destroy();
});
+ QUnit.test('width of some of the fields should be hardcoded', async function (assert) {
+ const assertions = [
+ { field: 'bar', expected: 40, type: 'Boolean' },
+ { field: 'int_field', expected: 80, type: 'Integer' },
+ { field: 'qux', expected: 100, type: 'Float' },
+ { field: 'date', expected: 100, type: 'Date' },
+ { field: 'datetime', expected: 150, type: 'Datetime' },
+ ];
+ assert.expect(assertions.length + 1);
+
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree editable="top">' +
+ '<field name="bar"/>' +
+ '<field name="foo"/>' +
+ '<field name="int_field"/>' +
+ '<field name="qux"/>' +
+ '<field name="date"/>' +
+ '<field name="datetime"/>' +
+ '</tree>',
+ });
+
+ assertions.forEach(a => {
+ assert.strictEqual(list.$(`th[data-name="${a.field}"]`)[0].offsetWidth, a.expected,
+ `Field ${a.type} should have a fixed width of ${a.expected} pixels`);
+ });
+ assert.strictEqual(list.$('th[data-name="foo"]')[0].style.width, '100%', "Char field should occupy the remaining space");
+
+ list.destroy();
+ });
+
QUnit.test('row height should not change when switching mode', async function (assert) {
// Warning: this test is css dependant
assert.expect(3);
@@ -1414,7 +1485,7 @@ QUnit.module('Views', {
'<field name="int_field" readonly="1"/>' +
'<field name="boolean"/>' +
'<field name="date"/>' +
- '<field name="text" width_factor="2"/>' +
+ '<field name="text" width_factor="1"/>' +
'<field name="amount"/>' +
'<field name="currency_id" invisible="1"/>' +
'<field name="m2o"/>' +
@@ -1424,6 +1495,11 @@ QUnit.module('Views', {
currencies: currencies,
},
});
+
+ // the width is hardcoded to make sure we have the same condition
+ // between debug mode and non debug mode (#qunit-fixture is limited to
+ // 1000px)
+ list.$el.width('1000px');
var startHeight = list.$('.o_data_row:first').height();
// start edition of first row
@@ -2098,8 +2174,8 @@ QUnit.module('Views', {
await testUtils.dom.click(list.$('tbody:eq(1) .o_group_header:eq(0)'));
- assert.containsNone(list, '.o_group_header button',
- "there should be no button in the header");
+ assert.containsOnce(list, '.o_group_header button',
+ "there should be one button in the header");
list.destroy();
});
@@ -2763,8 +2839,8 @@ QUnit.module('Views', {
await testUtils.dom.click(list.$('.o_group_header'));
assert.strictEqual(list.$('.o_group_header').css('height'), headerHeight,
"height of group header shouldn't have changed");
- assert.hasClass(list.$('.o_group_header th'), 'o_group_pager',
- "last cell of open group header should have classname 'o_group_header'");
+ assert.hasClass(list.$('.o_group_header th:eq(1) > div'), 'o_pager',
+ "last cell of open group header should have classname 'o_pager'");
assert.strictEqual(list.$('.o_group_header .o_pager_value').text(), '1-3',
"pager's value should be correct");
assert.containsN(list, '.o_data_row', 3,
@@ -4334,6 +4410,43 @@ QUnit.module('Views', {
list.destroy();
});
+ QUnit.test('editable list view: contexts with multiple edit', async function (assert) {
+ assert.expect(4);
+
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree editable="top">' +
+ '<field name="foo"/>' +
+ '</tree>',
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/call_kw/foo/write' ||
+ route === '/web/dataset/call_kw/foo/read') {
+ var context = args.kwargs.context;
+ assert.strictEqual(context.active_field, 2, "context should be correct");
+ assert.strictEqual(context.someKey, 'some value', "context should be correct");
+ }
+ return this._super.apply(this, arguments);
+ },
+ session: {
+ user_context: {someKey: 'some value'},
+ },
+ viewOptions: {
+ context: {active_field: 2},
+ },
+ });
+
+ // Uses the main selector to select all lines.
+ await testUtils.dom.click(list.$('.o_content input:first'));
+ await testUtils.dom.click(list.$('.o_data_cell:first'));
+ // Edits first record then confirms changes.
+ await testUtils.fields.editInput(list.$('.o_field_widget[name=foo]'), 'legion');
+ await testUtils.dom.click($('.modal-dialog button.btn-primary'));
+
+ list.destroy();
+ });
+
QUnit.test('editable list view: multi edition', async function (assert) {
assert.expect(19);
diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js
index 20abde4a4bb..f82bcdbca42 100644
--- a/addons/web/static/tests/views/pivot_tests.js
+++ b/addons/web/static/tests/views/pivot_tests.js
@@ -4,6 +4,7 @@ odoo.define('web.pivot_tests', function (require) {
var core = require('web.core');
var PivotView = require('web.PivotView');
var testUtils = require('web.test_utils');
+var testUtilsDom = require('web.test_utils_dom');
var createActionManager = testUtils.createActionManager;
var patchDate = testUtils.mock.patchDate;
@@ -16,7 +17,7 @@ QUnit.module('Views', {
this.data = {
partner: {
fields: {
- foo: {string: "Foo", type: "integer"},
+ foo: {string: "Foo", type: "integer", searchable: true},
bar: {string: "bar", type: "boolean"},
date: {string: "Date", type: "date", store: true, sortable: true},
product_id: {string: "Product", type: "many2one", relation: 'product', store: true},
@@ -1879,6 +1880,71 @@ QUnit.module('Views', {
actionManager.destroy();
});
+ QUnit.test('Navigation list view for a group and back with breadcrumbs', async function (assert) {
+ assert.expect(16);
+ // create an action manager to test the interactions with the search view
+ var readGroupCount = 0;
+ var actionManager = await createActionManager({
+ data: this.data,
+ archs: {
+ 'partner,false,pivot': '<pivot>' +
+ '<field name="customer" type="row"/>' +
+ '</pivot>',
+ 'partner,false,search': '<search><filter name="bayou" string="Bayou" domain="[(\'foo\',\'=\', 12)]"/></search>',
+ 'partner,false,list': '<tree><field name="foo"/></tree>',
+ 'partner,false,form': '<form><field name="foo"/></form>',
+ },
+ intercepts: {
+ do_action: function (event) {
+ var action = event.data.action;
+ actionManager.doAction(action);
+ }
+ },
+ mockRPC: function (route, args) {
+ if (args.method === 'read_group') {
+ assert.step('read_group');
+ var domain = args.kwargs.domain;
+ if ([0,1].indexOf(readGroupCount) !== -1) {
+ assert.deepEqual(domain, [], 'initial domain empty');
+ } else if ([2,3,4,5].indexOf(readGroupCount) !== -1) {
+ assert.deepEqual(domain, [['foo', '=', 12]],
+ 'domain conserved when back with breadcrumbs');
+ }
+ readGroupCount++;
+ }
+ if (route === '/web/dataset/search_read') {
+ assert.step('search_read');
+ var domain = args.domain;
+ assert.deepEqual(domain, [['foo', '=', 12], ['customer', '=', 1], ['foo', '=', 12]],
+ 'list domain is correct');
+ }
+ return this._super.apply(this, arguments);
+ }
+ });
+
+ await actionManager.doAction({
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'pivot']],
+ });
+
+ await testUtilsDom.click(actionManager.$('.o_filters_menu_button'));
+ await testUtilsDom.click(actionManager.$('.o_menu_item:contains("Bayou")'));
+
+ await testUtilsDom.click(actionManager.$('.o_pivot_cell_value:nth(1)'))
+
+ assert.containsOnce(actionManager, '.o_list_view');
+
+ await testUtilsDom.click(actionManager.$('.o_control_panel .breadcrumb-item:first() a'));
+
+ assert.verifySteps([
+ 'read_group', 'read_group',
+ 'read_group', 'read_group',
+ 'search_read',
+ 'read_group', 'read_group'])
+ actionManager.destroy();
+ });
+
QUnit.module('Sort in comparison mode', {
beforeEach: async function () {
this.data.partner.records[0].date = '2016-12-15';
diff --git a/addons/web_editor/i18n/km.po b/addons/web_editor/i18n/km.po
index 702cddccbb2..0ca4f16327a 100644
--- a/addons/web_editor/i18n/km.po
+++ b/addons/web_editor/i18n/km.po
@@ -378,7 +378,7 @@ msgstr ""
#: code:addons/web_editor/static/src/xml/snippets.xml:15
#, python-format
msgid "Customize"
-msgstr ""
+msgstr "អតិថិជន"
#. module: web_editor
#. openerp-web
@@ -1017,7 +1017,7 @@ msgstr ""
#: code:addons/web_editor/static/src/xml/editor.xml:309
#, python-format
msgid "Preview"
-msgstr ""
+msgstr "ពីមុន"
#. module: web_editor
#. openerp-web
diff --git a/addons/web_editor/i18n/vi.po b/addons/web_editor/i18n/vi.po
index 8bcf0142fcb..9b93ed3e375 100644
--- a/addons/web_editor/i18n/vi.po
+++ b/addons/web_editor/i18n/vi.po
@@ -1072,7 +1072,7 @@ msgstr ""
#. module: web_editor
#: model:ir.model,name:web_editor.model_ir_qweb_field_float
msgid "Qweb Field Float"
-msgstr ""
+msgstr "Qweb Field Float"
#. module: web_editor
#: model:ir.model,name:web_editor.model_ir_qweb_field_html
diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py
index 653bdd038f1..edda3ba6887 100644
--- a/addons/web_editor/models/ir_ui_view.py
+++ b/addons/web_editor/models/ir_ui_view.py
@@ -199,7 +199,7 @@ class IrUiView(models.Model):
self.write({'arch': self._pretty_arch(new_arch)})
@api.model
- def _view_get_inherited_children(self, view, options):
+ def _view_get_inherited_children(self, view):
return view.inherit_children_ids
@api.model
@@ -216,7 +216,7 @@ class IrUiView(models.Model):
# Used by translation mechanism, SEO and optional templates
@api.model
- def _views_get(self, view_id, options=True, bundles=False, root=True):
+ def _views_get(self, view_id, get_children=True, bundles=False, root=True):
""" For a given view ``view_id``, should return:
* the view itself
* all views inheriting from it, enabled or not
@@ -245,17 +245,17 @@ class IrUiView(models.Model):
except ValueError:
continue
if called_view and called_view not in views_to_return:
- views_to_return += self._views_get(called_view, options=options, bundles=bundles)
+ views_to_return += self._views_get(called_view, get_children=get_children, bundles=bundles)
- extensions = self._view_get_inherited_children(view, options)
- if not options:
- # only active children
- extensions = extensions.filtered(lambda view: view.active)
+ if not get_children:
+ return views_to_return
- # Keep options in a deterministic order regardless of their applicability
+ extensions = self._view_get_inherited_children(view)
+
+ # Keep children in a deterministic order regardless of their applicability
for extension in extensions.sorted(key=lambda v: v.id):
# only return optional grandchildren if this child is enabled
- for ext_view in self._views_get(extension, options=extension.active, root=False):
+ for ext_view in self._views_get(extension, get_children=extension.active, root=False):
if ext_view not in views_to_return:
views_to_return += ext_view
return views_to_return
diff --git a/addons/web_editor/static/src/js/wysiwyg/plugin/history.js b/addons/web_editor/static/src/js/wysiwyg/plugin/history.js
index a60ab41523b..addf6383783 100644
--- a/addons/web_editor/static/src/js/wysiwyg/plugin/history.js
+++ b/addons/web_editor/static/src/js/wysiwyg/plugin/history.js
@@ -19,6 +19,12 @@ var HistoryPlugin = Plugins.history.extend({
console.error(e);
}
this.context.invoke('editor.focus');
+ var newRange = this.context.invoke('editor.createRange');
+ if (!this.options.isEditableNode(newRange.sc)) {
+ var firstEditableSel = '[contenteditable="true"]:not(":hidden")';
+ var sc = this.$editable.find(firstEditableSel)[0];
+ this.context.invoke('editor.setRange', sc, 0, sc, 0).select();
+ }
},
/**
* Clear the history.
diff --git a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js
index 9bc9124688b..d13ddf63038 100644
--- a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js
+++ b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js
@@ -358,6 +358,8 @@ var SnippetEditor = Widget.extend({
ev.preventDefault();
this.trigger_up('cover_will_change');
+ this.trigger_up('snippet_will_be_cloned', {$target: this.$target});
+
var $clone = this.$target.clone(false);
this.trigger_up('request_history_undo_record', {$target: this.$target});
@@ -372,7 +374,7 @@ var SnippetEditor = Widget.extend({
}
},
});
- this.trigger_up('snippet_cloned', {$target: $clone});
+ this.trigger_up('snippet_cloned', {$target: $clone, $origin: this.$target});
$clone.trigger('content_changed');
},
/**
diff --git a/addons/website/i18n/cs.po b/addons/website/i18n/cs.po
index 5c390d2a6ff..b90e3b92b83 100644
--- a/addons/website/i18n/cs.po
+++ b/addons/website/i18n/cs.po
@@ -4778,7 +4778,7 @@ msgstr ""
#. module: website
#: model_terms:ir.ui.view,arch_db:website.res_config_settings_view_form
msgid "www.odoo.com"
-msgstr ""
+msgstr "www.odoo.com"
#. module: website
#: model_terms:ir.ui.view,arch_db:website.500
diff --git a/addons/website/i18n/km.po b/addons/website/i18n/km.po
index 6a8c385d6af..32b8677435b 100644
--- a/addons/website/i18n/km.po
+++ b/addons/website/i18n/km.po
@@ -1338,7 +1338,7 @@ msgstr ""
#. module: website
#: model_terms:ir.ui.view,arch_db:website.user_navbar
msgid "Customize"
-msgstr ""
+msgstr "អតិថិជន"
#. module: website
#: model_terms:ir.ui.view,arch_db:website.user_navbar
@@ -1627,7 +1627,7 @@ msgstr ""
#. module: website
#: model_terms:ir.ui.view,arch_db:website.s_features_grid
msgid "Duplicate"
-msgstr ""
+msgstr "ត្រួត"
#. module: website
#: model_terms:ir.ui.view,arch_db:website.s_features_grid
@@ -3194,7 +3194,7 @@ msgstr ""
#: code:addons/website/static/src/xml/website.seo.xml:143
#, python-format
msgid "Preview"
-msgstr ""
+msgstr "ពីមុន"
#. module: website
#. openerp-web
@@ -3400,7 +3400,7 @@ msgstr ""
#. module: website
#: model_terms:ir.ui.view,arch_db:website.s_tabs
msgid "Review"
-msgstr ""
+msgstr "ពិនិត្យឡើងវិញ"
#. module: website
#: model_terms:ir.ui.view,arch_db:website.snippet_options
diff --git a/addons/website/i18n/nl.po b/addons/website/i18n/nl.po
index 67a11e93fa4..cc8d6acfba2 100644
--- a/addons/website/i18n/nl.po
+++ b/addons/website/i18n/nl.po
@@ -1979,7 +1979,7 @@ msgstr "Volg al de"
#. module: website
#: model_terms:ir.ui.view,arch_db:website.res_config_settings_view_form
msgid "Follow your website traffic in Odoo."
-msgstr "Volg uw website trafiek in Odoo."
+msgstr "Volg uw website verkeer in Odoo."
#. module: website
#: model_terms:ir.ui.view,arch_db:website.theme_customize
diff --git a/addons/website/i18n/vi.po b/addons/website/i18n/vi.po
index ebc18f8d44f..37a6684b5b8 100644
--- a/addons/website/i18n/vi.po
+++ b/addons/website/i18n/vi.po
@@ -3194,7 +3194,7 @@ msgstr "Trình đơn cha"
#. module: website
#: model:ir.model.fields,field_description:website.field_website_menu__parent_path
msgid "Parent Path"
-msgstr ""
+msgstr "Parent Path"
#. module: website
#: model:ir.model.fields,help:website.field_website__partner_id
diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py
index e910b414551..98824e81839 100644
--- a/addons/website/models/ir_ui_view.py
+++ b/addons/website/models/ir_ui_view.py
@@ -219,8 +219,8 @@ class View(models.Model):
return most_specific_views
@api.model
- def _view_get_inherited_children(self, view, options):
- extensions = super(View, self)._view_get_inherited_children(view, options)
+ def _view_get_inherited_children(self, view):
+ extensions = super(View, self)._view_get_inherited_children(view)
return extensions.filter_duplicate()
@api.model
diff --git a/addons/website/models/website_redirect.py b/addons/website/models/website_redirect.py
index 511a006b8a7..a0fbda884b0 100644
--- a/addons/website/models/website_redirect.py
+++ b/addons/website/models/website_redirect.py
@@ -13,6 +13,6 @@ class WebsiteRedirect(models.Model):
redirect_type = fields.Selection([('301', 'Moved permanently (301)'), ('302', 'Moved temporarily (302)')], string='Redirection Type', required=True, default="301")
url_from = fields.Char('Redirect From', required=True)
url_to = fields.Char('Redirect To', required=True)
- website_id = fields.Many2one('website', 'Website')
+ website_id = fields.Many2one('website', 'Website', ondelete='cascade')
active = fields.Boolean(default=True)
sequence = fields.Integer()
diff --git a/addons/website/static/src/js/menu/edit.js b/addons/website/static/src/js/menu/edit.js
index a08ca136131..a601ae3fb8a 100644
--- a/addons/website/static/src/js/menu/edit.js
+++ b/addons/website/static/src/js/menu/edit.js
@@ -21,6 +21,7 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
custom_events: _.extend({}, websiteNavbarData.WebsiteNavbarActionWidget.custom_events || {}, {
content_will_be_destroyed: '_onContentWillBeDestroyed',
content_was_recreated: '_onContentWasRecreated',
+ snippet_will_be_cloned: '_onSnippetWillBeCloned',
snippet_cloned: '_onSnippetCloned',
snippet_dropped: '_onSnippetDropped',
edition_will_stopped: '_onEditionWillStop',
@@ -204,8 +205,21 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
this.editModeEnable = false;
},
/**
+ * Called when a snippet is about to be cloned in the page. Notifies the
+ * WebsiteRoot that is should destroy the animations for this snippet.
+ *
+ * @private
+ * @param {OdooEvent} ev
+ */
+ _onSnippetWillBeCloned: function (ev) {
+ this.trigger_up('animation_stop_demand', {
+ $target: ev.data.$target,
+ });
+ },
+ /**
* Called when a snippet is cloned in the page. Notifies the WebsiteRoot
- * that is should start the public widgets for this snippet.
+ * that is should start the public widgets for this snippet and the snippet it
+ * was cloned from.
*
* @private
* @param {OdooEvent} ev
@@ -215,6 +229,13 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
editableMode: true,
$target: ev.data.$target,
});
+ // TODO: remove in saas-12.5, undefined $origin will restart #wrapwrap
+ if (ev.data.$origin) {
+ this.trigger_up('widgets_start_request', {
+ editableMode: true,
+ $target: ev.data.$origin,
+ });
+ }
},
/**
* Called when a snippet is dropped in the page. Notifies the WebsiteRoot
diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py
index 0d24a2517ad..b8262bb11b8 100644
--- a/addons/website/tests/test_views.py
+++ b/addons/website/tests/test_views.py
@@ -610,6 +610,20 @@ class TestCowViewSaving(common.TransactionCase):
'arch': '<div position="inside">, sub ext</div>',
'key': 'II',
})
+
+ # B
+ # |
+ # I
+ # |
+ # II
+
+ # First, test that children of inactive children are not returned (not multiwebsite related)
+ self.inherit_view.active = False
+ views = View.get_related_views('B')
+ self.assertEqual(views.mapped('key'), ['B', 'I'], "As 'I' is inactive, 'II' (its own child) should not be returned.")
+ self.inherit_view.active = True
+
+ # Second, test multi-website
self.inherit_view.with_context(website_id=1).write({'name': 'Extension'}) # Trigger cow on hierarchy
View.create({
'name': 'II2',
diff --git a/addons/website_blog/i18n/km.po b/addons/website_blog/i18n/km.po
index a057aae8da8..efe44b535f0 100644
--- a/addons/website_blog/i18n/km.po
+++ b/addons/website_blog/i18n/km.po
@@ -471,7 +471,7 @@ msgstr "ឈ្មោះសំរាប់បង្ហាញ"
#. module: website_blog
#: model_terms:ir.ui.view,arch_db:website_blog.blog_edit_options
msgid "Duplicate"
-msgstr ""
+msgstr "ត្រួត"
#. module: website_blog
#: model_terms:blog.post,content:website_blog.blog_post_1
diff --git a/addons/website_crm/i18n/km.po b/addons/website_crm/i18n/km.po
index 83a6d9d5a22..48b97b24367 100644
--- a/addons/website_crm/i18n/km.po
+++ b/addons/website_crm/i18n/km.po
@@ -108,7 +108,7 @@ msgstr ""
#. module: website_crm
#: model_terms:ir.ui.view,arch_db:website_crm.res_config_settings_view_form
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: website_crm
#: model_terms:ir.ui.view,arch_db:website_crm.res_config_settings_view_form
diff --git a/addons/website_crm_partner_assign/i18n/km.po b/addons/website_crm_partner_assign/i18n/km.po
index e13b9fb62c1..8a204f09ff8 100644
--- a/addons/website_crm_partner_assign/i18n/km.po
+++ b/addons/website_crm_partner_assign/i18n/km.po
@@ -376,7 +376,7 @@ msgstr ""
#. module: website_crm_partner_assign
#: model:ir.model.fields,field_description:website_crm_partner_assign.field_crm_lead_forward_to_partner__body
msgid "Contents"
-msgstr ""
+msgstr "មាតិកា"
#. module: website_crm_partner_assign
#: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_opportunity
@@ -986,7 +986,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_lead
#: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.view_report_crm_partner_assign_filter
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: website_crm_partner_assign
#: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_lead
diff --git a/addons/website_customer/i18n/vi.po b/addons/website_customer/i18n/vi.po
index 288f833b753..c742269e447 100644
--- a/addons/website_customer/i18n/vi.po
+++ b/addons/website_customer/i18n/vi.po
@@ -124,6 +124,8 @@ msgid ""
"Manage contact tags to better classify them for tracking and analysis "
"purposes."
msgstr ""
+"Quản lý các từ khóa liên lạc để phân biệt tốt hơn các liên lạc cho mục đích "
+"theo dõi và phân tích."
#. module: website_customer
#: model_terms:ir.ui.view,arch_db:website_customer.index
diff --git a/addons/website_event/i18n/cs.po b/addons/website_event/i18n/cs.po
index 5960968308f..e8ab5fa9eef 100644
--- a/addons/website_event/i18n/cs.po
+++ b/addons/website_event/i18n/cs.po
@@ -83,6 +83,8 @@ msgid ""
"<i class=\"fa fa-flag fa-5x\"/>\n"
" Events from Your Country"
msgstr ""
+"<i class=\"fa fa-flag fa-5x\"/>\n"
+" Události z vaší země"
#. module: website_event
#: model_terms:ir.ui.view,arch_db:website_event.registration_complete
diff --git a/addons/website_event_track/i18n/ar.po b/addons/website_event_track/i18n/ar.po
index b208df87d3f..ff7e20db68a 100644
--- a/addons/website_event_track/i18n/ar.po
+++ b/addons/website_event_track/i18n/ar.po
@@ -481,7 +481,7 @@ msgstr ""
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track_stage__fold
msgid "Folded in Kanban"
-msgstr ""
+msgstr "مطوي في عرض كانبان"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__message_follower_ids
@@ -629,7 +629,7 @@ msgstr "متابع"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__is_published
msgid "Is published"
-msgstr ""
+msgstr "منشور"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__kanban_state
@@ -934,7 +934,7 @@ msgstr "غرفة"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__is_seo_optimized
msgid "SEO optimized"
-msgstr ""
+msgstr "تم تحسين محركات البحث"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_sponsor__sequence
@@ -1285,7 +1285,7 @@ msgstr ""
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__website_published
msgid "Visible on current website"
-msgstr ""
+msgstr "ظاهرة في الموقع الحالي"
#. module: website_event_track
#: model_terms:ir.ui.view,arch_db:website_event_track.event_track_proposal
@@ -1347,7 +1347,7 @@ msgstr "العنوان الدلالي بالموقع"
#. module: website_event_track
#: model:ir.model.fields,field_description:website_event_track.field_event_track__website_meta_og_img
msgid "Website opengraph image"
-msgstr ""
+msgstr "صورة الرسم البياني المفتوح للموقع"
#. module: website_event_track
#: model_terms:ir.ui.view,arch_db:website_event_track.event_track_proposal
@@ -1384,4 +1384,4 @@ msgstr "محادثات"
#: model_terms:ir.ui.view,arch_db:website_event_track.agenda
#: model_terms:ir.ui.view,arch_db:website_event_track.tracks
msgid "unpublished"
-msgstr ""
+msgstr "غير منشور"
diff --git a/addons/website_event_track/i18n/km.po b/addons/website_event_track/i18n/km.po
index a770f060b1b..4ea114a98c3 100644
--- a/addons/website_event_track/i18n/km.po
+++ b/addons/website_event_track/i18n/km.po
@@ -928,7 +928,7 @@ msgstr "លំដាប់"
#. module: website_event_track
#: model_terms:ir.ui.view,arch_db:website_event_track.view_event_track_search
msgid "Show all records which has next action date is before today"
-msgstr ""
+msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ"
#. module: website_event_track
#: model:event.sponsor.type,name:website_event_track.event_sponsor_type2
diff --git a/addons/website_form/static/src/js/website_form.js b/addons/website_form/static/src/js/website_form.js
index 2469372005c..4fdbf0fd2c1 100644
--- a/addons/website_form/static/src/js/website_form.js
+++ b/addons/website_form/static/src/js/website_form.js
@@ -57,7 +57,7 @@ odoo.define('website_form.animation', function (require) {
// Because, using t-att- inside form make it non-editable
var $values = $('[data-for=' + this.$target.attr('id') + ']');
if ($values.length) {
- var values = JSON.parse($values.data('values').replace(/'/g, '"'));
+ var values = JSON.parse($values.data('values').replace('False', '""').replace('None', '""').replace(/'/g, '"'));
var fields = _.pluck(this.$target.serializeArray(), 'name');
_.each(fields, function (field) {
if (_.has(values, field)) {
diff --git a/addons/website_form/static/src/js/website_form_editor.js b/addons/website_form/static/src/js/website_form_editor.js
index 5acaf0df0d6..74e62e0b7a7 100644
--- a/addons/website_form/static/src/js/website_form_editor.js
+++ b/addons/website_form/static/src/js/website_form_editor.js
@@ -10,6 +10,7 @@ odoo.define('website_form_editor', function (require) {
var FormEditorRegistry = require('website_form.form_editor_registry');
var options = require('web_editor.snippets.options');
var wUtils = require('website.utils');
+ var Wysiwyg = require('web_editor.wysiwyg');
var qweb = core.qweb;
@@ -442,7 +443,7 @@ odoo.define('website_form_editor', function (require) {
var self = this;
var select = this.$target.find('select');
select.hide();
- this.editable_select = $('<div id="editable_select" class="form-control o_website_form_input"/>');
+ this.editable_select = $('<div id="editable_select" class="form-control o_website_form_input" contenteditable="true"/>');
_.each(select.children(), function (option) {
self.editable_select.append(
$('<div id="' + $(option).attr('value') + '" class="o_website_form_select_item">' + $(option).text().trim() + '</div>')
@@ -493,6 +494,22 @@ odoo.define('website_form_editor', function (require) {
}
});
+ // allow breaking of form select items, to create new ones
+ Wysiwyg.include({
+ /**
+ * @override
+ */
+ _editorOptions: function () {
+ var options = this._super.apply(this, arguments);
+ var isUnbreakableNode = options.isUnbreakableNode;
+ options.isUnbreakableNode = function (node) {
+ var isSelItem = $(node).hasClass('o_website_form_select_item');
+ return isUnbreakableNode(node) && !isSelItem;
+ };
+ return options;
+ },
+ });
+
// Superclass for options that need to disable a button from the snippet overlay
var disable_overlay_button_option = options.Class.extend({
xmlDependencies: ['/website_form/static/src/xml/website_form_editor.xml'],
diff --git a/addons/website_gengo/i18n/ar.po b/addons/website_gengo/i18n/ar.po
index 59330193eee..c6f2a4a1f54 100644
--- a/addons/website_gengo/i18n/ar.po
+++ b/addons/website_gengo/i18n/ar.po
@@ -26,42 +26,42 @@ msgstr ""
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:144
#, python-format
msgid "- Enable if you using testing account"
-msgstr "- تمكين إذا كنت تستخدم حساب الاختبار"
+msgstr "- قم بتمكينه إذا كنت تستخدم حساب اختباري"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:138
#, python-format
msgid "- Jobs are Automatically Approved by Gengo."
-msgstr ""
+msgstr "- تتم الموافقة على الوظائف تلقائيًا من خلال Gengo."
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:118
#, python-format
msgid "1. Go To your"
-msgstr "1. اذهب إلى ل"
+msgstr "1. اذهب إلى"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:119
#, python-format
msgid "2. Then paste generated keys in given form"
-msgstr ""
+msgstr "2. ثم قم بلصق المفاتيح الناشئة في النموذج المعطى"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:29
#, python-format
msgid "Already translated content"
-msgstr "محتوى مترجم مسبقاً"
+msgstr "محتوى مترجم مسبقًا"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:137
#, python-format
msgid "Auto Approve Translation"
-msgstr "ترجمة تم الموافقة عليها تلقائياً"
+msgstr "قبول الترجمة تلقائيًا"
#. module: website_gengo
#. openerp-web
@@ -75,7 +75,7 @@ msgstr "ترجمة تلقائية"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:67
#, python-format
msgid "By Machine (Free)"
-msgstr "بواسطة آلة (مجانا)"
+msgstr "آلية (مجانية)"
#. module: website_gengo
#. openerp-web
@@ -102,21 +102,21 @@ msgstr "إقفال"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:23
#, python-format
msgid "Content to translate or you can post them to"
-msgstr ""
+msgstr "المحتوى المطلوب ترجمته أو يمكنك نشره هنا"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/js/website_gengo.js:88
#, python-format
msgid "Could not Post translation"
-msgstr ""
+msgstr "تعذّر نشر الترجمة"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/js/website_gengo.js:195
#, python-format
msgid "Could not submit ! Try Again"
-msgstr ""
+msgstr "تعذّر الإرسال! حاول مرة أخرى"
#. module: website_gengo
#. openerp-web
@@ -137,35 +137,35 @@ msgstr "لا تعرض مربع الحوار هذا مجدداً."
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:24
#, python-format
msgid "Gengo"
-msgstr ""
+msgstr "Gengo"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:114
#, python-format
msgid "Gengo API is not configured"
-msgstr ""
+msgstr "لم يتم إعداد واجهة برمجة تطبيق Gengo"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:94
#, python-format
msgid "Gengo Dashboard"
-msgstr ""
+msgstr "لوحة معلومات Gengo"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:94
#, python-format
msgid "Gengo Statistics"
-msgstr ""
+msgstr "إحصائيات Gengo"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:118
#, python-format
msgid "Gengo account"
-msgstr ""
+msgstr "حساب Gengo"
#. module: website_gengo
#. openerp-web
@@ -203,14 +203,14 @@ msgstr "لصق المفتاح الخاص هنا"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:125
#, python-format
msgid "Paste public key here"
-msgstr ""
+msgstr "لصق المفتاح العام هنا"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:75
#, python-format
msgid "Post"
-msgstr "تأجيل"
+msgstr "نشر"
#. module: website_gengo
#. openerp-web
@@ -224,7 +224,7 @@ msgstr "مفتاح خاص"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:69
#, python-format
msgid "Pro - $"
-msgstr ""
+msgstr "احترافية - $"
#. module: website_gengo
#. openerp-web
@@ -245,21 +245,21 @@ msgstr "تحديد الصلاحيات"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:62
#, python-format
msgid "Select Gengo Translation Service Level"
-msgstr ""
+msgstr "اختر مستوى خدمة ترجمة Gengo"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:68
#, python-format
msgid "Standard - $"
-msgstr ""
+msgstr "قياسية - $"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:117
#, python-format
msgid "Steps for configure Gengo"
-msgstr ""
+msgstr "خطوات إعداد Gengo"
#. module: website_gengo
#. openerp-web
@@ -287,28 +287,28 @@ msgstr "الكلمات المترجمة"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:6
#, python-format
msgid "Translation in Progress"
-msgstr "الترجمة في تقدم"
+msgstr "جاري الترجمة"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:26
#, python-format
msgid "Translation in process (Gengo)"
-msgstr ""
+msgstr "جاري الترجمة (من خلال Gengo)"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:89
#, python-format
msgid "Translator statistics for this page"
-msgstr "إحصاءات الترجمة لهذه الصفحة"
+msgstr "إحصائيات الترجمة لهذه الصفحة"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:70
#, python-format
msgid "Ultra - $"
-msgstr ""
+msgstr "فائقة - $"
#. module: website_gengo
#. openerp-web
@@ -322,14 +322,14 @@ msgstr "انتظر"
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:97
#, python-format
msgid "Words in progress"
-msgstr "كلمات قيد التقدم"
+msgstr "كلمات جاري العمل عليها"
#. module: website_gengo
#. openerp-web
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:96
#, python-format
msgid "Words posted for translate"
-msgstr "كلمات مرحلة للترجمة"
+msgstr "كلمات نُشرت للترجمة"
#. module: website_gengo
#. openerp-web
@@ -343,7 +343,7 @@ msgstr "أنت على وشك الدخول في وضع الترجمة."
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:118
#, python-format
msgid "and generate API Keys."
-msgstr ""
+msgstr "وإنشاء مفاتيح واجهة برمجة التطبيق."
#. module: website_gengo
#: model:ir.model,name:website_gengo.model_base_gengo_translations
@@ -362,4 +362,4 @@ msgstr "للترجمة."
#: code:addons/website_gengo/static/src/xml/website.gengo.xml:93
#, python-format
msgid "new words found on this page."
-msgstr "كلمات جديدة وجدت على هذه الصفحة."
+msgstr "كلمات جديدة وجدت في هذه الصفحة."
diff --git a/addons/website_livechat/i18n/ar.po b/addons/website_livechat/i18n/ar.po
index d2de193afab..d7bc5ea2653 100644
--- a/addons/website_livechat/i18n/ar.po
+++ b/addons/website_livechat/i18n/ar.po
@@ -3,19 +3,20 @@
# * website_livechat
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Martin Trigaux, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-02 10:06+0000\n"
-"PO-Revision-Date: 2018-10-02 10:06+0000\n"
-"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:34+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -53,7 +54,7 @@ msgstr "وصف القناة المعروضة على صفحة موقع الويب
#. module: website_livechat
#: model_terms:ir.ui.view,arch_db:website_livechat.channel_page
msgid "Happy face"
-msgstr ""
+msgstr "وجه سعيد"
#. module: website_livechat
#: model:website.menu,name:website_livechat.menu_livechat
@@ -85,19 +86,19 @@ msgstr "الاسم"
#. module: website_livechat
#: model_terms:ir.ui.view,arch_db:website_livechat.channel_page
msgid "Neutral face"
-msgstr ""
+msgstr "وجه محايد"
#. module: website_livechat
#. openerp-web
#: code:addons/website_livechat/static/src/js/website_livechat.editor.js:29
#, python-format
msgid "New Channel"
-msgstr ""
+msgstr "قناة جديدة"
#. module: website_livechat
#: model_terms:ir.ui.view,arch_db:website_livechat.channel_page
msgid "Sad face"
-msgstr ""
+msgstr "وجه حزين"
#. module: website_livechat
#: model_terms:ir.ui.view,arch_db:website_livechat.channel_page
diff --git a/addons/website_mail/i18n/km.po b/addons/website_mail/i18n/km.po
index 2a97fbea84c..68b73a5d688 100644
--- a/addons/website_mail/i18n/km.po
+++ b/addons/website_mail/i18n/km.po
@@ -42,7 +42,7 @@ msgstr ""
#: model:ir.model.fields,help:website_mail.field_mail_mail__description
#: model:ir.model.fields,help:website_mail.field_mail_message__description
msgid "Message description: either the subject, or the beginning of the body"
-msgstr ""
+msgstr "ការពិពណ៌នាសារ: ទាំងប្រធានបទឬការចាប់ផ្តើមនៃរាងកាយ"
#. module: website_mail
#. openerp-web
diff --git a/addons/website_mass_mailing/i18n/km.po b/addons/website_mass_mailing/i18n/km.po
index 3ceff6d0020..3b2e4e7a5e9 100644
--- a/addons/website_mass_mailing/i18n/km.po
+++ b/addons/website_mass_mailing/i18n/km.po
@@ -93,7 +93,7 @@ msgstr ""
#. module: website_mass_mailing
#: model:ir.model,name:website_mass_mailing.model_mail_mass_mailing_list
msgid "Mailing List"
-msgstr ""
+msgstr "តារាងសំបុត្រ"
#. module: website_mass_mailing
#. openerp-web
diff --git a/addons/website_partner/i18n/ar.po b/addons/website_partner/i18n/ar.po
index edbbb4d82e6..495498161aa 100644
--- a/addons/website_partner/i18n/ar.po
+++ b/addons/website_partner/i18n/ar.po
@@ -3,16 +3,17 @@
# * website_partner
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-18 09:49+0000\n"
-"PO-Revision-Date: 2018-09-18 09:49+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:35+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -29,13 +30,13 @@ msgstr "جهة الاتصال"
#: model:ir.model.fields,field_description:website_partner.field_res_partner__is_published
#: model:ir.model.fields,field_description:website_partner.field_res_users__is_published
msgid "Is published"
-msgstr ""
+msgstr "منشور"
#. module: website_partner
#: model:ir.model.fields,field_description:website_partner.field_res_partner__is_seo_optimized
#: model:ir.model.fields,field_description:website_partner.field_res_users__is_seo_optimized
msgid "SEO optimized"
-msgstr ""
+msgstr "تم تحسين محركات البحث"
#. module: website_partner
#: model_terms:ir.ui.view,arch_db:website_partner.partner_detail
@@ -52,7 +53,7 @@ msgstr "الرابط الكامل للوصول إلى المستند من خلا
#: model:ir.model.fields,field_description:website_partner.field_res_partner__website_published
#: model:ir.model.fields,field_description:website_partner.field_res_users__website_published
msgid "Visible on current website"
-msgstr ""
+msgstr "ظاهرة في الموقع الحالي"
#. module: website_partner
#: model:ir.model.fields,field_description:website_partner.field_res_partner__website_description
@@ -94,4 +95,4 @@ msgstr "العنوان الدلالي بالموقع"
#: model:ir.model.fields,field_description:website_partner.field_res_partner__website_meta_og_img
#: model:ir.model.fields,field_description:website_partner.field_res_users__website_meta_og_img
msgid "Website opengraph image"
-msgstr ""
+msgstr "صورة الرسم البياني المفتوح للموقع"
diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py
index c3b9ba54941..9bd3ee8e892 100644
--- a/addons/website_profile/controllers/main.py
+++ b/addons/website_profile/controllers/main.py
@@ -243,7 +243,6 @@ class WebsiteProfile(http.Controller):
Users = request.env['res.users']
where_query = Users._where_calc(domain)
- Users._apply_ir_rules(where_query, 'read')
from_clause, where_clause, where_clause_params = where_query.get_sql()
# we search on every user in the DB to get the real positioning (not the one inside the subset)
diff --git a/addons/website_rating/i18n/ar.po b/addons/website_rating/i18n/ar.po
index 4b70ac48bf1..09f10848c46 100644
--- a/addons/website_rating/i18n/ar.po
+++ b/addons/website_rating/i18n/ar.po
@@ -3,17 +3,18 @@
# * website_rating
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
# Shaima Safar <shaima.safar@open-inside.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-24 09:05+0000\n"
-"PO-Revision-Date: 2018-08-24 09:05+0000\n"
-"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n"
+"POT-Creation-Date: 2018-09-18 09:49+0000\n"
+"PO-Revision-Date: 2018-08-24 09:35+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -125,7 +126,7 @@ msgstr "التقييم"
#: code:addons/website_rating/static/src/xml/website_mail.xml:52
#, python-format
msgid "Remove selection"
-msgstr ""
+msgstr "إزالة المحدد"
#. module: website_rating
#. openerp-web
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 46fdba8813f..823011b0d03 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -374,9 +374,11 @@ class WebsiteSale(http.Controller):
@http.route(['/shop/pricelist'], type='http', auth="public", website=True, sitemap=False)
def pricelist(self, promo, **post):
redirect = post.get('r', '/shop/cart')
- pricelist = request.env['product.pricelist'].sudo().search([('code', '=', promo)], limit=1)
- if not pricelist or (pricelist and not request.website.is_pricelist_available(pricelist.id)):
- return request.redirect("%s?code_not_available=1" % redirect)
+ # empty promo code is used to reset/remove pricelist (see `sale_get_order()`)
+ if promo:
+ pricelist = request.env['product.pricelist'].sudo().search([('code', '=', promo)], limit=1)
+ if (not pricelist or (pricelist and not request.website.is_pricelist_available(pricelist.id))):
+ return request.redirect("%s?code_not_available=1" % redirect)
request.website.sale_get_order(code=promo)
return request.redirect(redirect)
@@ -712,6 +714,8 @@ class WebsiteSale(http.Controller):
if mode[1] == 'billing':
order.partner_id = partner_id
order.onchange_partner_id()
+ # This is the *only* thing that the front end user will see/edit anyway when choosing billing address
+ order.partner_invoice_id = partner_id
if not kw.get('use_same'):
kw['callback'] = kw.get('callback') or \
(not order.only_services and (mode[0] == 'edit' and '/shop/checkout' or '/shop/address'))
diff --git a/addons/website_sale/i18n/km.po b/addons/website_sale/i18n/km.po
index fe07bf80fee..bb5672725ba 100644
--- a/addons/website_sale/i18n/km.po
+++ b/addons/website_sale/i18n/km.po
@@ -579,7 +579,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:website_sale.confirmation
#: model_terms:ir.ui.view,arch_db:website_sale.payment
msgid "Billing"
-msgstr ""
+msgstr "ការចេញវិក្កយបត្រ"
#. module: website_sale
#: model_terms:ir.ui.view,arch_db:website_sale.checkout
@@ -1150,7 +1150,7 @@ msgstr ""
#. module: website_sale
#: model:ir.model.fields,field_description:website_sale.field_product_template__product_image_ids
msgid "Images"
-msgstr ""
+msgstr "រូបភាព"
#. module: website_sale
#: model:ir.model.fields,help:website_sale.field_res_config_settings__module_website_sale_stock
@@ -1182,7 +1182,7 @@ msgstr "វិកិយប័ត្រ"
#: model:ir.model.fields,field_description:website_sale.field_res_config_settings__module_account
#: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form
msgid "Invoicing"
-msgstr ""
+msgstr "វិយបត្រ"
#. module: website_sale
#: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form
@@ -1910,7 +1910,7 @@ msgstr ""
#. module: website_sale
#: model:ir.model,name:website_sale.model_crm_team
msgid "Sales Channels"
-msgstr ""
+msgstr "លក់"
#. module: website_sale
#: model:ir.model,name:website_sale.model_sale_order_line
@@ -1935,7 +1935,7 @@ msgstr ""
#: model:ir.model.fields,field_description:website_sale.field_website__salesteam_id
#: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form
msgid "Sales Team"
-msgstr ""
+msgstr "ក្រុមលក់"
#. module: website_sale
#: model:ir.model.fields,field_description:website_sale.field_res_config_settings__salesperson_id
diff --git a/addons/website_sale/security/website_sale.xml b/addons/website_sale/security/website_sale.xml
index b859c0e2d05..39bb153ca1b 100644
--- a/addons/website_sale/security/website_sale.xml
+++ b/addons/website_sale/security/website_sale.xml
@@ -23,6 +23,8 @@
<field name="perm_unlink" eval="False"/>
</record>
+ <!-- TODO: remove in master -->
+ <!-- TODO: remove in master -->
<record id="sales_team.group_sale_manager" model="res.groups">
<field name="implied_ids" eval="[(4, ref('website.group_website_publisher'))]"/>
</record>
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index 66aa33feb91..ca4a23d6418 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -403,6 +403,7 @@
</button>
<div class="collapse d-lg-block" id="wsale_products_attributes_collapse">
<form class="js_attributes mb-2" method="get">
+ <input t-if="category" type="hidden" name="category" t-att-value="category.id" />
<input type="hidden" name="search" t-att-value="search" />
<ul class="nav nav-pills flex-column">
<t t-foreach="attributes" t-as="a">
diff --git a/addons/website_sale_delivery/i18n/ar.po b/addons/website_sale_delivery/i18n/ar.po
index 9def04011b8..0f3b96d3c88 100644
--- a/addons/website_sale_delivery/i18n/ar.po
+++ b/addons/website_sale_delivery/i18n/ar.po
@@ -36,6 +36,8 @@ msgid ""
" This description will be copied to every Sales Order, Delivery Order and "
"Customer Invoice/Credit Note"
msgstr ""
+"وصف المنتج الذي تود إرفاقه لعملائك. سيتم نسخ هذا الوصف وإضافته لكل أمر بيع، "
+"وأمر تسليم، والفواتير أو أوامر الخصم الموجهة للعميل"
#. module: website_sale_delivery
#: model_terms:ir.ui.view,arch_db:website_sale_delivery.payment_delivery
@@ -50,7 +52,7 @@ msgstr "دولة"
#. module: website_sale_delivery
#: model_terms:ir.ui.view,arch_db:website_sale_delivery.res_config_settings_view_form
msgid "DHL Delivery Methods"
-msgstr ""
+msgstr "طرق تسليم DHL"
#. module: website_sale_delivery
#: model:ir.model.fields,field_description:website_sale_delivery.field_sale_order__amount_delivery
diff --git a/addons/website_sale_stock/i18n/ar.po b/addons/website_sale_stock/i18n/ar.po
index 40556c120bc..b7bf1917992 100644
--- a/addons/website_sale_stock/i18n/ar.po
+++ b/addons/website_sale_stock/i18n/ar.po
@@ -3,20 +3,21 @@
# * website_sale_stock
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# Mohammed Albasha <m.albasha.ma@gmail.com>, 2018
# Ghaith Gammar <g.gammar@saharaifs.net>, 2018
# Waleed Mohsen <mohsen.waleed@gmail.com>, 2018
# Martin Trigaux, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:18+0000\n"
-"PO-Revision-Date: 2018-09-21 13:18+0000\n"
-"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:35+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -28,30 +29,30 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:website_sale_stock.website_sale_stock_cart_lines
#: model_terms:ir.ui.view,arch_db:website_sale_stock.website_sale_stock_payment
msgid "<strong>Warning!</strong>"
-msgstr ""
+msgstr "<strong>تحذير!</strong>"
#. module: website_sale_stock
#: model:ir.model.fields,help:website_sale_stock.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
-msgstr ""
+msgstr "يضيف مؤشر لحالة توافر المخزون في صفحة المنتج على الموقع."
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.product_template_form_view_inherit_website_sale_stock
msgid "Availability"
-msgstr "متاح"
+msgstr "التوافر"
#. module: website_sale_stock
#: model:ir.model.fields,field_description:website_sale_stock.field_product_product__available_threshold
#: model:ir.model.fields,field_description:website_sale_stock.field_product_template__available_threshold
#: model:ir.model.fields,field_description:website_sale_stock.field_res_config_settings__available_threshold
msgid "Availability Threshold"
-msgstr ""
+msgstr "حد التوافر"
#. module: website_sale_stock
#: model:ir.model.fields,field_description:website_sale_stock.field_product_product__cart_qty
msgid "Cart Qty"
-msgstr ""
+msgstr "الكمية الموجودة في عربة التسوق"
#. module: website_sale_stock
#: model:ir.model,name:website_sale_stock.model_res_config_settings
@@ -62,12 +63,12 @@ msgstr "ضبط الإعدادات"
#: model:ir.model.fields,field_description:website_sale_stock.field_product_product__custom_message
#: model:ir.model.fields,field_description:website_sale_stock.field_product_template__custom_message
msgid "Custom Message"
-msgstr ""
+msgstr "رسالة مخصصة"
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form
msgid "Default Mode"
-msgstr ""
+msgstr "الوضع الافتراضي"
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form
@@ -75,18 +76,20 @@ msgid ""
"Default availability mode set on newly created storable products. This can "
"be changed at the product level."
msgstr ""
+"وضع التوافر الافتراضي للمنتجات المخزّنة المنشأة حديثًا. يمكن تغييره في مستوى"
+" المنتج."
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form
msgid "Default threshold"
-msgstr ""
+msgstr "الحد الافتراضي"
#. module: website_sale_stock
#. openerp-web
#: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:16
#, python-format
msgid "In stock"
-msgstr ""
+msgstr "في المخزون"
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form
@@ -98,14 +101,14 @@ msgstr "مخزون"
#: model:ir.model.fields,field_description:website_sale_stock.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
-msgstr ""
+msgstr "توافر المخزون"
#. module: website_sale_stock
#: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form
msgid ""
"Manage the inventory of your products and display their availability status "
"on the website."
-msgstr ""
+msgstr "إدارة مخزون منتجاتك وعرض حالة توافرهم على الموقع."
#. module: website_sale_stock
#: model:ir.model,name:website_sale_stock.model_product_product
@@ -125,31 +128,32 @@ msgstr "أمر البيع"
#. module: website_sale_stock
#: model:ir.model,name:website_sale_stock.model_sale_order_line
msgid "Sales Order Line"
-msgstr "سطر أمر المبيعات"
+msgstr "بند أمر البيع"
#. module: website_sale_stock
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
-msgstr ""
+msgstr "البيع بغض النظر عن المخزون"
#. module: website_sale_stock
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
+"عرض المخزون تحت حدٍ معين على الموقع ومنع البيع إن لم يكن المخزون كافيًا"
#. module: website_sale_stock
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
-msgstr ""
+msgstr "عرض المخزون على الموقع ومنع البيع إن لم يكن المخزون كافيًا"
#. module: website_sale_stock
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
-msgstr ""
+msgstr "عرض إشعارات حسب المنتج"
#. module: website_sale_stock
#: code:addons/website_sale_stock/models/sale_order.py:30
@@ -158,13 +162,14 @@ msgid ""
"Some products became unavailable and your cart has been updated. We're sorry"
" for the inconvenience."
msgstr ""
+"بعض المنتجات لم تعد متاحة، لذا قمنا بتحديث عربة تسوقكم. نعتذر على الإزعاج."
#. module: website_sale_stock
#. openerp-web
#: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:22
#, python-format
msgid "Temporarily out of stock"
-msgstr ""
+msgstr "نفذت الكمية مؤقتًا"
#. module: website_sale_stock
#: model:ir.model,name:website_sale_stock.model_stock_picking
@@ -192,20 +197,20 @@ msgstr "الموقع الإلكتروني"
#. module: website_sale_stock
#: model:ir.model.fields,help:website_sale_stock.field_stock_picking__website_id
msgid "Website this picking belongs to."
-msgstr ""
+msgstr "الموقع الذي تنتمي إليه عملية الاستلام هذه."
#. module: website_sale_stock
#. openerp-web
#: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:19
#, python-format
msgid "You already added"
-msgstr ""
+msgstr "قمت بالفعل بإضافة"
#. module: website_sale_stock
#: code:addons/website_sale_stock/models/sale_order.py:27
#, python-format
msgid "You ask for %s products but only %s is available"
-msgstr ""
+msgstr "لقد طلبت كمية %s من المنتج لكن المتوفر هو %s فقط"
#. module: website_sale_stock
#. openerp-web
@@ -220,11 +225,11 @@ msgstr "الكل"
#: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:14
#, python-format
msgid "available"
-msgstr ""
+msgstr "متاح"
#. module: website_sale_stock
#. openerp-web
#: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:20
#, python-format
msgid "in your cart."
-msgstr ""
+msgstr "في عربة تسوقك."
diff --git a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss
index fe6914d25f5..ce306a53b21 100644
--- a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss
+++ b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss
@@ -1,7 +1,7 @@
.o_wslides_fs_main {
@include o-position-absolute(0,0,0,0);
- z-index: 1040;
+ z-index: $zindex-dropdown - 1;
background-image: linear-gradient(120deg, $o-wslides-color-dark2, $o-wslides-color-dark3);
.o_wslides_slide_fs_header {
diff --git a/addons/website_twitter/i18n/ar.po b/addons/website_twitter/i18n/ar.po
index 4633ebb8ddc..d1e7eb965d5 100644
--- a/addons/website_twitter/i18n/ar.po
+++ b/addons/website_twitter/i18n/ar.po
@@ -3,21 +3,21 @@
# * website_twitter
#
# Translators:
-# Mustafa Rawi <mustafa@cubexco.com>, 2018
# Mustafa J. Kadhem <safi2266@gmail.com>, 2018
# Akram Alfusayal <akram_ma@hotmail.com>, 2018
# amrnegm <amrnegm.01@gmail.com>, 2018
# hoxhe Aits <hoxhe0@gmail.com>, 2018
-# Osoul <baruni@osoul.ly>, 2018
# Osama Ahmaro <osamaahmaro@gmail.com>, 2018
# Ali Alrehawi <alrehawi@hotmail.com>, 2018
+# Mustafa Rawi <mustafa@cubexco.com>, 2019
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-09-21 13:18+0000\n"
-"PO-Revision-Date: 2018-09-21 13:18+0000\n"
-"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:35+0000\n"
+"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\n"
"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,6 +31,8 @@ msgid ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Show me how to obtain the Twitter API key and Twitter API secret"
msgstr ""
+"<i class=\"fa fa-arrow-right\"/>\n"
+" أريني كيفية الحصول على مفتاح واجهة برمجة تطبيق تويتر ورمزها السري"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
@@ -38,38 +40,40 @@ msgid ""
"<span class=\"o_form_label\">Twitter Roller</span>\n"
" <span class=\"fa fa-lg fa-globe\" title=\"Values set here are website-specific.\" groups=\"website.group_multi_website\"/>"
msgstr ""
+"<span class=\"o_form_label\">Twitter Roller</span>\n"
+" <span class=\"fa fa-lg fa-globe\" title=\"القيم التي تعين هنا تحدد حسب الموقع.\" groups=\"website.group_multi_website\"/>"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "<strong>Callback URL: </strong>Leave blank"
-msgstr ""
+msgstr "<strong>رابط العودة: </strong>يُترك فارغًا"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "<strong>Description: </strong> Odoo Twitter Integration"
-msgstr ""
+msgstr "<strong>الوصف: </strong> ربط أودو بتويتر"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "<strong>Name: </strong> Odoo Twitter Integration"
-msgstr ""
+msgstr "<strong>الاسم: </strong> ربط أودو بتويتر"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "<strong>Website: </strong>"
-msgstr ""
+msgstr "<strong>الموقع: </strong>"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_api_key
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "API Key"
-msgstr "API Key"
+msgstr "مفتاح واجهة برمجة التطبيق"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_api_secret
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "API secret"
-msgstr ""
+msgstr "الرمز السري لواجهة برمجة التطبيق"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
@@ -77,6 +81,7 @@ msgid ""
"Accept terms of use and click on the Create your Twitter application button "
"at the bottom"
msgstr ""
+"قم بقبول شروط الاستخدام واضغط على زر إنشاء تطبيقك على تويتر الموجود بالأسفل"
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:16
@@ -85,6 +90,8 @@ msgid ""
"Authentication credentials were missing or incorrect. Maybe screen name "
"tweets are protected."
msgstr ""
+"بيانات الاعتماد المطلوبة للمصادقة مفقودة أو غير صحيحة. قد تكون التغريدات "
+"محمية."
#. module: website_twitter
#: model:ir.model,name:website_twitter.model_res_config_settings
@@ -97,11 +104,13 @@ msgid ""
"Copy/Paste Consumer Key (API Key) and Consumer Secret (API Secret) keys "
"below."
msgstr ""
+"قم بنسخ ولصق مفتاح المستهلك (مفتاح واجهة برمجة التطبيق) والرمز السري من "
+"الأسفل."
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "Create a new Twitter application on"
-msgstr "إنشاء تطبيق تويتر جديد على "
+msgstr "إنشاء تطبيق تويتر جديد على"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__create_uid
@@ -116,29 +125,29 @@ msgstr "أنشئ في"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__display_name
msgid "Display Name"
-msgstr "اسم العرض"
+msgstr "الاسم المعروض"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_screen_name
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "Favorites From"
-msgstr ""
+msgstr "المفضلات من"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website__twitter_screen_name
msgid "Get favorites from this screen name"
-msgstr "الحصول على مفضلات إسم الظهور هذا"
+msgstr "الحصول على مفضلات اسم الظهور هذا"
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:48
#, python-format
msgid "HTTP Error: Something is misconfigured"
-msgstr ""
+msgstr "خطأ HTTP: هناك مشكلة في الإعدادات"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "How to configure the Twitter API access"
-msgstr "كيفية إعداد وصول مفتاح واجهة برمجة التطبيق لتويتر"
+msgstr "كيفية إعداد وصول مفتاح واجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__id
@@ -149,7 +158,7 @@ msgstr "المعرف"
#: code:addons/website_twitter/models/res_config_settings.py:59
#, python-format
msgid "Internet connection refused"
-msgstr ""
+msgstr "الاتصال بالإنترنت مرفوض"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet____last_update
@@ -171,7 +180,7 @@ msgstr "آخر تحديث في"
#: code:addons/website_twitter/models/res_config_settings.py:62
#, python-format
msgid "Please double-check your Twitter API Key and Secret!"
-msgstr ""
+msgstr "برجاء مراجعة مفتاح واجهة برمجة تطبيق تويتر ورمزها السري!"
#. module: website_twitter
#: code:addons/website_twitter/controllers/main.py:27
@@ -180,7 +189,7 @@ msgid ""
"Please set a Twitter screen name to load favorites from, in the Website "
"Settings (it does not have to be yours)"
msgstr ""
-"الرجاء وضع إسم ظهور لتحميل مفضلاته في إعدادات موقع الإنترنت (ليس بالضرورة أن"
+"الرجاء وضع اسم ظهور لتحميل مفضلاته في إعدادات موقع الإنترنت (ليس بالضرورة أن"
" يكون اسم خاص بك)"
#. module: website_twitter
@@ -188,7 +197,8 @@ msgstr ""
#, python-format
msgid "Please set the Twitter API Key and Secret in the Website Settings."
msgstr ""
-"الرجاء وضع مفتاح واجهة برمجة التطبيق والسر لتويتر في إعدادات موقع الانترنت."
+"برجاء وضع مفتاح واجهة برمجة تطبيق تويتر ورمزها السري في إعدادات موقع "
+"الانترنت."
#. module: website_twitter
#. openerp-web
@@ -203,12 +213,12 @@ msgstr "إعادة تحميل"
msgid ""
"Request cannot be served due to the applications rate limit having been "
"exhausted for the resource."
-msgstr ""
+msgstr "لا يمكن تنفيذ الطلب نظرًا لاستنفاد حد معدل التطبيقات للمورد."
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__screen_name
msgid "Screen Name"
-msgstr "الاسم الذي سيظهر"
+msgstr "اسم الظهور"
#. module: website_twitter
#: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_screen_name
@@ -216,13 +226,13 @@ msgid ""
"Screen Name of the Twitter Account from which you want to load favorites.It "
"does not have to match the API Key/Secret."
msgstr ""
-"إسم الظهور لحساب تويتر الذي تريد تحميل مفضلاته لا يتطابق مع مفتاح واجهة "
-"برمجة التطبق / السر"
+"اسم ظهور حساب تويتر الذي تريد تحميل مفضلاته لا يتطابق مع مفتاح واجهة برمجة "
+"تطبيق تويتر أو الرمز السري لها."
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "Switch to the API Keys tab: <br/>"
-msgstr ""
+msgstr "الانتقال لتبويب مفاتيح واجهة برمجة التطبيق: <br/>"
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:21
@@ -230,6 +240,7 @@ msgstr ""
msgid ""
"The Twitter servers are up, but overloaded with requests. Try again later."
msgstr ""
+"سيرفرات تويتر تعمل، لكنها محملة بالكثير من الطلبات. حاول مرة أخرى لاحقًا."
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:22
@@ -238,6 +249,8 @@ msgid ""
"The Twitter servers are up, but the request could not be serviced due to "
"some failure within our stack. Try again later."
msgstr ""
+"سيرفرات تويتر تعمل، لكن تعذّر تنفيذ الطلب بسبب مشكلة في بياناتنا. حاول مرة "
+"أخرى لاحقًا."
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:17
@@ -246,6 +259,8 @@ msgid ""
"The request is understood, but it has been refused or access is not allowed."
" Please check your Twitter API Key and Secret."
msgstr ""
+"تم فهم الطلب، لكن تم رفضه أو قد يكون الوصول ممنوع. برجاء التحقق من كلمة سر "
+"واجهة برمجة تطبيق تويتر ورمزها السري."
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:15
@@ -254,12 +269,14 @@ msgid ""
"The request was invalid or cannot be otherwise served. Requests without "
"authentication are considered invalid and will yield this response."
msgstr ""
+"الطلب غير صالح أو مستحيل التنفيذ. تعتبر الطلبات غير صالحة إذا لم تتم "
+"المُصادقة عليها وينتج عنها هذه الرسالة."
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:14
#, python-format
msgid "There was no new data to return."
-msgstr ""
+msgstr "لا توجد بيانات حديثة لإعادتها."
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__tweet_id
@@ -274,37 +291,40 @@ msgstr "تغريدات"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "Twitter API Credentials"
-msgstr ""
+msgstr "بيانات اعتماد واجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,help:website_twitter.field_website__twitter_api_key
msgid "Twitter API Key"
-msgstr "واجهة برمجة التطبيق لتويتر"
+msgstr "واجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,help:website_twitter.field_website__twitter_api_secret
msgid "Twitter API Secret"
-msgstr "سر واجهة برمجة التطبيق لتويتر"
+msgstr "الرمز السري لواجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website__twitter_api_key
msgid "Twitter API key"
-msgstr "واجهة برمجة التطبيق لتويتر"
+msgstr "مفتاح واجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_api_key
msgid "Twitter API key you can get it from https://apps.twitter.com/"
msgstr ""
+"يمكنك الحصول على مفتاح واجهة برمجة تطبيق تويتر من https://apps.twitter.com/"
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_website__twitter_api_secret
msgid "Twitter API secret"
-msgstr "سر واجهة برمجة التطبيق لتويتر"
+msgstr "الرمز السري لواجهة برمجة تطبيق تويتر"
#. module: website_twitter
#: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_api_secret
msgid "Twitter API secret you can get it from https://apps.twitter.com/"
msgstr ""
+"يمكنك الحصول على الرمز السري لواجهة برمجة تطبيق تويتر من "
+"https://apps.twitter.com/"
#. module: website_twitter
#. openerp-web
@@ -323,7 +343,7 @@ msgstr "خطأ مصادقة تويتر!"
#: code:addons/website_twitter/models/res_config_settings.py:20
#, python-format
msgid "Twitter is down or being upgraded."
-msgstr ""
+msgstr "تويتر معطل أو جاري تحديثه."
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:19
@@ -332,16 +352,18 @@ msgid ""
"Twitter seems broken. Please retry later. You may consider posting an issue "
"on Twitter forums to get help."
msgstr ""
+"يبدو أن تويتر معطل. برجاء المحاولة مرة أخرى لاحقًا. ربما عليك كتابة منشور عن"
+" مشكلتك على منتديات تويتر للحصول على المساعدة."
#. module: website_twitter
#: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_server_uri
msgid "Twitter server uri"
-msgstr ""
+msgstr "سيرفر uri الخاص بتويتر"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "Twitter tutorial"
-msgstr ""
+msgstr "درس تدريبي عن تويتر"
#. module: website_twitter
#: code:addons/website_twitter/controllers/main.py:37
@@ -351,28 +373,28 @@ msgid ""
" or choose a different screen name."
msgstr ""
"مستخدم تويتر @%(username)s لديه أقل من 12 تغريدة مفضلة. الرجاء إضافة المزيد "
-"أو إختيار إسم ظهور مختلف."
+"أو إختيار اسم ظهور مختلف."
#. module: website_twitter
#. openerp-web
#: code:addons/website_twitter/static/src/xml/website.twitter.xml:6
#, python-format
msgid "Twitter's user"
-msgstr ""
+msgstr "مستخدم تويتر"
#. module: website_twitter
#: model:ir.actions.server,name:website_twitter.ir_cron_twitter_actions_ir_actions_server
#: model:ir.cron,cron_name:website_twitter.ir_cron_twitter_actions
#: model:ir.cron,name:website_twitter.ir_cron_twitter_actions
msgid "Twitter: Fetch new favorites"
-msgstr ""
+msgstr "تويتر: البحث عن مفضلات جديدة"
#. module: website_twitter
#: code:addons/website_twitter/models/res_config_settings.py:58
#: code:addons/website_twitter/models/res_config_settings.py:59
#, python-format
msgid "We failed to reach a twitter server."
-msgstr ""
+msgstr "تعذّر الوصول لسيرفر تويتر."
#. module: website_twitter
#: model:ir.model,name:website_twitter.model_website
@@ -383,12 +405,7 @@ msgstr "الموقع الإلكتروني"
#. module: website_twitter
#: model:ir.model,name:website_twitter.model_website_twitter_tweet
msgid "Website Twitter"
-msgstr ""
-
-#. module: website_twitter
-#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
-msgid "api_key.png"
-msgstr ""
+msgstr "موقع تويتر"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
@@ -398,4 +415,4 @@ msgstr "https://apps.twitter.com/app/new"
#. module: website_twitter
#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form
msgid "with the following values:"
-msgstr "مع القيم التالية:"
+msgstr "بالقيم التالية:"