summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2018-05-29 17:34:43 +0200
committerChristophe Simonis <chs@odoo.com>2018-05-29 17:34:43 +0200
commitf36e6917bd73a56dc0c7468b4849920df4088154 (patch)
treeb63d02ae3e5ffc0815de009407363e0cf906f547
parentbc0173c2d58ac26d80cb2f483a95c0c13b047dab (diff)
parent37eed7c509fb5846c89ef37046df4b3cab299719 (diff)
[MERGE] forward port branch saas-11.3 up to 37eed7c509f
-rw-r--r--addons/account/i18n/de.po44
-rw-r--r--addons/account/i18n/es.po61
-rw-r--r--addons/account/i18n/fr.po65
-rw-r--r--addons/account/i18n/hu.po6
-rw-r--r--addons/account/i18n/ru.po55
-rw-r--r--addons/account/i18n/tr.po6
-rw-r--r--addons/account/models/account.py2
-rw-r--r--addons/account/models/account_invoice.py3
-rw-r--r--addons/account/models/account_move.py15
-rw-r--r--addons/account/models/account_payment.py5
-rw-r--r--addons/account/models/partner.py9
-rw-r--r--addons/account/static/src/js/reconciliation/reconciliation_model.js5
-rw-r--r--addons/account/tests/test_reconciliation.py48
-rw-r--r--addons/account/views/account_portal_templates.xml8
-rw-r--r--addons/account/views/partner_view.xml2
-rw-r--r--addons/account/wizard/wizard_tax_adjustments.py2
-rw-r--r--addons/account_check_printing/i18n/nl.po4
-rw-r--r--addons/account_check_printing/models/account_payment.py2
-rw-r--r--addons/account_invoicing/i18n/ru.po8
-rw-r--r--addons/account_payment/i18n/zh_CN.po5
-rw-r--r--addons/account_payment/views/account_portal_templates.xml2
-rw-r--r--addons/account_voucher/i18n/nl.po4
-rw-r--r--addons/analytic/i18n/nl.po6
-rw-r--r--addons/analytic/i18n/tr.po7
-rw-r--r--addons/analytic/models/analytic_account.py36
-rw-r--r--addons/anonymization/i18n/nl.po2
-rw-r--r--addons/anonymization/i18n/tr.po5
-rw-r--r--addons/auth_signup/controllers/main.py1
-rw-r--r--addons/auth_signup/data/auth_signup_data.xml1
-rw-r--r--addons/auth_signup/i18n/af.po1
-rw-r--r--addons/auth_signup/i18n/am.po1
-rw-r--r--addons/auth_signup/i18n/ar.po1
-rw-r--r--addons/auth_signup/i18n/auth_signup.pot1
-rw-r--r--addons/auth_signup/i18n/bg.po1
-rw-r--r--addons/auth_signup/i18n/bs.po1
-rw-r--r--addons/auth_signup/i18n/ca.po1
-rw-r--r--addons/auth_signup/i18n/cs.po1
-rw-r--r--addons/auth_signup/i18n/da.po1
-rw-r--r--addons/auth_signup/i18n/de.po1
-rw-r--r--addons/auth_signup/i18n/el.po2
-rw-r--r--addons/auth_signup/i18n/en_GB.po1
-rw-r--r--addons/auth_signup/i18n/es.po1
-rw-r--r--addons/auth_signup/i18n/es_AR.po1
-rw-r--r--addons/auth_signup/i18n/es_BO.po1
-rw-r--r--addons/auth_signup/i18n/es_CL.po1
-rw-r--r--addons/auth_signup/i18n/es_CO.po1
-rw-r--r--addons/auth_signup/i18n/es_CR.po1
-rw-r--r--addons/auth_signup/i18n/es_DO.po1
-rw-r--r--addons/auth_signup/i18n/es_EC.po1
-rw-r--r--addons/auth_signup/i18n/es_PE.po1
-rw-r--r--addons/auth_signup/i18n/es_PY.po1
-rw-r--r--addons/auth_signup/i18n/es_VE.po1
-rw-r--r--addons/auth_signup/i18n/et.po1
-rw-r--r--addons/auth_signup/i18n/eu.po1
-rw-r--r--addons/auth_signup/i18n/fa.po1
-rw-r--r--addons/auth_signup/i18n/fi.po1
-rw-r--r--addons/auth_signup/i18n/fo.po1
-rw-r--r--addons/auth_signup/i18n/fr.po1
-rw-r--r--addons/auth_signup/i18n/fr_CA.po1
-rw-r--r--addons/auth_signup/i18n/gl.po1
-rw-r--r--addons/auth_signup/i18n/he.po1
-rw-r--r--addons/auth_signup/i18n/hr.po1
-rw-r--r--addons/auth_signup/i18n/hu.po1
-rw-r--r--addons/auth_signup/i18n/id.po1
-rw-r--r--addons/auth_signup/i18n/it.po1
-rw-r--r--addons/auth_signup/i18n/ja.po1
-rw-r--r--addons/auth_signup/i18n/ka.po1
-rw-r--r--addons/auth_signup/i18n/kab.po1
-rw-r--r--addons/auth_signup/i18n/ko.po1
-rw-r--r--addons/auth_signup/i18n/lo.po1
-rw-r--r--addons/auth_signup/i18n/lt.po1
-rw-r--r--addons/auth_signup/i18n/lv.po1
-rw-r--r--addons/auth_signup/i18n/mk.po1
-rw-r--r--addons/auth_signup/i18n/mn.po1
-rw-r--r--addons/auth_signup/i18n/nb.po1
-rw-r--r--addons/auth_signup/i18n/ne.po1
-rw-r--r--addons/auth_signup/i18n/nl.po2
-rw-r--r--addons/auth_signup/i18n/nl_BE.po1
-rw-r--r--addons/auth_signup/i18n/pl.po1
-rw-r--r--addons/auth_signup/i18n/pt.po1
-rw-r--r--addons/auth_signup/i18n/pt_BR.po2
-rw-r--r--addons/auth_signup/i18n/ro.po1
-rw-r--r--addons/auth_signup/i18n/ru.po1
-rw-r--r--addons/auth_signup/i18n/sk.po1
-rw-r--r--addons/auth_signup/i18n/sl.po1
-rw-r--r--addons/auth_signup/i18n/sq.po1
-rw-r--r--addons/auth_signup/i18n/sr.po1
-rw-r--r--addons/auth_signup/i18n/sr@latin.po1
-rw-r--r--addons/auth_signup/i18n/sv.po1
-rw-r--r--addons/auth_signup/i18n/th.po1
-rw-r--r--addons/auth_signup/i18n/tr.po1
-rw-r--r--addons/auth_signup/i18n/uk.po1
-rw-r--r--addons/auth_signup/i18n/vi.po1
-rw-r--r--addons/auth_signup/i18n/zh_CN.po1
-rw-r--r--addons/auth_signup/i18n/zh_TW.po1
-rw-r--r--addons/auth_signup/models/res_partner.py1
-rw-r--r--addons/barcodes/i18n/tr.po6
-rw-r--r--addons/barcodes/static/src/js/barcode_events.js6
-rw-r--r--addons/base_import/i18n/nl.po2
-rw-r--r--addons/base_vat_autocomplete/models/res_partner.py8
-rw-r--r--addons/base_vat_autocomplete/views/res_company_view.xml2
-rw-r--r--addons/board/static/src/js/favorite_menu.js6
-rw-r--r--addons/board/static/tests/dashboard_tests.js90
-rw-r--r--addons/calendar/models/calendar.py15
-rw-r--r--addons/calendar/views/calendar_views.xml1
-rw-r--r--addons/crm/i18n/fr.po2
-rw-r--r--addons/crm/i18n/nl.po8
-rw-r--r--addons/delivery/i18n/nl.po2
-rw-r--r--addons/delivery/i18n/tr.po2
-rw-r--r--addons/delivery/i18n/zh_CN.po7
-rw-r--r--addons/delivery/models/sale_order.py3
-rw-r--r--addons/delivery/models/stock_picking.py2
-rw-r--r--addons/delivery/tests/test_delivery_cost.py5
-rw-r--r--addons/event/models/event.py5
-rw-r--r--addons/event/models/event_mail.py50
-rw-r--r--addons/event/security/ir.model.access.csv2
-rw-r--r--addons/event_sale/models/sale_order.py2
-rw-r--r--addons/fleet/i18n/nl.po4
-rw-r--r--addons/gamification/i18n/nl.po4
-rw-r--r--addons/gamification/models/goal.py2
-rw-r--r--addons/gamification_sale_crm/i18n/ru.po13
-rw-r--r--addons/hr/i18n/ru.po34
-rw-r--r--addons/hr_attendance/models/hr_employee.py3
-rw-r--r--addons/hr_attendance/static/src/js/kiosk_mode.js10
-rw-r--r--addons/hr_contract/i18n/ru.po21
-rw-r--r--addons/hr_expense/data/hr_expense_data.xml15
-rw-r--r--addons/hr_expense/data/hr_expense_demo.xml4
-rw-r--r--addons/hr_expense/i18n/hu.po2
-rw-r--r--addons/hr_expense/i18n/nl.po6
-rw-r--r--addons/hr_expense/i18n/zh_CN.po2
-rw-r--r--addons/hr_expense/models/hr_expense.py3
-rw-r--r--addons/hr_gamification/i18n/ru.po5
-rw-r--r--addons/hr_holidays/i18n/nl.po8
-rw-r--r--addons/hr_holidays/i18n/ru.po34
-rw-r--r--addons/hr_holidays/models/hr_leave.py8
-rw-r--r--addons/hr_holidays/report/hr_leave_reports.xml4
-rw-r--r--addons/hr_payroll/i18n/de.po2
-rw-r--r--addons/hr_payroll/i18n/ru.po14
-rw-r--r--addons/hr_timesheet/i18n/nl.po2
-rw-r--r--addons/hr_timesheet/i18n/ru.po23
-rw-r--r--addons/hr_timesheet/models/hr_timesheet.py1
-rw-r--r--addons/hr_timesheet/models/project.py6
-rw-r--r--addons/http_routing/geoipresolver.py8
-rw-r--r--addons/iap/__manifest__.py2
-rw-r--r--addons/iap/i18n/tr.po5
-rw-r--r--addons/l10n_be/i18n_extra/nl_BE.po453
-rw-r--r--addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py2
-rw-r--r--addons/l10n_co/__manifest__.py7
-rw-r--r--addons/l10n_cr/data/l10n_cr_state_data.xml14
-rw-r--r--addons/l10n_do/models/chart_template.py43
-rw-r--r--addons/l10n_es/__manifest__.py1
-rw-r--r--addons/l10n_es/data/account_fiscal_position_template_data.xml32
-rw-r--r--addons/l10n_es/data/account_tax_data.xml13
-rw-r--r--addons/l10n_fr_certification/data/account_move.xml2
-rw-r--r--addons/l10n_fr_pos_cert/data/pos_inalterability.xml1
-rw-r--r--addons/l10n_multilang/models/l10n_multilang.py16
-rw-r--r--addons/mail/controllers/bus.py2
-rw-r--r--addons/mail/models/ir_model.py6
-rw-r--r--addons/mail/models/mail_activity.py5
-rw-r--r--addons/mail/models/mail_message.py11
-rw-r--r--addons/mail/models/mail_thread.py25
-rw-r--r--addons/mail/models/res_users.py13
-rw-r--r--addons/mail/static/src/js/activity.js2
-rw-r--r--addons/mail/static/src/js/chat_window.js6
-rw-r--r--addons/mail/static/src/js/chatter.js4
-rw-r--r--addons/mail/static/src/js/chatter_composer.js3
-rw-r--r--addons/mail/static/src/js/composer.js262
-rw-r--r--addons/mail/static/src/js/discuss.js1
-rw-r--r--addons/mail/static/src/js/document_viewer.js16
-rw-r--r--addons/mail/static/src/js/services/chat_manager.js10
-rw-r--r--addons/mail/static/src/js/thread.js1
-rw-r--r--addons/mail/static/src/scss/composer.scss91
-rw-r--r--addons/mail/static/src/scss/extended_chat_window.scss8
-rw-r--r--addons/mail/static/src/xml/composer.xml12
-rw-r--r--addons/mail/static/src/xml/thread.xml2
-rw-r--r--addons/mail/static/tests/chat_window_tests.js78
-rw-r--r--addons/mail/static/tests/chatter_tests.js19
-rw-r--r--addons/mail/static/tests/discuss_tests.js9
-rw-r--r--addons/maintenance/i18n/nl.po2
-rw-r--r--addons/mass_mailing/i18n/tr.po2
-rw-r--r--addons/mass_mailing/models/mass_mailing.py1
-rw-r--r--addons/mrp/i18n/de.po2
-rw-r--r--addons/mrp/i18n/nl.po2
-rw-r--r--addons/mrp/models/mrp_production.py10
-rw-r--r--addons/mrp/models/mrp_workorder.py30
-rw-r--r--addons/mrp/views/product_views.xml7
-rw-r--r--addons/mrp/wizard/mrp_product_produce.py7
-rw-r--r--addons/note/__manifest__.py1
-rw-r--r--addons/note/data/note_data.xml16
-rw-r--r--addons/note/data/note_demo.xml24
-rw-r--r--addons/note/data/res_users_data.xml9
-rw-r--r--addons/note/models/res_users.py42
-rw-r--r--addons/note/views/note_views.xml4
-rw-r--r--addons/payment/controllers/portal.py4
-rw-r--r--addons/payment/i18n/de.po6
-rw-r--r--addons/payment/i18n/nl.po6
-rw-r--r--addons/payment/i18n/tr.po5
-rw-r--r--addons/payment/models/chart_template.py2
-rw-r--r--addons/payment/models/payment_acquirer.py7
-rw-r--r--addons/payment/views/payment_views.xml2
-rw-r--r--addons/payment_adyen/models/payment.py3
-rw-r--r--addons/payment_authorize/i18n/de.po4
-rw-r--r--addons/payment_ogone/i18n/tr.po5
-rw-r--r--addons/payment_ogone/models/payment.py2
-rw-r--r--addons/payment_sips/models/payment.py11
-rw-r--r--addons/payment_transfer/models/payment.py6
-rw-r--r--addons/point_of_sale/i18n/nl.po4
-rw-r--r--addons/point_of_sale/i18n/tr.po2
-rw-r--r--addons/point_of_sale/models/pos_order.py2
-rw-r--r--addons/point_of_sale/models/product.py5
-rw-r--r--addons/point_of_sale/static/src/js/models.js5
-rw-r--r--addons/point_of_sale/static/src/js/screens.js8
-rw-r--r--addons/point_of_sale/views/product_view.xml2
-rw-r--r--addons/point_of_sale/views/report_saledetails.xml3
-rw-r--r--addons/portal/i18n/tr.po5
-rw-r--r--addons/portal/static/src/scss/portal.scss71
-rw-r--r--addons/portal/views/portal_templates.xml147
-rw-r--r--addons/pos_cache/i18n/de.po36
-rw-r--r--addons/pos_mercury/i18n/nl.po2
-rw-r--r--addons/pos_mercury/static/src/js/pos_mercury.js1
-rw-r--r--addons/pos_restaurant/i18n/nl.po2
-rw-r--r--addons/pos_sale/i18n/tr.po5
-rw-r--r--addons/product/i18n/tr.po16
-rw-r--r--addons/product/models/product.py11
-rw-r--r--addons/product/tests/test_variants.py9
-rw-r--r--addons/product_expiry/i18n/tr.po12
-rw-r--r--addons/project/i18n/nl.po2
-rw-r--r--addons/project/i18n/project.pot6
-rw-r--r--addons/project/i18n/tr.po56
-rw-r--r--addons/project/models/project.py26
-rw-r--r--addons/project/views/project_portal_templates.xml14
-rw-r--r--addons/project/views/project_views.xml14
-rw-r--r--addons/project_timesheet_holidays/i18n/tr.po58
-rw-r--r--addons/purchase/i18n/fr.po46
-rw-r--r--addons/purchase/i18n/tr.po35
-rw-r--r--addons/purchase/models/purchase.py1
-rw-r--r--addons/purchase/report/purchase_report.py2
-rw-r--r--addons/purchase/views/portal_templates.xml9
-rw-r--r--addons/purchase/views/purchase_views.xml2
-rw-r--r--addons/purchase_requisition/i18n/ru.po2
-rw-r--r--addons/purchase_requisition/i18n/tr.po37
-rw-r--r--addons/purchase_stock/models/account_invoice.py47
-rw-r--r--addons/purchase_stock/models/procurement.py6
-rw-r--r--addons/purchase_stock/models/purchase.py2
-rw-r--r--addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py43
-rw-r--r--addons/purchase_stock/tests/test_stockvaluation.py144
-rw-r--r--addons/rating/i18n/nl.po2
-rw-r--r--addons/rating/i18n/tr.po7
-rw-r--r--addons/resource/i18n/tr.po37
-rw-r--r--addons/sale/i18n/es.po4
-rw-r--r--addons/sale/i18n/nl.po5
-rw-r--r--addons/sale/i18n/tr.po12
-rw-r--r--addons/sale/models/sale.py20
-rw-r--r--addons/sale/report/report_all_channels_sales.py1
-rw-r--r--addons/sale/views/sale_portal_templates.xml12
-rw-r--r--addons/sale/views/sale_views.xml2
-rw-r--r--addons/sale/wizard/sale_make_invoice_advance.py1
-rw-r--r--addons/sale_crm/i18n/tr.po29
-rw-r--r--addons/sale_payment/i18n/tr.po8
-rw-r--r--addons/sale_payment/models/payment.py1
-rw-r--r--addons/sale_stock/i18n/nl.po2
-rw-r--r--addons/sale_stock/i18n/tr.po6
-rw-r--r--addons/sale_timesheet/controllers/main.py15
-rw-r--r--addons/sale_timesheet/i18n/tr.po11
-rw-r--r--addons/sale_timesheet/models/project.py2
-rw-r--r--addons/sale_timesheet/models/sale_order.py26
-rw-r--r--addons/sale_timesheet/tests/test_timesheet_revenue.py5
-rw-r--r--addons/sale_timesheet/views/project_task_views.xml2
-rw-r--r--addons/sale_timesheet/views/sale_order_views.xml2
-rw-r--r--addons/sales_team/i18n/tr.po31
-rw-r--r--addons/stock/data/stock_data.xml5
-rw-r--r--addons/stock/i18n/de.po14
-rw-r--r--addons/stock/i18n/fr.po3
-rw-r--r--addons/stock/i18n/nl.po6
-rw-r--r--addons/stock/i18n/tr.po317
-rw-r--r--addons/stock/models/procurement.py2
-rw-r--r--addons/stock/models/product.py9
-rw-r--r--addons/stock/models/res_company.py10
-rw-r--r--addons/stock/models/stock_move.py56
-rw-r--r--addons/stock/models/stock_quant.py63
-rw-r--r--addons/stock/models/stock_traceability.py32
-rw-r--r--addons/stock/models/stock_warehouse.py27
-rw-r--r--addons/stock/report/report_stockpicking_operations.xml4
-rw-r--r--addons/stock/tests/test_move.py267
-rw-r--r--addons/stock/tests/test_move2.py33
-rw-r--r--addons/stock/tests/test_quant.py47
-rw-r--r--addons/stock/views/product_views.xml2
-rw-r--r--addons/stock_account/i18n/tr.po41
-rw-r--r--addons/stock_account/models/stock.py27
-rw-r--r--addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py11
-rw-r--r--addons/stock_account/tests/test_stockvaluation.py33
-rw-r--r--addons/stock_landed_costs/i18n/tr.po18
-rw-r--r--addons/stock_picking_batch/i18n/tr.po15
-rw-r--r--addons/survey/i18n/fr.po2
-rw-r--r--addons/survey/i18n/tr.po60
-rw-r--r--addons/test_mail/data/test_mail_data.py385
-rw-r--r--addons/test_mail/tests/test_mail_gateway.py14
-rw-r--r--addons/utm/i18n/nl.po2
-rw-r--r--addons/utm/i18n/tr.po13
-rw-r--r--addons/web/controllers/main.py10
-rw-r--r--addons/web/i18n/nl.po2
-rw-r--r--addons/web/i18n/tr.po154
-rw-r--r--addons/web/static/src/js/chrome/action_manager.js10
-rw-r--r--addons/web/static/src/js/chrome/keyboard_navigation_mixin.js22
-rw-r--r--addons/web/static/src/js/core/ajax.js16
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js2
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js9
-rw-r--r--addons/web/static/src/js/views/abstract_controller.js7
-rw-r--r--addons/web/static/src/js/views/abstract_renderer.js5
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js109
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js7
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_view.js16
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js10
-rw-r--r--addons/web/static/src/js/views/form/form_view.js8
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_model.js9
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_record.js30
-rw-r--r--addons/web/static/src/js/views/list/list_editable_renderer.js7
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_model.js6
-rw-r--r--addons/web/static/src/scss/list_view.scss8
-rw-r--r--addons/web/static/tests/chrome/action_manager_tests.js63
-rw-r--r--addons/web/static/tests/chrome/keyboard_navigation_mixin_tests.js31
-rw-r--r--addons/web/static/tests/core/pyeval_tests.js2
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js310
-rw-r--r--addons/web/static/tests/helpers/mock_server.js6
-rw-r--r--addons/web/static/tests/helpers/test_utils.js48
-rw-r--r--addons/web/static/tests/views/calendar_tests.js95
-rw-r--r--addons/web/static/tests/views/graph_tests.js16
-rw-r--r--addons/web/static/tests/views/kanban_tests.js156
-rw-r--r--addons/web/static/tests/views/list_tests.js43
-rw-r--r--addons/web/static/tests/views/pivot_tests.js33
-rw-r--r--addons/web/tests/test_js.py4
-rw-r--r--addons/web/views/webclient_templates.xml1
-rw-r--r--addons/web_diagram/i18n/tr.po17
-rw-r--r--addons/web_editor/i18n/tr.po274
-rw-r--r--addons/web_editor/static/lib/summernote/src/js/EventHandler.js3
-rw-r--r--addons/web_editor/static/lib/summernote/src/js/module/Clipboard.js287
-rw-r--r--addons/web_editor/static/src/js/backend/fields.js4
-rw-r--r--addons/web_editor/static/src/js/editor/rte.js8
-rw-r--r--addons/web_editor/static/src/js/editor/rte.summernote.js4
-rw-r--r--addons/web_editor/static/src/js/editor/transcoder.js40
-rw-r--r--addons/web_editor/static/src/js/widgets/widgets.js4
-rw-r--r--addons/website/models/website.py3
-rw-r--r--addons/website/views/website_templates.xml2
-rw-r--r--addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml16
-rw-r--r--addons/website_event/controllers/main.py8
-rw-r--r--addons/website_event/static/src/js/website_event.js4
-rw-r--r--addons/website_event/views/event_templates.xml4
-rw-r--r--addons/website_event_sale/controllers/main.py2
-rw-r--r--addons/website_form/controllers/main.py1
-rw-r--r--addons/website_forum/static/src/js/website_forum.js9
-rw-r--r--addons/website_forum/static/src/scss/website_forum.scss3
-rw-r--r--addons/website_forum/views/website_forum.xml11
-rw-r--r--addons/website_quote/controllers/main.py9
-rw-r--r--addons/website_sale/controllers/main.py9
-rw-r--r--addons/website_sale/models/res_partner.py2
-rw-r--r--addons/website_sale/models/website.py7
-rw-r--r--addons/website_sale/static/src/js/website_sale_tour_buy.js2
-rw-r--r--addons/website_sale/views/sale_order_views.xml2
-rw-r--r--addons/website_sale/views/templates.xml4
-rw-r--r--addons/website_sale_comparison/static/src/js/website_sale_comparison.js3
-rw-r--r--addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss4
-rw-r--r--addons/website_sale_comparison/views/website_sale_comparison_template.xml2
-rw-r--r--addons/website_sale_delivery/controllers/main.py19
-rw-r--r--addons/website_sale_delivery/models/sale_order.py3
-rw-r--r--addons/website_sale_delivery/static/src/js/website_sale_delivery.js10
-rw-r--r--addons/website_sale_delivery/views/website_sale_delivery_templates.xml2
-rw-r--r--addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js2
-rw-r--r--addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.scss4
-rw-r--r--addons/website_slides/controllers/main.py7
-rw-r--r--addons/website_slides/models/slides.py9
-rw-r--r--addons/website_slides/static/lib/pdfslidesviewer/PDFSlidesViewer.js14
-rw-r--r--doc/cla/corporate/acysos.md16
-rw-r--r--doc/cla/individual/nomadic-coding.md11
-rw-r--r--doc/cla/individual/wohthan.md11
-rw-r--r--doc/reference/mixins.rst3
-rw-r--r--doc/reference/views.rst4
-rw-r--r--odoo/addons/base/data/ir_module_category_data.xml2
-rw-r--r--odoo/addons/base/data/res.country.state.csv1
-rw-r--r--odoo/addons/base/data/res_country_data.xml1
-rw-r--r--odoo/addons/base/data/res_currency_data.xml1
-rw-r--r--odoo/addons/base/i18n/de.po2
-rw-r--r--odoo/addons/base/i18n/nl.po2
-rw-r--r--odoo/addons/base/i18n/tr.po726
-rw-r--r--odoo/addons/base/models/ir_actions.py1
-rw-r--r--odoo/addons/base/models/ir_qweb_fields.py5
-rw-r--r--odoo/addons/base/models/res_currency.py1
-rw-r--r--odoo/addons/base/models/res_partner.py3
-rw-r--r--odoo/addons/base/models/res_users.py7
-rw-r--r--odoo/addons/base/security/base_security.xml35
-rw-r--r--odoo/addons/base/tests/test_mail.py4
-rw-r--r--odoo/addons/base/tests/test_mail_examples.py2
-rw-r--r--odoo/addons/base/views/res_users_views.xml2
-rw-r--r--odoo/addons/base/wizard/base_partner_merge.py5
-rw-r--r--odoo/api.py8
-rw-r--r--odoo/fields.py2
-rw-r--r--odoo/http.py2
-rw-r--r--odoo/models.py20
-rw-r--r--odoo/netsvc.py7
-rw-r--r--odoo/service/server.py6
-rw-r--r--odoo/tests/common.py12
-rw-r--r--odoo/tools/convert.py7
-rw-r--r--odoo/tools/mail.py18
-rwxr-xr-xsetup/package.py2
403 files changed, 5558 insertions, 2457 deletions
diff --git a/addons/account/i18n/de.po b/addons/account/i18n/de.po
index 749aa468bc0..451d39a8fd2 100644
--- a/addons/account/i18n/de.po
+++ b/addons/account/i18n/de.po
@@ -242,6 +242,50 @@ msgid ""
"</p>\n"
"</div>"
msgstr ""
+"<div>\n"
+"<p>Hallo ${object.partner_id.name}\n"
+"% set access_action = object.with_context(force_website=True).get_access_action()\n"
+"% set is_online = access_action and access_action['type'] == 'ir.actions.act_url'\n"
+"% set access_url = object.get_mail_url()\n"
+"\n"
+"% if object.partner_id.parent_id:\n"
+" (<i>${object.partner_id.parent_id.name}</i>)\n"
+"% endif\n"
+",</p>\n"
+"<p>hier im Anhang finden Sie Ihre\n"
+"% if object.number:\n"
+"Rechnung <strong>${object.number}</strong>\n"
+"% else:\n"
+"Rechnung\n"
+"% endif\n"
+"% if object.origin:\n"
+"(mit Referenz: ${object.origin})\n"
+"% endif\n"
+"mit einem Betrag von <strong>${format_amount(object.amount_total, object.currency_id)}</strong>\n"
+"from ${object.company_id.name}.\n"
+"</p>\n"
+"\n"
+"% if is_online:\n"
+" <br/><br/>\n"
+" <center>\n"
+" <a href=\"${access_url}\" style=\"background-color: #1abc9c; padding: 20px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 16px;\" class=\"o_default_snippet_text\">Rechnung anzeigen</a>\n"
+" </center>\n"
+"% endif\n"
+" <br/><br/>\n"
+"\n"
+"% if object.state=='paid':\n"
+" <p>Diese Rechnung ist bereits bezahlt.</p>\n"
+"% else:\n"
+" <p>Bitte führen Sie die Zahlung so bald wie möglich durch.</p>\n"
+"% endif\n"
+"\n"
+"<p>Danke,</p>\n"
+"<p style=\"color:#888888\">\n"
+"% if object.user_id and object.user_id.signature:\n"
+" ${object.user_id.signature | safe}\n"
+"% endif\n"
+"</p>\n"
+"</div>"
#. module: account
#: model:ir.ui.view,arch_db:account.portal_my_invoices
diff --git a/addons/account/i18n/es.po b/addons/account/i18n/es.po
index 27dea435cb4..5eabdf0a97c 100644
--- a/addons/account/i18n/es.po
+++ b/addons/account/i18n/es.po
@@ -77,6 +77,10 @@ msgid ""
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr ""
+"* El estado de \"Borrador\" se usa cuando se codifica un factura nueva y no confirmada.\n"
+"* El estado \"Abierto\" se usa cuando el usuario crea una factura, y se genera un número de factura. Este estado se mantiene hasta que el usuario paga la factura\n"
+"* El Estado \"Pagado\" se establece automáticamente cuando la factura se paga. Sus entradas diarias relacionadas pueden estar o no conciliadas.\n"
+"* El estado \"Cancelado\" se usa cuando el usuario cancela una factura"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_chart_template__code_digits
@@ -203,6 +207,16 @@ msgid ""
"</p>\n"
"</data>"
msgstr ""
+"<?xml version=\"1.0\"?>\n"
+"<data>Estimado ${object.partner_id.name},</p>\n"
+"<p>Gracias por tu pago.<br/> Aquí está tu recibo de pago <strong>${(object.name or '').replace('/','-')}</strong> por un monto de <strong>${format_amount(object.amount, object.currency_id)}</strong> efectuado por ${object.company_id.name}.</p>\n"
+"<p>Si tienes alguna pregunta, no dudes en contactarnos.</p>\n"
+"<p>Cordiales saludos,\n"
+"% if user and user.signature:\n"
+"${user.signature | safe}\n"
+"% endif\n"
+"</p>\n"
+"</data>"
#. module: account
#: model:mail.template,body_html:account.email_template_edi_invoice
@@ -252,6 +266,50 @@ msgid ""
"</p>\n"
"</div>"
msgstr ""
+"<div>\n"
+"<p>Estimado ${object.partner_id.name}\n"
+"% set access_action = object.with_context(force_website=True).get_access_action()\n"
+"% set is_online = access_action and access_action['type'] == 'ir.actions.act_url'\n"
+"% set access_url = object.get_mail_url()\n"
+"\n"
+"% if object.partner_id.parent_id:\n"
+" (<i>${object.partner_id.parent_id.name}</i>)\n"
+"% endif\n"
+",</p>\n"
+"<p>Aquí está, en el archivo adjunto, tu \n"
+"% if object.number:\n"
+"<strong>factura ${object.number}</strong>\n"
+"% else:\n"
+"invoice\n"
+"% endif\n"
+"% if object.origin:\n"
+"(with reference: ${object.origin})\n"
+"% endif\n"
+"por un monto de <strong>${format_amount(object.amount_total, object.currency_id)}</strong>\n"
+"efectuado por ${object.company_id.name}.\n"
+"</p>\n"
+"\n"
+"% if is_online:\n"
+" <br/><br/>\n"
+" <center>\n"
+" <a href=\"${access_url}\" style=\"background-color: #1abc9c; padding: 20px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 16px;\" class=\"o_default_snippet_text\">Ver factura</a>\n"
+" </center>\n"
+"% endif\n"
+" <br/><br/>\n"
+"\n"
+"% if object.state=='paid':\n"
+" <p>Esta factura ya se encuentra pagada.</p>\n"
+"% else:\n"
+" <p>Por favor remita el pago a su más pronta conveniencia.</p>\n"
+"% endif\n"
+"\n"
+"<p>Gracias,</p>\n"
+"<p style=\"color:#888888\">\n"
+"% if object.user_id and object.user_id.signature:\n"
+" ${object.user_id.signature | safe}\n"
+"% endif\n"
+"</p>\n"
+"</div>"
#. module: account
#: model:ir.ui.view,arch_db:account.portal_my_invoices
@@ -9304,6 +9362,8 @@ msgstr "La referencia de asociado para esta factura."
msgid ""
"The partners of the journal's company and the related bank account mismatch."
msgstr ""
+"La empresa del diario de la compañía y el de la cuenta del banco "
+"relacionada, no coinciden"
#. module: account
#: code:addons/account/models/account_payment.py:61
@@ -10607,6 +10667,7 @@ msgid ""
"You cannot change the currency of the company since some journal items "
"already exist"
msgstr ""
+"No puede cambiar la moneda de la compañía ya que contiene asientos contables"
#. module: account
#: code:addons/account/models/account.py:271
diff --git a/addons/account/i18n/fr.po b/addons/account/i18n/fr.po
index 7e8c4811412..6103e3d269d 100644
--- a/addons/account/i18n/fr.po
+++ b/addons/account/i18n/fr.po
@@ -65,13 +65,14 @@
# Fabri Yohann <psn@fabri.pw>, 2017
# Jérôme Tanché <jerome.tanche@ouest-dsi.fr>, 2017
# e2f <projects@e2f.com>, 2018
+# Schreiner Grégory <schreiner.gregory@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: e2f <projects@e2f.com>, 2018\n"
+"Last-Translator: Schreiner Grégory <schreiner.gregory@gmail.com>, 2018\n"
"Language-Team: French (https://www.transifex.com/odoo/teams/41243/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -87,6 +88,10 @@ msgid ""
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr ""
+"* L'état \"Brouillon\" est utilisé lorsqu'un utilisateur est en train de saisir ou de modifier une nouvelle facture non confirmée.\n"
+"* L'état 'Ouvert' est utilisé lorsque l'utilisateur crée une facture, celle-ci a alors un numéro de facture La facture reste dans ce statut \"Ouvert\" jusqu'à ce qu'elle soit payée.\n"
+"* L'état 'Payé' est affecté automatiquement lorsque la facture est payée. Ses écritures dans les journaux connexes peuvent ou non être réconciliées.\n"
+"* L'état \"Annulé\" est utilisé lorsque l'utilisateur annule la facture."
#. module: account
#: model:ir.model.fields,field_description:account.field_account_chart_template__code_digits
@@ -213,6 +218,16 @@ msgid ""
"</p>\n"
"</data>"
msgstr ""
+"<?xml version=\"1.0\"?>\n"
+"<data><p>Chèr(e) ${object.partner_id.name},</p>\n"
+"<p>Merci pour votre règlement. <br/> Voici le reçu de votre paiement <strong>${(object.name or '').replace('/','-')}</strong> d'un montant de <strong>${format_amount(object.amount, object.currency_id)}</strong> de ${object.company_id.name}.</p>\n"
+"<p>Si vous avez des questions, pensez à nous contacter.</p>\n"
+"<p>Sincères salutations,\n"
+"% if user and user.signature:\n"
+"${user.signature | safe}\n"
+"% endif\n"
+"</p>\n"
+"</data>"
#. module: account
#: model:mail.template,body_html:account.email_template_edi_invoice
@@ -262,6 +277,50 @@ msgid ""
"</p>\n"
"</div>"
msgstr ""
+"<div>\n"
+"<p>Cher ${object.partner_id.name}\n"
+"% set access_action = object.with_context(force_website=True).get_access_action()\n"
+"% set is_online = access_action and access_action['type'] == 'ir.actions.act_url'\n"
+"% set access_url = object.get_mail_url()\n"
+"\n"
+"% if object.partner_id.parent_id:\n"
+" (<i>${object.partner_id.parent_id.name}</i>)\n"
+"% endif\n"
+",</p>\n"
+"<p>Voici, en pièce jointe, votre \n"
+"% if object.number:\n"
+"facture <strong>${object.number}</strong>\n"
+"% else:\n"
+"facture\n"
+"% endif\n"
+"% if object.origin:\n"
+"(avec la référence ${object.origin})\n"
+"% endif\n"
+", son montant s'élève à <strong>${format_amount(object.amount_total, object.currency_id)}</strong>\n"
+"émis par ${object.company_id.name}.\n"
+"</p>\n"
+"\n"
+"% if is_online:\n"
+" <br/><br/>\n"
+" <center>\n"
+" <a href=\"${access_url}\" style=\"background-color: #1abc9c; padding: 20px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 16px;\" class=\"o_default_snippet_text\">Voir la facture</a>\n"
+" </center>\n"
+"% endif\n"
+" <br/><br/>\n"
+"\n"
+"% if object.state=='paid':\n"
+" <p>Cette facture est déjà payée.</p>\n"
+"% else:\n"
+" <p>Merci de procéder au payement dès que possible.</p>\n"
+"% endif\n"
+"\n"
+"<p>Merci,</p>\n"
+"<p style=\"color:#888888\">\n"
+"% if object.user_id and object.user_id.signature:\n"
+" ${object.user_id.signature | safe}\n"
+"% endif\n"
+"</p>\n"
+"</div>"
#. module: account
#: model:ir.ui.view,arch_db:account.portal_my_invoices
@@ -9347,6 +9406,8 @@ msgstr "La référence donnée par le partenaire pour cette facture."
msgid ""
"The partners of the journal's company and the related bank account mismatch."
msgstr ""
+"Les partenaires du journal de la société et le compte bancaire lié ne "
+"correspondent pas"
#. module: account
#: code:addons/account/models/account_payment.py:61
@@ -10649,6 +10710,8 @@ msgid ""
"You cannot change the currency of the company since some journal items "
"already exist"
msgstr ""
+"Vous ne pouvez pas modifier la devise de l'entreprise car certains articles "
+"de journal existent déjà"
#. module: account
#: code:addons/account/models/account.py:271
diff --git a/addons/account/i18n/hu.po b/addons/account/i18n/hu.po
index ce84d003539..93bec440716 100644
--- a/addons/account/i18n/hu.po
+++ b/addons/account/i18n/hu.po
@@ -9207,6 +9207,8 @@ msgid ""
"There are still unposted entries in the period you want to lock. You should "
"either post or delete them."
msgstr ""
+"Könyveletlen tételek vannak a zárolni tervezett periódusban. Kérjük "
+"könyvelje vagy törölje ezen tételeket."
#. module: account
#: code:addons/account/models/account_bank_statement.py:179
@@ -10351,6 +10353,7 @@ msgstr "Nem törölhet olyan fizetést, amit már lekönyvelt"
#, python-format
msgid "You can only delete an invoice line if the invoice is in draft state."
msgstr ""
+"Számlatétel csak akkor törölhető, ha a számla piszkozat állapotban van."
#. module: account
#: code:addons/account/models/account_payment.py:142
@@ -10406,6 +10409,7 @@ msgid ""
"You cannot change the currency of the company since some journal items "
"already exist"
msgstr ""
+"A vállalat pénzneme nem változtatható, mivel már vannak könyvelési tételek."
#. module: account
#: code:addons/account/models/account.py:271
@@ -10591,7 +10595,7 @@ msgstr "Önnek van"
#: code:addons/account/models/account_payment.py:500
#, python-format
msgid "You have to define a sequence for %s in your company."
-msgstr ""
+msgstr "Meg kell adni egy szekvenciát %s számára a vállalatban."
#. module: account
#: code:addons/account/wizard/account_report_general_ledger.py:21
diff --git a/addons/account/i18n/ru.po b/addons/account/i18n/ru.po
index 5909ba5757d..a3f724f574f 100644
--- a/addons/account/i18n/ru.po
+++ b/addons/account/i18n/ru.po
@@ -1361,7 +1361,7 @@ msgstr "Разрешить печать чеков и депозиты"
#. module: account
#: model:res.groups,name:account.group_cash_rounding
msgid "Allow the cash rounding management"
-msgstr ""
+msgstr "Разрешает управление округлением наличности"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
@@ -2278,19 +2278,19 @@ msgstr "Кассы"
#. module: account
#: model:ir.model.fields,field_description:account.field_res_config_settings__group_cash_rounding
msgid "Cash Rounding"
-msgstr ""
+msgstr "Округление наличных денег"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice__cash_rounding_id
msgid "Cash Rounding Method"
-msgstr ""
+msgstr "Способ округления наличности"
#. module: account
#: model:ir.actions.act_window,name:account.rounding_list_action
#: model:ir.ui.menu,name:account.menu_action_rounding_form_view
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Cash Roundings"
-msgstr ""
+msgstr "Округления наличности"
#. module: account
#: model:ir.ui.view,arch_db:account.account_journal_dashboard_kanban_view
@@ -2683,7 +2683,7 @@ msgstr "Написать письмо"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Compute tax rates based on U.S. ZIP codes"
-msgstr ""
+msgstr "Рассчитывать налоги на основании почтовых кодов (только для США)"
#. module: account
#: model:ir.model.fields,help:account.field_account_move_line__counterpart
@@ -2973,7 +2973,7 @@ msgstr "Создать модель"
#. module: account
#: model:ir.actions.act_window,help:account.rounding_list_action
msgid "Create the first cash rounding"
-msgstr ""
+msgstr "Создайте первое округление наличности"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_account__create_uid
@@ -3535,7 +3535,7 @@ msgstr "Налоги по умолчанию"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Default taxes applied to local transactions"
-msgstr ""
+msgstr "Налоги, применяемые по умолчанию к местным сделкам"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
@@ -3551,6 +3551,7 @@ msgstr ""
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Define the smallest coinage of the currency used to pay by cash."
msgstr ""
+"Определите самую маленькую монетку(размерность) при расчетах наличными"
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice__cash_rounding_id
@@ -3558,6 +3559,7 @@ msgid ""
"Defines the smallest coinage of the currency that can be used to pay by "
"cash."
msgstr ""
+"Определяет самую маленькую монетку(размерность) при расчетах наличными"
#. module: account
#: model:ir.ui.view,arch_db:account.view_account_tax_template_form
@@ -3903,7 +3905,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_res_config_settings__module_l10n_eu_service
msgid "EU Digital Goods VAT"
-msgstr ""
+msgstr "НДС на цифровые товары по правилам ЕС"
#. module: account
#: code:addons/account/models/chart_template.py:171
@@ -4138,7 +4140,7 @@ msgstr "Налогово-бюджетная информация"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Fiscal Localization"
-msgstr ""
+msgstr "Налоговая локализация"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_fiscal_position_account_template__position_id
@@ -4285,7 +4287,7 @@ msgstr "Все операции по этому счету принудителÑ
#: code:addons/account/report/account_tax.py:13
#, python-format
msgid "Form content is missing, this report cannot be printed."
-msgstr ""
+msgstr "Не найдены данные в форме, отчет не сформирован"
#. module: account
#: code:addons/account/models/account_invoice.py:100
@@ -4380,6 +4382,7 @@ msgstr ""
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Get warnings when invoicing specific customers"
msgstr ""
+"Получайте уведомления при фактурировании счетов по определенным клиентам"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
@@ -4530,7 +4533,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "How total tax amount is computed in orders and invoices"
-msgstr ""
+msgstr "Как рассчитывается сумма налогов в заказах и счетах"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_abstract_payment__id
@@ -5182,7 +5185,7 @@ msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice_line__is_rounding_line
msgid "Is a rounding line in case of cash rounding."
-msgstr ""
+msgstr "Позиция к округлению в случае наличного расчета"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_bank_statement__is_difference_zero
@@ -5880,7 +5883,7 @@ msgstr "РАЗНОЕ"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Mail your invoices in one-click using"
-msgstr ""
+msgstr "Отправляйте ваши счета в один клик, используя "
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
@@ -5900,7 +5903,7 @@ msgstr "Основная валюта компании."
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Main currency of your company"
-msgstr ""
+msgstr "Основная валюта вашей компании"
#. module: account
#: model:ir.ui.menu,name:account.account_management_menu
@@ -5970,7 +5973,7 @@ msgstr "Март"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Margin Analysis"
-msgstr ""
+msgstr "Анализ прибыли"
#. module: account
#: model:ir.ui.view,arch_db:account.setup_bank_journal_form
@@ -6111,7 +6114,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Monitor your product margins from invoices"
-msgstr ""
+msgstr "Следите за маржинальностью ваших продуктов по инвойсам"
#. module: account
#: model:ir.actions.act_window,name:account.act_account_invoice_partner_relation
@@ -6804,7 +6807,7 @@ msgstr "Прошлые"
#. module: account
#: model:ir.ui.view,arch_db:account.res_config_settings_view_form
msgid "Pay your bills in one-click using Euro SEPA service"
-msgstr ""
+msgstr "Оплачивайте ваши счета в один клик, используя сервис Euro SEPA"
#. module: account
#: model:account.account.type,name:account.data_account_type_payable
@@ -7814,12 +7817,12 @@ msgstr "Округление по Строке"
#. module: account
#: model:ir.ui.view,arch_db:account.rounding_form_view
msgid "Rounding Form"
-msgstr ""
+msgstr "Округление"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_line__is_rounding_line
msgid "Rounding Line"
-msgstr ""
+msgstr "Округление по строкам"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_cash_rounding__rounding_method
@@ -7835,12 +7838,12 @@ msgstr "Точность округления"
#. module: account
#: model:ir.model.fields,field_description:account.field_account_cash_rounding__strategy
msgid "Rounding Strategy"
-msgstr ""
+msgstr "Стратегия округления"
#. module: account
#: model:ir.ui.view,arch_db:account.rounding_tree_view
msgid "Rounding Tree"
-msgstr ""
+msgstr "Дерево округления"
#. module: account
#: model:ir.model.fields,field_description:account.field_res_config_settings__module_account_sepa
@@ -8633,6 +8636,7 @@ msgid ""
"Taxes, fiscal positions, chart of accounts &amp; legal statements for your "
"country"
msgstr ""
+"Налоги, фискальные позиции план счетов и правовые особенности вашей страны"
#. module: account
#: model:ir.model.fields,help:account.field_account_move_line__balance
@@ -8935,6 +8939,9 @@ msgid ""
"The cash rounding cannot be computed because the difference must be added on the biggest tax found and no tax are specified.\n"
"Please set up a tax or change the cash rounding method."
msgstr ""
+"Невозможно рассчитать округления, потому что разница должна быть отнесена к "
+"самому большому налогу, но налоги не указаны. Пожалуйста, укажите "
+"применяемый налог или измените правило денежного округления."
#. module: account
#: model:ir.model.fields,help:account.field_res_company__chart_template_id
@@ -9208,7 +9215,7 @@ msgstr "Последовательность журнала%s дезактиви
#. module: account
#: model:ir.model.fields,help:account.field_account_cash_rounding__rounding_method
msgid "The tie-breaking rule used for float rounding operations"
-msgstr ""
+msgstr "Правило округления, используемое в операциях с дробными числами"
#. module: account
#: model:ir.ui.view,arch_db:account.portal_my_invoices
@@ -9714,12 +9721,12 @@ msgstr "Итоговая сумма долга покупателя перед Ð
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice_line__price_total
msgid "Total amount with taxes"
-msgstr ""
+msgstr "Итого с налогами"
#. module: account
#: model:ir.model.fields,help:account.field_account_invoice_line__price_subtotal
msgid "Total amount without taxes"
-msgstr ""
+msgstr "Итого без налогов"
#. module: account
#: model:ir.model.fields,help:account.field_res_partner__debit
diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po
index 1a1c436c45c..0d387c800f4 100644
--- a/addons/account/i18n/tr.po
+++ b/addons/account/i18n/tr.po
@@ -30,6 +30,10 @@ msgid ""
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr ""
+" * 'Taslak' durumu, bir kullanıcı yeni yada onaylanmamış bir fatura hazırlıyorsa kullanılır.\n"
+" * 'Açık' durumu, kullanıcı bir fatura oluştururken kullanılır, fatura numarası oluşturulur. Kullanıcı faturayı ödeyinceye kadar açık durumdadır.\n"
+" * 'Ödendi' durumu, fatura ödenince otomatik olarak ayarlanır. Yevmiye girişlerinin uzlaştırılımış yada uzlaştırılmamış olmasıyla ilgilidir.\n"
+" * 'İptal edildi' durumu kullanıcı bir faturayı iptal ettiğinde kullanılır."
#. module: account
#: model:ir.model.fields,field_description:account.field_account_chart_template__code_digits
@@ -9271,6 +9275,8 @@ msgid ""
"This %s has been created from: <a href=# data-oe-model=account.invoice data-"
"oe-id=%d>%s</a>"
msgstr ""
+"Bu %s şu adresten oluşturuldu: <a href=# data-oe-model=account.invoice data-"
+"oe-id=%d>%s</a>"
#. module: account
#: model:ir.ui.view,arch_db:account.view_account_invoice_report_search
diff --git a/addons/account/models/account.py b/addons/account/models/account.py
index 0ece2b7c87c..87b4ffc2765 100644
--- a/addons/account/models/account.py
+++ b/addons/account/models/account.py
@@ -805,7 +805,7 @@ class AccountTax(models.Model):
tag_ids = fields.Many2many('account.account.tag', 'account_tax_account_tag', string='Tags', help="Optional tags you may want to assign for custom reporting")
tax_group_id = fields.Many2one('account.tax.group', string="Tax Group", default=_default_tax_group, required=True)
# Technical field to make the 'tax_exigibility' field invisible if the same named field is set to false in 'res.company' model
- hide_tax_exigibility = fields.Boolean(string='Hide Use Cash Basis Option', related='company_id.tax_exigibility')
+ hide_tax_exigibility = fields.Boolean(string='Hide Use Cash Basis Option', related='company_id.tax_exigibility', readonly=True)
tax_exigibility = fields.Selection(
[('on_invoice', 'Based on Invoice'),
('on_payment', 'Based on Payment'),
diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py
index f6b6f9ed104..a4407c557af 100644
--- a/addons/account/models/account_invoice.py
+++ b/addons/account/models/account_invoice.py
@@ -619,7 +619,8 @@ class AccountInvoice(models.Model):
for invoice in self:
# Delete non-manual tax lines
self._cr.execute("DELETE FROM account_invoice_tax WHERE invoice_id=%s AND manual is False", (invoice.id,))
- self.invalidate_cache()
+ if self._cr.rowcount:
+ self.invalidate_cache()
# Generate one tax line per tax, however many invoice lines it's applied to
tax_grouped = invoice.get_taxes_values()
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
index 4f44203b5c5..e50cc97fb24 100644
--- a/addons/account/models/account_move.py
+++ b/addons/account/models/account_move.py
@@ -55,7 +55,8 @@ class AccountMove(models.Model):
total_amount += amount
for partial_line in (line.matched_debit_ids + line.matched_credit_ids):
total_reconciled += partial_line.amount
- if float_is_zero(total_amount, precision_rounding=move.currency_id.rounding):
+ precision_currency = move.currency_id or move.company_id.currency_id
+ if float_is_zero(total_amount, precision_rounding=precision_currency.rounding):
move.matched_percentage = 1.0
else:
move.matched_percentage = total_reconciled / total_amount
@@ -102,8 +103,7 @@ class AccountMove(models.Model):
partner_id = fields.Many2one('res.partner', compute='_compute_partner_id', string="Partner", store=True, readonly=True)
amount = fields.Monetary(compute='_amount_compute', store=True)
narration = fields.Text(string='Internal Note')
- company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', store=True, readonly=True,
- default=lambda self: self.env.user.company_id)
+ company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', store=True, readonly=True)
matched_percentage = fields.Float('Percentage Matched', compute='_compute_matched_percentage', digits=0, store=True, readonly=True, help="Technical field used in cash basis method")
# Dummy Account field to search on account.move by account_id
dummy_account_id = fields.Many2one('account.account', related='line_ids.account_id', string='Account', store=False, readonly=True)
@@ -746,8 +746,6 @@ class AccountMoveLine(models.Model):
raise UserError(_('Entries are not from the same account.'))
if not (all_accounts[0].reconcile or all_accounts[0].internal_type == 'liquidity'):
raise UserError(_('Account %s (%s) does not allow reconciliation. First change the configuration of this account to allow it.') % (all_accounts[0].name, all_accounts[0].code))
- if len(partners) > 1:
- raise UserError(_('The partner has to be the same on all lines for receivable and payable accounts.'))
#reconcile everything that can be
remaining_moves = self.auto_reconcile_lines()
@@ -873,8 +871,9 @@ class AccountMoveLine(models.Model):
rec_move_ids += account_move_line.matched_credit_ids
if self.env.context.get('invoice_id'):
current_invoice = self.env['account.invoice'].browse(self.env.context['invoice_id'])
+ aml_to_keep = current_invoice.move_id.line_ids | current_invoice.move_id.line_ids.mapped('full_reconcile_id.exchange_move_id.line_ids')
rec_move_ids = rec_move_ids.filtered(
- lambda r: (r.debit_move_id + r.credit_move_id) & current_invoice.move_id.line_ids
+ lambda r: (r.debit_move_id + r.credit_move_id) & aml_to_keep
)
return rec_move_ids.unlink()
@@ -1099,7 +1098,7 @@ class AccountMoveLine(models.Model):
'move_id': self.id,
'user_id': self.invoice_id.user_id.id or self._uid,
'partner_id': self.partner_id.id,
- 'company_id': self.env.user.company_id.id,
+ 'company_id': self.analytic_account_id.company_id.id or self.env.user.company_id.id,
}
def _prepare_analytic_distribution_line(self, distribution):
@@ -1122,7 +1121,7 @@ class AccountMoveLine(models.Model):
'ref': self.ref,
'move_id': self.id,
'user_id': self.invoice_id.user_id.id or self._uid,
- 'company_id': self.env.user.company_id.id
+ 'company_id': distribution.account_id.company_id.id or self.env.user.company_id.id,
}
@api.model
diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py
index 86654f1de32..0cbb74dd7a4 100644
--- a/addons/account/models/account_payment.py
+++ b/addons/account/models/account_payment.py
@@ -447,12 +447,17 @@ class account_payment(models.Model):
@api.multi
def button_invoices(self):
+ if self.partner_type == 'supplier':
+ views = [(self.env.ref('account.invoice_supplier_tree').id, 'tree'), (self.env.ref('account.invoice_supplier_form').id, 'form')]
+ else:
+ views = [(self.env.ref('account.invoice_tree').id, 'tree'), (self.env.ref('account.invoice_form').id, 'form')]
return {
'name': _('Paid Invoices'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'account.invoice',
'view_id': False,
+ 'views': views,
'type': 'ir.actions.act_window',
'domain': [('id', 'in', [x.id for x in self.reconciled_invoice_ids])],
}
diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py
index eb92576d9f8..75d74a2cbc0 100644
--- a/addons/account/models/partner.py
+++ b/addons/account/models/partner.py
@@ -394,8 +394,7 @@ class ResPartner(models.Model):
required=True)
property_account_position_id = fields.Many2one('account.fiscal.position', company_dependent=True,
string="Fiscal Position",
- help="The fiscal position will determine taxes and accounts used for the partner.", oldname="property_account_position",
- domain="[('company_id', 'in', [company_id, False])]")
+ help="The fiscal position will determine taxes and accounts used for the partner.", oldname="property_account_position")
property_payment_term_id = fields.Many2one('account.payment.term', company_dependent=True,
string='Customer Payment Terms',
help="This payment term will be used instead of the default one for sales orders and customer invoices", oldname="property_payment_term")
@@ -445,8 +444,12 @@ class ResPartner(models.Model):
@api.onchange('company_id')
def _onchange_company_id(self):
+ company = self.env['res.company']
if self.company_id:
- return {'domain': {'property_account_position_id': [('company_id', 'in', [self.company_id.id, False])]}}
+ company = self.company_id
+ else:
+ company = self.env.user.company_id
+ return {'domain': {'property_account_position_id': [('company_id', 'in', [company.id, False])]}}
def can_edit_vat(self):
can_edit_vat = super(ResPartner, self).can_edit_vat()
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js
index ce086a6370a..15a80780709 100644
--- a/addons/account/static/src/js/reconciliation/reconciliation_model.js
+++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js
@@ -804,6 +804,7 @@ var StatementModel = BasicModel.extend({
model: 'account.tax',
method: 'json_friendly_compute_all',
args: args,
+ context: $.extend(self.context || {}, {'round': true}),
})
.then(function (result) {
_.each(result.taxes, function(tax){
@@ -988,6 +989,7 @@ var StatementModel = BasicModel.extend({
var formatOptions = {
currency_id: line.st_line.currency_id,
};
+ var amount = values.amount !== undefined ? values.amount : line.balance.amount;
var prop = {
'id': _.uniqueId('createLine'),
'label': values.label || line.st_line.name,
@@ -1000,8 +1002,7 @@ var StatementModel = BasicModel.extend({
'debit': 0,
'credit': 0,
'base_amount': values.amount_type !== "percentage" ?
- (values.amount || line.balance.amount) :
- line.balance.amount * values.amount / 100,
+ (amount) : line.balance.amount * values.amount / 100,
'percent': values.amount_type === "percentage" ? values.amount : null,
'link': values.link,
'display': true,
diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py
index 725a207d3a2..9a3e816efce 100644
--- a/addons/account/tests/test_reconciliation.py
+++ b/addons/account/tests/test_reconciliation.py
@@ -663,6 +663,54 @@ class TestReconciliation(AccountingTestCase):
self.assertAlmostEquals(inv1.residual, 10)
self.assertAlmostEquals(inv2.residual, 20)
+ def test_unreconcile_exchange(self):
+ # Use case:
+ # - Company currency in EUR
+ # - Create 2 rates for USD:
+ # 1.0 on 2018-01-01
+ # 0.5 on 2018-02-01
+ # - Create an invoice on 2018-01-02 of 111 USD
+ # - Register a payment on 2018-02-02 of 111 USD
+ # - Unreconcile the payment
+
+ self.env['res.currency.rate'].create({
+ 'name': time.strftime('%Y') + '-07-01',
+ 'rate': 1.0,
+ 'currency_id': self.currency_usd_id,
+ 'company_id': self.env.ref('base.main_company').id
+ })
+ self.env['res.currency.rate'].create({
+ 'name': time.strftime('%Y') + '-08-01',
+ 'rate': 0.5,
+ 'currency_id': self.currency_usd_id,
+ 'company_id': self.env.ref('base.main_company').id
+ })
+ inv = self.create_invoice(invoice_amount=111, currency_id=self.currency_usd_id)
+ payment = self.env['account.payment'].create({
+ 'payment_type': 'inbound',
+ 'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
+ 'partner_type': 'customer',
+ 'partner_id': self.partner_agrolait_id,
+ 'amount': 111,
+ 'currency_id': self.currency_usd_id,
+ 'journal_id': self.bank_journal_usd.id,
+ 'payment_date': time.strftime('%Y') + '-08-01',
+ })
+ payment.post()
+ credit_aml = payment.move_line_ids.filtered('credit')
+
+ # Check residual before assignation
+ self.assertAlmostEquals(inv.residual, 111)
+
+ # Assign credit, check exchange move and residual
+ inv.assign_outstanding_credit(credit_aml.id)
+ self.assertEqual(len(payment.move_line_ids.mapped('full_reconcile_id').exchange_move_id), 1)
+ self.assertAlmostEquals(inv.residual, 0)
+
+ # Unreconcile invoice and check residual
+ credit_aml.with_context(invoice_id=inv.id).remove_move_reconcile()
+ self.assertAlmostEquals(inv.residual, 111)
+
def test_partial_reconcile_currencies_02(self):
####
# Day 1: Invoice Cust/001 to customer (expressed in USD)
diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml
index a83d9e05f83..c9d25b95aa9 100644
--- a/addons/account/views/account_portal_templates.xml
+++ b/addons/account/views/account_portal_templates.xml
@@ -22,9 +22,9 @@
<template id="portal_my_invoices" name="My Invoices and Payments">
<t t-call="portal.portal_layout">
- <h3>Invoices
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Invoices</t>
+ </t>
<t t-if="not invoices">
<p>There are currently no invoices and payments for your account.</p>
</t>
@@ -57,7 +57,7 @@
<span class="label label-default"><i class="fa fa-fw fa-remove"></i><span class="hidden-xs"> Cancelled</span></span>
</t>
</td>
- <td><span t-field="invoice.residual" t-options='{"widget": "monetary", "display_currency": invoice.currency_id}'/></td>
+ <td><span t-esc="-invoice.residual if invoice.type == 'out_refund' else invoice.residual" t-options='{"widget": "monetary", "display_currency": invoice.currency_id}'/></td>
</tr>
</t>
</table></div>
diff --git a/addons/account/views/partner_view.xml b/addons/account/views/partner_view.xml
index bc325f129bd..aa05415c852 100644
--- a/addons/account/views/partner_view.xml
+++ b/addons/account/views/partner_view.xml
@@ -125,7 +125,7 @@
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button type="object" class="oe_stat_button" icon="fa-pencil-square-o" name="action_view_partner_invoices"
- attrs="{'invisible': [('customer', '=', False)]}">
+ attrs="{'invisible': [('customer', '=', False)]}" context="{'default_partner_id': active_id}">
<div class="o_form_field o_stat_info">
<span class="o_stat_value">
<field name="total_invoiced" widget='monetary' options="{'currency_field': 'currency_id'}"/>
diff --git a/addons/account/wizard/wizard_tax_adjustments.py b/addons/account/wizard/wizard_tax_adjustments.py
index 2f188b1abab..51f1936b93b 100644
--- a/addons/account/wizard/wizard_tax_adjustments.py
+++ b/addons/account/wizard/wizard_tax_adjustments.py
@@ -18,7 +18,7 @@ class TaxAdjustments(models.TransientModel):
debit_account_id = fields.Many2one('account.account', string='Debit account', required=True, domain=[('deprecated', '=', False)])
credit_account_id = fields.Many2one('account.account', string='Credit account', required=True, domain=[('deprecated', '=', False)])
amount = fields.Monetary(currency_field='company_currency_id', required=True)
- adjustment_type = fields.Selection([('debit', 'Adjustment in favor of the Estate'), ('credit', 'Adjustment in your favor')], string="Adjustment Type", store=False, required=True)
+ adjustment_type = fields.Selection([('debit', 'Applied on debit journal item'), ('credit', 'Applied on credit journal item')], string="Adjustment Type", store=False, required=True)
company_currency_id = fields.Many2one('res.currency', readonly=True, default=lambda self: self.env.user.company_id.currency_id)
tax_id = fields.Many2one('account.tax', string='Adjustment Tax', ondelete='restrict', domain=[('type_tax_use', '=', 'adjustment')], required=True)
diff --git a/addons/account_check_printing/i18n/nl.po b/addons/account_check_printing/i18n/nl.po
index a078c85b34f..19cee193768 100644
--- a/addons/account_check_printing/i18n/nl.po
+++ b/addons/account_check_printing/i18n/nl.po
@@ -284,7 +284,7 @@ msgstr "Cheques afdrukken"
#: model:ir.model.fields,field_description:account_check_printing.field_res_company__account_check_printing_date_label
#: model:ir.model.fields,field_description:account_check_printing.field_res_config_settings__account_check_printing_date_label
msgid "Print Date Label"
-msgstr ""
+msgstr "Print datum label"
#. module: account_check_printing
#: code:addons/account_check_printing/models/account_payment.py:101
@@ -302,7 +302,7 @@ msgstr "Betalingen voor meerdere facturen registreren"
#. module: account_check_printing
#: model:ir.model.fields,field_description:account_check_printing.field_res_company__account_check_printing_margin_right
msgid "Right Margin"
-msgstr ""
+msgstr "Rechtermarge"
#. module: account_check_printing
#: model:ir.model.fields,help:account_check_printing.field_res_company__account_check_printing_layout
diff --git a/addons/account_check_printing/models/account_payment.py b/addons/account_check_printing/models/account_payment.py
index b195814843f..15421a6e7c2 100644
--- a/addons/account_check_printing/models/account_payment.py
+++ b/addons/account_check_printing/models/account_payment.py
@@ -34,7 +34,7 @@ class AccountRegisterPayments(models.TransientModel):
res = super(AccountRegisterPayments, self)._prepare_payment_vals(invoices)
if self.payment_method_id == self.env.ref('account_check_printing.account_payment_method_check'):
res.update({
- 'check_manual_sequencing': self.check_manual_sequencing,
+ 'check_amount_in_words': self.currency_id.amount_to_text(res['amount']) if self.multi else self.check_amount_in_words,
})
return res
diff --git a/addons/account_invoicing/i18n/ru.po b/addons/account_invoicing/i18n/ru.po
index 27ecb02589e..4d8f39cfc84 100644
--- a/addons/account_invoicing/i18n/ru.po
+++ b/addons/account_invoicing/i18n/ru.po
@@ -3,14 +3,14 @@
# * account_invoicing
#
# Translators:
-# Dimko Pythonic <d.v.selitsky@gmail.com>, 2017
+# Dmitry sky <d.v.selitsky@gmail.com>, 2017
# Aidos Kakimzhanov <aidos.kakimzhan@gmail.com>, 2017
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 10.saas~18\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-09-20 09:53+0000\n"
-"PO-Revision-Date: 2017-09-20 09:53+0000\n"
+"POT-Creation-Date: 2018-03-22 14:10+0000\n"
+"PO-Revision-Date: 2018-03-22 14:10+0000\n"
"Last-Translator: Aidos Kakimzhanov <aidos.kakimzhan@gmail.com>, 2017\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
diff --git a/addons/account_payment/i18n/zh_CN.po b/addons/account_payment/i18n/zh_CN.po
index c265e326625..9287935bb2d 100644
--- a/addons/account_payment/i18n/zh_CN.po
+++ b/addons/account_payment/i18n/zh_CN.po
@@ -11,13 +11,14 @@
# 老窦 北京 <2662059195@qq.com>, 2018
# liAnGjiA <liangjia@qq.com>, 2018
# e2f <projects@e2f.com>, 2018
+# John Lin <linyinhuan@139.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: e2f <projects@e2f.com>, 2018\n"
+"Last-Translator: John Lin <linyinhuan@139.com>, 2018\n"
"Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -168,7 +169,7 @@ msgstr "状态"
msgid ""
"The invoice was not confirmed despite response from the acquirer (%s): "
"invoice amount is %r but acquirer replied with %r."
-msgstr ""
+msgstr "该发票未被确认,尽管对方(%s)回复:发票金额 %r但对方回复%r。"
#. module: account_payment
#: model:ir.ui.view,arch_db:account_payment.portal_invoice_error
diff --git a/addons/account_payment/views/account_portal_templates.xml b/addons/account_payment/views/account_portal_templates.xml
index 038844571fb..36bab9558ea 100644
--- a/addons/account_payment/views/account_portal_templates.xml
+++ b/addons/account_payment/views/account_portal_templates.xml
@@ -5,7 +5,7 @@
</xpath>
<xpath expr="//t[@t-foreach='invoices']/tr/td[last()]" position="before">
<td>
- <a t-if="invoice.state == 'open'" t-att-href="'/my/invoices/%s#portal_pay' % invoice.id" alt="Pay Now" class="btn btn-xs btn-primary">
+ <a t-if="invoice.state == 'open' and invoice.type == 'out_invoice'" t-att-href="'/my/invoices/%s#portal_pay' % invoice.id" alt="Pay Now" class="btn btn-xs btn-primary">
<i class="fa fa-arrow-circle-right"/><span class='hidden-xs'> Pay Now</span>
</a>
</td>
diff --git a/addons/account_voucher/i18n/nl.po b/addons/account_voucher/i18n/nl.po
index 74b270094e1..8afba2c4ac1 100644
--- a/addons/account_voucher/i18n/nl.po
+++ b/addons/account_voucher/i18n/nl.po
@@ -273,13 +273,13 @@ msgstr "Laatst bijgewerkt op"
#: code:addons/account_voucher/models/account_voucher.py:101
#, python-format
msgid "Missing Company"
-msgstr ""
+msgstr "Bedrijf ontbreekt"
#. module: account_voucher
#: code:addons/account_voucher/models/account_voucher.py:103
#, python-format
msgid "Missing Currency"
-msgstr ""
+msgstr "Valuta ontbreekt"
#. module: account_voucher
#: model:ir.model.fields,field_description:account_voucher.field_account_voucher__narration
diff --git a/addons/analytic/i18n/nl.po b/addons/analytic/i18n/nl.po
index 0060665cd6f..7124d47c778 100644
--- a/addons/analytic/i18n/nl.po
+++ b/addons/analytic/i18n/nl.po
@@ -344,12 +344,12 @@ msgstr "Naam"
#. module: analytic
#: model:ir.actions.act_window,help:analytic.account_analytic_line_action_entries
msgid "No activity yet"
-msgstr ""
+msgstr "Nog geen activiteit"
#. module: analytic
#: model:ir.actions.act_window,help:analytic.account_analytic_line_action
msgid "No activity yet on this account"
-msgstr ""
+msgstr "Nog geen activiteit voor deze kostenplaats"
#. module: analytic
#: model:ir.model.fields,field_description:analytic.field_account_analytic_group__parent_id
@@ -359,7 +359,7 @@ msgstr "Bovenliggend"
#. module: analytic
#: model:ir.model.fields,field_description:analytic.field_account_analytic_distribution__tag_id
msgid "Parent tag"
-msgstr ""
+msgstr "Bovenliggend label"
#. module: analytic
#: model:ir.model.fields,field_description:analytic.field_account_analytic_line__partner_id
diff --git a/addons/analytic/i18n/tr.po b/addons/analytic/i18n/tr.po
index 0248209cb6c..fd94a91c23b 100644
--- a/addons/analytic/i18n/tr.po
+++ b/addons/analytic/i18n/tr.po
@@ -11,13 +11,14 @@
# Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017
# Martin Trigaux, 2017
# Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -148,7 +149,7 @@ msgstr "Bakiye"
#. module: analytic
#: model:ir.ui.view,arch_db:analytic.view_account_analytic_account_kanban
msgid "Balance:"
-msgstr ""
+msgstr "Bakiye:"
#. module: analytic
#: model:ir.actions.act_window,name:analytic.action_analytic_account_form
@@ -412,6 +413,8 @@ msgstr "Analitik Satırları Ara"
#: model:ir.model.fields,help:analytic.field_account_analytic_tag__active
msgid "Set active to false to hide the Analytic Tag without removing it."
msgstr ""
+"Analitik Etiketi kaldırmadan gizlemek için etkin seçeneğini yanlış olarak "
+"ayarla."
#. module: analytic
#: model:ir.model.fields,field_description:analytic.field_account_analytic_line__tag_ids
diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py
index 96c889285ad..f1cd99cea5d 100644
--- a/addons/analytic/models/analytic_account.py
+++ b/addons/analytic/models/analytic_account.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from collections import defaultdict
from odoo import api, fields, models, _
from odoo.osv import expression
from odoo.exceptions import ValidationError
@@ -78,9 +79,9 @@ class AccountAnalyticAccount(models.Model):
@api.multi
def _compute_debit_credit_balance(self):
- res_currency_obj = self.env['res.currency']
+ Curr = self.env['res.currency']
analytic_line_obj = self.env['account.analytic.line']
- domain = [('account_id', 'in', self.mapped('id'))]
+ domain = [('account_id', 'in', self.ids)]
if self._context.get('from_date', False):
domain.append(('date', '>=', self._context['from_date']))
if self._context.get('to_date', False):
@@ -92,18 +93,25 @@ class AccountAnalyticAccount(models.Model):
domain.append(('company_id', 'in', self._context['company_ids']))
user_currency = self.env.user.company_id.currency_id
- account_amounts = analytic_line_obj.search_read(domain, ['account_id', 'amount', 'currency_id'])
- account_ids = set([line['account_id'][0] for line in account_amounts])
- data_debit = {account_id: 0.0 for account_id in account_ids}
- data_credit = {account_id: 0.0 for account_id in account_ids}
- for account_amount in account_amounts:
- currency_id = account_amount['currency_id'][0]
- amount = res_currency_obj.browse(currency_id)._convert(
- account_amount['amount'], user_currency, self.env.user.company_id, fields.Date.today())
- if amount < 0.0:
- data_debit[account_amount['account_id'][0]] += amount
- else:
- data_credit[account_amount['account_id'][0]] += amount
+ credit_groups = analytic_line_obj.read_group(
+ domain=domain + [('amount', '>=', 0.0)],
+ fields=['account_id', 'currency_id', 'amount'],
+ groupby=['account_id', 'currency_id'],
+ )
+ data_credit = defaultdict(float)
+ for l in credit_groups:
+ data_credit[l['account_id'][0]] += Curr.browse(l['currency_id'][0])._convert(
+ l['amount'], user_currency, self.env.user.company_id, fields.Date.today())
+
+ debit_groups = analytic_line_obj.read_group(
+ domain=domain + [('amount', '<', 0.0)],
+ fields=['account_id', 'currency_id', 'amount'],
+ groupby=['account_id', 'currency_id'],
+ )
+ data_debit = defaultdict(float)
+ for l in debit_groups:
+ data_debit[l['account_id'][0]] += Curr.browse(l['currency_id'][0])._convert(
+ l['amount'], user_currency, self.env.user.company_id, fields.Date.today())
for account in self:
account.debit = abs(data_debit.get(account.id, 0.0))
diff --git a/addons/anonymization/i18n/nl.po b/addons/anonymization/i18n/nl.po
index 9dc9452114f..2b1e784a795 100644
--- a/addons/anonymization/i18n/nl.po
+++ b/addons/anonymization/i18n/nl.po
@@ -291,7 +291,7 @@ msgstr "Query"
#. module: anonymization
#: model:ir.model.fields,field_description:anonymization.field_ir_model_fields_anonymization_migration_fix__query_type
msgid "Query Type"
-msgstr ""
+msgstr "Query soort"
#. module: anonymization
#: model:ir.ui.view,arch_db:anonymization.view_ir_model_fields_anonymize_wizard_form
diff --git a/addons/anonymization/i18n/tr.po b/addons/anonymization/i18n/tr.po
index ae89afae2c5..c53cad2c808 100644
--- a/addons/anonymization/i18n/tr.po
+++ b/addons/anonymization/i18n/tr.po
@@ -11,13 +11,14 @@
# Ramiz Deniz Öner <deniz@denizoner.com>, 2017
# Gökhan Erdoğdu <gokhan.erdogdu@mechsoft.com.tr>, 2017
# Özem Sökmem <ozensokmen@gmail.com>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Özem Sökmem <ozensokmen@gmail.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -396,6 +397,8 @@ msgid ""
"This is the file created by the anonymization process. It should have the "
"extension '.json' or '.pickle'."
msgstr ""
+"Bu dosya anonimleştirme işlemi tarafından oluşturulmuştur. Bunun uzantısı "
+"'.json' yada '.pickle' dır."
#. module: anonymization
#: selection:ir.model.fields.anonymize.wizard,state:0
diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py
index 189c3cc8337..7410521e901 100644
--- a/addons/auth_signup/controllers/main.py
+++ b/addons/auth_signup/controllers/main.py
@@ -43,7 +43,6 @@ class AuthSignupHome(Home):
template.sudo().with_context(
lang=user_sudo.lang,
auth_login=werkzeug.url_encode({'auth_login': user_sudo.email}),
- password=request.params.get('password')
).send_mail(user_sudo.id, force_send=True)
return super(AuthSignupHome, self).web_login(*args, **kw)
except UserError as e:
diff --git a/addons/auth_signup/data/auth_signup_data.xml b/addons/auth_signup/data/auth_signup_data.xml
index c0203a52a12..32bde965ba0 100644
--- a/addons/auth_signup/data/auth_signup_data.xml
+++ b/addons/auth_signup/data/auth_signup_data.xml
@@ -157,7 +157,6 @@
<p>
Your login: ${object.email}
<br/>
- Your password: ${ctx['password']}
</p>
<p>
To gain access to your account, you can use the following link:
diff --git a/addons/auth_signup/i18n/af.po b/addons/auth_signup/i18n/af.po
index e95f0c01e3a..8fe284f2eb6 100644
--- a/addons/auth_signup/i18n/af.po
+++ b/addons/auth_signup/i18n/af.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/am.po b/addons/auth_signup/i18n/am.po
index 884e96a66f0..7ed08db42cb 100644
--- a/addons/auth_signup/i18n/am.po
+++ b/addons/auth_signup/i18n/am.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ar.po b/addons/auth_signup/i18n/ar.po
index aec6d4ea4b9..b379535575d 100644
--- a/addons/auth_signup/i18n/ar.po
+++ b/addons/auth_signup/i18n/ar.po
@@ -115,7 +115,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/auth_signup.pot b/addons/auth_signup/i18n/auth_signup.pot
index 3ca1e3ccc53..379775c2600 100644
--- a/addons/auth_signup/i18n/auth_signup.pot
+++ b/addons/auth_signup/i18n/auth_signup.pot
@@ -102,7 +102,6 @@ msgid "<div style=\"padding:0px;width:600px;margin:auto;background: #FFFFFF repe
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/bg.po b/addons/auth_signup/i18n/bg.po
index 5da9afc881c..96d4cbe6673 100644
--- a/addons/auth_signup/i18n/bg.po
+++ b/addons/auth_signup/i18n/bg.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/bs.po b/addons/auth_signup/i18n/bs.po
index e30567817fb..72953b3e2fb 100644
--- a/addons/auth_signup/i18n/bs.po
+++ b/addons/auth_signup/i18n/bs.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ca.po b/addons/auth_signup/i18n/ca.po
index 4154a0f8705..0d58beeaac2 100644
--- a/addons/auth_signup/i18n/ca.po
+++ b/addons/auth_signup/i18n/ca.po
@@ -134,7 +134,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/cs.po b/addons/auth_signup/i18n/cs.po
index bc6da8dee7c..48609ed8491 100644
--- a/addons/auth_signup/i18n/cs.po
+++ b/addons/auth_signup/i18n/cs.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/da.po b/addons/auth_signup/i18n/da.po
index 3613885ead3..9af60c059ef 100644
--- a/addons/auth_signup/i18n/da.po
+++ b/addons/auth_signup/i18n/da.po
@@ -111,7 +111,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/de.po b/addons/auth_signup/i18n/de.po
index c3fd7bc24bf..21e05ff6e1a 100644
--- a/addons/auth_signup/i18n/de.po
+++ b/addons/auth_signup/i18n/de.po
@@ -162,7 +162,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/el.po b/addons/auth_signup/i18n/el.po
index 527e38d061c..bdd6ddbfdeb 100644
--- a/addons/auth_signup/i18n/el.po
+++ b/addons/auth_signup/i18n/el.po
@@ -165,7 +165,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
@@ -199,7 +198,6 @@ msgstr ""
" <p>\n"
" Email/Όνομα χρήστη: ${object.email}\n"
" <br/>\n"
-" Κωδικός Πρόσβασης: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" Για να αποκτήσετε πρόσβαση στο λογαριασμό σας, ακολουθήστε τον παρακάτω σύνδεσμο:\n"
diff --git a/addons/auth_signup/i18n/en_GB.po b/addons/auth_signup/i18n/en_GB.po
index c533eb0e2c3..e9d962451fc 100644
--- a/addons/auth_signup/i18n/en_GB.po
+++ b/addons/auth_signup/i18n/en_GB.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es.po b/addons/auth_signup/i18n/es.po
index 774a8396e23..3579dd699f2 100644
--- a/addons/auth_signup/i18n/es.po
+++ b/addons/auth_signup/i18n/es.po
@@ -174,7 +174,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_AR.po b/addons/auth_signup/i18n/es_AR.po
index 8013046ee26..52cff67e109 100644
--- a/addons/auth_signup/i18n/es_AR.po
+++ b/addons/auth_signup/i18n/es_AR.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_BO.po b/addons/auth_signup/i18n/es_BO.po
index 8d0148b3dfe..b1147946e82 100644
--- a/addons/auth_signup/i18n/es_BO.po
+++ b/addons/auth_signup/i18n/es_BO.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_CL.po b/addons/auth_signup/i18n/es_CL.po
index 5a81f205342..b5a6207ef21 100644
--- a/addons/auth_signup/i18n/es_CL.po
+++ b/addons/auth_signup/i18n/es_CL.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_CO.po b/addons/auth_signup/i18n/es_CO.po
index b0585f4fa38..9cdb25ddfcb 100644
--- a/addons/auth_signup/i18n/es_CO.po
+++ b/addons/auth_signup/i18n/es_CO.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_CR.po b/addons/auth_signup/i18n/es_CR.po
index d137efbae8a..2ed09011556 100644
--- a/addons/auth_signup/i18n/es_CR.po
+++ b/addons/auth_signup/i18n/es_CR.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_DO.po b/addons/auth_signup/i18n/es_DO.po
index 77358762009..5972a4bbd7a 100644
--- a/addons/auth_signup/i18n/es_DO.po
+++ b/addons/auth_signup/i18n/es_DO.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_EC.po b/addons/auth_signup/i18n/es_EC.po
index fd7782eadce..c8c9bc51c10 100644
--- a/addons/auth_signup/i18n/es_EC.po
+++ b/addons/auth_signup/i18n/es_EC.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_PE.po b/addons/auth_signup/i18n/es_PE.po
index 9ee0f51c41e..919743b749a 100644
--- a/addons/auth_signup/i18n/es_PE.po
+++ b/addons/auth_signup/i18n/es_PE.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_PY.po b/addons/auth_signup/i18n/es_PY.po
index 0d37ff54c50..c4dfea726cf 100644
--- a/addons/auth_signup/i18n/es_PY.po
+++ b/addons/auth_signup/i18n/es_PY.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/es_VE.po b/addons/auth_signup/i18n/es_VE.po
index efbe4c21be1..96b47c37681 100644
--- a/addons/auth_signup/i18n/es_VE.po
+++ b/addons/auth_signup/i18n/es_VE.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/et.po b/addons/auth_signup/i18n/et.po
index c2d8db1e7dd..e21bd45495d 100644
--- a/addons/auth_signup/i18n/et.po
+++ b/addons/auth_signup/i18n/et.po
@@ -111,7 +111,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/eu.po b/addons/auth_signup/i18n/eu.po
index 9c44dafbd60..035159ebbc5 100644
--- a/addons/auth_signup/i18n/eu.po
+++ b/addons/auth_signup/i18n/eu.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/fa.po b/addons/auth_signup/i18n/fa.po
index b768510a3af..94919a982a4 100644
--- a/addons/auth_signup/i18n/fa.po
+++ b/addons/auth_signup/i18n/fa.po
@@ -111,7 +111,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/fi.po b/addons/auth_signup/i18n/fi.po
index 1c2f0091215..c2367709374 100644
--- a/addons/auth_signup/i18n/fi.po
+++ b/addons/auth_signup/i18n/fi.po
@@ -114,7 +114,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/fo.po b/addons/auth_signup/i18n/fo.po
index c2b513c1339..47a4304b83d 100644
--- a/addons/auth_signup/i18n/fo.po
+++ b/addons/auth_signup/i18n/fo.po
@@ -105,7 +105,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/fr.po b/addons/auth_signup/i18n/fr.po
index 5d19c895961..345b07411ed 100644
--- a/addons/auth_signup/i18n/fr.po
+++ b/addons/auth_signup/i18n/fr.po
@@ -168,7 +168,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/fr_CA.po b/addons/auth_signup/i18n/fr_CA.po
index 469fd480492..516ffa5ceaa 100644
--- a/addons/auth_signup/i18n/fr_CA.po
+++ b/addons/auth_signup/i18n/fr_CA.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/gl.po b/addons/auth_signup/i18n/gl.po
index d3ba0b2ac14..7e3f96ee07e 100644
--- a/addons/auth_signup/i18n/gl.po
+++ b/addons/auth_signup/i18n/gl.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/he.po b/addons/auth_signup/i18n/he.po
index d4adca058c8..5010a56142a 100644
--- a/addons/auth_signup/i18n/he.po
+++ b/addons/auth_signup/i18n/he.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/hr.po b/addons/auth_signup/i18n/hr.po
index 7ea2aa5a4db..5fe6dfa95cf 100644
--- a/addons/auth_signup/i18n/hr.po
+++ b/addons/auth_signup/i18n/hr.po
@@ -144,7 +144,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/hu.po b/addons/auth_signup/i18n/hu.po
index d88f6f7e87f..242590a5d8c 100644
--- a/addons/auth_signup/i18n/hu.po
+++ b/addons/auth_signup/i18n/hu.po
@@ -165,7 +165,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/id.po b/addons/auth_signup/i18n/id.po
index 6a1a3ff1898..3105d982405 100644
--- a/addons/auth_signup/i18n/id.po
+++ b/addons/auth_signup/i18n/id.po
@@ -112,7 +112,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/it.po b/addons/auth_signup/i18n/it.po
index f590d160d73..4c18b8d3b20 100644
--- a/addons/auth_signup/i18n/it.po
+++ b/addons/auth_signup/i18n/it.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ja.po b/addons/auth_signup/i18n/ja.po
index 3e28504326f..6824517fdc1 100644
--- a/addons/auth_signup/i18n/ja.po
+++ b/addons/auth_signup/i18n/ja.po
@@ -165,7 +165,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ka.po b/addons/auth_signup/i18n/ka.po
index c484d9eb5ed..f61eb2cd8fb 100644
--- a/addons/auth_signup/i18n/ka.po
+++ b/addons/auth_signup/i18n/ka.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/kab.po b/addons/auth_signup/i18n/kab.po
index 0dec5bea4da..0e670472029 100644
--- a/addons/auth_signup/i18n/kab.po
+++ b/addons/auth_signup/i18n/kab.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ko.po b/addons/auth_signup/i18n/ko.po
index d29991121f5..42dba965809 100644
--- a/addons/auth_signup/i18n/ko.po
+++ b/addons/auth_signup/i18n/ko.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/lo.po b/addons/auth_signup/i18n/lo.po
index e7bb5b2769a..8ae06fffbc2 100644
--- a/addons/auth_signup/i18n/lo.po
+++ b/addons/auth_signup/i18n/lo.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/lt.po b/addons/auth_signup/i18n/lt.po
index 31c1bc8ff2a..2ff10d5155a 100644
--- a/addons/auth_signup/i18n/lt.po
+++ b/addons/auth_signup/i18n/lt.po
@@ -112,7 +112,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/lv.po b/addons/auth_signup/i18n/lv.po
index 9b1970fc14b..1f493481075 100644
--- a/addons/auth_signup/i18n/lv.po
+++ b/addons/auth_signup/i18n/lv.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/mk.po b/addons/auth_signup/i18n/mk.po
index 723427f51d1..2bb3dadd211 100644
--- a/addons/auth_signup/i18n/mk.po
+++ b/addons/auth_signup/i18n/mk.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/mn.po b/addons/auth_signup/i18n/mn.po
index 2ac736ff37e..e2ab4e9d82e 100644
--- a/addons/auth_signup/i18n/mn.po
+++ b/addons/auth_signup/i18n/mn.po
@@ -105,7 +105,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/nb.po b/addons/auth_signup/i18n/nb.po
index e16abb8be70..0732fbeafc3 100644
--- a/addons/auth_signup/i18n/nb.po
+++ b/addons/auth_signup/i18n/nb.po
@@ -110,7 +110,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ne.po b/addons/auth_signup/i18n/ne.po
index 8937826cf50..b05079f39bf 100644
--- a/addons/auth_signup/i18n/ne.po
+++ b/addons/auth_signup/i18n/ne.po
@@ -105,7 +105,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/nl.po b/addons/auth_signup/i18n/nl.po
index 2fae789bf5f..94ba16c4dd4 100644
--- a/addons/auth_signup/i18n/nl.po
+++ b/addons/auth_signup/i18n/nl.po
@@ -167,7 +167,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
@@ -201,7 +200,6 @@ msgstr ""
" <p>\n"
" Uw login: ${object.email}\n"
" <br/>\n"
-" Uw wachtwoord: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" Om toegang te krijgen tot uw account, kan u de volgende link gebruiken::\n"
diff --git a/addons/auth_signup/i18n/nl_BE.po b/addons/auth_signup/i18n/nl_BE.po
index 405e872d815..85eb30d00cd 100644
--- a/addons/auth_signup/i18n/nl_BE.po
+++ b/addons/auth_signup/i18n/nl_BE.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/pl.po b/addons/auth_signup/i18n/pl.po
index fbb0f81860f..314a2b54cb9 100644
--- a/addons/auth_signup/i18n/pl.po
+++ b/addons/auth_signup/i18n/pl.po
@@ -114,7 +114,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/pt.po b/addons/auth_signup/i18n/pt.po
index e1e03417c01..ba4833e46b5 100644
--- a/addons/auth_signup/i18n/pt.po
+++ b/addons/auth_signup/i18n/pt.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/pt_BR.po b/addons/auth_signup/i18n/pt_BR.po
index 3b2b3c0b29b..0375c301797 100644
--- a/addons/auth_signup/i18n/pt_BR.po
+++ b/addons/auth_signup/i18n/pt_BR.po
@@ -167,7 +167,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
@@ -201,7 +200,6 @@ msgstr ""
" <p>\n"
" Seu login: ${object.email}\n"
" <br/>\n"
-" Sua senha: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" Para acessar sua conta, você pode acessar o seguinte link:\n"
diff --git a/addons/auth_signup/i18n/ro.po b/addons/auth_signup/i18n/ro.po
index 70f19bf3768..5178308b08a 100644
--- a/addons/auth_signup/i18n/ro.po
+++ b/addons/auth_signup/i18n/ro.po
@@ -139,7 +139,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/ru.po b/addons/auth_signup/i18n/ru.po
index 64d0fa145bc..8a9cd8d9bae 100644
--- a/addons/auth_signup/i18n/ru.po
+++ b/addons/auth_signup/i18n/ru.po
@@ -173,7 +173,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sk.po b/addons/auth_signup/i18n/sk.po
index 5eb7f676417..5138b206acf 100644
--- a/addons/auth_signup/i18n/sk.po
+++ b/addons/auth_signup/i18n/sk.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sl.po b/addons/auth_signup/i18n/sl.po
index e887136c172..ffc11c07444 100644
--- a/addons/auth_signup/i18n/sl.po
+++ b/addons/auth_signup/i18n/sl.po
@@ -105,7 +105,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sq.po b/addons/auth_signup/i18n/sq.po
index 164fdf95948..0bcff3b0ad8 100644
--- a/addons/auth_signup/i18n/sq.po
+++ b/addons/auth_signup/i18n/sq.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sr.po b/addons/auth_signup/i18n/sr.po
index 39bcf501d75..6a1f8a51afb 100644
--- a/addons/auth_signup/i18n/sr.po
+++ b/addons/auth_signup/i18n/sr.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sr@latin.po b/addons/auth_signup/i18n/sr@latin.po
index 0efb9c4cfda..0a9f5db16b1 100644
--- a/addons/auth_signup/i18n/sr@latin.po
+++ b/addons/auth_signup/i18n/sr@latin.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/sv.po b/addons/auth_signup/i18n/sv.po
index d3b6c33642c..aa14a9b4a39 100644
--- a/addons/auth_signup/i18n/sv.po
+++ b/addons/auth_signup/i18n/sv.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/th.po b/addons/auth_signup/i18n/th.po
index 16eaf1167ef..46fe1210082 100644
--- a/addons/auth_signup/i18n/th.po
+++ b/addons/auth_signup/i18n/th.po
@@ -108,7 +108,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/tr.po b/addons/auth_signup/i18n/tr.po
index 00fbe962c82..17d13118d7c 100644
--- a/addons/auth_signup/i18n/tr.po
+++ b/addons/auth_signup/i18n/tr.po
@@ -171,7 +171,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/uk.po b/addons/auth_signup/i18n/uk.po
index 51df9435a86..83cfb0e5b94 100644
--- a/addons/auth_signup/i18n/uk.po
+++ b/addons/auth_signup/i18n/uk.po
@@ -167,7 +167,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/vi.po b/addons/auth_signup/i18n/vi.po
index 4fd58b26cfa..84d5bab21b7 100644
--- a/addons/auth_signup/i18n/vi.po
+++ b/addons/auth_signup/i18n/vi.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/zh_CN.po b/addons/auth_signup/i18n/zh_CN.po
index db90fbcb26e..bd89431a070 100644
--- a/addons/auth_signup/i18n/zh_CN.po
+++ b/addons/auth_signup/i18n/zh_CN.po
@@ -140,7 +140,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/i18n/zh_TW.po b/addons/auth_signup/i18n/zh_TW.po
index 150c5b36fd4..a92edce19b1 100644
--- a/addons/auth_signup/i18n/zh_TW.po
+++ b/addons/auth_signup/i18n/zh_TW.po
@@ -109,7 +109,6 @@ msgid ""
" <p>\n"
" Your login: ${object.email}\n"
" <br/>\n"
-" Your password: ${ctx['password']}\n"
" </p>\n"
" <p>\n"
" To gain access to your account, you can use the following link:\n"
diff --git a/addons/auth_signup/models/res_partner.py b/addons/auth_signup/models/res_partner.py
index 9fbcd27872f..17171c645f6 100644
--- a/addons/auth_signup/models/res_partner.py
+++ b/addons/auth_signup/models/res_partner.py
@@ -32,6 +32,7 @@ class ResPartner(models.Model):
signup_url = fields.Char(compute='_compute_signup_url', string='Signup URL')
@api.multi
+ @api.depends('signup_token', 'signup_expiration')
def _compute_signup_valid(self):
dt = now()
for partner in self:
diff --git a/addons/barcodes/i18n/tr.po b/addons/barcodes/i18n/tr.po
index 0cec71e252e..e1f85af3bdd 100644
--- a/addons/barcodes/i18n/tr.po
+++ b/addons/barcodes/i18n/tr.po
@@ -412,6 +412,8 @@ msgstr "Birim Ürün"
msgid ""
"Used to order rules such that rules with a smaller sequence match first"
msgstr ""
+"ilk olarak küçük sıralarla eşleyen kurallar gibi kullanılan sipariş "
+"kuralları"
#. module: barcodes
#: model:ir.model.fields,help:barcodes.field_barcodes_barcode_events_mixin___barcode_scanned
@@ -426,7 +428,7 @@ msgstr "Tartılmış Ürün"
#. module: barcodes
#: model:ir.model,name:barcodes.model_barcode_nomenclature
msgid "barcode.nomenclature"
-msgstr ""
+msgstr "barcode.nomenclature"
#. module: barcodes
#: model:ir.model,name:barcodes.model_barcode_rule
@@ -436,4 +438,4 @@ msgstr "barkod.kuralı"
#. module: barcodes
#: model:ir.model,name:barcodes.model_barcodes_barcode_events_mixin
msgid "barcodes.barcode_events_mixin"
-msgstr ""
+msgstr "barcodes.barcode_events_mixin"
diff --git a/addons/barcodes/static/src/js/barcode_events.js b/addons/barcodes/static/src/js/barcode_events.js
index 71e07030ffd..a2e5808f8be 100644
--- a/addons/barcodes/static/src/js/barcode_events.js
+++ b/addons/barcodes/static/src/js/barcode_events.js
@@ -53,7 +53,7 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, {
navigator.userAgent.match(/iPod/i) ||
navigator.userAgent.match(/BlackBerry/i) ||
navigator.userAgent.match(/Windows Phone/i);
- this.isChromeMobile = isMobile && window.chrome;
+ this.isChromeMobile = isMobile && navigator.userAgent.match(/Chrome/i);
// Creates an input who will receive the barcode scanner value.
if (this.isChromeMobile) {
@@ -61,7 +61,9 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, {
name: 'barcode',
type: 'text',
css: {
- 'position': 'absolute',
+ 'position': 'fixed',
+ 'top': '50%',
+ 'transform': 'translateY(-50%)',
'opacity': 0,
},
});
diff --git a/addons/base_import/i18n/nl.po b/addons/base_import/i18n/nl.po
index 317594a9792..b81f00756fb 100644
--- a/addons/base_import/i18n/nl.po
+++ b/addons/base_import/i18n/nl.po
@@ -145,7 +145,7 @@ msgstr "Decimaal scheidingsteken:"
#: code:addons/base_import/static/src/xml/base_import.xml:76
#, python-format
msgid "Defer parent/child computation"
-msgstr ""
+msgstr "Uitstellen boven/onderliggende berekening"
#. module: base_import
#: model:ir.model.fields,field_description:base_import.field_base_import_import__display_name
diff --git a/addons/base_vat_autocomplete/models/res_partner.py b/addons/base_vat_autocomplete/models/res_partner.py
index f4afa29ef39..a143ed67568 100644
--- a/addons/base_vat_autocomplete/models/res_partner.py
+++ b/addons/base_vat_autocomplete/models/res_partner.py
@@ -12,6 +12,9 @@ _logger = logging.getLogger(__name__)
try:
import stdnum.eu.vat as stdnum_vat
+ if not hasattr(stdnum_vat, "country_codes"):
+ # stdnum version >= 1.9
+ stdnum_vat.country_codes = stdnum_vat._country_codes
except ImportError:
_logger.warning('Python `stdnum` library not found, unable to call VIES service to detect address based on VAT number.')
stdnum_vat = None
@@ -29,6 +32,11 @@ class ResPartner(models.Model):
cp = lines.pop()
city = lines.pop()
return (cp, city)
+ elif country == 'SE':
+ result = re.match('([0-9]{3}\s?[0-9]{2})\s?([A-Z]+)', lines[-1])
+ if result:
+ lines.pop()
+ return (result.group(1), result.group(2))
else:
result = re.match('((?:L-|AT-)?[0-9\-]+[A-Z]{,2}) (.+)', lines[-1])
if result:
diff --git a/addons/base_vat_autocomplete/views/res_company_view.xml b/addons/base_vat_autocomplete/views/res_company_view.xml
index d35b505da66..385716979ab 100644
--- a/addons/base_vat_autocomplete/views/res_company_view.xml
+++ b/addons/base_vat_autocomplete/views/res_company_view.xml
@@ -11,7 +11,7 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="replace" />
<field name="partner_id" position="after">
- <field name="vat" />
+ <field name="vat" string="VAT"/>
</field>
</field>
</record>
diff --git a/addons/board/static/src/js/favorite_menu.js b/addons/board/static/src/js/favorite_menu.js
index 77cd3df4967..701ebef2801 100644
--- a/addons/board/static/src/js/favorite_menu.js
+++ b/addons/board/static/src/js/favorite_menu.js
@@ -71,6 +71,10 @@ FavoriteMenu.include({
var am = this.findAncestor(function (a) {
return a instanceof ActionManager;
});
+ // with options 'keepSearchView', it may happen that the action_id of
+ // the searchview (received in init) is not the one of the current
+ // action, which corresponds to the one we want to add to dashboard
+ var currentAction = am.getCurrentAction();
var controller = am.getCurrentController();
context.add(controller.widget.getContext());
var c = pyeval.eval('context', context);
@@ -86,7 +90,7 @@ FavoriteMenu.include({
return self._rpc({
route: '/board/add_to_dashboard',
params: {
- action_id: self.action_id || false,
+ action_id: currentAction.id || false,
context_to_save: c,
domain: domain,
view_mode: controller.viewType,
diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js
index 1211fc5da05..9afb88e5648 100644
--- a/addons/board/static/tests/dashboard_tests.js
+++ b/addons/board/static/tests/dashboard_tests.js
@@ -7,6 +7,7 @@ var ListController = require('web.ListController');
var testUtils = require('web.test_utils');
var ListRenderer = require('web.ListRenderer');
+var createActionManager = testUtils.createActionManager;
var createView = testUtils.createView;
QUnit.module('Dashboard', {
@@ -556,4 +557,93 @@ QUnit.test('dashboard intercepts custom events triggered by sub controllers', fu
board.destroy();
});
+QUnit.test('save actions to dashboard', function (assert) {
+ assert.expect(4);
+
+ var actionManager = createActionManager({
+ data: this.data,
+ archs: {
+ 'partner,false,list': '<list><field name="foo"/></list>',
+ 'partner,false,search': '<search></search>',
+ },
+ mockRPC: function (route, args) {
+ if (route === '/board/add_to_dashboard') {
+ assert.strictEqual(args.action_id, 1,
+ "should save the correct action");
+ assert.strictEqual(args.view_mode, 'list',
+ "should save the correct view type");
+ return $.when(true);
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ actionManager.doAction({
+ id: 1,
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'list']],
+ });
+
+ assert.strictEqual(actionManager.$('.o_list_view').length, 1,
+ "should display the list view");
+ assert.strictEqual($('.o_add_to_dashboard_link').length, 1,
+ "should allow the 'Add to dashboard' feature");
+
+ // add this action to dashboard
+ $('.o_add_to_dashboard_button').click();
+
+ actionManager.destroy();
+});
+
+QUnit.test('save to dashboard actions with flag keepSearchView', function (assert) {
+ assert.expect(4);
+
+ var actionManager = createActionManager({
+ data: this.data,
+ archs: {
+ 'partner,false,graph': '<graph><field name="foo"/></graph>',
+ 'partner,false,list': '<list><field name="foo"/></list>',
+ 'partner,false,search': '<search></search>',
+ },
+ mockRPC: function (route, args) {
+ if (route === '/board/add_to_dashboard') {
+ assert.strictEqual(args.action_id, 2,
+ "should save the correct action");
+ assert.strictEqual(args.view_mode, 'graph',
+ "should save the correct view type");
+ return $.when(true);
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ // execute a first action
+ actionManager.doAction({
+ id: 1,
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'list']],
+ });
+
+ // execute another action with flag 'keepSearchView' and add it to dashboard
+ var options = {keepSearchView: true};
+ actionManager.doAction({
+ id: 2,
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'graph']],
+ }, options);
+
+ assert.strictEqual(actionManager.$('.o_graph').length, 1,
+ "should display the graph view");
+ assert.strictEqual($('.o_add_to_dashboard_link').length, 1,
+ "should allow the 'Add to dashboard' feature (this is the same searchview)");
+
+ // add this action to dashboard
+ $('.o_add_to_dashboard_button').click();
+
+ actionManager.destroy();
+});
+
});
diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py
index d252fd7a1d8..aab7df95986 100644
--- a/addons/calendar/models/calendar.py
+++ b/addons/calendar/models/calendar.py
@@ -656,7 +656,13 @@ class Meeting(models.Model):
}[data['rrule_type']]
deadline = fields.Datetime.from_string(data['stop'])
- return deadline + relativedelta(**{delay: count * mult})
+ computed_final_date = False
+ while not computed_final_date and count > 0:
+ try: # may crash if year > 9999 (in case of recurring events)
+ computed_final_date = deadline + relativedelta(**{delay: count * mult})
+ except ValueError:
+ count -= data['interval']
+ return computed_final_date or deadline
return final_date
@api.multi
@@ -1238,7 +1244,12 @@ class Meeting(models.Model):
def _rrule_parse(self, rule_str, data, date_start):
day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
rrule_type = ['yearly', 'monthly', 'weekly', 'daily']
- rule = rrule.rrulestr(rule_str, dtstart=fields.Datetime.from_string(date_start))
+ ddate = fields.Datetime.from_string(date_start)
+ if 'Z' in rule_str and not ddate.tzinfo:
+ ddate = ddate.replace(tzinfo=pytz.timezone('UTC'))
+ rule = rrule.rrulestr(rule_str, dtstart=ddate)
+ else:
+ rule = rrule.rrulestr(rule_str, dtstart=ddate)
if rule._freq > 0 and rule._freq < 4:
data['rrule_type'] = rrule_type[rule._freq]
diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml
index 1548ddfacba..80994d946fa 100644
--- a/addons/calendar/views/calendar_views.xml
+++ b/addons/calendar/views/calendar_views.xml
@@ -194,7 +194,6 @@
<group>
<field name="privacy"/>
<field name="show_as"/>
- <field name="rrule" invisible="1" readonly="0" />
<field name="recurrent_id" invisible="1" />
</group>
</group>
diff --git a/addons/crm/i18n/fr.po b/addons/crm/i18n/fr.po
index 5396d477ca8..927944d3420 100644
--- a/addons/crm/i18n/fr.po
+++ b/addons/crm/i18n/fr.po
@@ -2492,7 +2492,7 @@ msgstr "Cet objectif n'existe pas."
#: model:ir.ui.view,arch_db:crm.crm_case_form_view_leads
#: model:ir.ui.view,arch_db:crm.crm_case_form_view_oppor
msgid "Title"
-msgstr "Civilité"
+msgstr "Titre"
#. module: crm
#: model:ir.ui.view,arch_db:crm.view_crm_case_opportunities_filter
diff --git a/addons/crm/i18n/nl.po b/addons/crm/i18n/nl.po
index 54a2c177c77..078a6c36e63 100644
--- a/addons/crm/i18n/nl.po
+++ b/addons/crm/i18n/nl.po
@@ -500,7 +500,7 @@ msgstr ""
#: code:addons/crm/static/src/js/tour.js:54
#, python-format
msgid "Click on the opportunity to zoom in."
-msgstr ""
+msgstr "Klik op de prospect om in te zoomen."
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_opportunity_report__date_closed
@@ -1022,7 +1022,7 @@ msgstr "Forceer toewijzing"
#. module: crm
#: model:ir.ui.view,arch_db:crm.res_config_settings_view_form
msgid "Format phone numbers based on national conventions"
-msgstr ""
+msgstr "Opmaak telefoonnummers gebaseerd op nationale afspraken."
#. module: crm
#: code:addons/crm/models/crm_lead.py:588
@@ -1115,7 +1115,7 @@ msgstr "Hoog"
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_team__dashboard_graph_group_pipeline
msgid "How this channel's dashboard graph will group the results."
-msgstr "Hoe dit kanaal zijn dashboard grafieken het resultaat groeperen."
+msgstr "Hoe dit kanaal zijn dashboard grafieken zal groeperen."
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_activity_report__id
@@ -1878,7 +1878,7 @@ msgstr "Telefoon"
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_config_settings__module_crm_phone_validation
msgid "Phone Formatting"
-msgstr ""
+msgstr "Telefoonnummer opmaak"
#. module: crm
#: code:addons/crm/models/crm_team.py:165
diff --git a/addons/delivery/i18n/nl.po b/addons/delivery/i18n/nl.po
index 0ec30a52699..29894eae5e4 100644
--- a/addons/delivery/i18n/nl.po
+++ b/addons/delivery/i18n/nl.po
@@ -482,7 +482,7 @@ msgstr "Lengte moet positief zijn"
#. module: delivery
#: model:ir.model.fields,help:delivery.field_delivery_carrier__debug_logging
msgid "Log requests in order to ease debugging"
-msgstr "Log aanvragen in volgorde om makkelijker fouten te kunnen traceren"
+msgstr "Log aanvragen om gemakkelijker fouten te kunnen traceren"
#. module: delivery
#: model:ir.ui.view,arch_db:delivery.view_picking_withcarrier_out_form
diff --git a/addons/delivery/i18n/tr.po b/addons/delivery/i18n/tr.po
index 7c1abce7d98..95001ab65ff 100644
--- a/addons/delivery/i18n/tr.po
+++ b/addons/delivery/i18n/tr.po
@@ -250,7 +250,7 @@ msgstr "Teslimat Paketi Seçim Sihirbazı"
#: model:ir.ui.menu,name:delivery.menu_delivery_packagings
#: model:ir.ui.view,arch_db:delivery.product_packaging_delivery_tree
msgid "Delivery Packages"
-msgstr ""
+msgstr "Teslimat Paketi"
#. module: delivery
#: model:ir.model.fields,field_description:delivery.field_choose_delivery_package__delivery_packaging_id
diff --git a/addons/delivery/i18n/zh_CN.po b/addons/delivery/i18n/zh_CN.po
index fec8b6eb997..534d92e166d 100644
--- a/addons/delivery/i18n/zh_CN.po
+++ b/addons/delivery/i18n/zh_CN.po
@@ -11,13 +11,14 @@
# 老窦 北京 <2662059195@qq.com>, 2018
# e2f <projects@e2f.com>, 2018
# e2f_cn c5 <jarvisn@ecinnovations.com>, 2018
+# John Lin <linyinhuan@139.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: e2f_cn c5 <jarvisn@ecinnovations.com>, 2018\n"
+"Last-Translator: John Lin <linyinhuan@139.com>, 2018\n"
"Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -720,7 +721,7 @@ msgstr "发货重量"
#: model:ir.ui.view,arch_db:delivery.report_package_barcode_delivery
#: model:ir.ui.view,arch_db:delivery.report_package_barcode_small_delivery
msgid "Shipping Weight:"
-msgstr ""
+msgstr "装运重量:"
#. module: delivery
#: model:ir.model.fields,help:delivery.field_product_product__hs_code
@@ -849,7 +850,7 @@ msgstr ""
#: model:ir.ui.view,arch_db:delivery.report_package_barcode_delivery
#: model:ir.ui.view,arch_db:delivery.report_package_barcode_small_delivery
msgid "Weight:"
-msgstr ""
+msgstr "重量:"
#. module: delivery
#: model:ir.model.fields,field_description:delivery.field_product_packaging__width
diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py
index f6dd0fbb9d8..b2ffaf67231 100644
--- a/addons/delivery/models/sale_order.py
+++ b/addons/delivery/models/sale_order.py
@@ -96,9 +96,10 @@ class SaleOrder(models.Model):
taxes_ids = self.fiscal_position_id.map_tax(taxes, carrier.product_id, self.partner_id).ids
# Create the sales order line
+ carrier_name = carrier.product_id.with_context(lang=self.partner_id.lang).name_get()[0][1]
values = {
'order_id': self.id,
- 'name': carrier.name,
+ 'name': carrier_name,
'product_uom_qty': 1,
'product_uom': carrier.product_id.uom_id.id,
'product_id': carrier.product_id.id,
diff --git a/addons/delivery/models/stock_picking.py b/addons/delivery/models/stock_picking.py
index 395ca2f753a..86517b1d0ec 100644
--- a/addons/delivery/models/stock_picking.py
+++ b/addons/delivery/models/stock_picking.py
@@ -159,6 +159,8 @@ class StockPicking(models.Model):
def send_to_shipper(self):
self.ensure_one()
res = self.carrier_id.send_shipping(self)[0]
+ if self.carrier_id.free_over and self.sale_id and self.sale_id._compute_amount_total_without_delivery() >= self.carrier_id.amount:
+ res['exact_price'] = 0.0
self.carrier_price = res['exact_price']
self.carrier_tracking_ref = res['tracking_number']
order_currency = self.sale_id.currency_id or self.company_id.currency_id
diff --git a/addons/delivery/tests/test_delivery_cost.py b/addons/delivery/tests/test_delivery_cost.py
index 67ff55339ba..7e496317279 100644
--- a/addons/delivery/tests/test_delivery_cost.py
+++ b/addons/delivery/tests/test_delivery_cost.py
@@ -30,7 +30,10 @@ class TestDeliveryCost(common.TransactionCase):
self.free_delivery = self.env.ref('delivery.free_delivery_carrier')
# as the tests hereunder assume all the prices in USD, we must ensure
# that the company actually uses USD
- self.env.user.company_id.write({'currency_id': self.env.ref('base.USD').id})
+ self.env.cr.execute(
+ "UPDATE res_company SET currency_id = %s WHERE id = %s",
+ [self.env.ref('base.USD').id, self.env.user.company_id.id])
+ self.pricelist.currency_id = self.env.ref('base.USD').id
def test_00_delivery_cost(self):
# In order to test Carrier Cost
diff --git a/addons/event/models/event.py b/addons/event/models/event.py
index 8da37166275..e8d9fe33abe 100644
--- a/addons/event/models/event.py
+++ b/addons/event/models/event.py
@@ -220,6 +220,11 @@ class EventEvent(models.Model):
else:
self.date_end_located = False
+ @api.onchange('is_online')
+ def _onchange_is_online(self):
+ if self.is_online:
+ self.address_id = False
+
@api.onchange('event_type_id')
def _onchange_type(self):
if self.event_type_id:
diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py
index 1013f5a083b..680e1d4ba8a 100644
--- a/addons/event/models/event_mail.py
+++ b/addons/event/models/event_mail.py
@@ -4,7 +4,12 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, tools
+from odoo.tools import exception_to_unicode
+from odoo.tools.translate import _
+import random
+import logging
+_logger = logging.getLogger(__name__)
_INTERVALS = {
'hours': lambda interval: relativedelta(hours=interval),
@@ -115,12 +120,51 @@ class EventMailScheduler(models.Model):
return True
@api.model
+ def _warn_template_error(self, scheduler, exception):
+ # We warn ~ once by hour ~ instead of every 10 min if the interval unit is more than 'hours'.
+ if random.random() < 0.1666 or scheduler.interval_unit in ('now', 'hours'):
+ ex_s = exception_to_unicode(exception)
+ try:
+ event, template = scheduler.event_id, scheduler.template_id
+ emails = list(set([event.organizer_id.email, event.user_id.email, template.write_uid.email]))
+ subject = _("WARNING: Event Scheduler Error for event: %s" % event.name)
+ body = _("""Event Scheduler for:
+ - Event: %s (%s)
+ - Scheduled: %s
+ - Template: %s (%s)
+
+ Failed with error:
+ - %s
+
+ You receive this email because you are:
+ - the organizer of the event,
+ - or the responsible of the event,
+ - or the last writer of the template."""
+ % (event.name, event.id, scheduler.scheduled_date, template.name, template.id, ex_s))
+ email = self.env['ir.mail_server'].build_email(
+ email_from=self.env.user.email,
+ email_to=emails,
+ subject=subject, body=body,
+ )
+ self.env['ir.mail_server'].send_email(email)
+ except Exception as e:
+ _logger.error("Exception while sending traceback by email: %s.\n Original Traceback:\n%s", e, exception)
+ pass
+
+ @api.model
def run(self, autocommit=False):
schedulers = self.search([('done', '=', False), ('scheduled_date', '<=', datetime.strftime(fields.datetime.now(), tools.DEFAULT_SERVER_DATETIME_FORMAT))])
for scheduler in schedulers:
- scheduler.execute()
- if autocommit:
- self.env.cr.commit()
+ try:
+ with self.env.cr.savepoint():
+ scheduler.execute()
+ except Exception as e:
+ _logger.exception(e)
+ self.invalidate_cache()
+ self._warn_template_error(scheduler, e)
+ else:
+ if autocommit:
+ self.env.cr.commit()
return True
diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv
index 49d859ad183..ed7ec0e0cc6 100644
--- a/addons/event/security/ir.model.access.csv
+++ b/addons/event/security/ir.model.access.csv
@@ -5,7 +5,7 @@ access_event_event_portal,event.event.portal,model_event_event,,1,0,0,0
access_event_event_user,event.event.user,model_event_event,event.group_event_user,1,0,0,0
access_event_event_manager,event.event.manager,model_event_event,event.group_event_manager,1,1,1,1
access_event_registration,event.registration,model_event_registration,event.group_event_user,1,1,1,1
-access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0
+access_event_registration_portal,event.registration,model_event_registration,,0,0,0,0
access_event_mail,event.mail,model_event_mail,event.group_event_user,1,0,0,0
access_event_mail_manager,event.mail manager,model_event_mail,event.group_event_manager,1,1,1,1
access_event_mail_registration,event.mail.registration,model_event_mail_registration,event.group_event_user,1,0,0,0
diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py
index 20e04f3ecea..208f9b9d901 100644
--- a/addons/event_sale/models/sale_order.py
+++ b/addons/event_sale/models/sale_order.py
@@ -41,7 +41,7 @@ class SaleOrderLine(models.Model):
order line has a product_uom_qty attribute that will be the number of
registrations linked to this line. This method update existing registrations
and create new one for missing one. """
- Registration = self.env['event.registration']
+ Registration = self.env['event.registration'].sudo()
registrations = Registration.search([('sale_order_line_id', 'in', self.ids), ('state', '!=', 'cancel')])
for so_line in self.filtered('event_id'):
existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id)
diff --git a/addons/fleet/i18n/nl.po b/addons/fleet/i18n/nl.po
index 8edb02db928..72eef1fb731 100644
--- a/addons/fleet/i18n/nl.po
+++ b/addons/fleet/i18n/nl.po
@@ -363,7 +363,7 @@ msgstr ""
#. module: fleet
#: model:ir.actions.act_window,help:fleet.fleet_vehicle_costs_action
msgid "Create a new cost"
-msgstr ""
+msgstr "Maak een nieuwe kost"
#. module: fleet
#: model:ir.actions.act_window,help:fleet.fleet_vehicle_log_fuel_action
@@ -378,7 +378,7 @@ msgstr ""
#. module: fleet
#: model:ir.actions.act_window,help:fleet.fleet_vehicle_model_action
msgid "Create a new model"
-msgstr ""
+msgstr "Maak een nieuw model"
#. module: fleet
#: model:ir.actions.act_window,help:fleet.fleet_vehicle_odometer_action
diff --git a/addons/gamification/i18n/nl.po b/addons/gamification/i18n/nl.po
index 2ec3fb4eda0..ee201ef7b68 100644
--- a/addons/gamification/i18n/nl.po
+++ b/addons/gamification/i18n/nl.po
@@ -929,7 +929,7 @@ msgstr "Gebruiker aanmaken"
#. module: gamification
#: model:ir.actions.act_window,help:gamification.badge_list_action
msgid "Create a new badge"
-msgstr ""
+msgstr "Maak een nieuwe badge"
#. module: gamification
#: model:ir.actions.act_window,help:gamification.challenge_list_action
@@ -944,7 +944,7 @@ msgstr "Maak een nieuw doel"
#. module: gamification
#: model:ir.actions.act_window,help:gamification.goal_definition_list_action
msgid "Create a new goal definition"
-msgstr ""
+msgstr "Maak een nieuwe doeldefinitie aan"
#. module: gamification
#: model:ir.actions.act_window,help:gamification.action_new_simplified_res_users
diff --git a/addons/gamification/models/goal.py b/addons/gamification/models/goal.py
index 3c062401662..6cd52b2ab81 100644
--- a/addons/gamification/models/goal.py
+++ b/addons/gamification/models/goal.py
@@ -259,7 +259,7 @@ class Goal(models.Model):
If the end date is passed (at least +1 day, time not considered) without
the target value being reached, the goal is set as failed."""
goals_by_definition = {}
- for goal in self:
+ for goal in self.with_context(prefetch_fields=False):
goals_by_definition.setdefault(goal.definition_id, []).append(goal)
for definition, goals in goals_by_definition.items():
diff --git a/addons/gamification_sale_crm/i18n/ru.po b/addons/gamification_sale_crm/i18n/ru.po
index 4cc45095e3c..728f1a7db14 100644
--- a/addons/gamification_sale_crm/i18n/ru.po
+++ b/addons/gamification_sale_crm/i18n/ru.po
@@ -4,14 +4,15 @@
#
# Translators:
# Максим Дронь <dronmax@gmail.com>, 2017
-# Martin Trigaux <mat@odoo.com>, 2017
+# Martin Trigaux, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 10.saas~18\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-09-20 09:53+0000\n"
-"PO-Revision-Date: 2017-09-20 09:53+0000\n"
-"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
+"POT-Creation-Date: 2018-03-22 14:10+0000\n"
+"PO-Revision-Date: 2018-03-22 14:10+0000\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -70,7 +71,7 @@ msgstr "Время для подготовки инициативы"
#. module: gamification_sale_crm
#: model:gamification.goal.definition,name:gamification_sale_crm.definition_crm_tot_customer_refunds
msgid "Total Customer Credit Notes"
-msgstr ""
+msgstr "Всего кредит-нот клиента"
#. module: gamification_sale_crm
#: model:gamification.challenge.line,name:gamification_sale_crm.line_crm_sale1
diff --git a/addons/hr/i18n/ru.po b/addons/hr/i18n/ru.po
index dcd02f55b1e..f31224ae3d0 100644
--- a/addons/hr/i18n/ru.po
+++ b/addons/hr/i18n/ru.po
@@ -14,13 +14,14 @@
# Denis Trepalin <zekarious@gmail.com>, 2017
# Masha Koc <mariya.kos.ua@gmail.com>, 2017
# Dmitry sky <d.v.selitsky@gmail.com>, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Dmitry sky <d.v.selitsky@gmail.com>, 2017\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -130,7 +131,7 @@ msgstr "Компания"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_res_config_settings__resource_calendar_id
msgid "Company Working Hours"
-msgstr ""
+msgstr "Рабочие часы компании"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_department__complete_name
@@ -287,6 +288,7 @@ msgid ""
"Enter here the private address of the employee, not the one linked to your "
"company."
msgstr ""
+"Сюда следует вводить личный адрес сотрудника, не связанный с компанией."
#. module: hr
#: code:addons/hr/models/hr.py:310
@@ -556,6 +558,9 @@ msgid ""
" related to employees by departments: expenses, timesheets,\n"
" leaves, recruitments, etc."
msgstr ""
+"В Odoo структура отдела используется, чтобы управлять всеми документами,\n"
+" относящимися к сотрудникам отдела: расходыми, табелями,\n"
+" отгулами, рекрутиногом и т.п."
#. module: hr
#: model:res.groups,name:hr.group_hr_user
@@ -595,12 +600,12 @@ msgstr "Должность"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__address_home_id
msgid "Private Address"
-msgstr ""
+msgstr "Личный адрес"
#. module: hr
#: model:ir.ui.view,arch_db:hr.view_employee_form
msgid "Private Information"
-msgstr ""
+msgstr "Личная информация"
#. module: hr
#: model:ir.actions.act_window,help:hr.action_hr_job
@@ -658,6 +663,8 @@ msgid ""
"Set default calendar used to compute time allocation for leaves, timesheets,"
" ..."
msgstr ""
+"Выберите календарь по умолчанию, который используется для распределения "
+"рабочего времени табелях, отуглах и т.д."
#. module: hr
#: model:ir.model.fields,help:hr.field_hr_job__state
@@ -677,17 +684,17 @@ msgstr "Настройки"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_res_config_settings__module_hr_org_chart
msgid "Show Organizational Chart"
-msgstr ""
+msgstr "Показать организационную структуру"
#. module: hr
#: model:ir.ui.view,arch_db:hr.res_config_settings_view_form
msgid "Show organizational chart on employee form"
-msgstr ""
+msgstr "Показать организационную структуру в карточке сотрудника"
#. module: hr
#: model:ir.ui.view,arch_db:hr.res_config_settings_view_form
msgid "Show organizational chart on employee form."
-msgstr ""
+msgstr "Показать организационную структуру в карточке сотрудника."
#. module: hr
#: selection:hr.employee,marital:0
@@ -760,7 +767,7 @@ msgstr "Теги"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__is_address_home_a_company
msgid "The employee adress has a company linked"
-msgstr ""
+msgstr "Адрес сотрудника привязан к адресу компании"
#. module: hr
#: sql_constraint:hr.job:0
@@ -809,6 +816,9 @@ msgid ""
" This private address is used in the expense report reimbursement document.\n"
" It should be different from the work address."
msgstr ""
+"Введите личный(домашний) адрес сотрудника.\n"
+" Они используется в документах по возмещениям расходов и пр.\n"
+" Должен отличаться от рабочего адреса."
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__user_id
@@ -823,7 +833,7 @@ msgstr "Пользователи"
#. module: hr
#: model:ir.ui.view,arch_db:hr.hr_job_view_kanban
msgid "Vacancies :"
-msgstr ""
+msgstr "Вакансии :"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__visa_expire
@@ -855,7 +865,7 @@ msgstr ""
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__address_id
msgid "Work Address"
-msgstr ""
+msgstr "Рабочий адрес"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__work_email
@@ -865,7 +875,7 @@ msgstr "Рабочая эл. почта"
#. module: hr
#: model:ir.ui.view,arch_db:hr.view_employee_form
msgid "Work Information"
-msgstr ""
+msgstr "Информация по работе"
#. module: hr
#: model:ir.model.fields,field_description:hr.field_hr_employee__work_location
@@ -880,7 +890,7 @@ msgstr "Рабочий сотовый телефон"
#. module: hr
#: model:ir.ui.view,arch_db:hr.res_config_settings_view_form
msgid "Work Organization"
-msgstr ""
+msgstr "Организация работы"
#. module: hr
#: model:ir.ui.view,arch_db:hr.view_employee_form
diff --git a/addons/hr_attendance/models/hr_employee.py b/addons/hr_attendance/models/hr_employee.py
index 3f7eee536cf..e0cec9681bc 100644
--- a/addons/hr_attendance/models/hr_employee.py
+++ b/addons/hr_attendance/models/hr_employee.py
@@ -54,7 +54,8 @@ class HrEmployee(models.Model):
@api.depends('last_attendance_id.check_in', 'last_attendance_id.check_out', 'last_attendance_id')
def _compute_attendance_state(self):
for employee in self:
- employee.attendance_state = employee.last_attendance_id and not employee.last_attendance_id.check_out and 'checked_in' or 'checked_out'
+ att = employee.last_attendance_id.sudo()
+ employee.attendance_state = att and not att.check_out and 'checked_in' or 'checked_out'
@api.constrains('pin')
def _verify_pin(self):
diff --git a/addons/hr_attendance/static/src/js/kiosk_mode.js b/addons/hr_attendance/static/src/js/kiosk_mode.js
index 9b7f5b7f7cd..750fa43df47 100644
--- a/addons/hr_attendance/static/src/js/kiosk_mode.js
+++ b/addons/hr_attendance/static/src/js/kiosk_mode.js
@@ -2,6 +2,7 @@ odoo.define('hr_attendance.kiosk_mode', function (require) {
"use strict";
var AbstractAction = require('web.AbstractAction');
+var ajax = require('web.ajax');
var core = require('web.core');
var Session = require('web.session');
@@ -28,6 +29,8 @@ var KioskMode = AbstractAction.extend({
self.$el.html(QWeb.render("HrAttendanceKioskMode", {widget: self}));
self.start_clock();
});
+ // Make a RPC call every day to keep the session alive
+ self._interval = window.setInterval(this._callServer.bind(this), (60*60*1000*24));
return $.when(def, this._super.apply(this, arguments));
},
@@ -56,8 +59,15 @@ var KioskMode = AbstractAction.extend({
destroy: function () {
core.bus.off('barcode_scanned', this, this._onBarcodeScanned);
clearInterval(this.clock_start);
+ clearInterval(this._interval);
this._super.apply(this, arguments);
},
+
+ _callServer: function () {
+ // Make a call to the database to avoid the auto close of the session
+ return ajax.rpc("/web/webclient/version_info", {});
+ },
+
});
core.action_registry.add('hr_attendance_kiosk_mode', KioskMode);
diff --git a/addons/hr_contract/i18n/ru.po b/addons/hr_contract/i18n/ru.po
index 9fb3eaa80a4..f6dcc1db875 100644
--- a/addons/hr_contract/i18n/ru.po
+++ b/addons/hr_contract/i18n/ru.po
@@ -14,13 +14,14 @@
# Sergey <naviserg1@gmail.com>, 2017
# Gennady Marchenko <gennadym@gmail.com>, 2017
# Nikita Moshkalov <CLTanuki@gmail.com>, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Nikita Moshkalov <CLTanuki@gmail.com>, 2017\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -187,7 +188,7 @@ msgstr "Отображаемое Имя"
#. module: hr_contract
#: model:ir.ui.view,arch_db:hr_contract.hr_contract_view_kanban
msgid "Edit Contract"
-msgstr ""
+msgstr "Редактировать договор"
#. module: hr_contract
#: model:ir.model,name:hr_contract.model_hr_employee
@@ -204,12 +205,12 @@ msgstr "Договор с сотрудником"
#. module: hr_contract
#: model:ir.model.fields,help:hr_contract.field_hr_contract__wage
msgid "Employee's monthly gross wage."
-msgstr ""
+msgstr "Месячная зарплата сотрудника брутто."
#. module: hr_contract
#: model:ir.model.fields,help:hr_contract.field_hr_contract__resource_calendar_id
msgid "Employee's working schedule."
-msgstr ""
+msgstr "График работы сотрудника"
#. module: hr_contract
#: model:ir.model.fields,field_description:hr_contract.field_hr_contract__date_end
@@ -219,17 +220,17 @@ msgstr "Дата окончания"
#. module: hr_contract
#: model:ir.model.fields,help:hr_contract.field_hr_contract__date_end
msgid "End date of the contract (if it's a fixed-term contract)."
-msgstr ""
+msgstr "Дата окончания контракта(контракт с фиксированным сроком)"
#. module: hr_contract
#: model:ir.model.fields,help:hr_contract.field_hr_contract__trial_date_end
msgid "End date of the trial period (if there is one)."
-msgstr ""
+msgstr "Дата окончания испытательного срока(если таковой имеется)"
#. module: hr_contract
#: model:ir.model.fields,field_description:hr_contract.field_hr_contract__trial_date_end
msgid "End of Trial Period"
-msgstr ""
+msgstr "Конец испытательного срока"
#. module: hr_contract
#: selection:hr.contract,state:0
@@ -326,7 +327,7 @@ msgstr "Дата медицинского осмотра"
#. module: hr_contract
#: model:ir.ui.view,arch_db:hr_contract.hr_contract_view_form
msgid "Monthly Advantages in Cash"
-msgstr ""
+msgstr "Месячные поощрения в деньгах"
#. module: hr_contract
#: selection:hr.contract,state:0
@@ -357,7 +358,7 @@ msgstr "Выполняется"
#. module: hr_contract
#: model:ir.ui.view,arch_db:hr_contract.hr_contract_view_form
msgid "Salary Information"
-msgstr ""
+msgstr "Информация по заработной плате"
#. module: hr_contract
#: model:ir.ui.view,arch_db:hr_contract.hr_contract_view_search
@@ -383,7 +384,7 @@ msgstr "Дата начала"
#. module: hr_contract
#: model:ir.model.fields,help:hr_contract.field_hr_contract__date_start
msgid "Start date of the contract."
-msgstr ""
+msgstr "Дата начала договора"
#. module: hr_contract
#: model:ir.ui.view,arch_db:hr_contract.hr_contract_view_search
diff --git a/addons/hr_expense/data/hr_expense_data.xml b/addons/hr_expense/data/hr_expense_data.xml
index 6a52987ee40..c1e3b559758 100644
--- a/addons/hr_expense/data/hr_expense_data.xml
+++ b/addons/hr_expense/data/hr_expense_data.xml
@@ -2,21 +2,6 @@
<odoo>
<data noupdate="1">
- <!--default alias for leads-->
- <record id="mail_alias_expense" model="mail.alias">
- <field name="alias_name">expense</field>
- <field name="alias_model_id" ref="model_hr_expense"/>
- <field name="alias_user_id" ref="base.user_root"/>
- <field name="alias_contact">employees</field>
- </record>
-
-
- <!-- Resource: product.categ -->
- <record id="cat_expense" model="product.category">
- <field name="parent_id" ref="product.product_category_all"/>
- <field name="name">Expenses</field>
- </record>
-
<record id="product_product_fixed_cost" model="product.product">
<field name="name">Expenses</field>
<field name="list_price">0.0</field>
diff --git a/addons/hr_expense/data/hr_expense_demo.xml b/addons/hr_expense/data/hr_expense_demo.xml
index bb8c605f1aa..514a3189001 100644
--- a/addons/hr_expense/data/hr_expense_demo.xml
+++ b/addons/hr_expense/data/hr_expense_demo.xml
@@ -28,7 +28,7 @@
<field name="default_code">CarTRA</field>
<field name="uom_id" ref="uom.product_uom_km"/>
<field name="uom_po_id" ref="uom.product_uom_km"/>
- <field name="categ_id" ref="hr_expense.cat_expense"/>
+ <field name="categ_id" ref="product.cat_expense"/>
<field name="can_be_expensed" eval="True" />
<field name="image" type="base64" file="hr_expense/static/img/car_travel-image.jpg"/>
</record>
@@ -52,7 +52,7 @@
<field name="default_code">HA0</field>
<field name="uom_id" ref="uom.product_uom_day"/>
<field name="uom_po_id" ref="uom.product_uom_day"/>
- <field name="categ_id" ref="hr_expense.cat_expense"/>
+ <field name="categ_id" ref="product.cat_expense"/>
<field name="can_be_expensed" eval="True" />
<field name="image" type="base64" file="hr_expense/static/img/hotel_rent-image.jpg"/>
</record>
diff --git a/addons/hr_expense/i18n/hu.po b/addons/hr_expense/i18n/hu.po
index c64915c2125..1d8e7ea2644 100644
--- a/addons/hr_expense/i18n/hu.po
+++ b/addons/hr_expense/i18n/hu.po
@@ -1187,7 +1187,7 @@ msgstr "A napló amit a kiadás elvégzése után használ."
#: code:addons/hr_expense/wizard/hr_expense_sheet_register_payment.py:35
#, python-format
msgid "The payment amount must be strictly positive."
-msgstr ""
+msgstr "A fizetés összege csak pozitív lehet"
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_sheet__bank_journal_id
diff --git a/addons/hr_expense/i18n/nl.po b/addons/hr_expense/i18n/nl.po
index cc758e9f644..f54f89db1c0 100644
--- a/addons/hr_expense/i18n/nl.po
+++ b/addons/hr_expense/i18n/nl.po
@@ -275,12 +275,12 @@ msgstr "Goedgekeurde declaraties"
#: model:ir.actions.act_window,help:hr_expense.hr_expense_actions_all
#: model:ir.actions.act_window,help:hr_expense.hr_expense_actions_my_unsubmitted
msgid "Create a new expense"
-msgstr ""
+msgstr "Maak een nieuwe uitgave"
#. module: hr_expense
#: model:ir.actions.act_window,help:hr_expense.hr_expense_product
msgid "Create a new expense category"
-msgstr ""
+msgstr "Maak een nieuwe uitgave categorie"
#. module: hr_expense
#: model:ir.actions.act_window,help:hr_expense.action_hr_expense_sheet_all_all
@@ -288,7 +288,7 @@ msgstr ""
#: model:ir.actions.act_window,help:hr_expense.action_hr_expense_sheet_all_to_post
#: model:ir.actions.act_window,help:hr_expense.action_hr_expense_sheet_my_all
msgid "Create a new expense report"
-msgstr ""
+msgstr "Maak een nieuw uitgave rapport"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__create_uid
diff --git a/addons/hr_expense/i18n/zh_CN.po b/addons/hr_expense/i18n/zh_CN.po
index fe9fdc58cbd..2754a62c695 100644
--- a/addons/hr_expense/i18n/zh_CN.po
+++ b/addons/hr_expense/i18n/zh_CN.po
@@ -119,7 +119,7 @@ msgstr "<strong>验证于:</strong>"
msgid ""
"A payment of %s %s with the reference <a href='/mail/view?%s'>%s</a> related"
" to your expense %s has been made."
-msgstr "已完成含有与费用 % 相关的参考 <a href=\"/mail/view?%s\">% 的</a> %s %s 支付 。"
+msgstr "金额为 %s %s 的付款单 <a href='/mail/view?%s'>%s</a> (相关费用申请单: %s ) 已支付。"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__account_id
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index ce1c039c355..c30dcba9512 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -437,6 +437,7 @@ class HrExpense(models.Model):
expense_description = expense_description.replace(product_code.group(), '')
products = self.env['product.product'].search([('default_code', 'ilike', product_code.group(1))]) or default_product
product = products.filtered(lambda p: p.default_code == product_code.group(1)) or products[0]
+ account = product.product_tmpl_id._get_product_accounts()['expense']
pattern = '[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?'
# Match the last occurence of a float in the string
@@ -463,6 +464,8 @@ class HrExpense(models.Model):
'unit_amount': price,
'company_id': employee.company_id.id,
})
+ if account:
+ custom_values['account_id'] = account.id
return super(HrExpense, self).message_new(msg_dict, custom_values)
diff --git a/addons/hr_gamification/i18n/ru.po b/addons/hr_gamification/i18n/ru.po
index b5cb3057cb8..3151c8d0e4f 100644
--- a/addons/hr_gamification/i18n/ru.po
+++ b/addons/hr_gamification/i18n/ru.po
@@ -9,13 +9,14 @@
# Collex100, 2017
# Sergey Vilizhanin <sv@grimmette.ru>, 2017
# Максим Дронь <dronmax@gmail.com>, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Максим Дронь <dronmax@gmail.com>, 2017\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -160,7 +161,7 @@ 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
diff --git a/addons/hr_holidays/i18n/nl.po b/addons/hr_holidays/i18n/nl.po
index 33cc5a9d3be..1b438212806 100644
--- a/addons/hr_holidays/i18n/nl.po
+++ b/addons/hr_holidays/i18n/nl.po
@@ -262,12 +262,12 @@ msgstr "Verloftoewijzing goedkeuren"
#. module: hr_holidays
#: model:mail.message.subtype,name:hr_holidays.mt_department_leave_allocation_confirmed
msgid "Allocations Confirmed"
-msgstr ""
+msgstr "Bevestigde verloven"
#. module: hr_holidays
#: model:mail.message.subtype,name:hr_holidays.mt_department_leave_allocation_first_validated
msgid "Allocations First Approval"
-msgstr ""
+msgstr "Verloven eerste goedkeuring"
#. module: hr_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_department_leave_allocation_approve
@@ -319,7 +319,7 @@ msgstr "Goedgekeurd"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.view_hr_leave_allocation_filter
msgid "Approved Allocations"
-msgstr ""
+msgstr "Goedgekeurde verloven"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.view_hr_holidays_filter
@@ -329,7 +329,7 @@ msgstr "Goedgekeurd verlof"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.view_hr_holidays_filter_report
msgid "Approved Requests"
-msgstr ""
+msgstr "Goedgekeurde aanvragen"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.hr_holidays_leaves_assign_tree_view
diff --git a/addons/hr_holidays/i18n/ru.po b/addons/hr_holidays/i18n/ru.po
index 1d3178fdce9..1bbdb172458 100644
--- a/addons/hr_holidays/i18n/ru.po
+++ b/addons/hr_holidays/i18n/ru.po
@@ -16,13 +16,14 @@
# Алексей Билькевич (belskiy) <mmmbrsk@gmail.com>, 2017
# Viktor Pogrebniak <vp@aifil.ru>, 2017
# Max Belyanin <maxbelyanin@gmail.com>, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Max Belyanin <maxbelyanin@gmail.com>, 2017\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -65,7 +66,7 @@ msgstr "%g оставаясь вне %g"
#: code:addons/hr_holidays/models/hr_leave.py:205
#, python-format
msgid "%s : %.2f day(s)"
-msgstr ""
+msgstr "%s : %.2f дней"
#. module: hr_holidays
#: code:addons/hr_holidays/models/hr_leave.py:207
@@ -105,12 +106,12 @@ msgstr "&lt;th class=\"text-center\" colspan="
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.hr_leave_report_kanban
msgid "<small class=\"text-muted\">from</small>"
-msgstr ""
+msgstr "<small class=\"text-muted\">from</small>"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.hr_leave_report_kanban
msgid "<small class=\"text-muted\">to</small>"
-msgstr ""
+msgstr "<small class=\"text-muted\">to</small>"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.report_holidayssummary
@@ -260,7 +261,7 @@ msgstr "Распределение для %s"
#: code:addons/hr_holidays/models/hr_leave_allocation.py:114
#, python-format
msgid "Allocation of %s : %.2f day(s) To %s"
-msgstr ""
+msgstr "Планирование для %s : %.2f день(дней) до %s"
#. module: hr_holidays
#: model:ir.model.fields,field_description:hr_holidays.field_hr_department__allocation_to_approve_count
@@ -639,7 +640,7 @@ msgstr "Первое утверждение"
#: code:addons/hr_holidays/report/holidays_summary_report.py:112
#, 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
@@ -929,7 +930,7 @@ msgstr "Обзор отгулов"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.hr_holiday_status_view_kanban
msgid "Leaves Taken:"
-msgstr ""
+msgstr "Использованные отпуска:"
#. module: hr_holidays
#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_dept
@@ -963,7 +964,7 @@ msgstr "Отпуска."
#. module: hr_holidays
#: model:hr.leave.type,name:hr_holidays.holiday_status_cl
msgid "Legal Leaves 2018"
-msgstr ""
+msgstr "Обязательные отпуска 2018"
#. module: hr_holidays
#: selection:hr.leave.type,color_name:0
@@ -1027,7 +1028,7 @@ msgstr "Менеджеры"
#. module: hr_holidays
#: model:ir.ui.view,arch_db:hr_holidays.hr_holiday_status_view_kanban
msgid "Max Leaves:"
-msgstr ""
+msgstr "Макс. отпуск:"
#. module: hr_holidays
#: model:ir.model.fields,field_description:hr_holidays.field_hr_leave_type__max_leaves
@@ -1124,6 +1125,7 @@ msgstr "Количество отпуска"
msgid ""
"Number of days of the leave request according to your working schedule."
msgstr ""
+"Количество рабочих дней по календарю, приходящихся на запрашиваемый период."
#. module: hr_holidays
#: model:res.groups,name:hr_holidays.group_hr_holidays_user
@@ -1148,6 +1150,10 @@ msgid ""
" type (recuperation, legal leaves, sickness) and the exact\n"
" number of open days related to your leave."
msgstr ""
+"После того, как вы запишите запрос на отпуск, он будет отправлен\n"
+" к менеджеру на утверждение. Убедитесь, что вы отсылаете запрос на отпуск\n"
+" на верное количество дней, а также правильного вида(по болезни, плановый \n"
+"\t\tотпуск, компенсация и т.п.)."
#. module: hr_holidays
#: code:addons/hr_holidays/models/hr_leave.py:366
@@ -1415,6 +1421,10 @@ msgid ""
"The status is 'Refused', when leave request is refused by manager.\n"
"The status is 'Approved', when leave request is approved by manager."
msgstr ""
+"Статус 'Запросить', когда запрос создан.\n"
+"Статус 'Утвердить', когда запрос подтвержден пользователем.\n"
+"Статус 'Отклонен', когда запрос отклонен менеджером.\n"
+"Статус 'Утверждён', когда запрос одобрен менеджером."
#. module: hr_holidays
#: model:ir.model.fields,help:hr_holidays.field_hr_leave__first_approver_id
@@ -1447,12 +1457,16 @@ msgstr ""
msgid ""
"This value is given by the sum of all leaves requests with a negative value."
msgstr ""
+"Это значение считается как сумма всех запросов на отпусков с отрицательным "
+"значением."
#. module: hr_holidays
#: model:ir.model.fields,help:hr_holidays.field_hr_leave_type__max_leaves
msgid ""
"This value is given by the sum of all leaves requests with a positive value."
msgstr ""
+"Это значение считается как сумма всех запросов на отпусков с положительным "
+"значением."
#. module: hr_holidays
#: selection:hr.leave,state:0 selection:hr.leave.allocation,state:0
@@ -1536,7 +1550,7 @@ msgstr "Проверить"
#: model:ir.ui.view,arch_db:hr_holidays.view_hr_holidays_filter_report
#: model:ir.ui.view,arch_db:hr_holidays.view_hr_leave_allocation_filter
msgid "Validator"
-msgstr ""
+msgstr "Утверждающий"
#. module: hr_holidays
#: selection:hr.leave.type,color_name:0
diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index b43f012e1af..4884b481da9 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -114,11 +114,6 @@ class HolidaysRequest(models.Model):
('date_check', "CHECK ( number_of_days_temp >= 0 )", "The number of days must be greater than 0."),
]
- @api.onchange('employee_id')
- def _onchange_employee_id(self):
- self.manager_id = self.employee_id and self.employee_id.parent_id
- self.department_id = self.employee_id.department_id
-
@api.multi
@api.depends('number_of_days_temp')
def _compute_number_of_days(self):
@@ -160,7 +155,8 @@ class HolidaysRequest(models.Model):
self.department_id = None
@api.onchange('employee_id')
- def _onchange_employee(self):
+ def _onchange_employee_id(self):
+ self.manager_id = self.employee_id and self.employee_id.parent_id
if self.holiday_type == 'employee':
self.department_id = self.employee_id.department_id
diff --git a/addons/hr_holidays/report/hr_leave_reports.xml b/addons/hr_holidays/report/hr_leave_reports.xml
index 18d8785721e..6f884671c37 100644
--- a/addons/hr_holidays/report/hr_leave_reports.xml
+++ b/addons/hr_holidays/report/hr_leave_reports.xml
@@ -33,8 +33,6 @@
<filter name="group_name" string="Description" context="{'group_by':'name'}"/>
<filter name="group_employee" string="Employee" context="{'group_by':'employee_id'}"/>
<filter name="group_category" string="Category" context="{'group_by':'category_id'}"/>
- <filter name="group_manager" string="Manager" context="{'group_by':'manager_id'}"/>
- <filter name="group_second_approver_id" string="Validator" context="{'group_by':'second_approver_id'}"/>
<filter name="group_type" string="Type" context="{'group_by':'holiday_status_id'}"/>
<separator/>
<filter name="group_date_from" string="Start Month" context="{'group_by':'date_from'}"/>
@@ -118,7 +116,7 @@
<field name="res_model">hr.leave.report</field>
<field name="src_model">hr.employee</field>
<field name="view_type">form</field>
- <field name="view_mode">tree,kanban</field>
+ <field name="view_mode">tree,kanban,form</field>
<field name="view_id" eval="hr_leave_report_tree"/>
<field name="context">{
'search_default_group_type': 1,
diff --git a/addons/hr_payroll/i18n/de.po b/addons/hr_payroll/i18n/de.po
index 70edf965692..675d505ca83 100644
--- a/addons/hr_payroll/i18n/de.po
+++ b/addons/hr_payroll/i18n/de.po
@@ -915,7 +915,7 @@ msgstr "Netto"
#. module: hr_payroll
#: model:hr.salary.rule,name:hr_payroll.hr_rule_net
msgid "Net Salary"
-msgstr ""
+msgstr "Nettogehalt"
#. module: hr_payroll
#: code:addons/hr_payroll/models/hr_payslip.py:199
diff --git a/addons/hr_payroll/i18n/ru.po b/addons/hr_payroll/i18n/ru.po
index 31124569917..10fea1d0e61 100644
--- a/addons/hr_payroll/i18n/ru.po
+++ b/addons/hr_payroll/i18n/ru.po
@@ -305,7 +305,7 @@ msgstr "Дочернее определение"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.res_config_settings_view_form
msgid "Choose a Payroll Localization"
-msgstr ""
+msgstr "Выберите локализацию расчетного листа"
#. module: hr_payroll
#: selection:hr.payslip.run,state:0
@@ -331,7 +331,7 @@ msgstr "Код"
#: model:ir.ui.view,arch_db:hr_payroll.hr_payroll_structure_view_kanban
#: model:ir.ui.view,arch_db:hr_payroll.hr_salary_rule_view_kanban
msgid "Code:"
-msgstr ""
+msgstr "Код:"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.view_hr_payslip_filter
@@ -656,7 +656,7 @@ msgstr ""
#: code:addons/hr_payroll/report/report_contribution_register.py:34
#, python-format
msgid "Form content is missing, this report cannot be printed."
-msgstr ""
+msgstr "Не найдены данные в форме, отчет не сформирован"
#. module: hr_payroll
#: model:ir.model.fields,field_description:hr_payroll.field_res_config_settings__module_l10n_fr_hr_payroll
@@ -1021,12 +1021,12 @@ msgstr "Платёжная ведомость"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.res_config_settings_view_form
msgid "Payroll Entries"
-msgstr ""
+msgstr "Строки платежной ведомости"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.res_config_settings_view_form
msgid "Payroll Rules"
-msgstr ""
+msgstr "Правила платежной ведомости"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.view_hr_payroll_structure_filter
@@ -1036,7 +1036,7 @@ msgstr "Структуры платежной ведомости"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.res_config_settings_view_form
msgid "Payroll rules that apply to your country"
-msgstr ""
+msgstr "Правила составления платежной ведомости в вашей стране"
#. module: hr_payroll
#: model:ir.actions.report,name:hr_payroll.action_report_payslip
@@ -1157,7 +1157,7 @@ msgstr "Период"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.res_config_settings_view_form
msgid "Post payroll slips in accounting"
-msgstr ""
+msgstr "Отправить расчетники в бухгалтерию"
#. module: hr_payroll
#: model:ir.ui.view,arch_db:hr_payroll.view_payslip_lines_contribution_register
diff --git a/addons/hr_timesheet/i18n/nl.po b/addons/hr_timesheet/i18n/nl.po
index 9b7f55431dc..151bb895ae7 100644
--- a/addons/hr_timesheet/i18n/nl.po
+++ b/addons/hr_timesheet/i18n/nl.po
@@ -233,7 +233,7 @@ msgstr "Project -"
#: model:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Record a new activity"
-msgstr ""
+msgstr "Registreer een nieuwe activiteit"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user__remaining_hours
diff --git a/addons/hr_timesheet/i18n/ru.po b/addons/hr_timesheet/i18n/ru.po
index 3c9f2eb65cf..f1511f29a6d 100644
--- a/addons/hr_timesheet/i18n/ru.po
+++ b/addons/hr_timesheet/i18n/ru.po
@@ -12,13 +12,14 @@
# Masha Koc <mariya.kos.ua@gmail.com>, 2017
# Sergey Vilizhanin <sv@grimmette.ru>, 2017
# Max Belyanin <maxbelyanin@gmail.com>, 2017
+# sergeiruzkiicode <sergei.ruzki@icode.by>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Max Belyanin <maxbelyanin@gmail.com>, 2017\n"
+"Last-Translator: sergeiruzkiicode <sergei.ruzki@icode.by>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -34,7 +35,7 @@ msgstr "<span class=\"o_label\">Табели</span>"
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
-msgstr ""
+msgstr "Табели"
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
@@ -91,7 +92,7 @@ msgstr "Apple App магазин"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings__module_project_timesheet_synchro
msgid "Awesome Timesheet"
-msgstr ""
+msgstr "Шикарные табели"
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
@@ -114,7 +115,7 @@ msgstr "По Проекту"
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
-msgstr ""
+msgstr "По задаче"
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task__total_hours_spent
@@ -269,11 +270,15 @@ msgid ""
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
+"Продавайте услуги(например, проекты, обслуживание), записывайте затраченное "
+"время в приложение Табели и выставляйте счета на основании фиксированных "
+"цен(заказанного количества) или на основании затраченного "
+"времени(поставленного количества)"
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
-msgstr ""
+msgstr "Продавайте услуги и выставляйте счета за время"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
@@ -299,7 +304,7 @@ msgstr ""
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
-msgstr ""
+msgstr "Синхронизируйте затраты времени с веб/мобильным приложением"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
@@ -328,7 +333,7 @@ msgstr "Эта неделя"
#: code:addons/hr_timesheet/models/project.py:63
#, python-format
msgid "This task must have a project since they are linked to timesheets."
-msgstr ""
+msgstr "У задачи должен быть проект, раз она связана с табелями."
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.report_timesheet
@@ -338,12 +343,12 @@ msgstr "Время"
#. module: hr_timesheet
#: model:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
-msgstr ""
+msgstr "Время(часы)"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings__module_sale_timesheet
msgid "Time Billing"
-msgstr ""
+msgstr "Биллинг времени"
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
diff --git a/addons/hr_timesheet/models/hr_timesheet.py b/addons/hr_timesheet/models/hr_timesheet.py
index 5344a16aed0..5ec54373833 100644
--- a/addons/hr_timesheet/models/hr_timesheet.py
+++ b/addons/hr_timesheet/models/hr_timesheet.py
@@ -74,6 +74,7 @@ class AccountAnalyticLine(models.Model):
if vals.get('project_id') and not vals.get('account_id'):
project = self.env['project.project'].browse(vals.get('project_id'))
vals['account_id'] = project.analytic_account_id.id
+ vals['company_id'] = project.analytic_account_id.company_id.id
if not project.analytic_account_id.active:
raise UserError(_('The project you are timesheeting on is not linked to a active analytic account. Please the project configuration.'))
# employee implies user
diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py
index 37534b1194c..1a5ddfa0b61 100644
--- a/addons/hr_timesheet/models/project.py
+++ b/addons/hr_timesheet/models/project.py
@@ -9,7 +9,7 @@ class Project(models.Model):
_inherit = "project.project"
allow_timesheets = fields.Boolean("Allow timesheets", default=True)
- analytic_account_id = fields.Many2one('account.analytic.account', string="Analytic Account", ondelete='set null',
+ analytic_account_id = fields.Many2one('account.analytic.account', string="Analytic Account", copy=False, ondelete='set null',
help="Link this project to an analytic account if you need financial management on projects. "
"It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc.")
@@ -154,8 +154,10 @@ class Task(models.Model):
# a timesheet must have an analytic account (and a project)
if self and not project_id:
raise UserError(_('This task must be part of a project because they some timesheets are linked to it.'))
+ account_id = self.env['project.project'].browse(project_id).sudo().analytic_account_id
self.sudo().mapped('timesheet_ids').write({
'project_id': project_id,
- 'account_id': self.env['project.project'].browse(project_id).sudo().analytic_account_id.id
+ 'account_id': account_id.id,
+ 'company_id': account_id.company_id.id,
})
return result
diff --git a/addons/http_routing/geoipresolver.py b/addons/http_routing/geoipresolver.py
index 1f9b0e22724..24bbe723d6d 100644
--- a/addons/http_routing/geoipresolver.py
+++ b/addons/http_routing/geoipresolver.py
@@ -47,10 +47,14 @@ class GeoIPResolver(object):
r = self._db.city(ip)
except (ValueError, geoip2.errors.AddressNotFoundError):
return {}
+ # Compatibility with Legacy database.
+ # Some ips cannot be located to a specific country. Legacy DB used to locate them in
+ # continent instead of country. Do the same to not change behavior of existing code.
+ country, attr = (r.country, 'iso_code') if r.country.geoname_id else (r.continent, 'code')
return {
'city': r.city.name,
- 'country_code': r.country.iso_code,
- 'country_name': r.country.name,
+ 'country_code': getattr(country, attr),
+ 'country_name': country.name,
'region': r.subdivisions[0].iso_code if r.subdivisions else None,
'time_zone': r.location.time_zone,
}
diff --git a/addons/iap/__manifest__.py b/addons/iap/__manifest__.py
index 35124df76eb..6a30ed891c9 100644
--- a/addons/iap/__manifest__.py
+++ b/addons/iap/__manifest__.py
@@ -9,7 +9,7 @@
'description': """
This module provides standard tools (account model, context manager and helpers) to support In-App purchases inside Odoo.
""",
- 'depends': ['web'],
+ 'depends': ['web', 'web_settings_dashboard'],
'data': [
'security/ir.model.access.csv',
'security/ir_rule.xml',
diff --git a/addons/iap/i18n/tr.po b/addons/iap/i18n/tr.po
index 117e4b5bf1c..0a841f08079 100644
--- a/addons/iap/i18n/tr.po
+++ b/addons/iap/i18n/tr.po
@@ -5,13 +5,14 @@
# Translators:
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Umur Akın <umura@projetgrup.com>, 2018
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -104,7 +105,7 @@ msgstr "Yetersiz Bakiye"
#: code:addons/iap/static/src/xml/iap_templates.xml:14
#, python-format
msgid "Insufficient credit to perform this service."
-msgstr ""
+msgstr "Bu hizmeti vermek için yetersiz kredi."
#. module: iap
#: model:ir.model.fields,field_description:iap.field_iap_account____last_update
diff --git a/addons/l10n_be/i18n_extra/nl_BE.po b/addons/l10n_be/i18n_extra/nl_BE.po
index 88d6c4b61ee..2a4b067ee33 100644
--- a/addons/l10n_be/i18n_extra/nl_BE.po
+++ b/addons/l10n_be/i18n_extra/nl_BE.po
@@ -18,935 +18,774 @@ msgstr ""
"X-Generator: Poedit 1.8.12\n"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-00
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-00
msgid "0% Biens d'investissement"
msgstr "0% Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-G
msgid "0% Biens divers"
msgstr "0% Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-CC
msgid "0% Cocont."
msgstr "0% Medecont."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-00-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-00-CC
msgid "0% Cocont. - Biens d'investissement"
msgstr "0% Medecont. - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-00-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-00-CC
msgid "0% Cocont. M."
msgstr "0% Medecont. G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-CC
msgid "0% Cocont. S."
msgstr "0% Medecont. D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-00-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-00-EU
msgid "0% EU - Biens d'investissement"
msgstr "0% EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-EU-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-EU-G
msgid "0% EU - Biens divers"
msgstr "0% EU - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-00-EU
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-EU-L
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-00-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-EU-L
msgid "0% EU M."
msgstr "0% EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-EU-S
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-EU-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-EU-S
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-EU-S
msgid "0% EU S."
msgstr "0% EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-EU-T
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-EU-T
msgid "0% EU T."
msgstr "0% EU. T."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-00
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-00
msgid "0% M."
msgstr "0% G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-ROW
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-ROW
msgid "0% Non EU"
msgstr "0% Non EU"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-00-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-00-ROW-CC
msgid "0% Non EU - Biens d'investissement"
msgstr "0% Niet EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-00-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-00-ROW-CC
msgid "0% Non EU M."
msgstr "0% Non EU G. "
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-ROW-CC
msgid "0% Non EU S."
msgstr "0% Non EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-00-S
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-00-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-00-S
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-00-S
msgid "0% S."
msgstr "0% D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-12-L
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-12-L
msgid "12%"
msgstr "12%"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12
msgid "12% Biens d'investissement"
msgstr "12% Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-G
msgid "12% Biens divers"
msgstr "12% Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-CC
msgid "12% Cocont. - Biens d'investissement"
msgstr "12% Medecont. - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-CC-C1
msgid "12% Cocont. Déductible - Biens d'investissement"
msgstr "12% Medecont. Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-CC-C1
msgid "12% Cocont. Déductible M."
msgstr "12% Medecont. Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-CC-C1
msgid "12% Cocont. Déductible S."
msgstr "12% Medecont. Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-CC
msgid "12% Cocont. M."
msgstr "12% Medecont. G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-CC-C2
msgid "12% Cocont. Récupérable - Biens d'investissement"
msgstr "12% Medecont. Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-CC-C2
msgid "12% Cocont. Récupérable M."
msgstr "12% Medecont. Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-CC-C2
msgid "12% Cocont. Récupérable S."
msgstr "12% Medecont. Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-CC
msgid "12% Cocont. S."
msgstr "12% Medecont. D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-EU
msgid "12% EU - Biens d'investissement"
msgstr "12% EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-G
msgid "12% EU - Biens divers"
msgstr "12% EU - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-EU-C1
msgid "12% EU Déductible - Biens d'investissement"
msgstr "12% EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-G-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-G-C1
msgid "12% EU Déductible - Biens divers"
msgstr "12% EU Aftrekbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-EU-C1
msgid "12% EU Déductible M."
msgstr "12% EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-S-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-S-C1
msgid "12% EU Déductible S."
msgstr "12% EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-EU
msgid "12% EU M."
msgstr "12% EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-EU-C2
msgid "12% EU Récupérable - Biens d'investissement"
msgstr "12% EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-EU-C2
msgid "12% EU Récupérable M."
msgstr "12% EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-S-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-S-C2
msgid "12% EU Récupérable S."
msgstr "12% EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-S
msgid "12% EU S."
msgstr "12% EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12
msgid "12% M."
msgstr "12% G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-ROW-CC
msgid "12% Non EU - Biens d'investissement"
msgstr "12% Niet EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-ROW-CC-C1
msgid "12% Non EU Déductible - Biens d'investissement"
msgstr "12% Niet EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-ROW-CC-C1
msgid "12% Non EU Déductible M."
msgstr "12% Non EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-ROW-CC-C1
msgid "12% Non EU Déductible S."
msgstr "12% Niet EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-ROW-CC
msgid "12% Non EU M."
msgstr "12% Niet EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-12-ROW-CC-C2
msgid "12% Non EU Récupérable - Biens d'investissement"
msgstr "12% Niet EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-12-ROW-CC-C2
msgid "12% Non EU Récupérable M."
msgstr "12% Niet EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-ROW-CC-C2
msgid "12% Non EU Récupérable S."
msgstr "12% Non EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-ROW-CC
msgid "12% Non EU S."
msgstr "12% Niet EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-S
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-12-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-S
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-12-S
msgid "12% S."
msgstr "12% D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-21-L
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-21-L
msgid "21%"
msgstr "21%"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21
msgid "21% Biens d'investissement"
msgstr "21% Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-G
msgid "21% Biens divers"
msgstr "21% Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-CC
msgid "21% Cocont .S."
msgstr "21% Medecont. D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-CC
msgid "21% Cocont. - Biens d'investissement"
msgstr "21% Medecont. - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-CC-C1
msgid "21% Cocont. Déductible - Biens d'investissement"
msgstr "21% Medecont. Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-CC-C1
msgid "21% Cocont. Déductible M."
msgstr "21% Medecont. Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-CC-C1
msgid "21% Cocont. Déductible S."
msgstr "21% Medecont. Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-CC
msgid "21% Cocont. M."
msgstr "21% Medecont. G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-CC-C2
msgid "21% Cocont. Récupérable - Biens d'investissement"
msgstr "21% Medecont. Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-CC-C2
msgid "21% Cocont. Récupérable M."
msgstr "21% Medecont. Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-CC-C2
msgid "21% Cocont. Récupérable S."
msgstr "21% Medecont. Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-EU
msgid "21% EU - Biens d'investissement"
msgstr "21% EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-G
msgid "21% EU - Biens divers"
msgstr "21% EU - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-EU-C1
msgid "21% EU Déductible - Biens d'investissement"
msgstr "21% EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-G-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-G-C1
msgid "21% EU Déductible - Biens divers"
msgstr "21% EU Aftrekbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-EU-C1
msgid "21% EU Déductible M."
msgstr "21% EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-S-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-S-C1
msgid "21% EU Déductible S."
msgstr "21% EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-EU
msgid "21% EU M."
msgstr "21% EU. G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-EU-C2
msgid "21% EU Récupérable - Biens d'investissement"
msgstr "21% EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-G-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-G-C2
msgid "21% EU Récupérable - Biens divers"
msgstr "21% EU Verhaalbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-EU-C2
msgid "21% EU Récupérable M."
msgstr "21% EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-S-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-S-C2
msgid "21% EU Récupérable S."
msgstr "21% EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-EU-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-EU-S
msgid "21% EU S."
msgstr "21% EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21
msgid "21% M."
msgstr "21% G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-ROW-CC
msgid "21% Non EU - Biens d'investissement"
msgstr "21% Niet EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-ROW-CC-C1
msgid "21% Non EU Déductible - Biens d'investissement"
msgstr "21% Non EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-ROW-CC-C1
msgid "21% Non EU Déductible M."
msgstr "21% Non EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-ROW-CC-C1
msgid "21% Non EU Déductible S."
msgstr "21% Non EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-ROW-CC
msgid "21% Non EU M."
msgstr "21% Niet EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-21-ROW-CC-C2
msgid "21% Non EU Récupérable - Biens d'investissement"
msgstr "21% Non EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-21-ROW-CC-C2
msgid "21% Non EU Récupérable M."
msgstr "21% Non EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-ROW-CC-C2
msgid "21% Non EU Récupérable S."
msgstr "21% Niet EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-ROW-CC
msgid "21% Non EU S."
msgstr "21% Non EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-21-S
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-21-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-21-S
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-21-S
msgid "21% S."
msgstr "21% D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_TVA-21-inclus-dans-prix
#: model:account.tax.template,name:l10n_be.attn_TVA-21-inclus-dans-prix
msgid "21% S. TTC"
msgstr "21% D. (Inclusief BTW)"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-CAR-EXC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-CAR-EXC-C2
msgid "50% Déductible - Frais de voiture (Prix Excl.)"
msgstr "50% Aftrekbaar - Autokosten (Prijs Excl.)"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-CAR-EXC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-CAR-EXC-C1
msgid "50% Non Déductible - Frais de voiture"
msgstr "50% Niet Aftrekbaar - Autokosten"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-CAR-EXC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-CAR-EXC
msgid "50% Non Déductible - Frais de voiture (Prix Excl.)"
msgstr "50% Niet Aftrekbaar - Autokosten (Prijs Excl.)"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06
msgid "6% Biens d'investissement"
msgstr "6% Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-G
msgid "6% Biens divers"
msgstr "6% Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-CC
msgid "6% Cocont. - Biens d'investissement"
msgstr "6% Medecont. - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-CC-C1
msgid "6% Cocont. Déductible - Biens d'investissement"
msgstr "6% Medecont. Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-CC-C1
msgid "6% Cocont. Déductible M."
msgstr "6% Medecont. Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-CC-C1
msgid "6% Cocont. Déductible S."
msgstr "6% Medecont. Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-CC
msgid "6% Cocont. M."
msgstr "6% Medecont. G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-CC-C2
msgid "6% Cocont. Récupérable - Biens d'investissement"
msgstr "6% Medecont. Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-CC-C2
msgid "6% Cocont. Récupérable M."
msgstr "6% Medecont. Verhaalbaar G. "
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-CC-C2
msgid "6% Cocont. Récupérable S."
msgstr "6% Medecont. Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-CC
msgid "6% Cocont. S."
msgstr "6% Medecont. D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-EU
msgid "6% EU - Biens d'investissement"
msgstr "6% EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-G
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-G
msgid "6% EU - Biens divers"
msgstr "6% EU - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-EU-C1
msgid "6% EU Déductible - Biens d'investissement"
msgstr "6% EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-G-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-G-C1
msgid "6% EU Déductible - Biens divers"
msgstr "6% EU Aftrekbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-EU-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-EU-C1
msgid "6% EU Déductible M."
msgstr "6% EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-S-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-S-C1
msgid "6% EU Déductible S."
msgstr "6% EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-EU
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-EU
msgid "6% EU M."
msgstr "6% EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-EU-C2
msgid "6% EU Récupérable - Biens d'investissement"
msgstr "6% EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-G-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-G-C2
msgid "6% EU Récupérable - Biens divers"
msgstr "6% EU Verhaalbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-EU-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-EU-C2
msgid "6% EU Récupérable M."
msgstr "6% EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-S-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-S-C2
msgid "6% EU Récupérable S."
msgstr "6% EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-EU-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-EU-S
msgid "6% EU S."
msgstr "6% EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06
msgid "6% M."
msgstr "6% G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-ROW-CC
msgid "6% Non EU - Biens d'investissement"
msgstr "6% Niet EU - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-ROW-CC-C1
msgid "6% Non EU Déductible - Biens d'investissement"
msgstr "6% Niet EU Aftrekbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-ROW-CC-C1
msgid "6% Non EU Déductible M."
msgstr "6% Niet EU Aftrekbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC-C1
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-ROW-CC-C1
msgid "6% Non EU Déductible S."
msgstr "6% Niet EU Aftrekbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-ROW-CC
msgid "6% Non EU M."
msgstr "6% Niet EU G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V83-06-ROW-CC-C2
msgid "6% Non EU Récupérable - Biens d'investissement"
msgstr "6% Non EU Verhaalbaar - Investeringsgoederen"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V81-06-ROW-CC-C2
msgid "6% Non EU Récupérable M."
msgstr "6% Niet EU Verhaalbaar G."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-ROW-CC-C2
msgid "6% Non EU Récupérable S."
msgstr "6% Niet EU Verhaalbaar D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-ROW-CC
msgid "6% Non EU S."
msgstr "6% Niet EU D."
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-06-S
-#: model:account.tax,name:l10n_be.1_attn_VAT-OUT-06-S
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-06-S
#: model:account.tax.template,name:l10n_be.attn_VAT-OUT-06-S
msgid "6% S."
msgstr "6% D."
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a601
#: model:account.account.template,name:l10n_be.a601
msgid "Achats de fournitures"
msgstr "Aankopen van hulpstoffen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a604
#: model:account.account.template,name:l10n_be.a604
msgid "Achats de marchandises"
msgstr "Aankopen van handelsgoederen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a600
#: model:account.account.template,name:l10n_be.a600
msgid "Achats de matières premières"
msgstr "Aankopen van grondstoffen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a602
#: model:account.account.template,name:l10n_be.a602
msgid "Achats de services, travaux et études"
msgstr "Aankopen van diensten, werk en studies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a446
#: model:account.account.template,name:l10n_be.a446
msgid "Acomptes reçus"
msgstr "Ontvangen voorschotten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a176
#: model:account.account.template,name:l10n_be.a176
msgid "Acomptes reçus sur commandes"
msgstr "Ontvangen vooruitbetalingen op bestellingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a406
#: model:account.account.template,name:l10n_be.a406
msgid "Acomptes versés"
msgstr "Vooruitbetalingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a360
#: model:account.account.template,name:l10n_be.a360
msgid "Acomptes versés sur achats pour stocks"
msgstr "Vooruitbetalingen op aankopen voor aandelen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4550
#: model:account.account.template,name:l10n_be.a4550
msgid "Administrateurs, gérants et commissaires"
msgstr "Bestuurders, zaakvoerders en commissarissen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2119
#: model:account.account.template,name:l10n_be.a2119
msgid "Amortissements sur concessions, brevets, etc..."
msgstr "Afschrijvingen op consessies, octrooien, licenties, ..."
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2690
#: model:account.account.template,name:l10n_be.a2690
msgid "Amortissements sur frais d'aménagement des locaux pris en location"
msgstr "Op inrichtingskosten gehuurde lokalen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2009
#: model:account.account.template,name:l10n_be.a2009
msgid "Amortissements sur frais de constitution et d'augmentation de capital"
msgstr "Afschrijvingen op oprichtingskosten en kapitaalverhoging"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2109
#: model:account.account.template,name:l10n_be.a2109
msgid "Amortissements sur frais de recherche et de mise au point"
msgstr "Afschrijving van kosten van onderzoek en ontwikkeling"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24190
#: model:account.account.template,name:l10n_be.a24190
msgid "Amortissements sur matériel automobile"
msgstr "Afschrijvingen op wagenuitrusting"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24090
#: model:account.account.template,name:l10n_be.a24090
msgid "Amortissements sur mobilier"
msgstr "Afschrijvingen op meubilair"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2529
#: model:account.account.template,name:l10n_be.a2529
msgid "Amortissements sur mobilier et matériel roulant en leasing"
msgstr "Afschrijvingen op geleasd rollend materieel"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a614
#: model:account.account.template,name:l10n_be.a614
msgid "Annonces, publicité, propagande et documentation"
msgstr "Advertenties, publiciteit, propaganda en documentatie"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a3100
#: model:account.account.template,name:l10n_be.a3100
msgid "Approvisionements et fournitures"
msgstr "Materialen en benodigdheden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4160
#: model:account.account.template,name:l10n_be.a4160
msgid "Associés"
msgstr "Vennoten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a45932
#: model:account.account.template,name:l10n_be.a45932
msgid "Assurance groupe "
msgstr "Groepsverzekering"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a45930
#: model:account.account.template,name:l10n_be.a45930
msgid "Assurance loi"
msgstr "Wetsverzekering"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a45931
#: model:account.account.template,name:l10n_be.a45931
msgid "Assurance salaire garanti "
msgstr "Verzekering gewaarborgd inkomen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a45933
#: model:account.account.template,name:l10n_be.a45933
msgid "Assurances individuelles"
msgstr "Individuele verzekering"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a41671
#: model:account.account.template,name:l10n_be.a41671
msgid "Autres créances"
msgstr "Overige vorderingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a174
-#: model:account.account,name:l10n_be.1_a424
#: model:account.account.template,name:l10n_be.a174
#: model:account.account.template,name:l10n_be.a424
msgid "Autres emprunts"
msgstr "Overige leningen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4125
#: model:account.account.template,name:l10n_be.a4125
msgid "Autres impôts belges"
msgstr "Overige Belgische belastingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a49102
-#: model:account.account,name:l10n_be.1_a740
#: model:account.account.template,name:l10n_be.a49102
#: model:account.account.template,name:l10n_be.a740
msgid "Autres produits d'exploitation"
msgstr "Andere bedrijfsopbrengsten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4538
#: model:account.account.template,name:l10n_be.a4538
msgid "Autres précomptes retenus"
msgstr "Andere ingehouden voorheffingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4161
#: model:account.account.template,name:l10n_be.a4161
msgid "Avances et prêts au personnel"
msgstr "Voorschotten en leningen aan het personeel"
@@ -1132,854 +971,701 @@ msgid "Belgium VAT Form: grid 88"
msgstr ""
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a140
#: model:account.account.template,name:l10n_be.a140
msgid "Bénéfice reporté"
msgstr "Overgedragen winst"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a790
#: model:account.account.template,name:l10n_be.a790
msgid "Bénéfice reporté de l'exercice précédent"
msgstr "Overgedragen winst van het vorige boekjaar"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a693
#: model:account.account.template,name:l10n_be.a693
msgid "Bénéfice à reporter"
msgstr "Over te dragen winst"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4594
#: model:account.account.template,name:l10n_be.a4594
msgid "Caisse d'assurances sociales pour travailleurs indépendants"
msgstr "Sociale kas voor zelfstandigen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24105
#: model:account.account.template,name:l10n_be.a24105
msgid "Camions"
msgstr "Vrachtwagens"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a1000
#: model:account.account.template,name:l10n_be.a1000
msgid "Capital"
msgstr "Kapitaal"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a418
#: model:account.account.template,name:l10n_be.a418
msgid "Cautionnements versés en numéraires"
msgstr "Borgtochten betaald in contanten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6600
#: model:account.account.template,name:l10n_be.a6600
msgid "Charges exceptionelles"
msgstr "Uitzonderlijke kosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6101
#: model:account.account.template,name:l10n_be.a6101
msgid "Charges locatives"
msgstr "Huurlasten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a492
#: model:account.account.template,name:l10n_be.a492
msgid "Charges à imputer"
msgstr "Toe te rekenen kosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a490
#: model:account.account.template,name:l10n_be.a490
msgid "Charges à reporter"
msgstr "Over te dragen kosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a540
#: model:account.account.template,name:l10n_be.a540
msgid "Chèques à encaisser"
msgstr "Te incasseren cheques"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4000
#: model:account.account.template,name:l10n_be.a4000
msgid "Clients"
msgstr "Klanten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a370
#: model:account.account.template,name:l10n_be.a370
msgid "Commandes en cours d'exécution"
msgstr "Lopende opdrachten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a49101
#: model:account.account.template,name:l10n_be.a49101
msgid "Commissions à obtenir"
msgstr "Te ontvangen commissies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a448
#: model:account.account.template,name:l10n_be.a448
msgid "Compensations fournisseurs"
msgstr "Compensaties leveranciers"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4112
-#: model:account.account,name:l10n_be.1_a4512
#: model:account.account.template,name:l10n_be.a4112
#: model:account.account.template,name:l10n_be.a4512
msgid "Compte courant administration T.V.A."
msgstr "Rekening Courant BTW-Administratie"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4163
#: model:account.account.template,name:l10n_be.a4163
msgid "Compte courant des administrateurs et gérants"
msgstr "Rekening courant bestuurders en zaakvoerders"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4162
#: model:account.account.template,name:l10n_be.a4162
msgid "Compte courant des associés en S.P.R.L."
msgstr "Rekening courant vennoten in B.V.B.A"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4990
#: model:account.account.template,name:l10n_be.a4990
msgid "Compte d'attente"
msgstr "Wachtrekening"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2110
#: model:account.account.template,name:l10n_be.a2110
msgid "Concessions, brevets, licences, savoir-faire, marques, etc..."
msgstr "Consessies, octrooien, licenties, ..."
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2501
#: model:account.account.template,name:l10n_be.a2501
msgid "Constructions"
msgstr "Gebouwen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a621
#: model:account.account.template,name:l10n_be.a621
msgid "Cotisations patronales d'assurances sociales"
msgstr "Werkgeversbijdragen voor sociale verzekeringen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a29000
#: model:account.account.template,name:l10n_be.a29000
msgid "Créances commerciales"
msgstr "Handelsvorderingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a407
-#: model:account.account,name:l10n_be.1_a417
#: model:account.account.template,name:l10n_be.a407
#: model:account.account.template,name:l10n_be.a417
msgid "Créances douteuses"
msgstr "Dubieuze debiteuren"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4164
#: model:account.account.template,name:l10n_be.a4164
msgid "Créances sur sociétés apparentées"
msgstr "Vorderingen op gerelateerde bedrijven"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a1720
#: model:account.account.template,name:l10n_be.a1720
msgid "Dettes de location-financement de biens immobiliers"
msgstr "Leasingschulden van onroerende goederen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a1721
#: model:account.account.template,name:l10n_be.a1721
msgid "Dettes de location-financement de biens mobiliers"
msgstr "Leasingschulden van roerende goederen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a17300
#: model:account.account.template,name:l10n_be.a17300
msgid "Dettes en compte \\ Banque A"
msgstr "Schulden op rekeningen \\Bank A"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4597
#: model:account.account.template,name:l10n_be.a4597
msgid "Dettes et provisions sociales diverses"
msgstr "Diverse sociale schulden en provisies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4500
#: model:account.account.template,name:l10n_be.a4500
msgid "Dettes fiscales estimées"
msgstr "Geraamd bedrag der belastingschulden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a1722
#: model:account.account.template,name:l10n_be.a1722
msgid "Dettes sur droits réels sur immeubles"
msgstr "Schulden op zakelijke rechten op gebouwen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a654
-#: model:account.account,name:l10n_be.1_a754
#: model:account.account.template,name:l10n_be.a654
#: model:account.account.template,name:l10n_be.a754
msgid "Différences de change"
msgstr "Wisselresultaten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4551
-#: model:account.account,name:l10n_be.1_a4560
#: model:account.account.template,name:l10n_be.a4551
#: model:account.account.template,name:l10n_be.a4560
msgid "Direction"
msgstr "Directiepersoneel"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6302
#: model:account.account.template,name:l10n_be.a6302
msgid "Dotations aux amortissements sur immobilisations corporelles"
msgstr "Afschrijvingen op materiële vaste activa"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6301
#: model:account.account.template,name:l10n_be.a6301
msgid "Dotations aux amortissements sur immobilisations incorporelles"
msgstr "Afschrijvingen op immateriële vaste activa"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a755
#: model:account.account.template,name:l10n_be.a755
msgid "Ecarts de conversion des devises"
msgstr "Resultaten uit de omrekening van vreemde valuta"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a175111
#: model:account.account.template,name:l10n_be.a175111
msgid "Effets à payer \\ Fournisseurs C.E.E."
msgstr "Te betalen wissels: Leveranciers van de EEG"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a175110
#: model:account.account.template,name:l10n_be.a175110
msgid "Effets à payer \\ Fournisseurs belges"
msgstr "Te betalen wissels: Belgische leveranciers"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a175112
#: model:account.account.template,name:l10n_be.a175112
msgid "Effets à payer \\ Fournisseurs importation"
msgstr "Te betalen wissels: Import leveranciers"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4166
#: model:account.account.template,name:l10n_be.a4166
msgid "Emballages et matériel à rendre"
msgstr "Terug te geven materiaal en verpakkingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4552
-#: model:account.account,name:l10n_be.1_a4561
#: model:account.account.template,name:l10n_be.a4552
#: model:account.account.template,name:l10n_be.a4561
msgid "Employés"
msgstr "Bedienden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a3200
#: model:account.account.template,name:l10n_be.a3200
msgid "En cours de fabrication"
msgstr "Goederen in bewerking"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a611
#: model:account.account.template,name:l10n_be.a611
msgid "Entretien et réparation"
msgstr "Onderhoud en herstellingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a653
#: model:account.account.template,name:l10n_be.a653
msgid "Escomptes clients"
msgstr ""
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a757
#: model:account.account.template,name:l10n_be.a757
msgid "Escomptes obtenus"
msgstr "Bekomen kortingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4230
#: model:account.account.template,name:l10n_be.a4230
msgid "Etablissements de crédit"
msgstr "Kredietinstellingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a430
#: model:account.account.template,name:l10n_be.a430
msgid "Etablissements de crédit. Emprunts en compte à terme fixe"
msgstr "Kredietinstellingen - Leningen op rekeningen met vaste termijn"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a444
#: model:account.account.template,name:l10n_be.a444
msgid "Factures à recevoir"
msgstr "Te ontvangen facturen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4220
#: model:account.account.template,name:l10n_be.a4220
msgid "Financement de biens immobiliers"
msgstr "Financiering vastgoed"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4221
#: model:account.account.template,name:l10n_be.a4221
msgid "Financement de biens mobiliers"
msgstr "Financiering roerend goed"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a440
#: model:account.account.template,name:l10n_be.a440
msgid "Fournisseurs"
msgstr "Leveranciers"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a612
#: model:account.account.template,name:l10n_be.a612
msgid "Fournitures"
msgstr "Diverse leveringen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a260
#: model:account.account.template,name:l10n_be.a260
msgid "Frais d'aménagements de locaux pris en location"
msgstr "Inrichtingskosten gehuurde lokalen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a656
#: model:account.account.template,name:l10n_be.a656
msgid "Frais de banques, de chèques postaux"
msgstr "Bank en chequekosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2000
#: model:account.account.template,name:l10n_be.a2000
msgid "Frais de constitution et d'augmentation de capital"
msgstr "Oprichtingskosten en kapitaalverhoging"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2100
#: model:account.account.template,name:l10n_be.a2100
msgid "Frais de recherche et de mise au point"
msgstr "Kosten van onderzoek en ontwikkeling"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a3500
#: model:account.account.template,name:l10n_be.a3500
msgid "Immeubles destinés à la vente"
msgstr "Onroerende goederen bestemd voor verkoop"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2800
#: model:account.account.template,name:l10n_be.a2800
msgid "Immobilisations Financières"
msgstr "Financiële vaste activa"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4120
#: model:account.account.template,name:l10n_be.a4120
msgid "Impôts belges sur le résultat"
msgstr "Belgische belastingen op het resultaat"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6700
#: model:account.account.template,name:l10n_be.a6700
msgid "Impôts et précomptes dus ou versés"
msgstr "Verschuldigde of gestorte belastingen en voorheffingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4128
#: model:account.account.template,name:l10n_be.a4128
msgid "Impôts étrangers"
msgstr "Buitenlandse belastingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6100
#: model:account.account.template,name:l10n_be.a6100
msgid "Loyers divers"
msgstr "Diverse huren"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a3400
#: model:account.account.template,name:l10n_be.a3400
msgid "Marchandises"
msgstr "Goederen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a300
#: model:account.account.template,name:l10n_be.a300
msgid "Matières premières"
msgstr "Grondstoffen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24011
#: model:account.account.template,name:l10n_be.a24011
msgid "Matériel de bureau de bâtiments administratifs et commerciaux"
msgstr "Kantooruitrusting voor gebouwen met adminestratieve en commerciële functie"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24010
#: model:account.account.template,name:l10n_be.a24010
msgid "Matériel de bureau de bâtiments industriels"
msgstr "Kantooruitrusting voor gebouwen met industriële functie"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2521
#: model:account.account.template,name:l10n_be.a2521
msgid "Matériel roulant"
msgstr "Rollend materieel"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2520
#: model:account.account.template,name:l10n_be.a2520
msgid "Mobilier"
msgstr "Meubilair"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24001
#: model:account.account.template,name:l10n_be.a24001
msgid "Mobilier des bâtiments administratifs et commerciaux"
msgstr "Van administratieve en commerciële gebouwen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24000
#: model:account.account.template,name:l10n_be.a24000
msgid "Mobilier des bâtiments industriels"
msgstr "Van industriële gebouwen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a151
#: model:account.account.template,name:l10n_be.a151
msgid "Montants transférés aux résultats"
msgstr "Bedragen komende van het resultaat"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4541
#: model:account.account.template,name:l10n_be.a4541
msgid "ONSS. 1er trimestre"
msgstr "R.S.Z. 1ste kwartaal"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4542
#: model:account.account.template,name:l10n_be.a4542
msgid "ONSS. 2ème trimestre"
msgstr "R.S.Z. 2de kwartaal"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4543
#: model:account.account.template,name:l10n_be.a4543
msgid "ONSS. 3ème trimestre"
msgstr "R.S.Z. 3de kwartaal"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4544
#: model:account.account.template,name:l10n_be.a4544
msgid "ONSS. 4ème trimestre"
msgstr "R.S.Z. 4de kwartaal"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4540
#: model:account.account.template,name:l10n_be.a4540
msgid "ONSS. Arriérés"
msgstr "Achterstallige bijdragen RSZ"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4553
-#: model:account.account,name:l10n_be.1_a4562
#: model:account.account.template,name:l10n_be.a4553
#: model:account.account.template,name:l10n_be.a4562
msgid "Ouvriers"
msgstr "Arbeiders"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a141
#: model:account.account.template,name:l10n_be.a141
msgid "Perte reportée"
msgstr "Overgedragen verlies (-)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a690
#: model:account.account.template,name:l10n_be.a690
msgid "Perte reportée de l'exercice précédent"
msgstr "Overgedragen verlies van het vorige boekjaar"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a793
#: model:account.account.template,name:l10n_be.a793
msgid "Perte à reporter"
msgstr "Over te dragen verlies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2118
#: model:account.account.template,name:l10n_be.a2118
msgid "Plus-values actées sur concessions, brevets, etc..."
msgstr "Gerealiseerde meerwaarden op consessies, octrooien, licenties, ..."
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2108
#: model:account.account.template,name:l10n_be.a2108
msgid "Plus-values actées sur frais de recherche et de mise au point"
msgstr "Gerealiseerde meerwaarden op onderzoek en ontwikkeling"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2528
#: model:account.account.template,name:l10n_be.a2528
msgid "Plus-values actées sur mobilier et matériel roulant en leasing"
msgstr "Gerealiseerde meerwaarden op geleasd rollend materieel"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a752
#: model:account.account.template,name:l10n_be.a752
msgid "Plus-values sur réalisations d'actifs circulants"
msgstr "Meerwaarden op de realisatie van vlottende activa"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7051
#: model:account.account.template,name:l10n_be.a7051
msgid "Prestations de services dans les pays membres de la C.E.E."
msgstr "Dienstverlening in lidstaten van de E.E.G."
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7050
#: model:account.account.template,name:l10n_be.a7050
msgid "Prestations de services en Belgique"
msgstr "Dienstverlening in België"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7052
#: model:account.account.template,name:l10n_be.a7052
msgid "Prestations de services en vue de l'exportation"
msgstr "Dienstverlening buiten de E.E.G. (export)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a11
#: model:account.account.template,name:l10n_be.a11
msgid "Primes d'émission"
msgstr "Uitgifte premies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4930
#: model:account.account.template,name:l10n_be.a4930
msgid "Produits d'exploitation à reporter"
msgstr "Over te dragen bedrijfsopbrengsten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a751
#: model:account.account.template,name:l10n_be.a751
msgid "Produits des actifs circulants"
msgstr "Opbrengsten uit vlottende activa"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a756
#: model:account.account.template,name:l10n_be.a756
msgid "Produits des autres créances"
msgstr "Diverse financiële opbrengsten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7600
#: model:account.account.template,name:l10n_be.a7600
msgid "Produits exceptionnels"
msgstr "Uitzonderlijke opbrengsten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a3300
#: model:account.account.template,name:l10n_be.a3300
msgid "Produits finis"
msgstr "Gereed product"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a404
-#: model:account.account,name:l10n_be.1_a414
#: model:account.account.template,name:l10n_be.a404
#: model:account.account.template,name:l10n_be.a414
msgid "Produits à recevoir"
msgstr "Te innen opbrengsten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4590
#: model:account.account.template,name:l10n_be.a4590
msgid "Provision pour gratifications de fin d'année"
msgstr "Voorziening voor eindejaarspremie"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a1600
#: model:account.account.template,name:l10n_be.a1600
msgid "Provisions pour risques et charges"
msgstr "Voorzieningen voor risico's en kosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4533
#: model:account.account.template,name:l10n_be.a4533
msgid "Précompte mobilier retenu sur intérêts payés"
msgstr "Roerende voorheffing ingehouden op betaalde intresten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4530
#: model:account.account.template,name:l10n_be.a4530
msgid "Précompte professionnel retenu sur rémunérations"
msgstr "Bedrijfsvoorheffing ingehouden op bezoldigingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a791
#: model:account.account.template,name:l10n_be.a791
msgid "Prélèvement sur le capital et les primes d'émission"
msgstr "Onttrekking aan het kapitaal en aan de uitgiftepremies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a780
#: model:account.account.template,name:l10n_be.a780
msgid "Prélèvements sur les impôts différés"
msgstr "Onttrekking aan de uitgestelde belastingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a789
#: model:account.account.template,name:l10n_be.a789
msgid "Prélèvements sur les réserves immunisées"
msgstr "Onttrekking aan de reserves"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a706
#: model:account.account.template,name:l10n_be.a706
msgid "Pénalités et dédits obtenus par l'entreprise"
msgstr "Boeten en verbeurdverklaringen verkregen door de onderneming"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4168
#: model:account.account.template,name:l10n_be.a4168
msgid "Rabais, ristournes, remises à obtenir et autres avoirs non encore reçus"
msgstr "Kortingen, rabatten en andere nog te ontvangen tegoeden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7500
#: model:account.account.template,name:l10n_be.a7500
msgid "Revenus des actions"
msgstr "Opbrengsten uit aandelen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7502
#: model:account.account.template,name:l10n_be.a7502
msgid "Revenus des créances à plus d'un an"
msgstr "Inkomsten uit schuld > 1 jaar"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7501
#: model:account.account.template,name:l10n_be.a7501
msgid "Revenus des obligations"
msgstr "Opbrengsten uit obligaties"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a49100
#: model:account.account.template,name:l10n_be.a49100
msgid "Ristournes, rabais à obtenir"
msgstr "Te ontvangen kortingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a329
-#: model:account.account,name:l10n_be.1_a419
#: model:account.account.template,name:l10n_be.a329
#: model:account.account.template,name:l10n_be.a419
msgid "Réductions de valeur actées"
msgstr "Geboekte waardeverminderingen (-)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6320
#: model:account.account.template,name:l10n_be.a6320
msgid "Réductions de valeur sur commandes en cours d'exécution"
msgstr "Waardeverminderingen op bestellingen in uitvoering"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6310
#: model:account.account.template,name:l10n_be.a6310
msgid "Réductions de valeur sur stocks"
msgstr "Waardeverminderingen op voorraden"
#. module: l10n_be
-#: model:account.fiscal.position,name:l10n_be.1_fiscal_position_template_4
#: model:account.fiscal.position.template,name:l10n_be.fiscal_position_template_4
msgid "Régime Cocontractant"
msgstr "Medecontractant"
#. module: l10n_be
-#: model:account.fiscal.position,name:l10n_be.1_fiscal_position_template_2
#: model:account.fiscal.position.template,name:l10n_be.fiscal_position_template_2
msgid "Régime Extra-Communautaire"
msgstr "Export"
#. module: l10n_be
-#: model:account.fiscal.position,name:l10n_be.1_fiscal_position_template_3
#: model:account.fiscal.position.template,name:l10n_be.fiscal_position_template_3
msgid "Régime Intra-Communautaire"
msgstr "Intra-Communautair"
#. module: l10n_be
-#: model:account.fiscal.position,name:l10n_be.1_fiscal_position_template_1
#: model:account.fiscal.position.template,name:l10n_be.fiscal_position_template_1
msgid "Régime National"
msgstr "Nationaal"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V61
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V61
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V61
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V61
msgid "Régularisation en faveur de l'état"
msgstr ""
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V62
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V62
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V62
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V62
msgid "Régularisation en faveur du déclarant"
msgstr ""
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7710
#: model:account.account.template,name:l10n_be.a7710
msgid "Régularisations d'impôts dus ou versés"
msgstr "Regularisering van verschuldigde of betaalde belastingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7711
#: model:account.account.template,name:l10n_be.a7711
msgid "Régularisations d'impôts estimés"
msgstr "Regularisering van geraamde belastingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6200
#: model:account.account.template,name:l10n_be.a6200
msgid "Rémunérations: Administrateurs ou gérants"
msgstr "Bezoldigingen: Bestuurders of zaakvoerders"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6204
#: model:account.account.template,name:l10n_be.a6204
msgid "Rémunérations: Autres membres du personnel"
msgstr "Bezoldigingen: Andere personeelsleden, verbonden met een arbeidsovereenkomst"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6202
#: model:account.account.template,name:l10n_be.a6202
msgid "Rémunérations: Employés"
msgstr "Bezoldigingen: Arbeiders"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6203
#: model:account.account.template,name:l10n_be.a6203
msgid "Rémunérations: Ouvriers"
msgstr "Bezoldigingen: Bedienden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a6201
#: model:account.account.template,name:l10n_be.a6201
msgid "Rémunérations: Personnel de direction"
msgstr "Bezoldigingen: Directiepersoneel"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a130
#: model:account.account.template,name:l10n_be.a130
msgid "Réserve légale"
msgstr "Wettelijke reserve"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a132
#: model:account.account.template,name:l10n_be.a132
msgid "Réserves immunisées"
msgstr "Belastingvrije reserves"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a613
#: model:account.account.template,name:l10n_be.a613
msgid "Rétributions de tiers"
msgstr "Vergoedingen aan derden"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a603
#: model:account.account.template,name:l10n_be.a603
msgid "Sous-traitances générales"
msgstr "Algemene onderaannemingen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a753
#: model:account.account.template,name:l10n_be.a753
msgid "Subsides en capital et en intérêts"
msgstr "Kapitaal- en interestsubsidies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a150
#: model:account.account.template,name:l10n_be.a150
msgid "Subsides obtenus"
msgstr "Verkregen subsidies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a41670
#: model:account.account.template,name:l10n_be.a41670
msgid "Subsides à recevoir"
msgstr "Te ontvangen subsidies"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a411059
#: model:account.account.template,name:l10n_be.a411059
msgid "T.V.A Déductible"
msgstr "Aftrekbare BTW"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a64012
#: model:account.account.template,name:l10n_be.a64012
msgid "T.V.A. non déductible"
msgstr "Niet aftrekbare BTW"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a451054
#: model:account.account.template,name:l10n_be.a451054
msgid "T.V.A. à payer"
msgstr "Te betalen BTW"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a451056
#: model:account.account.template,name:l10n_be.a451056
msgid "T.V.A. à payer - Cocontractant"
msgstr "Te betalen BTW - Medecontractant"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a451057
#: model:account.account.template,name:l10n_be.a451057
msgid "T.V.A. à payer - Import"
msgstr "Te betalen BTW - Import"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a451055
#: model:account.account.template,name:l10n_be.a451055
msgid "T.V.A. à payer - Intra-communautaire"
msgstr "Te betalen BTW - Intracommunautair"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-00
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-00
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-L
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-S
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-00
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-S
@@ -1990,10 +1676,6 @@ msgid "TVA 0%"
msgstr "BTW 0%"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-00-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-00-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-00-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-00-CC
@@ -2002,13 +1684,6 @@ msgid "TVA 0% Cocont."
msgstr "BTW 0% Medecont."
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-00-EU
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-EU-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-EU-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-00-EU
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-EU-L
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-EU-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-EU-T
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-00-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-EU-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-EU-S
@@ -2020,10 +1695,6 @@ msgid "TVA 0% EU"
msgstr "BTW 0% EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-00-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-00-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-00-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-00-ROW
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-00-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-00-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-00-ROW-CC
@@ -2032,12 +1703,6 @@ msgid "TVA 0% Non EU"
msgstr "BTW 0% Non EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-12-L
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-12-S
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-S
@@ -2048,9 +1713,6 @@ msgid "TVA 12%"
msgstr "BTW 12%"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-CC
@@ -2058,9 +1720,6 @@ msgid "TVA 12% Cocont."
msgstr "BTW 12% Medecont."
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-CC-C1
@@ -2068,9 +1727,6 @@ msgid "TVA 12% Cocont. Déductible"
msgstr "BTW 12% Medecont. Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-CC-C2
@@ -2078,10 +1734,6 @@ msgid "TVA 12% Cocont. Récupérable"
msgstr "BTW 12% Medecont. Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-EU
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-S
@@ -2090,10 +1742,6 @@ msgid "TVA 12% EU"
msgstr "BTW 12% EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-EU-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-G-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-S-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-G-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-S-C1
@@ -2102,10 +1750,6 @@ msgid "TVA 12% EU Déductible"
msgstr "BTW 12% EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-EU-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-G-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-EU-S-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-G-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-EU-S-C2
@@ -2114,15 +1758,11 @@ msgid "TVA 12% EU Récupérable"
msgstr "BTW 12% EU Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,name:l10n_be.1_attn_VAT-IN-V82-12-EU-G-C2
#: model:account.tax.template,name:l10n_be.attn_VAT-IN-V82-12-EU-G-C2
msgid "TVA 12% EU Récupérable - Biens divers"
msgstr "BTW 12% EU Verhaalbaar - Diverse goederen"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-ROW-CC
@@ -2130,9 +1770,6 @@ msgid "TVA 12% Non EU"
msgstr "BTW 12% Niet EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-ROW-CC-C1
@@ -2140,9 +1777,6 @@ msgid "TVA 12% Non EU Déductible"
msgstr "BTW 12% Niet EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-12-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-12-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-12-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-12-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-12-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-12-ROW-CC-C2
@@ -2150,12 +1784,6 @@ msgid "TVA 12% Non EU Récupérable"
msgstr "BTW 12% Niet EU Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-21-L
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-21-S
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-S
@@ -2166,9 +1794,6 @@ msgid "TVA 21%"
msgstr "BTW 21%"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-CC
@@ -2176,9 +1801,6 @@ msgid "TVA 21% Cocont."
msgstr "BTW 21% Medecont."
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-CC-C1
@@ -2186,9 +1808,6 @@ msgid "TVA 21% Cocont. Déductible"
msgstr "BTW 21% Medecont. Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-CC-C2
@@ -2196,10 +1815,6 @@ msgid "TVA 21% Cocont. Récupérable"
msgstr "BTW 21% Medecont. Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-EU
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-S
@@ -2208,10 +1823,6 @@ msgid "TVA 21% EU"
msgstr "BTW 21% EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-EU-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-G-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-S-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-G-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-S-C1
@@ -2220,10 +1831,6 @@ msgid "TVA 21% EU Déductible"
msgstr "BTW 21% EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-EU-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-G-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-EU-S-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-G-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-EU-S-C2
@@ -2232,9 +1839,6 @@ msgid "TVA 21% EU Récupérable"
msgstr "BTW 21% EU Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-ROW-CC
@@ -2242,9 +1846,6 @@ msgid "TVA 21% Non EU"
msgstr "BTW 21% Niet EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-ROW-CC-C1
@@ -2252,9 +1853,6 @@ msgid "TVA 21% Non EU Déductible"
msgstr "BTW 21% Niet EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-21-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-21-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-21-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-21-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-21-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-21-ROW-CC-C2
@@ -2262,30 +1860,21 @@ msgid "TVA 21% Non EU Récupérable"
msgstr "BTW 21% Niet EU Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_TVA-21-inclus-dans-prix
#: model:account.tax.template,description:l10n_be.attn_TVA-21-inclus-dans-prix
msgid "TVA 21% TTC"
msgstr "VAT 21% (inclusief BTW)"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-CAR-EXC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-CAR-EXC-C2
msgid "TVA 50% Déductible - Frais de voiture (Prix Excl.)"
msgstr "BTW 5°% Aftrekbaar - Auto kosten (Prijs Excl.)"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-CAR-EXC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-CAR-EXC
msgid "TVA 50% Non Déductible - Frais de voiture (Prix Excl.)"
msgstr "BTW 50% Niet Aftrekbaar - Auto kosten (Prijs Excl.)"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-06-L
-#: model:account.tax,description:l10n_be.1_attn_VAT-OUT-06-S
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-S
@@ -2296,9 +1885,6 @@ msgid "TVA 6%"
msgstr "BTW 6%"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-CC
@@ -2306,9 +1892,6 @@ msgid "TVA 6% Cocont."
msgstr "BTW 6% Medecont."
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-CC-C1
@@ -2316,9 +1899,6 @@ msgid "TVA 6% Cocont. Déductible"
msgstr "BTW 6% Medecont. Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-CC-C2
@@ -2326,10 +1906,6 @@ msgid "TVA 6% Cocont. Récupérable"
msgstr "BTW 6% Medecont. Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-EU
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-G
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-S
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-EU
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-G
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-S
@@ -2338,10 +1914,6 @@ msgid "TVA 6% EU"
msgstr "BTW 6% EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-EU-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-G-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-S-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-EU-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-G-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-S-C1
@@ -2350,10 +1922,6 @@ msgid "TVA 6% EU Déductible"
msgstr "BTW 6% EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-EU-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-G-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-EU-S-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-EU-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-G-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-EU-S-C2
@@ -2362,9 +1930,6 @@ msgid "TVA 6% EU Récupérable"
msgstr "BTW 6% EU Verhaalbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-ROW-CC
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-ROW-CC
@@ -2372,9 +1937,6 @@ msgid "TVA 6% Non EU"
msgstr "BTW 6% Niet EU"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC-C1
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-ROW-CC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-ROW-CC-C1
@@ -2382,9 +1944,6 @@ msgid "TVA 6% Non EU Déductible"
msgstr "BTW 6% Niet EU Aftrekbaar"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V81-06-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-06-ROW-CC-C2
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V83-06-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V81-06-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-06-ROW-CC-C2
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V83-06-ROW-CC-C2
@@ -2392,73 +1951,61 @@ msgid "TVA 6% Non EU Récupérable"
msgstr "BTW 6% Niet EU Verhaalbaar"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a4118
#: model:account.account.template,name:l10n_be.a4118
msgid "Taxe d'égalisation due"
msgstr "Verschuldigde egalisatiebelasting"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a64000
#: model:account.account.template,name:l10n_be.a64000
msgid "Taxes sur autos et camions"
msgstr "Verkeersbelasting bedrijfswagens"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a2500
#: model:account.account.template,name:l10n_be.a2500
msgid "Terrains"
msgstr "Terreinen"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_trans
#: model:account.account.template,name:l10n_be.trans
msgid "Transferts"
msgstr "Transferten"
#. module: l10n_be
-#: model:account.tax,description:l10n_be.1_attn_VAT-IN-V82-CAR-EXC-C1
#: model:account.tax.template,description:l10n_be.attn_VAT-IN-V82-CAR-EXC-C1
msgid "VAT 50% Non Déductible - Frais de voiture"
msgstr "BTW 50% Niet Aftrekbaar - Auto kosten"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7001
#: model:account.account.template,name:l10n_be.a7001
msgid "Ventes dans les pays membres de la C.E.E. (marchandises)"
msgstr "Verkopen: leden van de Europese gemeenschap (handelsgoederen)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7011
#: model:account.account.template,name:l10n_be.a7011
msgid "Ventes dans les pays membres de la C.E.E. (produits finis)"
msgstr "Verkopen: leden van de Europese gemeenschap (gereed product)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7000
#: model:account.account.template,name:l10n_be.a7000
msgid "Ventes en Belgique (marchandises)"
msgstr "Verkopen: België (handelsgoederen)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7010
#: model:account.account.template,name:l10n_be.a7010
msgid "Ventes en Belgique (produits finis)"
msgstr "Verkopen: België (gereed product)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7002
#: model:account.account.template,name:l10n_be.a7002
msgid "Ventes à l'exportation (marchandises)"
msgstr "Verkopen: export (handelsgoederen)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a7012
#: model:account.account.template,name:l10n_be.a7012
msgid "Ventes à l'exportation (produits finis)"
msgstr "Verkopen: export (gereed product)"
#. module: l10n_be
-#: model:account.account,name:l10n_be.1_a24100
#: model:account.account.template,name:l10n_be.a24100
msgid "Voitures"
msgstr "Wagens"
diff --git a/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py b/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
index 0b977faa925..312ae7c25b3 100644
--- a/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
+++ b/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
@@ -135,7 +135,7 @@ class HrContract(models.Model):
@api.depends('commission_on_target')
def _compute_warrants_cost(self):
for contract in self:
- contract.warrants_cost = contract.commission_on_target * 1.326 * 1.05 * 12.0
+ contract.warrants_cost = contract.commission_on_target * 1.326 / 1.05 * 12.0
contract.warrant_value_employee = contract.commission_on_target * 1.326 * (1.00 - 0.535) * 12.0
@api.depends('wage', 'fuel_card', 'representation_fees', 'transport_employer_cost',
diff --git a/addons/l10n_co/__manifest__.py b/addons/l10n_co/__manifest__.py
index 72a39483284..88f5fb464f9 100644
--- a/addons/l10n_co/__manifest__.py
+++ b/addons/l10n_co/__manifest__.py
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-# Copyright (C) David Arnold (devCO).
-# Author David Arnold (devCO), dar@devco.co
+# Copyright (C) David Arnold (XOE Solutions).
+# Author David Arnold (XOE Solutions), dar@xoe.solutions
# Co-Authors Juan Pablo Aries (devCO), jpa@devco.co
# Hector Ivan Valencia Muñoz (TIX SAS)
# Nhomar Hernandez (Vauxoo)
@@ -13,7 +13,8 @@
'version': '0.8',
'category': 'Localization',
'description': 'Colombian Accounting and Tax Preconfiguration',
- 'author': 'David Arnold BA HSG (devCO)',
+ 'author': 'David Arnold (XOE Solutions)',
+ 'website': 'https://xoe.solutions',
'depends': [
'account',
],
diff --git a/addons/l10n_cr/data/l10n_cr_state_data.xml b/addons/l10n_cr/data/l10n_cr_state_data.xml
index 585012600b2..4a38f56de50 100644
--- a/addons/l10n_cr/data/l10n_cr_state_data.xml
+++ b/addons/l10n_cr/data/l10n_cr_state_data.xml
@@ -5,37 +5,37 @@
Update states
-->
<record id="state_SJ" model="res.country.state">
- <field name="code">SJ</field>
+ <field name="code">CR-SJ</field>
<field name="name">San Jos&#233;</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_A" model="res.country.state">
- <field name="code">A</field>
+ <field name="code">CR-A</field>
<field name="name">Alajuela</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_H" model="res.country.state">
- <field name="code">H</field>
+ <field name="code">CR-H</field>
<field name="name">Heredia</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_C" model="res.country.state">
- <field name="code">C</field>
+ <field name="code">CR-C</field>
<field name="name">Cartago</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_P" model="res.country.state">
- <field name="code">P</field>
+ <field name="code">CR-P</field>
<field name="name">Puntarenas</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_G" model="res.country.state">
- <field name="code">G</field>
+ <field name="code">CR-G</field>
<field name="name">Guanacaste</field>
<field name="country_id" ref="base.cr"/>
</record>
<record id="state_L" model="res.country.state">
- <field name="code">L</field>
+ <field name="code">CR-L</field>
<field name="name">Lim&#243;n</field>
<field name="country_id" ref="base.cr"/>
</record>
diff --git a/addons/l10n_do/models/chart_template.py b/addons/l10n_do/models/chart_template.py
index 73e99589873..97d0833fef6 100644
--- a/addons/l10n_do/models/chart_template.py
+++ b/addons/l10n_do/models/chart_template.py
@@ -13,6 +13,49 @@ class WizardMultiChartsAccounts(models.TransientModel):
return [
{'acc_name': _('Cash'), 'account_type': 'cash'},
{'acc_name': _('Caja Chica'), 'account_type': 'cash'},
+ {'acc_name': _('Cheques Clientes'), 'account_type': 'cash'},
{'acc_name': _('Bank'), 'account_type': 'bank'}
]
return super(WizardMultiChartsAccounts, self)._get_default_bank_account_ids()
+
+
+class AccountChartTemplate(models.Model):
+ _inherit = "account.chart.template"
+
+ @api.multi
+ def _prepare_all_journals(self, acc_template_ref, company, journals_dict=None):
+ """Create fiscal journals for buys"""
+ res = super(AccountChartTemplate, self)._prepare_all_journals(
+ acc_template_ref, company, journals_dict=journals_dict)
+ if not self == self.env.ref('l10n_do.do_chart_template'):
+ return res
+ for journal in res:
+ if journal['code'] == 'FACT':
+ journal['name'] = _('Compras Fiscales')
+ res += [{
+ 'type': 'purchase',
+ 'name': _('Compras Informales'),
+ 'code': 'CINF',
+ 'company_id': company.id,
+ 'show_on_dashboard': True
+ }, {
+ 'type': 'purchase',
+ 'name': _('Gastos Menores'),
+ 'code': 'GASM',
+ 'company_id': company.id,
+ 'show_on_dashboard': True
+ }, {
+ 'type': 'purchase',
+ 'name': _('Compras al Exterior'),
+ 'code': 'CEXT',
+ 'company_id': company.id,
+ 'show_on_dashboard': True
+ }, {
+ 'type': 'purchase',
+ 'name': _('Gastos No Deducibles'),
+ 'code': 'GASTO',
+ 'company_id': company.id,
+ 'show_on_dashboard': True
+ }]
+ return res
+
diff --git a/addons/l10n_es/__manifest__.py b/addons/l10n_es/__manifest__.py
index c5d7599074e..44b23a5e9c4 100644
--- a/addons/l10n_es/__manifest__.py
+++ b/addons/l10n_es/__manifest__.py
@@ -3,6 +3,7 @@
# List of contributors:
# Jordi Esteve <jesteve@zikzakmedia.com>
+# Ignacio Ibeas <ignacio@acysos.com>
# Dpto. Consultoría Grupo Opentia <consultoria@opentia.es>
# Pedro M. Baeza <pedro.baeza@tecnativa.com>
# Carlos Liébana <carlos.liebana@factorlibre.com>
diff --git a/addons/l10n_es/data/account_fiscal_position_template_data.xml b/addons/l10n_es/data/account_fiscal_position_template_data.xml
index 49beed9d022..eef1bd1ac03 100644
--- a/addons/l10n_es/data/account_fiscal_position_template_data.xml
+++ b/addons/l10n_es/data/account_fiscal_position_template_data.xml
@@ -113,6 +113,16 @@
<field name="chart_template_id" ref="account_chart_template_common"/>
</record>
+ <record id="fp_reagyp_a" model="account.fiscal.position.template">
+ <field name="name">REAGYP - Agricultura</field>
+ <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
+ </record>
+
+ <record id="fp_reagyp_gp" model="account.fiscal.position.template">
+ <field name="name">REAGYP - Ganadería y pesca</field>
+ <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
+ </record>
+
<!-- ************************************************************* -->
<!-- Fiscal Position Tax Templates -->
<!-- ************************************************************* -->
@@ -2889,6 +2899,28 @@
<field name="tax_dest_id" ref="account_tax_template_s_iva0_isp"/>
</record>
+ <!-- Régimen especial de Agricultura, Ganaderia y Pesca -->
+ <record id="fptt_reagyp_a_4b_1" model="account.fiscal.position.tax.template">
+ <field name="position_id" ref="fp_reagyp_a"/>
+ <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/>
+ <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_iva12_agr"/>
+ </record>
+ <record id="fptt_reagyp_a_4b_2" model="account.fiscal.position.tax.template">
+ <field name="position_id" ref="fp_reagyp_a"/>
+ <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/>
+ <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_irpf2"/>
+ </record>
+ <record id="fptt_reagyp_gp_4b_1" model="account.fiscal.position.tax.template">
+ <field name="position_id" ref="fp_reagyp_gp"/>
+ <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/>
+ <field name="tax_dest_id" ref="account_tax_template_p_iva105_gan"/>
+ </record>
+ <record id="fptt_reagyp_gp_4b_2" model="account.fiscal.position.tax.template">
+ <field name="position_id" ref="fp_reagyp_gp"/>
+ <field name="tax_src_id" ref="l10n_es.account_tax_template_p_iva4_bc"/>
+ <field name="tax_dest_id" ref="l10n_es.account_tax_template_p_irpf2"/>
+ </record>
+
<!-- ************************************************************* -->
<!-- Fiscal Position Account Templates -->
<!-- ************************************************************* -->
diff --git a/addons/l10n_es/data/account_tax_data.xml b/addons/l10n_es/data/account_tax_data.xml
index d07503b0b88..327144f6fe1 100644
--- a/addons/l10n_es/data/account_tax_data.xml
+++ b/addons/l10n_es/data/account_tax_data.xml
@@ -1044,6 +1044,18 @@
<field name="tax_group_id" ref="tax_group_iva_12"/>
<field name="tag_ids" eval="[(6, False, [ref('mod_303_42')])]"/>
</record>
+ <record id="account_tax_template_p_iva105_gan" model="account.tax.template">
+ <field name="description">P_IVA105_GAN</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="l10n_es.account_common_472"/>
+ <field name="name">10,5% IVA Soportado régimen ganadero o pesca</field>
+ <field name="refund_account_id" ref="l10n_es.account_common_472"/>
+ <field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
+ <field name="amount" eval="10.5"/>
+ <field name="amount_type">percent</field>
+ <field name="include_base_amount" eval="1"/>
+ <field name="tag_ids" eval="[(6, False, [ref('mod_303_42')])]"/>
+ </record>
<record id="account_tax_template_s_iva0_e" model="account.tax.template">
<field name="description">S_IVA0_E</field>
<field name="type_tax_use">sale</field>
@@ -1330,6 +1342,7 @@
<field name="refund_account_id" ref="l10n_es.account_common_4751"/>
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
<field name="amount" eval="-2"/>
+ <field name="sequence" eval="2"/>
<field name="amount_type">percent</field>
<field name="tax_group_id" ref="tax_group_retenciones_2"/>
<field name="tag_ids" eval="[(6, False, [ref('mod_111_08'), ref('mod_111_09')])]"/>
diff --git a/addons/l10n_fr_certification/data/account_move.xml b/addons/l10n_fr_certification/data/account_move.xml
index 2794e6364f9..c4d735d2b14 100644
--- a/addons/l10n_fr_certification/data/account_move.xml
+++ b/addons/l10n_fr_certification/data/account_move.xml
@@ -3,6 +3,7 @@
<field name="name">Data Inalterability Check</field>
<field name="model_id" ref="account.model_account_move"/>
<field name="type">ir.actions.server</field>
+ <field name="state">code</field>
<field name="code">
action = env['account.move']._check_hash_integrity(env.user.company_id.id)
</field>
@@ -12,6 +13,7 @@
<field name="name">Get the certification now!</field>
<field name="type">ir.actions.server</field>
<field name="model_id" ref="account.model_res_company"/>
+ <field name="state">code</field>
<field name="code">
db_uuid = env['ir.config_parameter'].sudo().get_param('database.uuid')
action = {"type": "ir.actions.act_url",
diff --git a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml b/addons/l10n_fr_pos_cert/data/pos_inalterability.xml
index ace4c3de24d..377204b73c6 100644
--- a/addons/l10n_fr_pos_cert/data/pos_inalterability.xml
+++ b/addons/l10n_fr_pos_cert/data/pos_inalterability.xml
@@ -8,6 +8,7 @@
<field name="name">Pos Orders Inalterability Check</field>
<field name="model_id" ref="point_of_sale.model_pos_order"/>
<field name="type">ir.actions.server</field>
+ <field name="state">code</field>
<field name="code">
action = env['pos.order']._check_hash_integrity(env.user.company_id.id)
</field>
diff --git a/addons/l10n_multilang/models/l10n_multilang.py b/addons/l10n_multilang/models/l10n_multilang.py
index 0c096c4cdf3..4bde8505d5c 100644
--- a/addons/l10n_multilang/models/l10n_multilang.py
+++ b/addons/l10n_multilang/models/l10n_multilang.py
@@ -32,14 +32,14 @@ class AccountChartTemplate(models.Model):
for element in in_ids.with_context(lang=None):
if value[element.id]:
#copy Translation from Source to Destination object
- xlat_obj.create({
- 'name': out_ids._name + ',' + in_field,
- 'type': 'model',
- 'res_id': out_ids[counter].id,
- 'lang': lang,
- 'src': element[in_field],
- 'value': value[element.id],
- })
+ xlat_obj._set_ids(
+ out_ids._name + ',' + in_field,
+ 'model',
+ lang,
+ out_ids[counter].ids,
+ value[element.id],
+ element[in_field]
+ )
else:
_logger.info('Language: %s. Translation from template: there is no translation available for %s!' % (lang, element[in_field]))
counter += 1
diff --git a/addons/mail/controllers/bus.py b/addons/mail/controllers/bus.py
index 09305e61b27..c900604ab06 100644
--- a/addons/mail/controllers/bus.py
+++ b/addons/mail/controllers/bus.py
@@ -43,7 +43,7 @@ class MailChatController(BusController):
# post a message without adding followers to the channel. email_from=False avoid to get author from email data
mail_channel = request.env["mail.channel"].sudo().search([('uuid', '=', uuid)], limit=1)
body = tools.plaintext2html(message_content)
- message = mail_channel.sudo().with_context(mail_create_nosubscribe=True).message_post(author_id=author_id, email_from=False, body=body, message_type='comment', subtype='mail.mt_comment', content_subtype='plaintext')
+ message = mail_channel.sudo().with_context(mail_create_nosubscribe=True).message_post(author_id=author_id, email_from=False, body=body, message_type='comment', subtype='mail.mt_comment')
return message and message.id or False
@route(['/mail/chat_history'], type="json", auth="none")
diff --git a/addons/mail/models/ir_model.py b/addons/mail/models/ir_model.py
index 04529610f0e..0b029f3e1a1 100644
--- a/addons/mail/models/ir_model.py
+++ b/addons/mail/models/ir_model.py
@@ -52,12 +52,6 @@ class IrModel(models.Model):
model_class._inherit = parents + ['mail.thread']
return model_class
- def unlink(self):
- # Delete followers for models that will be unlinked.
- query = "DELETE FROM mail_followers WHERE res_model IN %s"
- self.env.cr.execute(query, [tuple(self.mapped('model'))])
- return super(IrModel, self).unlink()
-
class IrModelField(models.Model):
_inherit = 'ir.model.fields'
diff --git a/addons/mail/models/mail_activity.py b/addons/mail/models/mail_activity.py
index 81975b9826d..3dc7ef85330 100644
--- a/addons/mail/models/mail_activity.py
+++ b/addons/mail/models/mail_activity.py
@@ -89,7 +89,7 @@ class MailActivity(models.Model):
summary = fields.Char('Summary')
note = fields.Html('Note')
feedback = fields.Html('Feedback')
- date_deadline = fields.Date('Due Date', index=True, required=True, default=fields.Date.today)
+ date_deadline = fields.Date('Due Date', index=True, required=True, default=fields.Date.context_today)
automated = fields.Boolean(
'Automated activity', readonly=True,
help='Indicates this activity has been created automatically and not by any user.')
@@ -154,7 +154,8 @@ class MailActivity(models.Model):
@api.onchange('recommended_activity_type_id')
def _onchange_recommended_activity_type_id(self):
- self.activity_type_id = self.recommended_activity_type_id
+ if self.recommended_activity_type_id:
+ self.activity_type_id = self.recommended_activity_type_id
@api.multi
def _check_access(self, operation):
diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py
index 1a69aaa229a..b42de71abcf 100644
--- a/addons/mail/models/mail_message.py
+++ b/addons/mail/models/mail_message.py
@@ -416,8 +416,17 @@ class Message(models.Model):
com_id = self.env['ir.model.data'].xmlid_to_res_id('mail.mt_comment')
note_id = self.env['ir.model.data'].xmlid_to_res_id('mail.mt_note')
+ # fetch notification status
+ notif_dict = {}
+ notifs = self.env['mail.notification'].sudo().search([('mail_message_id', 'in', list(mid for mid in message_tree)), ('is_read', '=', False)])
+ for notif in notifs:
+ mid = notif.mail_message_id.id
+ if not notif_dict.get(mid):
+ notif_dict[mid] = {'partner_id': list()}
+ notif_dict[mid]['partner_id'].append(notif.res_partner_id.id)
+
for message in message_values:
- message['needaction_partner_ids'] = self.env['mail.notification'].sudo().search([('mail_message_id', '=', message['id']), ('is_read', '=', False)]).mapped('res_partner_id').ids
+ message['needaction_partner_ids'] = notif_dict.get(message['id'], dict()).get('partner_id', [])
message['is_note'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['id'] == note_id
message['is_discussion'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['id'] == com_id
message['is_notification'] = message['is_note'] and not message['model'] and not message['res_id']
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index e247df26c8f..587009984cf 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -120,7 +120,8 @@ class MailThread(models.AbstractModel):
followers = self.env['mail.followers'].sudo().search([
('res_model', '=', self._name),
('partner_id', operator, operand)])
- return [('id', 'in', followers.mapped('res_id'))]
+ # using read() below is much faster than followers.mapped('res_id')
+ return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])]
@api.model
def _search_follower_channels(self, operator, operand):
@@ -133,7 +134,8 @@ class MailThread(models.AbstractModel):
followers = self.env['mail.followers'].sudo().search([
('res_model', '=', self._name),
('channel_id', operator, operand)])
- return [('id', 'in', followers.mapped('res_id'))]
+ # using read() below is much faster than followers.mapped('res_id')
+ return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])]
@api.multi
@api.depends('message_follower_ids')
@@ -143,7 +145,8 @@ class MailThread(models.AbstractModel):
('res_id', 'in', self.ids),
('partner_id', '=', self.env.user.partner_id.id),
])
- following_ids = followers.mapped('res_id')
+ # using read() below is much faster than followers.mapped('res_id')
+ following_ids = [res['res_id'] for res in followers.read(['res_id'])]
for record in self:
record.message_is_follower = record.id in following_ids
@@ -155,9 +158,11 @@ class MailThread(models.AbstractModel):
])
# Cases ('message_is_follower', '=', True) or ('message_is_follower', '!=', False)
if (operator == '=' and operand) or (operator == '!=' and not operand):
- return [('id', 'in', followers.mapped('res_id'))]
+ # using read() below is much faster than followers.mapped('res_id')
+ return [('id', 'in', [res['res_id'] for res in followers.read(['res_id'])])]
else:
- return [('id', 'not in', followers.mapped('res_id'))]
+ # using read() below is much faster than followers.mapped('res_id')
+ return [('id', 'not in', [res['res_id'] for res in followers.read(['res_id'])])]
@api.multi
def _get_message_unread(self):
@@ -1433,7 +1438,13 @@ class MailThread(models.AbstractModel):
located in tools. """
if not body:
return body, attachments
- root = lxml.html.fromstring(body)
+ try:
+ root = lxml.html.fromstring(body)
+ except ValueError:
+ # In case the email client sent XHTML, fromstring will fail because 'Unicode strings
+ # with encoding declaration are not supported'.
+ root = lxml.html.fromstring(body.encode('utf-8'))
+
postprocessed = False
to_remove = []
for node in root.iter():
@@ -1815,6 +1826,8 @@ class MailThread(models.AbstractModel):
continue
if isinstance(content, pycompat.text_type):
content = content.encode('utf-8')
+ elif content is None:
+ continue
data_attach = {
'name': name,
'datas': base64.b64encode(content),
diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py
index 2068e66c834..0d6ea26579c 100644
--- a/addons/mail/models/res_users.py
+++ b/addons/mail/models/res_users.py
@@ -75,16 +75,19 @@ class Users(models.Model):
def activity_user_count(self):
query = """SELECT m.id, count(*), act.res_model as model,
CASE
- WHEN now()::date - act.date_deadline::date = 0 Then 'today'
- WHEN now()::date - act.date_deadline::date > 0 Then 'overdue'
- WHEN now()::date - act.date_deadline::date < 0 Then 'planned'
+ WHEN %(today)s::date - act.date_deadline::date = 0 Then 'today'
+ WHEN %(today)s::date - act.date_deadline::date > 0 Then 'overdue'
+ WHEN %(today)s::date - act.date_deadline::date < 0 Then 'planned'
END AS states
FROM mail_activity AS act
JOIN ir_model AS m ON act.res_model_id = m.id
- WHERE user_id = %s
+ WHERE user_id = %(user_id)s
GROUP BY m.id, states, act.res_model;
"""
- self.env.cr.execute(query, [self.env.uid])
+ self.env.cr.execute(query, {
+ 'today': fields.Date.context_today(self),
+ 'user_id': self.env.uid,
+ })
activity_data = self.env.cr.dictfetchall()
model_ids = [a['id'] for a in activity_data]
model_names = {n[0]: n[1] for n in self.env['ir.model'].browse(model_ids).name_get()}
diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js
index 4bb81489789..fce7eb29f6f 100644
--- a/addons/mail/static/src/js/activity.js
+++ b/addons/mail/static/src/js/activity.js
@@ -32,6 +32,7 @@ function _readActivities(self, ids) {
model: 'mail.activity',
method: 'read',
args: [ids],
+ context: (self.record && self.record.getContext()) || self.getSession().user_context,
}).then(function (activities) {
// convert create_date and date_deadline to moments
_.each(activities, function (activity) {
@@ -108,6 +109,7 @@ var AbstractActivityField = AbstractField.extend({
method: 'action_feedback',
args: [[id]],
kwargs: {feedback: feedback},
+ context: this.record.getContext(),
});
},
_scheduleActivity: function (id, previous_activity_type_id, callback) {
diff --git a/addons/mail/static/src/js/chat_window.js b/addons/mail/static/src/js/chat_window.js
index 9f09eb390b0..9e080f3a248 100644
--- a/addons/mail/static/src/js/chat_window.js
+++ b/addons/mail/static/src/js/chat_window.js
@@ -16,7 +16,8 @@ var HEIGHT_FOLDED = '34px';
return Widget.extend({
template: "mail.ChatWindow",
custom_events: {
- escape_pressed: '_onEscapePressed'
+ escape_pressed: '_onEscapePressed',
+ document_viewer_closed: '_onDocumentViewerClose',
},
events: {
'click .o_chat_composer': '_onComposerClick',
@@ -182,6 +183,9 @@ return Widget.extend({
}
this.focus_input();
},
+ _onDocumentViewerClose: function (ev) {
+ this.focus_input();
+ },
/**
* @private
*/
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index dfc041325d9..e48a7c60028 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -184,7 +184,7 @@ var Chatter = Widget.extend({
input_baseline: 14,
is_log: options && options.is_log,
record_name: this.record_name,
- default_body: old_composer && old_composer.$input && old_composer.$input.html(),
+ default_body: old_composer && old_composer.$input && old_composer.$input.val(),
default_mention_selections: old_composer && old_composer.mention_get_listener_selections(),
});
this.composer.on('input_focused', this, function () {
@@ -247,7 +247,7 @@ var Chatter = Widget.extend({
}).always(function () {
// disable widgets in create mode, otherwise enable
self.isCreateMode ? self._disableChatter() : self._enableChatter();
- $spinner.remove;
+ $spinner.remove();
});
},
/**
diff --git a/addons/mail/static/src/js/chatter_composer.js b/addons/mail/static/src/js/chatter_composer.js
index 7365b89e19e..da85f331863 100644
--- a/addons/mail/static/src/js/chatter_composer.js
+++ b/addons/mail/static/src/js/chatter_composer.js
@@ -46,7 +46,6 @@ var ChatterComposer = composer.BasicComposer.extend({
message = _.extend(message, {
subtype: 'mail.mt_comment',
message_type: 'comment',
- content_subtype: 'html',
context: self.context,
});
@@ -213,7 +212,7 @@ var ChatterComposer = composer.BasicComposer.extend({
recipient_done.then(function (partner_ids) {
var context = {
default_parent_id: self.id,
- default_body: utils.get_text2html(self.$input.html()),
+ default_body: utils.get_text2html(self.$input.val()),
default_attachment_ids: _.pluck(self.get('attachment_ids'), 'id'),
default_partner_ids: partner_ids,
default_is_log: self.options.is_log,
diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js
index 3a7b9c320e1..f89c0382554 100644
--- a/addons/mail/static/src/js/composer.js
+++ b/addons/mail/static/src/js/composer.js
@@ -7,6 +7,7 @@ var utils = require('mail.utils');
var config = require('web.config');
var core = require('web.core');
var data = require('web.data');
+var dom = require('web.dom');
var session = require('web.session');
var Widget = require('web.Widget');
@@ -29,7 +30,7 @@ var MentionManager = Widget.extend({
events: {
"mouseover .o_mention_proposition": "on_hover_mention_proposition",
- "click .o_mention_proposition": "_onClickMentionItem",
+ "click .o_mention_proposition": "on_click_mention_item",
},
init: function (parent, options) {
@@ -52,6 +53,49 @@ var MentionManager = Widget.extend({
this.$('.o_mention_proposition').removeClass('active');
$elem.addClass('active');
},
+ on_click_mention_item: function (event) {
+ event.preventDefault();
+
+ var text_input = this.composer.$input.val();
+ var id = $(event.currentTarget).data('id');
+ var selected_suggestion = _.find(_.flatten(this.get('mention_suggestions')), function (s) {
+ return s.id === id;
+ });
+ var substitution = selected_suggestion.substitution;
+ if (!substitution) { // no substitution string given, so use the mention name instead
+ // replace white spaces with non-breaking spaces to facilitate mentions detection in text
+ selected_suggestion.name = selected_suggestion.name.replace(/ /g, NON_BREAKING_SPACE);
+ substitution = this.active_listener.delimiter + selected_suggestion.name;
+ }
+ var get_mention_index = function (matches, cursor_position) {
+ for (var i=0; i<matches.length; i++) {
+ if (cursor_position <= matches[i].index) {
+ return i;
+ }
+ }
+ return i;
+ };
+
+ // add the selected suggestion to the list
+ if (this.active_listener.selection.length) {
+ // get mention matches (ordered by index in the text)
+ var matches = this._get_match(text_input, this.active_listener);
+ var index = get_mention_index(matches, this._get_selection_positions().start);
+ this.active_listener.selection.splice(index, 0, selected_suggestion);
+ } else {
+ this.active_listener.selection.push(selected_suggestion);
+ }
+
+ // update input text, and reset dropdown
+ var cursor_position = this._get_selection_positions().start;
+ var text_left = text_input.substring(0, cursor_position-(this.mention_word.length+1));
+ var text_right = text_input.substring(cursor_position, text_input.length);
+ var text_input_new = text_left + substitution + ' ' + text_right;
+ this.composer.$input.val(text_input_new);
+ this._set_cursor_position(text_left.length+substitution.length+2);
+ this.set('mention_suggestions', []);
+ this.composer.focus(); // to trigger autoresize
+ },
// Public API
/**
@@ -86,8 +130,8 @@ var MentionManager = Widget.extend({
get_listener_selection: function (delimiter) {
var listener = _.findWhere(this.listeners, {delimiter: delimiter});
if (listener) {
- var inputMentions = this.composer.$input.text().match(new RegExp(delimiter+'[^ ]+(?= |&nbsp;)', 'g'));
- return this._validate_selection(listener.selection, inputMentions);
+ var input_mentions = this.composer.$input.val().match(new RegExp(delimiter+'[^ ]+(?= |&nbsp;)', 'g'));
+ return this._validate_selection(listener.selection, input_mentions);
}
return [];
},
@@ -106,15 +150,15 @@ var MentionManager = Widget.extend({
*/
detect_delimiter: function () {
var self = this;
- var textVal = this.composer.$input.html();
- var cursorPosition = this._getSelectionPositions();
- var leftString = textVal.substring(0, cursorPosition);
+ var text_val = this.composer.$input.val();
+ var cursor_position = this._get_selection_positions().start;
+ var left_string = text_val.substring(0, cursor_position);
function validate_keyword (delimiter, beginning_only) {
- var delimiter_position = leftString.lastIndexOf(delimiter) - 1;
+ var delimiter_position = left_string.lastIndexOf(delimiter) - 1;
if (beginning_only && delimiter_position > 0) {
return false;
}
- var search_str = textVal.substring(delimiter_position, cursorPosition);
+ var search_str = text_val.substring(delimiter_position, cursor_position);
var pattern = "(^"+delimiter+"|(^\\s"+delimiter+"))";
var regex_start = new RegExp(pattern, "g");
search_str = search_str.replace(/^\s\s*|^[\n\r]/g, '');
@@ -203,8 +247,6 @@ var MentionManager = Widget.extend({
/**
* Returns the matches (as RexExp.exec does) for the mention in the input text
- *
- * @private
* @param {String} input_text: the text to search matches
* @param {Object} listener: the listener for which we want to find a match
* @returns {Object[]} matches in the same format as RexExp.exec()
@@ -229,32 +271,6 @@ var MentionManager = Widget.extend({
return result;
},
/**
- * Get cursor position in contenteditable div with it's inner html content.
- *
- * @private
- * @return a current cursor position
- */
- _getSelectionPositions: function () {
- if (window.getSelection && window.getSelection().getRangeAt) {
- var range = window.getSelection().getRangeAt(0);
- var selectedObj = window.getSelection();
- var rangeCount = 0;
- var childNodes = selectedObj.anchorNode.parentNode.childNodes;
- for (var i = 0; i < childNodes.length; i++) {
- if (childNodes[i] === selectedObj.anchorNode) {
- break;
- }
- if (childNodes[i].outerHTML)
- rangeCount += childNodes[i].outerHTML.length;
- else if (childNodes[i].nodeType === 3) {
- rangeCount += childNodes[i].textContent.length;
- }
- }
- return range.startOffset + rangeCount;
- }
- return -1;
- },
- /**
* @private
* @param {integer} keycode
*/
@@ -312,23 +328,9 @@ var MentionManager = Widget.extend({
this.open = false;
}
},
- /*
- * Set cursor position after mention is added.
- * @private
- * @paran {int} node - id of childnode to set cursor position after it.
- */
- _setCursorPosition: function (nodeID) {
- var range = document.createRange();
- var selection = window.getSelection();
- range.setStart(document.getElementById(nodeID).nextSibling, 1);
- range.collapse(true);
- selection.removeAllRanges();
- selection.addRange(range);
- this.composer.$input.focus();
- },
- _validate_selection: function (selection, inputMentions) {
+ _validate_selection: function (selection, input_mentions) {
var validated_selection = [];
- _.each(inputMentions, function (mention) {
+ _.each(input_mentions, function (mention) {
var validated_mention = _.findWhere(selection, {name: mention.slice(1)});
if (validated_mention) {
validated_selection.push(validated_mention);
@@ -337,60 +339,15 @@ var MentionManager = Widget.extend({
return validated_selection;
},
- //--------------------------------------------------------------------------
- // Handlers
- //--------------------------------------------------------------------------
-
- /**
- * after click on mention item it set to a contenteditable div with it's new
- * cursor postion
- *
- * @private
- * @param {KeyboardEvent} event - to get a current selected mention from
- * list and eventlistener.
- */
- _onClickMentionItem: function (event) {
- event.preventDefault();
-
- var textInput = this.composer.$input.html();
- var id = $(event.currentTarget).data('id');
- var selectedSuggestion = _.find(_.flatten(this.get('mention_suggestions')), function (s) {
- return s.id === id;
+ // Cursor position and selection utils
+ _get_selection_positions: function () {
+ var el = this.composer.$input.get(0);
+ return el ? dom.getSelectionRange(el) : {start: 0, end: 0};
+ },
+ _set_cursor_position: function (pos) {
+ this.composer.$input.each(function (index, elem) {
+ dom.setSelectionRange(elem, {start: pos, end: pos});
});
- var substitution = selectedSuggestion.substitution;
- if (!substitution) { // no substitution string given, so use the mention name instead
- // replace white spaces with non-breaking spaces to facilitate mentions detection in text
- selectedSuggestion.name = selectedSuggestion.name.replace(/ /g, NON_BREAKING_SPACE);
- substitution = _.escape(this.active_listener.delimiter + selectedSuggestion.name);
- }
- var getMentionIndex = function (matches, cursorPosition) {
- for (var i=0; i<matches.length; i++) {
- if (cursorPosition <= matches[i].index) {
- return i;
- }
- }
- return i;
- };
-
- // add the selected suggestion to the list
- if (this.active_listener.selection.length) {
- // get mention matches (ordered by index in the text)
- var matches = this._get_match(textInput, this.active_listener);
- var index = getMentionIndex(matches, this._getSelectionPositions());
- this.active_listener.selection.splice(index, 0, selectedSuggestion);
- } else {
- this.active_listener.selection.push(selectedSuggestion);
- }
-
- // update input text, and reset dropdown
- var cursorPosition = this._getSelectionPositions();
- var textLeft = textInput.substring(0, cursorPosition-(this.mention_word.length+1));
- var textRight = textInput.substring(cursorPosition, textInput.length);
- var nodeID = _.uniqueId('node');
- var newTextInput = textLeft + "<a id="+ nodeID+">" + substitution + "</a> " + textRight;
- this.composer.$input.html(newTextInput);
- this._setCursorPosition(nodeID);
- this.set('mention_suggestions', []);
},
});
@@ -398,8 +355,8 @@ var MentionManager = Widget.extend({
var BasicComposer = Widget.extend({
template: "mail.ChatComposer",
events: {
- "keydown .o_composer_input": "_onKeydown",
- "keyup .o_composer_input": "_onKeyup",
+ "keydown .o_composer_input textarea": "on_keydown",
+ "keyup .o_composer_input": "on_keyup",
"change input.o_input_file": "on_attachment_change",
"click .o_composer_button_send": "send_message",
"click .o_composer_button_add_attachment": "on_click_add_attachment",
@@ -410,7 +367,6 @@ var BasicComposer = Widget.extend({
'focusout .o_composer_button_emoji': '_onEmojiButtonFocusout',
'focus .o_mail_emoji_container .o_mail_emoji': '_onEmojiImageFocus',
'click .o_mail_emoji_container .o_mail_emoji': '_onEmojiImageClick',
- 'input .o_composer_input': '_removeMention',
},
// RPCs done to fetch the mention suggestions are throttled with the following value
MENTION_THROTTLE: 200,
@@ -487,12 +443,12 @@ var BasicComposer = Widget.extend({
this.$attachment_button = this.$(".o_composer_button_add_attachment");
this.$attachments_list = this.$('.o_composer_attachments_list');
- this.$input = this.$('.o_composer_input');
+ this.$input = this.$('.o_composer_input textarea');
this.$input.focus(function () {
self.trigger('input_focused');
});
- this.$input.html(this.options.default_body);
- this.$input.css('min-height', this.options.input_min_height);
+ this.$input.val(this.options.default_body);
+ dom.autoresize(this.$input, {parent: this, min_height: this.options.input_min_height});
// Attachments
$(window).on(this.fileupload_id, this.on_attachment_loaded);
@@ -514,7 +470,7 @@ var BasicComposer = Widget.extend({
// behavior for the chatter composer
//Removing unwanted extra spaces from message
- var value = _.escape(this.$input.text()).trim();
+ var value = _.escape(this.$input.val()).trim();
value = value.replace(/(\r|\n){2,}/g, '<br/><br/>');
value = value.replace(/(\r|\n)/g, '<br/>');
@@ -545,7 +501,7 @@ var BasicComposer = Widget.extend({
clear_composer: function() {
// Empty input, selected partners and attachments
- this.$input.html('');
+ this.$input.val('');
this.mention_manager.reset_selections();
this.set('attachment_ids', []);
},
@@ -557,7 +513,7 @@ var BasicComposer = Widget.extend({
getState: function () {
return {
attachments: this.get('attachment_ids'),
- text: this.$input.html(),
+ text: this.$input.val(),
};
},
@@ -565,11 +521,14 @@ var BasicComposer = Widget.extend({
on_click_add_attachment: function () {
this.$('input.o_input_file').click();
this.$input.focus();
+ // set ignoreEscape to avoid escape_pressed event when file selector dialog is opened
+ // when user press escape to cancel file selector dialog then escape_pressed event should not be trigerred
+ this.ignoreEscape = true;
},
setState: function (state) {
this.set('attachment_ids', state.attachments);
- this.$input.html(state.text);
+ this.$input.val(state.text);
},
/**
@@ -578,18 +537,8 @@ var BasicComposer = Widget.extend({
should_send: function (event) {
return !event.shiftKey;
},
- /**
- * _onKeydown event is triggered when is key is pressed
- * - on UP and DOWN arrow is pressed then event prevents it's default
- * behaviour if mention manager is open else it break it.
- * - on ENTER key is pressed and mention manager is open then event
- * prevents it's default behaviour else check if ControlKey is
- * pressed or not if yes then it send a message
- *
- * @private
- * @param {KeyboardEvent} event
- */
- _onKeydown: function (event) {
+
+ on_keydown: function (event) {
switch(event.which) {
// UP, DOWN, TAB: prevent moving cursor if navigation in mention propositions
case $.ui.keyCode.UP:
@@ -614,16 +563,7 @@ var BasicComposer = Widget.extend({
}
},
- /**
- * _onKeyup event is triggered when key is released.
- * on ESCAP key it close the mention suggestion dropdown menu.
- * on ENTER key it selects that mention and add to a content editable div.
- * on UP or DOWN key it highlights previous or next mention respectively.
- *
- * @private
- * @param {KeyboardEvent} event
- */
- _onKeyup: function (event) {
+ on_keyup: function (event) {
switch(event.which) {
// ESCAPED KEYS: do nothing
case $.ui.keyCode.END:
@@ -635,6 +575,8 @@ var BasicComposer = Widget.extend({
if (this.mention_manager.is_open()) {
event.stopPropagation();
this.mention_manager.reset_suggestions();
+ } else if (this.ignoreEscape) {
+ this.ignoreEscape = false;
} else {
this.trigger_up("escape_pressed");
}
@@ -738,12 +680,6 @@ var BasicComposer = Widget.extend({
attachments: this.get('attachment_ids'),
}));
},
- // remove mention when user try to edit or remove it.
- _removeMention: function (event) {
- if (window.getSelection().anchorNode.parentNode.tagName === 'A') {
- document.getElementById(window.getSelection().anchorNode.parentNode.id).remove();
- }
- },
// Mention
mention_fetch_throttled: function (model, method, kwargs) {
@@ -829,14 +765,8 @@ var BasicComposer = Widget.extend({
},
// Others
- /**
- * used to check if contenteditable div is empty or not
- *
- * @return - it returns length of attachment and trim content of input box
- * tp check for empty.
- */
is_empty: function () {
- return !this.$input.text().trim() && !this.$('.o_attachments').children().length;
+ return !this.$input.val().trim() && !this.$('.o_attachments').children().length;
},
focus: function () {
this.$input.focus();
@@ -871,6 +801,7 @@ var BasicComposer = Widget.extend({
* @param {MouseEvent} event
*/
_onAttachmentView: function (event) {
+ event.stopPropagation();
var activeAttachmentID = $(event.currentTarget).data('id');
var attachments = this.get('attachment_ids');
if (activeAttachmentID) {
@@ -894,7 +825,7 @@ var BasicComposer = Widget.extend({
if (this.$emojisContainer.parent().length) {
this._hideEmojis();
} else {
- this.$emojisContainer.appendTo(this.$('.o_composer_container'));
+ this.$emojisContainer.appendTo(this.$('.o_composer'));
}
},
/**
@@ -919,31 +850,6 @@ var BasicComposer = Widget.extend({
clearTimeout(this._hideEmojisTimeout);
},
/**
- * set cursor position at the end in input box
- *
- * @todo move that kind of code in a utility file. Maybe dom.js
- *
- * @private
- * @param {Element} el
- */
- _placeCaretAtEnd: function (el) {
- el.focus();
- if (typeof window.getSelection !== "undefined"
- && typeof document.createRange !== "undefined") {
- var range = document.createRange();
- range.selectNodeContents(el);
- range.collapse(false);
- var sel = window.getSelection();
- sel.removeAllRanges();
- sel.addRange(range);
- } else if (typeof document.body.createTextRange !== "undefined") {
- var textRange = document.body.createTextRange();
- textRange.moveToElementText(el);
- textRange.collapse(false);
- textRange.select();
- }
- },
- /**
* Called when an emoji is clicked -> adds it in the <input/>, focuses the
* <input/> and closes the emoji panel.
*
@@ -951,8 +857,8 @@ var BasicComposer = Widget.extend({
* @param {Event} ev
*/
_onEmojiImageClick: function (ev) {
- this.$input.html(this.$input.html() + " " + $(ev.currentTarget).data('emoji') + " ");
- this._placeCaretAtEnd(this.$input[0]);
+ this.$input.val(this.$input.val() + " " + $(ev.currentTarget).data('emoji') + " ");
+ this.$input.focus();
this._hideEmojis();
},
});
diff --git a/addons/mail/static/src/js/discuss.js b/addons/mail/static/src/js/discuss.js
index 3ac9e3b0ed5..3f37a620c80 100644
--- a/addons/mail/static/src/js/discuss.js
+++ b/addons/mail/static/src/js/discuss.js
@@ -861,7 +861,6 @@ var Discuss = AbstractAction.extend(ControlPanelMixin, {
message.subtype = this.selected_message.is_note ? 'mail.mt_note': 'mail.mt_comment';
message.subtype_id = false;
message.message_type = 'comment';
- message.content_subtype = 'html';
}
this.call('chat_manager', 'postMessage', message, options)
.then(function () {
diff --git a/addons/mail/static/src/js/document_viewer.js b/addons/mail/static/src/js/document_viewer.js
index d03b4811c76..3aa7e25c399 100644
--- a/addons/mail/static/src/js/document_viewer.js
+++ b/addons/mail/static/src/js/document_viewer.js
@@ -26,6 +26,7 @@ var DocumentViewer = Widget.extend({
'DOMMouseScroll .o_viewer_content': '_onScroll', // Firefox
'mousewheel .o_viewer_content': '_onScroll', // Chrome, Safari, IE
'keydown': '_onKeydown',
+ 'keyup': '_onKeyUp',
'mousedown .o_viewer_img': '_onStartDrag',
'mousemove .o_viewer_content': '_onDrag',
'mouseup .o_viewer_content': '_onEndDrag'
@@ -156,6 +157,7 @@ var DocumentViewer = Widget.extend({
_onClose: function (e) {
e.preventDefault();
this.$el.modal('hide');
+ this.trigger_up('document_viewer_closed');
},
/**
* When popup close complete destroyed modal even DOM footprint too
@@ -239,6 +241,20 @@ var DocumentViewer = Widget.extend({
}
},
/**
+ * Close popup on ESCAPE keyup
+ *
+ * @private
+ * @param {KeyEvent} e
+ */
+ _onKeyUp: function (e) {
+ switch (e.which) {
+ case $.ui.keyCode.ESCAPE:
+ e.preventDefault();
+ this._onClose(e);
+ break;
+ }
+ },
+ /**
* @private
* @param {MouseEvent} e
*/
diff --git a/addons/mail/static/src/js/services/chat_manager.js b/addons/mail/static/src/js/services/chat_manager.js
index 6d9a822999d..4bb6e9be6aa 100644
--- a/addons/mail/static/src/js/services/chat_manager.js
+++ b/addons/mail/static/src/js/services/chat_manager.js
@@ -730,7 +730,6 @@ var ChatManager = AbstractService.extend({
args: [options.channelID],
kwargs: _.extend(msg, {
message_type: 'comment',
- content_subtype: 'html',
subtype: 'mail.mt_comment',
command: data.command,
}),
@@ -739,7 +738,6 @@ var ChatManager = AbstractService.extend({
if ('model' in options && 'res_id' in options) {
// post a message in a chatter
_.extend(msg, {
- content_subtype: data.content_subtype,
context: data.context,
message_type: data.message_type,
subtype: data.subtype,
@@ -1357,7 +1355,15 @@ var ChatManager = AbstractService.extend({
//add o_mail_emoji class on each unicode to manage size and font
var unicode = String(value);
var regexp = new RegExp("(?:^|\\s|<[a-z]*>)(" + unicode + ")(?=\\s|$|</[a-z]*>)", "g");
+ var msg_bak = msg.body;
msg.body = msg.body.replace(regexp, ' <span class="o_mail_emoji">'+unicode+'</span> ');
+ // Idiot-proof limit. If the user had the amazing idea of copy-pasting thousands of emojis,
+ // the image rendering can lead to memory overflow errors on some browsers (e.g. Chrome).
+ // Set an arbitrary limit to 200 from which we simply don't replace them (anyway, they are
+ // already replaced by the unicode counterpart).
+ if (_.str.count(msg.body, 'o_mail_emoji') > 200) {
+ msg.body = msg_bak;
+ }
});
function propertyDescr(channel) {
return {
diff --git a/addons/mail/static/src/js/thread.js b/addons/mail/static/src/js/thread.js
index d4bd448d2f8..f34823ff9fc 100644
--- a/addons/mail/static/src/js/thread.js
+++ b/addons/mail/static/src/js/thread.js
@@ -380,6 +380,7 @@ var Thread = Widget.extend({
* @param {MouseEvent} event
*/
_onAttachmentView: function (event) {
+ event.stopPropagation();
var activeAttachmentID = $(event.currentTarget).data('id');
if (activeAttachmentID) {
var attachmentViewer = new DocumentViewer(this, this.attachments, activeAttachmentID);
diff --git a/addons/mail/static/src/scss/composer.scss b/addons/mail/static/src/scss/composer.scss
index e7caf3821d0..cb079f81558 100644
--- a/addons/mail/static/src/scss/composer.scss
+++ b/addons/mail/static/src/scss/composer.scss
@@ -24,7 +24,7 @@
position: relative;
background: white;
- input {
+ textarea, input {
border: none;
}
}
@@ -41,19 +41,9 @@
}
.o_composer {
- .o_composer_input[contenteditable=true]:empty:before {
- content: attr(placeholder);
- opacity: 0.4;
- }
- .o_composer_input {
- border: none;
- box-shadow: none;
- cursor: text;
- display: inline-block;
- height: 100%;
- padding: 0px 0px $o-mail-chatter-gap;
- white-space: pre-wrap;
- word-break: break-all;
+ .o_composer_input > textarea {
+ width: 100%;
+ resize: none;
}
.o_composer_mention_dropdown .o_mention_proposition > a {
@include o-text-overflow;
@@ -82,18 +72,19 @@
color: $o-brand-optional;
}
}
- }
-
- .o_mail_emoji_container {
- padding: 0 $o-mail-chatter-gap $o-mail-chatter-gap 0;
- border: 1px solid $gray-lighter-dark;
- background-color: $gray-lighter;
- .o_mail_emoji {
- margin: $o-mail-chatter-gap 0 0 $o-mail-chatter-gap;
- cursor: pointer; // only in the popover
- min-width: 20px;
- min-height: 20px;
+ .o_mail_emoji_container {
+ padding: 0 $o-mail-chatter-gap $o-mail-chatter-gap 0;
+ border: 1px solid $gray-lighter-dark;
+ border-width: 1px 0 0 0;
+ background-color: $gray-lighter;
+
+ .o_mail_emoji {
+ margin: $o-mail-chatter-gap 0 0 $o-mail-chatter-gap;
+ cursor: pointer; // only in the popover
+ min-width: 20px;
+ min-height: 20px;
+ }
}
}
@@ -119,13 +110,19 @@
.o_composer {
border-radius: 2px;
+ textarea {
+ padding-right: $grid-gutter-width; // avoid overlaps betwenn textarea and o_composer_button_full_composer
+ }
+ .o_mail_emoji_container {
+ margin: 0 -$o-mail-chatter-gap;
+ }
}
.o_composer, .o_composer_subject {
border: 1px solid $gray-lighter-dark;
- input {
+ textarea, input {
padding: 0 0 $o-mail-chatter-gap;
border: none;
}
@@ -137,9 +134,6 @@
.o_chatter_composer_tools {
border-top: 1px solid $gray-lighter-dark;
- @media (max-width: $screen-xs-max) {
- margin-top: 10px;
- }
}
&:not(.o_chat_inline_composer) {
@@ -158,24 +152,26 @@
&.o_chat_inline_composer {
.o_composer_container {
- @include o-flex(1, 1, auto);
+ @include o-flex(1, 0, auto);
}
.o_composer {
- display: flex;
- min-height: 40px;
padding: $o-mail-chatter-gap $o-mail-chatter-gap 0 $o-mail-chatter-gap;
border-radius: 2px 0 0 2px;
border-right-width: 0;
- }
- .o_mail_emoji_container {
- text-align: right;
- border-width: 1px;
+
+ .o_mail_emoji_container {
+ text-align: right;
+ border-right-width: 1px;
+ }
}
.o_composer_input {
+ @include o-flex-display();
@include o-flex-flow(row, wrap);
}
.o_composer_text_field {
@include o-flex(1, 1, 50%);
+ margin: 0;
+ padding: 0;
}
.o_chatter_composer_tools {
@include o-flex(0, 1, auto);
@@ -207,25 +203,32 @@
border-top: 1px solid $gray-lighter-dark;
width: 100%;
}
- .o_mail_emoji_container {
- @include o-position-absolute(auto, 0, 100%, 0);
- border-bottom-width: 1px;
+ .o_composer {
+ .o_mail_emoji_container {
+ @include o-position-absolute(auto, 0, 100%, 0);
+ border-bottom-width: 1px;
+ }
}
.o_composer_input {
+ @include o-flex-display();
@include o-flex-flow(row, nowrap);
+ textarea.o_composer_text_field {
+ @include o-flex(1, 1, auto);
+ }
+
.o_chatter_composer_tools {
@include o-flex(0, 0, auto);
}
+ @media (max-width: $screen-xs-max) {
+ .o_composer_button_send {
+ display: inline-block;
+ }
+ }
}
.o_composer_button_send, .o_chatter_avatar {
display: none;
}
- @media (max-width: $screen-xs-max) {
- .o_composer_button_send {
- display: inline-block;
- }
- }
}
}
diff --git a/addons/mail/static/src/scss/extended_chat_window.scss b/addons/mail/static/src/scss/extended_chat_window.scss
index 774a37c6120..6cb930b4488 100644
--- a/addons/mail/static/src/scss/extended_chat_window.scss
+++ b/addons/mail/static/src/scss/extended_chat_window.scss
@@ -42,14 +42,10 @@
}
.o_chatter_composer_tools {
@include o-position-absolute($right: 0px, $top: 0px);
-
- @media (max-width: $screen-xs-max) {
- @include o-position-absolute($right: 6px, $top: 0px);
- }
button {
- padding: 8px;
+ padding: 10px;
@media (max-width: $screen-xs-max) {
- padding: 7px 6px 0px 6px;
+ padding: 13px;
}
&.btn-icon {
font-size: 1.3em;
diff --git a/addons/mail/static/src/xml/composer.xml b/addons/mail/static/src/xml/composer.xml
index 90beedc147f..bb9321a749d 100644
--- a/addons/mail/static/src/xml/composer.xml
+++ b/addons/mail/static/src/xml/composer.xml
@@ -8,11 +8,13 @@
<input tabindex="1" type="text" placeholder="Subject" class="o_input"/>
</div>
<div t-attf-class="o_composer #{widget.extended ? 'o_extended_composer' : ''}">
- <div class="o_composer_input o_composer_text_field form-control" contenteditable="true" placeholder="Write Something..."/>
- <div class="o_chatter_composer_tools">
- <button tabindex="4" class="btn btn-sm btn-icon fa fa-smile-o o_composer_button_emoji" type="button" data-toggle="popover"/>
- <button tabindex="5" class="btn btn-sm btn-icon fa fa-paperclip o_composer_button_add_attachment" type="button"/>
- <button t-if="widget.options.isMobile" tabindex="3" class="btn btn-sm btn-icon fa fa-paper-plane-o o_composer_button_send" type="button"/>
+ <div class="o_composer_input">
+ <textarea class="o_input o_composer_text_field" tabindex="2" placeholder="Write something..."/>
+ <div class="o_chatter_composer_tools">
+ <button tabindex="4" class="btn btn-sm btn-icon fa fa-smile-o o_composer_button_emoji" type="button" data-toggle="popover"/>
+ <button tabindex="5" class="btn btn-sm btn-icon fa fa-paperclip o_composer_button_add_attachment" type="button"/>
+ <button t-if="widget.options.isMobile" tabindex="3" class="btn btn-sm btn-icon fa fa-paper-plane-o o_composer_button_send" type="button"/>
+ </div>
</div>
</div>
<div class="o_composer_attachments_list"/>
diff --git a/addons/mail/static/src/xml/thread.xml b/addons/mail/static/src/xml/thread.xml
index c3aa2388154..5ef23d46c43 100644
--- a/addons/mail/static/src/xml/thread.xml
+++ b/addons/mail/static/src/xml/thread.xml
@@ -61,7 +61,7 @@
</t>
<t t-name="DocumentViewer">
- <div class="modal o_modal_fullscreen" tabindex="-1" role="dialog" aria-hidden="true">
+ <div class="modal o_modal_fullscreen" tabindex="-1" data-keyboard="false" role="dialog" aria-hidden="true">
<t t-call="DocumentViewer.Content"/>
<t t-if="widget.attachment.length != 1">
diff --git a/addons/mail/static/tests/chat_window_tests.js b/addons/mail/static/tests/chat_window_tests.js
index 05df8461d18..348b329986a 100644
--- a/addons/mail/static/tests/chat_window_tests.js
+++ b/addons/mail/static/tests/chat_window_tests.js
@@ -62,6 +62,84 @@ QUnit.module('mail', {
parent.destroy();
});
+ QUnit.test('open document viewer and close using ESCAPE key should reset focus to chat window', function (assert) {
+ assert.expect(6);
+
+ function createParent(params) {
+ var widget = new Widget();
+
+ testUtils.addMockEnvironment(widget, params);
+ return widget;
+ }
+ var messages = [{
+ attachment_ids: [{
+ filename: 'image1.jpg',
+ id:1,
+ mimetype: 'image/jpeg',
+ name: 'Test Image 1',
+ url: '/web/content/1?download=true'
+ }],
+ author_id: ["1", "John Doe"],
+ body: "A message",
+ date: moment("2016-12-20 09:35:40"),
+ displayed_author: "John Doe",
+ id: 1,
+ is_note: false,
+ is_starred: false,
+ model: 'partner',
+ res_id: 2
+ }];
+ var parent = createParent({
+ mockRPC: function (route, args) {
+ if(_.str.contains(route, '/mail/attachment/preview/') ||
+ _.str.contains(route, '/web/static/lib/pdfjs/web/viewer.html')){
+ var canvas = document.createElement('canvas');
+ return $.when(canvas.toDataURL());
+ }
+ return this._super.apply(this, arguments);
+ },
+ data: {},
+ });
+
+ var chatWindow = new ChatWindow(parent, 1, "user", false, messages.length, {});
+ chatWindow.appendTo($('#qunit-fixture'));
+ chatWindow.render(messages);
+
+ testUtils.intercept(chatWindow, 'get_messages', function(event) {
+ event.stopPropagation();
+ var requested_msgs = _.filter(messages, function (msg) {
+ return _.contains(event.data.options.ids, msg.id);
+ });
+ event.data.callback($.when(requested_msgs));
+ }, true);
+
+ testUtils.intercept(chatWindow, 'get_bus', function(event) {
+ event.stopPropagation();
+ event.data.callback(new Bus());
+ }, true);
+
+ chatWindow.on('document_viewer_closed', null, function () {
+ assert.ok(true, "chat window should trigger a close document viewer event");
+ });
+ assert.strictEqual(chatWindow.$('.o_thread_message .o_attachment').length, 1,
+ "there should be three attachment on message");
+ // click on first image attachement
+ chatWindow.$('.o_thread_message .o_attachment .o_image_box .o_image_overlay').first().click();
+ // check focus is on document viewer popup and then press escape to close it
+ assert.strictEqual(document.activeElement, $('.o_modal_fullscreen')[0], "Modal popup should have focus");
+ assert.strictEqual($('.o_modal_fullscreen img.o_viewer_img[data-src*="/web/image/1?unique=1"]').length, 1,
+ "Modal popup should open with first image src");
+ // trigger ESCAPE keyup on document viewer popup
+ var upKeyEvent = jQuery.Event("keyup", {which: 27});
+ $('.o_modal_fullscreen').trigger(upKeyEvent);
+ assert.strictEqual(document.activeElement, chatWindow.$input[0],
+ "input should be focused");
+ var upKeyEvent = jQuery.Event( "keyup", {which: 27});
+ chatWindow.$('.o_composer_input').trigger(upKeyEvent);
+ assert.strictEqual(chatWindow.folded, false, "Closed chat Window");
+ parent.destroy();
+ });
+
QUnit.test('chat window\'s input can still be focused when the UI is blocked', function (assert) {
assert.expect(2);
diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js
index 8c1edc2f622..46de2e22d3f 100644
--- a/addons/mail/static/tests/chatter_tests.js
+++ b/addons/mail/static/tests/chatter_tests.js
@@ -368,9 +368,7 @@ QUnit.test('kanban activity widget with an activity', function (assert) {
QUnit.test('chatter: post, receive and star messages', function (assert) {
var done = assert.async();
- assert.expect(28);
-
- var unpatchWindowGetSelection = testUtils.patchWindowGetSelection();
+ assert.expect(27);
var bus = new Bus();
var BusService = createBusService(bus);
@@ -475,7 +473,7 @@ QUnit.test('chatter: post, receive and star messages', function (assert) {
// send a message
form.$('.o_chatter_button_new_message').click();
assert.ok(!$('.oe_chatter .o_chat_composer').hasClass('o_hidden'), "chatter should be opened");
- form.$('.oe_chatter .o_composer_text_field:first()').text("My first message");
+ form.$('.oe_chatter .o_composer_text_field:first()').val("My first message");
form.$('.oe_chatter .o_composer_button_send').click();
assert.ok($('.oe_chatter .o_chat_composer').hasClass('o_hidden'), "chatter should be closed");
assert.strictEqual(form.$('.o_thread_message').length, 2, "thread should contain two messages");
@@ -489,7 +487,7 @@ QUnit.test('chatter: post, receive and star messages', function (assert) {
// log a note
form.$('.o_chatter_button_log_note').click();
assert.ok(!$('.oe_chatter .o_chat_composer').hasClass('o_hidden'), "chatter should be opened");
- form.$('.oe_chatter .o_composer_text_field:first()').text("My first note");
+ form.$('.oe_chatter .o_composer_text_field:first()').val("My first note");
form.$('.oe_chatter .o_composer_button_send').click();
assert.ok($('.oe_chatter .o_chat_composer').hasClass('o_hidden'), "chatter should be closed");
assert.strictEqual(form.$('.o_thread_message').length, 3, "thread should contain three messages");
@@ -515,7 +513,10 @@ QUnit.test('chatter: post, receive and star messages', function (assert) {
// very basic test of mention
form.$('.o_chatter_button_new_message').click();
var $input = form.$('.oe_chatter .o_composer_text_field:first()');
- $input.text('@');
+ $input.val('@');
+ // the cursor position must be set for the mention manager to detect that we are mentionning
+ $input[0].selectionStart = 1;
+ $input[0].selectionEnd = 1;
$input.trigger('keyup');
assert.strictEqual(getSuggestionsDef.state(), "pending",
@@ -533,14 +534,10 @@ QUnit.test('chatter: post, receive and star messages', function (assert) {
assert.strictEqual(form.$('.o_mention_proposition .o_mention_info').text(), '(test@odoo.com)',
"suggestion should be displayed correctly");
- $(".o_mention_proposition > a").trigger("click");
- assert.strictEqual($(".o_composer_input a").length, 1, "mention is 'green' in edit mode");
-
BasicComposer.prototype.MENTION_THROTTLE = mentionThrottle;
//cleanup
form.destroy();
- unpatchWindowGetSelection();
done();
});
});
@@ -599,7 +596,7 @@ QUnit.test('chatter: post a message and switch in edit mode', function (assert)
// send a message
form.$('.o_chatter_button_new_message').click();
- form.$('.oe_chatter .o_composer_text_field:first()').text("My first message");
+ form.$('.oe_chatter .o_composer_text_field:first()').val("My first message");
form.$('.oe_chatter .o_composer_button_send').click();
assert.strictEqual(form.$('.o_thread_message').length, 1, "thread should contain a message");
assert.ok(form.$('.o_thread_message:first() .o_thread_message_core').text().indexOf('My first message') >= 0,
diff --git a/addons/mail/static/tests/discuss_tests.js b/addons/mail/static/tests/discuss_tests.js
index 8d3ac86824e..8b7c72fd21e 100644
--- a/addons/mail/static/tests/discuss_tests.js
+++ b/addons/mail/static/tests/discuss_tests.js
@@ -12,7 +12,6 @@ var testUtils = require('web.test_utils');
var createBusService = mailTestUtils.createBusService;
var createDiscuss = mailTestUtils.createDiscuss;
-var patchWindowGetSelection = testUtils.patchWindowGetSelection;
QUnit.module('mail', {}, function () {
@@ -156,14 +155,13 @@ QUnit.test('@ mention in channel', function (assert) {
// click on general
$general.click();
- var $input = discuss.$('.o_composer_input').first();
+ var $input = discuss.$('textarea.o_composer_text_field').first();
assert.ok($input.length, "should display a composer input");
// Simulate '@' typed by user with mocked Window.getSelection
// Note: focus is needed in order to trigger rpc 'channel_fetch_listeners'
$input.focus();
- $input.text("@");
- var unpatchWindowGetSelection = patchWindowGetSelection();
+ $input.val("@");
$input.trigger('keyup');
fetchListenersDef
@@ -249,7 +247,7 @@ QUnit.test('@ mention in channel', function (assert) {
$input.trigger($.Event('keyup', {which: $.ui.keyCode.ENTER}));
assert.strictEqual(discuss.$('.o_mention_proposition').length, 0,
"should not have any partner mention proposition after ENTER");
- assert.strictEqual($input.find('a').text() , "@Admin",
+ assert.strictEqual($input.val().trim() , "@Admin",
"should have the correct mention link in the composer input");
// send message
@@ -266,7 +264,6 @@ QUnit.test('@ mention in channel', function (assert) {
"@Admin", "should have correct mention link in the message content");
// Restore window.getSelection
- unpatchWindowGetSelection();
discuss.destroy();
done();
});
diff --git a/addons/maintenance/i18n/nl.po b/addons/maintenance/i18n/nl.po
index a2daf9dcdec..d3c25d13c22 100644
--- a/addons/maintenance/i18n/nl.po
+++ b/addons/maintenance/i18n/nl.po
@@ -274,7 +274,7 @@ msgstr "Aangemaakt door"
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_request__owner_user_id
msgid "Created by User"
-msgstr ""
+msgstr "Aangemaakt door gebruiker"
#. module: maintenance
#: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment__create_date
diff --git a/addons/mass_mailing/i18n/tr.po b/addons/mass_mailing/i18n/tr.po
index 6df27d5b6b1..c43c4af4b0d 100644
--- a/addons/mass_mailing/i18n/tr.po
+++ b/addons/mass_mailing/i18n/tr.po
@@ -1210,7 +1210,7 @@ msgstr ""
#. module: mass_mailing
#: model:ir.ui.view,arch_db:mass_mailing.s_mail_block_comparison_table
msgid "No customization"
-msgstr ""
+msgstr "Özelliştirme yok"
#. module: mass_mailing
#: model:ir.actions.act_window,help:mass_mailing.action_create_ab_mass_mailings_from_campaign
diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py
index f1a2433030b..772ecf59a8d 100644
--- a/addons/mass_mailing/models/mass_mailing.py
+++ b/addons/mass_mailing/models/mass_mailing.py
@@ -780,6 +780,7 @@ class MassMailing(models.Model):
'mass_mailing_id': mailing.id,
'mailing_list_ids': [(4, l.id) for l in mailing.contact_list_ids],
'no_auto_thread': mailing.reply_to_mode != 'thread',
+ 'template_id': None,
'mail_server_id': mailing.mail_server_id.id,
}
if mailing.reply_to_mode == 'email':
diff --git a/addons/mrp/i18n/de.po b/addons/mrp/i18n/de.po
index 398b6da5f27..f8096cd40ab 100644
--- a/addons/mrp/i18n/de.po
+++ b/addons/mrp/i18n/de.po
@@ -3698,7 +3698,7 @@ msgstr ""
#: code:addons/mrp/wizard/mrp_product_produce.py:129
#, python-format
msgid "You cannot produce the same serial number twice."
-msgstr ""
+msgstr "Es ist nicht möglich die gleiche Seriennummer zweimal zu produzieren."
#. module: mrp
#: code:addons/mrp/models/mrp_unbuild.py:93
diff --git a/addons/mrp/i18n/nl.po b/addons/mrp/i18n/nl.po
index e312a01bcd2..a9638223b4f 100644
--- a/addons/mrp/i18n/nl.po
+++ b/addons/mrp/i18n/nl.po
@@ -292,7 +292,7 @@ msgstr "Voeg een omschrijving toe..."
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_work_orders
msgid "Add a work center"
-msgstr ""
+msgstr "Voeg een werkcenter toe"
#. module: mrp
#: model:ir.ui.view,arch_db:mrp.res_config_settings_view_form
diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index 5d2bb40f5ad..1fb20d29cad 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -480,10 +480,16 @@ class MrpProduction(models.Model):
@api.multi
def _generate_workorders(self, exploded_boms):
workorders = self.env['mrp.workorder']
+ original_one = False
for bom, bom_data in exploded_boms:
# If the routing of the parent BoM and phantom BoM are the same, don't recreate work orders, but use one master routing
if bom.routing_id.id and (not bom_data['parent_line'] or bom_data['parent_line'].bom_id.routing_id.id != bom.routing_id.id):
- workorders += self._workorders_create(bom, bom_data)
+ temp_workorders = self._workorders_create(bom, bom_data)
+ workorders += temp_workorders
+ if temp_workorders: # In order to avoid two "ending work orders"
+ if original_one:
+ temp_workorders[-1].next_work_order_id = original_one
+ original_one = temp_workorders[0]
return workorders
def _workorders_create(self, bom, bom_data):
@@ -580,7 +586,7 @@ class MrpProduction(models.Model):
order._cal_price(moves_to_do)
moves_to_finish = order.move_finished_ids.filtered(lambda x: x.state not in ('done','cancel'))
moves_to_finish._action_done()
- #order.action_assign()
+ order.action_assign()
consume_move_lines = moves_to_do.mapped('active_move_line_ids')
for moveline in moves_to_finish.mapped('active_move_line_ids'):
if moveline.product_id == order.product_id and moveline.move_id.has_tracking != 'none':
diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py
index 1ccd403139b..17914b1b9dd 100644
--- a/addons/mrp/models/mrp_workorder.py
+++ b/addons/mrp/models/mrp_workorder.py
@@ -225,6 +225,7 @@ class MrpWorkorder(models.Model):
'done_wo': False,
'location_id': move.location_id.id,
'location_dest_id': move.location_dest_id.id,
+ 'date': move.date,
})
qty_todo -= 1
elif float_compare(qty_todo, 0.0, precision_rounding=rounding) < 0:
@@ -290,6 +291,18 @@ class MrpWorkorder(models.Model):
self.final_lot_id = self.env['stock.production.lot'].search([('use_next_on_work_order_id', '=', self.id)],
order='create_date, id', limit=1)
+ def _get_byproduct_move_line(self, by_product_move, quantity):
+ return {
+ 'move_id': by_product_move.id,
+ 'product_id': by_product_move.product_id.id,
+ 'product_uom_qty': quantity,
+ 'product_uom_id': by_product_move.product_uom.id,
+ 'qty_done': quantity,
+ 'workorder_id': self.id,
+ 'location_id': by_product_move.location_id.id,
+ 'location_dest_id': by_product_move.location_dest_id.id,
+ }
+
@api.multi
def record_production(self):
self.ensure_one()
@@ -367,8 +380,14 @@ class MrpWorkorder(models.Model):
if not self.next_work_order_id:
for by_product_move in self.production_id.move_finished_ids.filtered(lambda x: (x.product_id.id != self.production_id.product_id.id) and (x.state not in ('done', 'cancel'))):
- if by_product_move.has_tracking == 'none':
- by_product_move.quantity_done += self.qty_producing * by_product_move.unit_factor
+ if by_product_move.has_tracking != 'serial':
+ values = self._get_byproduct_move_line(by_product_move, self.qty_producing * by_product_move.unit_factor)
+ self.env['stock.move.line'].create(values)
+ elif by_product_move.has_tracking == 'serial':
+ qty_todo = by_product_move.product_uom._compute_quantity(self.qty_producing * by_product_move.unit_factor, by_product_move.product_id.uom_id)
+ for i in range(0, int(float_round(qty_todo, precision_digits=0))):
+ values = self._get_byproduct_move_line(by_product_move, 1)
+ self.env['stock.move.line'].create(values)
# Update workorder quantity produced
self.qty_produced += self.qty_producing
@@ -398,7 +417,12 @@ class MrpWorkorder(models.Model):
@api.multi
def button_start(self):
- # TDE CLEANME
+ self.ensure_one()
+ # As button_start is automatically called in the new view
+ if self.state in ('done', 'cancel'):
+ return True
+
+ # Need a loss in case of the real time exceeding the expected
timeline = self.env['mrp.workcenter.productivity']
if self.duration < self.duration_expected:
loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type','=','productive')], limit=1)
diff --git a/addons/mrp/views/product_views.xml b/addons/mrp/views/product_views.xml
index 921413913da..87de4ef56f9 100644
--- a/addons/mrp/views/product_views.xml
+++ b/addons/mrp/views/product_views.xml
@@ -47,7 +47,12 @@
<menuitem id="menu_mrp_product_form"
name="Products"
action="product_template_action"
- parent="menu_mrp_bom"/>
+ parent="menu_mrp_bom" sequence="1"/>
+
+ <menuitem id="product_variant_mrp" name="Product Variants"
+ action="product.product_normal_action"
+ parent="menu_mrp_bom" groups="product.group_product_variant" sequence="2"/>
+
<record id="product_template_form_view_bom_button" model="ir.ui.view">
<field name="name">product.template.procurement</field>
diff --git a/addons/mrp/wizard/mrp_product_produce.py b/addons/mrp/wizard/mrp_product_produce.py
index 78584535c65..24415fa90b9 100644
--- a/addons/mrp/wizard/mrp_product_produce.py
+++ b/addons/mrp/wizard/mrp_product_produce.py
@@ -38,7 +38,8 @@ class MrpProductProduce(models.TransientModel):
if 'produce_line_ids' in fields:
lines = []
for move in production.move_raw_ids.filtered(lambda x: (x.product_id.tracking != 'none') and x.state not in ('done', 'cancel') and x.bom_line_id):
- qty_to_consume = todo_quantity / move.bom_line_id.bom_id.product_qty * move.bom_line_id.product_qty
+ qty_to_consume = float_round(todo_quantity / move.bom_line_id.bom_id.product_qty * move.bom_line_id.product_qty,
+ precision_rounding=move.product_uom.rounding, rounding_method="UP")
for move_line in move.move_line_ids:
if float_compare(qty_to_consume, 0.0, precision_rounding=move.product_uom.rounding) <= 0:
break
@@ -176,9 +177,9 @@ class MrpProductProduceLine(models.TransientModel):
product_produce_id = fields.Many2one('mrp.product.produce')
product_id = fields.Many2one('product.product', 'Product')
lot_id = fields.Many2one('stock.production.lot', 'Lot')
- qty_to_consume = fields.Float('To Consume')
+ qty_to_consume = fields.Float('To Consume', digits=dp.get_precision('Product Unit of Measure'))
product_uom_id = fields.Many2one('uom.uom', 'Unit of Measure')
- qty_done = fields.Float('Done')
+ qty_done = fields.Float('Done', digits=dp.get_precision('Product Unit of Measure'))
move_id = fields.Many2one('stock.move')
@api.onchange('lot_id')
diff --git a/addons/note/__manifest__.py b/addons/note/__manifest__.py
index 02cb893ca1d..809bc36847b 100644
--- a/addons/note/__manifest__.py
+++ b/addons/note/__manifest__.py
@@ -17,6 +17,7 @@
'security/ir.model.access.csv',
'data/mail_activity_data.xml',
'data/note_data.xml',
+ 'data/res_users_data.xml',
'views/note_views.xml',
'views/note_templates.xml',
'views/mail_activity_views.xml',
diff --git a/addons/note/data/note_data.xml b/addons/note/data/note_data.xml
index ead6e3578d2..cffb8b081f8 100644
--- a/addons/note/data/note_data.xml
+++ b/addons/note/data/note_data.xml
@@ -2,26 +2,26 @@
<odoo>
<data>
<record model="note.stage" id="note_stage_00">
- <field name="name">Todo</field>
- <field name="sequence" eval="0"/>
+ <field name="name">New</field>
+ <field name="sequence">0</field>
<field name="user_id" eval="ref('base.user_root')"/>
</record>
<record model="note.stage" id="note_stage_01">
- <field name="name">Today</field>
- <field name="sequence">1</field>
+ <field name="name">Meeting Minutes</field>
+ <field name="sequence">5</field>
<field name="user_id" eval="ref('base.user_root')"/>
</record>
<record model="note.stage" id="note_stage_02">
- <field name="name">Tomorrow</field>
- <field name="sequence">2</field>
+ <field name="name">Notes</field>
+ <field name="sequence">10</field>
<field name="user_id" eval="ref('base.user_root')"/>
</record>
<record model="note.stage" id="note_stage_03">
- <field name="name">Later</field>
- <field name="sequence">3</field>
+ <field name="name">Todo</field>
+ <field name="sequence">50</field>
<field name="user_id" eval="ref('base.user_root')"/>
</record>
</data>
diff --git a/addons/note/data/note_demo.xml b/addons/note/data/note_demo.xml
index 7e0af90cc4f..0b24cbc613f 100644
--- a/addons/note/data/note_demo.xml
+++ b/addons/note/data/note_demo.xml
@@ -1,24 +1,6 @@
<?xml version="1.0"?>
<odoo>
<data noupdate="1">
- <record model="note.stage" id="demo_note_stage_01">
- <field name="name">Today</field>
- <field name="sequence">1</field>
- <field name="user_id" ref="base.user_demo"/>
- </record>
-
- <record model="note.stage" id="demo_note_stage_02">
- <field name="name">Tomorrow</field>
- <field name="sequence">2</field>
- <field name="user_id" ref="base.user_demo"/>
- </record>
-
- <record model="note.stage" id="demo_note_stage_03">
- <field name="name">Later</field>
- <field name="sequence">3</field>
- <field name="user_id" ref="base.user_demo"/>
- </record>
-
<record id="note_1" model="note.note">
<field name="name">Customer report #349872</field>
<field name="memo"><![CDATA[<b>Customer report #349872</b>
@@ -29,17 +11,15 @@
]]>
</field>
<field name="user_id" ref="base.user_demo"/>
- <field name="stage_id" ref="demo_note_stage_01"/>
<field name="color">2</field>
</record>
<record id="note_2" model="note.note">
- <field name="memo"><![CDATA[<b>Call Fabien</b>
+ <field name="memo"><![CDATA[<b>Call Raoulette</b>
<br/><br/>* Followed by the telephone conversation and mail about D.544.3
]]>
</field>
<field name="user_id" ref="base.user_demo"/>
- <field name="stage_id" ref="demo_note_stage_01"/>
</record>
<record id="note_4" model="note.note">
@@ -56,7 +36,6 @@
]]>
</field>
<field name="user_id" ref="base.user_demo"/>
- <field name="stage_id" ref="demo_note_stage_02"/>
</record>
<record id="note_6" model="note.note">
@@ -97,7 +76,6 @@
]]>
</field>
<field name="user_id" ref="base.user_demo"/>
- <field name="stage_id" ref="demo_note_stage_02"/>
</record>
<record id="note_12" model="note.note">
diff --git a/addons/note/data/res_users_data.xml b/addons/note/data/res_users_data.xml
new file mode 100644
index 00000000000..874982a310b
--- /dev/null
+++ b/addons/note/data/res_users_data.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<odoo>
+ <data noupdate="1">
+ <function id="init_data_user_note_stages"
+ model="res.users"
+ name="_init_data_user_note_stages"
+ eval="[]"/>
+ </data>
+</odoo>
diff --git a/addons/note/models/res_users.py b/addons/note/models/res_users.py
index be218c27b28..f4ae07e86a4 100644
--- a/addons/note/models/res_users.py
+++ b/addons/note/models/res_users.py
@@ -1,11 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+import logging
+
from odoo import api, models, modules, _
+_logger = logging.getLogger(__name__)
-class Users(models.Model):
+class Users(models.Model):
_name = 'res.users'
_inherit = ['res.users']
@@ -14,23 +17,48 @@ class Users(models.Model):
user = super(Users, self).create(values)
# for new employee, create his own 5 base note stages
if user.has_group('base.group_user'):
- for num in range(4):
- stage = self.env.ref('note.note_stage_%02d' % (num,), raise_if_not_found=False)
- if stage:
- stage.sudo().copy(default={'user_id': user.id})
+ user._create_note_stages()
return user
@api.model
+ def _init_data_user_note_stages(self):
+ emp_group_id = self.env.ref('base.group_user').id
+ query = """
+SELECT res_users.id
+FROM res_users
+WHERE res_users.active IS TRUE AND EXISTS (
+ SELECT 1 FROM res_groups_users_rel WHERE res_groups_users_rel.gid = %s AND res_groups_users_rel.uid = res_users.id
+) AND NOT EXISTS (
+ SELECT 1 FROM note_stage stage WHERE stage.user_id = res_users.id
+)
+GROUP BY id"""
+ self.env.cr.execute(query, (emp_group_id,))
+ uids = [res[0] for res in self.env.cr.fetchall()]
+ self.browse(uids)._create_note_stages()
+
+ def _create_note_stages(self):
+ data_found = False
+ for num in range(4):
+ stage = self.env.ref('note.note_stage_%02d' % (num,), raise_if_not_found=False)
+ data_found = True
+ if stage:
+ for user in self:
+ stage.sudo().copy(default={'user_id': user.id})
+ if data_found:
+ for user in self:
+ _logger.info('Note default columns created for user id %s', user.id)
+
+ @api.model
def activity_user_count(self):
""" If user have not scheduled any note, it will not appear in activity menu.
Making note activity always visible with number of notes on label. If there is no notes,
activity menu not visible for note.
"""
activities = super(Users, self).activity_user_count()
- notes_count = self.env['note.note'].search_count([('user_id', '=', self.env.uid), ('open', '=', True)])
+ notes_count = self.env['note.note'].search_count([('user_id', '=', self.env.uid)])
if notes_count:
note_index = next((index for (index, a) in enumerate(activities) if a["model"] == "note.note"), None)
- note_label = ("%s (%d)") % (_('Notes'), notes_count)
+ note_label = _('Notes')
if note_index is not None:
activities[note_index]['name'] = note_label
else:
diff --git a/addons/note/views/note_views.xml b/addons/note/views/note_views.xml
index e4a3a9d4446..c0a06497c87 100644
--- a/addons/note/views/note_views.xml
+++ b/addons/note/views/note_views.xml
@@ -157,7 +157,9 @@
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}" placeholder="Tags"/>
<field name="stage_id" domain="[('user_id','=',uid)]" widget="statusbar" options="{'clickable': '1'}"/>
</header>
- <field name="memo" type="html" class="oe_memo"/>
+ <sheet>
+ <field name="memo" type="html" class="oe_memo"/>
+ </sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
diff --git a/addons/payment/controllers/portal.py b/addons/payment/controllers/portal.py
index f683a9ce893..ae9863c4ffc 100644
--- a/addons/payment/controllers/portal.py
+++ b/addons/payment/controllers/portal.py
@@ -109,7 +109,7 @@ class WebsitePayment(http.Controller):
if order_id:
values['sale_order_ids'] = [(6, 0, [order_id])]
- tx = request.env['payment.transaction'].sudo().create(values)
+ tx = request.env['payment.transaction'].sudo().with_context(lang=None).create(values)
render_values = {
'return_url': '/website_payment/confirm?tx_id=%d' % tx.id,
@@ -142,7 +142,7 @@ class WebsitePayment(http.Controller):
if order_id:
values['sale_order_ids'] = [(6, 0, [order_id])]
- tx = request.env['payment.transaction'].sudo().create(values)
+ tx = request.env['payment.transaction'].sudo().with_context(lang=None).create(values)
try:
res = tx.s2s_do_transaction()
diff --git a/addons/payment/i18n/de.po b/addons/payment/i18n/de.po
index 483d87b6416..e65d52bf5f6 100644
--- a/addons/payment/i18n/de.po
+++ b/addons/payment/i18n/de.po
@@ -1074,6 +1074,8 @@ msgstr "Bitte wählen Sie eine Zahlungsmethode aus"
#, python-format
msgid "Please select the option to add a new payment method."
msgstr ""
+"Bitte selektieren Sie diese Option, um eine neue Zahlungsmethode "
+"hinzuzufügen."
#. module: payment
#: model:payment.acquirer,post_msg:payment.payment_acquirer_custom
@@ -1108,7 +1110,7 @@ msgstr "Anbieter"
#. module: payment
#: selection:payment.acquirer,payment_flow:0
msgid "Redirection to the acquirer website"
-msgstr ""
+msgstr "Weiterleitung zur Website des Anbieters"
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_transaction__reference
@@ -1424,7 +1426,7 @@ msgstr ""
#: code:addons/payment/static/src/js/payment_form.js:190
#, python-format
msgid "We're unable to process your payment."
-msgstr ""
+msgstr "Es war uns nicht möglich Ihre Zahlung zu verarbeiten."
#. module: payment
#: model:payment.acquirer,name:payment.payment_acquirer_transfer
diff --git a/addons/payment/i18n/nl.po b/addons/payment/i18n/nl.po
index 409870af690..33c1bf176a7 100644
--- a/addons/payment/i18n/nl.po
+++ b/addons/payment/i18n/nl.po
@@ -77,7 +77,7 @@ msgstr "<i>Annuleer,</i> Uw betaling is geannuleerd."
msgid ""
"<i>Done,</i> Your online payment has been successfully processed. Thank you "
"for your order."
-msgstr "Gelukt,</i> Uw online betaling is geslaagd. bedankt voor uw opdracht."
+msgstr "Gelukt,</i> Uw online betaling is geslaagd. Bedankt voor uw opdracht."
#. module: payment
#: code:addons/payment/models/payment_acquirer.py:117
@@ -351,7 +351,7 @@ msgstr "Kan de betaling niet verwerken"
#: code:addons/payment/controllers/portal.py:110
#, python-format
msgid "Cannot setup the payment."
-msgstr ""
+msgstr "Kan de betaling niet opzetten."
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__capture_manually
@@ -643,7 +643,7 @@ msgid ""
"If you leave it empty, the payment acquirer will be available for all the "
"countries."
msgstr ""
-"Indien u het leeg, is de betalingsverwerker beschikbaar in alle landen."
+"Indien u dit leeg laat, is de betalingsverwerker beschikbaar in alle landen."
#. module: payment
#: model:ir.model.fields,field_description:payment.field_payment_acquirer__image
diff --git a/addons/payment/i18n/tr.po b/addons/payment/i18n/tr.po
index 2f65714d7fe..f5e03727ead 100644
--- a/addons/payment/i18n/tr.po
+++ b/addons/payment/i18n/tr.po
@@ -16,13 +16,14 @@
# Doğan Altunbay <doganaltunbay@gmail.com>, 2017
# Levent Karakaş <levent@mektup.at>, 2017
# Umur Akın <umura@projetgrup.com>, 2018
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -222,7 +223,7 @@ msgstr "Alıcılar"
#. module: payment
#: model:ir.ui.view,arch_db:payment.payment_icon_form_view
msgid "Acquirers list"
-msgstr ""
+msgstr "Alıcılar Listesi"
#. module: payment
#: model:ir.ui.view,arch_db:payment.acquirer_kanban
diff --git a/addons/payment/models/chart_template.py b/addons/payment/models/chart_template.py
index 00cc0955b73..515103316be 100644
--- a/addons/payment/models/chart_template.py
+++ b/addons/payment/models/chart_template.py
@@ -11,4 +11,4 @@ class WizardMultiChartsAccounts(models.TransientModel):
res = super(WizardMultiChartsAccounts, self)._create_bank_journals_from_o2m(company, acc_template_ref)
# Try to generate the missing journals
- return res + self.env['payment.acquirer']._create_missing_journal_for_acquirers()
+ return res + self.env['payment.acquirer']._create_missing_journal_for_acquirers(company=company)
diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py
index cf4acb215d9..3e701e981d3 100644
--- a/addons/payment/models/payment_acquirer.py
+++ b/addons/payment/models/payment_acquirer.py
@@ -73,7 +73,8 @@ class PaymentAcquirer(models.Model):
'res.company', 'Company',
default=lambda self: self.env.user.company_id.id, required=True)
view_template_id = fields.Many2one(
- 'ir.ui.view', 'Form Button Template', default=_get_default_view_template_id, required=True)
+ 'ir.ui.view', 'Form Button Template', required=True,
+ default=_get_default_view_template_id)
registration_view_template_id = fields.Many2one(
'ir.ui.view', 'S2S Form Template', domain=[('type', '=', 'qweb')],
help="Template for method registration")
@@ -244,7 +245,7 @@ class PaymentAcquirer(models.Model):
}
@api.model
- def _create_missing_journal_for_acquirers(self):
+ def _create_missing_journal_for_acquirers(self, company=None):
'''Create the journal for active acquirers.
We want one journal per acquirer. However, we can't create them during the 'create' of the payment.acquirer
because every acquirers are defined on the 'payment' module but is active only when installing their own module
@@ -259,7 +260,7 @@ class PaymentAcquirer(models.Model):
acquirer_names = [a.name.split('_')[1] for a in acquirer_modules]
# Search for acquirers having no journal
- company = self.env.user.company_id
+ company = company or self.env.user.company_id
acquirers = self.env['payment.acquirer'].search(
[('provider', 'in', acquirer_names), ('journal_id', '=', False), ('company_id', '=', company.id)])
diff --git a/addons/payment/views/payment_views.xml b/addons/payment/views/payment_views.xml
index 8d07dc84e5f..80e42d8ebd5 100644
--- a/addons/payment/views/payment_views.xml
+++ b/addons/payment/views/payment_views.xml
@@ -114,7 +114,7 @@
</div>
<field name="registration_view_template_id" groups="base.group_no_one"/>
<field name="payment_icon_ids" widget="many2many_tags"/>
- <field name="payment_flow" widget="radio"/>
+ <field name="payment_flow" widget="radio" attrs="{'invisible': [('token_implemented', '=', False)]}"/>
</group>
</page>
</notebook>
diff --git a/addons/payment_adyen/models/payment.py b/addons/payment_adyen/models/payment.py
index e67d773d81d..6ed0c938e08 100644
--- a/addons/payment_adyen/models/payment.py
+++ b/addons/payment_adyen/models/payment.py
@@ -14,6 +14,7 @@ from werkzeug import urls
from odoo import api, fields, models, tools, _
from odoo.addons.payment.models.payment_acquirer import ValidationError
from odoo.addons.payment_adyen.controllers.main import AdyenController
+from odoo.tools.pycompat import to_native
_logger = logging.getLogger(__name__)
@@ -192,7 +193,7 @@ class TxAdyen(models.Model):
shasign_check = tx.acquirer_id._adyen_generate_merchant_sig_sha256('out', data)
else:
shasign_check = tx.acquirer_id._adyen_generate_merchant_sig('out', data)
- if shasign_check != data.get('merchantSig'):
+ if to_native(shasign_check) != to_native(data.get('merchantSig')):
error_msg = _('Adyen: invalid merchantSig, received %s, computed %s') % (data.get('merchantSig'), shasign_check)
_logger.warning(error_msg)
raise ValidationError(error_msg)
diff --git a/addons/payment_authorize/i18n/de.po b/addons/payment_authorize/i18n/de.po
index 88f8a477e19..bdf930f69ff 100644
--- a/addons/payment_authorize/i18n/de.po
+++ b/addons/payment_authorize/i18n/de.po
@@ -95,13 +95,13 @@ msgstr "Zahlungstransaktion"
#: code:addons/payment_authorize/controllers/main.py:63
#, python-format
msgid "Please complete your profile. "
-msgstr ""
+msgstr "Bitte vervollständigen Sie Ihr Profil."
#. module: payment_authorize
#: code:addons/payment_authorize/controllers/main.py:58
#, python-format
msgid "Please sign in to complete your profile."
-msgstr ""
+msgstr "Bitte loggen Sie sich ein, um Ihr Profil zu vervollständigen."
#. module: payment_authorize
#: model:ir.model.fields,field_description:payment_authorize.field_payment_token__provider
diff --git a/addons/payment_ogone/i18n/tr.po b/addons/payment_ogone/i18n/tr.po
index 62d6105cf8c..0a5ed6aecde 100644
--- a/addons/payment_ogone/i18n/tr.po
+++ b/addons/payment_ogone/i18n/tr.po
@@ -8,13 +8,14 @@
# Ediz Duman <neps1192@gmail.com>, 2017
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Umur Akın <umura@projetgrup.com>, 2018
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +48,7 @@ msgstr "API Kullanıcı Şifresi"
#. module: payment_ogone
#: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_alias_usage
msgid "Alias Usage"
-msgstr ""
+msgstr "Alias ​​Kullanımı"
#. module: payment_ogone
#: model:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form
diff --git a/addons/payment_ogone/models/payment.py b/addons/payment_ogone/models/payment.py
index 56e448957c0..9e97854287c 100644
--- a/addons/payment_ogone/models/payment.py
+++ b/addons/payment_ogone/models/payment.py
@@ -353,7 +353,7 @@ class PaymentTxOgone(models.Model):
'AMOUNT': int(self.amount * 100),
'CURRENCY': self.currency_id.name,
'OPERATION': 'SAL',
- 'ECI': 2, # Recurring (from MOTO)
+ 'ECI': 9, # Recurring (from eCommerce)
'ALIAS': self.payment_token_id.acquirer_ref,
'RTIMEOUT': 30,
'PARAMPLUS' : url_encode(param_plus)
diff --git a/addons/payment_sips/models/payment.py b/addons/payment_sips/models/payment.py
index b74ff6fe718..bdcc73f3a55 100644
--- a/addons/payment_sips/models/payment.py
+++ b/addons/payment_sips/models/payment.py
@@ -4,6 +4,7 @@
import json
import logging
+import re
from hashlib import sha256
from werkzeug import urls
@@ -121,6 +122,16 @@ class TxSips(models.Model):
_sips_pending_tx_status = ['60']
_sips_cancel_tx_status = ['17']
+ @api.model
+ def _compute_reference(self, values=None, prefix=None):
+ acquirer = self.env['payment.acquirer'].browse(values['acquirer_id'])
+ if acquirer and acquirer.provider == 'sips':
+ if not prefix and values:
+ prefix = self._compute_reference_prefix(values)
+ prefix = re.sub(r'[^0-9a-zA-Z-]+', 'x', prefix)
+
+ return super(TxSips, self)._compute_reference(values=values, prefix=prefix)
+
# --------------------------------------------------
# FORM RELATED METHODS
# --------------------------------------------------
diff --git a/addons/payment_transfer/models/payment.py b/addons/payment_transfer/models/payment.py
index f6234602505..e7bc14e3f79 100644
--- a/addons/payment_transfer/models/payment.py
+++ b/addons/payment_transfer/models/payment.py
@@ -16,9 +16,9 @@ class TransferPaymentAcquirer(models.Model):
provider = fields.Selection(selection_add=[('transfer', 'Wire Transfer')], default='transfer')
@api.model
- def _create_missing_journal_for_acquirers(self):
+ def _create_missing_journal_for_acquirers(self, company=None):
# By default, the wire transfer method uses the default Bank journal.
- company = self.env.user.company_id
+ company = company or self.env.user.company_id
acquirers = self.env['payment.acquirer'].search(
[('provider', '=', 'transfer'), ('journal_id', '=', False), ('company_id', '=', company.id)])
@@ -26,7 +26,7 @@ class TransferPaymentAcquirer(models.Model):
[('type', '=', 'bank'), ('company_id', '=', company.id)], limit=1)
if bank_journal:
acquirers.write({'journal_id': bank_journal.id})
- return super(TransferPaymentAcquirer, self)._create_missing_journal_for_acquirers()
+ return super(TransferPaymentAcquirer, self)._create_missing_journal_for_acquirers(company=company)
def transfer_get_form_action_url(self):
return '/payment/transfer/feedback'
diff --git a/addons/point_of_sale/i18n/nl.po b/addons/point_of_sale/i18n/nl.po
index 31e32cc7815..85cd5756e51 100644
--- a/addons/point_of_sale/i18n/nl.po
+++ b/addons/point_of_sale/i18n/nl.po
@@ -383,7 +383,7 @@ msgstr "Voeg een aangepaste tekst doe aan de hoofding en het voeteinde"
#. module: point_of_sale
#: model:ir.actions.act_window,help:point_of_sale.action_account_journal_form
msgid "Add a new payment method"
-msgstr ""
+msgstr "Voeg een nieuwe betaling toe"
#. module: point_of_sale
#. openerp-web
@@ -1259,7 +1259,7 @@ msgid ""
" devices already benefit from a native keyboard."
msgstr ""
"Schakel deze optie niet in als u bestellingen via smartphones of tablets "
-"opneemt. Dergelijke apparaten beschikken al van een eigen toetsenbord."
+"opneemt. Dergelijke apparaten beschikken al over een eigen toetsenbord."
#. module: point_of_sale
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_order_filter
diff --git a/addons/point_of_sale/i18n/tr.po b/addons/point_of_sale/i18n/tr.po
index 555c69377cb..4b4e51b656a 100644
--- a/addons/point_of_sale/i18n/tr.po
+++ b/addons/point_of_sale/i18n/tr.po
@@ -4213,6 +4213,8 @@ msgstr "Şirketiniz için bir logo ya da bir layout ayarlamalısınız."
#, python-format
msgid "You have to set your reports's header and footer layout."
msgstr ""
+"Raporlarınız için üst bilgi ve alt bilgi satırlarını ayalamanız "
+"gerekmektedir."
#. module: point_of_sale
#: model:ir.actions.act_window,help:point_of_sale.product_product_action
diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py
index da5fe593d85..f5f20530004 100644
--- a/addons/point_of_sale/models/pos_order.py
+++ b/addons/point_of_sale/models/pos_order.py
@@ -176,7 +176,7 @@ class PosOrder(models.Model):
'comment': self.note or '',
# considering partner's sale pricelist's currency
'currency_id': self.pricelist_id.currency_id.id,
- 'user_id': self.env.uid,
+ 'user_id': self.user_id.id,
}
@api.model
diff --git a/addons/point_of_sale/models/product.py b/addons/point_of_sale/models/product.py
index 9c9af81000d..43a959bcfa4 100644
--- a/addons/point_of_sale/models/product.py
+++ b/addons/point_of_sale/models/product.py
@@ -21,6 +21,11 @@ class ProductTemplate(models.Model):
raise UserError(_('You cannot delete a product saleable in point of sale while a session is still opened.'))
return super(ProductTemplate, self).unlink()
+ @api.onchange('sale_ok')
+ def _onchange_sale_ok(self):
+ if not self.sale_ok:
+ self.available_in_pos = False
+
class UomCateg(models.Model):
_inherit = 'uom.category'
diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js
index 7c74af95cf6..63c9e1c0cb0 100644
--- a/addons/point_of_sale/static/src/js/models.js
+++ b/addons/point_of_sale/static/src/js/models.js
@@ -260,6 +260,7 @@ exports.PosModel = Backbone.Model.extend({
// we attribute a role to the user, 'cashier' or 'manager', depending
// on the group the user belongs.
var pos_users = [];
+ var current_cashier = self.get_cashier();
for (var i = 0; i < users.length; i++) {
var user = users[i];
for (var j = 0; j < user.groups_id.length; j++) {
@@ -277,6 +278,8 @@ exports.PosModel = Backbone.Model.extend({
// replace the current user with its updated version
if (user.id === self.user.id) {
self.user = user;
+ }
+ if (user.id === current_cashier.id) {
self.set_cashier(user);
}
}
@@ -630,7 +633,7 @@ exports.PosModel = Backbone.Model.extend({
// changes the current cashier
set_cashier: function(user){
this.set('cashier', user);
- this.db.set_cashier(this.cashier);
+ this.db.set_cashier(this.get('cashier'));
},
//creates a new empty order and sets it as the current order
add_new_order: function(){
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index 0b2d94dd71f..1b59aa34cba 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -1172,9 +1172,11 @@ var ClientListScreenWidget = ScreenWidget.extend({
var order = this.pos.get_order();
if( this.has_client_changed() ){
var default_fiscal_position_id = _.findWhere(this.pos.fiscal_positions, {'id': this.pos.config.default_fiscal_position_id[0]});
- if ( this.new_client && this.new_client.property_account_position_id ) {
- var client_fiscal_position_id = _.findWhere(this.pos.fiscal_positions, {'id': this.new_client.property_account_position_id[0]});
- order.fiscal_position = client_fiscal_position_id || default_fiscal_position_id;
+ if ( this.new_client ) {
+ if (this.new_client.property_account_position_id ){
+ var client_fiscal_position_id = _.findWhere(this.pos.fiscal_positions, {'id': this.new_client.property_account_position_id[0]});
+ order.fiscal_position = client_fiscal_position_id || default_fiscal_position_id;
+ }
order.set_pricelist(_.findWhere(this.pos.pricelists, {'id': this.new_client.property_product_pricelist[0]}) || this.pos.default_pricelist);
} else {
order.fiscal_position = default_fiscal_position_id;
diff --git a/addons/point_of_sale/views/product_view.xml b/addons/point_of_sale/views/product_view.xml
index 729406f4f5c..4a8b2fceab7 100644
--- a/addons/point_of_sale/views/product_view.xml
+++ b/addons/point_of_sale/views/product_view.xml
@@ -74,7 +74,7 @@
name="Product Variants"
parent="point_of_sale.pos_config_menu_catalog"
action="product_product_action"
- groups="base.group_no_one"
+ groups="product.group_product_variant"
sequence="10"/>
<menuitem id="pos_config_menu_action_product_pricelist"
parent="point_of_sale.pos_config_menu_catalog"
diff --git a/addons/point_of_sale/views/report_saledetails.xml b/addons/point_of_sale/views/report_saledetails.xml
index dea4d1a9e62..89ebc22648c 100644
--- a/addons/point_of_sale/views/report_saledetails.xml
+++ b/addons/point_of_sale/views/report_saledetails.xml
@@ -22,7 +22,8 @@
</tr></thead>
<tbody>
<tr t-foreach='products' t-as='line'>
- <td><t t-esc="line['product_name']" /></td>
+ <t t-set="internal_reference" t-value="line['code'] and '[%s] ' % line['code'] or ''" />
+ <td><t t-esc="internal_reference" /><t t-esc="line['product_name']" /></td>
<td>
<t t-esc="line['quantity']" />
<t t-if='line["uom"] != "Unit(s)"'>
diff --git a/addons/portal/i18n/tr.po b/addons/portal/i18n/tr.po
index fff747eca1c..6ea7eb0fe95 100644
--- a/addons/portal/i18n/tr.po
+++ b/addons/portal/i18n/tr.po
@@ -13,13 +13,14 @@
# Saban Yildiz <sabany@projetgrup.com>, 2017
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Umur Akın <umura@projetgrup.com>, 2018
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:11+0000\n"
"PO-Revision-Date: 2018-03-22 14:11+0000\n"
-"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -102,7 +103,7 @@ msgstr "Temizle"
#: code:addons/portal/static/src/xml/portal_signature.xml:27
#, python-format
msgid "Click here to see your document."
-msgstr ""
+msgstr "Dokümanınızı görmek için buraya tıklayınız."
#. module: portal
#: model:ir.ui.view,arch_db:portal.portal_my_details
diff --git a/addons/portal/static/src/scss/portal.scss b/addons/portal/static/src/scss/portal.scss
index ea68b013d8a..a973c7a5c1c 100644
--- a/addons/portal/static/src/scss/portal.scss
+++ b/addons/portal/static/src/scss/portal.scss
@@ -277,11 +277,72 @@ img {
}
}
- .o_portal_search_panel_fixed_width {
- overflow: hidden;
- max-width: 125px;
- text-overflow: ellipsis;
- white-space: nowrap;
+ .o_portal_navbar {
+ .navbar-brand {
+ margin: 0;
+
+ @media (min-width: $grid-float-breakpoint) {
+ padding: $navbar-padding-vertical $navbar-padding-horizontal 0 0;
+ }
+ }
+
+ // ===== Default portal navbar design =====
+ &.o_portal_navbar_default {
+ margin-bottom: 8px;
+
+ .navbar-brand {
+ padding: $navbar-padding-vertical $navbar-padding-horizontal 0 0;
+ }
+
+ .navbar-header .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+
+ .navbar-toggle {
+ margin-right: 0;
+ margin-bottom: 0;
+ background-color: $table-bg-active;
+ padding: 6px 10px $navbar-padding-vertical;
+ border: 1px solid $btn-default-border;
+ border-width: 1px 1px 0 1px;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ z-index: 1;
+
+ &.collapsed {
+ padding:6px 10px;
+ border-width: 1px;
+ border-radius: $btn-border-radius-base;
+ background-color: transparent;
+ }
+ }
+
+ @media (max-width: $grid-float-breakpoint) {
+ .navbar-collapse {
+ z-index: 0;
+ box-shadow: inset 0 0 0 1px $btn-default-border;
+ background-color: $table-bg-active;
+ border-radius: $btn-border-radius-base;
+ border-top-right-radius: 0;
+ @include o-transform(translateY(-2px));
+
+ &.in {
+ overflow: visible;
+ }
+ }
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ > .container-fluid {
+ padding: 0;
+
+ .navbar-form {
+ padding-right: 0;
+ }
+ }
+ }
+ }
}
table.table tr {
diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml
index abdfada255a..9522a1fcda4 100644
--- a/addons/portal/views/portal_templates.xml
+++ b/addons/portal/views/portal_templates.xml
@@ -66,7 +66,7 @@
<template id="portal_layout" name="Portal Layout">
<t t-call="portal.frontend_layout">
- <div class="container mt16 o_portal">
+ <div class="container mt16 mb16 o_portal">
<div class="oe_structure">
<div t-if="not no_breadcrumbs" class="row">
<div class="col-sm-12">
@@ -147,72 +147,93 @@
:param string filterby : name of the filter criteria
:param default_url : the base url of the pages (like '/my/orders')
:param boolean o_portal_search_panel : set to True to active the input search
- :param html $0 : content of the t-call, <li>a</li><li>b</li>
+ :param html $0 : content of the t-call, <li class="pull-left">Link</li>
+ :param title : bavbar title
+ :param classes : navbar classes
-->
<template id="portal_searchbar" name="Portal Search Bar">
- <t t-if='searchbar_inputs'>
- <div class='hidden-xs pull-right o_portal_search_panel'>
- <div class="input-group">
- <div class="input-group-btn">
- <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
- <span id="search_label">Search</span> <span class="caret"></span>
- </button>
- <ul class="dropdown-menu" role="menu">
- <li t-foreach='searchbar_inputs' t-as='input' t-att-class="search_in == searchbar_inputs[input]['input'] and 'active'">
- <a t-att-href="'#' + searchbar_inputs[input]['input']"><span t-raw="searchbar_inputs[input]['label']"/></a>
- </li>
- </ul>
+ <nav t-attf-class="navbar o_portal_navbar {{classes if classes else 'o_portal_navbar_default'}}">
+ <div class="container-fluid">
+ <!-- Navbar title only -->
+ <div class="navbar-header pull-left">
+ <t t-set="no_title">No title</t>
+ <h3 class="navbar-brand"><t t-esc="title or no_title"/></h3>
+ </div>
+
+ <!-- Non-collapsing menu item(s) -->
+ <div class="navbar-header navbar-right pull-right">
+ <ul class="nav pull-left">
+ <t t-raw="0"/>
+ <li t-if="searchbar_sortings" class="dropdown pull-left ml16">
+ <button id="portal_searchbar_sortby" data-toggle="dropdown" class="btn btn-default navbar-btn">
+ <span class="fa fa-sort"/>
+ <span class="hidden-xs hidden-sm"><t t-esc="searchbar_sortings[sortby].get('label', 'Newest')"/></span>
+ <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu" aria-labelledby="portal_searchbar_sortby">
+ <li t-foreach="searchbar_sortings" t-as="option" t-attf-class="#{sortby == option and 'active'}">
+ <a t-att-href="request.httprequest.path + '?' + keep_query('*', sortby=option)">
+ <span t-esc="searchbar_sortings[option].get('label')"/>
+ </a>
+ </li>
+ </ul>
+ </li>
+ <li t-if="searchbar_filters" class="dropdown pull-left ml4">
+ <button id="portal_searchbar_filters" data-toggle="dropdown" class="btn btn-default navbar-btn">
+ <span class="fa fa-filter"/>
+ <span class="hidden-xs hidden-sm"><t t-esc="searchbar_filters[filterby].get('label', 'All')"/></span>
+ <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu" aria-labelledby="portal_searchbar_filters">
+ <li t-foreach="searchbar_filters" t-as="option" t-att-class="filterby == option and 'active'">
+ <a t-att-href="default_url + '?' + keep_query('*', filterby=option)">
+ <span t-esc="searchbar_filters[option].get('label')"/>
+ </a>
+ </li>
+ </ul>
+ </li>
+ <li t-if="searchbar_groupby" class="dropdown pull-left ml4">
+ <button id="portal_searchbar_groupby" data-toggle="dropdown" class="btn btn-default navbar-btn">
+ <span class="fa fa-object-group"/>
+ <span class="hidden-xs hidden-sm"><t t-esc="searchbar_groupby[groupby].get('label', 'None')"/></span>
+ <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu" aria-labelledby="portal_searchbar_groupby">
+ <li t-foreach="searchbar_groupby" t-as="option" t-att-class="groupby == option and 'active'">
+ <a t-att-href="default_url + '?' + keep_query('*', groupby=option)">
+ <span t-esc="searchbar_groupby[option].get('label')"/>
+ </a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <button t-if='searchbar_inputs' type="button" class="navbar-toggle collapsed btn ml16" data-toggle="collapse" data-target="#o_portal_searchbar_collapse"><span class="fa fa-search"/></button>
+ </div>
+ <div t-if='searchbar_inputs' class="visible-xs-block clearfix"/>
+
+ <!-- Collapsing content (searchbar_inputs) -->
+ <div t-if='searchbar_inputs' class="collapse navbar-collapse text-right" id="o_portal_searchbar_collapse">
+ <div class="navbar-form o_portal_search_panel">
+ <div class="input-group">
+ <div class="input-group-btn">
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+ <span id="search_label" class="hidden-xs mr4">Search</span><span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li t-foreach='searchbar_inputs' t-as='input' t-att-class="search_in == searchbar_inputs[input]['input'] and 'active'">
+ <a t-att-href="'#' + searchbar_inputs[input]['input']"><span t-raw="searchbar_inputs[input]['label']"/></a>
+ </li>
+ </ul>
+ </div>
+ <input type="text" class="form-control" t-att-value='search' name="search"/>
+ <span class="input-group-btn">
+ <button class="btn btn-default search-submit" type="button"><span class="fa fa-search hidden-xs"/><span class="fa fa-arrow-right visible-xs-inline-block"/></button>
+ </span>
+ </div>
</div>
- <input type="text" class="form-control o_portal_search_panel_fixed_width" t-att-value='search' name="search"/>
- <span class="input-group-btn">
- <button class="btn btn-default search-submit" type="button"><span class="fa fa-search"></span></button>
- </span>
</div>
- </div>
- </t>
- <div t-if="searchbar_sortings" class="dropdown pull-right mr4">
- <button id="portal_searchbar_sortby" class="o_portal_search_panel_fixed_width btn btn-default" type="button" data-toggle="dropdown">
- <span class="fa fa-sort fa-lg" />
- <span class='hidden-xs hidden-sm hidden-md' t-esc="searchbar_sortings[sortby].get('label', 'Newest')"/>
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu" aria-labelledby="portal_searchbar_sortby">
- <li t-foreach="searchbar_sortings" t-as="option" t-attf-class="#{sortby == option and 'active'}">
- <a t-att-href="request.httprequest.path + '?' + keep_query('*', sortby=option)">
- <span t-esc="searchbar_sortings[option].get('label')"/>
- </a>
- </li>
- </ul>
- </div>
- <div t-if="searchbar_filters" class="dropdown pull-right mr4">
- <button id="portal_searchbar_filters" class="o_portal_search_panel_fixed_width btn btn-default" type="button" data-toggle="dropdown">
- <span class="fa fa-filter fa-lg" />
- <span class='hidden-xs hidden-sm hidden-md' t-esc="searchbar_filters[filterby].get('label', 'All')"/>
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu" aria-labelledby="portal_searchbar_filters">
- <li t-foreach="searchbar_filters" t-as="option" t-att-class="filterby == option and 'active'">
- <a t-att-href="default_url + '?' + keep_query('*', filterby=option)">
- <span t-esc="searchbar_filters[option].get('label')"/>
- </a>
- </li>
- </ul>
- </div>
- <div t-if="searchbar_groupby" class="dropdown pull-right mr4">
- <button id="portal_searchbar_groupby" class="o_portal_search_panel_fixed_width btn btn-default" type="button" data-toggle="dropdown">
- <span class="fa fa-bars fa-lg" />
- <span class='hidden-xs hidden-sm hidden-md' t-esc="searchbar_groupby[groupby].get('label', 'None')"/>
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu" aria-labelledby="portal_searchbar_groupby">
- <li t-foreach="searchbar_groupby" t-as="option" t-att-class="groupby == option and 'active'">
- <a t-att-href="default_url + '?' + keep_query('*', groupby=option)">
- <span t-esc="searchbar_groupby[option].get('label')"/>
- </a>
- </li>
- </ul>
- </div>
-
+ </div> <!-- /.container-fluid -->
+ </nav>
</template>
<template id="portal_contact" name="Contact">
diff --git a/addons/pos_cache/i18n/de.po b/addons/pos_cache/i18n/de.po
index 9bacc83c478..6621dae9a8f 100644
--- a/addons/pos_cache/i18n/de.po
+++ b/addons/pos_cache/i18n/de.po
@@ -14,10 +14,10 @@
# e2f <projects@e2f.com>, 2018
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.1\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-12-13 14:37+0000\n"
-"PO-Revision-Date: 2017-12-13 14:37+0000\n"
+"POT-Creation-Date: 2018-03-22 14:10+0000\n"
+"PO-Revision-Date: 2018-03-22 14:10+0000\n"
"Last-Translator: e2f <projects@e2f.com>, 2018\n"
"Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n"
"MIME-Version: 1.0\n"
@@ -27,58 +27,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_config_cache_ids
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__cache
+#: model:ir.model.fields,field_description:pos_cache.field_pos_config__cache_ids
msgid "Cache"
msgstr "Cache"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_compute_user_id
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__compute_user_id
msgid "Cache compute user"
msgstr "Benutzer im Cache-Speicher halten"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_config_id
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__config_id
msgid "Config"
msgstr ""
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_create_uid
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_create_date
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_display_name
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_id
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__id
msgid "ID"
msgstr "ID"
#. module: pos_cache
#: model:ir.ui.view,arch_db:pos_cache.pos_config_view_form_inherit_pos_cache
msgid "Invalidate cache"
-msgstr ""
+msgstr "Cache zurücksetzen"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache___last_update
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache____last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_write_uid
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert durch"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_write_date
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
@@ -90,7 +90,7 @@ msgid "Loading"
msgstr "Ladevorgang"
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_config_oldest_cache_time
+#: model:ir.model.fields,field_description:pos_cache.field_pos_config__oldest_cache_time
msgid "Oldest cache time"
msgstr "Älteste Cachezeit"
@@ -102,12 +102,12 @@ msgid "PoS: refresh cache"
msgstr ""
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_product_domain
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__product_domain
msgid "Product Domain"
msgstr ""
#. module: pos_cache
-#: model:ir.model.fields,field_description:pos_cache.field_pos_cache_product_fields
+#: model:ir.model.fields,field_description:pos_cache.field_pos_cache__product_fields
msgid "Product Fields"
msgstr ""
diff --git a/addons/pos_mercury/i18n/nl.po b/addons/pos_mercury/i18n/nl.po
index 6bd7f608e51..ade5d5a3a94 100644
--- a/addons/pos_mercury/i18n/nl.po
+++ b/addons/pos_mercury/i18n/nl.po
@@ -363,7 +363,7 @@ msgstr "Kassa orders"
#: code:addons/pos_mercury/static/src/js/pos_mercury.js:345
#, python-format
msgid "Refunds not supported"
-msgstr ""
+msgstr "Terugbetalingen niet ondersteund"
#. module: pos_mercury
#. openerp-web
diff --git a/addons/pos_mercury/static/src/js/pos_mercury.js b/addons/pos_mercury/static/src/js/pos_mercury.js
index e403b9bcf12..7f896e5661f 100644
--- a/addons/pos_mercury/static/src/js/pos_mercury.js
+++ b/addons/pos_mercury/static/src/js/pos_mercury.js
@@ -449,6 +449,7 @@ PaymentScreenWidget.include({
order.selected_paymentline.paid = true;
order.selected_paymentline.mercury_swipe_pending = false;
order.selected_paymentline.mercury_amount = response.authorize;
+ order.selected_paymentline.set_amount(response.authorize);
order.selected_paymentline.mercury_card_number = decodedMagtek['number'];
order.selected_paymentline.mercury_card_brand = response.card_type;
order.selected_paymentline.mercury_card_owner_name = decodedMagtek['name'];
diff --git a/addons/pos_restaurant/i18n/nl.po b/addons/pos_restaurant/i18n/nl.po
index b77943a4977..38755445085 100644
--- a/addons/pos_restaurant/i18n/nl.po
+++ b/addons/pos_restaurant/i18n/nl.po
@@ -381,7 +381,7 @@ msgstr "Order"
#. module: pos_restaurant
#: model:ir.model.fields,field_description:pos_restaurant.field_pos_config__is_order_printer
msgid "Order Printer"
-msgstr ""
+msgstr "Order Printer"
#. module: pos_restaurant
#: model:ir.actions.act_window,name:pos_restaurant.action_restaurant_printer_form
diff --git a/addons/pos_sale/i18n/tr.po b/addons/pos_sale/i18n/tr.po
index 053faa7efc2..f78f8804d8b 100644
--- a/addons/pos_sale/i18n/tr.po
+++ b/addons/pos_sale/i18n/tr.po
@@ -6,13 +6,14 @@
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Martin Trigaux, 2017
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:09+0000\n"
"PO-Revision-Date: 2018-03-22 14:09+0000\n"
-"Last-Translator: Martin Trigaux, 2017\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,7 +24,7 @@ msgstr ""
#. module: pos_sale
#: model:ir.model,name:pos_sale.model_report_all_channels_sales
msgid "All sales orders grouped by sales channels"
-msgstr ""
+msgstr "Tüm satış siparişleri satış kanalları tarafından gruplandırıldı"
#. module: pos_sale
#: code:addons/pos_sale/models/crm_team.py:103
diff --git a/addons/product/i18n/tr.po b/addons/product/i18n/tr.po
index b0d08e45a04..8135c6aed69 100644
--- a/addons/product/i18n/tr.po
+++ b/addons/product/i18n/tr.po
@@ -1900,6 +1900,8 @@ msgid ""
"This vendor's product code will be used when printing a request for "
"quotation. Keep empty to use the internal one."
msgstr ""
+"Bu tedarikçi ürün kodu bir teklif ihtiyacı için yazdırılırken "
+"kullanılacaktır. İçini kullanmak için boş tutunuz."
#. module: product
#: model:ir.model.fields,help:product.field_product_supplierinfo__product_name
@@ -1907,6 +1909,8 @@ msgid ""
"This vendor's product name will be used when printing a request for "
"quotation. Keep empty to use the internal one."
msgstr ""
+"Bu tedarikçi ürün adı, bir teklif ihtiyacı için yazdırılırken "
+"kullanılacaktır. İçini kullanmak için boş tutunuz."
#. module: product
#: model:ir.ui.view,arch_db:product.product_template_search_view
@@ -2019,7 +2023,7 @@ msgstr "Varyant Fiyatları"
#: model:ir.model.fields,field_description:product.field_product_product__variant_seller_ids
#: model:ir.model.fields,field_description:product.field_product_template__variant_seller_ids
msgid "Variant Seller"
-msgstr ""
+msgstr "Satıcı Varyantı"
#. module: product
#: model:ir.actions.act_window,name:product.product_attribute_value_action
@@ -2154,6 +2158,8 @@ msgstr "Şirketiniz için bir logo ya da bir layout ayarlamalısınız."
#, python-format
msgid "You have to set your reports's header and footer layout."
msgstr ""
+"Raporlarınız için üst bilgi ve alt bilgi satırlarını ayalamanız "
+"gerekmektedir."
#. module: product
#: model:ir.actions.act_window,help:product.product_uom_form_action
@@ -2161,6 +2167,8 @@ msgid ""
"You must define a conversion rate between several Units of\n"
" Measure within the same category."
msgstr ""
+"Aynı kategori dahilinde bazı Ölçü Birimleri arasında değişim oranı "
+"tanımlanmalı."
#. module: product
#: model:ir.actions.act_window,help:product.product_normal_action
@@ -2187,6 +2195,8 @@ msgid ""
"You must define at least one product category in order to be able to create "
"products."
msgstr ""
+"Ürünleri oluşturabilmek için en az bir ürün kategorisi tanımlamanız "
+"gerekmektedir."
#. module: product
#: model:product.uom,name:product.product_uom_cm
@@ -2206,7 +2216,7 @@ msgstr "decimal.precision"
#. module: product
#: model:ir.ui.view,arch_db:product.product_category_form_view
msgid "e.g. Lamps"
-msgstr ""
+msgstr "Örn. Aydınlatma"
#. module: product
#: model:ir.ui.view,arch_db:product.product_variant_easy_edit_view
@@ -2216,7 +2226,7 @@ msgstr ""
#. module: product
#: model:ir.ui.view,arch_db:product.product_pricelist_view
msgid "e.g. USD Retailers"
-msgstr ""
+msgstr "Örn. Dolar Perakendeceliği"
#. module: product
#: model:ir.ui.view,arch_db:product.product_uom_form_view
diff --git a/addons/product/models/product.py b/addons/product/models/product.py
index 2a76aaa695c..5470ba084c5 100644
--- a/addons/product/models/product.py
+++ b/addons/product/models/product.py
@@ -228,9 +228,9 @@ class ProductProduct(models.Model):
for supplier_info in self.seller_ids:
if supplier_info.name.id == self._context.get('partner_id'):
product_name = supplier_info.product_name or self.default_code
+ self.partner_ref = '%s%s' % (self.code and '[%s] ' % self.code or '', product_name)
else:
- product_name = self.name
- self.partner_ref = '%s%s' % (self.code and '[%s] ' % self.code or '', product_name)
+ self.partner_ref = self.name_get()[0][1]
@api.one
@api.depends('image_variant', 'product_tmpl_id.image')
@@ -431,7 +431,12 @@ class ProductProduct(models.Model):
product2_ids = self._search(args + [('name', operator, name), ('id', 'not in', product_ids)], limit=limit2, access_rights_uid=name_get_uid)
product_ids.extend(product2_ids)
elif not product_ids and operator in expression.NEGATIVE_TERM_OPERATORS:
- product_ids = self._search(args + ['&', ('default_code', operator, name), ('name', operator, name)], limit=limit, access_rights_uid=name_get_uid)
+ domain = expression.OR([
+ ['&', ('default_code', operator, name), ('name', operator, name)],
+ ['&', ('default_code', '=', False), ('name', operator, name)],
+ ])
+ domain = expression.AND([args, domain])
+ product_ids = self._search(domain, limit=limit, access_rights_uid=name_get_uid)
if not product_ids and operator in positive_operators:
ptrn = re.compile('(\[(.*?)\])')
res = ptrn.search(name)
diff --git a/addons/product/tests/test_variants.py b/addons/product/tests/test_variants.py
index 7917a0d4a2b..804bbc55c95 100644
--- a/addons/product/tests/test_variants.py
+++ b/addons/product/tests/test_variants.py
@@ -40,6 +40,15 @@ class TestVariantsSearch(TransactionCase):
self.assertIn(self.product_shirt_template, search_value,
'Shirt should be found searching L')
+ def test_name_search(self):
+ self.product_slip_template = self.env['product.template'].create({
+ 'name': 'Slip',
+ })
+ res = self.env['product.product'].name_search('Shirt', [], 'not ilike', None)
+ res_ids = [r[0] for r in res]
+ self.assertIn(self.product_slip_template.product_variant_ids.id, res_ids,
+ 'Slip should be found searching \'not ilike\'')
+
class TestVariants(common.TestProductCommon):
diff --git a/addons/product_expiry/i18n/tr.po b/addons/product_expiry/i18n/tr.po
index 750c0e21302..450843980a7 100644
--- a/addons/product_expiry/i18n/tr.po
+++ b/addons/product_expiry/i18n/tr.po
@@ -6,13 +6,14 @@
# Martin Trigaux, 2017
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Fırat Kaya <firat.kaya@mechsoft.com.tr>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Fırat Kaya <firat.kaya@mechsoft.com.tr>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -56,6 +57,8 @@ msgid ""
"Date to determine the expired lots and serial numbers using the filter "
"\"Expiration Alerts\"."
msgstr ""
+"Günü geçmiş lotları ve seri numaralarını, \"Son Kullanma Uyarıları\" "
+"filtresini kullanarak belirleme tarihi."
#. module: product_expiry
#: model:ir.ui.view,arch_db:product_expiry.view_move_form_expiry
@@ -85,6 +88,7 @@ msgstr "Lot/Seri"
msgid ""
"Number of days before an alert should be raised on the lot/serial number."
msgstr ""
+"Bir uyarıdan önceki günlerin sayısı lot/seri numaralarında yükseltilmeli."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__life_time
@@ -93,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 ""
+"Mallar tehlikeli hale gelmeden ve tüketilmek zorunda olmadan önceki günlerin"
+" sayısı. Bu sayı lot/seri numaralarından hesaplanacaktır."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_product_product__removal_time
@@ -119,7 +125,7 @@ msgstr "Ürün Uyarı Zamanı"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__product_expiry_alert
msgid "Product Expiry Alert"
-msgstr ""
+msgstr "Ürün Son Kullanım Uyarısı"
#. module: product_expiry
#: model:ir.model.fields,field_description:product_expiry.field_product_product__life_time
@@ -158,7 +164,7 @@ msgstr "Kaldırma Tarihi"
#. 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 "Uyarı Tarihine ulaşıldı."
#. module: product_expiry
#: model:ir.model.fields,help:product_expiry.field_stock_production_lot__life_date
diff --git a/addons/project/i18n/nl.po b/addons/project/i18n/nl.po
index 926376cb8d2..8b4fbdc2818 100644
--- a/addons/project/i18n/nl.po
+++ b/addons/project/i18n/nl.po
@@ -509,7 +509,7 @@ msgstr "Geavanceerd"
#: code:addons/project/static/src/js/project_task_kanban_examples.js:34
#, python-format
msgid "Agile"
-msgstr ""
+msgstr "Agile"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__alias_id
diff --git a/addons/project/i18n/project.pot b/addons/project/i18n/project.pot
index 5ed93bba242..ae8e38c46ce 100644
--- a/addons/project/i18n/project.pot
+++ b/addons/project/i18n/project.pot
@@ -1021,6 +1021,12 @@ msgid "Ending Date"
msgstr ""
#. module: project
+#: code:addons/project/models/project.py:556
+#, python-format
+msgid "Error! You cannot create recursive hierarchy of task(s)."
+msgstr ""
+
+#. module: project
#: sql_constraint:project.project:0
msgid "Error! project start-date must be lower than project end-date."
msgstr ""
diff --git a/addons/project/i18n/tr.po b/addons/project/i18n/tr.po
index 72e797d434a..4e4795b6648 100644
--- a/addons/project/i18n/tr.po
+++ b/addons/project/i18n/tr.po
@@ -218,12 +218,12 @@ msgstr "Görev #"
#. module: project
#: model:ir.model.fields,field_description:project.field_report_project_task_user__working_days_open
msgid "# Working Days to Assign"
-msgstr ""
+msgstr "# Atanacak İş Günleri"
#. module: project
#: model:ir.model.fields,field_description:project.field_report_project_task_user__working_days_close
msgid "# Working Days to Close"
-msgstr ""
+msgstr "# Yaklaşan İş Günleri"
#. module: project
#: model:ir.model.fields,field_description:project.field_report_project_task_user__nbr
@@ -501,7 +501,7 @@ msgstr "Arşiv"
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_form2
msgid "Assign to Me"
-msgstr ""
+msgstr "Bana Ata"
#. module: project
#: model:ir.model.fields,field_description:project.field_report_project_task_user__date_start
@@ -554,7 +554,7 @@ msgstr "Ek"
#. module: project
#: model:ir.model.fields,help:project.field_project_task__attachment_ids
msgid "Attachment that don't come from message."
-msgstr ""
+msgstr "Mesajdan gelmeyen ek."
#. module: project
#: code:addons/project/models/project.py:119
@@ -767,7 +767,7 @@ msgstr ""
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__displayed_image_id
msgid "Cover Image"
-msgstr ""
+msgstr "Kapak Resmi"
#. module: project
#: model:ir.ui.view,arch_db:project.project_project_view_form_simplified
@@ -803,7 +803,7 @@ msgstr ""
#. module: project
#: model:ir.actions.act_window,help:project.action_view_task
msgid "Create a new task"
-msgstr ""
+msgstr "Yeni görev oluştur"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__create_uid
@@ -1110,6 +1110,8 @@ msgid ""
"Explanation text to help users using the star on tasks or issues in this "
"stage."
msgstr ""
+"Açıklama metni, bu aşamadaki görev ya da olaylardaki yıldızı kullanan "
+"kullanıcılara yardım eder."
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_project_user_search
@@ -1210,17 +1212,17 @@ msgstr "Yeşil"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task_type__legend_done
msgid "Green Kanban Label"
-msgstr ""
+msgstr "Yeşil Kanban Etiketi"
#. module: project
#: selection:project.task,kanban_state:0
msgid "Grey"
-msgstr ""
+msgstr "Gri"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task_type__legend_normal
msgid "Grey Kanban Label"
-msgstr ""
+msgstr "Gri Kanban Etiketi"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__group_id
@@ -1589,7 +1591,7 @@ msgstr "Favorilerim"
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_search_form
msgid "My Followed Tasks"
-msgstr ""
+msgstr "Takip Ettiğim Görevler"
#. module: project
#: model:ir.actions.act_window,name:project.project_task_action_activity
@@ -1612,7 +1614,7 @@ msgstr "Adı"
#. module: project
#: model:ir.ui.view,arch_db:project.edit_project
msgid "Name of the tasks :"
-msgstr ""
+msgstr "Görevlerin adı:"
#. module: project
#. openerp-web
@@ -1954,7 +1956,7 @@ msgstr "Proje görevleri"
#. module: project
#: model:ir.actions.server,name:project.ir_actions_server_project_sample
msgid "Project: Activate Sample Project"
-msgstr ""
+msgstr "Proje: Örnek Projeyi Etkinleştir"
#. module: project
#: model:ir.actions.server,name:project.ir_cron_rating_project_ir_actions_server
@@ -2065,7 +2067,7 @@ msgstr "Konu Kayıt ID"
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_kanban
msgid "Record's Colour"
-msgstr ""
+msgstr "Kayıt Rengi"
#. module: project
#: selection:project.task,kanban_state:0
@@ -2075,7 +2077,7 @@ msgstr "Kırmızı"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task_type__legend_blocked
msgid "Red Kanban Label"
-msgstr ""
+msgstr "Kırmızı Kanban Etiketi"
#. module: project
#: model:ir.ui.view,arch_db:project.portal_my_tasks
@@ -2183,7 +2185,7 @@ msgstr "Mesajlarda Ara"
#: code:addons/project/controllers/portal.py:95
#, python-format
msgid "Search in Stages"
-msgstr ""
+msgstr "Aşamalarda Ara"
#. module: project
#. openerp-web
@@ -2250,7 +2252,7 @@ msgstr ""
#. module: project
#: model:ir.ui.view,arch_db:project.res_config_settings_view_form
msgid "Split your tasks to organize your work into sub-milestones"
-msgstr ""
+msgstr "Görevinizi ayırarak alt-görevler halinde işinizi organize edin."
#. module: project
#: code:addons/project/controllers/portal.py:85
@@ -2297,7 +2299,7 @@ msgstr "Yıldızlı"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task_type__legend_priority
msgid "Starred Explanation"
-msgstr ""
+msgstr "Yıldızlı Açıklama"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_project__date_start
@@ -2646,7 +2648,7 @@ msgstr "Görev Zaman Tahmini"
#. module: project
#: model:ir.ui.view,arch_db:project.res_config_settings_view_form
msgid "Time Management"
-msgstr ""
+msgstr "Zaman Yönetimi"
#. module: project
#: model:ir.ui.view,arch_db:project.edit_project
@@ -2710,7 +2712,7 @@ msgstr "Görevlerdeki müşteri memnuniyetini takip edin"
#. module: project
#: model:ir.ui.view,arch_db:project.res_config_settings_view_form
msgid "Track time spent on projects and tasks"
-msgstr ""
+msgstr "Projelerde ve görevlerde harcanan zamanı izleyin."
#. module: project
#: selection:project.project,rating_status_period:0
@@ -2755,7 +2757,7 @@ msgstr "Görevleri şu şekilde kullanın:"
#. module: project
#: model:ir.ui.view,arch_db:project.res_config_settings_view_form
msgid "Use collaborative rich text pads on tasks"
-msgstr ""
+msgstr "Görevlerde işbirlikçi zengin metin pedleri kullanın"
#. module: project
#. openerp-web
@@ -2845,32 +2847,32 @@ msgstr "Çalışma Süresi"
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_form2
msgid "Working Time to Assign"
-msgstr ""
+msgstr "Atanan Çalışma Süresi"
#. module: project
#: model:ir.ui.view,arch_db:project.view_task_form2
msgid "Working Time to Close"
-msgstr ""
+msgstr "Kapatmak İçin Çalışma Süresi"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__working_days_open
msgid "Working days to assign"
-msgstr ""
+msgstr "Atanan Çalışma Günleri"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__working_days_close
msgid "Working days to close"
-msgstr ""
+msgstr "Kapatmak için çalışma günleri"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__working_hours_open
msgid "Working hours to assign"
-msgstr ""
+msgstr "Atanan Çalışma Saatleri"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__working_hours_close
msgid "Working hours to close"
-msgstr ""
+msgstr "Kapatmak için çalışma saatleri"
#. module: project
#: model:ir.filters,name:project.filter_task_report_workload
@@ -2880,7 +2882,7 @@ msgstr "İş Yükü"
#. module: project
#: model:ir.model.fields,field_description:project.field_project_task__write_date
msgid "Write Date"
-msgstr ""
+msgstr "Yazma Tarihi"
#. module: project
#. openerp-web
diff --git a/addons/project/models/project.py b/addons/project/models/project.py
index 126649bb87c..cf2c6a941d4 100644
--- a/addons/project/models/project.py
+++ b/addons/project/models/project.py
@@ -218,6 +218,9 @@ class Project(models.Model):
doc_count = fields.Integer(compute='_compute_attached_docs_count', string="Number of documents attached")
date_start = fields.Date(string='Start Date')
date = fields.Date(string='Expiration Date', index=True, track_visibility='onchange')
+ subtask_project_id = fields.Many2one('project.project', string='Sub-task Project', ondelete="restrict",
+ help="Choosing a sub-tasks project will both enable sub-tasks and set their default project (possibly the project itself)")
+
# rating fields
percentage_satisfaction_task = fields.Integer(
compute='_compute_percentage_satisfaction_task', string="Happy % on Task", store=True, default=-1)
@@ -295,6 +298,8 @@ class Project(models.Model):
# Prevent double project creation
self = self.with_context(mail_create_nosubscribe=True)
project = super(Project, self).create(vals)
+ if not vals.get('subtask_project_id'):
+ project.subtask_project_id = project.id
if project.privacy_visibility == 'portal' and project.partner_id:
project.message_subscribe(project.partner_id.ids)
return project
@@ -508,6 +513,7 @@ class Task(models.Model):
legend_normal = fields.Char(related='stage_id.legend_normal', string='Kanban Ongoing Explanation', readonly=True, related_sudo=False)
parent_id = fields.Many2one('project.task', string='Parent Task', index=True)
child_ids = fields.One2many('project.task', 'parent_id', string="Sub-tasks", context={'active_test': False})
+ subtask_project_id = fields.Many2one('project.project', related="project_id.subtask_project_id", string='Sub-task Project', readonly=True)
subtask_count = fields.Integer("Sub-task count", compute='_compute_subtask_count')
email_from = fields.Char(string='Email', help="These people will receive email.", index=True)
email_cc = fields.Char(string='Watchers Emails', help="""These email addresses will be added to the CC field of all inbound
@@ -620,6 +626,12 @@ class Task(models.Model):
default['name'] = _("%s (copy)") % self.name
return super(Task, self).copy(default)
+ @api.constrains('parent_id')
+ def _check_parent_id(self):
+ for task in self:
+ if not task._check_recursion():
+ raise ValidationError(_('Error! You cannot create recursive hierarchy of task(s).'))
+
# Override view according to the company definition
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
@@ -969,6 +981,20 @@ class Task(models.Model):
'type': 'ir.actions.act_window'
}
+ def action_subtask(self):
+ action = self.env.ref('project.project_task_action_sub_task').read()[0]
+ ctx = self.env.context.copy()
+ ctx.update({
+ 'default_parent_id': self.id,
+ 'default_project_id': self.env.context.get('project_id', self.project_id.id),
+ 'default_name': self.env.context.get('name', self.name) + ':',
+ 'default_partner_id': self.env.context.get('partner_id', self.partner_id.id),
+ 'search_default_project_id': self.env.context.get('project_id', self.project_id.id),
+ })
+ action['context'] = ctx
+ action['domain'] = [('id', 'child_of', self.id), ('id', '!=', self.id)]
+ return action
+
# ---------------------------------------------------
# Rating business
# ---------------------------------------------------
diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml
index c9b54dda06f..02f4435e21f 100644
--- a/addons/project/views/project_portal_templates.xml
+++ b/addons/project/views/project_portal_templates.xml
@@ -34,9 +34,9 @@
<template id="portal_my_projects" name="My Projects">
<t t-call="portal.portal_layout">
- <h3>Projects
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Projects</t>
+ </t>
<t t-if="not projects">
<div class="alert alert-warning mt8" role="alert">
There are no projects.
@@ -117,9 +117,9 @@
<template id="portal_my_tasks" name="My Tasks">
<t t-call="portal.portal_layout">
- <h3>Tasks
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Tasks</t>
+ </t>
<t t-if="not grouped_tasks">
<div class="alert alert-warning mt8" role="alert">
There are no tasks.
@@ -132,7 +132,7 @@
<thead>
<tr class="active">
<th t-if="groupby == 'none'" class="col-md-9">Name</th>
- <th t-else="" class="col-md-9"><span t-field="tasks[0].project_id.label_tasks"/> for project: <span t-field="tasks[0].project_id.name"/></th>
+ <th t-else="" class="col-md-9"><span t-field="tasks[0].sudo().project_id.label_tasks"/> for project: <span t-field="tasks[0].sudo().project_id.name"/></th>
<th class="col-md-2">Stage</th>
<th>Ref</th>
</tr>
diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml
index f90a8d1e99c..42d314cba23 100644
--- a/addons/project/views/project_views.xml
+++ b/addons/project/views/project_views.xml
@@ -84,14 +84,6 @@
<field name="name">Sub-tasks</field>
<field name="res_model">project.task</field>
<field name="view_mode">kanban,tree,form,calendar,pivot,graph</field>
- <field name="domain">[('id', 'child_of', active_id), ('id', '!=', active_id)]</field>
- <field name="context">
- {
- 'default_parent_id' : active_id,
- 'default_project_id' : project_id,
- 'default_name' : name + ': ',
- }
- </field>
<field name="search_view_id" ref="project.view_task_search_form"/>
</record>
@@ -154,6 +146,7 @@
</div>
<field name="rating_status_period" class="oe_inline" attrs="{'required': [('rating_status','=','periodic')], 'invisible': [('rating_status','!=','periodic')]}" groups="project.group_project_rating"/>
<field name="portal_show_rating" attrs="{'invisible': [('rating_status','==','no')]}" groups="project.group_project_rating"/>
+ <field name="subtask_project_id" groups="project.group_subtask_project"/>
</group>
<group name="misc">
<group string="Configuration" groups="base.group_no_one" name="configuration">
@@ -426,9 +419,9 @@
<sheet string="Task">
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" icon="fa-tasks" type="object" name="action_open_parent_task" string="Parent Task" attrs="{'invisible' : [('parent_id', '=', False)]}" groups="project.group_subtask_project"/>
- <button id="subtask_stat_button" name="%(project_task_action_sub_task)d" type="action" class="oe_stat_button" icon="fa-tasks"
+ <button name="action_subtask" type="object" class="oe_stat_button" icon="fa-tasks"
attrs="{'invisible' : [('parent_id', '!=', False)]}"
- context="{'project_id': project_id, 'name': name, 'parent_id': id}" groups="project.group_subtask_project">
+ context="{'project_id': subtask_project_id, 'name': name, 'partner_id': partner_id}" groups="project.group_subtask_project">
<field string="Sub-tasks" name="subtask_count" widget="statinfo"/>
</button>
<button name="%(rating_rating_action_task)d" type="action" attrs="{'invisible': [('rating_count', '=', 0)]}" class="oe_stat_button" icon="fa-smile-o" groups="project.group_project_rating">
@@ -476,6 +469,7 @@
<field name="email_cc" groups="base.group_no_one"/>
<field name="parent_id" attrs="{'invisible' : [('subtask_count', '>', 0)]}" groups="project.group_subtask_project"/>
<field name="child_ids" invisible="1" />
+ <field name="subtask_project_id" invisible="1" />
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="displayed_image_id" groups="base.group_no_one"/>
</group>
diff --git a/addons/project_timesheet_holidays/i18n/tr.po b/addons/project_timesheet_holidays/i18n/tr.po
index f1b0d00972f..3b662680603 100644
--- a/addons/project_timesheet_holidays/i18n/tr.po
+++ b/addons/project_timesheet_holidays/i18n/tr.po
@@ -5,15 +5,16 @@
# Translators:
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Ediz Duman <neps1192@gmail.com>, 2017
-# Martin Trigaux <mat@odoo.com>, 2017
+# Martin Trigaux, 2017
# Levent Karakaş <levent@mektup.at>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 10.saas~18\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-09-20 09:53+0000\n"
-"PO-Revision-Date: 2017-09-20 09:53+0000\n"
-"Last-Translator: Levent Karakaş <levent@mektup.at>, 2017\n"
+"POT-Creation-Date: 2018-03-22 14:10+0000\n"
+"PO-Revision-Date: 2018-03-22 14:10+0000\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +28,7 @@ msgid "Analytic Line"
msgstr "Analitik Satırı"
#. module: project_timesheet_holidays
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_holidays_timesheet_ids
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave__timesheet_ids
msgid "Analytic Lines"
msgstr "Analitik Satırları"
@@ -37,63 +38,67 @@ msgid "Companies"
msgstr "Şirketler"
#. module: project_timesheet_holidays
-#: 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
+#: 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 ""
+"Ayrılma türünden oluşturulan zaman çizelgesi için varsayılan proje değeri."
#. module: project_timesheet_holidays
-#: code:addons/project_timesheet_holidays/models/hr_holidays.py:30
+#: code:addons/project_timesheet_holidays/models/hr_holidays.py:38
#, python-format
msgid ""
"For the leaves to generate timesheet, the internal project and task are "
"requried."
msgstr ""
+"Ayrılmalar için zaman çizelgesi, iç proje ve görev oluşturmak gereklidir."
#. module: project_timesheet_holidays
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_holidays_status_timesheet_generate
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_generate
msgid "Generate Timesheet"
-msgstr ""
+msgstr "Zaman Çizelgesi Oluştur"
#. module: project_timesheet_holidays
-#: model:ir.model.fields,help:project_timesheet_holidays.field_hr_holidays_status_timesheet_generate
+#: model:ir.model.fields,help:project_timesheet_holidays.field_hr_leave_type__timesheet_generate
msgid ""
"If checked, when validating a leave, timesheet will be generated in the "
"Vacation Project of the company."
msgstr ""
+"Eğer işaretli ise, bir ayrılma onaylandığında, şirketin İzin Projesi içinde "
+"zaman çizelgesi oluşturulacak."
#. module: project_timesheet_holidays
#: code:addons/project_timesheet_holidays/models/res_company.py:30
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_holidays_status_timesheet_project_id
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_company_leave_timesheet_project_id
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings_leave_timesheet_project_id
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_project_id
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_company__leave_timesheet_project_id
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings__leave_timesheet_project_id
#, python-format
msgid "Internal Project"
-msgstr ""
+msgstr "İç Proje"
#. module: project_timesheet_holidays
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_holidays_status_timesheet_task_id
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_task_id
msgid "Internal Task for timesheet"
-msgstr ""
+msgstr "Zaman Çizelgesi için İç Görev"
#. module: project_timesheet_holidays
-#: model:ir.model,name:project_timesheet_holidays.model_hr_holidays
+#: model:ir.model,name:project_timesheet_holidays.model_hr_leave
msgid "Leave"
msgstr "İzin"
#. module: project_timesheet_holidays
-#: model:ir.model.fields,field_description:project_timesheet_holidays.field_account_analytic_line_holiday_id
+#: model:ir.model.fields,field_description:project_timesheet_holidays.field_account_analytic_line__holiday_id
msgid "Leave Request"
msgstr "İzni İsteği"
#. 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
+#: 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 "Görevden Ayrıl"
#. module: project_timesheet_holidays
-#: model:ir.model,name:project_timesheet_holidays.model_hr_holidays_status
+#: model:ir.model,name:project_timesheet_holidays.model_hr_leave_type
msgid "Leave Type"
msgstr "İzin Türü"
@@ -114,10 +119,11 @@ msgid "Task"
msgstr "Görev"
#. module: project_timesheet_holidays
-#: model:ir.model.fields,help:project_timesheet_holidays.field_hr_holidays_status_timesheet_project_id
+#: 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 ""
+"Bırakma onaylandığında, proje, oluşturulmuş zaman çizelgesi içerecektir."
#. module: project_timesheet_holidays
#: model:ir.ui.view,arch_db:project_timesheet_holidays.hr_holiday_status_view_form_inherit
@@ -131,6 +137,8 @@ msgid ""
"You cannot delete timesheet lines attached to a leaves. Please cancel the "
"leaves instead."
msgstr ""
+"İzin eklenmiş zaman çizelgesi satırını silemezsiniz. Onun yerine lütfen izni"
+" iptal edin."
#. module: project_timesheet_holidays
#: model:ir.model,name:project_timesheet_holidays.model_res_config_settings
diff --git a/addons/purchase/i18n/fr.po b/addons/purchase/i18n/fr.po
index afb55a59fbb..9483e418eaf 100644
--- a/addons/purchase/i18n/fr.po
+++ b/addons/purchase/i18n/fr.po
@@ -85,6 +85,32 @@ msgid ""
"% endif\n"
"</p>\n"
msgstr ""
+"\n"
+"<p>Cher\n"
+"% if object.partner_id.is_company and object.partner_id.child_ids:\n"
+" ${object.partner_id.child_ids[0].name}\n"
+"% else :\n"
+" ${object.partner_id.name}\n"
+"% endif\n"
+",</p><p>\n"
+"Veuillez trouvez ci-joint une ${object.state in ('draft', 'sent') and 'demande de devis' or 'confirmation de commande d\\'achat'} <strong>${object.name}</strong>\n"
+"% if object.partner_ref:\n"
+" référence : ${object.partner_ref}\n"
+"% endif\n"
+"% if object.origin:\n"
+" (RFQ origin: ${object.origin})\n"
+"% endif\n"
+"d'un montant de <strong>${format_amount(object.amount_total, object.currency_id)}</strong>\n"
+"émanant de ${object.company_id.name}.\n"
+"</p>\n"
+"\n"
+"<p>N'hésitez pas à nous contacter si vous avez d'autres questions.</p>\n"
+"<p>Cordialement,</p>\n"
+"<p style=\"color:#888888;\">\n"
+"% if object.user_id and object.user_id.signature:\n"
+" ${object.user_id.signature | safe}\n"
+"% endif\n"
+"</p>\n"
#. module: purchase
#: model:mail.template,body_html:purchase.email_template_edi_purchase_done
@@ -110,6 +136,26 @@ msgid ""
"<p>You can reply to this email if you have any questions.</p>\n"
"<p>Thank you,</p>\n"
msgstr ""
+"\n"
+"<p>Cher ${object.partner_id.name} \n"
+"% if object.partner_id.parent_id:\n"
+" (<i>${object.partner_id.parent_id.name}</i>)\n"
+"% endif\n"
+",</p>\n"
+"<p>\n"
+"Veuillez trouver ci-joint une <strong>${object.state in ('draft', 'sent') and 'demande de devis' or 'confirmation de commande d\\'achat'} ${object.name}</strong>\n"
+"% if object.partner_ref:\n"
+" réfrence : ${object.partner_ref}\n"
+"% endif\n"
+"% if object.origin:\n"
+" (correspondant à la demande de devis : ${object.origin})\n"
+"% endif\n"
+"émanant de ${object.company_id.name}.\n"
+"Son montant s'élève à <strong>${format_amount(object.amount_total, object.currency_id)}</strong>.\n"
+"</p>\n"
+"\n"
+"<p>N'hésitez pas à répondre à ce mail pour toute demande.</p>\n"
+"<p>Cordialement,</p>\n"
#. module: purchase
#: code:addons/purchase/models/stock.py:100
diff --git a/addons/purchase/i18n/tr.po b/addons/purchase/i18n/tr.po
index 5fb520d7408..ef8d381e433 100644
--- a/addons/purchase/i18n/tr.po
+++ b/addons/purchase/i18n/tr.po
@@ -14,13 +14,15 @@
# Mehmet Demirel <mdemirell@gmail.com>, 2017
# Levent Karakaş <levent@mektup.at>, 2018
# Saban Yildiz <sabany@projetgrup.com>, 2018
+# Umur Akın <umura@projetgrup.com>, 2018
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Saban Yildiz <sabany@projetgrup.com>, 2018\n"
+"Last-Translator: Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -566,6 +568,8 @@ msgid ""
"Depicts the date where the Quotation should be validated and converted into "
"a purchase order."
msgstr ""
+"Teklifin onaylanması ve satın alma siparişine dönüştürülmesi gereken tarihi "
+"gösterir."
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order_line__name
@@ -625,6 +629,8 @@ msgid ""
"Encoding help. When selected, the associated purchase order lines are added "
"to the vendor bill. Several PO can be selected."
msgstr ""
+"Kodlama yardımı. Seçildiği zaman, ilişkili satın alma sipariş satırları "
+"tedarikçi faturasına eklenir. Bir çok PO seçilebilir."
#. module: purchase
#: model:ir.ui.view,arch_db:purchase.exception_on_po
@@ -668,6 +674,7 @@ msgstr "Sonraki Aktiviteler"
#: selection:res.company,po_double_validation:0
msgid "Get 2 levels of approvals to confirm a purchase order"
msgstr ""
+"Bir satın alma siparişinin onaylanması için 2 onay seviyesi almak gerekir."
#. module: purchase
#: model:ir.ui.view,arch_db:purchase.res_config_settings_view_form_purchase
@@ -884,6 +891,9 @@ msgid ""
"Orders for procuring products, they will be scheduled that many days earlier"
" to cope with unexpected vendor delays."
msgstr ""
+"Satıcı teslimat süreleri için hata payı. Sistem, ürün tedarik etmek için "
+"Satın Alma Siparişleri ürettiğinde, beklenmedik satıcı gecikmeleriyle başa "
+"çıkacakları günler öncesinden planlanacaktır."
#. module: purchase
#: model:ir.model.fields,help:purchase.field_res_config_settings__use_po_lead
@@ -920,7 +930,7 @@ msgstr "Min. Envanter Kuralı"
#: model:ir.model.fields,help:purchase.field_res_company__po_double_validation_amount
#: model:ir.model.fields,help:purchase.field_res_config_settings__po_double_validation_amount
msgid "Minimum amount for which a double validation is required"
-msgstr ""
+msgstr " Çift doğrulama gerektiren minimum miktar"
#. module: purchase
#: model:ir.filters,name:purchase.filter_purchase_order_monthly_purchases
@@ -1228,6 +1238,10 @@ msgid ""
"purchase history and performance. From this menu you can track your "
"negotiation performance, the delivery performance of your vendors, etc."
msgstr ""
+"Satınalma Analizi, şirket satın alma geçmişinizi ve performansınızı kolayca "
+"kontrol etmenizi ve analiz etmenizi sağlar. Bu menüden görüşme "
+"performansınızı, satıcılarınızın teslim performanslarını vb. "
+"Izleyebilirsiniz."
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_company__po_lead
@@ -1303,6 +1317,8 @@ msgid ""
"Purchase Order Modification used when you want to purchase order editable "
"after confirm"
msgstr ""
+"Onaydan sonra satın alma siparişi vermek istediğinizde düzenlenebilir olması"
+" için Satın Alma Siparişi Değiştirme kullanılır."
#. module: purchase
#: model:ir.actions.act_window,name:purchase.purchase_form_action
@@ -1344,7 +1360,7 @@ msgstr ""
#. module: purchase
#: model:ir.ui.view,arch_db:purchase.view_purchase_order_filter
msgid "Purchase orders that have been invoiced."
-msgstr ""
+msgstr "Faturalanan satın alma siparişi."
#. module: purchase
#: model:ir.ui.view,arch_db:purchase.view_purchase_order_filter
@@ -1380,6 +1396,8 @@ msgid ""
"Put an address if you want to deliver directly from the vendor to the "
"customer. Otherwise, keep empty to deliver to your own company."
msgstr ""
+"Eğer doğrudan tedarikçiden müşteriye teslimat olmasını istiyorsanız, adres "
+"girin. Eğer boş tutarsanız şirketinize teslimat olur."
#. module: purchase
#: model:ir.ui.view,arch_db:purchase.res_config_settings_view_form_purchase
@@ -1558,7 +1576,7 @@ msgstr "Satınalma Siparişi Ara"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_res_config_settings__use_po_lead
msgid "Security Lead Time for Purchase"
-msgstr ""
+msgstr "Satın Alma için Teslimat Zaman Güvenliği"
#. module: purchase
#: model:ir.model.fields,help:purchase.field_product_product__purchase_line_warn
@@ -1669,7 +1687,7 @@ msgstr "Vergiler:"
#. module: purchase
#: model:ir.model.fields,help:purchase.field_purchase_order__default_location_dest_id_usage
msgid "Technical field used to display the Drop Ship Address"
-msgstr ""
+msgstr "Teslimat Bırakma Adresini görüntülemek için kullanılan teknik alan"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_purchase_order__notes
@@ -1703,6 +1721,9 @@ msgid ""
" converted into a purchase order, you will be able to control the receipt\n"
" of the products and the vendor bill."
msgstr ""
+"Teklif için gerekli ilk adım satın alma adımı. Satın alma siparişine "
+"dönüştürüldükten sonra, ürün makbuzunu ve tedarikçi faturasını kontrol "
+"edebileceksiniz."
#. module: purchase
#: code:addons/purchase/models/purchase.py:931
@@ -1718,6 +1739,8 @@ msgid ""
"This account will be used to value price difference between purchase price "
"and accounting cost."
msgstr ""
+"Bu hesap, satın alma fiyatı ile muhasebe maliyeti arasındaki fiyat farkı "
+"değeri için kullanılacaktır."
#. module: purchase
#: model:ir.model.fields,help:purchase.field_product_product__property_account_creditor_price_difference
@@ -1773,7 +1796,7 @@ msgstr "Buraya yazacağınız açıklamalar satınalma siparişlerinde görünec
#: code:addons/purchase/models/account_invoice.py:216
#, python-format
msgid "This vendor bill has been created from: %s"
-msgstr ""
+msgstr "Bu satıcı faturası üzerinden oluşturuldu: %s"
#. module: purchase
#: code:addons/purchase/models/account_invoice.py:230
diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py
index cdc45963cc0..7390b81287a 100644
--- a/addons/purchase/models/purchase.py
+++ b/addons/purchase/models/purchase.py
@@ -287,6 +287,7 @@ class PurchaseOrder(models.Model):
@api.multi
def print_quotation(self):
+ self.write({'state': "sent"})
return self.env.ref('purchase.report_purchase_quotation').report_action(self)
@api.multi
diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py
index f54f63b9035..e9fd6f22dc3 100644
--- a/addons/purchase/report/purchase_report.py
+++ b/addons/purchase/report/purchase_report.py
@@ -98,7 +98,7 @@ class PurchaseReport(models.Model):
join res_partner partner on s.partner_id = partner.id
left join product_product p on (l.product_id=p.id)
left join product_template t on (p.product_tmpl_id=t.id)
- LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.template,',t.id) AND ip.company_id=s.company_id)
+ LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.product,',p.id) AND ip.company_id=s.company_id)
left join uom_uom u on (u.id=l.product_uom)
left join uom_uom u2 on (u2.id=t.uom_id)
left join account_analytic_account analytic_account on (l.account_analytic_id = analytic_account.id)
diff --git a/addons/purchase/views/portal_templates.xml b/addons/purchase/views/portal_templates.xml
index 664fef96626..ee6190304ce 100644
--- a/addons/purchase/views/portal_templates.xml
+++ b/addons/purchase/views/portal_templates.xml
@@ -24,9 +24,9 @@
<template id="portal_my_purchase_orders" name="Portal: My Purchase Orders">
<t t-call="portal.portal_layout">
- <h3>Purchase Orders
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Purchase Orders</t>
+ </t>
<div t-if="orders" class="panel panel-default">
<div class="table-responsive"><table class="table table-hover o_portal_my_doc_table">
<thead>
@@ -44,6 +44,9 @@
</td>
<td><span t-field="order.date_order"/></td>
<td>
+ <t t-if="order.invoice_status == 'to invoice'">
+ <span class="label label-info"><i class="fa fa-fw fa-file-text"/> Waiting for Bill</span>
+ </t>
<t t-if="order.state == 'cancel'">
<span class="label label-default"><i class="fa fa-fw fa-remove"/> Cancelled</span>
</t>
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index d93c686cd81..49c047e84f7 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -89,7 +89,7 @@
</record>
<menuitem id="product_product_menu" name="Product Variants" action="product_product_action"
- parent="menu_procurement_management" sequence="21" groups="base.group_no_one"/>
+ parent="menu_procurement_management" sequence="21" groups="product.group_product_variant"/>
<record model="ir.ui.view" id="purchase_order_calendar">
<field name="name">purchase.order.calendar</field>
diff --git a/addons/purchase_requisition/i18n/ru.po b/addons/purchase_requisition/i18n/ru.po
index 97d091327ff..23255945053 100644
--- a/addons/purchase_requisition/i18n/ru.po
+++ b/addons/purchase_requisition/i18n/ru.po
@@ -111,7 +111,7 @@ msgstr "Тип соглашения"
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.res_config_settings_view_form
msgid "Agreement Types"
-msgstr ""
+msgstr "Типы соглашений"
#. module: purchase_requisition
#: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition_line__account_analytic_id
diff --git a/addons/purchase_requisition/i18n/tr.po b/addons/purchase_requisition/i18n/tr.po
index fb968a38fe4..6a04f3fa2f7 100644
--- a/addons/purchase_requisition/i18n/tr.po
+++ b/addons/purchase_requisition/i18n/tr.po
@@ -130,7 +130,7 @@ msgstr "Tedarikçi Seçimi"
#. module: purchase_requisition
#: model:purchase.requisition.type,name:purchase_requisition.type_single
msgid "Blanket Order"
-msgstr ""
+msgstr "Açık Sipariş"
#. module: purchase_requisition
#: model:ir.model.fields,field_description:purchase_requisition.field_product_supplierinfo__purchase_requisition_id
@@ -141,7 +141,7 @@ msgstr ""
#: model:ir.actions.report,name:purchase_requisition.action_report_purchase_requisitions
#: model:ir.ui.view,arch_db:purchase_requisition.report_purchaserequisitions
msgid "Call for Tenders"
-msgstr ""
+msgstr "Teklif Çağrısı"
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_form
@@ -158,7 +158,7 @@ msgstr "İptal Edildi"
#: code:addons/purchase_requisition/models/purchase_requisition.py:115
#, python-format
msgid "Cancelled by the agreement associated to this quotation."
-msgstr ""
+msgstr "Bu teklifle ilişkili anlaşma tarafından iptal edildi."
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_form
@@ -238,7 +238,7 @@ msgstr "Görünüm Adı"
#. module: purchase_requisition
#: selection:purchase.requisition.type,line_copy:0
msgid "Do not create RfQ lines automatically"
-msgstr ""
+msgstr "Otomatik olarak RfQ satırı oluşturamazsınız."
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
@@ -248,7 +248,7 @@ msgstr "Biten"
#. module: purchase_requisition
#: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition_line__move_dest_id
msgid "Downstream Move"
-msgstr ""
+msgstr "Satışa Dönük Hareket"
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
@@ -266,7 +266,7 @@ msgstr "Bitiş Ayı"
#: model:ir.actions.act_window,help:purchase_requisition.action_purchase_requisition
msgid ""
"Example of purchase agreements include call for tenders and blanket orders."
-msgstr ""
+msgstr "Satın alma anlaşma örnekleri teklif çağrısı ve açık sipariş içerir."
#. module: purchase_requisition
#: model:ir.actions.act_window,help:purchase_requisition.action_purchase_requisition
@@ -275,6 +275,9 @@ msgid ""
" (e.g. a year) and you order products within this agreement, benefiting\n"
" from the negociated prices."
msgstr ""
+"Açık Sipariş için, belirli zaman aralıkları için bir sözleşme kaydedebilir "
+"ve bu anlaşma daghilindeki ürünler belirlenen fiyattan sipariş "
+"edebilirsiniz."
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
@@ -296,11 +299,15 @@ msgid ""
" been registered, you can review and compare them and you can\n"
" validate some and cancel others."
msgstr ""
+"Bir teklif çağrısında, ihtiyacınız olan ürünü kaydedebilir ve tedarikçiler "
+"için RfQ lar oluşturabilirsiniz. Teklifler kaydedildikten sonra bunları "
+"inceleyebilir ve karşılaştırabilir, bazılarını doğrulayabilir ve diğerlerini"
+" iptal edebilirsiniz."
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
msgid "In negotiation"
-msgstr ""
+msgstr "Müzakerede"
#. module: purchase_requisition
#: model:ir.model,name:purchase_requisition.model_product_supplierinfo
@@ -356,7 +363,7 @@ msgstr "Yeni Teklif"
#. module: purchase_requisition
#: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition__order_count
msgid "Number of Orders"
-msgstr ""
+msgstr "Sipariş Sayısı"
#. module: purchase_requisition
#: selection:purchase.requisition,state:0
@@ -491,7 +498,7 @@ msgstr "Satınalma Talep Satırı"
#. module: purchase_requisition
#: model:purchase.requisition.type,name:purchase_requisition.type_multi
msgid "Purchase Tender"
-msgstr ""
+msgstr "Satın Alma Teklifi"
#. module: purchase_requisition
#: model:ir.actions.act_window,name:purchase_requisition.act_res_partner_2_purchase_order
@@ -576,6 +583,8 @@ msgid ""
"\n"
" Select multiple RFQ: allows multiple purchase orders. On confirmation of a purchase order it does not cancel the remaining orders"
msgstr ""
+"Sadece bir teklif talebi (özel) seçin: Satın alma siparişi onaylandığında, kalan satın alma siparişini iptal edin.\n"
+"Birden çok RFQ seçin: Birden fazla satın alma siparişine izin verir. Satın alma siparişinin onaylanması durumunda kalan siparişler iptal edilmez."
#. module: purchase_requisition
#: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition_type__sequence
@@ -585,7 +594,7 @@ msgstr "Sıra"
#. module: purchase_requisition
#: selection:purchase.requisition.type,quantity_copy:0
msgid "Set quantities manually"
-msgstr ""
+msgstr "Miktarı manuel olarak ayarlayın"
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter
@@ -632,7 +641,7 @@ msgstr "Şartlar ve Koşullar"
#: model:ir.model.fields,help:purchase_requisition.field_purchase_requisition__schedule_date
msgid ""
"The expected and scheduled delivery date where all the products are received"
-msgstr ""
+msgstr "Tüm ürünlerin alındığı beklenen ve planlanan teslimat tarihi ."
#. module: purchase_requisition
#: code:addons/purchase_requisition/models/purchase_requisition.py:94
@@ -660,12 +669,12 @@ msgstr "Birim Fiyat"
#. module: purchase_requisition
#: selection:purchase.requisition.type,line_copy:0
msgid "Use lines of agreement"
-msgstr ""
+msgstr "Anlaşma satırları kullan"
#. module: purchase_requisition
#: selection:purchase.requisition.type,quantity_copy:0
msgid "Use quantities of agreement"
-msgstr ""
+msgstr "Anlaşma miktarı kullan"
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_form
@@ -721,6 +730,8 @@ msgid ""
"You have to cancel or validate every RfQ before closing the purchase "
"requisition."
msgstr ""
+"Satın alma isteği kapanmadan önce, her RfQ ya iptal etmeli ya da "
+"onaylamalısınız."
#. module: purchase_requisition
#: model:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_form
diff --git a/addons/purchase_stock/models/account_invoice.py b/addons/purchase_stock/models/account_invoice.py
index 27e820a90c8..28b7bf8bd0b 100644
--- a/addons/purchase_stock/models/account_invoice.py
+++ b/addons/purchase_stock/models/account_invoice.py
@@ -42,35 +42,58 @@ class AccountInvoice(models.Model):
# calculate and write down the possible price difference between invoice price and product price
for line in res:
if line.get('invl_id', 0) == i_line.id and reference_account_id == line['account_id']:
- valuation_price_unit = i_line.product_id.uom_id._compute_price(i_line.product_id.standard_price, i_line.uom_id)
+ # valuation_price unit is always expressed in invoice currency, so that it can always be computed with the good rate
+ valuation_price_unit = company_currency._convert(
+ i_line.product_id.uom_id._compute_price(i_line.product_id.standard_price, i_line.uom_id),
+ inv.currency_id,
+ company=inv.company_id, date=fields.Date.today(), round=False,
+ )
line_quantity = line['quantity']
if i_line.product_id.cost_method != 'standard' and i_line.purchase_line_id:
+ po_currency = i_line.purchase_id.currency_id
+ po_company = i_line.purchase_id.company_id
#for average/fifo/lifo costing method, fetch real cost price from incomming moves
- valuation_price_unit = i_line.purchase_line_id.product_uom._compute_price(i_line.purchase_line_id.price_unit, i_line.uom_id)
+ valuation_price_unit = po_currency._convert(
+ i_line.purchase_line_id.product_uom._compute_price(i_line.purchase_line_id.price_unit, i_line.uom_id),
+ inv.currency_id,
+ company=po_company, date=inv.date_invoice, round=False,
+ )
stock_move_obj = self.env['stock.move']
- valuation_stock_move = stock_move_obj.search([('purchase_line_id', '=', i_line.purchase_line_id.id), ('state', '=', 'done')])
+ valuation_stock_move = stock_move_obj.search([
+ ('purchase_line_id', '=', i_line.purchase_line_id.id),
+ ('state', '=', 'done'), ('product_qty', '!=', 0.0)
+ ])
+ if self.type == 'in_refund':
+ valuation_stock_move = valuation_stock_move.filtered(lambda m: m._is_out())
+ elif self.type == 'in_invoice':
+ valuation_stock_move = valuation_stock_move.filtered(lambda m: m._is_in())
if valuation_stock_move:
valuation_price_unit_total = 0
valuation_total_qty = 0
for val_stock_move in valuation_stock_move:
- valuation_price_unit_total += abs(val_stock_move.price_unit) * val_stock_move.product_qty
+ # In case val_stock_move is a return move, its valuation entries have been made with the
+ # currency rate corresponding to the original stock move
+ valuation_date = val_stock_move.origin_returned_move_id.date or val_stock_move.date_expected
+ valuation_price_unit_total += company_currency._convert(
+ abs(val_stock_move.price_unit) * val_stock_move.product_qty,
+ inv.currency_id,
+ company=inv.company_id, date=valuation_date, round=False,
+ )
valuation_total_qty += val_stock_move.product_qty
valuation_price_unit = valuation_price_unit_total / valuation_total_qty
valuation_price_unit = i_line.product_id.uom_id._compute_price(valuation_price_unit, i_line.uom_id)
line_quantity = valuation_total_qty
- elif i_line.product_id.cost_method == 'real':
+ elif i_line.product_id.cost_method == 'fifo':
# In this condition, we have a real price-valuated product which has not yet been received
- valuation_price_unit = i_line.purchase_line_id.price_unit
+ valuation_price_unit = po_currency._convert(
+ i_line.purchase_line_id.price_unit, inv.currency_id,
+ company=po_company, date=inv.date_invoice, round=False,
+ )
interim_account_price = valuation_price_unit * line_quantity
- if inv.currency_id.id != company_currency.id:
- # We express everyhting in the invoice currency
- valuation_price_unit = company_currency._convert(valuation_price_unit, inv.currency_id, inv.company_id, inv.date_invoice or fields.Date.today(), round=False)
- interim_account_price = company_currency._convert(interim_account_price, inv.currency_id, inv.company_id, inv.date_invoice or fields.Date.today(), round=False)
-
invoice_cur_prec = inv.currency_id.decimal_places
if float_compare(valuation_price_unit, i_line.price_unit, precision_digits=invoice_cur_prec) != 0 and float_compare(line['price_unit'], i_line.price_unit, precision_digits=invoice_cur_prec) == 0:
@@ -92,7 +115,7 @@ class AccountInvoice(models.Model):
price_unit_val_dif = price_unit - valuation_price_unit
price_val_dif = price_before - interim_account_price
- if inv.currency_id.compare_amounts(i_line.price_unit, i_line.purchase_line_id.price_unit) != 0 and acc:
+ if inv.currency_id.compare_amounts(i_line.price_unit, valuation_price_unit) != 0 and acc:
# If the unit prices have not changed and we have a
# valuation difference, it means this difference is due to exchange rates,
# so we don't create anything, the exchange rate entries will
diff --git a/addons/purchase_stock/models/procurement.py b/addons/purchase_stock/models/procurement.py
index 2b27abe6f9c..af4270d090a 100644
--- a/addons/purchase_stock/models/procurement.py
+++ b/addons/purchase_stock/models/procurement.py
@@ -146,16 +146,16 @@ class ProcurementRule(models.Model):
gpo = self.group_propagation_option
group = (gpo == 'fixed' and self.group_id.id) or \
- (gpo == 'propagate' and 'group_id' in values and values['group_id'].id) or False
+ (gpo == 'propagate' and values.get('group_id') and values['group_id'].id) or False
return {
'partner_id': partner.id,
'picking_type_id': self.picking_type_id.id,
'company_id': values['company_id'].id,
- 'currency_id': partner.property_purchase_currency_id.id or self.env.user.company_id.currency_id.id,
+ 'currency_id': partner.with_context(force_company=values['company_id'].id).property_purchase_currency_id.id or self.env.user.company_id.currency_id.id,
'dest_address_id': values.get('partner_dest_id', False) and values['partner_dest_id'].id,
'origin': origin,
- 'payment_term_id': partner.property_supplier_payment_term_id.id,
+ 'payment_term_id': partner.with_context(force_company=values['company_id'].id).property_supplier_payment_term_id.id,
'date_order': purchase_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
'fiscal_position_id': fpos,
'group_id': group
diff --git a/addons/purchase_stock/models/purchase.py b/addons/purchase_stock/models/purchase.py
index 31958412fe7..270812d5f7e 100644
--- a/addons/purchase_stock/models/purchase.py
+++ b/addons/purchase_stock/models/purchase.py
@@ -50,7 +50,7 @@ class PurchaseOrder(models.Model):
@api.depends('picking_ids', 'picking_ids.state')
def _compute_is_shipped(self):
for order in self:
- if order.picking_ids and all([x.state == 'done' for x in order.picking_ids]):
+ if order.picking_ids and all([x.state in ['done', 'cancel'] for x in order.picking_ids]):
order.is_shipped = True
@api.onchange('picking_type_id')
diff --git a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
index fdb0311662b..ab20b43b524 100644
--- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
+++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
@@ -36,8 +36,9 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
'product_qty': quantity,
'product_uom': product.uom_po_id.id,
'price_unit': self.product_price_unit,
- 'date_planned': datetime.today(),
+ 'date_planned': '2017-10-07',
})],
+ 'date_order': '2017-10-01',
})
rslt.button_confirm()
return rslt
@@ -51,7 +52,7 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
'currency_id': self.currency_two.id,
'name': 'vendor bill',
'type': 'in_invoice',
- 'date_invoice': time.strftime('%Y') + '-12-22',
+ 'date_invoice': '2017-12-31',
'account_id': account_receivable.id,
})
rslt.purchase_order_change()
@@ -76,6 +77,7 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
def test_invoice_shipment(self):
""" Tests the case into which we make the invoice first, and then receive the goods.
"""
+ # Create a PO and an invoice for it
test_product = self.test_product_order
purchase_order = self._create_purchase(test_product)
@@ -83,15 +85,29 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
invoice_line = self.env['account.invoice.line'].search([('invoice_id', '=', invoice.id)])
invoice_line.quantity = 1
- self.currency_rate.rate = 13.834739702
+ # The currency rate changes
+ self.currency_rate = self.env['res.currency.rate'].create({
+ 'currency_id': self.currency_one.id,
+ 'company_id': self.company.id,
+ 'rate': 13.834739702,
+ 'name': '2017-12-22',
+ })
+ # Validate the invoice and refund the goods
invoice.action_invoice_open()
- self._process_pickings(purchase_order.picking_ids)
+ self._process_pickings(purchase_order.picking_ids, date='2017-12-24')
picking = self.env['stock.picking'].search([('purchase_id', '=', purchase_order.id)])
self.check_reconciliation(invoice, picking)
- #return the goods and refund the invoice
- self.currency_rate.rate = 10.54739702
+ # The currency rate changes again
+ self.currency_rate = self.env['res.currency.rate'].create({
+ 'currency_id': self.currency_one.id,
+ 'company_id': self.company.id,
+ 'rate': 10.54739702,
+ 'name': '2018-01-01',
+ })
+
+ # Return the goods and refund the invoice
stock_return_picking = self.env['stock.return.picking']\
.with_context(active_ids=[picking.id], active_id=picking.id).create({})
stock_return_picking.product_return_moves.quantity = 1.0
@@ -100,12 +116,25 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
return_pick.action_assign()
return_pick.move_lines.quantity_done = 1
return_pick.action_done()
- self.currency_rate.rate = 9.56564564
+ self._change_pickings_date(return_pick, '2018-01-13')
+
+ # The currency rate changes again
+ self.currency_rate = self.env['res.currency.rate'].create({
+ 'currency_id': self.currency_one.id,
+ 'company_id': self.company.id,
+ 'rate': 9.56564564,
+ 'name': '2018-03-12',
+ })
+
+ # Refund the invoice
refund_invoice_wiz = self.env['account.invoice.refund'].with_context(active_ids=[invoice.id]).create({
'description': 'test_invoice_shipment_refund',
'filter_refund': 'cancel',
+ 'date': '2018-03-15',
})
refund_invoice_wiz.invoice_refund()
+
+ # Check the result
refund_invoice = self.env['account.invoice'].search([('name', '=', 'test_invoice_shipment_refund')])[0]
self.assertTrue(invoice.state == refund_invoice.state == 'paid'), "Invoice and refund should both be in 'Paid' state"
self.check_reconciliation(refund_invoice, return_pick)
diff --git a/addons/purchase_stock/tests/test_stockvaluation.py b/addons/purchase_stock/tests/test_stockvaluation.py
index ec64b079cf7..6cff36e7635 100644
--- a/addons/purchase_stock/tests/test_stockvaluation.py
+++ b/addons/purchase_stock/tests/test_stockvaluation.py
@@ -5,7 +5,8 @@ import time
from datetime import datetime
from odoo import fields
-from odoo.tests.common import TransactionCase
+from odoo.tests.common import TransactionCase, tagged
+from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
@@ -21,11 +22,13 @@ class TestStockValuation(TransactionCase):
'name': 'Stock Input',
'code': 'StockIn',
'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ 'reconcile': True,
})
self.stock_output_account = Account.create({
'name': 'Stock Output',
'code': 'StockOut',
'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ 'reconcile': True,
})
self.stock_valuation_account = Account.create({
'name': 'Stock Valuation',
@@ -276,3 +279,142 @@ class TestStockValuation(TransactionCase):
self.assertEqual(move2.price_unit, 100)
self.assertEqual(move2.product_qty, 5)
+
+@tagged('post_install', '-at_install')
+class TestStockValuationWithCOA(AccountingTestCase):
+ def setUp(self):
+ super(TestStockValuationWithCOA, self).setUp()
+ self.supplier_location = self.env.ref('stock.stock_location_suppliers')
+ self.stock_location = self.env.ref('stock.stock_location_stock')
+ self.partner_id = self.env.ref('base.res_partner_1')
+ self.product1 = self.env.ref('product.product_product_8')
+ Account = self.env['account.account']
+ self.stock_input_account = Account.create({
+ 'name': 'Stock Input',
+ 'code': 'StockIn',
+ 'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ 'reconcile': True,
+ })
+ self.stock_output_account = Account.create({
+ 'name': 'Stock Output',
+ 'code': 'StockOut',
+ 'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ 'reconcile': True,
+ })
+ self.stock_valuation_account = Account.create({
+ 'name': 'Stock Valuation',
+ 'code': 'Stock Valuation',
+ 'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ })
+ self.stock_journal = self.env['account.journal'].create({
+ 'name': 'Stock Journal',
+ 'code': 'STJTEST',
+ 'type': 'general',
+ })
+ self.product1.categ_id.write({
+ 'property_stock_account_input_categ_id': self.stock_input_account.id,
+ 'property_stock_account_output_categ_id': self.stock_output_account.id,
+ 'property_stock_valuation_account_id': self.stock_valuation_account.id,
+ 'property_stock_journal': self.stock_journal.id,
+ })
+
+ def test_fifo_anglosaxon_return(self):
+ self.env.user.company_id.anglo_saxon_accounting = True
+ self.product1.product_tmpl_id.cost_method = 'fifo'
+ self.product1.product_tmpl_id.valuation = 'real_time'
+ self.product1.product_tmpl_id.invoice_policy = 'delivery'
+ price_diff_account = self.env['account.account'].create({
+ 'name': 'price diff account',
+ 'code': 'price diff account',
+ 'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+ })
+ self.product1.property_account_creditor_price_difference = price_diff_account
+
+ # Receive 10@10 ; create the vendor bill
+ po1 = self.env['purchase.order'].create({
+ 'partner_id': self.partner_id.id,
+ 'order_line': [
+ (0, 0, {
+ 'name': self.product1.name,
+ 'product_id': self.product1.id,
+ 'product_qty': 10.0,
+ 'product_uom': self.product1.uom_po_id.id,
+ 'price_unit': 10.0,
+ 'date_planned': datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ }),
+ ],
+ })
+ po1.button_confirm()
+ receipt_po1 = po1.picking_ids[0]
+ receipt_po1.move_lines.quantity_done = 10
+ receipt_po1.button_validate()
+
+ invoice_po1 = self.env['account.invoice'].create({
+ 'partner_id': self.partner_id.id,
+ 'purchase_id': po1.id,
+ 'account_id': self.partner_id.property_account_payable_id.id,
+ 'type': 'in_invoice',
+ })
+ invoice_po1.purchase_order_change()
+ invoice_po1.action_invoice_open()
+
+ # Receive 10@20 ; create the vendor bill
+ po2 = self.env['purchase.order'].create({
+ 'partner_id': self.partner_id.id,
+ 'order_line': [
+ (0, 0, {
+ 'name': self.product1.name,
+ 'product_id': self.product1.id,
+ 'product_qty': 10.0,
+ 'product_uom': self.product1.uom_po_id.id,
+ 'price_unit': 20.0,
+ 'date_planned': datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ }),
+ ],
+ })
+ po2.button_confirm()
+ receipt_po2 = po2.picking_ids[0]
+ receipt_po2.move_lines.quantity_done = 10
+ receipt_po2.button_validate()
+
+ invoice_po2 = self.env['account.invoice'].create({
+ 'partner_id': self.partner_id.id,
+ 'purchase_id': po2.id,
+ 'account_id': self.partner_id.property_account_payable_id.id,
+ 'type': 'in_invoice',
+ })
+ invoice_po2.purchase_order_change()
+ invoice_po2.action_invoice_open()
+
+ # valuation of product1 should be 300
+ self.assertEqual(self.product1.stock_value, 300)
+
+ # return the second po
+ stock_return_picking = self.env['stock.return.picking']\
+ .with_context(active_ids=receipt_po2.ids, active_id=receipt_po2.ids[0])\
+ .create({})
+ stock_return_picking.product_return_moves.quantity = 10
+ stock_return_picking_action = stock_return_picking.create_returns()
+ return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id'])
+ return_pick.move_lines[0].move_line_ids[0].qty_done = 10
+ return_pick.button_validate()
+
+ # valuation of product1 should be 200 as the first items will be sent out
+ self.assertEqual(self.product1.stock_value, 200)
+
+ # create a credit note for po2
+ creditnote_po2 = self.env['account.invoice'].create({
+ 'partner_id': self.partner_id.id,
+ 'purchase_id': po2.id,
+ 'account_id': self.partner_id.property_account_payable_id.id,
+ 'type': 'in_refund',
+ })
+
+ creditnote_po2.purchase_order_change()
+ creditnote_po2.invoice_line_ids[0].quantity = 10
+ creditnote_po2.action_invoice_open()
+
+ # check the anglo saxon entries
+ price_diff_entry = self.env['account.move.line'].search([('account_id', '=', price_diff_account.id)])
+ self.assertEqual(price_diff_entry.credit, 100)
+
diff --git a/addons/rating/i18n/nl.po b/addons/rating/i18n/nl.po
index b4c89a08c16..4baa8d1da76 100644
--- a/addons/rating/i18n/nl.po
+++ b/addons/rating/i18n/nl.po
@@ -286,7 +286,7 @@ msgstr "Beoordeling Mixin"
#. module: rating
#: model:ir.model.fields,field_description:rating.field_rating_rating__rating
msgid "Rating Number"
-msgstr ""
+msgstr "Beoordelingscijfer"
#. module: rating
#: model:ir.model.fields,field_description:rating.field_mail_compose_message__rating_value
diff --git a/addons/rating/i18n/tr.po b/addons/rating/i18n/tr.po
index 8e19460d8d2..498284c331f 100644
--- a/addons/rating/i18n/tr.po
+++ b/addons/rating/i18n/tr.po
@@ -9,13 +9,14 @@
# Ediz Duman <neps1192@gmail.com>, 2017
# Martin Trigaux, 2017
# Levent Karakaş <levent@mektup.at>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Levent Karakaş <levent@mektup.at>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -260,7 +261,7 @@ msgstr "Değerlendirme Ortalaması"
#: model:ir.model.fields,field_description:rating.field_project_task__rating_last_feedback
#: model:ir.model.fields,field_description:rating.field_rating_mixin__rating_last_feedback
msgid "Rating Last Feedback"
-msgstr ""
+msgstr "Son Geribildirimleri Derecelendirme "
#. module: rating
#: model:ir.model.fields,field_description:rating.field_mail_channel__rating_last_image
@@ -268,7 +269,7 @@ msgstr ""
#: model:ir.model.fields,field_description:rating.field_project_task__rating_last_image
#: model:ir.model.fields,field_description:rating.field_rating_mixin__rating_last_image
msgid "Rating Last Image"
-msgstr ""
+msgstr "Son Resmin Değerlendirilmesi"
#. module: rating
#: model:ir.model.fields,field_description:rating.field_mail_channel__rating_last_value
diff --git a/addons/resource/i18n/tr.po b/addons/resource/i18n/tr.po
index 310029d221f..7e79c010fa2 100644
--- a/addons/resource/i18n/tr.po
+++ b/addons/resource/i18n/tr.po
@@ -12,13 +12,14 @@
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017
# Gökhan Erdoğdu <gokhan.erdogdu@mechsoft.com.tr>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Gökhan Erdoğdu <gokhan.erdogdu@mechsoft.com.tr>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -98,7 +99,7 @@ msgstr "Haftanın Günü"
#: model:ir.model.fields,field_description:resource.field_res_company__resource_calendar_id
#: model:ir.model.fields,field_description:resource.field_res_users__resource_calendar_id
msgid "Default Working Hours"
-msgstr ""
+msgstr "Varsayılan Çalışma Saatleri"
#. module: resource
#: model:ir.model.fields,help:resource.field_hr_employee__resource_calendar_id
@@ -155,13 +156,13 @@ msgstr "Cuma"
#: code:addons/resource/models/resource.py:79
#, python-format
msgid "Friday Evening"
-msgstr ""
+msgstr "Cuma Akşamı"
#. module: resource
#: code:addons/resource/models/resource.py:78
#, python-format
msgid "Friday Morning"
-msgstr ""
+msgstr "Cuma Sabahı"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_calendar__global_leave_ids
@@ -278,13 +279,13 @@ msgstr "Pazartesi"
#: code:addons/resource/models/resource.py:71
#, python-format
msgid "Monday Evening"
-msgstr ""
+msgstr "Pazartesi Akşamı"
#. module: resource
#: code:addons/resource/models/resource.py:70
#, python-format
msgid "Monday Morning"
-msgstr ""
+msgstr "Pazartesi Sabahı"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_calendar__name
@@ -340,7 +341,7 @@ msgstr "Kaynak İzinler"
#. module: resource
#: model:ir.model,name:resource.model_resource_mixin
msgid "Resource Mixin"
-msgstr ""
+msgstr "Kaynak Karışımı"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_resource__resource_type
@@ -402,7 +403,7 @@ msgstr "Çalışma Süresi Ara"
#: code:addons/resource/models/res_company.py:23
#, python-format
msgid "Standard 40 hours/week"
-msgstr ""
+msgstr "Standart 40 saat/hafta"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_calendar_leaves__date_from
@@ -432,13 +433,13 @@ msgstr "Pazar"
#. module: resource
#: model:ir.model,name:resource.model_resource_test
msgid "Test Resource Model"
-msgstr ""
+msgstr "Test Kaynak Modeli"
#. module: resource
#: code:addons/resource/models/resource.py:711
#, python-format
msgid "The efficiency factor cannot be equal to 0."
-msgstr ""
+msgstr "Etki faktörü sıfıra eşit olamaz"
#. module: resource
#: code:addons/resource/models/resource.py:668
@@ -469,18 +470,18 @@ msgstr "Perşembe"
#: code:addons/resource/models/resource.py:77
#, python-format
msgid "Thursday Evening"
-msgstr ""
+msgstr "Salı Akşamı"
#. module: resource
#: code:addons/resource/models/resource.py:76
#, python-format
msgid "Thursday Morning"
-msgstr ""
+msgstr "Perşembe Sabahı"
#. module: resource
#: sql_constraint:resource.resource:0
msgid "Time efficiency must be strictly positive"
-msgstr ""
+msgstr "Zaman etkinliği mutlaka pozitif olmalı"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_calendar_leaves__tz
@@ -503,13 +504,13 @@ msgstr "Salı"
#: code:addons/resource/models/resource.py:73
#, python-format
msgid "Tuesday Evening"
-msgstr ""
+msgstr "Salı Akşamı"
#. module: resource
#: code:addons/resource/models/resource.py:72
#, python-format
msgid "Tuesday Morning"
-msgstr ""
+msgstr "Salı Sabahı"
#. module: resource
#: model:ir.ui.view,arch_db:resource.view_resource_resource_search
@@ -536,13 +537,13 @@ msgstr "Çarşamba"
#: code:addons/resource/models/resource.py:75
#, python-format
msgid "Wednesday Evening"
-msgstr ""
+msgstr "Çarşamba Akşamı"
#. module: resource
#: code:addons/resource/models/resource.py:74
#, python-format
msgid "Wednesday Morning"
-msgstr ""
+msgstr "Çarşamba Sabahı"
#. module: resource
#: model:ir.model,name:resource.model_resource_calendar_attendance
@@ -552,7 +553,7 @@ msgstr "Çalışma Ayrıntısı"
#. module: resource
#: model:ir.ui.view,arch_db:resource.resource_calendar_form
msgid "Work Resources"
-msgstr ""
+msgstr "İş Kaynakları"
#. module: resource
#: model:ir.model.fields,field_description:resource.field_resource_calendar_attendance__hour_from
diff --git a/addons/sale/i18n/es.po b/addons/sale/i18n/es.po
index 803590c4001..bbfeff87c3d 100644
--- a/addons/sale/i18n/es.po
+++ b/addons/sale/i18n/es.po
@@ -217,6 +217,8 @@ msgid ""
"<span class=\"label label-success hidden-xs\"><i class=\"fa fa-fw fa-"
"check\"/><span class=\"hidden-xs\"> Done</span></span>"
msgstr ""
+"<span class=\"label label-success hidden-xs\"><i class=\"fa fa-fw fa-"
+"check\"/><span class=\"hidden-xs\"> Realizado </span></span>"
#. module: sale
#: model:ir.ui.view,arch_db:sale.portal_order_page
@@ -233,6 +235,8 @@ msgid ""
"<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> "
"Done</span>"
msgstr ""
+"<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> "
+"Realizado </span>"
#. module: sale
#: model:ir.ui.view,arch_db:sale.report_saleorder_document
diff --git a/addons/sale/i18n/nl.po b/addons/sale/i18n/nl.po
index 2d8f804abc3..da926f2a037 100644
--- a/addons/sale/i18n/nl.po
+++ b/addons/sale/i18n/nl.po
@@ -11,13 +11,14 @@
# Erwin van der Ploeg <erwin@odooexperts.nl>, 2016
# Volluta <volluta@tutanota.com>, 2016
# Pol Van Dingenen <pol.vandingenen@vanroey.be>, 2017
+# Thomas Pot <thomas@open2bizz.nl>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Pol Van Dingenen <pol.vandingenen@vanroey.be>, 2017\n"
+"Last-Translator: Thomas Pot <thomas@open2bizz.nl>, 2018\n"
"Language-Team: Dutch (https://www.transifex.com/odoo/teams/41243/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -210,6 +211,8 @@ msgid ""
"<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> "
"Done</span>"
msgstr ""
+"<span class=\"label label-success\"><i class=\"fa fa-fw fa-check\"/> "
+"Verwerkt</span>"
#. module: sale
#: model:ir.ui.view,arch_db:sale.report_saleorder_document
diff --git a/addons/sale/i18n/tr.po b/addons/sale/i18n/tr.po
index e927411e0ea..7d1a01a26a4 100644
--- a/addons/sale/i18n/tr.po
+++ b/addons/sale/i18n/tr.po
@@ -19,13 +19,15 @@
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Alexander B. <road2monstercat@gmail.com>, 2017
# selim kartal <kartalselim37@gmail.com>, 2017
+# Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2018
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: selim kartal <kartalselim37@gmail.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -318,7 +320,7 @@ msgstr "<strong>Referans Numaranız:</strong>"
#. module: sale
#: selection:res.config.settings,sale_pricelist_setting:0
msgid "A single sales price per product"
-msgstr ""
+msgstr "Ürün başına tek bir satış fiyatı"
#. module: sale
#: model:ir.actions.act_window,help:sale.action_orders_upselling
@@ -386,7 +388,7 @@ msgstr "Avans: %s"
#. module: sale
#: model:ir.model,name:sale.model_report_all_channels_sales
msgid "All sales orders grouped by sales channels"
-msgstr ""
+msgstr "Tüm satış siparişleri satış kanalları tarafından gruplandırıldı"
#. module: sale
#: model:ir.ui.view,arch_db:sale.res_config_settings_view_form
@@ -1473,7 +1475,7 @@ msgstr "Sipariş #"
#. module: sale
#: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__count
msgid "Order Count"
-msgstr ""
+msgstr "Sipariş Sayımı"
#. module: sale
#: code:addons/sale/controllers/portal.py:86
@@ -2520,7 +2522,7 @@ msgstr ""
#: code:addons/sale/models/sale.py:431 code:addons/sale/models/sale.py:435
#, python-format
msgid "There is no invoiceable line."
-msgstr ""
+msgstr "Burada faturalanabilir satır yok."
#. module: sale
#: model:ir.ui.view,arch_db:sale.portal_order_error
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index b50f0b65bc7..1f0eeb79071 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -427,6 +427,9 @@ class SaleOrder(models.Model):
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
invoices = {}
references = {}
+ invoices_origin = {}
+ invoices_name = {}
+
for order in self:
group_key = order.id if grouped else (order.partner_invoice_id.id, order.currency_id.id)
for line in order.order_line.sorted(key=lambda l: l.qty_to_invoice < 0):
@@ -437,13 +440,14 @@ class SaleOrder(models.Model):
invoice = inv_obj.create(inv_data)
references[invoice] = order
invoices[group_key] = invoice
+ invoices_origin[group_key] = [invoice.origin]
+ invoices_name[group_key] = [invoice.name]
elif group_key in invoices:
- vals = {}
- if order.name not in invoices[group_key].origin.split(', '):
- vals['origin'] = invoices[group_key].origin + ', ' + order.name
- if order.client_order_ref and order.client_order_ref not in invoices[group_key].name.split(', ') and order.client_order_ref != invoices[group_key].name:
- vals['name'] = invoices[group_key].name + ', ' + order.client_order_ref
- invoices[group_key].write(vals)
+ if order.name not in invoices_origin[group_key]:
+ invoices_origin[group_key].append(order.name)
+ if order.client_order_ref and order.client_order_ref not in invoices_name[group_key]:
+ invoices_name[group_key].append(order.client_order_ref)
+
if line.qty_to_invoice > 0:
line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice)
elif line.qty_to_invoice < 0 and final:
@@ -453,6 +457,10 @@ class SaleOrder(models.Model):
if order not in references[invoices[group_key]]:
references[invoices[group_key]] |= order
+ for group_key in invoices:
+ invoices[group_key].write({'name': ', '.join(invoices_name[group_key]),
+ 'origin': ', '.join(invoices_origin[group_key])})
+
if not invoices:
raise UserError(_('There is no invoiceable line. If a product has a Delivered quantities invoicing policy, please make sure that a quantity has been delivered.'))
diff --git a/addons/sale/report/report_all_channels_sales.py b/addons/sale/report/report_all_channels_sales.py
index 50498c8825b..5af76ba85ec 100644
--- a/addons/sale/report/report_all_channels_sales.py
+++ b/addons/sale/report/report_all_channels_sales.py
@@ -57,6 +57,7 @@ class PosSaleReport(models.Model):
(cr.date_end IS NULL OR cr.date_end > COALESCE(so.date_order, now())))
LEFT JOIN uom_uom u on (u.id=sol.product_uom)
LEFT JOIN uom_uom u2 on (u2.id=pt.uom_id)
+ WHERE so.state != 'cancel'
""" % self.env['res.currency']._select_companies_rates()
return so_str
diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml
index 11c82f053a6..27a3da7516f 100644
--- a/addons/sale/views/sale_portal_templates.xml
+++ b/addons/sale/views/sale_portal_templates.xml
@@ -32,9 +32,9 @@
<template id="portal_my_quotations" name="My Quotations">
<t t-call="portal.portal_layout">
- <h3>Quotations
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Quotations</t>
+ </t>
<t t-if="not quotations">
<p>There are currently no quotations for your account.</p>
</t>
@@ -78,9 +78,9 @@
<template id="portal_my_orders" name="My Sales Orders">
<t t-call="portal.portal_layout">
- <h3>Sales Orders
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">Sales Orders</t>
+ </t>
<t t-if="not orders">
<p>There are currently no orders for your account.</p>
</t>
diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml
index de74cd194d2..09dba5794eb 100644
--- a/addons/sale/views/sale_views.xml
+++ b/addons/sale/views/sale_views.xml
@@ -67,7 +67,7 @@
<menuitem id="prod_config_main" name="Products" parent="menu_sale_config" sequence="5"/>
<menuitem id="menu_attribute_action" action="product.attribute_action" parent="prod_config_main" sequence="1" groups="base.group_no_one" active="False"/>
<menuitem action="product.variants_action" id="menu_variants_action" parent="sale.prod_config_main" sequence="2" groups="base.group_no_one" active="False"/>
- <menuitem id="menu_products" action="product.product_normal_action_sell" parent="product_menu_catalog" groups="base.group_no_one" sequence="2" active="False"/>
+ <menuitem id="menu_products" action="product.product_normal_action_sell" parent="product_menu_catalog" groups="product.group_product_variant" sequence="2" active="False"/>
<menuitem id="next_id_16" name="Units of Measure" parent="sale.prod_config_main" sequence="6" groups="uom.group_uom" active="False"/>
<menuitem action="uom.product_uom_form_action" id="menu_product_uom_form_action" parent="sale.prod_config_main" sequence="7" groups="uom.group_uom" active="False"/>
<menuitem action="uom.product_uom_categ_form_action" id="menu_product_uom_categ_form_action" parent="sale.prod_config_main" sequence="8" groups="uom.group_uom" active="False"/>
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index 879fd94edf5..69c09932b66 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -186,4 +186,5 @@ class SaleAdvancePaymentInv(models.TransientModel):
'invoice_policy': 'order',
'property_account_income_id': self.deposit_account_id.id,
'taxes_id': [(6, 0, self.deposit_taxes_id.ids)],
+ 'company_id': False,
}
diff --git a/addons/sale_crm/i18n/tr.po b/addons/sale_crm/i18n/tr.po
index b3a2b14bda4..7c9eb2ca7da 100644
--- a/addons/sale_crm/i18n/tr.po
+++ b/addons/sale_crm/i18n/tr.po
@@ -8,14 +8,15 @@
# Esin Kandemir <esaykandemir@gmail.com>, 2017
# Ediz Duman <neps1192@gmail.com>, 2017
# Murat Kaplan <muratk@projetgrup.com>, 2017
-# Martin Trigaux <mat@odoo.com>, 2017
+# Martin Trigaux, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server saas~11.1\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-12-13 14:37+0000\n"
-"PO-Revision-Date: 2017-12-13 14:37+0000\n"
-"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
+"POT-Creation-Date: 2018-03-22 14:10+0000\n"
+"PO-Revision-Date: 2018-03-22 14:10+0000\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -39,9 +40,9 @@ msgid "Invoice"
msgstr "Fatura"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_res_users_target_sales_invoiced
+#: model:ir.model.fields,field_description:sale_crm.field_res_users__target_sales_invoiced
msgid "Invoiced in Sales Orders Target"
-msgstr ""
+msgstr "Satış Siparişi Hedefinde Faturalandı"
#. module: sale_crm
#: model:ir.model,name:sale_crm.model_crm_lead
@@ -64,17 +65,17 @@ msgid "New Quotation"
msgstr "Yeni Teklif"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_crm_lead_sale_number
+#: model:ir.model.fields,field_description:sale_crm.field_crm_lead__sale_number
msgid "Number of Quotations"
msgstr "Teklif Sayısı"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_sale_order_opportunity_id
+#: model:ir.model.fields,field_description:sale_crm.field_sale_order__opportunity_id
msgid "Opportunity"
msgstr "Fırsat"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_crm_lead_order_ids
+#: model:ir.model.fields,field_description:sale_crm.field_crm_lead__order_ids
msgid "Orders"
msgstr "Siparişler"
@@ -99,7 +100,7 @@ msgstr "Teklifler"
#. module: sale_crm
#: model:ir.actions.act_window,name:sale_crm.sale_action_orders
msgid "Sale orders"
-msgstr ""
+msgstr "Satış siparişleri"
#. module: sale_crm
#: model:ir.model,name:sale_crm.model_crm_team
@@ -107,17 +108,17 @@ msgid "Sales Channel"
msgstr "Satış Ekibi"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_crm_lead_sale_amount_total
+#: model:ir.model.fields,field_description:sale_crm.field_crm_lead__sale_amount_total
msgid "Sum of Orders"
msgstr "Siparişlerin Toplamı"
#. module: sale_crm
-#: model:ir.model.fields,field_description:sale_crm.field_sale_order_tag_ids
+#: model:ir.model.fields,field_description:sale_crm.field_sale_order__tag_ids
msgid "Tags"
msgstr "Etiketler"
#. module: sale_crm
-#: model:ir.model.fields,help:sale_crm.field_crm_lead_sale_amount_total
+#: model:ir.model.fields,help:sale_crm.field_crm_lead__sale_amount_total
msgid "Untaxed Total of Confirmed Orders"
msgstr "Onaylı Siparişlerin Vergi Hariç Toplamı"
diff --git a/addons/sale_payment/i18n/tr.po b/addons/sale_payment/i18n/tr.po
index 3eb03b35e68..e5930a93beb 100644
--- a/addons/sale_payment/i18n/tr.po
+++ b/addons/sale_payment/i18n/tr.po
@@ -109,7 +109,7 @@ msgstr ""
#. module: sale_payment
#: model:ir.ui.view,arch_db:sale_payment.crm_team_salesteams_view_kanban_inherit_website_portal_sale
msgid "Awaiting Payments"
-msgstr ""
+msgstr "Beklemedeki Ödemeler"
#. module: sale_payment
#: code:addons/sale_payment/controllers/payment.py:52
@@ -145,7 +145,7 @@ msgstr ""
#: code:addons/sale_payment/controllers/payment.py:49
#, python-format
msgid "Pay"
-msgstr ""
+msgstr "Öde"
#. module: sale_payment
#: code:addons/sale_payment/models/payment.py:201
@@ -181,7 +181,7 @@ msgstr ""
#. module: sale_payment
#: model:ir.ui.view,arch_db:sale_payment.crm_team_salesteams_view_kanban_inherit_website_portal_sale
msgid "Payments to Capture"
-msgstr ""
+msgstr "Yakalanacak Ödemeler"
#. module: sale_payment
#: model:ir.actions.act_window,name:sale_payment.payment_transaction_action_pending
@@ -196,7 +196,7 @@ msgstr "Teklif"
#. module: sale_payment
#: model:ir.model.fields,field_description:sale_payment.field_payment_transaction__so_state
msgid "Sale Order State"
-msgstr ""
+msgstr "Satış Siparişi Durumu"
#. module: sale_payment
#: model:ir.model,name:sale_payment.model_crm_team
diff --git a/addons/sale_payment/models/payment.py b/addons/sale_payment/models/payment.py
index 66c856992ca..3eb827cc5ba 100644
--- a/addons/sale_payment/models/payment.py
+++ b/addons/sale_payment/models/payment.py
@@ -3,6 +3,7 @@
import logging
from odoo import api, fields, models, _
+from odoo.exceptions import UserError
from odoo.tools import float_compare
_logger = logging.getLogger(__name__)
diff --git a/addons/sale_stock/i18n/nl.po b/addons/sale_stock/i18n/nl.po
index e6f44988c9f..1ae548aa691 100644
--- a/addons/sale_stock/i18n/nl.po
+++ b/addons/sale_stock/i18n/nl.po
@@ -290,7 +290,7 @@ msgstr "Verpakking"
#. module: sale_stock
#: model:ir.model.fields,field_description:sale_stock.field_res_config_settings__default_picking_policy
msgid "Picking Policy"
-msgstr ""
+msgstr "Levering policy"
#. module: sale_stock
#: model:ir.model.fields,field_description:sale_stock.field_sale_order__picking_ids
diff --git a/addons/sale_stock/i18n/tr.po b/addons/sale_stock/i18n/tr.po
index 85113c732d6..207a5953d2f 100644
--- a/addons/sale_stock/i18n/tr.po
+++ b/addons/sale_stock/i18n/tr.po
@@ -9,13 +9,14 @@
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Hüseyin Cem Aras <hcemaras@gmail.com>, 2017
# Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2018
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2018\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -242,6 +243,9 @@ msgid ""
"for delivery that many days earlier than the actual promised date, to cope "
"with unexpected delays in the supply chain."
msgstr ""
+"Müşterilere söz verilen tarihler için hata payı. Ürünler, tedarik zincirinde"
+" beklenmedik gecikmelerle başa çıkmak için gerçek vaat edilen tarihten "
+"önceki günlerden daha uzun bir süre önce teslimat için planlanacaktır."
#. module: sale_stock
#: model:ir.model.fields,help:sale_stock.field_res_company__security_lead
diff --git a/addons/sale_timesheet/controllers/main.py b/addons/sale_timesheet/controllers/main.py
index 74486b6bf85..6ed6d0a8ae2 100644
--- a/addons/sale_timesheet/controllers/main.py
+++ b/addons/sale_timesheet/controllers/main.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from ast import literal_eval
import babel
from dateutil.relativedelta import relativedelta
@@ -145,7 +146,7 @@ class SaleTimesheetController(http.Controller):
sale_order_lines = request.env['sale.order.line'].sudo().browse(sale_line_ids | empty_line_ids)
map_so_names = {so.id: so.name for so in request.env['sale.order'].sudo().browse(sale_order_ids | empty_order_ids)}
map_sol = {sol.id: sol for sol in sale_order_lines}
- map_sol_names = {sol.id: sol.name.split('\n')[0] if sol.name else _('No Sale Order Line') for sol in sale_order_lines}
+ map_sol_names = {sol.id: sol.name.split('\n')[0] if sol.name else _('No Sales Order Line') for sol in sale_order_lines}
map_sol_so = {sol.id: sol.order_id.id for sol in sale_order_lines}
rows_sale_line = {} # (so, sol) -> [INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted]
@@ -153,7 +154,7 @@ class SaleTimesheetController(http.Controller):
sale_line_row_key = (map_sol_so.get(sale_line_id), sale_line_id)
sale_line = map_sol.get(sale_line_id)
is_milestone = sale_line.product_id.invoice_policy == 'delivery' and sale_line.product_id.service_type == 'manual' if sale_line else False
- rows_sale_line[sale_line_row_key] = [{'label': map_sol_names.get(sale_line_id, _('No Sale Order Line')), 'res_id': sale_line_id, 'res_model': 'sale.order.line', 'type': 'sale_order_line', 'is_milestone': is_milestone}] + default_row_vals[:]
+ rows_sale_line[sale_line_row_key] = [{'label': map_sol_names.get(sale_line_id, _('No Sales Order Line')), 'res_id': sale_line_id, 'res_model': 'sale.order.line', 'type': 'sale_order_line', 'is_milestone': is_milestone}] + default_row_vals[:]
if not is_milestone:
rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity(sale_line.product_uom_qty, uom_hour, raise_if_failure=False) if sale_line else 0.0
@@ -165,7 +166,7 @@ class SaleTimesheetController(http.Controller):
if sale_line_row_key not in rows_sale_line:
sale_line = map_sol.get(sale_line_id, request.env['sale.order.line'])
is_milestone = sale_line.product_id.invoice_policy == 'delivery' and sale_line.product_id.service_type == 'manual' if sale_line else False
- rows_sale_line[sale_line_row_key] = [{'label': map_sol_names.get(sale_line.id) if sale_line else _('No Sale Order Line'), 'res_id': sale_line_id, 'res_model': 'sale.order.line', 'type': 'sale_order_line', 'is_milestone': is_milestone}] + default_row_vals[:] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted
+ rows_sale_line[sale_line_row_key] = [{'label': map_sol_names.get(sale_line.id) if sale_line else _('No Sales Order Line'), 'res_id': sale_line_id, 'res_model': 'sale.order.line', 'type': 'sale_order_line', 'is_milestone': is_milestone}] + default_row_vals[:] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted
if not is_milestone:
rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity(sale_line.product_uom_qty, uom_hour, raise_if_failure=False) if sale_line else 0.0
@@ -183,7 +184,7 @@ class SaleTimesheetController(http.Controller):
sale_order_id = row_key[0]
# sale order row
if sale_order_id not in rows_sale_order:
- rows_sale_order[sale_order_id] = [{'label': map_so_names.get(sale_order_id, _('No Sale Order')), 'res_id': sale_order_id, 'res_model': 'sale.order', 'type': 'sale_order'}] + default_row_vals[:] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted
+ rows_sale_order[sale_order_id] = [{'label': map_so_names.get(sale_order_id, _('No Sales Order')), 'res_id': sale_order_id, 'res_model': 'sale.order', 'type': 'sale_order'}] + default_row_vals[:] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted
for index in range(len(rows_sale_line[row_key])):
if index != 0:
@@ -349,6 +350,10 @@ class SaleTimesheetController(http.Controller):
action.update({
'name': _('Tasks'),
'domain': domain,
- 'context': request.env.context, # erase original context to avoid default filter
+ 'context': dict(request.env.context), # erase original context to avoid default filter
})
+ # if only one project, add it in the context as default value
+ tasks = request.env['project.task'].sudo().search(literal_eval(domain))
+ if len(tasks.mapped('project_id')) == 1:
+ action['context']['default_project_id'] = tasks.mapped('project_id')[0].id
return action
diff --git a/addons/sale_timesheet/i18n/tr.po b/addons/sale_timesheet/i18n/tr.po
index db55029396b..5095908ef3f 100644
--- a/addons/sale_timesheet/i18n/tr.po
+++ b/addons/sale_timesheet/i18n/tr.po
@@ -8,13 +8,14 @@
# Gökhan Erdoğdu <gokhan.erdogdu@mechsoft.com.tr>, 2017
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Martin Trigaux, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Martin Trigaux, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -180,7 +181,7 @@ msgstr "Faturalanan"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__is_service
msgid "Is a Service"
-msgstr ""
+msgstr "Hizmet "
#. module: sale_timesheet
#: model:ir.ui.view,arch_db:sale_timesheet.product_template_search_view_sale_timesheet
@@ -226,6 +227,8 @@ msgid ""
"On Sales order confirmation, this product can generate a project and/or "
"task. From those, you can track the service you are selling."
msgstr ""
+"Satış siparişi onayının üzerine, bu ürün bir proje/görev oluşturabilir. "
+"Bunlardan, sattığınız hizmeti takip edebilirsiniz."
#. module: sale_timesheet
#: selection:product.template,service_policy:0
@@ -442,7 +445,7 @@ msgstr "Zaman Çizelgesi"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee__timesheet_cost
msgid "Timesheet Cost"
-msgstr ""
+msgstr "Zaman Çizelgesi Maliyeti"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_count
@@ -452,7 +455,7 @@ msgstr "Zaman Çizelgesi etkinlikler"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
-msgstr ""
+msgstr "Zaman çizelgesi etkinlikleri bu satışla birleştirildi."
#. module: sale_timesheet
#: code:addons/sale_timesheet/controllers/main.py:105
diff --git a/addons/sale_timesheet/models/project.py b/addons/sale_timesheet/models/project.py
index 2bd01fa6895..34410399f3c 100644
--- a/addons/sale_timesheet/models/project.py
+++ b/addons/sale_timesheet/models/project.py
@@ -95,7 +95,7 @@ class ProjectTask(models.Model):
@api.model
def create(self, values):
# sub task has the same so line than their parent
- if 'parent_id' in values:
+ if 'parent_id' in values and values['parent_id']:
values['sale_line_id'] = self.env['project.task'].browse(values['parent_id']).sudo().sale_line_id.id
return super(ProjectTask, self).create(values)
diff --git a/addons/sale_timesheet/models/sale_order.py b/addons/sale_timesheet/models/sale_order.py
index 6269e217efe..4d9d707f333 100644
--- a/addons/sale_timesheet/models/sale_order.py
+++ b/addons/sale_timesheet/models/sale_order.py
@@ -88,7 +88,7 @@ class SaleOrder(models.Model):
self.ensure_one()
# redirect to form or kanban view
billable_projects = self.project_ids.filtered(lambda project: project.sale_line_id)
- if len(billable_projects) == 1:
+ if len(billable_projects) == 1 and self.env.user.has_group('project.group_project_manager'):
action = billable_projects[0].action_view_timesheet_plan()
else:
view_form_id = self.env.ref('project.edit_project').id
@@ -106,24 +106,14 @@ class SaleOrder(models.Model):
@api.multi
def action_view_timesheet(self):
self.ensure_one()
- action = self.env.ref('hr_timesheet.act_hr_timesheet_line')
- list_view_id = self.env.ref('hr_timesheet.hr_timesheet_line_tree').id
- form_view_id = self.env.ref('hr_timesheet.hr_timesheet_line_form').id
-
- result = {
- 'name': action.name,
- 'help': action.help,
- 'type': action.type,
- 'views': [[list_view_id, 'tree'], [form_view_id, 'form']],
- 'target': action.target,
- 'context': action.context,
- 'res_model': action.res_model,
- }
+ action = self.env.ref('hr_timesheet.timesheet_action_all').read()[0]
+ action['context'] = self.env.context # erase default filters
+
if self.timesheet_count > 0:
- result['domain'] = "[('id','in',%s)]" % self.timesheet_ids.ids
+ action['domain'] = [('so_line', 'in', self.order_line.ids)]
else:
- result = {'type': 'ir.actions.act_window_close'}
- return result
+ action = {'type': 'ir.actions.act_window_close'}
+ return action
class SaleOrderLine(models.Model):
@@ -151,7 +141,7 @@ class SaleOrderLine(models.Model):
lines_by_timesheet = self.filtered(lambda sol: sol.qty_delivered_method == 'timesheet')
domain = lines_by_timesheet._timesheet_compute_delivered_quantity_domain()
- mapping = lines_by_timesheet._get_delivered_quantity_by_analytic(domain)
+ mapping = lines_by_timesheet.sudo()._get_delivered_quantity_by_analytic(domain)
for line in lines_by_timesheet:
line.qty_delivered = mapping.get(line.id, 0.0)
diff --git a/addons/sale_timesheet/tests/test_timesheet_revenue.py b/addons/sale_timesheet/tests/test_timesheet_revenue.py
index 75390477496..d707f257da5 100644
--- a/addons/sale_timesheet/tests/test_timesheet_revenue.py
+++ b/addons/sale_timesheet/tests/test_timesheet_revenue.py
@@ -19,6 +19,11 @@ class TestSaleTimesheet(TestSale):
# after the 6 june of current year.
self.env.ref('base.rateUSDbis').unlink()
+ # Make sure the company is in USD
+ self.env.cr.execute(
+ "UPDATE res_company SET currency_id = %s WHERE id = %s",
+ [self.env.ref('base.USD').id, self.env.user.company_id.id])
+
# create project
self.project = self.env['project.project'].create({
'name': 'Project for my timesheets',
diff --git a/addons/sale_timesheet/views/project_task_views.xml b/addons/sale_timesheet/views/project_task_views.xml
index 1ea95b50ad2..1ebdc46cbfa 100644
--- a/addons/sale_timesheet/views/project_task_views.xml
+++ b/addons/sale_timesheet/views/project_task_views.xml
@@ -7,7 +7,7 @@
<field name="inherit_id" ref="hr_timesheet.view_project_kanban_inherited"/>
<field name="arch" type="xml">
<xpath expr="//a[@t-if='record.allow_timesheets.raw_value']" position="replace">
- <a t-if="record.allow_timesheets.raw_value" name="action_view_timesheet" type="object" class="o_project_kanban_box o_project_timesheet_box" groups="hr_timesheet.group_hr_timesheet_user">
+ <a t-if="record.allow_timesheets.raw_value" name="action_view_timesheet" type="object" class="o_project_kanban_box o_project_timesheet_box" groups="project.group_project_manager">
<div>
<span class="o_label">Overview</span>
</div>
diff --git a/addons/sale_timesheet/views/sale_order_views.xml b/addons/sale_timesheet/views/sale_order_views.xml
index ea4f103ada3..50d2233ee39 100644
--- a/addons/sale_timesheet/views/sale_order_views.xml
+++ b/addons/sale_timesheet/views/sale_order_views.xml
@@ -23,7 +23,7 @@
icon="fa-puzzle-piece"
string="Project(s) Overview"
attrs="{'invisible': [('project_ids', '=', [])]}"
- groups="project.group_project_user">
+ groups="project.group_project_manager">
<field name="project_ids" invisible="1"/>
</button>
</xpath>
diff --git a/addons/sales_team/i18n/tr.po b/addons/sales_team/i18n/tr.po
index 280dc80f495..24147a59be2 100644
--- a/addons/sales_team/i18n/tr.po
+++ b/addons/sales_team/i18n/tr.po
@@ -9,13 +9,14 @@
# Ediz Duman <neps1192@gmail.com>, 2017
# Levent Karakaş <levent@mektup.at>, 2017
# Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -153,13 +154,15 @@ msgstr "Görünüm Adı"
#. module: sales_team
#: model:ir.model.fields,field_description:sales_team.field_crm_team__favorite_user_ids
msgid "Favorite Members"
-msgstr ""
+msgstr "Favori Üyeler"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__is_favorite
msgid ""
"Favorite teams to display them in the dashboard and access them easily."
msgstr ""
+"Favori takımlarınızı panelde görüntüleyebilir ve onlara kolayca "
+"erişebilirsiniz."
#. module: sales_team
#: model:ir.ui.view,arch_db:sales_team.crm_team_view_form
@@ -202,6 +205,8 @@ msgid ""
"If set, this sales channel will be used for sales and assignations related "
"to this partner"
msgstr ""
+"Eğer ayarlanırsa, bu satış kanalı satış ve iş ortağı ile ilgili atamalar "
+"için kullanılacaktır."
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__active
@@ -209,6 +214,8 @@ msgid ""
"If the active field is set to false, it will allow you to hide the sales "
"channel without removing it."
msgstr ""
+"Eğer etkin alan yanlış olarak ayarlanırsa, bu satış kanalını kaldırmadan "
+"gizlemenize izin verecektir."
#. module: sales_team
#: selection:crm.team,dashboard_graph_model:0
@@ -243,7 +250,7 @@ msgstr "Son Hafta"
#. module: sales_team
#: selection:crm.team,dashboard_graph_period:0
msgid "Last Year"
-msgstr ""
+msgstr "Geçen Sene"
#. module: sales_team
#: selection:crm.team,dashboard_graph_type:0
@@ -269,7 +276,7 @@ msgstr "Favorilerim"
#: code:addons/sales_team/models/crm_team.py:255
#, python-format
msgid "Not Defined"
-msgstr ""
+msgstr "Tanımlanmamış"
#. module: sales_team
#: selection:crm.team,dashboard_graph_model:0
@@ -314,6 +321,8 @@ msgid ""
"Sales Channel the user is member of. Used to compute the members of a sales "
"channel through the inverse one2many"
msgstr ""
+"Satış kanalı kullanıcı üyesidir. Ters one2many üzerinden satış kanalı "
+"üyelerini hesaplamak için kullanılır."
#. module: sales_team
#: model:ir.actions.act_window,name:sales_team.sales_team_config_action
@@ -353,7 +362,7 @@ msgstr "Ayarlar"
#. module: sales_team
#: model:ir.model.fields,field_description:sales_team.field_crm_team__is_favorite
msgid "Show on dashboard"
-msgstr ""
+msgstr "Panelde göster"
#. module: sales_team
#: model:ir.ui.view,arch_db:sales_team.crm_team_salesteams_search
@@ -368,7 +377,7 @@ msgstr "Satış Ekip Üyeleri"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__color
msgid "The color of the channel"
-msgstr ""
+msgstr "Kanalın rengi"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__reply_to
@@ -376,11 +385,13 @@ msgid ""
"The email address put in the 'Reply-To' of all emails sent by Odoo about "
"cases in this sales channel"
msgstr ""
+"Odoo tarafından bu satış kanalındaki vakalarla ilgili gönderilen tüm "
+"e-postaların 'Yanıt Ver' bölümünde yer alan e-posta adresi"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__dashboard_graph_model
msgid "The graph this channel will display in the Dashboard.\n"
-msgstr ""
+msgstr "Bu kanal grafiği panel üzerinde gösterilecek.\n"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__dashboard_graph_period
@@ -390,13 +401,13 @@ msgstr "UNTRANSLATED"
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__dashboard_graph_type
msgid "The type of graph this channel will display in the dashboard."
-msgstr ""
+msgstr "Bu kanalın grafik türü panel üzerinde gösterilecek."
#. module: sales_team
#: model:ir.model.fields,help:sales_team.field_crm_team__team_type
msgid ""
"The type of this channel, it will define the resources this channel uses."
-msgstr ""
+msgstr "Bu kanalın türü, kanalın kullandığı kaynakları tanımlayacaktır."
#. module: sales_team
#: model:ir.model.fields,field_description:sales_team.field_crm_team__dashboard_graph_type
@@ -417,6 +428,8 @@ msgid ""
"Use sales channels to organize your sales departments. \n"
" Each channel will work with a separate pipeline."
msgstr ""
+"Satış departmanınızı organize etmek için satış kanallarını kullanın\n"
+"Her kanal ayrı kanallar ile çalışır."
#. module: sales_team
#: model:res.groups,name:sales_team.group_sale_salesman_all_leads
diff --git a/addons/stock/data/stock_data.xml b/addons/stock/data/stock_data.xml
index bc37a9bb572..53e4639be74 100644
--- a/addons/stock/data/stock_data.xml
+++ b/addons/stock/data/stock_data.xml
@@ -142,11 +142,6 @@
<field name="number_increment">1</field>
</record>
- <record id="base.main_partner" model="res.partner">
- <field name="property_stock_customer" model="stock.warehouse"
- eval="obj().env.ref('stock.warehouse0').lot_stock_id.id"/>
- </record>
-
<!-- create xml ids for demo data that are widely used in tests or in other codes, for more convenience -->
<function model="ir.model.data" name="_update">
<value>stock.location</value>
diff --git a/addons/stock/i18n/de.po b/addons/stock/i18n/de.po
index 6fbdc263afc..894ae1684b9 100644
--- a/addons/stock/i18n/de.po
+++ b/addons/stock/i18n/de.po
@@ -1256,7 +1256,7 @@ msgstr "Kumulierte Menge"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__current_destination_location_id
msgid "Current Destination Location"
-msgstr ""
+msgstr "Aktueller Zielort"
#. module: stock
#: selection:stock.quantity.history,compute_at_date:0
@@ -1276,7 +1276,7 @@ msgstr "Buchungszeile für aktuelle Kommissionierung"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__current_source_location_id
msgid "Current Source Location"
-msgstr ""
+msgstr "Aktueller Ausgangsort"
#. module: stock
#: model:ir.actions.act_window,name:stock.location_open_quants
@@ -2647,7 +2647,7 @@ msgstr "Ist gesperrt"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__is_processed
msgid "Is Processed"
-msgstr ""
+msgstr "Verarbeitet"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_location__return_location
@@ -3743,7 +3743,7 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.report_package_barcode
msgid "Package Content"
-msgstr ""
+msgstr "Packungsinhalt"
#. module: stock
#: model:ir.ui.view,arch_db:stock.quant_package_search_view
@@ -3759,7 +3759,7 @@ msgstr "Paketreferenz"
#. module: stock
#: model:ir.ui.view,arch_db:stock.report_package_barcode_small
msgid "Package Reference:"
-msgstr ""
+msgstr "Verpackungsreferenz:"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_quant_package_form
@@ -3775,7 +3775,7 @@ msgstr "Typ der Verpackung"
#: model:ir.ui.view,arch_db:stock.report_package_barcode
#: model:ir.ui.view,arch_db:stock.report_package_barcode_small
msgid "Package Type:"
-msgstr ""
+msgstr "Verpackungstyp:"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_package_view
@@ -4307,7 +4307,7 @@ msgstr "Produktentnahme Strategie"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
msgid "Put in Pack"
-msgstr ""
+msgstr "Verpacken"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
diff --git a/addons/stock/i18n/fr.po b/addons/stock/i18n/fr.po
index ae03212d38a..24431158e5e 100644
--- a/addons/stock/i18n/fr.po
+++ b/addons/stock/i18n/fr.po
@@ -27,6 +27,7 @@
# Lucas Deliege <lud@odoo.com>, 2016
# lucasdeliege <deliegelucas@gmail.com>, 2016
# ShevAbam, 2016
+# Fred Gilson <fgi@odoo.com>, 2016
# Régis GEROMEGNACE <regis.geromegnace@gmail.com>, 2016
# Shark McGnark <peculiarcheese@gmail.com>, 2016
# Guilhaume Bordiau <github@guilhaume.fr>, 2016
@@ -6224,7 +6225,7 @@ msgstr "Mettre à jour la quantité d'articles"
#: model:ir.ui.view,arch_db:stock.product_product_view_form_easy_inherit_stock
#: model:ir.ui.view,arch_db:stock.product_template_form_view_procurement_button
msgid "Update Qty On Hand"
-msgstr "Mettre à jour le stock disponibles"
+msgstr "Mettre à jour le stock disponible"
#. module: stock
#: selection:stock.move,priority:0 selection:stock.picking,priority:0
diff --git a/addons/stock/i18n/nl.po b/addons/stock/i18n/nl.po
index c5d9c07c801..90ec0e3c55a 100644
--- a/addons/stock/i18n/nl.po
+++ b/addons/stock/i18n/nl.po
@@ -366,17 +366,17 @@ msgstr "Actief"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_production_lot_form
msgid "Add a lot/serial number"
-msgstr ""
+msgstr "Voeg een partij/serienummer toe"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_form
msgid "Add a new location"
-msgstr ""
+msgstr "Voeg een nieuwe locatie toe"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_routes_form
msgid "Add a new route"
-msgstr ""
+msgstr "Voeg een nieuwe route toe"
#. module: stock
#: model:ir.model.fields,help:stock.field_res_config_settings__group_stock_adv_location
diff --git a/addons/stock/i18n/tr.po b/addons/stock/i18n/tr.po
index 0c1443817db..5eb3786cd5d 100644
--- a/addons/stock/i18n/tr.po
+++ b/addons/stock/i18n/tr.po
@@ -43,6 +43,9 @@ msgid ""
"\n"
"Blocking: %s"
msgstr ""
+"\n"
+"\n"
+"Bloklama: %s"
#. module: stock
#: code:addons/stock/models/stock_move.py:320
@@ -66,6 +69,12 @@ msgid ""
" * Done: has been processed, can't be modified or cancelled anymore.\n"
" * Cancelled: has been cancelled, can't be confirmed anymore."
msgstr ""
+" * Taslak: henüz onaylanmamış ve onaylanana kadar planlanmayacaktır\n"
+"* Başka Bir İşlem Bekliyor: otomatik olarak hazır olmadan önce yürütülmek üzere başka bir hareket bekliyor (örn. Sipariş Verme Akışı)\n"
+"* Bekliyor: Eğer göndermek için hazır değilse, gerekli ürünler saklanamaz\n"
+"* Hazır: Ürün saklanmış ve gönderilmeye hazır. Eğer sevkıyat poliçesi 'olabildiğince çabuk' ise herhangi bir ürün saklandığında gönderilecektir. \n"
+"* Yapıldı: işlem gerçekleşmiş, değiştirilemez ve iptal edilemez.\n"
+"* İptal Edildi: iptal edilmiştir, artık onaylanamaz."
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_move_picking_form
@@ -112,6 +121,14 @@ msgid ""
"* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products\n"
"* Transit Location: Counterpart location that should be used in inter-company or inter-warehouses operations"
msgstr ""
+"* Tedarikçi Lokasyonu: Tedarikçilerinizden gelen ürünlerin kaynak konumunu temsil eden sanal konum\n"
+"* Görünüm: Deponuz için, alt konumlarını birleştiren bir hiyerarşik yapı oluşturan sanal konum; doğrudan ürünleri içeremez\n"
+"* İç Konum: Kendi depolarınızdaki fiziksel konumlar,\n"
+"* Müşteri Konumu: Müşterilerinize gönderilen ürünler için hedef konumu temsil eden sanal konum\n"
+"* Envanter: Stok seviyelerini düzeltmek için envanter operasyonları muadili olarak görev yapan sanal konum(Fiziksel envanterler)\n"
+"* Satınalma: Kaynak (tedarikçi veya üretim) henüz bilinmiyorken satınalma operasyonları geçici muadili olarak görev yapan sanal konum. Satınalma zamanlayıcısı çalışmayı durdurduğunda, bu konum boş olmalıdır.\n"
+"* Üretim: Üretim operasyonları için sanal muadil: bu konum işlenmemiş materyalleri sarf ederek tamamlanmış ürün oluşturur\n"
+"* Transit Konumları: Şirket içi veya depolar arası operasyonlarda kullanılması gereken muhatap konum "
#. module: stock
#: model:ir.ui.view,arch_db:stock.exception_on_picking
@@ -294,13 +311,13 @@ msgstr "Paket"
#: code:addons/stock/models/stock_move_line.py:94
#, python-format
msgid "A done move line should never have a reserved quantity."
-msgstr ""
+msgstr "Bir bitmiş hareket satırında rezerve edilmiş miktar olmamalıdır."
#. module: stock
#: code:addons/stock/models/stock_quant.py:80
#, python-format
msgid "A serial number should only be linked to a single product."
-msgstr ""
+msgstr "Bir seri numarası sadece bir ürüne bağlanmış olmalıdır."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__product_type
@@ -358,6 +375,8 @@ msgid ""
"Add and customize route operations to process product moves in your warehouse(s): e.g. unload > quality control > stock for incoming products, pick > pack > ship for outgoing products. \n"
" You can also set putaway strategies on warehouse locations in order to send incoming products into specific child locations straight away (e.g. specific bins, racks)."
msgstr ""
+"Deponuzda ki ürün hareketleri işlemlerini yönetmek için rota ekleyin ve özelleştirin: Örn. Mal kabul > kalite kontrol > gelen ürünlerin depolanması, seçim > paketleme > giden ürünün sevkıyatı.\n"
+"Ayrıca gelen ürünleri göndermek için belirli alt konumları depo konum stratejinizde ayarlayabilirsiniz. ( Örn. belirli ambarlar, raflar)"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
@@ -368,6 +387,8 @@ msgid ""
"strategies on warehouse locations in order to send incoming products into "
"specific child locations straight away (e.g. specific bins, racks)."
msgstr ""
+"Deponuzda ki ürün hareketleri işlemlerini yönetmek için rota ekleyin ve özelleştirin: Örn. Mal kabul > kalite kontrol > gelen ürünlerin depolanması, seçim > paketleme > giden ürünün sevkıyatı.\n"
+"Ayrıca gelen ürünleri göndermek için belirli alt konumları depo konum stratejinizde ayarlayabilirsiniz. ( Örn. belirli ambarlar, raflar)"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
@@ -439,7 +460,7 @@ msgstr "Tüm iade hareketleri"
#: code:addons/stock/models/stock_quant.py:86
#, python-format
msgid "An incoming date cannot be set to an untracked product."
-msgstr ""
+msgstr "Geliş tarihi izlenmeyen ürüne ayarlanamaz."
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_location_route_form_view
@@ -484,6 +505,8 @@ msgid ""
"Are you sure you want to confirm this operation? This may lead to "
"inconsistencies in your inventory."
msgstr ""
+"Bu operasyonu onaylamak istediğinize emin misiniz? Bu stoğunuzda "
+"tutarsızlığa neden olabilir."
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_overprocessed_transfer
@@ -662,6 +685,11 @@ msgid ""
"current stock) to gather products. If we want to chain moves and have this "
"one to wait for the previous, this second option should be chosen."
msgstr ""
+"Varsayılan olarak, sistem kaynak konumdaki stoktan alacak ve pasif olarak "
+"stok durumunun uygun olmasını bekleyecektir. Diğer olasılık, ürün toplamak "
+"için kaynak konumda doğrudan bir satınalma yaratmanıza (dolayısıyla mevcut "
+"stoğunuzu yok saymanıza) olanak tanır. Bağlantılı hareket oluşturmak ve bir "
+"önceki hareketi beklemek istiyorsak, bu ikinci seçenek daha uygun olabilir."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_location__active
@@ -770,12 +798,12 @@ msgstr "Ürün Miktarını Değiştir"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Change must be higher than"
-msgstr ""
+msgstr "Değişiklik daha yüksek olmalıdır"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move_line__move_id
msgid "Change to a better name"
-msgstr ""
+msgstr "Daha iyi bir isimle değiştir"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
@@ -785,7 +813,7 @@ msgstr "Uygunluk Kontrolü"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking__has_packages
msgid "Check the existence of destination packages on move lines"
-msgstr ""
+msgstr "Hareket satırlarındaki paketlerin var olan duraklarını kontrol edin."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking__move_line_exist
@@ -1000,7 +1028,7 @@ msgstr "Bekleyen Transfer Sayısı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_template_property_form
msgid "Counterpart Locations"
-msgstr ""
+msgstr "Karşı Konum"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_backorder_confirmation
@@ -1193,7 +1221,7 @@ msgstr "Kümülatif Miktar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__current_destination_location_id
msgid "Current Destination Location"
-msgstr ""
+msgstr "Mevcut Hedef Konumu"
#. module: stock
#: selection:stock.quantity.history,compute_at_date:0
@@ -1213,7 +1241,7 @@ msgstr "Mevcut Transfer Hareketi"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__current_source_location_id
msgid "Current Source Location"
-msgstr ""
+msgstr "Mevcut Kaynak Konumu"
#. module: stock
#: model:ir.actions.act_window,name:stock.location_open_quants
@@ -1489,7 +1517,7 @@ msgstr "Teslimat Emirleri"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_res_config_settings__group_stock_tracking_lot
msgid "Delivery Packages"
-msgstr ""
+msgstr "Teslimat Paketi"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_warehouse__delivery_route_id
@@ -1583,13 +1611,13 @@ msgstr "Hedef Konum"
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Destination Location:"
-msgstr ""
+msgstr "Hedef Konum :"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__move_dest_ids
#: model:ir.ui.view,arch_db:stock.view_move_form
msgid "Destination Moves"
-msgstr ""
+msgstr "Hedef Hareket"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__result_package_id
@@ -1600,7 +1628,7 @@ msgstr "Hedef Paketi"
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Destination Package :"
-msgstr ""
+msgstr "Hedef Paketi :"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__route_ids
@@ -1612,7 +1640,7 @@ msgstr "Hedef rota"
#: model:ir.ui.view,arch_db:stock.view_picking_form
#, python-format
msgid "Detailed Operations"
-msgstr ""
+msgstr "Detaylı Operasyonlar"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_location_path_form
@@ -1622,7 +1650,7 @@ msgstr "Detaylar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__show_details_visible
msgid "Details Visible"
-msgstr ""
+msgstr "Görünür Detaylar"
#. module: stock
#: model:ir.model.fields,help:stock.field_procurement_rule__procure_method
@@ -1703,7 +1731,7 @@ msgstr "Tarihe Göre Tamamlanan Transferler "
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Don’t propagate scheduling changes through chains of operations"
-msgstr ""
+msgstr "Zamanlama değişikliklerini işlem zincirleriyle yaymayın"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_internal_search
@@ -1725,12 +1753,12 @@ msgstr "EX WORKS"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__entire_package_ids
msgid "Entire Package"
-msgstr ""
+msgstr "Bütün Paket"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__entire_package_detail_ids
msgid "Entire Package Detail"
-msgstr ""
+msgstr "Bütün Paket Detayı"
#. module: stock
#. openerp-web
@@ -1885,12 +1913,12 @@ msgstr "Kimden:"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__from_loc
msgid "From Loc"
-msgstr ""
+msgstr "Nereden?"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__show_reserved_availability
msgid "From Supplier"
-msgstr ""
+msgstr "Tedarikçiden"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_location__complete_name
@@ -1943,6 +1971,7 @@ msgstr ""
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Get informative or blocking warnings on partners"
msgstr ""
+"İş ortaklarınız hakkında bilgilendirici ya da engelleyici uyarıları alın."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_fixed_putaway_strat__sequence
@@ -2000,7 +2029,7 @@ msgstr "Paket İşlemi mi?"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__has_packages
msgid "Has Packages"
-msgstr ""
+msgstr "Paketleri Var"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__has_scrap_move
@@ -2143,6 +2172,8 @@ msgid ""
"If the picking is unlocked you can edit initial demand (for a draft picking)"
" or done quantities (for a done picking)."
msgstr ""
+"Eğer seçim kilitlenmemiş ise,ilk talebi düzenleyebilir (bir taslak seçimi "
+"için) ya da miktarı tamamlayabilirsiniz (yapılmış seçimler için)."
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_location_path_filter
@@ -2156,6 +2187,8 @@ msgid ""
"If this checkbox is ticked, Odoo will show which products are reserved "
"(lot/serial number, source location, source package)."
msgstr ""
+"Eğer kutucuk işaretli ise, Odoo odoo hangi ürünlerin rezerve olduğunu "
+"gösterecek (lot/seri numarası, kaynak konumu, kaynak paketi)."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__show_operations
@@ -2165,6 +2198,9 @@ msgid ""
" operations. If not, the picking lines will represent an aggregate of "
"detailed stock operations."
msgstr ""
+"Eğer kutucuk işaretli ise, seçim satırları detaylı stok operasyonlarını "
+"temsil eder. Eğer değilse, seçim satırları stok işlemlerinin bir toplamını "
+"temsil eder."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking_type__use_create_lots
@@ -2238,12 +2274,12 @@ msgstr "Hemen transfer?"
#. module: stock
#: selection:res.config.settings,module_procurement_jit:0
msgid "Immediately after sales order confirmation"
-msgstr ""
+msgstr "Satış sipariş onayından hemen sonra "
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__in_entire_package
msgid "In Entire Package"
-msgstr ""
+msgstr "Bütün Paket İçinde"
#. module: stock
#: selection:stock.inventory,state:0
@@ -2489,7 +2525,7 @@ msgstr "Envanter Satırı"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_inventory_line_tree
msgid "Inventory Lines"
-msgstr ""
+msgstr "Envanter Satırları"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_product_product__property_stock_inventory
@@ -2511,7 +2547,7 @@ msgstr "Envanter Zararı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_inventory_filter
msgid "Inventory Product"
-msgstr ""
+msgstr "Stok Ürün"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_inventory__name
@@ -2570,7 +2606,7 @@ msgstr "Kilitli"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant_package__is_processed
msgid "Is Processed"
-msgstr ""
+msgstr "İşlendi"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_location__return_location
@@ -2586,12 +2622,12 @@ msgstr "Hurda Konumu Mu?"
#: model:ir.model.fields,field_description:stock.field_stock_move__is_initial_demand_editable
#: model:ir.model.fields,field_description:stock.field_stock_move_line__is_initial_demand_editable
msgid "Is initial demand editable"
-msgstr ""
+msgstr "İlk talep düzenlenebilir"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__is_quantity_done_editable
msgid "Is quantity done editable"
-msgstr ""
+msgstr "Gerçekleşmiş miktar düzenlenebilir"
#. module: stock
#: code:addons/stock/models/stock_quant.py:258
@@ -2787,7 +2823,7 @@ msgstr "Bağlantılı Hareketler"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_inventory_form
msgid "List view of lines"
-msgstr ""
+msgstr "Satırların görünümünü düzenle"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_location_form
@@ -2903,7 +2939,7 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Lot/Serial :"
-msgstr ""
+msgstr "Lot/Seri"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_change_product_qty__lot_id
@@ -2987,12 +3023,12 @@ msgstr "Lot / Seri Numaralarını Yönet"
#. module: stock
#: model:res.groups,name:stock.group_stock_multi_locations
msgid "Manage Multiple Stock Locations"
-msgstr ""
+msgstr "Birden Fazla Stok Konumu Yönetin"
#. module: stock
#: model:res.groups,name:stock.group_stock_multi_warehouses
msgid "Manage Multiple Warehouses"
-msgstr ""
+msgstr "Birden Fazla Depo Yönetin"
#. module: stock
#: model:res.groups,name:stock.group_tracking_lot
@@ -3027,7 +3063,7 @@ msgstr "Manuel Operasyon"
#. module: stock
#: selection:res.config.settings,module_procurement_jit:0
msgid "Manually or based on automatic scheduler"
-msgstr ""
+msgstr "Manuel ya da otomatik zamanlayıcı"
#. module: stock
#: selection:procurement.rule,action:0
@@ -3121,7 +3157,7 @@ msgstr "Hareket"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_stock_move_operations
msgid "Move Detail"
-msgstr ""
+msgstr "Hareket Detayı"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__picking_type_entire_packs
@@ -3149,7 +3185,7 @@ msgstr ""
#: model:ir.ui.view,arch_db:stock.view_move_line_form
#: model:ir.ui.view,arch_db:stock.view_move_line_tree
msgid "Move Lines"
-msgstr ""
+msgstr "Hareket Satırları"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_procurement_rule__procure_method
@@ -3194,12 +3230,12 @@ msgstr ""
#. module: stock
#: model:ir.model.fields,field_description:stock.field_res_config_settings__group_stock_adv_location
msgid "Multi-Step Routes"
-msgstr ""
+msgstr "Çok Adımlı Rotalar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_res_config_settings__group_stock_multi_warehouses
msgid "Multi-Warehouses"
-msgstr ""
+msgstr "Çoklu Depo"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_internal_search
@@ -3234,7 +3270,7 @@ msgstr "Yeni"
#: code:addons/stock/models/stock_picking.py:634
#, python-format
msgid "New Move:"
-msgstr ""
+msgstr "Yeni Hareket :"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_change_product_qty__new_quantity
@@ -3264,7 +3300,7 @@ msgstr "Uyarı Yok"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_res_config_settings__use_propagation_minimum_delta
msgid "No Rescheduling Propagation"
-msgstr ""
+msgstr "Planlanmayan Yayılma"
#. module: stock
#: selection:product.template,tracking:0
@@ -3285,14 +3321,14 @@ msgstr "Eksi(-) miktara izin verilmez"
#. module: stock
#: model:ir.ui.view,arch_db:stock.report_stock_inventory
msgid "No operation made on this lot."
-msgstr ""
+msgstr "Bu lotta operasyon yapılmadı"
#. module: stock
#: code:addons/stock/models/procurement.py:184
#, python-format
msgid ""
"No procurement rule found. Please verify the configuration of your routes"
-msgstr ""
+msgstr "Satış kuralı bulunamadı. Lütfen rota yapılandırmalarınızı doğrulayın."
#. module: stock
#: code:addons/stock/wizard/stock_picking_return.py:58
@@ -3331,7 +3367,7 @@ msgstr "Notlar"
#: code:addons/stock/models/stock_picking.py:582
#, python-format
msgid "Nothing to check the availability for."
-msgstr ""
+msgstr "Uygunluğu kontrol edebilecek bir şey yok."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_procurement_rule__delay
@@ -3400,7 +3436,7 @@ msgstr "Bir ürün kategorisi"
#: code:addons/stock/models/stock_inventory.py:111
#, python-format
msgid "One product for a specific owner"
-msgstr ""
+msgstr "Belirli mal sahibi için bir ürün"
#. module: stock
#: code:addons/stock/models/stock_inventory.py:107
@@ -3429,6 +3465,7 @@ msgid ""
"Operation Type determines the way the picking should be shown in the view, "
"reports, ..."
msgstr ""
+"Operasyon türü toplama yolunun raporlarda gösterilme biçimini belirler,..."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking_type__return_picking_type_id
@@ -3507,7 +3544,7 @@ msgstr "Siparişin Miktarı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_move_search
msgid "Orders processed today or scheduled for today"
-msgstr ""
+msgstr "Bugün işlenen ya da bugün planlanan siparişler"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_move_form
@@ -3567,7 +3604,7 @@ msgstr "Çıkış Konumu"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_overprocessed_transfer__overprocessed_product_name
msgid "Overprocessed Product Name"
-msgstr ""
+msgstr "Fazla işlem görmüş ürün adı"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_inventory_line__partner_id
@@ -3590,7 +3627,7 @@ msgstr "Sahibi "
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Owner :"
-msgstr ""
+msgstr "Mal Sahibi :"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_location__partner_id
@@ -3613,7 +3650,7 @@ msgstr "Kâr&Zarar Miktarı"
#: code:addons/stock/static/src/xml/stock_traceability_report_backend.xml:6
#, python-format
msgid "PRINT"
-msgstr ""
+msgstr "YAZDIR"
#. module: stock
#: code:addons/stock/models/stock_warehouse.py:216
@@ -3654,7 +3691,7 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.report_package_barcode
msgid "Package Content"
-msgstr ""
+msgstr "Paket İçeriği"
#. module: stock
#: model:ir.ui.view,arch_db:stock.quant_package_search_view
@@ -3670,7 +3707,7 @@ msgstr "Paket Referansı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.report_package_barcode_small
msgid "Package Reference:"
-msgstr ""
+msgstr "Paket Referansı:"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_quant_package_form
@@ -3686,7 +3723,7 @@ msgstr "Paket Türü"
#: model:ir.ui.view,arch_db:stock.report_package_barcode
#: model:ir.ui.view,arch_db:stock.report_package_barcode_small
msgid "Package Type:"
-msgstr ""
+msgstr "Paket Türü"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_package_view
@@ -3877,13 +3914,13 @@ msgstr "Pivot"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_picking_type_kanban
msgid "Planned Transfer"
-msgstr ""
+msgstr "Planlanan Transfer"
#. module: stock
#: code:addons/stock/models/stock_picking.py:693
#, python-format
msgid "Please add some lines to move"
-msgstr ""
+msgstr "Hareket için lütfen satır ekleyiniz."
#. module: stock
#: code:addons/stock/models/stock_picking.py:1018
@@ -3900,7 +3937,7 @@ msgstr "Lütfen sıfır olmayan bir miktar girin."
#. module: stock
#: model:ir.ui.view,arch_db:stock.quant_search_view
msgid "Positive Stock"
-msgstr ""
+msgstr "Pozitif Stok"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__product_packaging
@@ -3910,7 +3947,7 @@ msgstr "Tercih Edilen Paketleme"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__route_ids
msgid "Preferred route"
-msgstr ""
+msgstr "Tercih edilen rota"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
@@ -3941,17 +3978,17 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Process operations faster with barcodes"
-msgstr ""
+msgstr "İşlem operasyonları barkodlarla birlikte daha hızlı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Process picking in batch per worker"
-msgstr ""
+msgstr "Toplama işlemlerini, çalışan başına toplama olarak işleyin."
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_overprocessed_transfer
msgid "Processed more than initial demand"
-msgstr ""
+msgstr "İlk talepten daha fazla ürün işlendi."
#. module: stock
#: selection:stock.location,usage:0
@@ -4010,7 +4047,7 @@ msgstr "Tedarikler"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__produce_line_ids
msgid "Produce Line"
-msgstr ""
+msgstr "Üretim Hattı "
#. module: stock
#: code:addons/stock/models/product.py:347
@@ -4123,11 +4160,13 @@ msgid ""
"Product this lot/serial number contains. You cannot change it anymore if it "
"has already been moved."
msgstr ""
+"Ürün bu lot/seri numaralarını içeriyor. Eğer numaralar taşındıysa bunu "
+"değiştiremezsiniz."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__has_tracking
msgid "Product with Tracking"
-msgstr ""
+msgstr "İzlenen Ürün"
#. module: stock
#: model:stock.location,name:stock.location_production
@@ -4215,12 +4254,12 @@ msgstr "Yerleştirme Strateji"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
msgid "Put in Pack"
-msgstr ""
+msgstr "Pakete Koy"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Put your products in packs (e.g. parcels, boxes) and track them"
-msgstr ""
+msgstr "Ürünlerinizi pakete koyun (örn: koliler, kutular) ve onları izleyin"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_putaway
@@ -4255,7 +4294,7 @@ msgstr "Kalite Kontrol Konumu"
#: model:ir.model.fields,field_description:stock.field_stock_warn_insufficient_qty_scrap__quant_ids
#: model:ir.model.fields,field_description:stock.field_stock_warn_insufficient_qty_unbuild__quant_ids
msgid "Quant"
-msgstr ""
+msgstr "Miktar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_report_stock_forecast__quantity
@@ -4274,7 +4313,7 @@ msgstr "Adet"
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Quantity :"
-msgstr ""
+msgstr "Miktar :"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__quantity_done
@@ -4313,7 +4352,7 @@ msgstr "Miktar eksi olamaz"
#: code:addons/stock/models/stock_move.py:624
#, python-format
msgid "Quantity decreased!"
-msgstr ""
+msgstr "Miktar azaldı!"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__availability
@@ -4333,6 +4372,10 @@ msgid ""
"In a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children.\n"
"Otherwise, this includes goods arriving to any Stock Location with 'internal' type."
msgstr ""
+"Gelmesi gereken ürünlerin miktarı\n"
+"Tek Stok Konumu içeriğinde, bu konuma gelen malları ve alt malları içerir.\n"
+"Tek Depolu içeriğinde, bu Depo Konumuna gelen malları ve alt malları içerir.\n"
+"Yoksa 'iç Tipli' mallar herhangi bir Stok Konumuna gelebilir."
#. module: stock
#: model:ir.model.fields,help:stock.field_product_product__outgoing_qty
@@ -4342,6 +4385,10 @@ msgid ""
"In a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children.\n"
"Otherwise, this includes goods leaving any Stock Location with 'internal' type."
msgstr ""
+"Gitmesii gereken ürünlerin miktarı\n"
+"Tek Stok Konumu içeriğinde, bu konumdan giden malları ve alt malları içerir.\n"
+"Tek Depolu içeriğinde, bu Depo Konumundan giden malları ve alt malları içerir.\n"
+"Yoksa 'iç Tipli' mallar herhangi bir Stok Konumuna gelebilir."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_quant__quantity
@@ -4356,6 +4403,7 @@ msgid ""
"Quantity of reserved products in this quant, in the default unit of measure "
"of the product"
msgstr ""
+"Ürünün varsayılan ölçü biriminde, bu miktardaki ayrılmış ürünlerin miktarı."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__reserved_availability
@@ -4374,7 +4422,7 @@ msgstr "Stoklar"
#: code:addons/stock/models/stock_quant.py:74
#, python-format
msgid "Quants cannot be created for consumables or services."
-msgstr ""
+msgstr "Miktarlar hizmet ya da tüketilebilirlik için oluşturulamaz."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking_type__rate_picking_backorders
@@ -4404,7 +4452,7 @@ msgstr "Gerçek Miktar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__product_qty
msgid "Real Reserved Quantity"
-msgstr ""
+msgstr "Gerçek Rezerve Miktarı"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_warehouse__reception_route_id
@@ -4492,7 +4540,7 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
msgid "Register lots, packs, location"
-msgstr ""
+msgstr "Lot, ambalaj, konum kaydet."
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_internal_search
@@ -4557,6 +4605,8 @@ msgid ""
"Rescheduling applies to any chain of operations (e.g. Make To Order, Pick Pack Ship). In the case of MTO sales, a vendor delay (updated incoming date) impacts the expected delivery date to the customer. \n"
" This option allows to not propagate the rescheduling if the change is not critical."
msgstr ""
+"Yeniden planlama herhangi bir operasyon zincirine uygular (örn: Sipariş Emri, Topla, Paketle, Sevk Et). MTO satışları için, müşteri için beklenen teslimat tarihini, bir tedarikçi gecikmesi etkiler (gelecek zamana güncellenen) .\n"
+"Eğer değişim çok önemli değilse, bu seçenek yeniden planlamanın yayılmasına izin vermez."
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
@@ -4566,6 +4616,8 @@ msgid ""
" impacts the expected delivery date to the customer. This option allows to "
"not propagate the rescheduling if the change is not critical."
msgstr ""
+"Yeniden planlama herhangi bir operasyon zincirine uygular (örn: Sipariş Emri, Topla- Paketle- Sevk Et). MTO satışları için, müşteri için beklenen teslimat tarihini, bir tedarikçi gecikmesi etkiler (gelecek zamana güncellenen) .\n"
+"Eğer değişim çok önemli değilse, bu seçenek yeniden planlamanın yayılmasına izin vermez."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_res_config_settings__module_procurement_jit
@@ -4575,7 +4627,7 @@ msgstr "Rezervasyon"
#. module: stock
#: model:ir.ui.view,arch_db:stock.quant_search_view
msgid "Reservations"
-msgstr ""
+msgstr "Rezervasyonlar"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__product_uom_qty
@@ -4588,7 +4640,7 @@ msgstr "Rezerve"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_quant__reserved_quantity
msgid "Reserved Quantity"
-msgstr ""
+msgstr "Ayrılan Miktar"
#. module: stock
#: model:ir.model.fields,help:stock.field_res_config_settings__module_procurement_jit
@@ -4597,6 +4649,10 @@ msgid ""
"is advised to better manage priorities in case of long customer lead times "
"or/and frequent stock-outs."
msgstr ""
+"Teslimat emirlerinde manuel olarak rezerve ederek veya stok planlayıcısını "
+"çalıştırmak, müşteri güvenli teslimat tampon süresinin uzun olması ve / veya"
+" stokların sık sık tükenmesi durumunda önceliklerin daha iyi yönetilmesini "
+"sağlar."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_product_product__responsible_id
@@ -4789,6 +4845,8 @@ msgid ""
"Scrapping a product will remove it from your stock. The product will\n"
" end up in a scrap location that can be used for reporting purpose."
msgstr ""
+"Hurdaya çıkan bir ürün stoktan düşülecektir. Ürün raporlama amacıyla "
+"kullanılmak hurda konumuna düşecek. "
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_form
@@ -4803,7 +4861,7 @@ msgstr "Envanter Arama"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_inventory_line_search
msgid "Search Inventory Lines"
-msgstr ""
+msgstr "Stok Satırları Arama "
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_procurement_rule_filter
@@ -4896,12 +4954,12 @@ msgstr "İlgili Depo"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Set Putaway Strategies on Locations"
-msgstr ""
+msgstr "Konumlardaki Yerleştirme Stratejilerini Ayarlama"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Set Warehouse Routes"
-msgstr ""
+msgstr "Depo Rotalarını Ayarla"
#. module: stock
#: model:ir.model.fields,help:stock.field_product_category__removal_strategy_id
@@ -4920,7 +4978,7 @@ msgstr ""
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Set owner on stored products"
-msgstr ""
+msgstr "Depolanmış ürünlerin sahibini ayarla."
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
@@ -4982,6 +5040,10 @@ msgid ""
" labels and request carrier picking at your warehouse to ship to the "
"customer. Apply shipping connector from delivery methods."
msgstr ""
+"Nakliye bağlantıları, doğru nakliye maliyetlerini hesaplamaya, gönderim "
+"etiketlerini basmaya ve müşteriye gönderilmek üzere depoda taşıyıcı seçimini"
+" talep etmeyi sağlar. Gönderim bağlantılarını teslimat yöntemlerinden "
+"uygulayın."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_warehouse__code
@@ -4996,7 +5058,7 @@ msgstr "Kısa adı depo tanımlamak için kullanın"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__show_check_availability
msgid "Show Check Availability"
-msgstr ""
+msgstr "Uygunluk Kontrolünü Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__show_operations
@@ -5007,17 +5069,17 @@ msgstr "Operasyon Detaylarını Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__show_lots_text
msgid "Show Lots Text"
-msgstr ""
+msgstr "Lot Metinlerini Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__show_mark_as_todo
msgid "Show Mark As Todo"
-msgstr ""
+msgstr "Yapılacak Olarak İşaretlenenleri Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__show_operations
msgid "Show Operations"
-msgstr ""
+msgstr "Operasyonları Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking_type__show_reserved
@@ -5027,7 +5089,7 @@ msgstr "Rezerveyi Göster"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_picking__show_validate
msgid "Show Validate"
-msgstr ""
+msgstr "Doğrulamayı Göster"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_picking_internal_search
@@ -5063,7 +5125,7 @@ msgstr "Kaynak Konumu"
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Source Location:"
-msgstr ""
+msgstr "Kaynak Konumu :"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__package_id
@@ -5074,7 +5136,7 @@ msgstr "Kaynak Paket"
#. module: stock
#: model:ir.ui.view,arch_db:stock.message_body
msgid "Source Package :"
-msgstr ""
+msgstr "Kaynak Paketi :"
#. module: stock
#: model:ir.model.fields,help:stock.field_procurement_rule__location_src_id
@@ -5232,7 +5294,7 @@ msgstr "Stok Miktarı"
#. module: stock
#: model:ir.model,name:stock.model_stock_quantity_history
msgid "Stock Quantity History"
-msgstr ""
+msgstr "Stok Miktarının Geçmişi"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_move_search
@@ -5266,6 +5328,8 @@ msgid ""
"Store products in specific locations of your warehouse (e.g. bins, racks) "
"and to track inventory accordingly."
msgstr ""
+"Ürünlei deponuzda belirli konumlarda depolayın ( varil, raf vs) ve stoğunuza"
+" göre takip edin."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_location_route__supplied_wh_id
@@ -5315,6 +5379,8 @@ msgid ""
"Technical field used to compute whether the check availability button should"
" be shown."
msgstr ""
+"Kontrol kullanılabilirlik düğmesinin gösterilip gösterilmeyeceğini "
+"hesaplamak için kullanılan teknik alan."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking__show_mark_as_todo
@@ -5322,11 +5388,14 @@ msgid ""
"Technical field used to compute whether the mark as todo button should be "
"shown."
msgstr ""
+"Yapılacak olarak işaretlenen düğmenin gösterilip gösterilmeyeceğini "
+"hesaplamak için kullanılan teknik alan."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking__show_validate
msgid "Technical field used to compute whether the validate should be shown."
msgstr ""
+"Onayın gösterilip gösterilmeyeceğini hesaplamak için kullanılan teknik alan."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__restrict_partner_id
@@ -5352,12 +5421,12 @@ msgstr ""
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move_line__produce_line_ids
msgid "Technical link to see which line was produced with this. "
-msgstr ""
+msgstr "Bununla hangi hattın üretildiğini görmek için teknik bağlantı."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move_line__consume_line_ids
msgid "Technical link to see who consumed what. "
-msgstr ""
+msgstr "Kimin ne tükettiğini görmek için teknik bağlantı."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__product_tmpl_id
@@ -5382,6 +5451,9 @@ msgid ""
" With 'Automatic No Step Added', the location is replaced in the original "
"move."
msgstr ""
+"'Manuel Operasyon' değeri,mevcut adımdan sonra bir stok hareketi "
+"oluşturacaktır. 'Otomatik Adım Ekleme Yok' ile, konum orijinal harekette "
+"değiştirilir."
#. module: stock
#: code:addons/stock/models/stock_picking.py:829
@@ -5441,6 +5513,13 @@ msgid ""
"point. That way, it is always known where we need to go and that is why they"
" are preferred over push rules."
msgstr ""
+"Bir satış siparişi, yeniden sipariş kuralı, başka hareketler gibi satışlar "
+"tarafından temsil edilen talep, çözüm için satın alma kuralının "
+"uygulanmasına ihtiyaç duyar. Satın alma kuralının uygulanmasına bağlı "
+"olarak bir satın alma siparişini, üretim siparişini ya da başka bir hareketi"
+" tetikler. Bu yol, ters siparişteki başlangıç noktasındaki orijinal talep "
+"ile bitiş noktasına kadar zincir oluşturan yoldur. Bu yol,her zaman nereye "
+"gidilmesi gerektiğini ve bu yüzden itme kuralları sayesinde tercih edilir."
#. module: stock
#: model:ir.ui.view,arch_db:stock.product_category_form_view_inherit
@@ -5474,6 +5553,10 @@ msgid ""
" On the operation type you could e.g. specify if packing is needed by default,\n"
" if it should show the customer."
msgstr ""
+"Operasyon türü sistemi, her stok operasyonunda, görünümlerini buna göre "
+"değiştirecek belirli bir türe atamanıza izin verir. Operasyon tipinde, "
+"örneğin müşteriye göstermesi gerekiyorsa, paketlemede varsayılan olarak "
+"gerekli olup olmadığını belirtebilirsiniz."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_quant__package_id
@@ -5505,7 +5588,7 @@ msgstr "Bu stok hareketini oluşturan satınalma kuralı"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_warn_insufficient_qty_form_view
msgid "The product"
-msgstr ""
+msgstr "Ürün"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_move__push_rule_id
@@ -5593,6 +5676,9 @@ msgid ""
"routes put another location. If it is empty, it will check for the customer "
"location on the partner. "
msgstr ""
+"Bu operasyon türü ile manuel toplama oluşturduğunuzda, bu varsayılan hedef "
+"konumdur. Ancak değiştirmek mümkündür veya başka rotalar seçilebilir. Boş "
+"ise, iş ortağı kartının üzerindeki müşteri konumunu kontrol edecektir"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking_type__default_location_src_id
@@ -5602,6 +5688,9 @@ msgid ""
"put another location. If it is empty, it will check for the supplier "
"location on the partner. "
msgstr ""
+"Bu operasyon türü ile manuel toplama oluşturduğunuzda, bu varsayılan hedef "
+"konumdur. Ancak değiştirmek mümkündür veya başka rotalar seçilebilir. Boş "
+"ise, iş ortağı kartının üzerindeki müşteri konumunu kontrol edecektir"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_production_lot_form
@@ -5615,7 +5704,7 @@ msgstr ""
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_location_path__picking_type_id
msgid "This is the operation type that will be put on the stock moves"
-msgstr ""
+msgstr "Bu, stok hareketlerine koyulacak olan bir operasyon türüdür."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_quant__owner_id
@@ -5649,7 +5738,7 @@ msgstr ""
#, python-format
msgid ""
"This location's usage cannot be changed to view as it contains products."
-msgstr ""
+msgstr "Bu konum kullanımı, ürünleri içerdiğinden görüntüyü değiştiremez."
#. module: stock
#: model:ir.actions.act_window,help:stock.stock_move_action
@@ -5768,12 +5857,15 @@ msgid ""
"Those are the entire packages of a picking shown in the view of detailed "
"operations"
msgstr ""
+"Bunlar, detaylı operasyon görüntüsünde gösterilen toplama paketlerinin "
+"tümüdür."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking__entire_package_ids
msgid ""
"Those are the entire packages of a picking shown in the view of operations"
msgstr ""
+"Bunlar, operasyon görüntüsünde gösterilen toplama paketlerinin tümüdür."
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__location_dest_id
@@ -5795,7 +5887,7 @@ msgstr "Yapılacak"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move_line__to_loc
msgid "To Loc"
-msgstr ""
+msgstr "Nereye?"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_picking_type_kanban
@@ -5843,6 +5935,8 @@ msgid ""
"Track following dates on lots & serial numbers: best before, removal, end of life, alert. \n"
" Such dates are set automatically at lot/serial number creation based on values set on the product (in days)."
msgstr ""
+"Devam eden seri numaraları ve lotlar üzerindeki tarihleri izleyin: Önceki en iyi, çıkarılan, ömrünün bitmesi, uyarı.\n"
+"Bu tarihler ürün değerlerine bağlı olarak oluşturulan seri/lot numaralarında otomatik olarak ayarlanır."
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
@@ -5851,11 +5945,14 @@ msgid ""
" life, alert. Such dates are set automatically at lot/serial number creation"
" based on values set on the product (in days)."
msgstr ""
+"Devam eden seri numaraları ve lotlar üzerindeki tarihleri izleyin: Önceki en"
+" iyi, çıkarılan, ömrünün bitmesi, uyarı. Bu tarihler ürün değerlerine bağlı "
+"olarak oluşturulan seri/lot numaralarında otomatik olarak ayarlanır."
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Track product location in your warehouse"
-msgstr ""
+msgstr "Deponuzdaki ürün konumunu izleyin"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_product_product__tracking
@@ -6052,7 +6149,7 @@ msgstr "Varolan Lot/seri numaraları kullanın"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "Use your own routes and putaway strategies"
-msgstr ""
+msgstr "Kendi rotanızı ve yerleştirme stratejinizi kullanın"
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_picking_type__sequence
@@ -6256,6 +6353,12 @@ msgid ""
"finished product manual manufacturing order. In other cases, it is important"
" to use pull rules where you know where you are going based on a demand."
msgstr ""
+"Bir hareketin bir konuma öngörüldüğü zaman, itme kuralı bir sonraki konuma "
+"otomatik olarak bir hareket oluşturacaktır. Bu esas olarak sadece manuel "
+"işlemler oluştururken gereklidir, örn. 2/3 adımlı manuel satın alma siparişi"
+" veya 2/3 adımlı ürün manuel bitmiş ürün siparişi. Diğer durumlarda, talep "
+"üzerine nereye gideceğinizi bildiğiniz durumlarda çekme kurallarını "
+"kullanmak önemlidir."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_location_route__warehouse_selectable
@@ -6306,6 +6409,8 @@ msgid ""
"When the picking is not done this allows changing the initial demand. When "
"the picking is done this allows changing the done quantities."
msgstr ""
+"Toplama tamamlanmamış ise, başlangıç talebinin değişmesine izin verir. Eğer "
+"toplama tamamlanmış ise, tamamlanmış miktarların değişimine izin verir."
#. module: stock
#: model:ir.model.fields,help:stock.field_stock_warehouse_orderpoint__product_min_qty
@@ -6349,7 +6454,7 @@ msgstr ""
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_move__additional
msgid "Whether the move was added after the picking's confirmation"
-msgstr ""
+msgstr "Toplama onayından sonra hareket eklenip eklenmediği"
#. module: stock
#: model:ir.model.fields,field_description:stock.field_stock_return_picking_line__wizard_id
@@ -6372,6 +6477,11 @@ msgid ""
"valuate your stock or change its rounding precision to a smaller value "
"(example: 0.00001)."
msgstr ""
+"Ürün stoğunuz için kullandığınızdan daha küçük bir ölçü birimi "
+"kullanıyorsunuz. Bu ayrılan miktardaki yuvarlama problemine sebep olabilir! "
+"Stoğunuzu değerlendirmek ya da daha küçük bir değer için yuvarlama "
+"hassasiyetinizi daha küçük bir değere değiştirmek için, olabilecek daha "
+"küçük bir ölçü birimin kullanmalısınız. (örn: 0.00001)"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_routes_form
@@ -6395,6 +6505,9 @@ msgid ""
"stock move. If you need to change the type, you should first unreserve the "
"stock move."
msgstr ""
+"Stok hareketlerinde mevcut olarak ayrılmış bir ürün türünü "
+"değiştiremezsiniz. Eğer tür değişikliğine ihtiyacınız varsa, stok "
+"hareketlerinde ayrılmayan olarak belirlemelisiniz."
#. module: stock
#: code:addons/stock/models/product.py:510
@@ -6415,18 +6528,20 @@ msgid ""
"You can not delete product moves if the picking is done. You can only "
"correct the done quantities."
msgstr ""
+"Eğer toplanma tamamlanmışsa, ürün hareketini silemezsiniz. Sadece "
+"tamamlanmış miktarı düzeltebilirsiniz."
#. module: stock
#: code:addons/stock/models/stock_move_line.py:153
#, python-format
msgid "You can not enter negative quantities!"
-msgstr ""
+msgstr "Negatif miktar giremezsiniz!"
#. module: stock
#: code:addons/stock/models/stock_inventory.py:381
#, python-format
msgid "You can only adjust stockable products."
-msgstr ""
+msgstr "Sadece stoklanabilir ürünleri ayarlayabilirsiniz."
#. module: stock
#: code:addons/stock/models/stock_move.py:1077
@@ -6491,6 +6606,8 @@ msgid ""
"You cannot take products from or deliver products to a location of type "
"\"view\"."
msgstr ""
+"Ürünleri \"görünüm\" türündeki bir yere götüremez veya ürünlere teslim "
+"edemezsiniz."
#. module: stock
#: code:addons/stock/models/stock_move_line.py:128
@@ -6500,6 +6617,8 @@ msgid ""
"You cannot use the same serial number twice. Please correct the serial "
"numbers encoded."
msgstr ""
+"Aynı seri numarasını iki kere kullanamazsınız. Lütfen kodlanmış seri "
+"numarasını düzeltin."
#. module: stock
#: code:addons/stock/models/stock_picking.py:716
@@ -6550,7 +6669,7 @@ msgstr "İlk talepten daha az ürün işlediniz."
msgid ""
"You have processed more than what was initially\n"
" planned for the product"
-msgstr ""
+msgstr "Ürün için en başta ne planlandıysa bundan daha fazlasını yaptınız"
#. module: stock
#: code:addons/stock/models/product.py:304
@@ -6583,7 +6702,7 @@ msgstr ""
#: code:addons/stock/models/stock_location.py:96
#, python-format
msgid "You have to set a name for this location."
-msgstr ""
+msgstr "Bu konum için bir isim ayarlayın."
#. module: stock
#: code:addons/stock/wizard/stock_picking_return.py:46
@@ -6616,7 +6735,7 @@ msgstr ""
#: code:addons/stock/models/stock_move.py:1061
#, python-format
msgid "You should not put the contents of a package in different locations."
-msgstr ""
+msgstr "Farklı konumlara, bir paket içeriği koymamalısınız."
#. module: stock
#: code:addons/stock/models/product.py:371
@@ -6626,6 +6745,8 @@ msgid ""
"You still have some active reordering rules on this product. Please archive "
"or delete them first."
msgstr ""
+"Bu ürün için hala bazı aktif ihtiyaç kurallarınız var. Lütfen önce bunları "
+"silin ya da arşivleyin."
#. module: stock
#: code:addons/stock/models/stock_move.py:330
@@ -6669,7 +6790,7 @@ msgstr "gün"
#. module: stock
#: model:ir.ui.view,arch_db:stock.res_config_settings_view_form
msgid "days to be propagated"
-msgstr ""
+msgstr "Yayılma günleri"
#. module: stock
#: model:ir.ui.view,arch_db:stock.view_inventory_form
@@ -6695,12 +6816,12 @@ msgstr "örn. PO0032"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_warn_insufficient_qty_form_view
msgid "in"
-msgstr ""
+msgstr "içinde"
#. module: stock
#: model:ir.ui.view,arch_db:stock.stock_warn_insufficient_qty_form_view
msgid "is not available in sufficient quantity"
-msgstr ""
+msgstr "yeterli miktar mevcut değil"
#. module: stock
#: model:ir.ui.view,arch_db:stock.exception_on_picking
diff --git a/addons/stock/models/procurement.py b/addons/stock/models/procurement.py
index ba047badef8..fd08b362949 100644
--- a/addons/stock/models/procurement.py
+++ b/addons/stock/models/procurement.py
@@ -77,7 +77,7 @@ class ProcurementRule(models.Model):
data = self._get_stock_move_values(product_id, product_qty, product_uom, location_id, name, origin, values, group_id)
# Since action_confirm launch following procurement_group we should activate it.
- move = self.env['stock.move'].sudo().create(data)
+ move = self.env['stock.move'].sudo().with_context(force_company=data.get('company_id', False)).create(data)
move._action_confirm()
return True
diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py
index 4146e2ef586..75223abea24 100644
--- a/addons/stock/models/product.py
+++ b/addons/stock/models/product.py
@@ -411,8 +411,11 @@ class ProductTemplate(models.Model):
outgoing_qty = fields.Float(
'Outgoing', compute='_compute_quantities', search='_search_outgoing_qty',
digits=dp.get_precision('Product Unit of Measure'))
- location_id = fields.Many2one('stock.location', 'Location')
- warehouse_id = fields.Many2one('stock.warehouse', 'Warehouse')
+ # The goal of these fields is not to be able to search a location_id/warehouse_id but
+ # to properly make these fields "dummy": only used to put some keys in context from
+ # the search view in order to influence computed field
+ location_id = fields.Many2one('stock.location', 'Location', store=False, search=lambda operator, operand, vals: [])
+ warehouse_id = fields.Many2one('stock.warehouse', 'Warehouse', store=False, search=lambda operator, operand, vals: [])
route_ids = fields.Many2many(
'stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes',
domain=[('product_selectable', '=', True)],
@@ -504,7 +507,7 @@ class ProductTemplate(models.Model):
if 'uom_id' in vals:
new_uom = self.env['uom.uom'].browse(vals['uom_id'])
updated = self.filtered(lambda template: template.uom_id != new_uom)
- done_moves = self.env['stock.move'].search([('product_id', 'in', updated.mapped('product_variant_ids').ids)], limit=1)
+ done_moves = self.env['stock.move'].search([('product_id', 'in', updated.with_context(active_test=False).mapped('product_variant_ids').ids)], limit=1)
if done_moves:
raise UserError(_("You can not change the unit of measure of a product that has already been used in a done stock move. If you need to change the unit of measure, you may deactivate this product."))
if 'type' in vals and vals['type'] != 'product' and sum(self.mapped('nbr_reordering_rules')) != 0:
diff --git a/addons/stock/models/res_company.py b/addons/stock/models/res_company.py
index a310991cc17..58c61be714f 100644
--- a/addons/stock/models/res_company.py
+++ b/addons/stock/models/res_company.py
@@ -28,12 +28,18 @@ class Company(models.Model):
location.sudo().write({'company_id': company.id})
company.write({'internal_transit_location_id': location.id})
+ warehouses = self.env['stock.warehouse'].search([('partner_id', '=', self.partner_id.id)])
+ warehouses.mapped('partner_id').with_context(force_company=self.id).write({
+ 'property_stock_customer': location.id,
+ 'property_stock_supplier': location.id,
+ })
+
@api.model
def create(self, vals):
company = super(Company, self).create(vals)
- # multi-company rules prevents creating warehouse and sub-locations
+ company.create_transit_location()
+ # mutli-company rules prevents creating warehouse and sub-locations
self.env['stock.warehouse'].check_access_rights('create')
self.env['stock.warehouse'].sudo().create({'name': company.name, 'code': company.name[:5], 'company_id': company.id, 'partner_id': company.partner_id.id})
- company.create_transit_location()
return company
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py
index 1356e06b339..533deff87af 100644
--- a/addons/stock/models/stock_move.py
+++ b/addons/stock/models/stock_move.py
@@ -425,10 +425,10 @@ class StockMove(models.Model):
if propagated_date_field:
current_date = datetime.strptime(move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT)
new_date = datetime.strptime(vals.get(propagated_date_field), DEFAULT_SERVER_DATETIME_FORMAT)
- delta = relativedelta.relativedelta(new_date, current_date)
- if abs(delta.days) >= move.company_id.propagation_minimum_delta:
+ delta_days = (new_date - current_date).total_seconds() / 86400
+ if abs(delta_days) >= move.company_id.propagation_minimum_delta:
old_move_date = datetime.strptime(move.move_dest_ids[0].date_expected, DEFAULT_SERVER_DATETIME_FORMAT)
- new_move_date = (old_move_date + relativedelta.relativedelta(days=delta.days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+ new_move_date = (old_move_date + relativedelta.relativedelta(days=delta_days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
propagated_changes_dict['date_expected'] = new_move_date
#For pushed moves as well as for pulled moves, propagate by recursive call of write().
#Note that, for pulled moves we intentionally don't propagate on the procurement.
@@ -487,9 +487,19 @@ class StockMove(models.Model):
}
def _do_unreserve(self):
- if any(move.state in ('done', 'cancel') for move in self):
- raise UserError(_('You cannot unreserve a stock move that has been set to \'Done\'.'))
- self.mapped('move_line_ids').unlink()
+ moves_to_unreserve = self.env['stock.move']
+ for move in self:
+ if move.state == 'cancel':
+ # We may have cancelled move in an open picking in a "propagate_cancel" scenario.
+ continue
+ if move.state == 'done':
+ if move.scrapped:
+ # We may have done move in an open picking in a scrap scenario.
+ continue
+ else:
+ raise UserError(_('You cannot unreserve a stock move that has been set to \'Done\'.'))
+ moves_to_unreserve |= move
+ moves_to_unreserve.mapped('move_line_ids').unlink()
return True
def _push_apply(self):
@@ -590,7 +600,7 @@ class StockMove(models.Model):
# We are using propagate to False in order to not cancel destination moves merged in moves[0]
moves_to_unlink.write({'propagate': False})
moves_to_unlink._action_cancel()
- moves_to_unlink.unlink()
+ moves_to_unlink.sudo().unlink()
return (self | self.env['stock.move'].concat(*moves_to_merge)) - moves_to_unlink
def _get_relevant_state_among_moves(self):
@@ -804,7 +814,12 @@ class StockMove(models.Model):
}
if quantity:
uom_quantity = self.product_id.uom_id._compute_quantity(quantity, self.product_uom, rounding_method='HALF-UP')
- vals = dict(vals, product_uom_qty=uom_quantity)
+ uom_quantity_back_to_product_uom = self.product_uom._compute_quantity(uom_quantity, self.product_id.uom_id, rounding_method='HALF-UP')
+ rounding = self.env['decimal.precision'].precision_get('Product Unit of Measure')
+ if float_compare(quantity, uom_quantity_back_to_product_uom, precision_digits=rounding) == 0:
+ vals = dict(vals, product_uom_qty=uom_quantity)
+ else:
+ vals = dict(vals, product_uom_qty=quantity, product_uom_id=self.product_id.uom_id.id)
if reserved_quant:
vals = dict(
vals,
@@ -834,11 +849,20 @@ class StockMove(models.Model):
# is if the move's unit of measure's rounding does not allow fractional reservation. We chose
# to convert `taken_quantity` to the move's unit of measure with a down rounding method and
# then get it back in the quants unit of measure with an half-up rounding_method. This
- # way, we'll never reserve more than allowed.
- taken_quantity_move_uom = self.product_id.uom_id._compute_quantity(taken_quantity, self.product_uom, rounding_method='DOWN')
- taken_quantity = self.product_uom._compute_quantity(taken_quantity_move_uom, self.product_id.uom_id, rounding_method='HALF-UP')
+ # way, we'll never reserve more than allowed. We do not apply this logic if
+ # `available_quantity` is brought by a chained move line. In this case, `_prepare_move_line_vals`
+ # will take care of changing the UOM to the UOM of the product.
+ if not strict:
+ taken_quantity_move_uom = self.product_id.uom_id._compute_quantity(taken_quantity, self.product_uom, rounding_method='DOWN')
+ taken_quantity = self.product_uom._compute_quantity(taken_quantity_move_uom, self.product_id.uom_id, rounding_method='HALF-UP')
quants = []
+
+ if self.product_id.tracking == 'serial':
+ rounding = self.env['decimal.precision'].precision_get('Product Unit of Measure')
+ if float_compare(taken_quantity, int(taken_quantity), precision_digits=rounding) != 0:
+ taken_quantity = 0
+
try:
if not float_is_zero(taken_quantity, precision_rounding=self.product_id.uom_id.rounding):
quants = self.env['stock.quant']._update_reserved_quantity(
@@ -858,7 +882,7 @@ class StockMove(models.Model):
to_update = self.move_line_ids.filtered(lambda m: m.product_id.tracking != 'serial' and
m.location_id.id == reserved_quant.location_id.id and m.lot_id.id == reserved_quant.lot_id.id and m.package_id.id == reserved_quant.package_id.id and m.owner_id.id == reserved_quant.owner_id.id)
if to_update:
- to_update[0].with_context(bypass_reservation_update=True).product_uom_qty += self.product_id.uom_id._compute_quantity(quantity, self.product_uom, rounding_method='HALF-UP')
+ to_update[0].with_context(bypass_reservation_update=True).product_uom_qty += self.product_id.uom_id._compute_quantity(quantity, to_update[0].product_uom_id, rounding_method='HALF-UP')
else:
if self.product_id.tracking == 'serial':
for i in range(0, int(quantity)):
@@ -876,7 +900,7 @@ class StockMove(models.Model):
assigned_moves = self.env['stock.move']
partially_available_moves = self.env['stock.move']
for move in self.filtered(lambda m: m.state in ['confirmed', 'waiting', 'partially_available']):
- if move.location_id.usage in ('supplier', 'inventory', 'production', 'customer')\
+ if move.location_id.should_bypass_reservation()\
or move.product_id.type == 'consu':
# create the move line(s) but do not impact quants
if move.product_id.tracking == 'serial' and (move.picking_type_id.use_create_lots or move.picking_type_id.use_existing_lots):
@@ -1015,8 +1039,8 @@ class StockMove(models.Model):
# create the extra moves
extra_move_quantity = float_round(
self.quantity_done - self.product_uom_qty,
- precision_rounding=self.product_uom.rounding,
- rounding_method ='UP')
+ precision_rounding=rounding,
+ 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:
@@ -1086,7 +1110,7 @@ class StockMove(models.Model):
pass
# If you were already putting stock.move.lots on the next one in the work order, transfer those to the new move
- move.move_line_ids.filtered(lambda x: x.qty_done == 0.0).write({'move_id': new_move})
+ move.move_line_ids.filtered(lambda x: x.qty_done == 0.0).write({'move_id': new_move, 'product_uom_qty': 0})
move.move_line_ids._action_done()
# Check the consistency of the result packages; there should be an unique location across
# the contained quants.
diff --git a/addons/stock/models/stock_quant.py b/addons/stock/models/stock_quant.py
index 8352092bd1b..1cba8626c77 100644
--- a/addons/stock/models/stock_quant.py
+++ b/addons/stock/models/stock_quant.py
@@ -79,12 +79,6 @@ class StockQuant(models.Model):
if float_compare(quant.quantity, 1, precision_rounding=quant.product_uom_id.rounding) > 0 and quant.lot_id and quant.product_id.tracking == 'serial':
raise ValidationError(_('A serial number should only be linked to a single product.'))
- @api.constrains('in_date', 'lot_id')
- def check_in_date(self):
- for quant in self:
- if quant.in_date and not quant.lot_id:
- raise ValidationError(_('An incoming date cannot be set on an untracked product.'))
-
@api.constrains('location_id')
def check_location_id(self):
for quant in self:
@@ -109,9 +103,9 @@ class StockQuant(models.Model):
@api.model
def _get_removal_strategy_order(self, removal_strategy):
if removal_strategy == 'fifo':
- return 'in_date, id'
+ return 'in_date ASC NULLS FIRST, id'
elif removal_strategy == 'lifo':
- return 'in_date desc, id desc'
+ return 'in_date DESC NULLS LAST, id desc'
raise UserError(_('Removal strategy %s not implemented.') % (removal_strategy,))
def _gather(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, strict=False):
@@ -134,7 +128,17 @@ class StockQuant(models.Model):
domain = expression.AND([[('owner_id', '=', owner_id and owner_id.id or False)], domain])
domain = expression.AND([[('location_id', '=', location_id.id)], domain])
- return self.search(domain, order=removal_strategy_order)
+ # Copy code of _search for special NULLS FIRST/LAST order
+ self.sudo(self._uid).check_access_rights('read')
+ query = self._where_calc(domain)
+ self._apply_ir_rules(query, 'read')
+ from_clause, where_clause, where_clause_params = query.get_sql()
+ where_str = where_clause and (" WHERE %s" % where_clause) or ''
+ query_str = 'SELECT "%s".id FROM ' % self._table + from_clause + where_str + " ORDER BY "+ removal_strategy_order
+ self._cr.execute(query_str, where_clause_params)
+ res = self._cr.fetchall()
+ # No uniquify list necessary as auto_join is not applied anyways...
+ return self.browse([x[0] for x in res])
@api.model
def _get_available_quantity(self, product_id, location_id, lot_id=None, package_id=None, owner_id=None, strict=False, allow_negative=False):
@@ -196,17 +200,16 @@ class StockQuant(models.Model):
quants = self._gather(product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=True)
rounding = product_id.uom_id.rounding
- if lot_id:
- incoming_dates = quants.mapped('in_date') # `mapped` already filtered out falsy items
- incoming_dates = [fields.Datetime.from_string(incoming_date) for incoming_date in incoming_dates]
- if in_date:
- incoming_dates += [in_date]
- # If multiple incoming dates are available for a given lot_id/package_id/owner_id, we
- # consider only the oldest one as being relevant.
- if incoming_dates:
- in_date = fields.Datetime.to_string(min(incoming_dates))
- else:
- in_date = fields.Datetime.now()
+ incoming_dates = [d for d in quants.mapped('in_date') if d]
+ incoming_dates = [fields.Datetime.from_string(incoming_date) for incoming_date in incoming_dates]
+ if in_date:
+ incoming_dates += [in_date]
+ # If multiple incoming dates are available for a given lot_id/package_id/owner_id, we
+ # consider only the oldest one as being relevant.
+ if incoming_dates:
+ in_date = fields.Datetime.to_string(min(incoming_dates))
+ else:
+ in_date = fields.Datetime.now()
for quant in quants:
try:
@@ -253,13 +256,21 @@ class StockQuant(models.Model):
self = self.sudo()
rounding = product_id.uom_id.rounding
quants = self._gather(product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=strict)
- available_quantity = self._get_available_quantity(product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=strict)
- if float_compare(quantity, 0, precision_rounding=rounding) > 0 and float_compare(quantity, available_quantity, precision_rounding=rounding) > 0:
- raise UserError(_('It is not possible to reserve more products of %s than you have in stock.') % (', '.join(quants.mapped('product_id').mapped('display_name'))))
- elif float_compare(quantity, 0, precision_rounding=rounding) < 0 and float_compare(abs(quantity), sum(quants.mapped('reserved_quantity')), precision_rounding=rounding) > 0:
- raise UserError(_('It is not possible to unreserve more products of %s than you have in stock.') % (', '.join(quants.mapped('product_id').mapped('display_name'))))
-
reserved_quants = []
+
+ if float_compare(quantity, 0, precision_rounding=rounding) > 0:
+ # if we want to reserve
+ available_quantity = self._get_available_quantity(product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=strict)
+ if float_compare(quantity, available_quantity, precision_rounding=rounding) > 0:
+ raise UserError(_('It is not possible to reserve more products of %s than you have in stock.') % (', '.join(quants.mapped('product_id').mapped('display_name'))))
+ elif float_compare(quantity, 0, precision_rounding=rounding) < 0:
+ # if we want to unreserve
+ available_quantity = sum(quants.mapped('reserved_quantity'))
+ if float_compare(abs(quantity), available_quantity, precision_rounding=rounding) > 0:
+ raise UserError(_('It is not possible to unreserve more products of %s than you have in stock.') % (', '.join(quants.mapped('product_id').mapped('display_name'))))
+ else:
+ return reserved_quants
+
for quant in quants:
if float_compare(quantity, 0, precision_rounding=rounding) > 0:
max_quantity_on_quant = quant.quantity - quant.reserved_quantity
diff --git a/addons/stock/models/stock_traceability.py b/addons/stock/models/stock_traceability.py
index 633fb1b785e..9a9ec915e93 100644
--- a/addons/stock/models/stock_traceability.py
+++ b/addons/stock/models/stock_traceability.py
@@ -21,24 +21,28 @@ class MrpStockReport(models.TransientModel):
@api.model
def _get_move_lines(self, move_lines):
- res = self.env['stock.move.line']
- for move_line in move_lines:
+ lines_seen = move_lines
+ lines_todo = list(move_lines)
+ while lines_todo:
+ move_line = lines_todo.pop(0)
# if MTO
if move_line.move_id.move_orig_ids:
- res |= move_line.move_id.move_orig_ids.mapped('move_line_ids').filtered(
- lambda m: m.lot_id.id == move_line.lot_id.id)
+ lines = move_line.move_id.move_orig_ids.mapped('move_line_ids').filtered(
+ lambda m: m.lot_id == move_line.lot_id
+ ) - lines_seen
# if MTS
+ elif move_line:
+ lines = self.env['stock.move.line'].search([
+ ('product_id', '=', move_line.product_id.id),
+ ('lot_id', '=', move_line.lot_id.id),
+ ('id', 'not in', lines_seen.ids),
+ ('date', '<', move_line.date),
+ ])
else:
- if move_line:
- res |= self.env['stock.move.line'].search([
- ('product_id', '=', move_line.product_id.id),
- ('lot_id', '=', move_line.lot_id.id),
- ('id', '!=', move_line.id),
- ('date', '<', move_line.date),
- ])
- if res:
- res |= self._get_move_lines(res)
- return res
+ continue
+ lines_todo += list(lines)
+ lines_seen |= lines
+ return lines_seen - move_lines
@api.model
def get_lines(self, line_id=None, **kw):
diff --git a/addons/stock/models/stock_warehouse.py b/addons/stock/models/stock_warehouse.py
index cfbe6ffb7ac..c565d73a7a6 100644
--- a/addons/stock/models/stock_warehouse.py
+++ b/addons/stock/models/stock_warehouse.py
@@ -150,11 +150,14 @@ class Warehouse(models.Model):
# If another partner assigned
if vals.get('partner_id'):
warehouses._update_partner_data(vals['partner_id'], vals.get('company_id'))
+
res = super(Warehouse, self).write(vals)
# check if we need to delete and recreate route
if vals.get('reception_steps') or vals.get('delivery_steps'):
- warehouses._update_routes()
+ route_vals = warehouses._update_routes()
+ if route_vals:
+ self.write(route_vals)
if vals.get('resupply_wh_ids') and not vals.get('resupply_route_ids'):
for warehouse in warehouses:
@@ -175,9 +178,10 @@ class Warehouse(models.Model):
ResCompany = self.env['res.company']
if company_id:
transit_loc = ResCompany.browse(company_id).internal_transit_location_id.id
+ self.env['res.partner'].browse(partner_id).with_context(force_company=company_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc})
else:
transit_loc = ResCompany._company_default_get('stock.warehouse').internal_transit_location_id.id
- self.env['res.partner'].browse(partner_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc})
+ self.env['res.partner'].browse(partner_id).write({'property_stock_customer': transit_loc, 'property_stock_supplier': transit_loc})
def create_sequences_and_picking_types(self):
IrSequenceSudo = self.env['ir.sequence'].sudo()
@@ -280,7 +284,7 @@ class Warehouse(models.Model):
reception_route.pull_ids.write({'active': False})
reception_route.push_ids.write({'active': False})
else:
- reception_route = self.env['stock.location.route'].create(warehouse._get_reception_delivery_route_values(warehouse.reception_steps))
+ warehouse.reception_route_id = reception_route = self.env['stock.location.route'].create(warehouse._get_reception_delivery_route_values(warehouse.reception_steps))
# push / procurement (pull) rules for reception
routings = routes_data[warehouse.id][warehouse.reception_steps]
push_rules_list, pull_rules_list = warehouse._get_push_pull_rules_values(
@@ -593,11 +597,18 @@ class Warehouse(models.Model):
routes_data = self.get_routes_dict()
# change the default source and destination location and (de)activate operation types
self._update_picking_type()
- self._create_or_update_delivery_route(routes_data)
- self._create_or_update_reception_route(routes_data)
- self._create_or_update_crossdock_route(routes_data)
- self._create_or_update_mto_pull(routes_data)
- return True
+ delivery_route = self._create_or_update_delivery_route(routes_data)
+ reception_route = self._create_or_update_reception_route(routes_data)
+ crossdock_route = self._create_or_update_crossdock_route(routes_data)
+ mto_pull = self._create_or_update_mto_pull(routes_data)
+
+ return {
+ 'route_ids': [(4, route.id) for route in reception_route | delivery_route | crossdock_route],
+ 'mto_pull_id': mto_pull.id,
+ 'reception_route_id': reception_route.id,
+ 'delivery_route_id': delivery_route.id,
+ 'crossdock_route_id': crossdock_route.id,
+ }
@api.one
def _update_picking_type(self):
diff --git a/addons/stock/report/report_stockpicking_operations.xml b/addons/stock/report/report_stockpicking_operations.xml
index 850f5ad2e3d..724aea21c07 100644
--- a/addons/stock/report/report_stockpicking_operations.xml
+++ b/addons/stock/report/report_stockpicking_operations.xml
@@ -96,8 +96,8 @@
<span t-field="ml.product_id.description_picking"/>
</td>
<td>
- <span t-if="o.state != 'done'" t-esc="ml.product_uom_qty"/>
- <span t-if="o.state == 'done'" t-esc="ml.qty_done"/>
+ <span t-if="o.state != 'done'" t-field="ml.product_uom_qty"/>
+ <span t-if="o.state == 'done'" t-field="ml.qty_done"/>
<span t-field="ml.product_uom_id" groups="uom.group_uom"/>
</td>
<td width="20%" t-if="o.picking_type_id.code != 'incoming'">
diff --git a/addons/stock/tests/test_move.py b/addons/stock/tests/test_move.py
index 40d8ed02c3f..1692989f60e 100644
--- a/addons/stock/tests/test_move.py
+++ b/addons/stock/tests/test_move.py
@@ -1033,6 +1033,47 @@ class StockMove(TransactionCase):
move._action_done()
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.customer_location), 12.0)
+ def test_availability_7(self):
+ """ Check that, in the scenario where a move is in a bigger uom than the uom of the quants
+ and this uom only allows entire numbers, we only reserve quantity honouring the uom's
+ rounding even if the quantity is set across multiple quants.
+ """
+ # on the dozen uom, set the rounding set 1.0
+ self.uom_dozen.rounding = 1
+
+ # make 12 quants of 1
+ for i in range(1, 13):
+ lot_id = self.env['stock.production.lot'].create({
+ 'name': 'lot%s' % str(i),
+ 'product_id': self.product2.id,
+ })
+ self.env['stock.quant']._update_available_quantity(self.product2, self.stock_location, 1.0, lot_id=lot_id)
+
+ # the move should be reserved
+ move = self.env['stock.move'].create({
+ 'name': 'test_availability_7',
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'product_id': self.product2.id,
+ 'product_uom': self.uom_dozen.id,
+ 'product_uom_qty': 1,
+ })
+ move._action_confirm()
+ move._action_assign()
+ self.assertEqual(move.state, 'assigned')
+ self.assertEqual(len(move.move_line_ids.mapped('product_uom_id')), 1)
+ self.assertEqual(move.move_line_ids.mapped('product_uom_id'), self.uom_unit)
+
+ for move_line in move.move_line_ids:
+ move_line.qty_done = 1
+ move._action_done()
+
+ self.assertEqual(move.product_uom_qty, 1)
+ self.assertEqual(move.product_uom.id, self.uom_dozen.id)
+ self.assertEqual(move.state, 'done')
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.customer_location), 12.0)
+ self.assertEqual(len(self.env['stock.quant']._gather(self.product2, self.customer_location)), 12)
+
def test_unreserve_1(self):
""" Check that unreserving a stock move sets the products reserved as available and
set the state back to confirmed.
@@ -1228,6 +1269,47 @@ class StockMove(TransactionCase):
for quant in quants:
self.assertEqual(quant.reserved_quantity, 0)
+ def test_unreserve_6(self):
+ """ In a situation with a negative and a positive quant, reserve and unreserve.
+ """
+ q1 = self.env['stock.quant'].create({
+ 'product_id': self.product1.id,
+ 'location_id': self.stock_location.id,
+ 'quantity': -10,
+ 'reserved_quantity': 0,
+ })
+
+ q2 = self.env['stock.quant'].create({
+ 'product_id': self.product1.id,
+ 'location_id': self.stock_location.id,
+ 'quantity': 30.0,
+ 'reserved_quantity': 10.0,
+ })
+
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 10.0)
+
+ move1 = self.env['stock.move'].create({
+ 'name': 'test_unreserve_6',
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'product_id': self.product1.id,
+ 'product_uom': self.uom_unit.id,
+ 'product_uom_qty': 10.0,
+ })
+ move1._action_confirm()
+ move1._action_assign()
+ self.assertEqual(move1.state, 'assigned')
+ self.assertEqual(len(move1.move_line_ids), 1)
+ self.assertEqual(move1.move_line_ids.product_qty, 10)
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
+ self.assertEqual(q2.reserved_quantity, 20)
+
+ move1._do_unreserve()
+ self.assertEqual(move1.state, 'confirmed')
+ self.assertEqual(len(move1.move_line_ids), 0)
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 10.0)
+ self.assertEqual(q2.reserved_quantity, 10)
+
def test_link_assign_1(self):
""" Test the assignment mechanism when two chained stock moves try to move one unit of an
untracked product.
@@ -1635,7 +1717,10 @@ class StockMove(TransactionCase):
# the second move should not be reservable because of the rounding on the dozen
move_pack_cust._action_assign()
- self.assertEqual(move_pack_cust.state, 'waiting')
+ self.assertEqual(move_pack_cust.state, 'partially_available')
+ move_line_pack_cust = move_pack_cust.move_line_ids
+ self.assertEqual(move_line_pack_cust.product_uom_qty, 6)
+ self.assertEqual(move_line_pack_cust.product_uom_id.id, self.uom_unit.id)
# move a dozen on the backorder to see how we handle the extra move
backorder = self.env['stock.picking'].search([('backorder_id', '=', picking_stock_pack.id)])
@@ -1663,6 +1748,153 @@ class StockMove(TransactionCase):
# the second move should now be reservable
move_pack_cust._action_assign()
self.assertEqual(move_pack_cust.state, 'assigned')
+ self.assertEqual(move_line_pack_cust.product_uom_qty, 12)
+ self.assertEqual(move_line_pack_cust.product_uom_id.id, self.uom_unit.id)
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, move_stock_pack.location_dest_id), 6)
+
+ def test_link_assign_8(self):
+ """ Set the rounding of the dozen to 1.0, create a chain of two move for a dozen, the product
+ concerned is tracked by serial number. Check that the flow is ok.
+ """
+ # on the dozen uom, set the rounding set 1.0
+ self.uom_dozen.rounding = 1
+
+ # 6 units are available in stock
+ for i in range(1, 13):
+ lot_id = self.env['stock.production.lot'].create({
+ 'name': 'lot%s' % str(i),
+ 'product_id': self.product2.id,
+ })
+ self.env['stock.quant']._update_available_quantity(self.product2, self.stock_location, 1.0, lot_id=lot_id)
+
+ # create pickings and moves for a pick -> pack mto scenario
+ picking_stock_pack = self.env['stock.picking'].create({
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.pack_location.id,
+ 'picking_type_id': self.env.ref('stock.picking_type_internal').id,
+ })
+ move_stock_pack = self.env['stock.move'].create({
+ 'name': 'test_link_assign_7',
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.pack_location.id,
+ 'product_id': self.product2.id,
+ 'product_uom': self.uom_dozen.id,
+ 'product_uom_qty': 1.0,
+ 'picking_id': picking_stock_pack.id,
+ })
+ picking_pack_cust = self.env['stock.picking'].create({
+ 'location_id': self.pack_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'picking_type_id': self.env.ref('stock.picking_type_out').id,
+ })
+ move_pack_cust = self.env['stock.move'].create({
+ 'name': 'test_link_assign_7',
+ 'location_id': self.pack_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'product_id': self.product2.id,
+ 'product_uom': self.uom_dozen.id,
+ 'product_uom_qty': 1.0,
+ 'picking_id': picking_pack_cust.id,
+ })
+ move_stock_pack.write({'move_dest_ids': [(4, move_pack_cust.id, 0)]})
+ move_pack_cust.write({'move_orig_ids': [(4, move_stock_pack.id, 0)]})
+ (move_stock_pack + move_pack_cust)._action_confirm()
+
+ move_stock_pack._action_assign()
+ self.assertEqual(move_stock_pack.state, 'assigned')
+ move_pack_cust._action_assign()
+ self.assertEqual(move_pack_cust.state, 'waiting')
+
+ for ml in move_stock_pack.move_line_ids:
+ ml.qty_done = 1
+ picking_stock_pack.button_validate()
+ self.assertEqual(move_pack_cust.state, 'assigned')
+ for ml in move_pack_cust.move_line_ids:
+ self.assertEqual(ml.product_uom_qty, 1)
+ self.assertEqual(ml.product_uom_id.id, self.uom_unit.id)
+ self.assertTrue(bool(ml.lot_id.id))
+
+ def test_link_assign_9(self):
+ """ Create an uom "3 units" which is 3 times the units but without rounding. Create 3
+ quants in stock and two chained moves. The first move will bring the 3 quants but the
+ second only validate 2 and create a backorder for the last one. Check that the reservation
+ is correctly cleared up for the last one.
+ """
+ uom_3units = self.env['uom.uom'].create({
+ 'name': '3 units',
+ 'category_id': self.uom_unit.category_id.id,
+ 'factor_inv': 3,
+ 'rounding': 1,
+ 'uom_type': 'bigger',
+ })
+ for i in range(1, 4):
+ lot_id = self.env['stock.production.lot'].create({
+ 'name': 'lot%s' % str(i),
+ 'product_id': self.product2.id,
+ })
+ self.env['stock.quant']._update_available_quantity(self.product2, self.stock_location, 1.0, lot_id=lot_id)
+
+ picking_stock_pack = self.env['stock.picking'].create({
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.pack_location.id,
+ 'picking_type_id': self.env.ref('stock.picking_type_internal').id,
+ })
+ move_stock_pack = self.env['stock.move'].create({
+ 'name': 'test_link_assign_9',
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.pack_location.id,
+ 'product_id': self.product2.id,
+ 'product_uom': uom_3units.id,
+ 'product_uom_qty': 1.0,
+ 'picking_id': picking_stock_pack.id,
+ })
+ picking_pack_cust = self.env['stock.picking'].create({
+ 'location_id': self.pack_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'picking_type_id': self.env.ref('stock.picking_type_out').id,
+ })
+ move_pack_cust = self.env['stock.move'].create({
+ 'name': 'test_link_assign_0',
+ 'location_id': self.pack_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'product_id': self.product2.id,
+ 'product_uom': uom_3units.id,
+ 'product_uom_qty': 1.0,
+ 'picking_id': picking_pack_cust.id,
+ })
+ move_stock_pack.write({'move_dest_ids': [(4, move_pack_cust.id, 0)]})
+ move_pack_cust.write({'move_orig_ids': [(4, move_stock_pack.id, 0)]})
+ (move_stock_pack + move_pack_cust)._action_confirm()
+
+ picking_stock_pack.action_assign()
+ for ml in picking_stock_pack.move_lines.move_line_ids:
+ ml.qty_done = 1
+ picking_stock_pack.button_validate()
+ self.assertEqual(picking_pack_cust.state, 'assigned')
+ for ml in picking_pack_cust.move_lines.move_line_ids:
+ if ml.lot_id.name != 'lot3':
+ ml.qty_done = 1
+ res_dict_for_back_order = picking_pack_cust.button_validate()
+ backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id'))
+ backorder_wizard.with_context(debug=True).process()
+ backorder = self.env['stock.picking'].search([('backorder_id', '=', picking_pack_cust.id)])
+ backordered_ml = backorder.move_line_ids
+ quant_lot3 = self.env['stock.quant'].search([('lot_id', '=', backordered_ml.lot_id.id)])
+
+ # due to the rounding, the backordered quantity is 0.999 ; we shoudln't be able to reserve
+ # 0.999 on a tracked by serial number quant
+ self.assertEqual(backordered_ml.product_uom_qty, 0)
+ self.assertTrue(backordered_ml.lot_id)
+
+ # force the serial number and validate
+ backordered_ml.qty_done = 1
+
+ overprocessed_wizard = backorder.button_validate()
+ overprocessed_wizard = self.env['stock.overprocessed.transfer'].browse(overprocessed_wizard['res_id'])
+ overprocessed_wizard.action_confirm()
+
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.customer_location), 3)
+ self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.pack_location), 0)
def test_use_unreserved_move_line_1(self):
""" Test that validating a stock move linked to an untracked product reserved by another one
@@ -3465,39 +3697,6 @@ class StockMove(TransactionCase):
self.assertEqual(self.product1.qty_available, 5.0)
self.assertEqual(self.product1.with_context(company_owned=True).qty_available, 10.0)
- def test_split_1(self):
- """ When we split a move line and having one without quantity done, we want to keep reservation
- on the new one as it has not been unreserved during the copy.
- """
- move1 = self.env['stock.move'].create({
- 'name': 'test_split_1',
- 'location_id': self.stock_location.id,
- 'location_dest_id': self.customer_location.id,
- 'product_id': self.product1.id,
- 'product_uom': self.uom_unit.id,
- 'product_uom_qty': 10.0,
- 'picking_type_id': self.env.ref('stock.picking_type_in').id,
- })
-
- self.env['stock.quant']._update_available_quantity(self.product1, self.stock_location, 10)
-
- move1._action_confirm()
- move1._action_assign()
- move_line = move1.move_line_ids
-
- default = {'product_uom_qty': 3,
- 'qty_done': 3}
- move_line.copy(default=default)
- move_line.with_context(bypass_reservation_update=True).write({'product_uom_qty': 7, 'qty_done': 0})
- move1._action_done()
-
- new_move = self.env['stock.move'].search([('name', '=', 'test_split_1'), ('state', '=', 'confirmed')])
-
- self.assertEqual(move1.move_line_ids.product_uom_qty, 0.0)
- self.assertEqual(move1.move_line_ids.qty_done, 3.0)
- self.assertEqual(new_move.move_line_ids.product_uom_qty, 7.0)
- self.assertEqual(new_move.move_line_ids.qty_done, 0.0)
-
def test_edit_initial_demand_1(self):
""" Increase initial demand once everything is reserved and check if
the existing move_line is updated.
diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py
index c3cd620a2ac..e827bea8213 100644
--- a/addons/stock/tests/test_move2.py
+++ b/addons/stock/tests/test_move2.py
@@ -1059,6 +1059,39 @@ class TestSinglePicking(TestStockCommon):
for move in delivery.move_lines:
self.assertEqual(move.quantity_done, move.product_uom_qty, 'Initial demand should be equals to quantity done')
+ def test_extra_move_5(self):
+ """ Create a picking a move that is problematic with
+ rounding (5.95 - 5.5 = 0.4500000000000002). Ensure that
+ initial demand is corrct afer action_done and backoder
+ are not created.
+ """
+ delivery = self.env['stock.picking'].create({
+ 'location_id': self.stock_location,
+ 'location_dest_id': self.customer_location,
+ 'partner_id': self.partner_delta_id,
+ 'picking_type_id': self.picking_type_out,
+ })
+ product = self.kgB
+ self.MoveObj.create({
+ 'name': product.name,
+ 'product_id': product.id,
+ 'product_uom_qty': 5.5,
+ 'quantity_done': 5.95,
+ 'product_uom': product.uom_id.id,
+ 'picking_id': delivery.id,
+ 'location_id': self.stock_location,
+ 'location_dest_id': self.customer_location,
+ })
+ stock_location = self.env['stock.location'].browse(self.stock_location)
+ self.env['stock.quant']._update_available_quantity(product, stock_location, 5.5)
+ delivery.action_confirm()
+ delivery.action_assign()
+ delivery.action_done()
+ self.assertEqual(delivery.move_lines.product_uom_qty, 5.95, 'Move initial demand should be 5.95')
+
+ back_order = self.env['stock.picking'].search([('backorder_id', '=', delivery.id)])
+ self.assertFalse(back_order, 'There should be no back order')
+
def test_recheck_availability_1(self):
""" Check the good behavior of check availability. I create a DO for 2 unit with
only one in stock. After the first check availability, I should have 1 reserved
diff --git a/addons/stock/tests/test_quant.py b/addons/stock/tests/test_quant.py
index baebfc1de9d..98e1627451c 100644
--- a/addons/stock/tests/test_quant.py
+++ b/addons/stock/tests/test_quant.py
@@ -628,7 +628,24 @@ class StockQuant(TransactionCase):
})
quantity, in_date = self.env['stock.quant']._update_available_quantity(product1, stock_location, 1.0)
self.assertEqual(quantity, 1)
- self.assertEqual(in_date, None)
+ self.assertNotEqual(in_date, None)
+
+
+ def test_in_date_1b(self):
+ stock_location = self.env.ref('stock.stock_location_stock')
+ product1 = self.env['product.product'].create({
+ 'name': 'Product A',
+ 'type': 'product',
+ })
+ self.env['stock.quant'].create({
+ 'product_id': product1.id,
+ 'location_id': stock_location.id,
+ 'quantity': 1.0,
+ })
+ quantity, in_date = self.env['stock.quant']._update_available_quantity(product1, stock_location, 2.0)
+ self.assertEqual(quantity, 3)
+ self.assertNotEqual(in_date, None)
+
def test_in_date_2(self):
""" Check that an incoming date is correctly set when updating the quantity of a tracked
@@ -706,6 +723,34 @@ class StockQuant(TransactionCase):
# Removal strategy is LIFO, so lot1 should be received as it was received later.
self.assertEqual(quants[0][0].lot_id.id, lot1.id)
+ def test_in_date_4b(self):
+ """ Check for LIFO and max with/without in_date that it handles the LIFO NULLS LAST well
+ """
+ stock_location = self.env.ref('stock.stock_location_stock')
+ stock_location1 = self.env.ref('stock.stock_location_components')
+ stock_location2 = self.env.ref('stock.stock_location_14')
+ lifo_strategy = self.env['product.removal'].search([('method', '=', 'lifo')])
+ stock_location.removal_strategy_id = lifo_strategy
+ product1 = self.env['product.product'].create({
+ 'name': 'Product A',
+ 'type': 'product',
+ 'tracking': 'serial',
+ })
+
+ self.env['stock.quant'].create({
+ 'product_id': product1.id,
+ 'location_id': stock_location1.id,
+ 'quantity': 1.0,
+ })
+
+ in_date_location2 = datetime.now()
+ self.env['stock.quant']._update_available_quantity(product1, stock_location2, 1.0, in_date=in_date_location2)
+
+ quants = self.env['stock.quant']._update_reserved_quantity(product1, stock_location, 1)
+
+ # Removal strategy is LIFO, so the one with date is the most recent one and should be selected
+ self.assertEqual(quants[0][0].location_id.id, stock_location2.id)
+
def test_in_date_5(self):
""" Receive the same lot at different times, once they're in the same location, the quants
are merged and only the earliest incoming date is kept.
diff --git a/addons/stock/views/product_views.xml b/addons/stock/views/product_views.xml
index 25474fce946..f59ae7baf5c 100644
--- a/addons/stock/views/product_views.xml
+++ b/addons/stock/views/product_views.xml
@@ -338,7 +338,7 @@
<menuitem id="menu_product_variant_config_stock" name="Products" action="product_template_action_product"
parent="stock.menu_stock_inventory_control" sequence="1"/>
<menuitem id="product_product_menu" name="Product Variants" action="product.product_normal_action"
- parent="menu_stock_inventory_control" sequence="2" groups="base.group_no_one"/>
+ parent="menu_stock_inventory_control" sequence="2" groups="product.group_product_variant"/>
<menuitem id="menu_product_packagings" name="Product Packagings" parent="stock.menu_product_in_config_stock" action="product.action_packaging_view" groups="product.group_stock_packaging"/>
</data>
diff --git a/addons/stock_account/i18n/tr.po b/addons/stock_account/i18n/tr.po
index 28995f7d032..e35c1661e90 100644
--- a/addons/stock_account/i18n/tr.po
+++ b/addons/stock_account/i18n/tr.po
@@ -11,13 +11,14 @@
# gezgin biri <gezginbiri@hotmail.com>, 2017
# Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017
# Fırat Kaya <firat.kaya@mechsoft.com.tr>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:09+0000\n"
"PO-Revision-Date: 2018-03-22 14:09+0000\n"
-"Last-Translator: Fırat Kaya <firat.kaya@mechsoft.com.tr>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,7 +34,7 @@ msgstr "Muhasebe Kaydı"
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_stock_move__account_move_ids
msgid "Account Move"
-msgstr ""
+msgstr "Hesap Hareketi"
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.view_category_property_form
@@ -61,13 +62,13 @@ msgstr ""
#. module: stock_account
#: selection:product.category,property_valuation:0
msgid "Automated"
-msgstr ""
+msgstr "Otomatikleşmiş"
#. module: stock_account
#: selection:product.category,property_cost_method:0
#: selection:product.template,property_cost_method:0
msgid "Average Cost (AVCO)"
-msgstr ""
+msgstr "Ortalama Maliyet (AVCO)"
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.view_change_standard_price
@@ -114,6 +115,8 @@ msgid ""
"Changing your cost method is an important change that will impact your "
"inventory valuation. Are you sure you want to make that change?"
msgstr ""
+"Maliyet yönteminizi değiştirmek, stok değerlerinize önemli etki yapabilecek "
+"bir değişikliktir."
#. module: stock_account
#: model:ir.model.fields,help:stock_account.field_stock_inventory__accounting_date
@@ -148,7 +151,7 @@ msgstr "Maliyet Yöntemi"
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.res_config_settings_view_form
msgid "Costing"
-msgstr ""
+msgstr "Malyetlendirme"
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_product_category__property_cost_method
@@ -196,7 +199,7 @@ msgstr "Görünüm Adı"
#: selection:product.category,property_cost_method:0
#: selection:product.template,property_cost_method:0
msgid "First In First Out (FIFO)"
-msgstr ""
+msgstr "First in First Out (FIFO)"
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_stock_inventory__accounting_date
@@ -220,7 +223,7 @@ msgstr ""
#. module: stock_account
#: model:ir.actions.act_window,help:stock_account.product_valuation_action
msgid "If there are products, you will see its name and valuation."
-msgstr ""
+msgstr "Eğer burada ürünler varsa, adını ve değerini göreceksiniz."
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.res_config_settings_view_form
@@ -290,6 +293,7 @@ msgid ""
"Manual: The accounting entries to value the inventory are not posted automatically.\n"
" Automated: An accounting entry is automatically created to value the inventory when a product enters or leaves the company."
msgstr ""
+"Manuel: Stok değer veren muhasebe kayıtları,otomatik olarak postalanmaz."
#. module: stock_account
#: model:ir.model.fields,help:stock_account.field_product_category__property_valuation
@@ -298,6 +302,8 @@ msgid ""
" Automated: An accounting entry is automatically created to value the inventory when a product enters or leaves the company.\n"
" "
msgstr ""
+"Manuel: Stok değeri veren muhasebe kayıtları,otomatik olarak postalanmaz. \n"
+"Otomatik: Bir ürün şirkete girdiğinde veya şirketten ayrıldığında envantere değer vermek için otomatik olarak bir muhasebe girişi oluşturulur. "
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.view_move_tree_valuation
@@ -412,6 +418,7 @@ msgid ""
" Average Cost (AVCO): The products are valued at weighted average cost.\n"
" First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first."
msgstr ""
+"Standart Fiyat : Ürünler tanımlanan standart maliyetlerine göre değerlenir."
#. module: stock_account
#: model:ir.model.fields,help:stock_account.field_product_category__property_cost_method
@@ -421,6 +428,9 @@ msgid ""
" First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first.\n"
" "
msgstr ""
+"Standart Fiyat : Ürünler tanımlanan standart maliyetlerine göre değerlenir.\n"
+"Ortalama Maliyet (AVCO): Ürünler ağırlıklı ortalama maliyetine göre değerlenir.\n"
+"First in First Out (FIFO): Ürünler, şirkete önce girenlerin, ilk önce de bırakacaklarını var sayar."
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_product_category__property_stock_account_input_categ_id
@@ -461,7 +471,7 @@ msgstr "Stok Çıkış Hesabı"
#: model:ir.ui.view,arch_db:stock_account.view_move_tree_valuation
#: model:ir.ui.view,arch_db:stock_account.view_template_property_form
msgid "Stock Valuation"
-msgstr ""
+msgstr "Stok Değerleme"
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_product_category__property_stock_valuation_account_id
@@ -481,7 +491,7 @@ msgstr "Stok Değerleme Hesabı (Çıkan)"
#. module: stock_account
#: model:ir.actions.server,name:stock_account.action_stock_account_valuation_report
msgid "Stock Valuation Report"
-msgstr ""
+msgstr "Stok Değerleme Raporu"
#. module: stock_account
#: model:ir.model,name:stock_account.model_account_chart_template
@@ -503,6 +513,8 @@ msgid ""
"The move lines are not in a consistent state: some are entering and other "
"are leaving the company. "
msgstr ""
+"Hareket satırları istikrarlı bir durumda değildir: Bazıları girilir, "
+"diğerleri şirketten ayrılır."
#. module: stock_account
#: code:addons/stock_account/models/stock.py:343
@@ -512,6 +524,9 @@ msgid ""
"intercompany in a single step while they should go through the intercompany "
"transit location."
msgstr ""
+"Hareket çizgileri tutarlı bir durumda değil: şirketler arası geçiş "
+"konumundan geçmeleri gerektiğinde tek bir adımda şirketler arası ilişkiler "
+"yapıyorlar."
#. module: stock_account
#: code:addons/stock_account/models/stock.py:341
@@ -520,12 +535,14 @@ msgid ""
"The move lines are not in a consistent states: they do not share the same "
"origin or destination company."
msgstr ""
+"Hareket satırları istikrarlı bir durumda değil: aynı başlangıcı ya da hedefi"
+" paylaşmıyorlar. "
#. module: stock_account
#: model:ir.model.fields,field_description:stock_account.field_stock_move__to_refund
#: model:ir.model.fields,field_description:stock_account.field_stock_return_picking_line__to_refund
msgid "To Refund (update SO/PO)"
-msgstr ""
+msgstr "İade (Satış/Satın Alma Siparişlerinde İade)"
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.product_valuation_tree
@@ -539,6 +556,8 @@ msgid ""
"Trigger a decrease of the delivered/received quantity in the associated Sale"
" Order/Purchase Order"
msgstr ""
+"ilişkili Satış/Satın Alma Siparişinde ki teslimat/alınan miktarındaki düşüşü"
+" tetikle."
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.view_move_tree_valuation
@@ -548,7 +567,7 @@ msgstr "Ölçü Birimi"
#. module: stock_account
#: model:ir.ui.view,arch_db:stock_account.view_template_property_form
msgid "Update Cost"
-msgstr ""
+msgstr "Maliyeti Güncelle"
#. module: stock_account
#: model:ir.model.fields,help:stock_account.field_stock_location__valuation_in_account_id
diff --git a/addons/stock_account/models/stock.py b/addons/stock_account/models/stock.py
index 8d655206a3d..f7bdf08ffea 100644
--- a/addons/stock_account/models/stock.py
+++ b/addons/stock_account/models/stock.py
@@ -260,7 +260,7 @@ class StockMove(models.Model):
# Update the standard price with the price of the last used candidate, if any.
if new_standard_price and move.product_id.cost_method == 'fifo':
- move.product_id.standard_price = new_standard_price
+ move.product_id.sudo().standard_price = new_standard_price
# If there's still quantity to value but we're out of candidates, we fall in the
# negative stock use case. We chose to value the out move at the price of the
@@ -312,7 +312,9 @@ class StockMove(models.Model):
self.write(vals)
elif self._is_out():
valued_move_lines = self.move_line_ids.filtered(lambda ml: ml.location_id._should_be_valued() and not ml.location_dest_id._should_be_valued() and not ml.owner_id)
- valued_quantity = sum(valued_move_lines.mapped('qty_done'))
+ valued_quantity = 0
+ for valued_move_line in valued_move_lines:
+ valued_quantity += valued_move_line.product_uom_id._compute_quantity(valued_move_line.qty_done, self.product_id.uom_id)
self.env['stock.move']._run_fifo(self, quantity=quantity)
if self.product_id.cost_method in ['standard', 'average']:
curr_rounding = self.company_id.currency_id.rounding
@@ -370,6 +372,7 @@ class StockMove(models.Model):
product_tot_qty_available = move.product_id.qty_available + tmpl_dict[move.product_id.id]
rounding = move.product_id.uom_id.rounding
+ qty_done = 0.0
if float_is_zero(product_tot_qty_available, precision_rounding=rounding):
new_std_price = move._get_price_unit()
elif float_is_zero(product_tot_qty_available + move.product_qty, precision_rounding=rounding):
@@ -377,10 +380,11 @@ class StockMove(models.Model):
else:
# Get the standard price
amount_unit = std_price_update.get((move.company_id.id, move.product_id.id)) or move.product_id.standard_price
- qty = forced_qty or move.product_qty
- new_std_price = ((amount_unit * product_tot_qty_available) + (move._get_price_unit() * qty)) / (product_tot_qty_available + move.product_qty)
+ qty_done = move.product_uom._compute_quantity(move.quantity_done, move.product_id.uom_id)
+ qty = forced_qty or qty_done
+ new_std_price = ((amount_unit * product_tot_qty_available) + (move._get_price_unit() * qty)) / (product_tot_qty_available + qty_done)
- tmpl_dict[move.product_id.id] += move.product_qty
+ tmpl_dict[move.product_id.id] += qty_done
# Write the standard price, as SUPERUSER_ID because a warehouse manager may not have the right to write on products
move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': new_std_price})
std_price_update[move.company_id.id, move.product_id.id] = new_std_price
@@ -523,17 +527,6 @@ class StockMove(models.Model):
raise UserError(_("The cost of %s is currently equal to 0. Change the cost or the configuration of your product to avoid an incorrect valuation.") % (self.product_id.name,))
credit_value = debit_value
- if self.product_id.cost_method == 'average' and self.company_id.anglo_saxon_accounting:
- # in case of a supplier return in anglo saxon mode, for products in average costing method, the stock_input
- # account books the real purchase price, while the stock account books the average price. The difference is
- # booked in the dedicated price difference account.
- if self.location_dest_id.usage == 'supplier' and self.origin_returned_move_id and self.origin_returned_move_id.purchase_line_id:
- debit_value = self.origin_returned_move_id.price_unit * qty
- # in case of a customer return in anglo saxon mode, for products in average costing method, the stock valuation
- # is made using the original average price to negate the delivery effect.
- if self.location_id.usage == 'customer' and self.origin_returned_move_id:
- debit_value = self.origin_returned_move_id.price_unit * qty
- credit_value = debit_value
valuation_partner_id = self._get_partner_id_for_valuation_lines()
res = [(0, 0, line_vals) for line_vals in self._generate_valuation_lines_data(valuation_partner_id, qty, debit_value, credit_value, debit_account_id, credit_account_id).values()]
@@ -617,7 +610,7 @@ class StockMove(models.Model):
move_lines = self.with_context(forced_ref=ref)._prepare_account_move_line(quantity, abs(self.value), credit_account_id, debit_account_id)
if move_lines:
date = self._context.get('force_period_date', fields.Date.context_today(self))
- new_account_move = AccountMove.create({
+ new_account_move = AccountMove.sudo().create({
'journal_id': journal_id,
'line_ids': move_lines,
'date': date,
diff --git a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
index 3732cddbd7b..b2e3bd0d095 100644
--- a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
+++ b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
@@ -3,6 +3,7 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo import fields
class ValuationReconciliationTestCase(AccountingTestCase):
""" Base class for tests checking interim accounts reconciliation works
@@ -24,13 +25,20 @@ class ValuationReconciliationTestCase(AccountingTestCase):
else:
self.assertFalse(valuation_line.full_reconcile_id, "The reconciliation should not be total at that point.")
- def _process_pickings(self, pickings, quantity=False):
+ def _process_pickings(self, pickings, date=False, quantity=False):
+ if not date:
+ date = fields.Date.today()
pickings.action_confirm()
pickings.action_assign()
for picking in pickings:
for ml in picking.move_line_ids:
ml.qty_done = quantity or ml.product_qty
pickings.action_done()
+ self._change_pickings_date(pickings, date)
+
+ def _change_pickings_date(self, pickings, date):
+ pickings.mapped('move_lines').write({'date': date})
+ pickings.mapped('move_lines.account_move_ids').write({'date': date})
def _create_product_category(self):
return self.env['product.category'].create({
@@ -54,6 +62,7 @@ class ValuationReconciliationTestCase(AccountingTestCase):
'currency_id': self.currency_one.id,
'company_id': self.company.id,
'rate': 1.234343354, # Totally arbitratry value
+ 'name': '2017-01-01',
})
self.input_account = self.env['account.account'].create({
diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py
index f12ba5d8bb1..5bba1036eab 100644
--- a/addons/stock_account/tests/test_stockvaluation.py
+++ b/addons/stock_account/tests/test_stockvaluation.py
@@ -2522,6 +2522,39 @@ class TestStockValuation(TransactionCase):
move2.move_line_ids.qty_done = 0
self.assertEqual(self.product1.stock_value, -187.5)
+ def test_average_perpetual_4(self):
+ self.product1.product_tmpl_id.cost_method = 'average'
+
+ move1 = self.env['stock.move'].create({
+ 'name': 'Receive 1 unit at 10',
+ 'location_id': self.supplier_location.id,
+ 'location_dest_id': self.stock_location.id,
+ 'product_id': self.product1.id,
+ 'product_uom': self.uom_unit.id,
+ 'product_uom_qty': 1.0,
+ 'price_unit': 10,
+ })
+ move1._action_confirm()
+ move1._action_assign()
+ move1.move_line_ids.qty_done = 1.0
+ move1._action_done()
+
+ move2 = self.env['stock.move'].create({
+ 'name': 'Receive 3 units at 5',
+ 'location_id': self.supplier_location.id,
+ 'location_dest_id': self.stock_location.id,
+ 'product_id': self.product1.id,
+ 'product_uom': self.uom_unit.id,
+ 'product_uom_qty': 3.0,
+ 'price_unit': 5,
+ })
+ move2._action_confirm()
+ move2._action_assign()
+ move2.move_line_ids.qty_done = 1.0
+ move2._action_done()
+
+ self.assertAlmostEqual(self.product1.standard_price, 7.5)
+
def test_average_negative_1(self):
""" Test edit in the past. Receive 10, send 20, edit the second move to only send 10.
"""
diff --git a/addons/stock_landed_costs/i18n/tr.po b/addons/stock_landed_costs/i18n/tr.po
index 9da45985e24..f65bb56ac38 100644
--- a/addons/stock_landed_costs/i18n/tr.po
+++ b/addons/stock_landed_costs/i18n/tr.po
@@ -12,13 +12,14 @@
# Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017
# Ramiz Deniz Öner <deniz@denizoner.com>, 2017
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -112,6 +113,8 @@ msgid ""
"Cost and adjustments lines do not match. You should maybe recompute the "
"landed costs."
msgstr ""
+"Maliyet ve ayarlama satırları eşleşmiyor. Belki de teslim alma maliyetlerini"
+" yeniden hesaplamalısınız."
#. module: stock_landed_costs
#: model:ir.actions.act_window,help:stock_landed_costs.action_stock_landed_cost
@@ -183,6 +186,11 @@ msgid ""
"By Weight : Cost will be divided depending on its weight.\n"
"By Volume : Cost will be divided depending on its volume."
msgstr ""
+"Eşit: Maliyet eşit olarak ayrılır.\n"
+"Miktar: Maliyet ürünlerin miktarına göre ayrılır.\n"
+"Mevcut Maliyet: Maliyet ürünlerin mevcut maliyetine göre ayrılır.\n"
+"Ağırlık: Maliyet ağırlığa bağlı olarak ayrılır.\n"
+"Hacim: Maliyet hacme bağlı olarak ayrılır."
#. module: stock_landed_costs
#: model:ir.model.fields,field_description:stock_landed_costs.field_stock_valuation_adjustment_lines__final_cost
@@ -225,7 +233,7 @@ msgstr "Envanter Değeri"
#: model:ir.model.fields,field_description:stock_landed_costs.field_product_product__landed_cost_ok
#: model:ir.model.fields,field_description:stock_landed_costs.field_product_template__landed_cost_ok
msgid "Is a Landed Cost"
-msgstr ""
+msgstr "Bir maliyet yüklemesi mi"
#. module: stock_landed_costs
#: model:ir.model.fields,field_description:stock_landed_costs.field_stock_landed_cost__description
@@ -320,6 +328,8 @@ msgstr "Yeni"
msgid ""
"No valuation adjustments lines. You should maybe recompute the landed costs."
msgstr ""
+"Değerleme ayarlama satırı yok. Belki maliyet yüklemeyi tekrar "
+"hesaplamalısınız."
#. module: stock_landed_costs
#: code:addons/stock_landed_costs/models/stock_landed_cost.py:87
@@ -417,6 +427,10 @@ msgid ""
" time valuation with real price costing method. Please make sure it is the "
"case, or you selected the correct picking"
msgstr ""
+"Seçilen toplama maliyet yüklemeye etki edebilen bir hareket içermez. Maliyet"
+" yükleme, sadece gerçek zamanlı fiyat yöntemi ile gerçek zamanlı "
+"değerlemenin ürün yapılandırması ile mümkündür. Lütfen durumun doğru "
+"olduğundan veya doğru toplamayı seçtiğinizden emin olun ."
#. module: stock_landed_costs
#: model:ir.model.fields,field_description:stock_landed_costs.field_stock_landed_cost__amount_total
diff --git a/addons/stock_picking_batch/i18n/tr.po b/addons/stock_picking_batch/i18n/tr.po
index b7359c9f7a7..b3cdbdccff0 100644
--- a/addons/stock_picking_batch/i18n/tr.po
+++ b/addons/stock_picking_batch/i18n/tr.po
@@ -9,13 +9,14 @@
# Martin Trigaux, 2017
# Güven YILMAZ <guvenyilmaz@outlook.com.tr>, 2017
# Ramiz Deniz Öner <deniz@denizoner.com>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Ramiz Deniz Öner <deniz@denizoner.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -38,7 +39,7 @@ msgstr "Transferleri toplu transfere ekle"
#: model:ir.actions.act_window,name:stock_picking_batch.stock_picking_to_batch_action_stock_picking
#: model:ir.ui.view,arch_db:stock_picking_batch.stock_picking_to_batch_form
msgid "Add to Batch"
-msgstr ""
+msgstr "Toplu İş Ekleyin"
#. module: stock_picking_batch
#: model:ir.ui.view,arch_db:stock_picking_batch.view_picking_internal_search_inherit_stock_picking_batch
@@ -205,7 +206,7 @@ msgstr "Bu toplu transferden sorumlu kişi"
#. module: stock_picking_batch
#: model:ir.model.fields,field_description:stock_picking_batch.field_stock_immediate_transfer__pick_to_backorder_ids
msgid "Pick To Backorder"
-msgstr ""
+msgstr "Ön Siparişleri Topla"
#. module: stock_picking_batch
#: model:ir.model.fields,help:stock_picking_batch.field_stock_immediate_transfer__pick_to_backorder_ids
@@ -241,7 +242,7 @@ msgstr "Toplu Transfer Ara"
#. module: stock_picking_batch
#: model:ir.ui.view,arch_db:stock_picking_batch.stock_picking_to_batch_form
msgid "Select a batch"
-msgstr ""
+msgstr "Bir Toplu İş Seç"
#. module: stock_picking_batch
#: code:addons/stock_picking_batch/models/stock_picking_batch.py:59
@@ -250,6 +251,8 @@ msgid ""
"Some pickings are still waiting for goods. Please check or force their "
"availability before setting this batch to done."
msgstr ""
+"Bazı toplamalar hala malzemeler için bekliyor. Lütfen bu toplu işlemi "
+"tamamlandı yapmadan önce uyumluluğunu kontrol edin veya zorlayın."
#. module: stock_picking_batch
#: code:addons/stock_picking_batch/models/stock_picking_batch.py:77
@@ -287,6 +290,10 @@ msgid ""
" It may also be useful to assign jobs (one person = one batch) or\n"
" help the timing management of operations (tasks to be done at 1pm)."
msgstr ""
+"Toplu transferlerin amacı birlikte tamamlanan olarak grup operasyon "
+"verimliliklerini arttırmaktır. Bu personele iş atamalarında ya da "
+"operasyonların zaman yönetiminde kullanışlı olabilir (saat 1 de bitti olarak"
+" görevlendir)."
#. module: stock_picking_batch
#: model:ir.model,name:stock_picking_batch.model_stock_picking
diff --git a/addons/survey/i18n/fr.po b/addons/survey/i18n/fr.po
index 7de065546cd..e8adefac7d0 100644
--- a/addons/survey/i18n/fr.po
+++ b/addons/survey/i18n/fr.po
@@ -1598,7 +1598,7 @@ msgstr "Ce sondage n'est ouvert qu'aux utilisateurs enregistrés. Veuillez "
#: model:ir.model.fields,field_description:survey.field_survey_survey__title
#: model:ir.ui.view,arch_db:survey.survey_survey_view_search
msgid "Title"
-msgstr "Civilité"
+msgstr "Titre"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_survey_view_search
diff --git a/addons/survey/i18n/tr.po b/addons/survey/i18n/tr.po
index 06576205c1e..6b65dfade66 100644
--- a/addons/survey/i18n/tr.po
+++ b/addons/survey/i18n/tr.po
@@ -14,13 +14,14 @@
# Fırat Kaya <firat.kaya@mechsoft.com.tr>, 2017
# Saban Yildiz <sabany@projetgrup.com>, 2017
# Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:11+0000\n"
"PO-Revision-Date: 2018-03-22 14:11+0000\n"
-"Last-Translator: Ahmet Altinisik <aaltinisik@altinkaya.com.tr>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -207,6 +208,8 @@ msgid ""
"A positive score indicates a correct choice; a negative or null score "
"indicates a wrong answer"
msgstr ""
+"Bir pozitif skor doğru seçimi gösterir; bir negatif ya da sıfır puan yanlış "
+"bir cevabı gösterir."
#. module: survey
#: model:ir.ui.view,arch_db:survey.page
@@ -235,6 +238,8 @@ msgid ""
"Add a list of email of recipients (will not be converted into contacts). "
"Separated by commas, semicolons or newline..."
msgstr ""
+"Alıcıların e-postalarının bir listesini ekleyin ( kişiye dönüştürülemez). "
+"Virgül, noktalı virgül veya satır sonu ile ayrılmış ."
#. module: survey
#: model:ir.actions.act_window,help:survey.action_survey_form
@@ -244,7 +249,7 @@ msgstr ""
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_email_compose_message
msgid "Add existing contacts..."
-msgstr ""
+msgstr "Varolan kişileri ekle"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
@@ -317,7 +322,7 @@ msgstr "İptal"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
msgid "Choices"
-msgstr ""
+msgstr "Seçimler"
#. module: survey
#: model:ir.ui.view,arch_db:survey.simple_choice
@@ -464,6 +469,8 @@ msgid ""
"Deadline to which the invitation to respond for this survey is valid. If the"
" field is empty, the invitation is still valid."
msgstr ""
+"Bu anket için yanıt vermek için davet geçerli olduğu son tarih. Alan boşsa, "
+"davet hala geçerli."
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message__date_deadline
@@ -490,7 +497,7 @@ msgstr "Tasarım"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_form
msgid "Design Survey"
-msgstr ""
+msgstr "Anket Tasarla"
#. module: survey
#: model:ir.actions.act_window,help:survey.action_survey_form
@@ -498,6 +505,8 @@ msgid ""
"Design easily your survey, send invitations to answer by email and analyse "
"answers."
msgstr ""
+"Anketinizi kolayca tasarlayın, e-mail ile cevaplamak üzere davet gönderin ve"
+" cevapları analiz edin."
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_question__display_mode
@@ -661,7 +670,7 @@ msgstr "Davetiyeler gönderildi"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_survey__is_closed
msgid "Is closed"
-msgstr ""
+msgstr "Kapalı"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_survey__designed
@@ -820,7 +829,7 @@ msgstr "En küçük değer"
#. module: survey
#: selection:survey.question,type:0
msgid "Multiple Lines Text Box"
-msgstr ""
+msgstr "Çok Satırlı Metin Kutusu"
#. module: survey
#: selection:survey.question,type:0
@@ -1066,7 +1075,7 @@ msgstr "Soru"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_label__question_id_2
msgid "Question 2"
-msgstr ""
+msgstr "Soru 2"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_question__question
@@ -1091,12 +1100,12 @@ msgstr "Sorular"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_survey__quizz_mode
msgid "Quizz Mode"
-msgstr ""
+msgstr "Quiz Modu"
#. module: survey
#: selection:survey.question,display_mode:0
msgid "Radio Buttons"
-msgstr ""
+msgstr "Radyo Düğmesi"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_survey__result_url
@@ -1111,17 +1120,17 @@ msgstr "Satır cevap"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
msgid "Row1"
-msgstr ""
+msgstr "Satır 1"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
msgid "Row2"
-msgstr ""
+msgstr "Satır 2"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
msgid "Row3"
-msgstr ""
+msgstr "Satır 3"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
@@ -1151,12 +1160,12 @@ msgstr "Test için Puan"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_label__quizz_mark
msgid "Score for this choice"
-msgstr ""
+msgstr "Bu seçim için puan"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_user_input_line__quizz_mark
msgid "Score given for this choice"
-msgstr ""
+msgstr "Verilen bu seçeneğin skoru"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_label_search
@@ -1255,7 +1264,7 @@ msgstr "Bir sonraki eylem tarihi bugünden önce olan tüm kayıtları göster"
#. module: survey
#: selection:survey.question,type:0
msgid "Single Line Text Box"
-msgstr ""
+msgstr "Tek Satırlı Metin Kutusu"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_user_input_line__skipped
@@ -1408,7 +1417,7 @@ msgstr "Anket Sayfası"
#. module: survey
#: model:ir.actions.server,name:survey.survey_action_server_clean_test_answers
msgid "Survey: Clean test answers"
-msgstr ""
+msgstr "Anket: Test cevaplarını temizle"
#. module: survey
#: model:ir.actions.act_window,name:survey.action_survey_form
@@ -1492,7 +1501,7 @@ msgstr "Bu cevap e-posta adresi olmalıdır."
#: code:addons/survey/tests/test_survey.py:107
#, python-format
msgid "This is not a date"
-msgstr ""
+msgstr "Bu bir tarih değildir."
#. module: survey
#: code:addons/survey/models/survey.py:564
@@ -1507,6 +1516,8 @@ msgid ""
"This list of emails of recipients will not be converted in contacts. "
"Emails must be separated by commas, semicolons or newline."
msgstr ""
+"Alıcıların bu e-mail listesi kişilere dönüştürülemez. E-postalar virgül, "
+"noktalı virgül yada satır başı ile ayrılmalıdır."
#. module: survey
#: model:ir.model.fields,help:survey.field_survey_survey__thank_you_message
@@ -1568,7 +1579,7 @@ msgstr "Yanıt türleri"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_survey_view_search
msgid "Upcoming Activities"
-msgstr ""
+msgstr "Yaklaşan Aktiviteler"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_email_compose_message
@@ -1579,7 +1590,7 @@ msgstr "Şablonu Kullan"
#: model:ir.model.fields,help:survey.field_survey_question__description
msgid ""
"Use this field to add additional explanations about your question"
-msgstr ""
+msgstr "Sorunuz hakkında ek açıklamalar eklemek için bu alanı kullanın"
#. module: survey
#: model:res.groups,name:survey.group_survey_user
@@ -1641,7 +1652,7 @@ msgstr "Girdisini doğrulamak"
#. module: survey
#: model:ir.model.fields,field_description:survey.field_survey_question__validation_error_msg
msgid "Validation Error message"
-msgstr ""
+msgstr "Doğrulama hatası mesajı"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_user_input_form
@@ -1672,6 +1683,9 @@ msgid ""
"feedback, recruitment interviews, employee's periodical evaluations, "
"marketing campaigns, etc."
msgstr ""
+"Farklı amaçlar için anketler oluşturabilirsin: müşteri görüşleri, servis "
+"geri bildirimleri, işe alım görüşmeleri, periyodik personel "
+"değerlendirmeleri, pazarlama kampanyaları gibi."
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_email_compose_message
@@ -1681,6 +1695,10 @@ msgid ""
"want with the public web link (in this case, the \"Login Required\" setting "
"must be disabled)."
msgstr ""
+"Anketinizin web linkini genele ve/veya özel davetle ilgili kişiye "
+"paylaşabilirsiniz. İnsanlar, davet başına bir kez cevap verebilir ve genel "
+"web linki ile istedikleri zaman cevap verebilirler ( bu durumda, 'Üye Girişi"
+" Gereklidir' uyarısı pasif yapılmalıdır)"
#. module: survey
#: code:addons/survey/models/survey.py:315
@@ -1702,7 +1720,7 @@ msgstr "Seni attı"
#. module: survey
#: model:ir.ui.view,arch_db:survey.survey_question_form
msgid "ans"
-msgstr ""
+msgstr "cevap"
#. module: survey
#: model:ir.model,name:survey.model_ir_autovacuum
diff --git a/addons/test_mail/data/test_mail_data.py b/addons/test_mail/data/test_mail_data.py
index 52248cb3095..adf963fcd7b 100644
--- a/addons/test_mail/data/test_mail_data.py
+++ b/addons/test_mail/data/test_mail_data.py
@@ -290,4 +290,387 @@ X-Attachment-Id: ii_151b51a290ed6a91
R0lGODdhAgACALMAAAAAAP///wAAAP//AP8AAP+AAAD/AAAAAAAA//8A/wAAAP+AgAAAAAAAAAAA
AAAAACwAAAAAAgACAAAEA3DJFQA7
--001a11416b9e9b229a05272b7052--
-""" \ No newline at end of file
+"""
+
+MAIL_EML_ATTACHMENT = """Subject: Re: test attac
+From: Anon <anon@odoo.com>
+To: anon@gmail.com
+References: <f3b9f8f8-28fa-2543-cab2-7aa68f679ebb@odoo.com>
+Message-ID: <cb7eaf62-58dc-2017-148c-305d0c78892f@odoo.com>
+Date: Wed, 14 Mar 2018 14:26:58 +0100
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
+ Thunderbird/52.6.0
+MIME-Version: 1.0
+In-Reply-To: <f3b9f8f8-28fa-2543-cab2-7aa68f679ebb@odoo.com>
+Content-Type: multipart/mixed;
+ boundary="------------A6B5FD5F68F4D73ECD739009"
+Content-Language: en-US
+
+This is a multi-part message in MIME format.
+--------------A6B5FD5F68F4D73ECD739009
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 7bit
+
+
+
+On 14/03/18 14:20, Anon wrote:
+> Some nice content
+>
+
+
+--------------A6B5FD5F68F4D73ECD739009
+Content-Type: message/rfc822;
+ name="original_msg.eml"
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment;
+ filename="original_msg.eml"
+
+Delivered-To: anon2@gmail1.openerp.com
+Received: by 10.46.1.170 with SMTP id f42csp2379722lji;
+ Mon, 5 Mar 2018 01:19:23 -0800 (PST)
+X-Google-Smtp-Source: AG47ELsYTlAcblMxfnaEENQuF+MFoac5Q07wieyw0cybq/qOX4+DmayqoQILkiWT+NiTOcnr/ACO
+X-Received: by 10.28.154.213 with SMTP id c204mr7237750wme.64.1520241563503;
+ Mon, 05 Mar 2018 01:19:23 -0800 (PST)
+ARC-Seal: i=1; a=rsa-sha256; t=1520241563; cv=none;
+ d=google.com; s=arc-20160816;
+ b=BqgMSbqmbpYW1ZtfGTVjj/654MBmabw4XadNZEaI96hDaub6N6cP8Guu3PoxscI9os
+ 0OLYVP1s/B+Vv9rIzulCwHyHsgnX+aTxGYepTDN6x8SA9Qeb9aQoNSVvQLryTAoGpaFr
+ vXhw8aPWyr28edE03TDFA/s7X65Bf6dV5zJdMiUPVqGkfYfcTHMf3nDER5vk8vQj7tve
+ Cfyy0h9vLU9RSEtdFwmlEkLmgT9NQ3GDf0jQ97eMXPgR2q6duCPoMcz15KlWOno53xgH
+ EiV7aIZ5ZMN/m+/2xt3br/ubJ5euFojWhDnHUZoaqd08TCSQPd4fFCCx75MjDeCnwYMn
+ iKSg==
+ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
+ h=content-language:mime-version:user-agent:date:message-id:subject
+ :from:to:dkim-signature:arc-authentication-results;
+ bh=/UIFqhjCCbwBLsI4w7YY98QH6G/wxe+2W4bbMDCskjM=;
+ b=Wv5jt+usnSgWI96GaZWUN8/VKl1drueDpU/4gkyX/iK4d6S4CuSDjwYAc3guz/TjeW
+ GoKCqT30IGZoStpXQbuLry7ezXNK+Fp8MJKN2n/x5ClJWHxIsxIGlP2QC3TO8RI0P5o0
+ GXG9izW93q1ubkdPJFt3unSjjwSYf5XVQAZQtRm9xKjqA+lbtFbsnbjJ4wgYBURnD8ma
+ Qxb2xsxXDelaZvtdlzHRDn5SEkbqhcCclEYw6oRLpVQFZeYtPxcCleVybtj2owJxdaLp
+ 7wXuo/gpYe6E2cPuS2opei8AzjEhYTNzlYXTPvaoxCCTTjfGTaPv22TeRDehuIXngSEl
+ Nmmw==
+ARC-Authentication-Results: i=1; mx.google.com;
+ dkim=pass header.i=@odoo.com header.s=mail header.b=MCzhjB9b;
+ spf=pass (google.com: domain of soup@odoo.com designates 149.202.180.44 as permitted sender) smtp.mailfrom=soup@odoo.com;
+ dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=odoo.com
+Return-Path: <soup@odoo.com>
+Received: from mail2.odoo.com (mail2.odoo.com. [149.202.180.44])
+ by mx.google.com with ESMTPS id y4si4279200wmy.148.2018.03.05.01.19.22
+ (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
+ Mon, 05 Mar 2018 01:19:23 -0800 (PST)
+Received-SPF: pass (google.com: domain of soup@odoo.com designates 149.202.180.44 as permitted sender) client-ip=149.202.180.44;
+Authentication-Results: mx.google.com;
+ dkim=pass header.i=@odoo.com header.s=mail header.b=MCzhjB9b;
+ spf=pass (google.com: domain of soup@odoo.com designates 149.202.180.44 as permitted sender) smtp.mailfrom=soup@odoo.com;
+ dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=odoo.com
+Received: from [10.10.31.24] (unknown [91.183.114.50])
+ (Authenticated sender: soup)
+ by mail2.odoo.com (Postfix) with ESMTPSA id 7B571A4085
+ for <what@odoo.com>; Mon, 5 Mar 2018 10:19:21 +0100 (CET)
+DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=odoo.com; s=mail;
+ t=1520241562; bh=L2r7Sp/vjogIdM1k8H9zDGDjnhKolsTTLLjndnFC4Jc=;
+ h=To:From:Subject:Date:From;
+ b=MCzhjB9bnsrJ3uKjq+GjujFxmtrq3fc7Vv7Vg2C72EPKnkxgqy6yPjWKtXbBlaiT3
+ YjKI24aiSQlOeOPQiqFgiDzeqqemNDp+CRuhoYz1Vbz+ESRaHtkWRLb7ZjvohS2k7e
+ RTq7tUxY2nUL2YrNHV7DFYtJVBwiTuyLP6eAiJdE=
+To: what@odoo.com
+From: Soup <soup@odoo.com>
+Subject: =?UTF-8?Q?Soupe_du_jour_:_Pois_cass=c3=a9s?=
+Message-ID: <a05d8334-7b7c-df68-c96a-4a88ed19f31b@odoo.com>
+Date: Mon, 5 Mar 2018 10:19:21 +0100
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
+ Thunderbird/52.6.0
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+ boundary="------------1F2D18B1129FC2F0B9EECF50"
+Content-Language: en-US
+X-Spam-Status: No, score=-1.2 required=5.0 tests=ALL_TRUSTED,BAYES_00,
+ HTML_IMAGE_ONLY_08,HTML_MESSAGE,T_REMOTE_IMAGE autolearn=no
+ autolearn_force=no version=3.4.0
+X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail2.odoo.com
+
+This is a multi-part message in MIME format.
+--------------1F2D18B1129FC2F0B9EECF50
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+
+Résultat de recherche d'images pour "dessin la princesse au petit pois"
+
+--
+Soup
+
+Odoo S.A.
+Chaussée de Namur, 40
+B-1367 Grand Rosière
+Web: http://www.odoo.com
+
+
+--------------1F2D18B1129FC2F0B9EECF50
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+<html>
+ <head>
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
+ </head>
+ <body text="#000000" bgcolor="#FFFFFF">
+ <p><img
+src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQjCNAadd3NDM8g9w0P_-gAVYrrqC0wmBNYKGsTZ2Pst5SsNxTRnA"
+ alt="Résultat de recherche d'images pour &quot;dessin la
+ princesse au petit pois&quot;"></p>
+ <pre class="moz-signature" cols="72">--
+Soup
+
+Odoo S.A.
+Chaussée de Namur, 40
+B-1367 Grand Rosière
+Web: <a class="moz-txt-link-freetext" href="http://www.odoo.com">http://www.odoo.com</a> </pre>
+ </body>
+</html>
+
+--------------1F2D18B1129FC2F0B9EECF50--
+
+--------------A6B5FD5F68F4D73ECD739009--"""
+
+
+MAIL_XHTML = """Return-Path: <xxxx@xxxx.com>
+Received: from xxxx.internal (xxxx.xxxx.internal [1.1.1.1])
+ by xxxx (xxxx 1.1.1-111-g972eecc-slipenbois) with LMTPA;
+ Fri, 13 Apr 2018 22:11:52 -0400
+X-Cyrus-Session-Id: sloti35d1t38-1111111-11111111111-5-11111111111111111111
+X-Sieve: CMU Sieve 1.0
+X-Spam-known-sender: no ("Email failed DMARC policy for domain"); in-addressbook
+X-Spam-score: 0.0
+X-Spam-hits: ALL_TRUSTED -1, BAYES_00 -1.9, FREEMAIL_FROM 0.001,
+ HTML_FONT_LOW_CONTRAST 0.001, HTML_MESSAGE 0.001, SPF_SOFTFAIL 0.665,
+ LANGUAGES en, BAYES_USED global, SA_VERSION 1.1.0
+X-Spam-source: IP='1.1.1.1', Host='unk', Country='unk', FromHeader='com',
+ MailFrom='com'
+X-Spam-charsets: plain='utf-8', html='utf-8'
+X-IgnoreVacation: yes ("Email failed DMARC policy for domain")
+X-Resolved-to: catchall@xxxx.xxxx
+X-Delivered-to: catchall@xxxx.xxxx
+X-Mail-from: xxxx@xxxx.com
+Received: from mx4 ([1.1.1.1])
+ by xxxx.internal (LMTPProxy); Fri, 13 Apr 2018 22:11:52 -0400
+Received: from xxxx.xxxx.com (localhost [127.0.0.1])
+ by xxxx.xxxx.internal (Postfix) with ESMTP id E1111C1111;
+ Fri, 13 Apr 2018 22:11:51 -0400 (EDT)
+Received: from xxxx.xxxx.internal (localhost [127.0.0.1])
+ by xxxx.xxxx.com (Authentication Milter) with ESMTP
+ id BBDD1111D1A;
+ Fri, 13 Apr 2018 22:11:51 -0400
+ARC-Authentication-Results: i=1; xxxx.xxxx.com; arc=none (no signatures found);
+ dkim=pass (2048-bit rsa key sha256) header.d=xxxx.com header.i=@xxxx.com header.b=P1aaAAaa x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=fm2;
+ dmarc=fail (p=none,d=none) header.from=xxxx.com;
+ iprev=pass policy.iprev=1.1.1.1 (out1-smtp.xxxx.com);
+ spf=softfail smtp.mailfrom=xxxx@xxxx.com smtp.helo=out1-smtp.xxxx.com;
+ x-aligned-from=pass (Address match);
+ x-cm=none score=0;
+ x-ptr=pass x-ptr-helo=out1-smtp.xxxx.com x-ptr-lookup=out1-smtp.xxxx.com;
+ x-return-mx=pass smtp.domain=xxxx.com smtp.result=pass smtp_is_org_domain=yes header.domain=xxxx.com header.result=pass header_is_org_domain=yes;
+ x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128;
+ x-vs=clean score=0 state=0
+Authentication-Results: xxxx.xxxx.com;
+ arc=none (no signatures found);
+ dkim=pass (2048-bit rsa key sha256) header.d=xxxx.com header.i=@xxxx.com header.b=P1awJPiy x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=fm2;
+ dmarc=fail (p=none,d=none) header.from=xxxx.com;
+ iprev=pass policy.iprev=66.111.4.25 (out1-smtp.xxxx.com);
+ spf=softfail smtp.mailfrom=xxxx@xxxx.com smtp.helo=out1-smtp.xxxx.com;
+ x-aligned-from=pass (Address match);
+ x-cm=none score=0;
+ x-ptr=pass x-ptr-helo=out1-smtp.xxxx.com x-ptr-lookup=out1-smtp.xxxx.com;
+ x-return-mx=pass smtp.domain=xxxx.com smtp.result=pass smtp_is_org_domain=yes header.domain=xxxx.com header.result=pass header_is_org_domain=yes;
+ x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128;
+ x-vs=clean score=0 state=0
+X-ME-VSCategory: clean
+X-ME-CMScore: 0
+X-ME-CMCategory: none
+Received-SPF: softfail
+ (gmail.com ... _spf.xxxx.com: Sender is not authorized by default to use 'xxxx@xxxx.com' in 'mfrom' identity, however domain is not currently prepared for false failures (mechanism '~all' matched))
+ receiver=xxxx.xxxx.com;
+ identity=mailfrom;
+ envelope-from="xxxx@xxxx.com";
+ helo=out1-smtp.xxxx.com;
+ client-ip=1.1.1.1
+Received: from xxxx.xxxx.internal (gateway1.xxxx.internal [1.1.1.1])
+ (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+ (No client certificate requested)
+ by xxxx.xxxx.internal (Postfix) with ESMTPS;
+ Fri, 13 Apr 2018 22:11:51 -0400 (EDT)
+Received: from compute3.internal (xxxx.xxxx.internal [10.202.2.43])
+ by xxxx.xxxx.internal (Postfix) with ESMTP id 8BD5B21BBD;
+ Fri, 13 Apr 2018 22:11:51 -0400 (EDT)
+Received: from xxxx ([10.202.2.163])
+ by xxxx.internal (MEProxy); Fri, 13 Apr 2018 22:11:51 -0400
+X-ME-Sender: <xms:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>
+Received: from [1.1.1.1] (unknown [1.1.1.1])
+ by mail.xxxx.com (Postfix) with ESMTPA id BF5E1111D
+ for <catchall@xxxx.xxxx>; Fri, 13 Apr 2018 22:11:50 -0400 (EDT)
+From: "xxxx xxxx" <xxxx@xxxx.com>
+To: "xxxx" <catchall@xxxx.xxxx>
+Subject: Re: xxxx (Ref PO1)
+Date: Sat, 14 Apr 2018 02:11:42 +0000
+Message-Id: <em67f5c44a-xxxx-xxxx-xxxx-69f56d618a94@wswin7hg4n4l1ce>
+In-Reply-To: <829228111124527.1111111602.256611118262939-openerp-129-xxxx.xxxx@ip-1-1-1-1>
+References: <867911111953277.1523671337.187951111160400-openerp-129-xxxx.xxxx@ip-1-1-1-1>
+ <867911111953277.1523671337.256611118262939-openerp-129-xxxx.xxxx@ip-1-1-1-1>
+Reply-To: "xxxx xxxx" <xxxx@xxxx.com>
+User-Agent: eM_Client/7.0.26687.0
+Mime-Version: 1.0
+Content-Type: multipart/alternative;
+ boundary="------=_MB48E455BD-1111-42EC-1111-886CDF48905E"
+
+--------=_MB48E455BD-1111-42EC-1111-886CDF48905E
+Content-Type: text/plain; format=flowed; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+xxxx
+
+
+------ Original Message ------
+From: "xxxx" <xxxx@xxxx.com>
+To: "xxxx" <xxxx@xxxx.com>
+Sent: 4/13/2018 7:06:43 PM
+Subject: xxxx
+
+>xxxx
+
+--------=_MB48E455BD-1111-42EC-1111-886CDF48905E
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+<?xml version=3D"1.0" encoding=3D"utf-16"?><html><head><style type=3D"text/=
+css"><!--blockquote.cite
+{margin-left: 5px; margin-right: 0px; padding-left: 10px; padding-right:=
+ 0px; border-left-width: 1px; border-left-style: solid; border-left-color:=
+ rgb(204, 204, 204);}
+blockquote.cite2
+{margin-left: 5px; margin-right: 0px; padding-left: 10px; padding-right:=
+ 0px; border-left-width: 1px; border-left-style: solid; border-left-color:=
+ rgb(204, 204, 204); margin-top: 3px; padding-top: 0px;}
+a img
+{border: 0px;}
+body
+{font-family: Tahoma; font-size: 12pt;}
+--></style></head><body><div>this is a reply to PO200109 from emClient</div=
+><div id=3D"signature_old"><div style=3D"font-family: Tahoma; font-size:=
+ 12 pt;">-- <br /><span><span class=3D"__postbox-detected-content __postbox=
+-detected-address" style=3D"TEXT-DECORATION: underline; COLOR: rgb(115,133,=
+172); PADDING-BOTTOM: 0pt; PADDING-TOP: 0pt; PADDING-LEFT: 0pt; DISPLAY:=
+ inline; PADDING-RIGHT: 0pt" __postbox-detected-content=3D"__postbox-detect=
+ed-address"></span>xxxx<br />xxxx<br /><b=
+r />xxxx</span></=
+div></div><div><br /></div><div><br /></div><div><br /></div>
+<div>------ Original Message ------</div>
+<div>From: "xxxx" &lt;<a href=3D"mailto:xxxx@xxxx.com">xxxx=
+@xxxx.com</a>&gt;</div>
+<div>To: "xxxx" &lt;<a href=3D"mailto:xxxx@xxxx.com">a=
+xxxx@xxxx.com</a>&gt;</div>
+<div>Sent: 4/13/2018 7:06:43 PM</div>
+<div>Subject: xxxx</div><div><br /></div=
+>
+<div id=3D"x00b4101ba6e64ce"><blockquote cite=3D"829228972724527.1523671602=
+.256660938262939-openerp-129-xxxx.xxxx@ip-1-1-1-1" type=3D"cite"=
+ class=3D"cite2">
+<table border=3D"0" width=3D"100%" cellpadding=3D"0" bgcolor=3D"#ededed"=
+ style=3D"padding: 20px; background-color: #ededed" summary=3D"o_mail_notif=
+ication">
+ <tbody>
+
+ <!-- HEADER -->
+ <tr>
+ <td align=3D"center" style=3D"min-width: 590px;">
+ <table width=3D"590" border=3D"0" cellpadding=3D=
+"0" bgcolor=3D"#875A7B" style=3D"min-width: 590px; background-color: rgb(13=
+5,90,123); padding: 20px;">
+ <tbody><tr>
+ <td valign=3D"middle">
+ <span style=3D"font-size:20px; color:whit=
+e; font-weight: bold;">
+ mangez des saucisses
+ </span>
+ </td>
+ <td valign=3D"middle" align=3D"right">
+ <img src=3D"http://erp.xxxx.xxxx/logo.png=
+" style=3D"padding: 0px; margin: 0px; height: auto; width: 80px;" alt=3D=
+"xxxx" />
+ </td>
+ </tr>
+ </tbody></table>
+ </td>
+ </tr>
+
+ <!-- CONTENT -->
+ <tr>
+ <td align=3D"center" style=3D"min-width: 590px;">
+ <table width=3D"590" border=3D"0" cellpadding=3D=
+"0" bgcolor=3D"#ffffff" style=3D"min-width: 590px; background-color: rgb(25=
+5, 255, 255); padding: 20px;">
+ <tbody>
+ <tr><td valign=3D"top" style=3D"font-family:A=
+rial,Helvetica,sans-serif; color: #555; font-size: 14px;">
+ <p style=3D"margin: 0px 0px 9px 0px; font-s=
+ize: 13px; font-family: &quot;Lucida Grande&quot;, Helvetica, Verdana, Aria=
+l, sans-serif">xxxx.=20
+,</p>
+<p style=3D"margin: 0px 0px 9px 0px; font-size: 13px; font-family: &quot;Lu=
+cida Grande&quot;, Helvetica, Verdana, Arial, sans-serif">
+xxxx.
+</p>
+
+<p style=3D"margin: 0px 0px 9px 0px; font-size: 13px; font-family: &quot;Lu=
+cida Grande&quot;, Helvetica, Verdana, Arial, sans-serif">You can reply =
+to this email if you have any questions.</p>
+<p style=3D"margin: 0px 0px 9px 0px; font-size: 13px; font-family: &quot;Lu=
+cida Grande&quot;, Helvetica, Verdana, Arial, sans-serif">Thank you,</p>
+ </td>
+ </tr></tbody>
+ </table>
+ </td>
+ </tr>
+
+ <!-- FOOTER -->
+ <tr>
+ <td align=3D"center" style=3D"min-width: 590px;">
+ <table width=3D"590" border=3D"0" cellpadding=3D=
+"0" bgcolor=3D"#875A7B" style=3D"min-width: 590px; background-color: rgb(13=
+5,90,123); padding: 20px;">
+ <tbody><tr>
+ <td valign=3D"middle" align=3D"left" style=
+=3D"color: #fff; padding-top: 10px; padding-bottom: 10px; font-size: 12px;"=
+>
+ xxxx<br />
+ +1-801-980-4240
+ </td>
+ <td valign=3D"middle" align=3D"right" style=
+=3D"color: #fff; padding-top: 10px; padding-bottom: 10px; font-size: 12px;"=
+>
+ <a href=3D"http://erp.xxxx.xxxx/info@xxxx-a=
+aa.com" style=3D"text-decoration:none; color: white;">info@aust-mfg.com</a>=
+<br />
+ <a href=3D"http://www.xxxx=
+.com" style=3D"text-decoration:none; color: white;">
+ http://www.xxxx.com
+ </a>
+ </td>
+ </tr>
+ </tbody></table>
+ </td>
+ </tr>
+ <tr>
+ <td align=3D"center">
+ Powered by <a href=3D"https://www.odoo.com">Odo=
+o</a>.
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ =20
+ <pre style=3D"white-space: pre-wrap">xxxx.
+</pre>
+</blockquote></div>
+</body></html>
+--------=_MB48E455BD-2850-42EC-B1CA-886CDF48905E--"""
+
diff --git a/addons/test_mail/tests/test_mail_gateway.py b/addons/test_mail/tests/test_mail_gateway.py
index a9286797384..f24ee44fa3e 100644
--- a/addons/test_mail/tests/test_mail_gateway.py
+++ b/addons/test_mail/tests/test_mail_gateway.py
@@ -7,7 +7,7 @@ from email.utils import formataddr
from odoo.addons.test_mail.data.test_mail_data import \
MAIL_TEMPLATE, MAIL_TEMPLATE_PLAINTEXT, MAIL_MULTIPART_MIXED, MAIL_MULTIPART_MIXED_TWO, \
- MAIL_MULTIPART_IMAGE, MAIL_SINGLE_BINARY
+ MAIL_MULTIPART_IMAGE, MAIL_SINGLE_BINARY, MAIL_EML_ATTACHMENT, MAIL_XHTML
from odoo.addons.test_mail.tests.common import BaseFunctionalTest, MockEmails
from odoo.tools import mute_logger
@@ -79,6 +79,18 @@ class TestMailgateway(BaseFunctionalTest, MockEmails):
})
@mute_logger('odoo.addons.mail.models.mail_thread')
+ def test_message_parse_eml(self):
+ """ Test that the parsing of mail with embedded emails as eml(msg) which generates empty attachments, can be processed.
+ """
+ self.env['mail.thread'].message_process('mail.channel', MAIL_EML_ATTACHMENT)
+
+ @mute_logger('odoo.addons.mail.models.mail_thread')
+ def test_message_parse_xhtml(self):
+ """ Test that the parsing of mail with embedded emails as eml(msg) which generates empty attachments, can be processed.
+ """
+ self.env['mail.thread'].message_process('mail.channel', MAIL_XHTML)
+
+ @mute_logger('odoo.addons.mail.models.mail_thread')
def test_message_process_cid(self):
record = self.format_and_process(MAIL_MULTIPART_IMAGE, to='groups@example.com')
message = record.message_ids[0]
diff --git a/addons/utm/i18n/nl.po b/addons/utm/i18n/nl.po
index be50e48c0f6..4e6816d3cf3 100644
--- a/addons/utm/i18n/nl.po
+++ b/addons/utm/i18n/nl.po
@@ -227,7 +227,7 @@ msgid ""
" e.g. Fall_Drive, Christmas_Special"
msgstr ""
"Dit is een naam die u helpt bij het volgen van uw verschillende campagne "
-"inspanningen, bijvoorbeeld Herst_Rit, Kerstmis_Special"
+"inspanningen, bijvoorbeeld Herfst_Rit, Kerstmis_Special"
#. module: utm
#: model:ir.model.fields,help:utm.field_account_invoice__medium_id
diff --git a/addons/utm/i18n/tr.po b/addons/utm/i18n/tr.po
index 7ac76c78f80..d3346a943e8 100644
--- a/addons/utm/i18n/tr.po
+++ b/addons/utm/i18n/tr.po
@@ -10,13 +10,14 @@
# Murat Kaplan <muratk@projetgrup.com>, 2017
# Ayhan KIZILTAN <akiziltan76@hotmail.com>, 2017
# Ramiz Deniz Öner <deniz@denizoner.com>, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-22 14:10+0000\n"
"PO-Revision-Date: 2018-03-22 14:10+0000\n"
-"Last-Translator: Ramiz Deniz Öner <deniz@denizoner.com>, 2017\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -228,6 +229,8 @@ msgid ""
"This is a name that helps you keep track of your different campaign efforts,"
" e.g. Fall_Drive, Christmas_Special"
msgstr ""
+"Farklı kampanya çabalarınızı izlemenize yardımcı olacak bir isimdir Örn: "
+"Sonbahar_Sürüşü, Yılbaşı_Özel"
#. module: utm
#: model:ir.model.fields,help:utm.field_account_invoice__medium_id
@@ -237,7 +240,7 @@ msgstr ""
#: model:ir.model.fields,help:utm.field_sale_order__medium_id
#: model:ir.model.fields,help:utm.field_utm_mixin__medium_id
msgid "This is the method of delivery, e.g. Postcard, Email, or Banner Ad"
-msgstr ""
+msgstr "Bu teslimat yöntemidir. örn: Postakartı, Eposta yada Banner reklamı"
#. module: utm
#: model:ir.model.fields,help:utm.field_account_invoice__source_id
@@ -250,6 +253,8 @@ msgid ""
"This is the source of the link, e.g. Search Engine, another domain, or name "
"of email list"
msgstr ""
+"Bu bağlantı kaynağıdır. örn: Arama Motoru, başka alan adı yada bir e-posta "
+"listesi adı"
#. module: utm
#: model:utm.source,name:utm.utm_source_twitter
@@ -259,9 +264,9 @@ msgstr "Twitter"
#. module: utm
#: model:ir.ui.menu,name:utm.marketing_utm
msgid "UTMs"
-msgstr ""
+msgstr "UTMs"
#. module: utm
#: model:ir.model,name:utm.model_utm_mixin
msgid "utm.mixin"
-msgstr ""
+msgstr "utm.mixin"
diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py
index 709fbb61d9c..f4cddcc1ee2 100644
--- a/addons/web/controllers/main.py
+++ b/addons/web/controllers/main.py
@@ -1047,8 +1047,12 @@ class Binary(http.Controller):
elif status != 200 and download:
return request.not_found()
- height = int(height or 0)
- width = int(width or 0)
+ if headers and dict(headers).get('Content-Type', '') == 'image/svg+xml': # we shan't resize svg images
+ height = 0
+ width = 0
+ else:
+ height = int(height or 0)
+ width = int(width or 0)
if crop and (width or height):
content = crop_image(content, type='center', size=(width, height), ratio=(1, 1))
@@ -1116,7 +1120,7 @@ class Binary(http.Controller):
if request.httprequest.user_agent.browser == 'safari':
# Safari sends NFD UTF-8 (where é is composed by 'e' and [accent])
# we need to send it the same stuff, otherwise it'll fail
- filename = unicodedata.normalize('NFD', ufile.filename).encode('UTF-8')
+ filename = unicodedata.normalize('NFD', ufile.filename)
try:
attachment = Model.create({
diff --git a/addons/web/i18n/nl.po b/addons/web/i18n/nl.po
index 9b960e441ac..068c20c10e5 100644
--- a/addons/web/i18n/nl.po
+++ b/addons/web/i18n/nl.po
@@ -333,7 +333,7 @@ msgstr "Conditie toevoegen"
#: code:addons/web/static/src/xml/kanban.xml:44
#, python-format
msgid "Add a new Column"
-msgstr ""
+msgstr "Nieuwe kolom toevoegen"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/tr.po b/addons/web/i18n/tr.po
index fca1a956f29..3b883a5c214 100644
--- a/addons/web/i18n/tr.po
+++ b/addons/web/i18n/tr.po
@@ -52,7 +52,7 @@ msgstr " [Bana]"
#: code:addons/web/static/src/js/chrome/search_filters.js:226
#, python-format
msgid " and "
-msgstr ""
+msgstr "ve"
#. module: web
#. openerp-web
@@ -218,7 +218,7 @@ msgstr "(etiketyok)"
#: code:addons/web/static/src/js/fields/field_utils.js:256
#, python-format
msgid "1 record"
-msgstr ""
+msgstr "1 kayıt"
#. module: web
#: model:ir.ui.view,arch_db:web.menu_secondary
@@ -244,14 +244,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:604
#, python-format
msgid "ALL"
-msgstr ""
+msgstr "Tümü"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:605
#, python-format
msgid "ANY"
-msgstr ""
+msgstr "Hiçbiri"
#. module: web
#. openerp-web
@@ -300,7 +300,7 @@ msgstr "Etkinleştir"
#: code:addons/web/static/src/xml/base.xml:228
#, python-format
msgid "Activate Assets Debugging"
-msgstr ""
+msgstr "Varlıklar Ayıklamasını Etkinleştir"
#. module: web
#. openerp-web
@@ -361,21 +361,21 @@ msgstr "Özelleşmiş grup ekle"
#: code:addons/web/static/src/xml/base.xml:612
#, python-format
msgid "Add filter"
-msgstr ""
+msgstr "Filtre ekle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:672
#, python-format
msgid "Add new value"
-msgstr ""
+msgstr "Yeni değer ekle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/fields/basic_fields.js:1578
#, python-format
msgid "Add to Favorites"
-msgstr ""
+msgstr "Favorilerinize Ekleyin"
#. module: web
#. openerp-web
@@ -433,7 +433,7 @@ msgstr "Tüm kullanıcılar"
#: code:addons/web/static/src/xml/base.xml:145
#, python-format
msgid "An error occurred"
-msgstr ""
+msgstr "Bir hata oluştu"
#. module: web
#. openerp-web
@@ -443,6 +443,8 @@ msgid ""
"An unknown CORS error occured. The error probably originates from a "
"JavaScript file served from a different origin."
msgstr ""
+"Bilinmeyen bir CORS hatası oluştur. Hata muhtemelen farklı orijinlerden "
+"hizmet veren JavaScript dosyalarından dolayı oluştu."
#. module: web
#. openerp-web
@@ -595,7 +597,7 @@ msgstr "İptal"
#: code:addons/web/static/src/js/views/graph/graph_renderer.js:70
#, python-format
msgid "Cannot render chart with mode : "
-msgstr ""
+msgstr "Mod ile çizelge oluşturulamaz: "
#. module: web
#. openerp-web
@@ -713,7 +715,7 @@ msgstr "Kopyalandı!"
#: code:addons/web/static/src/xml/base.xml:143
#, python-format
msgid "Copy the full error to clipboard"
-msgstr ""
+msgstr "Tüm hataları panele kopyala"
#. module: web
#. openerp-web
@@ -760,7 +762,7 @@ msgstr "Oluştur"
#: code:addons/web/static/src/js/views/form/form_controller.js:502
#, python-format
msgid "Create "
-msgstr ""
+msgstr "Oluştur"
#. module: web
#. openerp-web
@@ -895,7 +897,7 @@ msgstr "Vazgeç"
#: code:addons/web/static/src/js/widgets/data_export.js:336
#, python-format
msgid "Do you really want to delete this export template?"
-msgstr ""
+msgstr "Bu dışa aktarma şablonunu gerçekten silmek istiyor musunuz?"
#. module: web
#. openerp-web
@@ -923,7 +925,7 @@ msgstr "Domain"
#: code:addons/web/static/src/js/widgets/domain_selector.js:520
#, python-format
msgid "Domain error"
-msgstr ""
+msgstr "Domain hatası"
#. module: web
#. openerp-web
@@ -977,7 +979,7 @@ msgstr "İşlemi Düzenle"
#: code:addons/web/static/src/xml/base.xml:273
#, python-format
msgid "Edit Calendar view"
-msgstr ""
+msgstr "Takvim düzenleme görüntüsü"
#. module: web
#. openerp-web
@@ -991,49 +993,49 @@ msgstr "Kolonu Düzenle"
#: code:addons/web/static/src/xml/base.xml:580
#, python-format
msgid "Edit Domain"
-msgstr ""
+msgstr "Domain Düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:267
#, python-format
msgid "Edit Form view"
-msgstr ""
+msgstr "Form görünümünü düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:271
#, python-format
msgid "Edit Gantt view"
-msgstr ""
+msgstr "Gantt görünümünü düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:270
#, python-format
msgid "Edit Graph view"
-msgstr ""
+msgstr "Grafik görünümünü düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:269
#, python-format
msgid "Edit Kanban view"
-msgstr ""
+msgstr "Kanban görünümünü düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:268
#, python-format
msgid "Edit List view"
-msgstr ""
+msgstr "Liste görünümünü düzenle"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:272
#, python-format
msgid "Edit Pivot view"
-msgstr ""
+msgstr "Pivot görünümünü düzenle"
#. module: web
#. openerp-web
@@ -1054,7 +1056,7 @@ msgstr "Aşamayı Düzenle"
#: code:addons/web/static/src/xml/base.xml:274
#, python-format
msgid "Edit view, type:"
-msgstr ""
+msgstr "görünümü düzenle, tür:"
#. module: web
#: model:ir.ui.view,arch_db:web.login
@@ -1100,7 +1102,7 @@ msgstr "Herkesin takvimi"
#: code:addons/web/static/src/js/views/calendar/calendar_model.js:507
#, python-format
msgid "Everything"
-msgstr ""
+msgstr "Herşey"
#. module: web
#. openerp-web
@@ -1287,6 +1289,9 @@ msgid ""
"\n"
"Tip: try to flip axis, filter further or reduce the number of measures."
msgstr ""
+"Excel uyumluluğu için, 256 sütundan daha fazla ise dışa aktarılamaz.\n"
+"\n"
+"İpucu: ekseni çevirmeye, daha fazla filtrelemeye veya önlem sayısını azaltmaya çalışın."
#. module: web
#. openerp-web
@@ -1356,7 +1361,7 @@ msgstr ""
#: code:addons/web/static/src/js/core/dialog.js:250
#, python-format
msgid "I am sure about this."
-msgstr ""
+msgstr "Bu konu hakkında eminim."
#. module: web
#. openerp-web
@@ -1402,13 +1407,15 @@ msgid ""
"Invalid database name. Only alphanumerical characters, underscore, hyphen "
"and dot are allowed."
msgstr ""
+"Geçersiz veritabanı adı. Yalnızca alfasayısal karakterler, alt çizgi, tire "
+"ve nokta izin verilir."
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:578
#, python-format
msgid "Invalid domain"
-msgstr ""
+msgstr "Geçersiz Domain"
#. module: web
#. openerp-web
@@ -1416,21 +1423,21 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:709
#, python-format
msgid "Invalid field chain"
-msgstr ""
+msgstr "Geçersiz alan zinciri"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/graph/graph_renderer.js:69
#, python-format
msgid "Invalid mode for chart"
-msgstr ""
+msgstr "Çizelge için geçersiz mod"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/widgets/debug_manager.js:207
#, python-format
msgid "JS Mobile Tests"
-msgstr ""
+msgstr "JS Mobil Testleri"
#. module: web
#. openerp-web
@@ -1537,7 +1544,7 @@ msgstr "M2O arama alanları henüz çok öntanımlı değerleri desteklemiyor"
#. module: web
#: model:ir.ui.view,arch_db:web.external_layout_boxed
msgid "Mail:"
-msgstr ""
+msgstr "Mail:"
#. module: web
#: model:ir.ui.view,arch_db:web.login_layout
@@ -1557,21 +1564,21 @@ msgstr "Filtreleri Yönet"
#: code:addons/web/static/src/xml/base.xml:611
#, python-format
msgid "Match"
-msgstr ""
+msgstr "Eşleştir"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:618
#, python-format
msgid "Match records with"
-msgstr ""
+msgstr "Kayıtları eşleştir"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:616
#, python-format
msgid "Match records with the following rule:"
-msgstr ""
+msgstr "Kayıtları takip eden kuralla birlikte eşleştir:"
#. module: web
#. openerp-web
@@ -1678,7 +1685,7 @@ msgstr "Odoo.com hesabım"
#: code:addons/web/static/src/xml/base.xml:606
#, python-format
msgid "NONE"
-msgstr ""
+msgstr "Hiç"
#. module: web
#. openerp-web
@@ -1735,7 +1742,7 @@ msgstr "Gösterilecek veri yok"
#: code:addons/web/static/src/js/widgets/debug_manager.js:355
#, python-format
msgid "No metadata available"
-msgstr ""
+msgstr "Kılavuz bilgi yok"
#. module: web
#. openerp-web
@@ -1794,7 +1801,7 @@ msgstr "Odoo Apps yakında hazır olacak"
#: code:addons/web/static/src/js/services/crash_manager.js:156
#, python-format
msgid "Odoo Client Error"
-msgstr ""
+msgstr "Odoo Müşteri Hatası"
#. module: web
#. openerp-web
@@ -1808,14 +1815,14 @@ msgstr "Odoo Enterprise"
#: code:addons/web/static/src/js/services/crash_manager.js:118
#, python-format
msgid "Odoo Error"
-msgstr ""
+msgstr "Odoo Hatası"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/services/crash_manager.js:58
#, python-format
msgid "Odoo Session Expired"
-msgstr ""
+msgstr "Odoo Oturumu Sonlandı"
#. module: web
#. openerp-web
@@ -1823,7 +1830,7 @@ msgstr ""
#: code:addons/web/static/src/js/services/crash_manager.js:197
#, python-format
msgid "Odoo Warning"
-msgstr ""
+msgstr "Odoo Uyarısı"
#. module: web
#. openerp-web
@@ -1878,6 +1885,8 @@ msgstr "Sadece tamsayı değeri geçerli olmalıdır."
msgid ""
"Only employee can access this database. Please contact the administrator."
msgstr ""
+"Bu veri tabanına sadece personel erişebilir. Lütfen yöneticinizle bağlantıya"
+" geçin."
#. module: web
#. openerp-web
@@ -1983,7 +1992,7 @@ msgstr "Pivot"
#: code:addons/web/static/src/js/views/list/list_renderer.js:333
#, python-format
msgid "Please click on the \"save\" button first"
-msgstr ""
+msgstr "Lütfen ilk önce 'kaydet' butonuna basın."
#. module: web
#. openerp-web
@@ -2038,6 +2047,7 @@ msgstr ""
msgid ""
"Please use the copy button to report the error to your support service."
msgstr ""
+"Lütfen destek serisine hatayı raporlamak için kopyala butonunu kullanın."
#. module: web
#: model:ir.ui.view,arch_db:web.menu_secondary
@@ -2093,7 +2103,7 @@ msgstr ""
#: code:addons/web/static/src/js/widgets/model_field_selector.js:455
#, python-format
msgid "Relation not allowed"
-msgstr ""
+msgstr "Bağlantıya izin verilmiyor"
#. module: web
#. openerp-web
@@ -2149,7 +2159,7 @@ msgstr "Geriyükle"
#: code:addons/web/static/src/xml/base.xml:220
#, python-format
msgid "Run JS Mobile Tests"
-msgstr ""
+msgstr "JS Mobil Testlerini Başlat"
#. module: web
#. openerp-web
@@ -2261,7 +2271,7 @@ msgstr "Ara: "
#: code:addons/web/static/src/xml/base.xml:150
#, python-format
msgid "See details"
-msgstr ""
+msgstr "Detayları gör."
#. module: web
#. openerp-web
@@ -2282,7 +2292,7 @@ msgstr "Seç <i class=\"fa fa-database\"/>"
#: code:addons/web/static/src/xml/base.xml:582
#, python-format
msgid "Select a model to add a filter."
-msgstr ""
+msgstr "Filtre eklemek için bir model seçin."
#. module: web
#. openerp-web
@@ -2400,7 +2410,7 @@ msgstr "Aç"
#: code:addons/web/static/src/js/widgets/domain_selector.js:567
#, python-format
msgid "Syntax error"
-msgstr ""
+msgstr "Söz dizimi hatası"
#. module: web
#. openerp-web
@@ -2414,7 +2424,7 @@ msgstr "Çay içmek için bir dakika mola verin,<br /> çünkü yükleniyor..."
#: code:addons/web/static/src/js/widgets/switch_company_menu.js:44
#, python-format
msgid "Tap on the list to change company"
-msgstr ""
+msgstr "Şirket değiştirmek için listeye dokunun."
#. module: web
#. openerp-web
@@ -2435,7 +2445,7 @@ msgstr "Tel:"
#: code:addons/web/static/src/js/widgets/domain_selector.js:567
#, python-format
msgid "The domain you entered is not properly formed"
-msgstr ""
+msgstr "Girdiğiniz domain düzgünce kurulamadı."
#. module: web
#. openerp-web
@@ -2445,6 +2455,8 @@ msgid ""
"The field chain is not valid. Did you maybe use a non-existing field name or"
" followed a non-relational field?"
msgstr ""
+"Alan zinciri geçersizdir. Belki var olmayan alan adı kullandınız yada "
+"ilişkisi olmayan alanı takip ettiniz."
#. module: web
#. openerp-web
@@ -2481,6 +2493,8 @@ msgid ""
"The record has been modified, your changes will be discarded. Do you want to"
" proceed?"
msgstr ""
+"Kayıt değiştirildi, değişikliklerinizi kaybedeceksiniz. Devam etmek istiyor "
+"musunuz?"
#. module: web
#. openerp-web
@@ -2519,7 +2533,7 @@ msgstr "Dosyanızı yüklerken bir problem oluştu"
#: code:addons/web/static/src/js/widgets/domain_selector.js:459
#, python-format
msgid "This domain is not supported."
-msgstr ""
+msgstr "Bu domain alanı desteklenmiyor."
#. module: web
#. openerp-web
@@ -2595,7 +2609,7 @@ msgstr "Silsile takibi:"
#: code:addons/web/static/src/js/fields/field_utils.js:62
#, python-format
msgid "True"
-msgstr ""
+msgstr "Doğru"
#. module: web
#. openerp-web
@@ -2662,7 +2676,7 @@ msgstr "Tanımlanmamış"
#: code:addons/web/static/src/js/chrome/abstract_web_client.js:191
#, python-format
msgid "Unknown CORS error"
-msgstr ""
+msgstr "Bilinmeyen CORS hatası"
#. module: web
#. openerp-web
@@ -2683,7 +2697,7 @@ msgstr "Adsız"
#: code:addons/web/static/src/js/views/pivot/pivot_view.js:93
#, python-format
msgid "Untitled"
-msgstr ""
+msgstr "Başlıksız"
#. module: web
#. openerp-web
@@ -2764,23 +2778,23 @@ msgstr "Uyarı"
#. module: web
#: model:ir.ui.view,arch_db:web.benchmark_suite
msgid "Web Benchmarks"
-msgstr ""
+msgstr "Web Karşılaştırması"
#. module: web
#: model:ir.ui.view,arch_db:web.qunit_mobile_suite
msgid "Web Mobile Tests"
-msgstr ""
+msgstr "Web Mobil Testleri"
#. module: web
#: model:ir.ui.view,arch_db:web.qunit_suite
msgid "Web Tests"
-msgstr ""
+msgstr "Web Testleri"
#. module: web
#: model:ir.ui.view,arch_db:web.external_layout_boxed
#: model:ir.ui.view,arch_db:web.external_layout_standard
msgid "Web:"
-msgstr ""
+msgstr "Web:"
#. module: web
#. openerp-web
@@ -2866,7 +2880,7 @@ msgstr ""
#: code:addons/web/static/src/js/widgets/model_field_selector.js:455
#, python-format
msgid "You cannot follow relations for this field chain construction"
-msgstr ""
+msgstr "Bu alan zinciri yapısı ilişkilerini takip edemezsiniz."
#. module: web
#: code:addons/web/controllers/main.py:793
@@ -2964,7 +2978,7 @@ msgstr "yaklaşık bir saat önce"
#: code:addons/web/static/src/xml/base.xml:611
#, python-format
msgid "all records"
-msgstr ""
+msgstr "tüm kayıtlar"
#. module: web
#: model:ir.model,name:web.model_base
@@ -3021,7 +3035,7 @@ msgstr "büyük ya da eşittir"
#: code:addons/web/static/src/js/widgets/domain_selector.js:25
#, python-format
msgid "in"
-msgstr ""
+msgstr "içinde"
#. module: web
#: model:ir.model,name:web.model_ir_qweb_field_image
@@ -3043,14 +3057,14 @@ msgstr "olan"
#: code:addons/web/static/src/js/chrome/search_filters.js:183
#, python-format
msgid "is after"
-msgstr ""
+msgstr "sonrası"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome/search_filters.js:184
#, python-format
msgid "is before"
-msgstr ""
+msgstr "öncesi"
#. module: web
#. openerp-web
@@ -3137,7 +3151,7 @@ msgstr "doğrudur"
#: code:addons/web/static/src/js/core/utils.js:127
#, python-format
msgid "kMGTPE"
-msgstr ""
+msgstr "kMGTPE"
#. module: web
#. openerp-web
@@ -3167,7 +3181,7 @@ msgstr "küçük ya da eşittir"
#: code:addons/web/static/src/xml/base.xml:701
#, python-format
msgid "not"
-msgstr ""
+msgstr "değildir"
#. module: web
#. openerp-web
@@ -3188,28 +3202,28 @@ msgstr "geçerli bir sayı değil"
#: code:addons/web/static/src/js/widgets/domain_selector.js:26
#, python-format
msgid "not in"
-msgstr ""
+msgstr "içinde değil"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/widgets/domain_selector.js:658
#, python-format
msgid "not set (false)"
-msgstr ""
+msgstr "ayarlanmaz (yanlış)"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:620
#, python-format
msgid "of the following rules:"
-msgstr ""
+msgstr "takip eden kuralların:"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:635
#, python-format
msgid "of:"
-msgstr ""
+msgstr "ile ilgili:"
#. module: web
#. openerp-web
@@ -3224,14 +3238,14 @@ msgstr "veya"
#: code:addons/web/static/src/js/widgets/domain_selector.js:29
#, python-format
msgid "parent of"
-msgstr ""
+msgstr "üstü olarak"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:576
#, python-format
msgid "record(s)"
-msgstr ""
+msgstr "kayıtlar"
#. module: web
#. openerp-web
@@ -3245,11 +3259,11 @@ msgstr "kalan)"
#: code:addons/web/static/src/xml/base.xml:701
#, python-format
msgid "set"
-msgstr ""
+msgstr "ayar"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/widgets/domain_selector.js:658
#, python-format
msgid "set (true)"
-msgstr ""
+msgstr "ayarla (doğru)"
diff --git a/addons/web/static/src/js/chrome/action_manager.js b/addons/web/static/src/js/chrome/action_manager.js
index 8ae6d93bc58..9885d684dec 100644
--- a/addons/web/static/src/js/chrome/action_manager.js
+++ b/addons/web/static/src/js/chrome/action_manager.js
@@ -775,17 +775,17 @@ var ActionManager = Widget.extend({
* @param {Object} options see @doAction options
*/
_preprocessAction: function (action, options) {
- action._originalAction = JSON.stringify(action);
-
- action.jsID = _.uniqueId('action_');
- action.pushState = options.pushState;
-
// ensure that the context and domain are evaluated
var context = new Context(this.userContext, options.additional_context, action.context);
action.context = pyeval.eval('context', context);
if (action.domain) {
action.domain = pyeval.eval('domain', action.domain, action.context);
}
+
+ action._originalAction = JSON.stringify(action);
+
+ action.jsID = _.uniqueId('action_');
+ action.pushState = options.pushState;
},
/**
* Unlinks the given action and its controller from the internal structures
diff --git a/addons/web/static/src/js/chrome/keyboard_navigation_mixin.js b/addons/web/static/src/js/chrome/keyboard_navigation_mixin.js
index dc1b5247cb1..d0eed176d9c 100644
--- a/addons/web/static/src/js/chrome/keyboard_navigation_mixin.js
+++ b/addons/web/static/src/js/chrome/keyboard_navigation_mixin.js
@@ -26,7 +26,6 @@ odoo.define('web.KeyboardNavigationMixin', function (require) {
var KeyboardNavigationMixin = {
events: {
'keydown': '_onKeyDown',
- 'keypress': '_onKeyPress',
'keyup': '_onKeyUp',
},
@@ -127,6 +126,11 @@ odoo.define('web.KeyboardNavigationMixin', function (require) {
}
}
});
+
+ var elementsWithoutAriaKeyshortcut = this.$el.find('[accesskey]').not('[aria-keyshortcuts]');
+ _.each(elementsWithoutAriaKeyshortcut, function (elem) {
+ elem.setAttribute('aria-keyshortcuts', 'Alt+Shift+' + elem.accessKey);
+ });
this._addAccessKeyOverlays();
}
if (keyDownEvent.altKey && !keyDownEvent.ctrlKey && keyDownEvent.key.length === 1) { // we don't want to catch the Alt key down, only the characters A to Z and number keys
@@ -138,6 +142,7 @@ odoo.define('web.KeyboardNavigationMixin', function (require) {
if (elementWithAccessKey.length) {
if (this.BrowserDetection.isOsMac() ||
!this.BrowserDetection.isBrowserChrome()) { // on windows and linux, chrome does not prevent the default of the accesskeys
+ elementWithAccessKey[0].focus();
elementWithAccessKey[0].click();
if (keyDownEvent.preventDefault) keyDownEvent.preventDefault(); else keyDownEvent.returnValue = false;
if (keyDownEvent.stopPropagation) keyDownEvent.stopPropagation();
@@ -178,21 +183,6 @@ odoo.define('web.KeyboardNavigationMixin', function (require) {
}
},
/**
- * hides the shortcut overlays when key press event is triggered on the ALT key
- *
- * @private
- * @param keyPressEvent {jQueryKeyboardEvent} the keyboard event triggered
- * @return {undefined|false}
- */
- _onKeyPress: function (keyPressEvent) {
- if ((keyPressEvent.altKey || keyPressEvent.key === 'Alt') && !keyPressEvent.ctrlKey) {
- if (keyPressEvent.preventDefault) keyPressEvent.preventDefault(); else keyPressEvent.returnValue = false;
- if (keyPressEvent.stopPropagation) keyPressEvent.stopPropagation();
- if (keyPressEvent.cancelBubble) keyPressEvent.cancelBubble = true;
- return false;
- }
- },
- /**
* hides the shortcut overlays when keyup event is triggered on the ALT key
*
* @private
diff --git a/addons/web/static/src/js/core/ajax.js b/addons/web/static/src/js/core/ajax.js
index 0ee6d2ad1ed..d6c67eacaec 100644
--- a/addons/web/static/src/js/core/ajax.js
+++ b/addons/web/static/src/js/core/ajax.js
@@ -260,8 +260,20 @@ function get_file(options) {
if (options.error) {
var body = this.contentDocument.body;
var nodes = body.children.length === 0 ? body.childNodes : body.children;
- var node = nodes[1] || nodes[0];
- options.error(JSON.parse(node.textContent));
+ var errorParams = {};
+
+ try { // Case of a serialized Odoo Exception: It is Json Parsable
+ var node = nodes[1] || nodes[0];
+ errorParams = JSON.parse(node.textContent);
+ } catch (e) { // Arbitrary uncaught python side exception
+ errorParams = {
+ message: nodes.length > 1 ? nodes[1].textContent : '',
+ data: {
+ title: nodes.length > 0 ? nodes[0].textContent : '',
+ }
+ }
+ }
+ options.error(errorParams);
}
} finally {
complete();
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 10057d44984..31b0c53dd64 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -622,7 +622,7 @@ var FieldMonetary = InputField.extend({
this.$el.empty();
// Prepare and add the input
- this._prepareInput().appendTo(this.$el);
+ this._prepareInput(this.$input).appendTo(this.$el);
if (this.currency) {
// Prepare and add the currency symbol
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 7044a79a535..62cc965cc15 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -340,8 +340,8 @@ var FieldMany2One = AbstractField.extend({
_renderReadonly: function () {
var value = _.escape((this.m2o_value || "").trim()).split("\n").join("<br/>");
this.$el.html(value);
- if (!this.nodeOptions.no_open) {
- this.$el.attr('href', '#');
+ if (!this.nodeOptions.no_open && this.value) {
+ this.$el.attr('href', _.str.sprintf('#id=%s&model=%s', this.value.res_id, this.field.relation));
this.$el.addClass('o_form_uri');
}
},
@@ -1334,10 +1334,7 @@ var FieldOne2Many = FieldX2Many.extend({
var self = this;
var id = ev.data.id;
- var onSaved = function (record, hasChanged) {
- if (!hasChanged) {
- return;
- }
+ var onSaved = function (record) {
if (_.some(self.value.data, {id: record.id})) {
// the record already exists in the relation, so trigger an
// empty 'UPDATE' operation when the user clicks on 'Save' in
diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js
index fe4ba14de71..2f9957737ae 100644
--- a/addons/web/static/src/js/views/abstract_controller.js
+++ b/addons/web/static/src/js/views/abstract_controller.js
@@ -12,6 +12,7 @@ odoo.define('web.AbstractController', function (require) {
* reading localstorage, ...) has to go through the controller.
*/
+var concurrency = require('web.concurrency');
var ControlPanelMixin = require('web.ControlPanelMixin');
var core = require('web.core');
var AbstractAction = require('web.AbstractAction');
@@ -54,6 +55,8 @@ var AbstractController = AbstractAction.extend(ControlPanelMixin, {
this.controllerID = params.controllerID;
this.initialState = params.initialState;
+ // use a DropPrevious to correctly handle concurrent updates
+ this.dp = new concurrency.DropPrevious();
// those arguments are temporary, they won't be necessary as soon as the
// ControlPanel will be handled by the View
this.displayName = params.displayName;
@@ -232,11 +235,11 @@ var AbstractController = AbstractAction.extend(ControlPanelMixin, {
var self = this;
var shouldReload = (options && 'reload' in options) ? options.reload : true;
var def = shouldReload ? this.model.reload(this.handle, params) : $.when();
- return def.then(function (handle) {
+ return this.dp.add(def).then(function (handle) {
self.handle = handle || self.handle; // update handle if we reloaded
var state = self.model.get(self.handle);
var localState = self.renderer.getLocalState();
- return self.renderer.updateState(state, params).then(function () {
+ return self.dp.add(self.renderer.updateState(state, params)).then(function () {
self.renderer.setLocalState(localState);
self._update(state);
});
diff --git a/addons/web/static/src/js/views/abstract_renderer.js b/addons/web/static/src/js/views/abstract_renderer.js
index 2394fb31a64..059380f87bd 100644
--- a/addons/web/static/src/js/views/abstract_renderer.js
+++ b/addons/web/static/src/js/views/abstract_renderer.js
@@ -67,6 +67,11 @@ return Widget.extend({
getLocalState: function () {
},
/**
+ * Order to focus to be given to the content of the current view
+ */
+ giveFocus: function () {
+ },
+ /**
* This is the reverse operation from getLocalState. With this method, we
* expect the renderer to restore all DOM state, if it is relevant.
*
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index ec0fad66a06..cc3dbd67595 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -1068,7 +1068,13 @@ var BasicModel = AbstractModel.extend({
addFieldsInfo: function (recordID, viewInfo) {
var record = this.localData[recordID];
record.fields = _.extend({}, record.fields, viewInfo.fields);
- record.fieldsInfo = _.extend({}, record.fieldsInfo, viewInfo.fieldsInfo);
+ // complete the given fieldsInfo with the fields of the main view, so
+ // that those field will be reloaded if a reload is triggered by the
+ // secondary view
+ var fieldsInfo = _.mapObject(viewInfo.fieldsInfo, function (fieldsInfo) {
+ return _.defaults({}, fieldsInfo, record.fieldsInfo[record.viewType]);
+ });
+ record.fieldsInfo = _.extend({}, record.fieldsInfo, fieldsInfo);
},
/**
* For list resources, this freezes the current records order.
@@ -1553,8 +1559,10 @@ var BasicModel = AbstractModel.extend({
rec = self._makeDataPoint(params);
list._cache[rec.res_id] = rec.id;
}
-
- rec._noAbandon = true;
+ // Do not abandon the record if it has been created
+ // from `default_get`. The list has a savepoint only
+ // after having fully executed `default_get`.
+ rec._noAbandon = !list._savePoint;
list._changes.push({operation: 'ADD', id: rec.id});
if (command[0] === 1) {
list._changes.push({operation: 'UPDATE', id: rec.id});
@@ -1973,6 +1981,9 @@ var BasicModel = AbstractModel.extend({
var records = [];
var ids = [];
list = this._applyX2ManyOperations(list);
+ if (_.isEmpty(list.data)) {
+ return $.when();
+ }
_.each(list.data, function (localId) {
var record = self.localData[localId];
var data = record._changes || record.data;
@@ -1986,13 +1997,16 @@ var BasicModel = AbstractModel.extend({
return this._rpc({
model: model,
method: 'name_get',
- args: [ids],
+ args: [_.uniq(ids)],
context: list.context,
})
.then(function (name_gets) {
- for (var i = 0; i < name_gets.length; i++) {
- records[i].data.display_name = name_gets[i][1];
- }
+ _.each(records, function (record) {
+ var nameGet = _.find(name_gets, function (nameGet) {
+ return nameGet[0] === record.data.id;
+ });
+ record.data.display_name = nameGet[1];
+ });
});
},
/**
@@ -2010,7 +2024,8 @@ var BasicModel = AbstractModel.extend({
*/
_fetchRecord: function (record, options) {
var self = this;
- var fieldNames = options && options.fieldNames || record.getFieldNames();
+ options = options || {};
+ var fieldNames = options.fieldNames || record.getFieldNames(options);
fieldNames = _.uniq(fieldNames.concat(['display_name']));
return this._rpc({
model: record.model,
@@ -2477,7 +2492,16 @@ var BasicModel = AbstractModel.extend({
var self = this;
var def;
if (list.static) {
- def = this._readUngroupedList(list);
+ def = this._readUngroupedList(list).then(function () {
+ if (list.parentID && self.isNew(list.parentID)) {
+ // list from a default_get, so fetch display_name for many2one fields
+ var many2ones = self._getMany2OneFieldNames(list);
+ var defs = _.map(many2ones, function (name) {
+ return self._fetchNameGets(list, name);
+ });
+ return $.when.apply($, defs);
+ }
+ });
} else {
def = this._searchReadUngroupedList(list);
}
@@ -2510,8 +2534,9 @@ var BasicModel = AbstractModel.extend({
_fetchX2Manys: function (record, options) {
var self = this;
var defs = [];
- var fieldNames = options && options.fieldNames || record.getFieldNames();
- var viewType = options && options.viewType || record.viewType;
+ options = options || {};
+ var fieldNames = options.fieldNames || record.getFieldNames(options);
+ var viewType = options.viewType || record.viewType;
_.each(fieldNames, function (fieldName) {
var field = record.fields[fieldName];
if (field.type === 'one2many' || field.type === 'many2many') {
@@ -3034,11 +3059,32 @@ var BasicModel = AbstractModel.extend({
* default view type.
*
* @param {Object} element an element from the localData
+ * @param {Object} [options]
+ * @param {Object} [options.viewType] current viewType. If not set, we will
+ * assume main viewType from the record
* @returns {string[]} the list of field names
*/
- _getFieldNames: function (element) {
+ _getFieldNames: function (element, options) {
var fieldsInfo = element.fieldsInfo;
- return Object.keys(fieldsInfo && fieldsInfo[element.viewType] || {});
+ var viewType = options && options.viewType || element.viewType;
+ return Object.keys(fieldsInfo && fieldsInfo[viewType] || {});
+ },
+ /**
+ * Get many2one fields names in a datapoint. This is useful in order to
+ * fetch their names in the case of a default_get.
+ *
+ * @private
+ * @param {Object} datapoint a valid resource object
+ * @returns {string[]} list of field names that are many2one
+ */
+ _getMany2OneFieldNames: function (datapoint) {
+ var many2ones = [];
+ _.each(datapoint.fields, function (field, name) {
+ if (field.type === 'many2one') {
+ many2ones.push(name);
+ }
+ });
+ return many2ones;
},
/**
* Evaluate the record evaluation context. This method is supposed to be
@@ -3533,13 +3579,16 @@ var BasicModel = AbstractModel.extend({
* @see _fetchRecord @see _makeDefaultRecord
*
* @param {Object} record
- * @param {Object} record
+ * @param {Object} [options]
+ * @param {Object} [options.viewType] current viewType. If not set, we will
+ * assume main viewType from the record
* @returns {Deferred<Object>} resolves to the finished resource
*/
_postprocess: function (record, options) {
var self = this;
var defs = [];
- _.each(record.getFieldNames(), function (name) {
+
+ _.each(record.getFieldNames(options), function (name) {
var field = record.fields[name];
var fieldInfo = record.fieldsInfo[record.viewType][name] || {};
var options = fieldInfo.options || {};
@@ -3879,14 +3928,20 @@ var BasicModel = AbstractModel.extend({
var emptyGroupsIDs = _.difference(_.pluck(previousGroups, 'id'), list.data);
_.each(emptyGroupsIDs, function (groupID) {
list.data.push(groupID);
+ var emptyGroup = self.localData[groupID];
+ // this attribute hasn't been updated in the previous
+ // loop for empty groups
+ emptyGroup.aggregateValues = {};
});
}
return $.when.apply($, defs).then(function () {
- // generate the res_ids of the main list, being the concatenation
- // of the fetched res_ids in each group
- list.res_ids = _.flatten(_.map(arguments, function (group) {
- return group ? group.res_ids : [];
- }));
+ if (!options || !options.onlyGroups) {
+ // generate the res_ids of the main list, being the concatenation
+ // of the fetched res_ids in each group
+ list.res_ids = _.flatten(_.map(arguments, function (group) {
+ return group ? group.res_ids : [];
+ }));
+ }
return list;
});
});
@@ -4116,10 +4171,20 @@ var BasicModel = AbstractModel.extend({
var r2 = self.localData[record2ID];
var data1 = _.extend({}, r1.data, r1._changes);
var data2 = _.extend({}, r2.data, r2._changes);
- if (data1[order.name] < data2[order.name]) {
+
+ // Default value to sort against: the value of the field
+ var orderData1 = data1[order.name];
+ var orderData2 = data2[order.name];
+
+ // If the field is a relation, sort on the display_name of those records
+ if (list.fields[order.name].type === 'many2one') {
+ orderData1 = orderData1 ? self.localData[orderData1].data.display_name : "";
+ orderData2 = orderData2 ? self.localData[orderData2].data.display_name : "";
+ }
+ if (orderData1 < orderData2) {
return order.asc ? -1 : 1;
}
- if (data1[order.name] > data2[order.name]) {
+ if (orderData1 > orderData2) {
return order.asc ? 1 : -1;
}
return compareRecords(record1ID, record2ID, level + 1);
diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js
index 16507184915..24b053a7bbe 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -135,13 +135,6 @@ var BasicRenderer = AbstractRenderer.extend({
dom.setSelectionRange(field.getFocusableElement().get(0), {start: offset, end: offset});
}
},
-
- /**
- * Order to focus to be given to the content of the current view
- */
- giveFocus:function() {
- },
-
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
diff --git a/addons/web/static/src/js/views/calendar/calendar_view.js b/addons/web/static/src/js/views/calendar/calendar_view.js
index a813a626565..6c12d508937 100644
--- a/addons/web/static/src/js/views/calendar/calendar_view.js
+++ b/addons/web/static/src/js/views/calendar/calendar_view.js
@@ -118,8 +118,20 @@ var CalendarView = AbstractView.extend({
//if quick_add = is NOT False and IS specified in view, we this one for widgets.QuickCreate'
this.controllerParams.quickAddPop = (!('quick_add' in attrs) || utils.toBoolElse(attrs.quick_add+'', true));
this.controllerParams.disableQuickCreate = params.disable_quick_create || !this.controllerParams.quickAddPop;
- // If this field is set ot true, we don't open the event in form view, but in a popup with the view_id passed by this parameter
- this.controllerParams.formViewId = !attrs.form_view_id || !utils.toBoolElse(attrs.form_view_id, true) ? false : attrs.form_view_id;
+
+ // If form_view_id is set, then the calendar view will open a form view
+ // with this id, when it needs to edit or create an event.
+ this.controllerParams.formViewId =
+ attrs.form_view_id ? parseInt(attrs.form_view_id, 10) : false;
+ if (!this.controllerParams.formViewId && params.action) {
+ var formViewDescr = _.find(params.action.views, function (v) {
+ return v[1] === 'form';
+ });
+ if (formViewDescr) {
+ this.controllerParams.formViewId = formViewDescr[0];
+ }
+ }
+
this.controllerParams.readonlyFormViewId = !attrs.readonly_form_view_id || !utils.toBoolElse(attrs.readonly_form_view_id, true) ? false : attrs.readonly_form_view_id;
this.controllerParams.eventOpenPopup = utils.toBoolElse(attrs.event_open_popup || '', false);
this.controllerParams.mapping = mapping;
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 dbb64dc3682..be49c12e768 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -233,6 +233,16 @@ var FormController = BasicController.extend({
return changedFields;
});
},
+ /**
+ * Overrides to force the viewType to 'form', so that we ensure that the
+ * correct fields are reloaded (this is only useful for one2many form views).
+ *
+ * @override
+ */
+ update: function (params, options) {
+ params = _.extend({viewType: 'form'}, params);
+ return this._super(params, options);
+ },
//--------------------------------------------------------------------------
// Private
diff --git a/addons/web/static/src/js/views/form/form_view.js b/addons/web/static/src/js/views/form/form_view.js
index 607f9f54a89..f0ea360fed0 100644
--- a/addons/web/static/src/js/views/form/form_view.js
+++ b/addons/web/static/src/js/views/form/form_view.js
@@ -73,6 +73,14 @@ var FormView = BasicView.extend({
_.each(this.loadParams.fieldsInfo.form, function (attrs, fieldName) {
var field = fields[fieldName];
+ if (!field) {
+ // when a one2many record is opened in a form view, the fields
+ // of the main one2many view (list or kanban) are added to the
+ // fieldsInfo of its form view, but those fields aren't in the
+ // loadParams.fields, as they are not displayed in the view, so
+ // we can ignore them.
+ return;
+ }
if (field.type !== 'one2many' && field.type !== 'many2many') {
return;
}
diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js
index 411d4cc7b14..6c4ea1f133c 100644
--- a/addons/web/static/src/js/views/kanban/kanban_model.js
+++ b/addons/web/static/src/js/views/kanban/kanban_model.js
@@ -398,9 +398,8 @@ var KanbanModel = BasicModel.extend({
return $.when();
},
/**
- * Reloads all progressbar data if the given id is a record's one. This is
- * done after given deferred and insures that the given deferred's result is
- * not lost.
+ * Reloads all progressbar data. This is done after given deferred and
+ * insures that the given deferred's result is not lost.
*
* @private
* @param {string} recordID
@@ -409,7 +408,9 @@ var KanbanModel = BasicModel.extend({
*/
_reloadProgressBarGroupFromRecord: function (recordID, def) {
var element = this.localData[recordID];
- if (element.type !== 'record') {
+ if (element.type === 'list' && !element.parentID) {
+ // we are reloading the whole view, so there is no need to manually
+ // reload the progressbars
return def;
}
diff --git a/addons/web/static/src/js/views/kanban/kanban_record.js b/addons/web/static/src/js/views/kanban/kanban_record.js
index 072f4d41f27..30bafaab117 100644
--- a/addons/web/static/src/js/views/kanban/kanban_record.js
+++ b/addons/web/static/src/js/views/kanban/kanban_record.js
@@ -23,7 +23,6 @@ var KanbanRecord = Widget.extend({
events: {
'click .oe_kanban_action': '_onKanbanActionClicked',
'click .o_kanban_manage_toggle_button': '_onManageTogglerClicked',
- 'keydown' : '_onKanbanKeyDown',
},
/**
* @override
@@ -289,6 +288,9 @@ var KanbanRecord = Widget.extend({
if (this.$el.hasClass('oe_kanban_global_click') ||
this.$el.hasClass('oe_kanban_global_click_edit')) {
this.$el.on('click', this._onGlobalClick.bind(this));
+ this.$el.on('keydown', this._onKeyDownCard.bind(this));
+ } else {
+ this.$el.on('keydown', this._onKeyDownOpenFirstLink.bind(this));
}
this._processFields();
this._processWidgets();
@@ -505,11 +507,33 @@ var KanbanRecord = Widget.extend({
this.do_warn("Kanban: no action for type : " + type);
}
},
- _onKanbanKeyDown: function (event) {
+ /**
+ * This event is linked to the kanban card when there is a global_click
+ * class on this card
+ *
+ * @private
+ * @param {KeyDownEvent} event
+ */
+ _onKeyDownCard: function (event) {
+ switch (event.keyCode) {
+ case $.ui.keyCode.ENTER:
+ event.preventDefault();
+ this._onGlobalClick(event);
+ break;
+ }
+ },
+ /**
+ * This event is linked ot the kanban card when there is no global_click
+ * class on the card
+ *
+ * @private
+ * @param {KeyDownEvent} event
+ */
+ _onKeyDownOpenFirstLink: function (event) {
switch (event.keyCode) {
case $.ui.keyCode.ENTER:
event.preventDefault();
- this._openRecord();
+ $(event.target).find('a, button').first().click();
break;
}
},
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 4d26ba3627e..49fe72cc4b2 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
@@ -539,8 +539,13 @@ ListRenderer.include({
* @returns {Deferred} this deferred is resolved immediately
*/
_renderView: function () {
+ var self = this;
this.currentRow = null;
- return this._super.apply(this, arguments);
+ return this._super.apply(this, arguments).then(function () {
+ if (self._isEditable()) {
+ self.$('table').addClass('o_editable_list');
+ }
+ });
},
/**
* Force the resequencing of the items in the list.
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 4a5d9b45b4a..b45f7a9ffdf 100644
--- a/addons/web/static/src/js/views/pivot/pivot_model.js
+++ b/addons/web/static/src/js/views/pivot/pivot_model.js
@@ -17,6 +17,7 @@ odoo.define('web.PivotModel', function (require) {
*/
var AbstractModel = require('web.AbstractModel');
+var concurrency = require('web.concurrency');
var core = require('web.core');
var session = require('web.session');
var utils = require('web.utils');
@@ -32,6 +33,7 @@ var PivotModel = AbstractModel.extend({
this._super.apply(this, arguments);
this.numbering = {};
this.data = null;
+ this._loadDataDropPrevious = new concurrency.DropPrevious();
},
//--------------------------------------------------------------------------
@@ -556,7 +558,7 @@ var PivotModel = AbstractModel.extend({
}
}
- return $.when.apply(null, groupBys.map(function (groupBy) {
+ return this._loadDataDropPrevious.add($.when.apply(null, groupBys.map(function (groupBy) {
return self._rpc({
model: self.modelName,
method: 'read_group',
@@ -566,7 +568,7 @@ var PivotModel = AbstractModel.extend({
groupBy: groupBy,
lazy: false,
});
- })).then(function () {
+ }))).then(function () {
var data = Array.prototype.slice.call(arguments);
if (data[0][0].__count === 0) {
self.data.has_data = false;
diff --git a/addons/web/static/src/scss/list_view.scss b/addons/web/static/src/scss/list_view.scss
index 36bee4439c6..49cba9409cc 100644
--- a/addons/web/static/src/scss/list_view.scss
+++ b/addons/web/static/src/scss/list_view.scss
@@ -5,6 +5,14 @@
background-color: $o-view-background-color;
margin-bottom: 0px;
+ // Checkbox in editable list
+ // should be clickable and activate the row
+ &.o_editable_list .o_data_row:not(.o_selected_row) .o_data_cell {
+ .o_checkbox:not(.o_readonly_modifier) {
+ pointer-events: none;
+ }
+ }
+
&.table {
td, th {
vertical-align: middle;
diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js
index dfafdc85801..fd29e91c73c 100644
--- a/addons/web/static/tests/chrome/action_manager_tests.js
+++ b/addons/web/static/tests/chrome/action_manager_tests.js
@@ -12,6 +12,7 @@ var ListController = require('web.ListController');
var StandaloneFieldManagerMixin = require('web.StandaloneFieldManagerMixin');
var RamStorage = require('web.RamStorage');
var ReportService = require('web.ReportService');
+var SessionStorageService = require('web.SessionStorageService');
var testUtils = require('web.test_utils');
var Widget = require('web.Widget');
var createActionManager = testUtils.createActionManager;
@@ -2860,6 +2861,68 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test("current act_window action is stored in session_storage", function (assert) {
+ assert.expect(1);
+
+ var expectedAction = _.extend({}, _.findWhere(this.actions, {id: 3}), {
+ context: {},
+ });
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ services: [SessionStorageService.extend({
+ setItem: function (key, value) {
+ assert.strictEqual(value, JSON.stringify(expectedAction),
+ "should store the executed action in the sessionStorage");
+ },
+ })],
+ });
+
+ actionManager.doAction(3);
+
+ actionManager.destroy();
+ });
+
+ QUnit.test("store evaluated context of current action in session_storage", function (assert) {
+ // this test ensures that we don't store stringified instances of
+ // CompoundContext in the session_storage, as they would be meaningless
+ // once restored
+ assert.expect(1);
+
+ var expectedAction = _.extend({}, _.findWhere(this.actions, {id: 4}), {
+ context: {
+ active_model: 'partner',
+ active_id: 1,
+ active_ids: [1],
+ },
+ });
+ var checkSessionStorage = false;
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ services: [SessionStorageService.extend({
+ setItem: function (key, value) {
+ if (checkSessionStorage) {
+ assert.strictEqual(value, JSON.stringify(expectedAction),
+ "should correctly store the executed action in the sessionStorage");
+ }
+ },
+ })],
+ });
+
+ // execute an action and open a record in form view
+ actionManager.doAction(3);
+ actionManager.$('.o_list_view .o_data_row:first').click();
+
+ // click on 'Execute action' button (it executes an action with a CompoundContext as context)
+ checkSessionStorage = true;
+ actionManager.$('.o_form_view button:contains(Execute action)').click();
+
+ actionManager.destroy();
+ });
+
QUnit.module('Actions in target="new"');
QUnit.test('can execute act_window actions in target="new"', function (assert) {
diff --git a/addons/web/static/tests/chrome/keyboard_navigation_mixin_tests.js b/addons/web/static/tests/chrome/keyboard_navigation_mixin_tests.js
new file mode 100644
index 00000000000..38f13e7a117
--- /dev/null
+++ b/addons/web/static/tests/chrome/keyboard_navigation_mixin_tests.js
@@ -0,0 +1,31 @@
+odoo.define('web.keyboard_navigation_mixin_tests', function (require) {
+"use strict";
+
+var KeyboardNavigationMixin = require('web.KeyboardNavigationMixin');
+var Widget = require('web.Widget');
+
+QUnit.module('KeyboardNavigationMixin', function () {
+ QUnit.test('aria-keyshortcuts is added on elements with accesskey', function (assert) {
+ assert.expect(1);
+ var $target = $('#qunit-fixture');
+ var KeyboardWidget = Widget.extend(KeyboardNavigationMixin, {
+ start: function () {
+ var $button = $('<button>').text('Click Me!').attr('accesskey', 'o');
+ // we need to define the accesskey because it will not be assigned on invisible buttons
+ this.$el.append($button);
+ return this._super.apply(this, arguments);
+ },
+ });
+ var w = new KeyboardWidget();
+ w.appendTo($target);
+
+ // minimum set of attribute to generate a native event that works with the mixin
+ var e = new Event("keydown");
+ e.key = '';
+ e.altKey = true;
+ w.$el[0].dispatchEvent(e);
+
+ assert.ok(w.$el.find('button[aria-keyshortcuts]')[0], 'the aria-keyshortcuts is set on the button');
+ });
+});
+});
diff --git a/addons/web/static/tests/core/pyeval_tests.js b/addons/web/static/tests/core/pyeval_tests.js
index 89bfa32872b..737466c8c93 100644
--- a/addons/web/static/tests/core/pyeval_tests.js
+++ b/addons/web/static/tests/core/pyeval_tests.js
@@ -508,7 +508,6 @@ QUnit.module('core', function () {
{
"default_attachment_ids": [],
"default_body": "",
- "default_content_subtype": "html",
"default_model": "res.users",
"default_parent_id": false,
"default_res_id": 1
@@ -526,7 +525,6 @@ QUnit.module('core', function () {
assert.deepEqual(result.context, {
"default_attachment_ids": [],
"default_body": "",
- "default_content_subtype": "html",
"default_model": "res.users",
"default_parent_id": false,
"default_res_id": 1,
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index b16d812993e..1012974bb58 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -599,6 +599,35 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('many2one in non edit mode', function (assert) {
+ assert.expect(3);
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="trululu"/>' +
+ '</form>',
+ res_id: 1,
+ });
+
+ assert.strictEqual(form.$('a.o_form_uri').length, 1,
+ "should display 1 m2o link in form");
+ assert.strictEqual(form.$('a.o_form_uri').attr('href'), "#id=4&model=partner",
+ "href should contain id and model");
+
+ // Remove value from many2one and then save, there should not have href with id and model on m2o anchor
+ form.$buttons.find('.o_form_button_edit').click();
+ form.$('.o_field_many2one input').val('').trigger('keyup').trigger('focusout');
+ form.$buttons.find('.o_form_button_save').click();
+
+ assert.strictEqual(form.$('a.o_form_uri').attr('href'), "#",
+ "href should have #");
+
+ form.destroy();
+ });
+
QUnit.test('many2one searches with correct value', function (assert) {
var done = assert.async();
assert.expect(6);
@@ -1208,8 +1237,167 @@ QUnit.module('relational_fields', {
form.destroy();
});
- QUnit.test('list in form: discard newly added element with empty required field (onchange)', function (assert) {
- assert.expect(8);
+ QUnit.test('list in form: name_get with unique ids (default_get)', function (assert) {
+ assert.expect(2);
+
+ this.data.partner.records[0].display_name = "MyTrululu";
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<sheet>' +
+ '<field name="p">' +
+ '<tree editable="bottom">' +
+ '<field name="trululu"/>' +
+ '</tree>' +
+ '</field>' +
+ '</sheet>' +
+ '</form>',
+ mockRPC: function (route, args) {
+ if (args.method === 'default_get') {
+ return $.when({
+ p: [
+ [0, 0, { trululu: 1 }],
+ [0, 0, { trululu: 1 }]
+ ]
+ });
+ }
+ if (args.method === 'name_get') {
+ assert.deepEqual(args.args[0], _.uniq(args.args[0]),
+ "should not have duplicates in name_get rpc");
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.strictEqual(form.$('td.o_data_cell').text(), "MyTrululuMyTrululu",
+ "both records should have the correct display_name for trululu field");
+
+ form.destroy();
+ });
+
+ QUnit.test('list in form: show name of many2one fields in multi-page (default_get)', function (assert) {
+ assert.expect(4);
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<sheet>' +
+ '<field name="p">' +
+ '<tree editable="bottom" limit="1">' +
+ '<field name="display_name"/>' +
+ '<field name="trululu"/>' +
+ '</tree>' +
+ '</field>' +
+ '</sheet>' +
+ '</form>',
+ mockRPC: function (route, args) {
+ if (args.method === 'default_get') {
+ return $.when({
+ p: [
+ [0, 0, { display_name: 'record1', trululu: 1 }],
+ [0, 0, { display_name: 'record2', trululu: 2 }]
+ ]
+ });
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.strictEqual(form.$('td.o_data_cell').first().text(),
+ "record1", "should show display_name of 1st record");
+ assert.strictEqual(form.$('td.o_data_cell').first().next().text(),
+ "first record", "should show display_name of trululu of 1st record");
+
+ form.$('button.o_pager_next').click();
+
+ assert.strictEqual(form.$('td.o_data_cell').first().text(),
+ "record2", "should show display_name of 2nd record");
+ assert.strictEqual(form.$('td.o_data_cell').first().next().text(),
+ "second record", "should show display_name of trululu of 2nd record");
+
+ form.destroy();
+ });
+
+ QUnit.test('list in form: discard newly added element with empty required field (onchange in default_get)', function (assert) {
+ // variant of the test "list in form: discard newly added element with
+ // empty required field (default_get)", in which the `default_get`
+ // performs an `onchange` at the same time. This `onchange` may create
+ // some records, which should not be abandoned on discard, similarly
+ // to records created directly by `default_get`
+ assert.expect(7);
+
+ var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY;
+ relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0;
+
+ this.data.partner.onchanges = {
+ product_id: function (obj) {
+ if (obj.product_id === 37) {
+ obj.p = [[0, 0, { display_name: "entry", trululu: false }]];
+ }
+ },
+ };
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="product_id"/>' +
+ '<field name="p">' +
+ '<tree editable="bottom">' +
+ '<field name="display_name"/>' +
+ '<field name="trululu" required="1"/>' +
+ '</tree>' +
+ '</field>' +
+ '</form>',
+ mockRPC: function (route, args) {
+ if (args.method === 'default_get') {
+ return $.when({
+ product_id: 37,
+ });
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ // check that there is a record in the editable list with empty string as required field
+ assert.strictEqual(form.$('.o_data_row').length, 1,
+ "should have a row in the editable list");
+ assert.strictEqual($('td.o_data_cell').first().text(), "entry",
+ "should have the correct displayed name");
+ var requiredField = $('td.o_data_cell.o_required_modifier');
+ assert.strictEqual(requiredField.length, 1,
+ "should have a required field on this record");
+ assert.strictEqual(requiredField.text(), "",
+ "should have empty string in the required field on this record");
+
+ // click on empty required field in editable list record
+ requiredField.click();
+ // click off so that the required field still stay empty
+ $('body').click();
+
+ // record should not be dropped
+ assert.strictEqual(form.$('.o_data_row').length, 1,
+ "should not have dropped record in the editable list");
+ assert.strictEqual($('td.o_data_cell').first().text(), "entry",
+ "should still have the correct displayed name");
+ assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "",
+ "should still have empty string in the required field");
+
+ relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY;
+ form.destroy();
+ });
+
+ QUnit.test('list in form: discard newly added element with empty required field (onchange after default_get)', function (assert) {
+ // discarding a record from an `onchange` in a `default_get` should not
+ // abandon the record. However, any `onchange` after `default_get`
+ // should be abandoned on discard
+ assert.expect(6);
var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY;
relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0;
@@ -1220,7 +1408,6 @@ QUnit.module('relational_fields', {
obj.p = [[0, 0, { display_name: "entry", trululu: false }]];
}
},
- trululu: function () {},
};
var form = createView({
@@ -1262,13 +1449,9 @@ QUnit.module('relational_fields', {
// click off so that the required field still stay empty
$('body').click();
- // record should not be dropped
- assert.strictEqual(form.$('.o_data_row').length, 1,
- "should not have droppped record in the editable list");
- assert.strictEqual($('td.o_data_cell').first().text(), "entry",
- "should still have the correct displayed name");
- assert.strictEqual($('td.o_data_cell.o_required_modifier').text(), "",
- "should still have empty string in the required field");
+ // record should be dropped
+ assert.strictEqual(form.$('.o_data_row').length, 0,
+ "should have dropped record in the editable list");
relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY;
form.destroy();
@@ -2243,6 +2426,43 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('x2many list sorted by many2one', function (assert) {
+ assert.expect(3);
+
+ this.data.partner.records[0].p = [1, 2, 4];
+ this.data.partner.fields.trululu.sortable = true;
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="p">' +
+ '<tree>' +
+ '<field name="id"/>' +
+ '<field name="trululu"/>' +
+ '</tree>' +
+ '</field>' +
+ '</form>',
+ res_id: 1,
+ });
+
+ assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '124',
+ "should have correct order initially");
+
+ form.$('.o_list_view thead th:nth(1)').click();
+
+ assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '412',
+ "should have correct order (ASC)");
+
+ form.$('.o_list_view thead th:nth(1)').click();
+
+ assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '214',
+ "should have correct order (DESC)");
+
+ form.destroy();
+ });
+
QUnit.test('many2many list add *many* records, remove, re-add', function (assert) {
assert.expect(5);
@@ -5763,7 +5983,7 @@ QUnit.module('relational_fields', {
rpcCount++;
if (args.method === 'write') {
assert.deepEqual(args.args[1].p, [[0, args.args[1].p[0][1], {
- int_field: 123, product_id: 41
+ foo: false, int_field: 123, product_id: 41,
}]]);
}
return this._super(route, args);
@@ -8921,6 +9141,74 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('one2many form view with action button', function (assert) {
+ // once the action button is clicked, the record is reloaded (via the
+ // on_close handler, executed because the python method does not return
+ // any action, or an ir.action.act_window_close) ; this test ensures that
+ // it reloads the fields of the opened view (i.e. the form in this case).
+ // See https://github.com/odoo/odoo/issues/24189
+ assert.expect(7);
+
+ var data = this.data;
+ data.partner.records[0].p = [2];
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: data,
+ res_id: 1,
+ arch: '<form string="Partners">' +
+ '<field name="p">' +
+ '<tree><field name="display_name"/></tree>' +
+ '<form>' +
+ '<button type="action" string="Set Timmy"/>' +
+ '<field name="timmy"/>' +
+ '</form>' +
+ '</field>' +
+ '</form>',
+ archs: {
+ 'partner_type,false,list': '<tree><field name="display_name"/></tree>',
+ },
+ intercepts: {
+ execute_action: function (ev) {
+ data.partner.records[1].display_name = 'new name';
+ data.partner.records[1].timmy = [12];
+ ev.data.on_closed();
+ },
+ },
+ viewOptions: {
+ mode: 'edit',
+ },
+ });
+
+ assert.strictEqual(form.$('.o_data_row').length, 1,
+ "there should be one record in the one2many");
+ assert.strictEqual(form.$('.o_data_cell').text(), 'second record',
+ "initial display_name of o2m record should be correct");
+
+ // open one2many record in form view
+ form.$('.o_data_cell:first').click();
+ assert.strictEqual($('.modal .o_form_view').length, 1,
+ "should have opened the form view in a dialog");
+ assert.strictEqual($('.modal .o_form_view .o_data_row').length, 0,
+ "there should be no record in the many2many");
+
+ // click on the action button
+ $('.modal .o_form_view button').click();
+ assert.strictEqual($('.modal .o_data_row').length, 1,
+ "fields in the o2m form view should have been read");
+ assert.strictEqual($('.modal .o_data_cell').text(), 'gold',
+ "many2many subrecord should have been fetched");
+
+ // save the dialog
+ $('.modal .modal-footer .btn-primary').click();
+
+ assert.strictEqual(form.$('.o_data_cell').text(), 'new name',
+ "fields in the o2m list view should have been read as well");
+
+ form.destroy();
+ });
+
QUnit.module('FieldMany2Many');
QUnit.test('many2many kanban: edition', function (assert) {
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index b57b59eb2a7..5afdc3dd447 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -116,12 +116,12 @@ var MockServer = Class.extend({
console.log('%c[rpc] response' + route, 'color: blue; font-weight: bold;', JSON.parse(resultString));
}
return JSON.parse(resultString);
- }).fail(function (result) {
+ }, function (result, event) {
var errorString = JSON.stringify(result || false);
if (debug) {
console.log('%c[rpc] response (error) ' + route, 'color: orange; font-weight: bold;', JSON.parse(errorString));
}
- return JSON.parse(errorString);
+ return $.Deferred().reject(errorString, event || $.Event());
});
},
@@ -854,7 +854,7 @@ var MockServer = Class.extend({
*/
_mockReadProgressBar: function (model, kwargs) {
var domain = kwargs.domain;
- var groupBy = kwargs.groupBy;
+ var groupBy = kwargs.group_by;
var progress_bar = kwargs.progress_bar;
var records = this._getRecords(model, domain || []);
diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js
index 2da3eb5ddd9..6c05076ef98 100644
--- a/addons/web/static/tests/helpers/test_utils.js
+++ b/addons/web/static/tests/helpers/test_utils.js
@@ -733,53 +733,6 @@ function patch (target, props) {
});
}
}
-/**
- * In Phantomjs, there is a crash when calling window.getSelection
- * in order for the tests to work, for the specific test that uses it, replace
- * the default window.getSelection by a mock
- *
- * usage:
- * QUnit.test('...',function(done){
- * var unpatchWindowGetSelection = testUtils.patchWindowGetSelection();
- *
- * // do something that needs to use window.getSelection()
- * assert.strictEqual(....);
- *
- * // restore the original function
- * unpatchWindowGetSelection();
- *
- * // finish the test
- * done();
- * })
- *
- * @returns {function} the unpatch function
- */
-function patchWindowGetSelection() {
- var originalWindowGetSelection = window.getSelection;
- window.getSelection = function () {
- return {
- removeAllRanges: function () {},
- addRange: function (range) {},
- getRangeAt: function (index) {
- return {
- startOffset : 0
- };
- },
- anchorNode: {
- parentNode: {
- childNodes: [{
- outerHTML: "@",
- nodeType: 3,
- textContent: '@',
- }],
- },
- },
- };
- };
- return function () {
- window.getSelection = originalWindowGetSelection;
- };
-}
/**
* Unpatches a given Class or Object.
@@ -831,7 +784,6 @@ return $.when(
intercept: intercept,
observe: observe,
patch: patch,
- patchWindowGetSelection: patchWindowGetSelection,
removeSrcAttribute: removeSrcAttribute,
triggerKeypressEvent: triggerKeypressEvent,
triggerMouseEvent: triggerMouseEvent,
diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js
index f1356558a23..9728d8a7c74 100644
--- a/addons/web/static/tests/views/calendar_tests.js
+++ b/addons/web/static/tests/views/calendar_tests.js
@@ -1895,6 +1895,101 @@ QUnit.module('Views', {
calendar.destroy();
});
+
+ QUnit.test('form_view_id attribute works (for creating events)', function (assert) {
+ assert.expect(1);
+
+ var calendar = createView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch: '<calendar class="o_calendar_test" '+
+ 'date_start="start" '+
+ 'date_stop="stop" '+
+ 'mode="month" '+
+ 'form_view_id="42">'+
+ '<field name="name"/>'+
+ '</calendar>',
+ archs: archs,
+ viewOptions: {
+ initialDate: initialDate,
+ },
+ mockRPC: function (route, args) {
+ if (args.method === "create") {
+ // we simulate here the case where a create call with just
+ // the field name fails. This is a normal flow, the server
+ // reject the create rpc (quick create), then the web client
+ // fall back to a form view. This happens typically when a
+ // model has required fields
+ return $.Deferred().reject('None shall pass!');
+ }
+ return this._super(route, args);
+ },
+ intercepts: {
+ do_action: function (event) {
+ assert.strictEqual(event.data.action.views[0][0], 42,
+ "should do a do_action with view id 42");
+ },
+ },
+ });
+
+ var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
+ testUtils.triggerMouseEvent($cell, "mousedown");
+ testUtils.triggerMouseEvent($cell, "mouseup");
+ var $input = $('.modal-body input:first');
+ $input.val("It's just a fleshwound").trigger('input');
+ $('.modal button.btn:contains(Create)').trigger('click');
+
+ calendar.destroy();
+ });
+
+ QUnit.test('calendar fallback to form view id in action if necessary', function (assert) {
+ assert.expect(1);
+
+ var calendar = createView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch: '<calendar class="o_calendar_test" '+
+ 'date_start="start" '+
+ 'date_stop="stop" '+
+ 'mode="month"> '+
+ '<field name="name"/>'+
+ '</calendar>',
+ archs: archs,
+ viewOptions: {
+ initialDate: initialDate,
+ action: {views: [[1, 'kanban'], [43, 'form']]}
+ },
+ mockRPC: function (route, args) {
+ if (args.method === "create") {
+ // we simulate here the case where a create call with just
+ // the field name fails. This is a normal flow, the server
+ // reject the create rpc (quick create), then the web client
+ // fall back to a form view. This happens typically when a
+ // model has required fields
+ return $.Deferred().reject('None shall pass!');
+ }
+ return this._super(route, args);
+ },
+ intercepts: {
+ do_action: function (event) {
+ assert.strictEqual(event.data.action.views[0][0], 43,
+ "should do a do_action with view id 43");
+ },
+ },
+ });
+
+ var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
+ testUtils.triggerMouseEvent($cell, "mousedown");
+ testUtils.triggerMouseEvent($cell, "mouseup");
+ var $input = $('.modal-body input:first');
+ $input.val("It's just a fleshwound").trigger('input');
+ $('.modal button.btn:contains(Create)').trigger('click');
+
+ calendar.destroy();
+ });
+
});
});
diff --git a/addons/web/static/tests/views/graph_tests.js b/addons/web/static/tests/views/graph_tests.js
index a13130e4b27..028eb4cb3a3 100644
--- a/addons/web/static/tests/views/graph_tests.js
+++ b/addons/web/static/tests/views/graph_tests.js
@@ -602,6 +602,22 @@ QUnit.module('Views', {
done();
});
});
+
+ QUnit.test('graph view crash when moving from search view using Down key', function (assert) {
+ assert.expect(1);
+
+ var graph = createView({
+ View: GraphView,
+ model: "foo",
+ data: this.data,
+ arch: '<graph string="Partners" type="pie">' +
+ '<field name="bar"/>' +
+ '</graph>',
+ });
+ graph.renderer.giveFocus();
+ assert.ok(true,"should not generate any error");
+ graph.destroy();
+ });
});
});
diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js
index 04003c568a3..04c1c603118 100644
--- a/addons/web/static/tests/views/kanban_tests.js
+++ b/addons/web/static/tests/views/kanban_tests.js
@@ -3273,6 +3273,132 @@ QUnit.module('Views', {
kanban.destroy();
});
+ // XXX test deactivated in saas~11.2 as kanban archiving has been removed (and readded in saas~11.4)
+ QUnit.skip('column progressbars on archiving records update counter', function (assert) {
+ assert.expect(4);
+
+ // add active field on partner model and make all records active
+ this.data.partner.fields.active = {string: 'Active', type: 'char', default: true};
+
+ var kanban = createView({
+ View: KanbanView,
+ model: 'partner',
+ data: this.data,
+ arch:
+ '<kanban>' +
+ '<field name="active"/>' +
+ '<field name="bar"/>' +
+ '<field name="int_field"/>' +
+ '<progressbar field="foo" colors=\'{"yop": "success", "gnap": "warning", "blip": "danger"}\' sum_field="int_field"/>' +
+ '<templates><t t-name="kanban-box">' +
+ '<div>' +
+ '<field name="name"/>' +
+ '</div>' +
+ '</t></templates>' +
+ '</kanban>',
+ groupBy: ['bar'],
+ });
+
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_counter_side').text(), "36",
+ "counter should contain the correct value");
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_counter_progress > .progress-bar:first').data('originalTitle'), "1 yop",
+ "the counter progressbars should be correctly displayed");
+
+ // archive all records of the second columns
+ kanban.$('.o_kanban_group:eq(1) .o_column_archive').click();
+
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_counter_side').text(), "0",
+ "counter should contain the correct value");
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_counter_progress > .progress-bar:first').data('originalTitle'), "0 yop",
+ "the counter progressbars should have been correctly updated");
+
+ kanban.destroy();
+ });
+
+ QUnit.skip('kanban with progressbars: correctly update env when archiving records', function (assert) {
+ assert.expect(3);
+
+ // add active field on partner model and make all records active
+ this.data.partner.fields.active = {string: 'Active', type: 'char', default: true};
+
+ var kanban = createView({
+ View: KanbanView,
+ model: 'partner',
+ data: this.data,
+ arch:
+ '<kanban>' +
+ '<field name="active"/>' +
+ '<field name="bar"/>' +
+ '<field name="int_field"/>' +
+ '<progressbar field="foo" colors=\'{"yop": "success", "gnap": "warning", "blip": "danger"}\' sum_field="int_field"/>' +
+ '<templates><t t-name="kanban-box">' +
+ '<div>' +
+ '<field name="name"/>' +
+ '</div>' +
+ '</t></templates>' +
+ '</kanban>',
+ groupBy: ['bar'],
+ intercepts: {
+ env_updated: function (ev) {
+ assert.step(ev.data.ids);
+ },
+ },
+ });
+
+ // archive all records of the first column
+ kanban.$('.o_kanban_group:first .o_column_archive').click();
+
+ assert.verifySteps([
+ [1, 2, 3, 4],
+ [1, 2, 3],
+ ]);
+
+ kanban.destroy();
+ });
+
+ QUnit.test('RPCs when (re)loading kanban view progressbars', function (assert) {
+ assert.expect(9);
+
+ var kanban = createView({
+ View: KanbanView,
+ model: 'partner',
+ data: this.data,
+ arch:
+ '<kanban>' +
+ '<field name="bar"/>' +
+ '<field name="int_field"/>' +
+ '<progressbar field="foo" colors=\'{"yop": "success", "gnap": "warning", "blip": "danger"}\' sum_field="int_field"/>' +
+ '<templates><t t-name="kanban-box">' +
+ '<div>' +
+ '<field name="name"/>' +
+ '</div>' +
+ '</t></templates>' +
+ '</kanban>',
+ groupBy: ['bar'],
+ mockRPC: function (route, args) {
+ assert.step(args.method || route);
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ kanban.reload();
+
+ assert.verifySteps([
+ // initial load
+ 'read_group',
+ '/web/dataset/search_read',
+ '/web/dataset/search_read',
+ 'read_progress_bar',
+ // reload
+ 'read_group',
+ '/web/dataset/search_read',
+ '/web/dataset/search_read',
+ 'read_progress_bar',
+ ]);
+
+ kanban.destroy();
+ });
+
QUnit.test('drag & drop records grouped by m2o with progressbar', function (assert) {
assert.expect(4);
@@ -3342,7 +3468,7 @@ QUnit.module('Views', {
"Initial count should be Three");
kanban.$('.bg-success-full').click();
var lastCount = parseInt(kanban.$('.o_kanban_counter_side').eq(1).text());
- assert.strictEqual(lastCount, 0,
+ assert.strictEqual(lastCount, 1,
"kanban counters should vary according to what subgroup is selected");
kanban.destroy();
@@ -3638,6 +3764,34 @@ QUnit.module('Views', {
kanban.destroy();
});
+
+ QUnit.test('keyboard navigation on kanban when the focus is on a link that' +
+ 'has an action and the kanban has no oe_kanban_global_... class', function(assert){
+ assert.expect(1)
+ var kanban = createView({
+ View: KanbanView,
+ model: 'partner',
+ data: this.data,
+ arch: '<kanban class="o_kanban_test"><templates><t t-name="kanban-box">' +
+ '<div><a type="edit">Edit</a></div>' +
+ '</t></templates></kanban>',
+ });
+
+ testUtils.intercept(kanban, 'switch_view', function (event) {
+ assert.deepEqual(event.data, {
+ view_type: 'form',
+ res_id: 1,
+ mode: 'edit',
+ model: 'partner',
+ },'When selecting focusing a card and hitting ENTER, the first link or button is clicked');
+ });
+ kanban.$('.o_kanban_record').first().focus().trigger($.Event('keydown', {
+ keyCode: $.ui.keyCode.ENTER,
+ which: $.ui.keyCode.ENTER,
+ }));
+
+ kanban.destroy();
+ });
});
});
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index c948528dcc6..fb4ccee9f8b 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -2414,7 +2414,7 @@ QUnit.module('Views', {
// Press 'Tab' -> should go to next line
// add a value in the cell because the Tab on an empty first cell would activate the next widget in the view
- list.$('.o_selected_row input').val(11).trigger('input');
+ list.$('.o_selected_row input').val(11).trigger('input');
list.$('.o_selected_row input').trigger({type: 'keydown', which: 9});
assert.ok(list.$('.o_data_row:nth(3)').hasClass('o_selected_row'),
"fourth row should be in edition");
@@ -3431,6 +3431,47 @@ QUnit.module('Views', {
testUtils.unpatch(mixins.ParentedMixin);
});
+ QUnit.test('concurrent reloads finishing in inverse order', function (assert) {
+ assert.expect(3);
+
+ var blockSearchRead = false;
+ var def = $.Deferred();
+ var list = createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree><field name="foo"/></tree>',
+ mockRPC: function (route) {
+ var result = this._super.apply(this, arguments);
+ if (route === '/web/dataset/search_read' && blockSearchRead) {
+ return $.when(def).then(_.constant(result));
+ }
+ return result;
+ },
+ });
+
+ assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4,
+ "list view should contain 4 records");
+
+ // reload with a domain (this request is blocked)
+ blockSearchRead = true;
+ list.reload({domain: [['foo', '=', 'yop']]});
+
+ assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4,
+ "list view should still contain 4 records (search_read being blocked)");
+
+ // reload without the domain
+ blockSearchRead = false;
+ list.reload({domain: []});
+
+ // unblock the RPC
+ def.resolve();
+ assert.strictEqual(list.$('.o_list_view .o_data_row').length, 4,
+ "list view should still contain 4 records");
+
+ list.destroy();
+ });
+
QUnit.test('list view on a "noCache" model', function (assert) {
assert.expect(8);
diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js
index a1d9e1fae1f..4d7358f2574 100644
--- a/addons/web/static/tests/views/pivot_tests.js
+++ b/addons/web/static/tests/views/pivot_tests.js
@@ -1145,4 +1145,37 @@ QUnit.module('Views', {
pivot.destroy();
});
+
+ QUnit.test('parallel data loading should discard all but the last one', function (assert) {
+ assert.expect(2);
+
+ var def;
+
+ var pivot = createView({
+ View: PivotView,
+ model: "partner",
+ data: this.data,
+ arch: '<pivot>' +
+ '<field name="foo" type="measure"/>' +
+ '</pivot>',
+ mockRPC: function (route, args) {
+ var result = this._super.apply(this, arguments);
+ if (args.method === 'read_group') {
+ return $.when(def).then(_.constant(result));
+ }
+ return result;
+ },
+ });
+
+ def = $.Deferred();
+ pivot.update({groupBy: ['product_id']});
+ pivot.update({groupBy: ['product_id', 'customer']});
+ def.resolve();
+
+ assert.strictEqual(pivot.$('.o_pivot_cell_value').length, 6,
+ "should have 6 cells");
+ assert.strictEqual(pivot.$('tbody tr').length, 6,
+ "should have 6 rows");
+ pivot.destroy();
+ });
});});
diff --git a/addons/web/tests/test_js.py b/addons/web/tests/test_js.py
index f903fa704c5..04df8be91c1 100644
--- a/addons/web/tests/test_js.py
+++ b/addons/web/tests/test_js.py
@@ -32,6 +32,6 @@ class WebSuite(odoo.tests.HttpCase):
filename = asset['filename']
if not filename or asset['atype'] != 'text/javascript':
continue
- with open(filename, 'r') as fp:
- if RE_ONLY.search(fp.read()):
+ with open(filename, 'rb') as fp:
+ if RE_ONLY.search(fp.read().decode('utf-8')):
self.fail("`QUnit.only()` used in file %r" % asset['url'])
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index 8e13b294952..2cc10572543 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -534,6 +534,7 @@
<script type="text/javascript" src="/web/static/tests/chrome/action_manager_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/search_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/pager_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/chrome/keyboard_navigation_mixin_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/widgets/data_export_tests.js"/>
<script type="text/javascript" src="/web/static/tests/widgets/debug_manager_tests.js"/>
diff --git a/addons/web_diagram/i18n/tr.po b/addons/web_diagram/i18n/tr.po
index c9cc5fde86d..c2c16d8b245 100644
--- a/addons/web_diagram/i18n/tr.po
+++ b/addons/web_diagram/i18n/tr.po
@@ -3,14 +3,15 @@
# * web_diagram
#
# Translators:
-# Martin Trigaux <mat@odoo.com>, 2017
+# Martin Trigaux, 2017
+# Umur Akın <umura@projetgrup.com>, 2018
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 10.saas~18\n"
+"Project-Id-Version: Odoo Server saas~11.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-09-20 09:54+0000\n"
-"PO-Revision-Date: 2017-09-20 09:54+0000\n"
-"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
+"POT-Creation-Date: 2018-03-22 14:11+0000\n"
+"PO-Revision-Date: 2018-03-22 14:11+0000\n"
+"Last-Translator: Umur Akın <umura@projetgrup.com>, 2018\n"
"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -34,13 +35,15 @@ msgid ""
"Are you sure you want to remove this node ? This will remove its connected "
"transitions as well."
msgstr ""
+"Bu düğümü kaldırmak istediğinizden emin misiniz? Bu bağlı geçişleri de "
+"kaldıracaktır."
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram_controller.js:172
#, python-format
msgid "Are you sure you want to remove this transition?"
-msgstr ""
+msgstr "Bu geçişi kaldırmak istediğinize emin misiniz?"
#. module: web_diagram
#. openerp-web
@@ -70,7 +73,7 @@ msgstr "Yeni Düğüm"
#: code:addons/web_diagram/static/src/js/diagram_controller.js:160
#, python-format
msgid "Open:"
-msgstr ""
+msgstr "Aç:"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_editor/i18n/tr.po b/addons/web_editor/i18n/tr.po
index 619a84af27d..228dd930fa4 100644
--- a/addons/web_editor/i18n/tr.po
+++ b/addons/web_editor/i18n/tr.po
@@ -35,7 +35,7 @@ msgstr ""
#: code:addons/web_editor/static/src/xml/editor.xml:193
#, python-format
msgid "(URL or Embed)"
-msgstr ""
+msgstr "(URL ya da Gömülü)"
#. module: web_editor
#. openerp-web
@@ -47,32 +47,32 @@ msgstr "(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "25% Black"
-msgstr ""
+msgstr "%25 Siyah"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "25% White"
-msgstr ""
+msgstr "%25 Beyaz"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "50% Black"
-msgstr ""
+msgstr "%50 Siyah"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "50% White"
-msgstr ""
+msgstr "%50 Beyaz"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "75% Black"
-msgstr ""
+msgstr "%75 Siyah"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "75% White"
-msgstr ""
+msgstr "%75 Beyaz"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.snippets
@@ -93,7 +93,7 @@ msgstr ""
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Accepts"
-msgstr ""
+msgstr "Kabuller"
#. module: web_editor
#. openerp-web
@@ -119,33 +119,33 @@ msgstr "Bir resim URL ekle"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.snippets
msgid "Add blocks"
-msgstr ""
+msgstr "Reklam Engelleyici"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:966
#, python-format
msgid "Align center"
-msgstr ""
+msgstr "Merkeze hizalama"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:965
#, python-format
msgid "Align left"
-msgstr ""
+msgstr "Sola hizala"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:967
#, python-format
msgid "Align right"
-msgstr ""
+msgstr "Sağa hizala"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Alpha"
-msgstr ""
+msgstr "Alpha"
#. module: web_editor
#. openerp-web
@@ -159,7 +159,7 @@ msgstr "Alternatif Yükleme"
#: code:addons/web_editor/static/src/xml/editor.xml:315
#, python-format
msgid "Assign a focal point that will always be visible"
-msgstr ""
+msgstr "Her zaman görünecek bir merkez noktaya hizala"
#. module: web_editor
#: model:ir.model.fields,field_description:web_editor.field_ir_attachment__local_url
@@ -186,47 +186,47 @@ msgstr "Arkaplan Rengi"
#: code:addons/web_editor/static/src/js/editor/snippets.options.js:950
#, python-format
msgid "Background Image Sizing"
-msgstr ""
+msgstr "Arka Plan Resim Boyutu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:354
#, python-format
msgid "Background height"
-msgstr ""
+msgstr "Arkaplan Yüksekliği"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:364
#, python-format
msgid "Background position"
-msgstr ""
+msgstr "Arkaplan Konumu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:386
#, python-format
msgid "Background repeat"
-msgstr ""
+msgstr "Arkaplan Tekrarı"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:342
#, python-format
msgid "Background size"
-msgstr ""
+msgstr "Arkaplan Boyutu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:345
#, python-format
msgid "Background width"
-msgstr ""
+msgstr "Arkaplan Genişliği"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Beta"
-msgstr ""
+msgstr "Beta"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
@@ -245,28 +245,28 @@ msgstr "Blok"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:893
#, python-format
msgid "Bold"
-msgstr ""
+msgstr "Kalın"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/widgets/ace.js:832
#, python-format
msgid "Careful !"
-msgstr ""
+msgstr "Dikkat !"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:96
#, python-format
msgid "Center"
-msgstr ""
+msgstr "Merkez"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/widgets/widgets.js:81
#, python-format
msgid "Change media description and tooltip"
-msgstr ""
+msgstr "Medya tanımını ve araç bilgisini değiştir"
#. module: web_editor
#. openerp-web
@@ -289,7 +289,7 @@ msgstr "Kod"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:959
#, python-format
msgid "Code View"
-msgstr ""
+msgstr "Kod Görünümü"
#. module: web_editor
#. openerp-web
@@ -310,14 +310,14 @@ msgstr "Sütun"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:62
#, python-format
msgid "Common colors"
-msgstr ""
+msgstr "Yaygın renkler"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:310
#, python-format
msgid "Contain"
-msgstr ""
+msgstr "İçerir"
#. module: web_editor
#. openerp-web
@@ -331,7 +331,7 @@ msgstr "İçereği çevirmek için"
#: code:addons/web_editor/static/src/xml/editor.xml:194
#, python-format
msgid "Copy-paste your URL or embed code here"
-msgstr ""
+msgstr "URL kodunuzu ya da gömülü kodunuzu buraya kopyalayıp-yapıştırın."
#. module: web_editor
#. openerp-web
@@ -369,7 +369,7 @@ msgstr "Özelleştirme"
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Dailymotion"
-msgstr ""
+msgstr "Dailymotion"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
@@ -388,12 +388,12 @@ msgstr "Öntanımlı"
#: code:addons/web_editor/static/src/xml/editor.xml:387
#, python-format
msgid "Define if/how the background image will be repeated"
-msgstr ""
+msgstr "Arka plan resminin tekrarlanacağını / nasıl olacağını tanımlayın"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Delta"
-msgstr ""
+msgstr "Delta"
#. module: web_editor
#. openerp-web
@@ -436,7 +436,7 @@ msgstr "Belge"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:986
#, python-format
msgid "Document Style"
-msgstr ""
+msgstr "Doküman Türü"
#. module: web_editor
#. openerp-web
@@ -450,7 +450,7 @@ msgstr "Düzenlemek için çift-tıkla"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:913
#, python-format
msgid "Drag an image here"
-msgstr ""
+msgstr "Buraya bir fotoğraf sürükleyin"
#. module: web_editor
#. openerp-web
@@ -477,14 +477,14 @@ msgstr "Düzenle"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Epsilon"
-msgstr ""
+msgstr "Epsilon"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/widgets/ace.js:97
#, python-format
msgid "Expected "
-msgstr ""
+msgstr "Umulan"
#. module: web_editor
#. openerp-web
@@ -498,49 +498,49 @@ msgstr "Ekstra Küçük"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:905
#, python-format
msgid "File / Image"
-msgstr ""
+msgstr "Dosya / Resim"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:910
#, python-format
msgid "Float Left"
-msgstr ""
+msgstr "Sola yay"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:912
#, python-format
msgid "Float None"
-msgstr ""
+msgstr "Asla Kaydırma"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:911
#, python-format
msgid "Float Right"
-msgstr ""
+msgstr "Sağa Kaydır"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:974
#, python-format
msgid "Font Color"
-msgstr ""
+msgstr "Font Rengi"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:901
#, python-format
msgid "Font Family"
-msgstr ""
+msgstr "Font Ailesi"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:902
#, python-format
msgid "Font Size"
-msgstr ""
+msgstr "Font Boyutu"
#. module: web_editor
#. openerp-web
@@ -559,32 +559,32 @@ msgstr "Tam Ekran"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gamma"
-msgstr ""
+msgstr "Gama"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gray"
-msgstr ""
+msgstr "Gri"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gray Dark"
-msgstr ""
+msgstr "Koyu Gri"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gray Darker"
-msgstr ""
+msgstr "Daha Koyu Gri"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gray Light"
-msgstr ""
+msgstr "Aydınlat"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
msgid "Gray Lighter"
-msgstr ""
+msgstr "Daha fazla aydınlat"
#. module: web_editor
#: model:ir.model,name:web_editor.model_ir_http
@@ -596,42 +596,42 @@ msgstr "HTTP yönlendirme"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:945
#, python-format
msgid "Header 1"
-msgstr ""
+msgstr "Başlık 1"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:946
#, python-format
msgid "Header 2"
-msgstr ""
+msgstr "Başlık 2"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:947
#, python-format
msgid "Header 3"
-msgstr ""
+msgstr "Başlık 3"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:948
#, python-format
msgid "Header 4"
-msgstr ""
+msgstr "Başlık 4"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:949
#, python-format
msgid "Header 5"
-msgstr ""
+msgstr "Başlık 5"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:950
#, python-format
msgid "Header 6"
-msgstr ""
+msgstr "Başlık 6"
#. module: web_editor
#. openerp-web
@@ -652,42 +652,42 @@ msgstr "İşte etkili bir şekilde tercüme etmek amacıyla kullanılan Görsell
#: code:addons/web_editor/static/src/xml/editor.xml:219
#, python-format
msgid "Hide Dailymotion logo"
-msgstr ""
+msgstr "Dailymotion logosunu gizle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:216
#, python-format
msgid "Hide Youtube logo"
-msgstr ""
+msgstr "Youtube logosunu gizle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:213
#, python-format
msgid "Hide fullscreen button"
-msgstr ""
+msgstr "Tam ekran butonunu gizle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:210
#, python-format
msgid "Hide player controls"
-msgstr ""
+msgstr "Oyuncu kontrollerini gizle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:222
#, python-format
msgid "Hide sharing button"
-msgstr ""
+msgstr "Paylaşım butonunu gizle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:367
#, python-format
msgid "Horizontal"
-msgstr ""
+msgstr "Yatay"
#. module: web_editor
#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__id
@@ -702,6 +702,8 @@ msgid ""
"If you discard the current edition, all unsaved changes will be lost. You "
"can cancel to return to the edition mode."
msgstr ""
+"Eğer mevcut düzenlemeyi iptal ederseniz, tüm kaydedilmemiş değişiklikler "
+"kaybedilecek. Düzenleme moduna dönmek için iptal edebilirsiniz."
#. module: web_editor
#. openerp-web
@@ -711,6 +713,8 @@ msgid ""
"If you reset this file, all your customizations will be lost as it will be "
"reverted to the default file."
msgstr ""
+"Eğer bu dosyayı sıfırlarsanız, tüm özelleştirmeleriniz varsayılan dosyaya "
+"döndürüldüğü için kaybolur."
#. module: web_editor
#. openerp-web
@@ -724,7 +728,7 @@ msgstr "Resim"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:915
#, python-format
msgid "Image URL"
-msgstr ""
+msgstr "URL Resmi"
#. module: web_editor
#. openerp-web
@@ -734,27 +738,29 @@ msgid ""
"In this mode, you can only translate texts. To change the structure of the page, you must edit the master page.\n"
" Each modification on the master page is automatically applied to all translated versions."
msgstr ""
+"Bu modda sadece metinleri çevirebilirsiniz. Sayfa yapısını değiştirmek için ana sayfayı düzenlemelisiniz.\n"
+"Anasayfadaki her değişiklik tüm çevirilmiş versiyonlara otomatik olarak uygulanır."
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/ace.xml:23
#, python-format
msgid "Include All LESS Files"
-msgstr ""
+msgstr "Tüm LESS dosyalarını içerir"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/ace.xml:17
#, python-format
msgid "Include Asset Bundles"
-msgstr ""
+msgstr "Varlık Paketlerini İçerir"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:964
#, python-format
msgid "Indent"
-msgstr ""
+msgstr "Sipariş Ver"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
@@ -766,35 +772,35 @@ msgstr "Info"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:938
#, python-format
msgid "Insert Horizontal Rule"
-msgstr ""
+msgstr "Yatay Kuralı Ekle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:906
#, python-format
msgid "Insert Image"
-msgstr ""
+msgstr "Resim Ekle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:920
#, python-format
msgid "Insert Link"
-msgstr ""
+msgstr "Bağlantı Ekle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:930
#, python-format
msgid "Insert Video"
-msgstr ""
+msgstr "Video Ekle"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Instagram"
-msgstr ""
+msgstr "Instagram"
#. module: web_editor
#. openerp-web
@@ -808,28 +814,28 @@ msgstr "Yükle"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:894
#, python-format
msgid "Italic"
-msgstr ""
+msgstr "Eğik"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:968
#, python-format
msgid "Justify full"
-msgstr ""
+msgstr "Tam hak ver"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:981
#, python-format
msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "Klavye kısa yolları"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/ace.xml:11
#, python-format
msgid "LESS (CSS)"
-msgstr ""
+msgstr "LESS (CSS)"
#. module: web_editor
#. openerp-web
@@ -866,7 +872,7 @@ msgstr ""
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:900
#, python-format
msgid "Line Height"
-msgstr ""
+msgstr "Çizgi Yüksekliği"
#. module: web_editor
#. openerp-web
@@ -880,7 +886,7 @@ msgstr "Bağlantı"
#: code:addons/web_editor/static/src/xml/editor.xml:242
#, python-format
msgid "Link Label"
-msgstr ""
+msgstr "Bağlantı Etiketi"
#. module: web_editor
#. openerp-web
@@ -894,7 +900,7 @@ msgstr "Bağlantı oluştur"
#: code:addons/web_editor/static/src/xml/editor.xml:207
#, python-format
msgid "Loop"
-msgstr ""
+msgstr "Döngü"
#. module: web_editor
#. openerp-web
@@ -928,7 +934,7 @@ msgstr "Sonraki"
#: code:addons/web_editor/static/src/xml/editor.xml:389
#, python-format
msgid "No repeat"
-msgstr ""
+msgstr "Tekrar yok"
#. module: web_editor
#. openerp-web
@@ -958,7 +964,7 @@ msgstr "Tamam"
#: code:addons/web_editor/static/src/js/editor/translator.js:93
#, python-format
msgid "Ok, never show me this again"
-msgstr ""
+msgstr "Ok, bunu tekrar gösterme"
#. module: web_editor
#. openerp-web
@@ -980,7 +986,7 @@ msgstr "Seçenekler"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:954
#, python-format
msgid "Ordered list"
-msgstr ""
+msgstr "Sipariş listesi"
#. module: web_editor
#. openerp-web
@@ -994,21 +1000,21 @@ msgstr ""
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:114
#, python-format
msgid "Padding"
-msgstr ""
+msgstr "Dolgu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:962
#, python-format
msgid "Paragraph"
-msgstr ""
+msgstr "Paragraf"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:985
#, python-format
msgid "Paragraph formatting"
-msgstr ""
+msgstr "Paragraf formatı"
#. module: web_editor
#. openerp-web
@@ -1049,14 +1055,14 @@ msgstr "Alıntı"
#: code:addons/web_editor/static/src/js/editor/rte.js:309
#, python-format
msgid "Readonly field"
-msgstr ""
+msgstr "Salt okunur alan"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:971
#, python-format
msgid "Recent Color"
-msgstr ""
+msgstr "Mevcut Renk"
#. module: web_editor
#. openerp-web
@@ -1084,14 +1090,14 @@ msgstr "Bloku Kaldır"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:899
#, python-format
msgid "Remove Font Style"
-msgstr ""
+msgstr "Font Stilini Kaldır"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:916
#, python-format
msgid "Remove Image"
-msgstr ""
+msgstr "Resmi Kaldır"
#. module: web_editor
#. openerp-web
@@ -1105,21 +1111,21 @@ msgstr "Tekrarla"
#: code:addons/web_editor/static/src/xml/editor.xml:390
#, python-format
msgid "Repeat both"
-msgstr ""
+msgstr "İkisini de tekrarla"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:391
#, python-format
msgid "Repeat x"
-msgstr ""
+msgstr "x'i tekrarla"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:392
#, python-format
msgid "Repeat y"
-msgstr ""
+msgstr "y'yi tekrarla"
#. module: web_editor
#. openerp-web
@@ -1134,35 +1140,35 @@ msgstr "Sıfırla"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:978
#, python-format
msgid "Reset to default"
-msgstr ""
+msgstr "Varsayılana sıfırla"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/widgets/ace.js:490
#, python-format
msgid "Reseting views is not supported yet"
-msgstr ""
+msgstr "Henüz desteklenmeyen görünümlerin sıfırlanması"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:907
#, python-format
msgid "Resize Full"
-msgstr ""
+msgstr "Tamamını Yeniden Boyutlandır"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:908
#, python-format
msgid "Resize Half"
-msgstr ""
+msgstr "Yarısını Yeniden Boyutlandır"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:909
#, python-format
msgid "Resize Quarter"
-msgstr ""
+msgstr "Çeyreğini Yeniden Boyulandır"
#. module: web_editor
#. openerp-web
@@ -1185,14 +1191,14 @@ msgstr "Arama"
#: code:addons/web_editor/static/src/xml/snippets.xml:43
#, python-format
msgid "Search Contact"
-msgstr ""
+msgstr "Kişi Ara"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/snippets.xml:13
#, python-format
msgid "Select Parent Container"
-msgstr ""
+msgstr "Üst Kapsayıcı Seç"
#. module: web_editor
#. openerp-web
@@ -1213,7 +1219,7 @@ msgstr "Resim Seç"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:914
#, python-format
msgid "Select from files"
-msgstr ""
+msgstr "Dosyalardan seç"
#. module: web_editor
#. openerp-web
@@ -1227,14 +1233,14 @@ msgstr "Sunucu hatas"
#: code:addons/web_editor/static/src/xml/editor.xml:365
#, python-format
msgid "Set the starting position of the background image."
-msgstr ""
+msgstr "Arkaplan resminin başlangıç konumunu belirle."
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:976
#, python-format
msgid "Set transparent"
-msgstr ""
+msgstr "Transparan ayarla"
#. module: web_editor
#. openerp-web
@@ -1244,6 +1250,8 @@ msgid ""
"Sets the width and height of the background image in percent of the parent "
"element."
msgstr ""
+"Arka plan resminin genişliğini ve yüksekliğini üst elemanın yüzdesi olarak "
+"ayarlar."
#. module: web_editor
#. openerp-web
@@ -1279,7 +1287,7 @@ msgstr "Dönme"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:896
#, python-format
msgid "Strikethrough"
-msgstr ""
+msgstr "Üstü Çizgili"
#. module: web_editor
#. openerp-web
@@ -1293,7 +1301,7 @@ msgstr "Stil"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:897
#, python-format
msgid "Subscript"
-msgstr ""
+msgstr "Abone Ol"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
@@ -1305,7 +1313,7 @@ msgstr "Başarı"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:898
#, python-format
msgid "Superscript"
-msgstr ""
+msgstr "Üst Simge"
#. module: web_editor
#. openerp-web
@@ -1326,14 +1334,14 @@ msgstr "Tema ID:%s"
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:983
#, python-format
msgid "Text formatting"
-msgstr ""
+msgstr "Metin Formatı"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:923
#, python-format
msgid "Text to display"
-msgstr ""
+msgstr "Gösterilecek Metin"
#. module: web_editor
#. openerp-web
@@ -1351,21 +1359,21 @@ msgstr ""
#: code:addons/web_editor/static/src/js/widgets/widgets.js:1018
#, python-format
msgid "The provided url does not reference any supported video"
-msgstr ""
+msgstr "Sağlanan url desteklenen hiç bir videoyu referans göstermiyor."
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/widgets/widgets.js:1012
#, python-format
msgid "The provided url is not valid"
-msgstr ""
+msgstr "Sağlanan url geçersiz"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:54
#, python-format
msgid "Theme colors"
-msgstr ""
+msgstr "Tema renkleri"
#. module: web_editor
#. openerp-web
@@ -1373,42 +1381,42 @@ msgstr ""
#: code:addons/web_editor/static/src/js/editor/translator.js:177
#, python-format
msgid "This document is not saved!"
-msgstr ""
+msgstr "Bu belge kaydedilmedi !"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:147
#, python-format
msgid "This file is a public view attachment"
-msgstr ""
+msgstr "Bu belge bir ortak görünüm ekidir."
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:148
#, python-format
msgid "This file is attached to the current record"
-msgstr ""
+msgstr "Bu dosya mevcut kayda eklenmiştir."
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:924
#, python-format
msgid "To what URL should this link go?"
-msgstr ""
+msgstr "Bubağlantı hangi URL'ye gitmeli?"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:40
#, python-format
msgid "Tooltip"
-msgstr ""
+msgstr "Bilgi Çubuğu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/translator.js:50
#, python-format
msgid "Translate Attribute"
-msgstr ""
+msgstr "Nitelikli Tercüme"
#. module: web_editor
#. openerp-web
@@ -1422,7 +1430,7 @@ msgstr "İçerik Çevrildi"
#: code:addons/web_editor/static/src/js/editor/translator.js:91
#, python-format
msgid "Translation Info"
-msgstr ""
+msgstr "Çeviri Bilgisi"
#. module: web_editor
#. openerp-web
@@ -1430,21 +1438,21 @@ msgstr ""
#: model:ir.ui.view,arch_db:web_editor.colorpicker
#, python-format
msgid "Transparent"
-msgstr ""
+msgstr "Transparan"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:248
#, python-format
msgid "URL or Email"
-msgstr ""
+msgstr "URL yada E-posta"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:895
#, python-format
msgid "Underline"
-msgstr ""
+msgstr "Altı çizili"
#. module: web_editor
#. openerp-web
@@ -1458,28 +1466,28 @@ msgstr "Geri Alma"
#: code:addons/web_editor/static/src/js/widgets/ace.js:90
#, python-format
msgid "Unexpected "
-msgstr ""
+msgstr "Beklenmeyen"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:921
#, python-format
msgid "Unlink"
-msgstr ""
+msgstr "Bağlantıyı kopar"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:953
#, python-format
msgid "Unordered list"
-msgstr ""
+msgstr "Sırasız liste"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:96
#, python-format
msgid "Upload an image"
-msgstr ""
+msgstr "Bir resim yükleyin"
#. module: web_editor
#. openerp-web
@@ -1493,7 +1501,7 @@ msgstr "Resim optimizasyon olmadan yükleme"
#: code:addons/web_editor/static/src/xml/editor.xml:376
#, python-format
msgid "Vertical"
-msgstr ""
+msgstr "Dikey"
#. module: web_editor
#. openerp-web
@@ -1522,21 +1530,21 @@ msgstr "Video URL?"
#: code:addons/web_editor/static/src/xml/editor.xml:193
#, python-format
msgid "Video code"
-msgstr ""
+msgstr "Video kodu"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Vimeo"
-msgstr ""
+msgstr "Vimeo"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Vine.co"
-msgstr ""
+msgstr "Vine.co"
#. module: web_editor
#: model:ir.ui.view,arch_db:web_editor.colorpicker
@@ -1554,14 +1562,14 @@ msgstr "Beyaz"
#: code:addons/web_editor/static/src/xml/ace.xml:10
#, python-format
msgid "XML (HTML)"
-msgstr ""
+msgstr "XML (HTML)"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:111
#, python-format
msgid "Xl"
-msgstr ""
+msgstr "XI"
#. module: web_editor
#. openerp-web
@@ -1575,14 +1583,14 @@ msgstr "Çeviri modu girmek üzeresiniz."
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Youku"
-msgstr ""
+msgstr "Youku"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "Youtube"
-msgstr ""
+msgstr "Youtube"
#. module: web_editor
#. openerp-web
@@ -1599,14 +1607,14 @@ msgstr "ve"
#: code:addons/web_editor/static/src/xml/editor.xml:379
#, python-format
msgid "auto"
-msgstr ""
+msgstr "oto"
#. module: web_editor
#. openerp-web
#: code:addons/web_editor/static/src/xml/editor.xml:112
#, python-format
msgid "https://www.odoo.com/logo.png"
-msgstr ""
+msgstr "https://www.odoo.com/logo.png"
#. module: web_editor
#: model:ir.model,name:web_editor.model_ir_attachment
@@ -1708,7 +1716,7 @@ msgstr "ir.ui.view"
#: code:addons/web_editor/static/src/xml/editor.xml:198
#, python-format
msgid "videos"
-msgstr ""
+msgstr "videolar"
#. module: web_editor
#: model:ir.model,name:web_editor.model_web_editor_converter_test
diff --git a/addons/web_editor/static/lib/summernote/src/js/EventHandler.js b/addons/web_editor/static/lib/summernote/src/js/EventHandler.js
index 9701b8728d2..efa57f8111c 100644
--- a/addons/web_editor/static/lib/summernote/src/js/EventHandler.js
+++ b/addons/web_editor/static/lib/summernote/src/js/EventHandler.js
@@ -472,7 +472,8 @@ define([
onImageUpload: options.onImageUpload,
onImageUploadError: options.onImageUploadError,
onMediaDelete: options.onMediaDelete,
- onToolbarClick: options.onToolbarClick
+ onToolbarClick: options.onToolbarClick,
+ onUpload: options.onUpload,
});
var styleInfo = modules.editor.styleFromNode(layoutInfo.editable());
diff --git a/addons/web_editor/static/lib/summernote/src/js/module/Clipboard.js b/addons/web_editor/static/lib/summernote/src/js/module/Clipboard.js
index 955b49437a8..4cd9088da75 100644
--- a/addons/web_editor/static/lib/summernote/src/js/module/Clipboard.js
+++ b/addons/web_editor/static/lib/summernote/src/js/module/Clipboard.js
@@ -1,256 +1,41 @@
define([
- 'summernote/core/list',
- 'summernote/core/dom',
- 'summernote/core/key',
- 'summernote/core/agent',
- 'summernote/core/range'
+ 'summernote/core/list',
+ 'summernote/core/dom',
+ 'summernote/core/key',
+ 'summernote/core/agent',
+ 'summernote/core/range'
], function (list, dom, key, agent, range) {
- var Clipboard = function (handler) {
- var $paste;
-
- this.attach = function (layoutInfo) {
- // [workaround] getting image from clipboard
- // - IE11 and Firefox: CTRL+v hook
- // - Webkit: event.clipboardData
- if (agent.isMSIE && agent.browserVersion > 10) {
- $paste = $('<div />').attr('contenteditable', true).css({
- position : 'absolute',
- left : -100000,
- opacity : 0
- });
-
- layoutInfo.editable().on('keydown', function (e) {
- if (e.ctrlKey && e.keyCode === key.code.V) {
- handler.invoke('saveRange', layoutInfo.editable());
- $paste.focus();
-
- setTimeout(function () {
- pasteByHook(layoutInfo);
- }, 0);
- }
- });
-
- layoutInfo.editable().before($paste);
- } else {
- layoutInfo.editable().on('paste', pasteByEvent);
- }
- };
-
- var pasteByHook = function (layoutInfo) {
- var $editable = layoutInfo.editable();
- var node = $paste[0].firstChild;
-
- if (dom.isImg(node)) {
- var dataURI = node.src;
- var decodedData = atob(dataURI.split(',')[1]);
- var array = new Uint8Array(decodedData.length);
- for (var i = 0; i < decodedData.length; i++) {
- array[i] = decodedData.charCodeAt(i);
- }
-
- var blob = new Blob([array], { type : 'image/png' });
- blob.name = 'clipboard.png';
-
- handler.invoke('restoreRange', $editable);
- handler.invoke('focus', $editable);
- handler.insertImages(layoutInfo, [blob]);
- } else {
- var pasteContent = $('<div />').html($paste.html()).html();
- handler.invoke('restoreRange', $editable);
- handler.invoke('focus', $editable);
-
- if (pasteContent) {
- handler.invoke('pasteHTML', $editable, pasteContent);
- }
- }
-
- $paste.empty();
- };
-
- /**
- * paste by clipboard event
- *
- * @param {Event} event
- */
- var pasteByEvent = function (event) {
- var clipboardData = event.originalEvent.clipboardData;
- var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
- var $editable = layoutInfo.editable();
-
- if (["INPUT", "TEXTAREA"].indexOf(event.target.tagName) !== -1) {
- return;
- }
-
- if (clipboardData && clipboardData.items && clipboardData.items.length) {
- var item = list.head(clipboardData.items);
- if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
- handler.insertImages(layoutInfo, [item.getAsFile()]);
- }
- handler.invoke('editor.afterCommand', $editable);
- }
-
- event.preventDefault();
-
- var html = clipboardData.getData("text/html");
- var $node = $('<div/>').html(html);
- // if copying source did not provide html, default to plain text
- if(!html) {
- $node.text(clipboardData.getData("text/plain")).html(function(_, html){
- return html.replace(/\r?\n/g,'<br>');
- });
- }
- pasteContent($node, layoutInfo, $editable);
- };
-
- /*
- remove undesirable tag
- filter classes and style attributes
- remove undesirable attributes
- */
- var filter_tag = function ($nodes, $editable) {
- return $nodes.each(function() {
- var $node = $(this);
-
- if ($node.attr('style')) {
- var style = _.filter(_.compact($node.attr('style').split(/\s*;\s*/)), function (style) {
- style = style.split(/\s*:\s*/);
- return /width|height|color|background-color|font-weight|text-align|font-style|text-decoration/i.test(style[0]) &&
- !(style[1] === 'initial' || style[1] === 'inherit' || $node.css(style[0]) === $editable.css(style[0]) ||
- (style[0] === 'background-color' && style[1] === 'rgb(255, 255, 255)') ||
- (style[0] === 'color' && style[1] === 'rgb(0, 0, 0)'));
- }).join(';');
- if (style.length) {
- $node.attr('style', style);
- } else {
- $node.removeAttr('style');
- }
- }
-
- if ($node.attr('class')) {
- var classes = _.filter($node.attr('class').split(/\s+/), function (style) {
- return /(^|\s)(fa|pull|text|bg)(\s|-|$)/.test(style);
- }).join(' ');
- if (classes.length) {
- $node.attr('class', classes);
- } else {
- $node.removeAttr('class');
- }
- }
- });
- };
-
- var pasteContent = function ($node, layoutInfo, $editable) {
- $node.find('meta, script, style').remove();
- filter_tag($node.find('*'), $editable).removeAttr('title', 'alt', 'id', 'contenteditable');
-
- /*
- remove unless span and unwant font
- */
- $node.find('span, font').filter(':not([class]):not([style])').each(function () {
- $(this).replaceWith($(this).contents());
- });
- $node.find('span + span').each(function () {
-
- if (dom.isText(this.previousSibling)) {
- if (dom.isVisibleText(this.previousSibling)) {
- return;
- } else { // keep space between 2 tags, but can merge the both tags
- $(this).prev().append(this.previousSibling);
- }
- }
- if ($(this).attr('class') === $(this).prev().attr('class') && $(this).attr('style') === $(this).prev().attr('style')) {
- $(this).prev().append($(this).contents());
- $(this).remove();
- }
- });
-
- // remove empty table row and td
- var $tdr;
- while(($tdr = $node.find('tr:empty, td:empty, th:empty, tbody:empty, t-head:empty, table:empty')) && $tdr.length) {
- $tdr.remove();
- }
-
- /*
- reset architecture HTML node and add <p> tag
- */
- var $arch = $('<div/>');
- var $last = $arch;
- $node.contents().each(function () {
- if (dom.isBR(this)) {
- $(this).remove();
- $last = $('<p/>');
- $arch.append($last);
- } else if (/h[0-9]+|li|table|p/i.test(this.tagName)) {
- $last = $('<p/>');
- $arch.append(this).append($last);
- } else if ($arch.is(':empty') && dom.isText(this)) {
- $last = $('<p/>').append(this);
- $arch.append($last);
- } else if (this.nodeType !== Node.COMMENT_NODE) {
- $last.append(this);
- }
- });
- $arch.find(':not([class]):not([style]):empty, p:empty').remove();
-
- /*
- history
- */
- $editable.data('NoteHistory').recordUndo($editable, "paste");
-
- /*
- remove selected content
- */
- var r = range.create();
- if (!r.isCollapsed()) {
- r = r.deleteContents();
- r.select();
- }
-
- // If only pasting a <p/> element in an unique <p/> element, only paste
- // the <p/> element text
- var $p = $arch.children('p');
- var onlyAP = ($p.length === 1 && $arch.children().length === 1);
- if (onlyAP) {
- var $p1 = $(r.sc).closest('p');
- var $p2 = $(r.ec).closest('p');
- if ($p1.length && $p2.length && $p1[0] === $p2[0]) {
- $arch.html($p.text());
- }
- }
-
- /*
- insert content
- */
- var $nodes = $();
- $editable.on('DOMNodeInserted', function (event) {
- $nodes = $nodes.add(event.originalEvent.target);
- });
- window.document.execCommand('insertHTML', false, $arch.html());
- $editable.off('DOMNodeInserted');
-
- /*
- clean insterted content
- */
- var $span = $nodes.filter('span');
- $span = $span.first().add($span.last());
- $span = $span.add($span.prev('span'));
- $span = $span.add($span.next('span'));
- filter_tag($span, $editable);
- $span.not('[span], [style]').each(function () {
- _.each(this.childNodes, function (node) {
- $(node.parentNode).after(node);
- });
- $(this).remove();
- });
- r = range.create();
- if (!dom.isText(r.ec)) {
- r = range.create(r.sc.childNodes[r.so], dom.nodeLength(r.sc.childNodes[r.so]));
- }
- r.clean().select();
-
- $editable.trigger('content_changed');
+ // ODOO override: use 0.8.10 version of this, adapted for the old summernote
+ // version odoo is using
+ var Clipboard = function (handler) {
+ /**
+ * paste by clipboard event
+ *
+ * @param {Event} event
+ */
+ var pasteByEvent = function (event) {
+ if (["INPUT", "TEXTAREA"].indexOf(event.target.tagName) !== -1) {
+ // ODOO override: from old summernote version
+ return;
+ }
+
+ var clipboardData = event.originalEvent.clipboardData;
+ var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
+ var $editable = layoutInfo.editable();
+
+ if (clipboardData && clipboardData.items && clipboardData.items.length) {
+ var item = list.head(clipboardData.items);
+ if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+ handler.insertImages(layoutInfo, [item.getAsFile()]);
+ }
+ handler.invoke('editor.afterCommand', $editable);
+ }
+ };
+
+ this.attach = function (layoutInfo) {
+ layoutInfo.editable().on('paste', pasteByEvent);
+ };
};
- };
- return Clipboard;
+ return Clipboard;
});
diff --git a/addons/web_editor/static/src/js/backend/fields.js b/addons/web_editor/static/src/js/backend/fields.js
index 479a26469a3..a636b7e5be3 100644
--- a/addons/web_editor/static/src/js/backend/fields.js
+++ b/addons/web_editor/static/src/js/backend/fields.js
@@ -163,7 +163,7 @@ var FieldTextHtmlSimple = basic_fields.DebouncedField.extend(TranslatableFieldMi
if (fieldNameAttachment) {
this.fieldNameAttachment = fieldNameAttachment;
this.attachments = [];
- summernoteConfig.onImageUpload = this._onImageUpload.bind(this);
+ summernoteConfig.onUpload = this._onUpload.bind(this);
summernoteConfig.getMediaDomain = this._getAttachmentsDomain.bind(this);
}
@@ -195,7 +195,7 @@ var FieldTextHtmlSimple = basic_fields.DebouncedField.extend(TranslatableFieldMi
*
* @private
*/
- _onImageUpload: function (attachments) {
+ _onUpload: function (attachments) {
var self = this;
attachments = _.filter(attachments, function (attachment) {
return !_.findWhere(self.attachments, {id: attachment.id});
diff --git a/addons/web_editor/static/src/js/editor/rte.js b/addons/web_editor/static/src/js/editor/rte.js
index 44f69fc2026..b4a42f843c8 100644
--- a/addons/web_editor/static/src/js/editor/rte.js
+++ b/addons/web_editor/static/src/js/editor/rte.js
@@ -270,7 +270,13 @@ var RTEWidget = Widget.extend({
$.fn.carousel = this.edit_bootstrap_carousel;
$(document).on('click.rte keyup.rte', function () {
- var $popover = $((range.create()||{}).sc).closest('[contenteditable]');
+ var current_range = {};
+ try {
+ current_range = range.create() || {};
+ } catch (e) {
+ // if range is on Restricted element ignore error
+ }
+ var $popover = $(current_range.sc).closest('[contenteditable]');
var popover_history = ($popover.data()||{}).NoteHistory;
if (!popover_history || popover_history === history) return;
var editor = $popover.parent('.note-editor');
diff --git a/addons/web_editor/static/src/js/editor/rte.summernote.js b/addons/web_editor/static/src/js/editor/rte.summernote.js
index 8d9d19be795..ce20c53ff49 100644
--- a/addons/web_editor/static/src/js/editor/rte.summernote.js
+++ b/addons/web_editor/static/src/js/editor/rte.summernote.js
@@ -403,7 +403,7 @@ eventHandler.modules.imageDialog.showImageDialog = function ($editable) {
media: media,
options: {
lastFilters: ['background'],
- onUpload: $editable.data('callbacks').onImageUpload,
+ onUpload: $editable.data('callbacks').onUpload,
},
});
return new $.Deferred().reject();
@@ -689,7 +689,7 @@ function summernote_mousedown(event) {
return;
}
var editables = $(".o_editable[contenteditable], .note-editable[contenteditable]");
- var r_editable = editables.has((r||{}).sc);
+ var r_editable = editables.has((r||{}).sc).addBack(editables.filter((r||{}).sc));
if (!r_editable.closest('.note-editor').is($editable) && !r_editable.filter('.o_editable').is(editables)) {
var saved_editable = editables.has((remember_selection||{}).sc);
if ($editable.length && !saved_editable.closest('.o_editable, .note-editor').is($editable)) {
diff --git a/addons/web_editor/static/src/js/editor/transcoder.js b/addons/web_editor/static/src/js/editor/transcoder.js
index 4fa30978f84..fb3e69eda29 100644
--- a/addons/web_editor/static/src/js/editor/transcoder.js
+++ b/addons/web_editor/static/src/js/editor/transcoder.js
@@ -227,6 +227,26 @@ function imgToFont($editable) {
});
}
+/*
+ * Utility function to apply function over descendants elements
+ *
+ * This is needed until the following issue of jQuery is solved:
+ * https://github.com./jquery/sizzle/issues/403
+ *
+ * @param {Element} node The root Element node
+ * @param {Function} func The function applied over descendants
+ */
+function applyOverDescendants(node, func) {
+ node = node.firstChild;
+ while (node) {
+ if (node.nodeType === 1) {
+ func(node);
+ applyOverDescendants(node, func);
+ }
+ node = node.nextSibling;
+ }
+}
+
/**
* Converts css style to inline style (leave the classes on elements but forces
* the style they give as inline style).
@@ -237,9 +257,9 @@ function classToStyle($editable) {
if (!rulesCache.length) {
getMatchedCSSRules($editable[0]);
}
- $editable.find('*').each(function () {
- var $target = $(this);
- var css = getMatchedCSSRules(this);
+ applyOverDescendants($editable[0], function (node) {
+ var $target = $(node);
+ var css = getMatchedCSSRules(node);
var style = $target.attr('style') || '';
_.each(css, function (v,k) {
if (!(new RegExp('(^|;)\s*' + k).test(style))) {
@@ -252,12 +272,12 @@ function classToStyle($editable) {
$target.attr('style', style);
}
// Apple Mail
- if (this.nodeName === 'TD' && !this.childNodes.length) {
- this.innerHTML = '&nbsp;';
+ if (node.nodeName === 'TD' && !node.childNodes.length) {
+ node.innerHTML = '&nbsp;';
}
// Outlook
- if (this.nodeName === 'A' && $target.hasClass('btn') && !$target.children().length) {
+ if (node.nodeName === 'A' && $target.hasClass('btn') && !$target.children().length) {
var $hack = $('<table class="o_outlook_hack"><tr><td></td></tr></table>');
$hack.find('td')
.attr('height', $target.outerHeight())
@@ -269,7 +289,7 @@ function classToStyle($editable) {
$target.after($hack);
$target.appendTo($hack.find('td'));
// the space add a line when it's a table but it's invisible when it's a link
- var node = $hack[0].previousSibling;
+ node = $hack[0].previousSibling;
if (node && node.nodeType === Node.TEXT_NODE && !node.textContent.match(/\S/)) {
$(node).remove();
}
@@ -297,9 +317,9 @@ function styleToClass($editable) {
var $c = $('<span/>').appendTo(document.body);
- $editable.find('*').each(function () {
- var $target = $(this);
- var css = getMatchedCSSRules(this);
+ applyOverDescendants($editable[0], function (node) {
+ var $target = $(node);
+ var css = getMatchedCSSRules(node);
var style = '';
_.each(css, function (v,k) {
if (!(new RegExp('(^|;)\s*' + k).test(style))) {
diff --git a/addons/web_editor/static/src/js/widgets/widgets.js b/addons/web_editor/static/src/js/widgets/widgets.js
index fc4892cfa64..5fd70d9cfee 100644
--- a/addons/web_editor/static/src/js/widgets/widgets.js
+++ b/addons/web_editor/static/src/js/widgets/widgets.js
@@ -381,13 +381,13 @@ var ImageWidget = MediaWidget.extend({
.sortBy(function (r) {
if (_.any(self.firstFilters, function (filter) {
var regex = new RegExp(filter, 'i');
- return r.name.match(regex) || r.datas_fname.match(regex);
+ return r.name.match(regex) || r.datas_fname && r.datas_fname.match(regex);
})) {
return -1;
}
if (_.any(self.lastFilters, function (filter) {
var regex = new RegExp(filter, 'i');
- return r.name.match(regex) || r.datas_fname.match(regex);
+ return r.name.match(regex) || r.datas_fname && r.datas_fname.match(regex);
})) {
return 1;
}
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 1f628b6de67..106aee8b208 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -889,9 +889,10 @@ class Menu(models.Model):
if menu_id.page_id:
menu_id.page_id = None
else:
- page = self.env['website.page'].search([('url', '=', menu['url'])], limit=1)
+ page = self.env['website.page'].search(['|', ('url', '=', menu['url']), ('url', '=', '/' + menu['url'])], limit=1)
if page:
menu['page_id'] = page.id
+ menu['url'] = page.url
elif menu_id.page_id:
menu_id.page_id.write({'url': menu['url']})
menu_id.write(menu)
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 512ab161712..6d84577b4d5 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -74,7 +74,7 @@
<span t-field="submenu.name"/>
</a>
</li>
- <li t-if="submenu.is_visible and submenu.child_id.filtered(lambda menu: menu.is_visible)" t-attf-class="dropdown #{
+ <li t-if="submenu.child_id.filtered(lambda menu: menu.is_visible)" t-attf-class="dropdown #{
(submenu.clean_url() and submenu.clean_url() != '/' and any([request.httprequest.path == child.url for child in submenu.child_id if child.url]) or
(submenu.clean_url() and request.httprequest.path == submenu.clean_url())) and 'active'
}">
diff --git a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
index 0e18e6cb866..ed4549f7391 100644
--- a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
+++ b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
@@ -227,10 +227,9 @@
<template id="portal_my_leads" name="My Leads">
<t t-call="portal.portal_layout">
- <h3>
- My Leads
- <t t-call="portal.portal_searchbar"/>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">My Leads</t>
+ </t>
<div t-if="not leads" class="alert alert-warning mt8" role="alert">
There are no leads.
</div>
@@ -262,11 +261,10 @@
<template id="portal_my_opportunities" name="My Opportunities">
<t t-call="portal.portal_layout">
- <h3>
- My Opportunities
- <t t-call="portal.portal_searchbar"/>
- <button t-if="request.env.user.partner_id.grade_id or request.env.user.commercial_partner_id.grade_id" name='new_opp' data-toggle="modal" data-target=".modal_new_opp" class="btn btn-default pull-right mr8"><i class="fa fa-plus fa-lg" /></button>
- </h3>
+ <t t-call="portal.portal_searchbar">
+ <t t-set="title">My Opportunities</t>
+ <li class="pull-left"><button t-if="request.env.user.partner_id.grade_id or request.env.user.commercial_partner_id.grade_id" name='new_opp' data-toggle="modal" data-target=".modal_new_opp" class="btn btn-default navbar-btn ml16"><i class="fa fa-plus"/></button></li>
+ </t>
<div class="modal fade modal_new_opp" role="form" aria-hidden="true">
<div class="modal-dialog">
<form method="POST" class="modal-content js_website_submit_form new_opp_form">
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index 33049caffaa..d6e03931722 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -64,7 +64,6 @@ class WebsiteEventController(http.Controller):
]
# search domains
- # TDE note: WTF ???
current_date = None
current_type = None
current_country = None
@@ -119,9 +118,12 @@ class WebsiteEventController(http.Controller):
step=step,
scope=5)
- order = 'website_published desc, date_begin'
+ order = 'date_begin'
if searches.get('date', 'all') == 'old':
- order = 'website_published desc, date_begin desc'
+ order = 'date_begin desc'
+ if searches["country"] != 'all': # if we are looking for a specific country
+ order = 'is_online, ' + order # show physical events first
+ order = 'website_published desc, ' + order
events = Event.search(dom_without("none"), limit=step, offset=pager['offset'], order=order)
values = {
diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js
index c677b0bda2c..3aa8691fca7 100644
--- a/addons/website_event/static/src/js/website_event.js
+++ b/addons/website_event/static/src/js/website_event.js
@@ -41,6 +41,7 @@ var EventRegistrationForm = Widget.extend({
ev.preventDefault();
ev.stopPropagation();
var $form = $(ev.currentTarget).closest('form');
+ var $button = $(ev.currentTarget).closest('[type="submit"]');
var post = {};
$('#registration_form select').each(function () {
post[$(this).attr('name')] = $(this).val();
@@ -54,9 +55,10 @@ var EventRegistrationForm = Widget.extend({
return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) {
var $modal = $(modal);
$modal.find('.modal-body > div').removeClass('container'); // retrocompatibility - REMOVE ME in master / saas-19
- $modal.after($form).modal();
+ $modal.insertAfter($form).modal();
$modal.on('click', '.js_goto_event', function () {
$modal.modal('hide');
+ $button.prop('disabled', false);
});
});
}
diff --git a/addons/website_event/views/event_templates.xml b/addons/website_event/views/event_templates.xml
index 5d52cefc049..91ebbd69b8c 100644
--- a/addons/website_event/views/event_templates.xml
+++ b/addons/website_event/views/event_templates.xml
@@ -685,10 +685,10 @@
<span class="label label-danger"><i class="fa fa-ban"></i></span>
</t>
<t t-if="event_dict['event'].address_id">
- <i class="fa fa-map-marker"></i>
+ <i class="fa fa-map-marker" title="It is a physical event"></i>
</t>
<t t-if="not event_dict['event'].address_id">
- <i class="fa fa-cloud"></i>
+ <i class="fa fa-cloud" title="It is an online event"></i>
</t>
<b><span t-esc="event_dict['date']"/>: <span><a t-att-href="event_dict['url']"><t t-esc="event_dict['event'].name"/></a></span></b>
</div>
diff --git a/addons/website_event_sale/controllers/main.py b/addons/website_event_sale/controllers/main.py
index 25c32b88ccd..c6dd07129f2 100644
--- a/addons/website_event_sale/controllers/main.py
+++ b/addons/website_event_sale/controllers/main.py
@@ -39,7 +39,7 @@ class WebsiteEventSaleController(WebsiteEventController):
# free tickets -> order with amount = 0: auto-confirm, no checkout
if not order.amount_total:
order.action_confirm() # tde notsure: email sending ?
- attendees = request.env['event.registration'].browse(list(attendee_ids))
+ attendees = request.env['event.registration'].browse(list(attendee_ids)).sudo()
# clean context and session, then redirect to the confirmation page
request.website.sale_reset()
urls = event._get_event_resource_urls(list(attendee_ids))
diff --git a/addons/website_form/controllers/main.py b/addons/website_form/controllers/main.py
index b37ca97ea79..41a120008b4 100644
--- a/addons/website_form/controllers/main.py
+++ b/addons/website_form/controllers/main.py
@@ -112,6 +112,7 @@ class WebsiteForm(http.Controller):
'record': {}, # Values to create record
'attachments': [], # Attached files
'custom': '', # Custom fields values
+ 'meta': '', # Add metadata if enabled
}
authorized_fields = model.sudo()._get_form_writable_fields()
diff --git a/addons/website_forum/static/src/js/website_forum.js b/addons/website_forum/static/src/js/website_forum.js
index 255ba20b87e..96cc4946b64 100644
--- a/addons/website_forum/static/src/js/website_forum.js
+++ b/addons/website_forum/static/src/js/website_forum.js
@@ -25,13 +25,14 @@ odoo.define('website_forum.website_forum', function (require) {
if ($('a[href*="/login"]').length) {
msg = _t('Sorry you must be logged in to perform this action');
}
- var $warning = $('<div class="alert alert-danger alert-dismissable oe_forum_alert" id="karma_alert">'+
+ var $warning = $('<div class="alert alert-danger alert-dismissable oe_forum_alert mt8" id="karma_alert">'+
'<button type="button" class="close notification_close" data-dismiss="alert" aria-hidden="true">&times;</button>'+
msg + '</div>');
- var vote_alert = $(ev.currentTarget).parent().find("#vote_alert");
- if (vote_alert.length === 0) {
- $(ev.currentTarget).parent().append($warning);
+ var $voteAlert = $('#karma_alert');
+ if ($voteAlert.length) {
+ $voteAlert.remove();
}
+ $(ev.currentTarget).after($warning);
}
});
diff --git a/addons/website_forum/static/src/scss/website_forum.scss b/addons/website_forum/static/src/scss/website_forum.scss
index fde4b88d78c..b4fb02792c2 100644
--- a/addons/website_forum/static/src/scss/website_forum.scss
+++ b/addons/website_forum/static/src/scss/website_forum.scss
@@ -130,6 +130,7 @@ a.no-decoration {
.close.comment_delete {
font-size: 16px;
+ float: none;
}
.country_flag {
@@ -154,8 +155,6 @@ a.no-decoration {
.oe_forum_alert {
position: absolute;
- margin-top: -30px;
- margin-left: 90px;
width: 300px;
z-index: 9999;
}
diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml
index f10d2a39f79..6294cb9b469 100644
--- a/addons/website_forum/views/website_forum.xml
+++ b/addons/website_forum/views/website_forum.xml
@@ -23,7 +23,7 @@
<!-- helper -->
<template id="link_button">
- <form method="POST" t-att-action="url">
+ <form method="POST" t-att-action="url" t-attf-class="#{form_classes}">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<button t-attf-class="fa btn-link #{classes} #{karma and 'karma_required text-muted' or ''}" t-attf-data-karma="#{karma}">
<t t-esc="label"/></button>
@@ -1100,8 +1100,8 @@
<t t-set="label"> </t>
<t t-set="karma" t-value="user.karma&lt;required_karma and required_karma or 0"/>
<t t-set="classes" t-value="'close comment_delete fa-times'"/>
+ <t t-set="form_classes" t-value="'pull-right'"/>
</t>
-
<div><span t-field="message.body" class="oe_no_empty"/></div>
<t t-set="required_karma" t-value="message.author_id.id == user.partner_id.id and object.forum_id.karma_comment_convert_own or object.forum_id.karma_comment_convert_all"/>
<t t-if="(object.parent_id and object.parent_id.state != 'close' and object.parent_id.active != False) or (not object.parent_id and object.state != 'close' and object.active != False)">
@@ -1112,7 +1112,8 @@
<t t-set="url" t-value="'/forum/' + slug(forum) + '/post/' + slug(object) + '/comment/' + slug(message) + '/convert_to_answer'"/>
<t t-set="label">Convert as an answer</t>
<t t-set="karma" t-value="user.karma&lt;required_karma and required_karma or 0"/>
- <t t-set="classes" t-value="'fa-magic pull-right'"/>
+ <t t-set="classes" t-value="'fa-magic'"/>
+ <t t-set="form_classes" t-value="'pull-right'"/>
</t>
</t>
<a t-attf-href="/forum/#{slug(forum)}/partner/#{message.author_id.id}"
@@ -1293,6 +1294,10 @@
<!--Private profile-->
<template id="private_profile">
<t t-call="website_forum.header">
+ <t t-set='head'>
+ <t t-raw='head'/>
+ <meta name="robots" content="noindex follow"/>
+ </t>
<h1 class="mt32">This profile is private!</h1>
<p>
<a t-attf-href="/forum/#{slug(forum)}">Return to the question list.</a>
diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py
index 1594aa542ca..50d448405bf 100644
--- a/addons/website_quote/controllers/main.py
+++ b/addons/website_quote/controllers/main.py
@@ -8,6 +8,7 @@ from odoo.http import request
from odoo.addons.portal.controllers.portal import get_records_pager
from odoo.addons.sale.controllers.portal import CustomerPortal
from odoo.addons.portal.controllers.mail import _message_post_helper
+from odoo.osv import expression
class CustomerPortal(CustomerPortal):
@@ -49,7 +50,7 @@ class sale_quote(http.Controller):
if Order and request.session.get('view_quote_%s' % Order.id) != now and request.env.user.share:
request.session['view_quote_%s' % Order.id] = now
body = _('Quotation viewed by customer')
- _message_post_helper(res_model='sale.order', res_id=Order.id, message=body, token=token, message_type='notification', subtype="mail.mt_note", partner_ids=Order.user_id.sudo().partner_id.ids)
+ _message_post_helper(res_model='sale.order', res_id=Order.id, message=body, token=Order.access_token, message_type='notification', subtype="mail.mt_note", partner_ids=Order.user_id.sudo().partner_id.ids)
if not Order:
return request.render('website.404')
@@ -85,7 +86,11 @@ class sale_quote(http.Controller):
}
if order_sudo.require_payment or values['need_payment']:
- acquirers = request.env['payment.acquirer'].sudo().search([('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)])
+ domain = expression.AND([
+ ['&', ('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)],
+ ['|', ('specific_countries', '=', False), ('country_ids', 'in', [order_sudo.partner_id.country_id.id])]
+ ])
+ acquirers = request.env['payment.acquirer'].sudo().search(domain)
values['form_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 'form' and acq.view_template_id]
values['s2s_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 's2s' and acq.registration_view_template_id]
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 90a8d18da13..c5a89397e47 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -12,6 +12,7 @@ from odoo.addons.website.controllers.main import QueryURL
from odoo.exceptions import ValidationError
from odoo.addons.website.controllers.main import Website
from odoo.addons.website_form.controllers.main import WebsiteForm
+from odoo.osv import expression
_logger = logging.getLogger(__name__)
@@ -776,9 +777,11 @@ class WebsiteSale(http.Controller):
bootstrap_formatting= True
)
- acquirers = request.env['payment.acquirer'].search(
- [('website_published', '=', True), ('company_id', '=', order.company_id.id)]
- )
+ domain = expression.AND([
+ ['&', ('website_published', '=', True), ('company_id', '=', order.company_id.id)],
+ ['|', ('specific_countries', '=', False), ('country_ids', 'in', [order.partner_id.country_id.id])]
+ ])
+ acquirers = request.env['payment.acquirer'].search(domain)
values['access_token'] = order.access_token
values['form_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 'form' and acq.view_template_id]
diff --git a/addons/website_sale/models/res_partner.py b/addons/website_sale/models/res_partner.py
index 6755a4b6a54..77fc633c9c8 100644
--- a/addons/website_sale/models/res_partner.py
+++ b/addons/website_sale/models/res_partner.py
@@ -7,4 +7,4 @@ from odoo import models, fields
class ResPartner(models.Model):
_inherit = 'res.partner'
- last_website_so_id = fields.Many2one('sale.order', string='Last Online Sales Order')
+ last_website_so_id = fields.Many2one('sale.order', string='Last Online Sales Order', copy=False)
diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py
index 76bb95280dd..13594353abf 100644
--- a/addons/website_sale/models/website.py
+++ b/addons/website_sale/models/website.py
@@ -149,8 +149,11 @@ class Website(models.Model):
@api.model
def sale_get_payment_term(self, partner):
- DEFAULT_PAYMENT_TERM = 'account.account_payment_term_immediate'
- return partner.property_payment_term_id.id or self.env.ref(DEFAULT_PAYMENT_TERM, False).id
+ return (
+ partner.property_payment_term_id or
+ self.env.ref('account.account_payment_term_immediate', False) or
+ self.env['account.payment.term'].sudo().search([('company_id', '=', self.company_id.id)], limit=1)
+ ).id
@api.multi
def _prepare_sale_order_values(self, partner, pricelist):
diff --git a/addons/website_sale/static/src/js/website_sale_tour_buy.js b/addons/website_sale/static/src/js/website_sale_tour_buy.js
index 4aa9f82e627..ecec6541b2d 100644
--- a/addons/website_sale/static/src/js/website_sale_tour_buy.js
+++ b/addons/website_sale/static/src/js/website_sale_tour_buy.js
@@ -72,7 +72,7 @@ tour.register('shop_buy_product', {
content: "Pay Now",
//Either there are multiple payment methods, and one is checked, either there is only one, and therefore there are no radio inputs
extra_trigger: '#payment_method label:contains("Wire Transfer") input:checked,#payment_method:not(:has("input:radio:visible"))',
- trigger: 'button[id="o_payment_form_pay"]:visible',
+ trigger: 'button[id="o_payment_form_pay"]:visible:not(:disabled)',
},
{
content: "finish",
diff --git a/addons/website_sale/views/sale_order_views.xml b/addons/website_sale/views/sale_order_views.xml
index 5782921f68e..f9f409351f7 100644
--- a/addons/website_sale/views/sale_order_views.xml
+++ b/addons/website_sale/views/sale_order_views.xml
@@ -193,7 +193,7 @@
parent="menu_catalog" sequence="1"/>
<menuitem id="product_catalog_variants" name="Product Variants"
action="product.product_normal_action"
- parent="menu_catalog" groups="base.group_no_one" sequence="2"/>
+ parent="menu_catalog" groups="product.group_product_variant" sequence="2"/>
<menuitem id="menu_catalog_pricelists" name="Pricelists"
action="product.product_pricelist_action2"
parent="menu_catalog" groups="product.group_sale_pricelist" sequence="4"/>
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index 11735204384..21d22a91e95 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -1099,7 +1099,7 @@
</t>
<input type='submit'/>
</form>
- <a t-if="not actual_partner or (ship.id in actual_partner.ids + actual_partner.child_ids.ids)" class='btn btn-link pull-right fa fa-edit js_edit_address no-decoration' title="Edit this address"></a>
+ <a t-if="not actual_partner or (ship.id in actual_partner.ids + actual_partner.child_ids.ids)" class='btn btn-link pull-right js_edit_address no-decoration' title="Edit this address"><i class='fa fa-edit'/></a>
<div t-att-class="'panel panel-default %s' % (selected and 'border_primary' or 'js_change_shipping')">
<div class='panel-body' style='min-height: 130px;'>
<t t-esc="contact" t-options="dict(widget='contact', fields=['name', 'address'], no_marker=True)"/>
@@ -1152,7 +1152,7 @@
<t t-if="error" t-foreach="error.get('error_message', [])" t-as="err">
<h4 class="text-danger" t-esc="err" />
</t>
- <form name="/shop/checkout" method="post" class="checkout_autoformat">
+ <form action="/shop/address" method="post" class="checkout_autoformat">
<div t-attf-class="form-group #{error.get('name') and 'has-error' or ''} col-md-12 div_name">
<label class="control-label" for="name">Name</label>
<input type="text" name="name" class="form-control" t-att-value="'name' in checkout and checkout['name']" />
diff --git a/addons/website_sale_comparison/static/src/js/website_sale_comparison.js b/addons/website_sale_comparison/static/src/js/website_sale_comparison.js
index c5a9f593b6e..9d27a98d558 100644
--- a/addons/website_sale_comparison/static/src/js/website_sale_comparison.js
+++ b/addons/website_sale_comparison/static/src/js/website_sale_comparison.js
@@ -61,6 +61,9 @@ var ProductComparison = Widget.extend({
}
prod = parseInt(prod, 10);
}
+ if (!prod) {
+ return;
+ }
self.add_new_products(prod);
website_sale_utils.animate_clone($('#comparelist .o_product_panel_header'), $(this).closest('form'), -50, 10);
} else {
diff --git a/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss b/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss
index 17e19f4f7c6..a5769adb65c 100644
--- a/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss
+++ b/addons/website_sale_comparison/static/src/scss/website_sale_comparison.scss
@@ -50,5 +50,9 @@
margin-right: 8px;
}
}
+
+ div.css_not_available .o_add_compare_dyn {
+ display: none;
+ }
}
diff --git a/addons/website_sale_comparison/views/website_sale_comparison_template.xml b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
index e669d77ad68..ffc6c2ffe93 100644
--- a/addons/website_sale_comparison/views/website_sale_comparison_template.xml
+++ b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
@@ -57,7 +57,7 @@
<template id='recommended_product' inherit_id="website_sale.recommended_products" name="Alternative Products">
<xpath expr="//h3" position="replace">
- <t t-set="ids" t-value="str(product.id) + ','+ ','.join([str(a) for a in product.alternative_product_ids.ids])"></t>
+ <t t-set="ids" t-value="str(product.product_variant_id.id) + ','+ ','.join([str(a) for a in product.alternative_product_ids.mapped('product_variant_id.id')])"/>
<div><span class='h3'>Suggested alternatives: </span><a class="btn btn-primary" t-attf-href="/shop/compare/?products=#{ids}"><i class="fa fa-exchange"></i> Compare</a></div>
</xpath>
</template>
diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py
index 56ef9c451f2..70b3b446303 100644
--- a/addons/website_sale_delivery/controllers/main.py
+++ b/addons/website_sale_delivery/controllers/main.py
@@ -4,7 +4,6 @@
from odoo import http, _
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
-from odoo.tools import float_repr
class WebsiteSaleDelivery(WebsiteSale):
@@ -46,9 +45,6 @@ class WebsiteSaleDelivery(WebsiteSale):
has_stockable_products = any(line.product_id.type in ['consu', 'product'] for line in order.order_line)
if has_stockable_products:
if order.carrier_id and not order.delivery_rating_success:
- values['errors'].append(
- (_("Ouch, you cannot choose this carrier!"),
- _("%s does not ship to your address, please choose another one.\n(Error: %s)" % (order.carrier_id.name, order.delivery_message))))
order._remove_delivery_line()
delivery_carriers = order._get_delivery_methods()
@@ -67,8 +63,15 @@ class WebsiteSaleDelivery(WebsiteSale):
return {'status': order.delivery_rating_success,
'error_message': order.delivery_message,
'carrier_id': carrier_id,
- 'new_amount_delivery': float_repr(currency.round(order.delivery_price), currency.decimal_places),
- 'new_amount_untaxed': order.amount_untaxed,
- 'new_amount_tax': order.amount_tax,
- 'new_amount_total': order.amount_total,
+ 'new_amount_delivery': self._format_amount(order.delivery_price, currency),
+ 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency),
+ 'new_amount_tax': self._format_amount(order.amount_tax, currency),
+ 'new_amount_total': self._format_amount(order.amount_total, currency),
}
+
+ def _format_amount(self, amount, currency):
+ fmt = "%.{0}f".format(currency.decimal_places)
+ lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US')
+
+ return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\
+ .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011')
diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py
index 027d3db904d..461a70f5496 100644
--- a/addons/website_sale_delivery/models/sale_order.py
+++ b/addons/website_sale_delivery/models/sale_order.py
@@ -65,12 +65,11 @@ class SaleOrder(models.Model):
carrier = delivery
break
self.write({'carrier_id': carrier.id})
+ self._remove_delivery_line()
if carrier:
self.get_delivery_price()
if self.delivery_rating_success:
self.set_delivery_line()
- else:
- self._remove_delivery_line()
return bool(carrier)
diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js
index 3cb0df152c1..971e604d1d1 100644
--- a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js
+++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js
@@ -27,6 +27,10 @@ odoo.define('website_sale_delivery.checkout', function (require) {
else {
console.error(result.error_message);
$compute_badge.text(result.error_message);
+ $amount_delivery.text(result.new_amount_delivery);
+ $amount_untaxed.text(result.new_amount_untaxed);
+ $amount_tax.text(result.new_amount_tax);
+ $amount_total.text(result.new_amount_total);
}
};
@@ -40,6 +44,12 @@ odoo.define('website_sale_delivery.checkout', function (require) {
var $carriers = $("#delivery_carrier input[name='delivery_type']");
$carriers.click(_onCarrierClick);
+ // Workaround to:
+ // - update the amount/error on the label at first rendering
+ // - prevent clicking on 'Pay Now' if the shipper rating fails
+ if ($carriers.length > 0) {
+ $carriers.filter(':checked').click();
+ }
/* Handle stuff */
$(".oe_website_sale select[name='shipping_id']").on('change', function () {
diff --git a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
index d72b4c3b696..8568908032e 100644
--- a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
+++ b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml
@@ -3,7 +3,7 @@
<template id="cart_delivery" name="Delivery Costs" inherit_id="website_sale.total">
<xpath expr="//tr[@id='order_total_untaxed']" position="before">
- <tr id="order_delivery" t-if="website_sale_order and website_sale_order.has_delivery">
+ <tr id="order_delivery" t-if="website_sale_order and website_sale_order.carrier_id">
<td class="text-right noborder text-muted" title="Delivery will be updated after choosing a new delivery method">Delivery:</td>
<td class="text-left-not-lg text-right-lg noborder text-muted" >
<span t-field="website_sale_order.amount_delivery" style="white-space: nowrap;" t-options='{
diff --git a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js
index 3eb511140a3..3be63b14ad2 100644
--- a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js
+++ b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js
@@ -75,7 +75,7 @@ var ProductWishlist = Widget.extend({
if (!product_id && e.currentTarget.classList.contains('o_add_wishlist_dyn')) {
product_id = parseInt($el.parent().find('.product_id').val());
}
- if (!_.contains(self.wishlist_product_ids, product_id)) {
+ if (product_id && !_.contains(self.wishlist_product_ids, product_id)) {
return ajax.jsonRpc('/shop/wishlist/add', 'call', {
'product_id': product_id
}).then(function () {
diff --git a/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.scss b/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.scss
index 52194927f2b..f0d7c40b80d 100644
--- a/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.scss
+++ b/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.scss
@@ -2,6 +2,10 @@
.td-wish-btn {
width: 140px;
}
+
+ div.css_not_available .o_add_wishlist_dyn {
+ display: none;
+ }
}
// XS size
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index ba0b1305946..2ef722104b5 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -179,8 +179,9 @@ class WebsiteSlides(http.Controller):
response.mimetype = 'application/pdf'
return response
- @http.route('''/slides/slide/<model("slide.slide"):slide>/download''', type='http', auth="public", website=True)
- def slide_download(self, slide, sitemap=False):
+ @http.route('''/slides/slide/<model("slide.slide"):slide>/download''', type='http', auth="public", website=True, sitemap=False)
+ def slide_download(self, slide, **kw):
+ slide = slide.sudo()
if slide.download_security == 'public' or (slide.download_security == 'user' and request.session.uid):
filecontent = base64.b64decode(slide.datas)
disposition = 'attachment; filename=%s.pdf' % werkzeug.urls.url_quote(slide.name)
@@ -190,7 +191,7 @@ class WebsiteSlides(http.Controller):
('Content-Length', len(filecontent)),
('Content-Disposition', disposition)])
elif not request.session.uid and slide.download_security == 'user':
- return werkzeug.utils.redirect('/web?redirect=/slides/slide/%s' % (slide.id))
+ return request.redirect('/web/login?redirect=/slides/slide/%s' % (slide.id))
return request.render("website.403")
@http.route('''/slides/slide/<model("slide.slide"):slide>/promote''', type='http', auth='user', website=True)
diff --git a/addons/website_slides/models/slides.py b/addons/website_slides/models/slides.py
index 410ef170ebb..b582902eb30 100644
--- a/addons/website_slides/models/slides.py
+++ b/addons/website_slides/models/slides.py
@@ -16,6 +16,8 @@ from odoo.addons.http_routing.models.ir_http import slug
from odoo.tools import image
from odoo.tools.translate import html_translate
from odoo.exceptions import Warning
+from odoo.http import request
+from odoo.addons.http_routing.models.ir_http import url_for
class Channel(models.Model):
@@ -345,10 +347,13 @@ class Slide(models.Model):
embed_code = fields.Text('Embed Code', readonly=True, compute='_get_embed_code')
def _get_embed_code(self):
- base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
+ base_url = request and request.httprequest.url_root or self.env['ir.config_parameter'].sudo().get_param('web.base.url')
+ if base_url[-1] == '/':
+ base_url = base_url[:-1]
for record in self:
if record.datas and (not record.document_id or record.slide_type in ['document', 'presentation']):
- record.embed_code = '<iframe src="%s/slides/embed/%s?page=1" class="o_wslides_iframe_viewer" allowFullScreen="true" height="%s" width="%s" frameborder="0"></iframe>' % (base_url, record.id, 315, 420)
+ slide_url = base_url + url_for('/slides/embed/%s?page=1' % record.id)
+ record.embed_code = '<iframe src="%s" class="o_wslides_iframe_viewer" allowFullScreen="true" height="%s" width="%s" frameborder="0"></iframe>' % (slide_url, 315, 420)
elif record.slide_type == 'video' and record.document_id:
if not record.mime_type:
# embed youtube video
diff --git a/addons/website_slides/static/lib/pdfslidesviewer/PDFSlidesViewer.js b/addons/website_slides/static/lib/pdfslidesviewer/PDFSlidesViewer.js
index d5e7266930c..f313a37dfa3 100644
--- a/addons/website_slides/static/lib/pdfslidesviewer/PDFSlidesViewer.js
+++ b/addons/website_slides/static/lib/pdfslidesviewer/PDFSlidesViewer.js
@@ -147,12 +147,22 @@ var PDFSlidesViewer = (function(){
PDFSlidesViewer.prototype.toggleFullScreenFooter = function(){
if(document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) {
- $('div#PDFViewer > div.navbar-fixed-bottom').toggleClass('oe_show_footer');
+ var $navBarFooter = $('div#PDFViewer > div.navbar-fixed-bottom');
+ $navBarFooter.toggleClass('oe_show_footer');
+
+ if ($navBarFooter.css('display') === 'none') {
+ $navBarFooter.css('display', 'block');
+ $('div#PDFViewer').css('padding-bottom', '50px');
+ } else {
+ $navBarFooter.css('display', 'none');
+ $('div#PDFViewer').css('padding-bottom', '0');
+ }
}
}
PDFSlidesViewer.prototype.toggleFullScreen = function(){
- var el = this.canvas.parentNode;
+ // The canvas and the navigation bar needs to be fullscreened
+ var el = this.canvas.parentNode.parentNode;
var isFullscreenAvailable = document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled || false;
if(isFullscreenAvailable){ // Full screen supported
diff --git a/doc/cla/corporate/acysos.md b/doc/cla/corporate/acysos.md
new file mode 100644
index 00000000000..ed1e556d19a
--- /dev/null
+++ b/doc/cla/corporate/acysos.md
@@ -0,0 +1,16 @@
+Spain, 2018-05-12
+
+Acysos S.L. agrees to the terms of the Odoo Corporate Contributor License
+Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Ignacio Ibeas ignacio@acysos.com https://github.com/acysos
+
+List of contributors:
+
+Ignacio Ibeas ignacio@acysos.com https://github.com/acysos
+Alex Ezquebo alexander@acysos.com https://github.com/acysos
diff --git a/doc/cla/individual/nomadic-coding.md b/doc/cla/individual/nomadic-coding.md
new file mode 100644
index 00000000000..4ac7e62b77c
--- /dev/null
+++ b/doc/cla/individual/nomadic-coding.md
@@ -0,0 +1,11 @@
+Panama, 2018-05-01
+
+I hereby agree to the terms of the Odoo Individual Contributor License
+Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Kumar Aberer hello@nomadic-coding.com https://github.com/nomadic-coding
diff --git a/doc/cla/individual/wohthan.md b/doc/cla/individual/wohthan.md
new file mode 100644
index 00000000000..33f300742ae
--- /dev/null
+++ b/doc/cla/individual/wohthan.md
@@ -0,0 +1,11 @@
+Italy, 2018-05-17
+
+I hereby agree to the terms of the Odoo Individual Contributor License
+Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Samuele Carli <carlisamuele@csspace.net> https://github.com/WohthaN
diff --git a/doc/reference/mixins.rst b/doc/reference/mixins.rst
index c172c79dd2a..ae73a887e06 100644
--- a/doc/reference/mixins.rst
+++ b/doc/reference/mixins.rst
@@ -77,7 +77,7 @@ to manage followers on your record:
.. rubric:: Posting messages
-.. method:: message_post(self, body='', subject=None, message_type='notification', subtype=None, parent_id=False, attachments=None, content_subtype='html', **kwargs)
+.. method:: message_post(self, body='', subject=None, message_type='notification', subtype=None, parent_id=False, attachments=None, **kwargs)
Post a new message in an existing thread, returning the new
mail.message ID.
@@ -85,7 +85,6 @@ to manage followers on your record:
:param str body: body of the message, usually raw HTML that will
be sanitized
:param str message_type: see mail_message.type field
- :param str content_subtype: if plaintext: convert body into html
:param int parent_id: handle reply to a previous message by adding the
parent partners to the message in case of private discussion
:param list(tuple(str,str)) attachments: list of attachment tuples in the form
diff --git a/doc/reference/views.rst b/doc/reference/views.rst
index 8549e71f01c..0a541f162ea 100644
--- a/doc/reference/views.rst
+++ b/doc/reference/views.rst
@@ -954,7 +954,9 @@ calendar view are:
``readonly_form_view_id``
view to open in readonly mode
``form_view_id``
- view to open when the user create or edit an event
+ view to open when the user create or edit an event. Note that if this attribute
+ is not set, the calendar view will fall back to the id of the form view in the
+ current action, if any.
``event_open_popup``
If the option 'event_open_popup' is set to true, then the calendar view will
open events (or records) in a FormViewDialog. Otherwise, it will open events
diff --git a/odoo/addons/base/data/ir_module_category_data.xml b/odoo/addons/base/data/ir_module_category_data.xml
index b308d0cf22c..9d8611386af 100644
--- a/odoo/addons/base/data/ir_module_category_data.xml
+++ b/odoo/addons/base/data/ir_module_category_data.xml
@@ -127,7 +127,7 @@
</record>
<record id="module_category_mass_mailing" model="ir.module.category">
- <field name="name">Mass Mailing</field>
+ <field name="name">Email Marketing</field>
<field name="sequence">19</field>
<field name="description">Helps you manage your mass mailing for design
professional emails and reuse templates.</field>
diff --git a/odoo/addons/base/data/res.country.state.csv b/odoo/addons/base/data/res.country.state.csv
index c48ed49141d..4b445f52cf9 100644
--- a/odoo/addons/base/data/res.country.state.csv
+++ b/odoo/addons/base/data/res.country.state.csv
@@ -397,6 +397,7 @@ state_it_sv,it,"Savona","SV"
state_it_si,it,"Siena","SI"
state_it_sr,it,"Siracusa","SR"
state_it_so,it,"Sondrio","SO"
+state_it_su,it,"Sud Sardegna","SU"
state_it_ta,it,"Taranto","TA"
state_it_te,it,"Teramo","TE"
state_it_tr,it,"Terni","TR"
diff --git a/odoo/addons/base/data/res_country_data.xml b/odoo/addons/base/data/res_country_data.xml
index db41e2370ce..0e865be0fdf 100644
--- a/odoo/addons/base/data/res_country_data.xml
+++ b/odoo/addons/base/data/res_country_data.xml
@@ -1123,6 +1123,7 @@
<field file="base/static/img/country_flags/mx.png" name="image" type="base64" />
<field name="currency_id" ref="MXN" />
<field eval="52" name="phone_code" />
+ <field name="vat_label">RFC</field>
</record>
<record id="my" model="res.country">
<field name="name">Malaysia</field>
diff --git a/odoo/addons/base/data/res_currency_data.xml b/odoo/addons/base/data/res_currency_data.xml
index d9c56dfe558..9966ae87ae6 100644
--- a/odoo/addons/base/data/res_currency_data.xml
+++ b/odoo/addons/base/data/res_currency_data.xml
@@ -55,6 +55,7 @@
<field name="active" eval="False"/>
<field name="currency_unit_label">Yuan</field>
<field name="currency_subunit_label">Fen</field>
+ <field name="position">before</field>
</record>
<record id="COP" model="res.currency">
diff --git a/odoo/addons/base/i18n/de.po b/odoo/addons/base/i18n/de.po
index 12945219fd5..3710878ca5b 100644
--- a/odoo/addons/base/i18n/de.po
+++ b/odoo/addons/base/i18n/de.po
@@ -7657,7 +7657,7 @@ msgstr "Aktionen"
#. module: base
#: model:ir.ui.view,arch_db:base.action_view_company_form_link_2_currencies
msgid "Activate more currencies"
-msgstr ""
+msgstr "Aktivieren von zusätzlichen Währungen"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_cron__active
diff --git a/odoo/addons/base/i18n/nl.po b/odoo/addons/base/i18n/nl.po
index 65feff1e10e..96a69d58b58 100644
--- a/odoo/addons/base/i18n/nl.po
+++ b/odoo/addons/base/i18n/nl.po
@@ -21094,7 +21094,7 @@ msgid ""
"The values for the fields '%s' already exist (they are probably '%s' in the "
"current model)."
msgstr ""
-"De waardes voor het veld '%s' bestaat al (dit is waarschijnlijk '%s' in het "
+"De waardes voor het veld '%s' bestaan al (dit is waarschijnlijk '%s' in het "
"huidige model)."
#. module: base
diff --git a/odoo/addons/base/i18n/tr.po b/odoo/addons/base/i18n/tr.po
index 888249b7fb1..8f66e9fc13f 100644
--- a/odoo/addons/base/i18n/tr.po
+++ b/odoo/addons/base/i18n/tr.po
@@ -60,6 +60,10 @@ msgid ""
"Allow cashier to reprint receipts\n"
"\n"
msgstr ""
+"\n"
+"\n"
+"Kasiyerin fişleri tekrar yazdırmasına izin ver.\n"
+"\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hu
@@ -76,6 +80,18 @@ msgid ""
" - Hungarian Bank information\n"
" "
msgstr ""
+"\n"
+"\n"
+"Macar lokalizasyonu için bazı modüller\n"
+"==========================================\n"
+"\n"
+"This module consists :\n"
+"\n"
+" - Generic Hungarian chart of accounts\n"
+" - Hungarian taxes\n"
+" - Hungarian Bank information\n"
+" \n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_l10n_do
@@ -182,6 +198,10 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Gelir tahakkuku\n"
+"Ürün satışlarınızda gelir muhasebenizi yönetin.\n"
+"Gelir tahakkuk taksitlerini takip eder ve ilgili yevmiye girişlerini oluşturur."
#. module: base
#: code:addons/base/models/res_config.py:314
@@ -202,6 +222,8 @@ msgid ""
"\n"
"This module adds a custom Sales Channel for the point of sale to be able to view and manage your point of sale sales with more ease.\n"
msgstr ""
+"\n"
+"Bu modül, satış noktasınızın daha kolay yönetilebilmesi ve görüntülenebilmesi için özel satış kanalı ekler.\n"
#. module: base
#: model:ir.module.module,description:base.module_pos_restaurant
@@ -214,6 +236,14 @@ msgid ""
"- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers\n"
"\n"
msgstr ""
+"\n"
+"Bu modül çeşitli restoran özelliklerini satış noktaına ekler: \n"
+"\n"
+"- Hesap Yazdırma: Ödeme öncesinde makbuz yazdırılmasına olanak sağlar \n"
+"\n"
+"- Hesap Bölme: Bir siparişi birden fazla siparişe bölmeye olanak sağlar \n"
+"\n"
+"- Mutfak Sipariş Yazdırma: Sipariş değişikliklerini mutfak veya bar yazıcılarından yazdırılmasına olanak sağlar\n"
#. module: base
#: model:ir.module.module,description:base.module_pos_discount
@@ -224,6 +254,8 @@ msgid ""
"sale discount to a customer.\n"
"\n"
msgstr ""
+"\n"
+"Bu modül kasiyerin müşteriye hızlı bir şekilde satış indirimini yüzdesini vermesine izin verir.\n"
#. module: base
#: model:ir.module.module,description:base.module_pos_loyalty
@@ -235,6 +267,8 @@ msgid ""
"and get rewards.\n"
"\n"
msgstr ""
+"\n"
+"Bu modül, satış noktasında müşterilerinizin sadakat puanı kazanıp ödüller kazanabileceği sadakat programı tanımlamanızı sağlar.\n"
#. module: base
#: code:addons/model.py:136
@@ -303,6 +337,9 @@ msgid ""
" - Track timesheet for task from ticket\n"
" "
msgstr ""
+"\n"
+"- Yardım masası takımı için proje düzenlemeye izin ver\n"
+"- Taleplerdeki görevler için zaman çizelgesini takip et"
#. module: base
#: model:ir.module.module,description:base.module_account_tax_python
@@ -315,6 +352,11 @@ msgid ""
" \"Python Code\" defines the amount of the tax.\n"
" "
msgstr ""
+"\n"
+"Python kodu olarak tanımlanan bir vergi, birim fiyat, ürün veya iş ortağı gibi verileri içeren yerel bir ortamda yürütülen iki python kod snippet'lerinden oluşur.\n"
+"'Uygulanabilir Kod', uygulanabilecekse tanımlar\n"
+"\n"
+"\"Python Kod' verginin miktarını tanımlar."
#. module: base
#: model:ir.module.module,description:base.module_l10n_be_reports
@@ -356,6 +398,8 @@ msgid ""
" Also add DATEV export options to general ledger\n"
" "
msgstr ""
+"\n"
+"Almanya için Muhasebe raporları Bilanço, Kâr ve Zarar, KDV ve İş Ortağı KDV raporlarını içerir. Ayrıca, genel muhasebe defterine DATEV ihracat seçenekleri ekler"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hu_reports
@@ -424,6 +468,8 @@ msgid ""
" Accounting reports for UK\n"
" "
msgstr ""
+"\n"
+"Birleşik Krallık için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_us_reports
@@ -432,6 +478,8 @@ msgid ""
" Accounting reports for US\n"
" "
msgstr ""
+"\n"
+"Birleşik Devletler için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_uy_reports
@@ -440,6 +488,8 @@ msgid ""
" Accounting reports for Uruguay\n"
"\n"
msgstr ""
+"\n"
+"Uruguay için muhasebe raporları\n"
#. module: base
#: model:ir.module.module,description:base.module_account_extension
@@ -450,6 +500,9 @@ msgid ""
" This module will be auto installed if account module and enterprise edition are present\n"
" "
msgstr ""
+"\n"
+"Enterprise Sürümü için temel muhasebe modülünü uyarla.\n"
+"Bu modül, eğer muhasebe modülü ve enterprise sürümü yüklüyse, otomatik olarak yüklenir."
#. module: base
#: model:ir.module.module,description:base.module_voip
@@ -458,6 +511,8 @@ msgid ""
" Allow to make call from next activities or with click-to-dial.\n"
" "
msgstr ""
+"\n"
+"Gelecek etkinlikten yada anlaşmaya telefon ile çağrı oluşturmaya izin ver."
#. module: base
#: model:ir.module.module,summary:base.module_account_tax_python
@@ -475,6 +530,8 @@ msgid ""
" Bill timesheets logged on helpdesk tickets.\n"
" "
msgstr ""
+"\n"
+"Ödeme zaman çizelgesi, yardım masası taleplerinde loglanır."
#. module: base
#: model:ir.module.module,description:base.module_hr_maintenance
@@ -503,6 +560,8 @@ msgid ""
" Compute sales tax automatically using TaxCloud based on customer address in United States.\n"
" "
msgstr ""
+"\n"
+"Satış vergisini, müşterinin Birleşik Devletlerdeki adresini baz alan TaxCloud kullanarak otomatik olarak hesapla."
#. module: base
#: model:ir.module.module,summary:base.module_l10n_mx_reports
@@ -514,6 +573,11 @@ msgid ""
" DIOT Report\n"
" "
msgstr ""
+"\n"
+"Ekonomik muhasebe raporları\n"
+"- COA\n"
+"- Geçici Mizan\n"
+"DIOT raporu"
#. module: base
#: model:ir.module.module,summary:base.module_pos_cache
@@ -521,6 +585,8 @@ msgid ""
"\n"
" Enable a cache on products for a lower POS loading time."
msgstr ""
+"\n"
+"Daha kısa bir POS yükleme süresi için ürünlerde bir önbellek etkinleştirin."
#. module: base
#: model:ir.module.module,description:base.module_hr_expense_sepa
@@ -529,6 +595,8 @@ msgid ""
" Enable the SEPA features in the payments of expenses\n"
" "
msgstr ""
+"\n"
+"SEPA özelliklerini giderlerin ödemesinde etkinleştirin"
#. module: base
#: model:ir.module.module,description:base.module_account_sepa
@@ -540,6 +608,10 @@ msgid ""
" For more informations about the SEPA standards : http://www.iso20022.org/ and http://www.europeanpaymentscouncil.eu/\n"
" "
msgstr ""
+"\n"
+"Önerilen SEPA normları gibi, ödeme talimatı oluşturun, pain.001 mesajlarına teşekkürler. Desteklenen pain versiyonu (ülkelere göre) pain.001.001.03 (genel), pain.001.001.03.ch.02 (İsviçre) ve pain.001.003.03 (Almanya). Oluşturulan XML dosyası daha sonra bankanıza yüklenebilir.\n"
+"Bu modül Avrupa Ödeme Konseyi tarafından verilen uygulama kurallarına uyar.\n"
+"SEPA standartları hakkında daha fazla bilgi için : http://www.iso20022.org/ ve http://www.europeanpaymentscouncil.eu/"
#. module: base
#: model:ir.module.module,summary:base.module_voip
@@ -547,6 +619,8 @@ msgid ""
"\n"
" Make Call from all modules using the VOIP system."
msgstr ""
+"\n"
+"Tüm modüllerden VOIP sistemini kullanarak çağrı oluşturun."
#. module: base
#: model:ir.module.module,summary:base.module_website_quote_subscription
@@ -554,6 +628,8 @@ msgid ""
"\n"
" Online Quotes for subscriptions products"
msgstr ""
+"\n"
+"Abonelik ürünleri için online talepler"
#. module: base
#: model:ir.module.module,description:base.module_hr_expense_check
@@ -562,6 +638,8 @@ msgid ""
" Print amount in words on checks issued for expenses\n"
" "
msgstr ""
+"\n"
+"Masraflar için verilen çeklerde yazılı tutar"
#. module: base
#: model:ir.module.module,summary:base.module_social_media
@@ -580,6 +658,11 @@ msgid ""
" fields are stored in a \"serialized\" field in the form of a JSON mapping.\n"
" "
msgstr ""
+"\n"
+"Bu modülün amacı \"seyrek\" alanlara uygulamaktır\n"
+"\n"
+"Bu uygulama, bir tablodaki sütun sayısı üzerindeki PostgreSQL sınırlamasını engeller.\n"
+"Tüm seyrek alanları değeri JSON haritalama formundaki 'seri' alanlarda depolanır."
#. module: base
#: model:ir.module.module,description:base.module_social_media
@@ -597,6 +680,8 @@ msgid ""
" This module adds support for barcodes scanning to the delivery packages.\n"
" "
msgstr ""
+"\n"
+"Bu modül, teslimat paketlerinde barkod taraması için destek ekler."
#. module: base
#: model:ir.module.module,description:base.module_stock_barcode
@@ -605,6 +690,8 @@ msgid ""
" This module adds support for barcodes scanning to the warehouse management system.\n"
" "
msgstr ""
+"\n"
+"Bu modül depo yönetim sisteminde barkod taraması için destek ekler."
#. module: base
#: model:ir.module.module,description:base.module_account_sepa_direct_debit
@@ -641,6 +728,15 @@ msgid ""
" try to use this method on an invoice for whose payment no mandate can be used.\n"
" "
msgstr ""
+"\n"
+" Bu modül, bir takım ödemeleri toplayabilmek için bankanıza göndermek üzere SEPA Otomatik Ödeme (SDD) uyumlu XML dosyalarının (pain.008.001.02 belirtimiyle tutarlı olarak) oluşturulmasını sağlar.\n"
+"Bu ödeme yöntemine hak kazanabilmek için bir müşteri, önce otomatik ödeme kullanım onayını vererek şirkete bir vekalet vermiş olmalıdır.\n"
+"Bu onay Odoo'ya 'müşteri yetkisi' olarak kodlanmış olmalıdır.\n"
+"Bir SDD dosyasını düzgün bir şekilde oluşturmak için aşağıdaki gereksinimleri de karşılamanız gerekir:\n"
+"- Şirket hesabınız geçerli bir IBAN numarası olarak ayarlanmalıdır \n"
+"- Şirket hesabınız geçerli bir BIC'ye sahip bir banka ile ilişkili olmalıdır \n"
+"- Şirketinize bir alacaklı kimliği verilmiş olmalıdır (bu, 'ayarlar' menüsünde yapılabilir. muhasebe modülü).\n"
+"- Firmanız SDD ödemeleri almak için bir yevmiye tanımlamış olmalıdır (yine, 'muhasebe modülünün' ayarlarında ')"
#. module: base
#: model:ir.module.module,summary:base.module_account_online_sync
@@ -648,6 +744,8 @@ msgid ""
"\n"
" This module is used for Online bank synchronization."
msgstr ""
+"\n"
+"Bu modül online banka senkronizasyonu için kullanılır."
#. module: base
#: model:ir.module.module,description:base.module_account_online_sync
@@ -656,6 +754,8 @@ msgid ""
" This module is used for Online bank synchronization. It provides basic methods to synchronize bank statement.\n"
" "
msgstr ""
+"\n"
+"Bu modül online banka senkronizasyonu için kullanılır. Bu, banka durumu ile senkronize olmayı basit yöntemlerle sağlar."
#. module: base
#: model:ir.module.module,description:base.module_web_mobile
@@ -664,6 +764,8 @@ msgid ""
" This module provides the core of the Odoo Mobile App.\n"
" "
msgstr ""
+"\n"
+"Bu modül Odoo Mobil App'in çekirdeğini sağlar."
#. module: base
#: model:ir.module.module,description:base.module_maintenance
@@ -703,6 +805,9 @@ msgid ""
" to allow you to define interviews for different jobs.\n"
" "
msgstr ""
+"\n"
+"İşe alım sürecinde görüşme formlarını kullanın.\n"
+"Bu modül, farklı işler için görüşmeler tanımlamanıza olanak tanıyan anket modülü ile entegre edilmiştir."
#. module: base
#: model:ir.module.module,description:base.module_timesheet_grid_sale
@@ -712,6 +817,8 @@ msgid ""
" linked to an SO, or only the validated timesheets\n"
" "
msgstr ""
+"\n"
+"Zaman çizelgesini faturaladığınızda, bir satış siparişine veya yalnızca onaylanmış zaman çizelgelerine bağlı tüm zaman çizelgelerini faturalandırmaya izin verir"
#. module: base
#: model:ir.module.module,description:base.module_l10n_multilang
@@ -724,6 +831,10 @@ msgid ""
" templates to target objects.\n"
" "
msgstr ""
+"\n"
+"* Birçok dil, Muhasebe Kartı, Vergiler, Vergi Kodları, Yevmiyeler, Muhasebe Şablonları, Analitik Muhasebe Kartları ve Analitik Yevmiyeler için destek sağlar.\n"
+"* Kurulum sihirbaz değişiklikleri \n"
+"- Şablonlardan COA, Vergi, Vergi Kodu ve Mali Durumlarını hedef objelere kopyalayın."
#. module: base
#: model:ir.module.module,description:base.module_quality_mrp_workorder
@@ -738,6 +849,8 @@ msgid ""
"\n"
" Adds workcenters to Quality Control\n"
msgstr ""
+"\n"
+"Kalite kontrol için iş merkezi ekler\n"
#. module: base
#: model:ir.module.module,description:base.module_test_documentation_examples
@@ -748,6 +861,8 @@ msgid ""
" syntax-checked and tested.\n"
" "
msgstr ""
+"\n"
+"Sözdizimi kontrol edilip test edilebilecek durumlarda teknik dokümantasyon örnekleri olarak (`literalinclude`` direktifiyle) kullanılacak kod parçalarını içerir."
#. module: base
#: model:ir.module.module,description:base.module_website_sale_stock
@@ -765,6 +880,8 @@ msgid ""
" Gantt view for Leaves Dashboard\n"
" "
msgstr ""
+"\n"
+"İzin paneli için Gantt görünümü"
#. module: base
#: model:ir.module.module,description:base.module_hr_timesheet_attendance
@@ -786,6 +903,9 @@ msgid ""
" PayUmoney payment gateway supports only INR currency.\n"
" "
msgstr ""
+"\n"
+"Hindistan için PayuMoney Ödeme Alıcısı.\n"
+"PayUmoney ödeme geçidi sadece INR para birimini destekler."
#. module: base
#: model:ir.module.module,description:base.module_project_forecast
@@ -801,6 +921,8 @@ msgid ""
"\n"
" Publish your products on eBay"
msgstr ""
+"\n"
+"Ürünlerinizi eBay'de yayınlayın"
#. module: base
#: model:ir.module.module,description:base.module_project_forecast_sale
@@ -809,6 +931,8 @@ msgid ""
"* Automatically enables forecasting on projects created from sales orders\n"
" "
msgstr ""
+"\n"
+"* Satış siparişlerinden oluşturulmuş projelerde otomatik olarak öngörür"
#. module: base
#: model:ir.module.module,description:base.module_timesheet_grid
@@ -818,6 +942,9 @@ msgid ""
"* Activate grid view for timesheets\n"
" "
msgstr ""
+"\n"
+"* Zaman çizelgesi sunumu ve onaylama\n"
+"* Zaman çizelgesi için grid görünümünü etkinleştir"
#. module: base
#: model:ir.module.module,description:base.module_report_intrastat
@@ -829,6 +956,9 @@ msgid ""
"This module gives the details of the goods traded between the countries of\n"
"European Union."
msgstr ""
+"\n"
+"Ticaret istatistiklerini ekleyen bir modül.\n"
+"Bu modül, Avrupa Birliği ülkeleri arasında yapılan ticaretin detaylarını verir."
#. module: base
#: model:ir.module.module,description:base.module_account_accountant
@@ -840,6 +970,11 @@ msgid ""
"\n"
"It assigns manager and user access rights to the Administrator for the accounting application and only user rights to the Demo user.\n"
msgstr ""
+"\n"
+"Muhasebe Erişim Hakları\n"
+"Admin kullanıcıya yevmiye kalemleri ve hesap planı gibi tüm muhasebe özelliklerine erişim sağlar.\n"
+"\n"
+"Muhasebe uygulaması için admine, yöneticiye, kullanıcıya ve yalnızca Demo kullanıcısı için kullanıcı hakları atar.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_be_hr_payroll_account
@@ -862,6 +997,8 @@ msgid ""
"==================\n"
" "
msgstr ""
+"\n"
+"Muhasebe Raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ar_reports
@@ -872,6 +1009,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Arjantin için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_bo_reports
@@ -882,6 +1021,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Bolivya için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_co_reports
@@ -891,6 +1032,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Kolombiya için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hr_reports
@@ -900,6 +1043,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Hırvatistan için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_et_reports
@@ -910,6 +1055,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Etiyopya muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_fr_reports
@@ -920,6 +1067,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Fransa için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_gr_reports
@@ -930,6 +1079,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Yunanistan için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_in_reports
@@ -939,6 +1090,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Hindistan için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_jp_reports
@@ -948,6 +1101,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Japonya için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_lu_reports
@@ -957,6 +1112,8 @@ msgid ""
"=================================\n"
" "
msgstr ""
+"\n"
+"Lüksemburg için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ma_reports
@@ -966,6 +1123,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Fas için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_no_reports
@@ -975,6 +1134,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Norveç için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_pl_reports
@@ -984,6 +1145,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Polonya için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_l10n_sg_reports
@@ -1005,6 +1168,8 @@ msgid ""
"================================\n"
" "
msgstr ""
+"\n"
+"Tayland için muhasebe raporları"
#. module: base
#: model:ir.module.module,description:base.module_website_mass_mailing
@@ -1013,6 +1178,8 @@ msgid ""
"Add a snippet in the website builder to subscribe a mass_mailing list\n"
" "
msgstr ""
+"\n"
+"Website oluşturucuya, bir mass_mailing listesine abone olmak için bir parça ekleyin"
#. module: base
#: model:ir.module.module,description:base.module_sale_order_dates
@@ -1027,6 +1194,12 @@ msgid ""
" * Commitment Date\n"
" * Effective Date\n"
msgstr ""
+"\n"
+"Satış siparişine ek tarih bilgisi ekleyin.\n"
+"Bir satış siparişine şu tarihleri ekleyebilirsiniz:\n"
+"* İstenen Tarih (seçim tarihinde beklenen tarih olarak kullanılacaktır)\n"
+"* Taahhüt Tarihi\n"
+"* Yürürlülük Tarihi\n"
#. module: base
#: model:ir.module.module,description:base.module_hr_contract
@@ -1066,6 +1239,11 @@ msgid ""
"For instance when invoicing a training, the training agenda and materials will automatically be sent to your customers.'\n"
" "
msgstr ""
+"\n"
+"Fatura onayında göndermek için ürüne email şablonu ekleyin\n"
+"Bu modül ile birlikte, ürünlerinizi müşterinize tam bilgi ve araç göndermek için bir şablona bağlayın.\n"
+"\n"
+"Örneğin, bir eğitimi faturalandırırken, eğitim ajandası ve materyalleri müşterilerinize otomatik olarak gönderilecektir."
#. module: base
#: model:ir.module.module,description:base.module_product_margin
@@ -1076,6 +1254,8 @@ msgid ""
"\n"
"The wizard to launch the report has several options to help you get the data you need.\n"
msgstr ""
+"\n"
+"Satışları, satın alımları, marjları ve faturalara dayalı diğer ilginç göstergeleri hesaplayan ürünlere bir raporlama menüsü ekler\n"
#. module: base
#: model:ir.module.module,description:base.module_pad
@@ -1088,6 +1268,8 @@ msgid ""
"pads (by default, http://etherpad.com/).\n"
" "
msgstr ""
+"\n"
+"Web istemcisinde (Ether) Pad eklentileri için gelişmiş destek ekler."
#. module: base
#: model:ir.module.module,description:base.module_website_calendar
@@ -1097,6 +1279,8 @@ msgid ""
"-------------------------------------------------------------\n"
"\n"
msgstr ""
+"\n"
+"Müşterilerinizin Web Siteniz üzerinden Randevu Almasını sağlayın\n"
#. module: base
#: model:ir.module.module,description:base.module_pos_mercury
@@ -1116,6 +1300,14 @@ msgid ""
"* Supported cards: Visa, MasterCard, American Express, Discover\n"
" "
msgstr ""
+"\n"
+"Kredi kartı POS ödemelerine izin verir.\n"
+"Bu modül, müşterilerin, siparişlerini kredi kartı ile ödemesine izin verir.\n"
+"İşlemler Mercury (Wells Fargo Bank tarafından geliştirilen) tarafından işlenir. Bir Mercury ticari hesabı gereklidir. Bu hesap, şunları sağlar:\n"
+"* Ödeme ekranındayken sadece bir kredi kartını okutarak hızlı ödeme.\n"
+"* Nakit ve kredi kartı ödemelerinin birleştirilmesi.\n"
+"* Paraüstü\n"
+"* Desteklenen kartlar: Visa, MasterCard, American Express, Discover"
#. module: base
#: model:ir.module.module,description:base.module_auth_oauth
@@ -1124,6 +1316,8 @@ msgid ""
"Allow users to login through OAuth2 Provider.\n"
"=============================================\n"
msgstr ""
+"\n"
+"OAuth2 sağlayıcısı ile kullanıcılara giriş için izin ver.\n"
#. module: base
#: model:ir.module.module,description:base.module_auth_signup
@@ -1157,6 +1351,9 @@ msgid ""
"\n"
"Be careful with this module as it has audit implications. Cancelling accounting entries is not authorized in all countries.\n"
msgstr ""
+"\n"
+"Hesap girdilerinin iptalini sağlar.\n"
+"Bu modül yevmiye girişlerini iptal etmeye izin vermek için, muhasebe yevmiyelerine bir kontrol kutusu ekler.\n"
#. module: base
#: model:ir.module.module,description:base.module_sale_timesheet
@@ -1169,6 +1366,10 @@ msgid ""
"according to the order/contract you work on. This allows to\n"
"have real delivered quantities in sales orders.\n"
msgstr ""
+"\n"
+"Satış siparişlerinde satış zaman çizelgesine izin verir.\n"
+"\n"
+"Bu modül, çalıştığınız siparişe / sözleşmeye göre tüm zaman çizelgesinde doğru ürünü belirler. Bu, satış siparişlerindeki gerçek teslim miktarının olmasını sağlar. \n"
#. module: base
#: model:ir.module.module,description:base.module_delivery
@@ -1180,6 +1381,9 @@ msgid ""
"You can define your own carrier for prices. When creating\n"
"invoices from picking, the system is able to add and compute the shipping line.\n"
msgstr ""
+"\n"
+"Satış siparişlerine ve toplamaya teslimat yöntemi eklemenizi sağlar.\n"
+"Fiyatlar için kendi taşıyıcınızı tanımlayabilirsiniz. Toplamadan faturalar oluşturulurken, sistem kargo satırını ekleyebilir ve hesaplamayı sağlar.\n"
#. module: base
#: model:ir.module.module,description:base.module_mrp_account
@@ -1190,6 +1394,9 @@ msgid ""
"\n"
"* Cost structure report\n"
msgstr ""
+"\n"
+"MRP'deki Analitik Muhasebe\n"
+"* Maliyet yapısı raporu\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ar
@@ -1202,6 +1409,12 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Arjantin hesap planı ve yerel vergi.\n"
+"==============================================\n"
+"Plan contable argentino e impuestos de acuerdo a disposiciones vigentes\n"
+"\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_website_forum
@@ -1210,6 +1423,8 @@ msgid ""
"Ask questions, get answers, no distractions\n"
" "
msgstr ""
+"\n"
+"Sorular sorun, cevaplar alın, oyalamak yok"
#. module: base
#: model:ir.module.module,description:base.module_account_test
@@ -1223,6 +1438,10 @@ msgid ""
"in PDF format which can be accessed by Menu Reporting -> Accounting Tests, then select the test \n"
"and print the report from Print button in header area.\n"
msgstr ""
+"\n"
+"Muhasebe ile ilgili konular.\n"
+"Bu modül ile birlikte, muhasebe modülünün tutarlılıklarını ve tutarsızlıklarını, Raporlama / Muhasebe / Muhasebe Testleri menüsünden manuel olarak kontrol edebilirsiniz.\n"
+"Süreklilik Testi oluşturmak için bir istek yazabilir ve test sonuçlarını PDF formatında Raporlar Menüsü -> Muhasebe Testleri den elde edebilir, daha sonra testi seçer ve raporun üst kısmında bulunan Yazdır butonuna tıklayarak yazdırabilirsin. \n"
#. module: base
#: model:ir.module.module,description:base.module_account_asset
@@ -1235,6 +1454,10 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Varlıklar Yönetimi\n"
+"Bir şirketin yada bir kişinin sahip olduğu varlıkları yönetin.\n"
+"Amortismanları takip eder ve karşılık gelen yevmiye girişlerini yaratır."
#. module: base
#: model:ir.module.module,description:base.module_document
@@ -1245,6 +1468,10 @@ msgid ""
"* Show attachment on the top of the forms\n"
"* Document Indexation: odt\n"
msgstr ""
+"\n"
+"Eklerin listesi ve belge endeksleme\n"
+"* Eki formun üstünde göster\n"
+"* Belge Endeksleme: odt\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_au
@@ -1260,6 +1487,12 @@ msgid ""
" - sets up Australian taxes.\n"
" "
msgstr ""
+"\n"
+"Avustralya Muhasebe Modülü\n"
+"Avustralya muhasebesi temel grafikler ve yerelleştirmeler.\n"
+"Ayrıca:\n"
+"- bir dizi bölgesel para birimini etkinleştirir.\n"
+"- Avustralya vergilerini ayarla."
#. module: base
#: model:ir.module.module,description:base.module_l10n_au_reports
@@ -1271,6 +1504,9 @@ msgid ""
"GST Reporting for Australian Accounting.\n"
" "
msgstr ""
+"\n"
+"Avustralya Muhasebe Raporları\n"
+"Avustralya Muhasebesi için GST raporları."
#. module: base
#: model:ir.module.module,description:base.module_base_vat_autocomplete
@@ -1282,6 +1518,9 @@ msgid ""
" This module requires the python library stdnum to work.\n"
" "
msgstr ""
+"\n"
+"Vergi No ile adreslerin oto-tamamlanması\n"
+"Bu modül çalışmak için python kütüphane stdnumu gerektirir."
#. module: base
#: model:ir.module.module,description:base.module_base_gengo
@@ -1298,6 +1537,13 @@ msgid ""
"This wizard will activate the CRON job and the Scheduler and will start the automatic translation via Gengo Services for all the terms where you requested it.\n"
" "
msgstr ""
+"\n"
+"Gengo API üzerinden Otomatik Çeviriler\n"
+"\n"
+"Bu modül, Gengo API kullanarak otomatik çeviri için pasif zamanlayıcı işini yükleyecektir. Etkinleştirmek için, şunları yapmak zorundasınız.\n"
+"1) 'Ayarlar > Şirketler > Gengo Parametreleri' içinde Gengo yetkilendirme parametrelerini yapılandırın.\n"
+"2) Sihirbazı 'Ayarlar> Uygulama Koşulları> Gengo: Manuel Tercüme İstekleri' altında başlatın ve sihirbazı izleyin.\n"
+"Bu sihirbaz CRON işini ve Zamanlayıcı'yı etkinleştirir ve sizden talep ettiğiniz tüm terimler için otomatik çeviri ile Gengo Servisleri'ni başlatır."
#. module: base
#: model:ir.module.module,description:base.module_hw_scanner
@@ -1311,6 +1557,9 @@ msgid ""
"point of sale module. \n"
"\n"
msgstr ""
+"\n"
+"Barkod Tarama Donanım Sürücüsü\n"
+"Bu modül, web istemcisinin uzaktan kurulmuş bir barkoda erişmesini sağlar tarayıcı ve satış noktası noktasına barkod tarayıcı desteği sağlamak için posbox tarafından kullanılır.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_et
@@ -1326,6 +1575,12 @@ msgid ""
" - Regional State listings\n"
" "
msgstr ""
+"\n"
+"Etiyopya Yerelleştirmesi için Temel Modül\n"
+"Bu en son Etiyopya Odoo yerelleştirmesi ve şunları içerir:\n"
+"- Hesağ planı\n"
+"- Vergi No'lu vergi yapısı\n"
+"- Stopaj yapısı"
#. module: base
#: model:ir.module.module,description:base.module_l10n_br
@@ -1367,6 +1622,32 @@ msgid ""
"2011). Those modules are also strictly licensed under AGPL V3 and today don't \n"
"come with any additional paid permission for online use of 'private modules'.\n"
msgstr ""
+"\n"
+"Brezilya lokalizasyonu için temel modül\n"
+"==========================================\n"
+"\n"
+"Bu modül şunlardan oluşur:\n"
+"\n"
+" - Genel Brezilya hesap tablosu\n"
+" - Brezilya vergileri gibi:\n"
+"\n"
+"        - IPI\n"
+"        - ICMS\n"
+"        - PIS\n"
+"        - COFINS\n"
+"        - ISS\n"
+"        - IR\n"
+"        - IRPJ\n"
+"        - CSLL\n"
+"\n"
+"Tax_discount alanı ayrıca, account.tax.template dosyasına eklenmiştir.\n"
+"Bazı Brezilya KDV'lerinin doğru hesaplanmasını sağlamak için ICMS gibi account.tax nesnelerine izin verir.\n"
+"Hesap oluşturma sihirbazı şeması bu yeni verileri doğru bir şekilde yayar\n"
+"\n"
+"Ancak, bu modülün birçok uygulamada eksik olduğunu not etmek önemlidir.\n"
+"Odoo'yu Brezilya'da uygun şekilde kullanın. Bu uygulamalar (halihazırda faal olan elektronik mali Faturalama gibi), Brezilyalı Launchpad yerelleştirme projesi olan https://launchpad.net/openerp.pt-br-localiz'in 15'ten fazla ek modülü ve bunların\n"
+"ekstra eklentiler dalı tarafından taşınır. Bu modüller dikkat çekici Odoo modülerliğini bozmama amacını taşıyor, bu yüzden sayıca çok ama küçükler. \n"
+"Bu modülleri ayrı tutmanın nedenlerinden biri, Brezilyalı Yerelleşme liderlerinin, şirketlerin geri kalan yasal gereklilikleri finanse etmesi (örneğin, mali defterler, SPED, mali SPED ve PAF ECF gibi) Eylül ayında hala eksik olan yerelleşmeyi tamamlamak için haklar çevikliğine ihtiyaç duymalarıdır. 2011). Bu modüller ayrıca AGPL V3 kapsamında kesinlikle lisanslıdır ve bugün 'özel modüllerin çevrimiçi kullanımı için herhangi bir ek ücretli izinle birlikte gelmemektedir.\n"
#. module: base
#: model:ir.module.module,description:base.module_account_batch_deposit
@@ -1379,6 +1660,10 @@ msgid ""
"When you proceed with the reconciliation, simply select the corresponding batch deposit to reconcile the payments.\n"
" "
msgstr ""
+"\n"
+"Toplu ödemeler, alınan çekleri bankaya yatırmadan önce gruplamanıza izin verir.\n"
+"Bankanıza yatırılan tutar, banka hesap özetinizde tek bir işlem olarak görünür.\n"
+"Uzlaştırmaya geçtiğinizde ödemeleri eşleştirmek için ilgili toplu ödemeyi seçin."
#. module: base
#: model:ir.module.module,description:base.module_l10n_be_hr_payroll
@@ -1398,6 +1683,19 @@ msgid ""
" * Salary Maj, ONSS, Withholding Tax, Child Allowance, ...\n"
" "
msgstr ""
+"\n"
+"Belçika Bordro Kuralları.\n"
+"======================\n"
+"\n"
+" * Çalışan bilgileri\n"
+" * Çalışan Sözleşmeleri\n"
+" * Pasaport Bazlı Sözleşme\n"
+" * Ödenek / Kesintiler\n"
+" * Temel / Brüt / Net Maaşı yapılandırmaya izin ver\n"
+" * Çalışan Payslip\n"
+" * Aylık Bordro Kayıt\n"
+" * Ayrılık Yönetimi ile Entegre\n"
+" * Maaş Maj, ONSS, Stopaj Vergisi, Çocuk Ödeneği,"
#. module: base
#: model:ir.module.module,description:base.module_pos_blackbox_be
@@ -1421,6 +1719,23 @@ msgid ""
"No modified version is certified and supported by Odoo SA.\n"
" "
msgstr ""
+"\n"
+"Belçika Kayıtlı Yazarkasa\n"
+"================================\n"
+"\n"
+"Bu modül Satış Noktası modülünü sertifikalı bir Belçika kasaya dönüştürür.\n"
+"\n"
+"Daha fazla bilgi:\n"
+" * http://www.systemedecaisseenregistreuse.be/\n"
+" * http://www.geregistreerdkassasysteem.be/\n"
+"\n"
+"Yasal\n"
+"-----\n"
+"** pos_blackbox_be kaynaklarının kullanımı sadece odoo.com SaaS platformunda onaylıdır\n"
+"9.0 sürümü için. **\n"
+"Pos_blackbox_be'nin gizlenmiş ve onaylanmış bir sürümü sağlanabilir.\n"
+"şirket içi kurulumlar için talepler.\n"
+"Hiçbir değiştirilmiş sürüm Odoo SA tarafından onaylanmış ve desteklenmemektedir."
#. module: base
#: model:ir.module.module,description:base.module_l10n_bo
@@ -1432,6 +1747,12 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Bolivya hesap planı ve yerel vergi.\n"
+"==============================================\n"
+"Plan contable boliviano e impuestos de acuerdo a disposiciones vigentes\n"
+"\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_website_rating
@@ -1440,6 +1761,8 @@ msgid ""
"Bridge module for rating on website stuff.\n"
" "
msgstr ""
+"\n"
+"Web sitesi sayfalarında değerlendirme için köprü modülü."
#. module: base
#: model:ir.module.module,description:base.module_project_timesheet_holidays
@@ -1452,6 +1775,12 @@ msgid ""
"on leaves. Project and task can be configured company-wide.\n"
" "
msgstr ""
+"\n"
+"Köprü modülü zaman çizelgesine izinleri entegre eder\n"
+"================================================\n"
+"\n"
+"Bu modül, çalışanlar otomatik olarak zaman çizelgelerini izinler üzerinde günlüğe kaydetmeyi sağlar.\n"
+". Proje ve görev şirket çapında yapılandırılabilir."
#. module: base
#: model:ir.module.module,description:base.module_base_automation_hr_contract
@@ -1461,6 +1790,8 @@ msgid ""
"====================================================\n"
" "
msgstr ""
+"\n"
+"Otomatik işlemlerde sözleşme takvimi eklemek için köprü"
#. module: base
#: model:ir.module.module,description:base.module_crm_phone_validation
@@ -1471,6 +1802,9 @@ msgid ""
"\n"
"This module allows for validate and format phone numbers for leads and contacts."
msgstr ""
+"\n"
+"CRM Telefon Numarası Doğrulaması\n"
+"Bu modül müşteri adaylarının yada kişilerin telefon numaralarını doğrulamayı ve formatını sağlar."
#. module: base
#: model:ir.module.module,description:base.module_l10n_ve
@@ -1504,6 +1838,19 @@ msgid ""
"If you install this module, and select Custom chart a basic chart will be proposed, \n"
"but you will need set manually account defaults for taxes.\n"
msgstr ""
+"\n"
+"Venezuella Hesap Bilgileri.\n"
+"Venezuela, yasalara göre hiçbir hesap tablosuna sahip değil, ancak varsayılan, Odoo'da önerilen, Venezuela'da kabul edilen bazı uygulamalarl uyumludur ve bu plan bu uygulamalara uymalıdır. \n"
+"\n"
+"Bu modül 1000'den fazla şirket için temel olarak test edildi, çünkü Venezüella piyasasında en yaygın yazılımların bir karışımına dayanıyor. Muhasebecilerin Odoo'yla ilk adımlarını daha rahat hissetmelerini sağlayacak.\n"
+"Bu modül, Venezüella'nın tamamının lokalizasyonu gibi görünmüyor, ancak bu ülkede Odoo ile gerçekten hızlı bir şekilde başlamanıza yardımcı olacak.\n"
+"Bu modül size şunları sağlar:\n"
+"- Venezuella temel vergileri\n"
+"- Topluluk yerelleştirmesiyle testleri çalıştırmak için temel verilere sahip olun\n"
+"- İhtiyaçlarınız bir muhasebe PoV'sinden temel alıyorsa, 0'dan bir şirket başlatın.\n"
+"Eğer Venezuella faturasız bir şekilde stoğunuzu değerlemek istiyorsanız, biz account_anglo_saxon kullanmanızı öneriyoruz.\n"
+"\n"
+"Bu modülü kurarsanız ve Özel çizelge'yi seçerseniz, temel bir grafik önerilecektir, ancak vergiler için manuel hesap varsayılanlarını ayarlamanız gerekecektir.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_th
@@ -1515,6 +1862,9 @@ msgid ""
"Thai accounting chart and localization.\n"
" "
msgstr ""
+"\n"
+"Tayland Hesap Bilgileri\n"
+"Tayland muhasebe biligileri ve yerelleştirme"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cr
@@ -1533,6 +1883,13 @@ msgid ""
"please go to http://translations.launchpad.net/openerp-costa-rica.\n"
" "
msgstr ""
+"\n"
+"Kosta Rika hesap bilgileri.\n"
+"Şunları içerir:\n"
+"* account.account.template\n"
+"* account.tax.template\n"
+"* account.chart.template\n"
+"Herşey İspanyolca çeviri ile İngilizce'dir. Daha fazla çeviri kabul edilir, lütfen http://translations.launchpad.net/openerp-costa-rica adresine gidin."
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@@ -1561,6 +1918,9 @@ msgid ""
"This module allows to enforce users to choose the city of a partner inside a given list instead of a free text field.\n"
" "
msgstr ""
+"\n"
+"Adreslerle Şehir Yönetimi\n"
+"Bu modül, kullanıcıları serbest metin alanı yerine belirli bir listedeki bir ortağın şehrini seçmeye zorlar."
#. module: base
#: model:ir.module.module,description:base.module_project_timesheet_forecast_sale
@@ -1572,6 +1932,9 @@ msgid ""
"In your project plan, you can compare your timesheets and your forecast to better schedule your resources.\n"
" "
msgstr ""
+"\n"
+"Zaman çizelgelerini ve öngörüleri projeleriniz için kıyaslayın.\n"
+"Proje planınızda, kaynaklarınızı daha iyi planlamak için zaman çizelgelerinizi ve öngörülerinizi kıyaslayabilirsiniz."
#. module: base
#: model:ir.module.module,description:base.module_decimal_precision
@@ -1580,6 +1943,8 @@ msgid ""
"Configure the price accuracy you need for different kinds of usage: accounting, sales, purchases.\n"
"=================================================================================================\n"
msgstr ""
+"\n"
+"Farklı kullanım türleri için ihtiyacınız olan fiyat doğruluğunu yapılandırın: muhasebe, satış, satın almalar.\n"
#. module: base
#: model:ir.module.module,description:base.module_website_crm_phone_validation
@@ -1593,6 +1958,11 @@ msgid ""
"- use the international format for all others\n"
" "
msgstr ""
+"\n"
+"Websitedeki İletişim Numarası Doğrulama\n"
+"Kartvizit (telefon, cep telefonu) numaralarını doğrulayın ve potansiyel müşteri adaylarına ve kişilere göre normalleştirin:\n"
+"- Şirketinizin bulunduğu ülke için ulusal formatı kullanın\n"
+"- Diğerleri için uluslararası formatı kullanın "
#. module: base
#: model:ir.module.module,description:base.module_account
@@ -1601,6 +1971,8 @@ msgid ""
"Core mechanisms for the accounting modules. To display the menuitems, install the module account_invoicing.\n"
" "
msgstr ""
+"\n"
+"Muhasebe modülü için ana mekanizma. menü elemanlarını göstermek, modül account_invoicing yükleyin."
#. module: base
#: model:ir.module.module,description:base.module_survey
@@ -1616,6 +1988,9 @@ msgid ""
"sent mails with personal token for the invitation of the survey.\n"
" "
msgstr ""
+"\n"
+"Güzel web anketleri oluşturun ve cevapları görselleştirin\n"
+"Bazı kullanıcıların cevaplarına veya incelemelerine göre değişir. Bir anket birden fazla sayfa olabilir. Her sayfa birçok soru içerebilir ve her sorunun birden çok cevabı olabilir. Farklı kullanıcılar soruların cevaplarını farklı verebilirler ve anket buna göre yapılır. Ortaklara ayrıca, anketin daveti için kişisel Token'ı olan postalar gönderilir."
#. module: base
#: model:ir.module.module,description:base.module_link_tracker
@@ -1626,6 +2001,8 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Kısa ve takip edilebilir URL oluşturun."
#. module: base
#: model:ir.module.module,description:base.module_event_sale
@@ -1643,6 +2020,11 @@ msgid ""
"when you confirm your sales order it will automatically create a registration for\n"
"this event.\n"
msgstr ""
+"\n"
+"Satış siparişleri ile kayıt oluşturma.\n"
+"Bu modül, kayıt oluşturma işleminizi ana satış akışınızla otomatikleştirmenize ve bağlamanıza ve böylece kayıtların faturalama özelliğini etkinleştirmenize olanak tanır.\n"
+"Size, kendisiyle ilişkili bir etkinlik kategorisi seçme olanağını sunan yeni bir tür hizmet ürünü tanımlar.\n"
+"Bu ürün için bir satış siparişini kodladığınızda, o kategorinin mevcut bir etkinliğini seçebileceksiniz ve satış siparişinizi onayladığınızda bu etkinlik için otomatik olarak bir kayıt oluşturacaktır.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hr
@@ -1675,6 +2057,25 @@ msgid ""
" https://www.rrif.hr/dok/preuzimanje/rrif-rp2012.rar\n"
"\n"
msgstr ""
+"\n"
+"Hırvat yerelleştirmesi.\n"
+"Yazar: Goran Kliska, Slobodni programi d.o.o., Zagreb\n"
+" https://www.slobodni-programi.hr\n"
+"Katkıda Bulunanlar: Tomislav Bošnjaković, Storm\n"
+"Bilgisyarlar : tipovi konta Ivan Vađić, Slobodni programi: tipovi konta\n"
+"Tanım: \n"
+"Hırvat Hesap Bilgileri (RRIF ver.2012)\n"
+"\n"
+"RRIF-ov računski plan za poduzetnike za 2012.\n"
+"Vrste konta\n"
+"Kontni plan prema RRIF-u, dorađen u smislu kraćenja naziva i dodavanja analitika\n"
+"Porezne grupe prema poreznoj prijavi\n"
+"Porezi PDV obrasca\n"
+"Ostali porezi\n"
+"Osnovne fiskalne pozicije\n"
+"Izvori podataka:\n"
+" https://www.rrif.hr/dok/preuzimanje/rrif-rp2011.rar\n"
+" https://www.rrif.hr/dok/preuzimanje/rrif-rp2012.rar\n"
#. module: base
#: model:ir.module.module,description:base.module_website_sale_delivery
@@ -1694,6 +2095,8 @@ msgid ""
"Design gorgeous mails\n"
" "
msgstr ""
+"\n"
+"Harika mailler tasarlayın"
#. module: base
#: model:ir.module.module,description:base.module_l10n_de
@@ -1706,6 +2109,9 @@ msgid ""
"German accounting chart and localization.\n"
" "
msgstr ""
+"\n"
+"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03.\n"
+"Alman muhasebe bilgileri ve yerelleştirme."
#. module: base
#: model:ir.module.module,description:base.module_l10n_de_skr04
@@ -1717,6 +2123,9 @@ msgid ""
"German accounting chart and localization.\n"
" "
msgstr ""
+"\n"
+"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03.\n"
+"Alman muhasebe bilgileri ve yerelleştirme."
#. module: base
#: model:ir.module.module,description:base.module_website_twitter
@@ -1739,6 +2148,8 @@ msgid ""
"\n"
"Display orders to invoice in website dashboard.\n"
msgstr ""
+"\n"
+"Website panelinde faturalanacak siparişleri göster.\n"
#. module: base
#: model:ir.module.module,description:base.module_website_forum_doc
@@ -1747,6 +2158,8 @@ msgid ""
"Documentation based on question and pertinent answers of Forum\n"
" "
msgstr ""
+"\n"
+"Forumun sorularına ve ilgili cevaplarına dayalı dokümanlar"
#. module: base
#: model:ir.module.module,description:base.module_l10n_mx_edi
@@ -1759,6 +2172,10 @@ msgid ""
"This module allows the creation of the EDI documents and the communication with the Mexican certification providers (PACs) to sign/cancel them.\n"
" "
msgstr ""
+"\n"
+"EDI Meksika Yerelleştirmesi\n"
+"Meksika faturalaması için kullanıcıların EDI belgesi oluşturmasını sağlar.\n"
+"Bu modül EDI belgesi oluşturmayı ve Meksika sertifika sağlayıcısı (PACs) ile iletişim kurup imzala/iptal etmeyi sağlar."
#. module: base
#: model:ir.module.module,description:base.module_hw_escpos
@@ -1772,6 +2189,9 @@ msgid ""
"that would need such functionality.\n"
"\n"
msgstr ""
+"\n"
+"ESC/POS Donanım Sürücüsü\n"
+"Bu modül, Odoo'nun ESC / POS uyumlu yazıcılarla baskı yapmasına ve ESC / POS kontrollü nakit çekmecelerin satış noktasında ve bu tür işlevselliğe ihtiyaç duyabilecek diğer modüllerde açılmasına olanak tanır.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_eu_service
@@ -1825,6 +2245,26 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Telekomünikasyon, yayın ve elektronik hizmetler için AB Mini One Stop Shop (MOSS) KDV\n"
+"1 Ocak 2015'ten itibaren Avrupa Birliği dahilinde satılan telekomünikasyon, yayın ve elektronik hizmetlerin, müşterinin ait olduğu ülkede her zaman vergilendirilmesi gerekmektedir. Bu AB yönergesinin uygulanmasını basitleştirmek için, Mini One Stop Shop (MOSS) kayıt şeması, işletmelerin benzersiz bir vergi beyannamesi yapmasına izin verir.\n"
+"Bu modül, gerekli vergileri otomatik olarak uygulamak ve kaydetmek için gerekli AB mali pozisyonlarının ve vergilerinin oluşturulmasına yardımcı olarak mümkün kılmaktadır.\n"
+"Bu modül, AB içindeki elektronik hizmetleri satmak için mali pozisyonların ve vergilerin kurulumuna yardımcı olacak bir sihirbaz kurar.\n"
+"Sihirbaz şunları seçmenize izin verir.\n"
+"- Bu hizmetleri sattığınız AB ülkeleri\n"
+"- Hedef ülke vergisine eşlenecek hizmetler için ulusal KDV verginiz\n"
+"- İsteğe bağlı olarak: hesap eşlemesini kopyalamak için bir şablon mali konumu. Mevcut B2C Intra-EU mali durumunuz olmalı (varsayılan hesap eşleştirmesi yok)\n"
+"- isteğe bağlı olarak: vergi miktarlarını toplamak için kullanılacak bir hesap (hizmetlerin ulusal KDV vergisi tarafından kullanılan hesaba varsayılan)\n"
+"Seçilen ülkelerdeki bir müşteri ile AB satışları için otomatik olarak geçerli olan ilgili mali pozisyonları ve vergileri yaratır.\n"
+"\n"
+"Daha fazla ülke eklemek için sihirbaz tekrar çalıştırılabilir.\n"
+"\n"
+"Sihirbaz, MOSS bildiriminin KDV tutarlarını toplamak için ayrı bir Grafik Çizelgesi oluşturur, bu nedenle MOSS verilerini çıkarmak kolay olmalıdır.\n"
+"Vergi Raporu menüsünde \"AB MOSS KDV Çizelgesi\" adlı Vergi Tablosuna bakın (Genel Muhasebe Raporu)\n"
+"Referanslar\n"
+"++++++++++\n"
+"- 2008/8 / EC sayılı Direktif\n"
+"- 1042/2013 sayılı Konsey Uygulama Tüzüğü"
#. module: base
#: model:ir.module.module,description:base.module_utm
@@ -1834,6 +2274,8 @@ msgid ""
"=====================================================\n"
" "
msgstr ""
+"\n"
+"Paylaşılan linklerde UTM izleyicileri etkinleştir."
#. module: base
#: model:ir.module.module,description:base.module_auth_crypt
@@ -1865,6 +2307,15 @@ msgid ""
"necessarily have to be enabled).\n"
"\n"
msgstr ""
+"\n"
+"Kodlanmış Şifreler\n"
+"\n"
+"Güçlü bir şifreleme hash'i ile varsayılan şifre değiştirmeyi değiştirir.\n"
+"Şu anda kullanılan anahtar türetme işlevi RSA Security LLC'nin endüstri standardı olan ''PKDF2\" ile kombinasyon halinde ''SHA512'' 'tir. \n"
+"Bu birkaç binlerce tur ile tuzlama ve anahtar germe içerir.\n"
+"Şifrelenmiş parolaların geçmiş sürümleri, bir kullanıcının kimliği doğrulandığında otomatik olarak güncel şemasına yükseltilir (`` auth_crypt`` önceden daha zayıf `` md5crypt`` anahtar türetme işlevini kullanıyordu.\n"
+"Not: Bu modülün yüklenmesi kalıcı olarak kullanıcı şifresinin kurtarılmasını önler ve geri alınamaz. \n"
+"Bu nedenle, \"auth_signup\" modülü tarafından sağlananlar gibi kullanıcılar için bazı şifre sıfırlama mekanizmasının etkinleştirilmesi önerilir (yeni kullanıcılar için kaydolmanın mutlaka etkinleştirilmesi gerekmez).\n"
#. module: base
#: model:ir.module.module,description:base.module_base_address_extended
@@ -1879,6 +2330,10 @@ msgid ""
"with the street name, the house number, and room number.\n"
" "
msgstr ""
+"\n"
+"Genişletilmiş Adres Yönetimi\n"
+"Bu modül, doğru adresleri yönetmek için ihtiyaç duyabileceği tüm ekstra alanları içerir.\n"
+"Örneğin, yasal raporlarda, bazı ülkelerin caddeyi, sokak, bina numarası ve ev numarası gibi çeşitli alanlara ayırması gerekir."
#. module: base
#: model:ir.module.module,description:base.module_hw_blackbox_be
@@ -1894,6 +2349,11 @@ msgid ""
"Belgian cash register. It allows the communication on with a certified Fiscal\n"
"Data Module but will not modify the behaviour of the Point of Sale.\n"
msgstr ""
+"\n"
+"Mali Veri Modülü Donanım Sürücüsü\n"
+"Bu modül bir satış noktası müşterisinin bağlanmış bir Belçika Mali Veri Modülüne iletişim kurmasını sağlar.\n"
+"Bu modül ** bir Odoo Point Of Sale modülünü sertifikalı bir Belçika yazarkasa dönüştürmez.\n"
+"Onaylanmış Mali Veri Modülü ile iletişimi sağlar ve Satış Noktası'nın davranışını değiştirmez.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_fr_hr_payroll
@@ -1918,6 +2378,15 @@ msgid ""
" payslip interface, but not in the payslip report\n"
" "
msgstr ""
+"\n"
+"Fransız Ödeme Kuralları.\n"
+"- Fransız lokalizasyonu için hr_payroll yapılandırması\n"
+"- Fransız maaş bordrosu için tüm kadro katkıları 'kadro' ve 'kadro dışı'\n"
+"- Yeni ödeme raporu\n"
+"Yapılacaklar:\n"
+"- Kesinti ve ödenek için tatil modülü ile entegrasyon\n"
+"- Otomatik account_move_line için hr_payroll_account ile entegrasyon\n"
+"- Katkıyı entegre etmeye devam edin. Sadece ana katkı şuanda uygulanmaktadır."
#. module: base
#: model:ir.module.module,description:base.module_gamification
@@ -1934,6 +2403,13 @@ msgid ""
"\n"
"Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile.\n"
msgstr ""
+"\n"
+"Oyunlaştırma Süreci\n"
+"Oyunlaştırma modülü Odoo kullanıcılarını motive etmek ve değerlendirme için yollar sağlar.\n"
+"Kullanıcılar ulaştıkları amaçları ve görev sayıları ile değerlendirilebilir.\n"
+"** Hedefler **, bir takımın üyelerini birbirleriyle ve zaman içinde değerlendirmek ve karşılaştırmak için ** zorluklar ** üzerinden atanır.\n"
+"Sayısal olmayan başarılar için, kullanıcılara ** rozetler ** verilebilir. Basit bir \"teşekkür\" den olağanüstü bir başarıya kadar, bir rozet iyi bir iş için bir kullanıcıya minnettarlık etmenin kolay bir yoludur.\n"
+"Hem hedefler hem de rozetler esnek ve çok çeşitli modüller ve eylemlere uyarlanabilir. Yüklendiğinde, bu modül yeni kullanıcıların Odoo'yu keşfetmesine ve kullanıcı profilini yapılandırmasına yardımcı olmak için kolay hedefler oluşturur.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_uy
@@ -1945,6 +2421,9 @@ msgid ""
"Provide Templates for Chart of Accounts, Taxes for Uruguay.\n"
"\n"
msgstr ""
+"\n"
+"Genel Hesap Planı\n"
+"Uruguay Hesap Planı ve Vergileri için Şablon Sağlar, \n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_be_intrastat
@@ -1954,6 +2433,8 @@ msgid ""
"Based on invoices.\n"
" "
msgstr ""
+"\n"
+" Faturalara dayanarak, bildiri için Intrastat XML raporu oluşturur."
#. module: base
#: model:ir.module.module,description:base.module_hr_payroll_account
@@ -1967,6 +2448,11 @@ msgid ""
" * Company Contribution Management\n"
" "
msgstr ""
+"\n"
+"Muhasebe ile Bütünleştirilmiş Genel Bordro sistemi.\n"
+"* Gider Kodlaması\n"
+"* Ödeme Kodlaması\n"
+"* Şirket Katkı Yönetimi"
#. module: base
#: model:ir.module.module,description:base.module_mail_push
@@ -1980,6 +2466,10 @@ msgid ""
"**Configure your API keys from General Setting**\n"
" "
msgstr ""
+"\n"
+"Google Firebase Messaging Entegrasyonu\n"
+"Bu modül, sohbet sırasında her mesaj için kayıtlı cep telefonlarına FCM push bildirimi göndermeyi sağlar.\n"
+"Genel ayarlardan API keylerini yapılandırın."
#. module: base
#: model:ir.module.module,description:base.module_hw_proxy
@@ -1994,6 +2484,10 @@ msgid ""
"are found in other modules that must be installed separately. \n"
"\n"
msgstr ""
+"\n"
+"Donanım Proxy'si\n"
+"Bu modül, bu sunucuya bağlı çevre birimlerini uzaktan kullanmanıza izin verir.\n"
+"Bu modüller sadece etkin çerçeveyi içerir. Gerçek aygıt sürücüleri, ayrı olarak yüklenmesi gereken diğer modüllerde bulunur.\n"
#. module: base
#: model:ir.module.module,description:base.module_helpdesk
@@ -2017,6 +2511,19 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Yardım Masası- Talep Yönetimi Uygulaması\n"
+"Özellikler: \n"
+"- Talebi farklı aşamalardan çözerek işleyin.\n"
+"- Talebinizi tanımlamak öncelik, tür, açıklama ve etiket ekleyin.\n"
+"- Ek bilgi için iletişime geçmek ve iş arkadaşlarınıza talep üstünden ping atmak için sohbeti kullanın.\n"
+"- Uyarlanmış bir kontrol panelinin kullanımının ve biletlerinizi işlemek için kullanımı kolay bir kanban görünümünün keyfini çıkarın.\n"
+"- Raporlar menusunden pivot görünümünü kullanarak talebiniz için detaylı analiz yapın \n"
+"- Bir takım oluşturun ve üyelerini tanıtın, eğer dilerseniz otomatik atama yöntemini kullanın.\n"
+"- Biletleri otomatik olarak oluşturmak ve müşterilerinizle iletişim kurmak için bir posta takma adı kullanın.\n"
+"- Servis Seviyesi Sözleşmesi son tarihlerini otomatik olarak talebinize ekleyin.\n"
+"- Değerlendirme puanlarını kullanarak müşteri geri bildirimini elde edin\n"
+"- Takımınızın form görüntüsünü kolayca kullanarak ek özellikler yükleyin."
#. module: base
#: model:ir.module.module,description:base.module_base_import_module
@@ -2028,6 +2535,9 @@ msgid ""
"This module allows authorized users to import a custom data module (.xml files and static assests)\n"
"for customization purpose.\n"
msgstr ""
+"\n"
+"Özel bir veri modülünü içe aktarın\n"
+"Bu modül yetkili kullanıcıların, özelleştirme amacı için özel bir veri modülünü (.xml dosyaları ve duran varlıklar) içe aktarır.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cn_standard
@@ -2064,6 +2574,14 @@ msgid ""
"Sheet, now only Vertical format has been permitted Which is Supported By Odoo.\n"
" "
msgstr ""
+"\n"
+"Hindistan Muhasebesi: Hesap Detayları\n"
+"Hint hesap bilgileri ve yerelleştirmesi.\n"
+"\n"
+"Odoo Hesapların İki Biçimini sunarak Hindistan Muhasebesini yönetmeye izin verir, yani Hesapların Hint Grafiği - Hesapların Standart ve Hint Çizelgesi - Çizelge VI.\n"
+"\n"
+"Not: Çizelge VI, MCA tarafından revize edilmiştir ve 31 Mart 2011'den sonra yapılan tüm Bilanço için geçerlidir.\n"
+"Format, önceki iki Bilanço formatı seçeneği ile ortadan kalktı, artık sadece Odoo tarafından Desteklenen Dikey formatına izin verildi."
#. module: base
#: model:ir.module.module,description:base.module_l10n_in_schedule6
@@ -2081,6 +2599,12 @@ msgid ""
"Sheet, now only Vertical format has been permitted Which is Supported By OpenERP.\n"
" "
msgstr ""
+"\n"
+"Hindistan Muhasebesi: Hesap Planı\n"
+"Hint hesap planı ve yerelleştirmesi.\n"
+"\n"
+"Not: Çizelge VI, MCA tarafından revize edilmiştir ve 31 Mart 2011'den sonra yapılan tüm Bilanço için geçerlidir.\n"
+"Format, önceki iki Bilanço formatı seçeneği ile ortadan kalktı, artık sadece Open ERP tarafından Desteklenen Dikey formatına izin verildi."
#. module: base
#: model:ir.module.module,description:base.module_l10n_in_hr_payroll
@@ -2102,6 +2626,20 @@ msgid ""
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
msgstr ""
+"\n"
+"Hindistan Maaş Bordrosu Kuralları\n"
+"\n"
+"- Hint yerelleştirmesi için hr_payroll yapılandırması\n"
+"- Hindistan maaş bordrosu için tüm ana katkılar.\n"
+"* Yeni bordro raporları\n"
+"* Personel sözleşmeleri\n"
+"* Temel / Brüt / Net Maaşı yapılandırmaya izin verir\n"
+"* Personel Bordrosu\n"
+"* Ödenek/Kesinti\n"
+"* İzin yönetimi ile entegre\n"
+"* Medikal izinler, seyehat izinleri, çocuk izinleri,..\n"
+"* Bordro öneri ve raporu\n"
+"* Çalışan Raporuna Göre Yıllık Maaş "
#. module: base
#: model:ir.module.module,description:base.module_mail_github
@@ -2113,6 +2651,10 @@ msgid ""
"This Module integrates all post commits, pull requests and activity of github issue to channels in Odoo.\n"
" "
msgstr ""
+"\n"
+"Github'u Odoo Tartışmasına Entegre Edin.\n"
+"\n"
+"Bu Modül, tüm gönderiyi entegre eder, ve istekleri Odoo'daki kanallara çeker."
#. module: base
#: model:ir.module.module,description:base.module_google_drive
@@ -2124,6 +2666,9 @@ msgid ""
"This module allows you to integrate google documents to any of your Odoo record quickly and easily using OAuth 2.0 for Installed Applications,\n"
"You can configure your google Authorization Code from Settings > Configuration > General Settings by clicking on \"Generate Google Authorization Code\"\n"
msgstr ""
+"\n"
+"Odoo kayıtlarına Google dokümanlarını entegre edin.\n"
+"Bu modül, Google Dokümanlarını Odoo kaydınızın herhangi birisine, Yüklü Uygulamalar için OAuth 2.0'ı kullanarak hızlı ve kolay bir şekilde entegre etmenizi sağlar. Google Yetkilendirme Kodunuzu \"Google Yetkilendirme Kodu Oluştur\" a tıklayarak Ayarlar> Yapılandırma> Genel Ayarlar'dan yapılandırabilirsiniz.\n"
#. module: base
#: model:ir.module.module,description:base.module_account_invoicing
@@ -2136,6 +2681,11 @@ msgid ""
"You could use this simplified accounting in case you work with an (external) account to keep your books, and you still want to keep track of payments. This module also offers you an easy method of registering payments, without having to encode complete abstracts of account.\n"
" "
msgstr ""
+"\n"
+"Faturalama & Ödemeler\n"
+"Odoo'daki özel ve kullanımı kolay Faturalama sistemi, muhasebeciniz olmasa bile, muhasebenizi takip etmenizi sağlar. Satıcılarınızı ve müşterilerinizi takip etmenin kolay bir yolunu sunar.\n"
+"\n"
+"Defterlerinizi saklamak için bir (harici) hesapla çalışmanız ve hala ödemelerinizi takip etmek istiyorsanız, bu basitleştirilmiş muhasebe yöntemini kullanabilirsiniz. Bu modül aynı zamanda, tüm hesap özetlerini kodlamak zorunda kalmadan ödemeleri kaydetmenin kolay bir yöntemini sunar."
#. module: base
#: model:ir.module.module,description:base.module_stock_landed_costs
@@ -2146,6 +2696,10 @@ msgid ""
"This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.\n"
" "
msgstr ""
+"\n"
+"Maliyet Yüklemeleri Yönetimi\n"
+"\n"
+"Bu modül, toplamalarda ekstra maliyetler eklemenize ve stok değerlemelerinizde hesaba katılabilmeleri için bu maliyetlerin stok hamleleri arasında bölünmesine karar vermenize olanak tanır."
#. module: base
#: model:ir.module.module,description:base.module_website_crm_score
@@ -2160,6 +2714,13 @@ msgid ""
" - Assign lead to salesteams: define your own filters and sort automatically your leads by saleteam.\n"
" - Assign lead to salesmen: define filter by saleman and dispatch automatically your leads to the right saleman.\n"
msgstr ""
+"\n"
+"Lider Puanlaması\n"
+"\n"
+"Bu modül size şunlar için izin verir..\n"
+"- Web sitenizde belirli sayfa görüntülemelerini izlemenize\n"
+"- Müşteri adayınıza skor atama: Müşteri adayınızı otomatik olarak sıralayın ve ilk önce daha önemli olanı düşünün\n"
+"- Müşteri adaylarınızı satış personellerine atayın: satış personeli filtresini tanımlayın ve müşteri adaylarınızı otomatik olarak doğru satış personeline gönderin.\n"
#. module: base
#: model:ir.module.module,description:base.module_crm_project
@@ -2171,6 +2732,10 @@ msgid ""
"Link module to map leads to tasks\n"
" "
msgstr ""
+"\n"
+"Görevlere Liderlik Yap\n"
+"\n"
+"Bağlantı modülü haritaya götürür"
#. module: base
#: model:ir.module.module,description:base.module_board
@@ -2203,6 +2768,10 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+"Canlı Sohbet Desteği\n"
+"Mevcut sunucuyla iletişim kuracak ve çeşitli canlı sohbet operatörleri arasında ziyaretçi isteği gönderecek herhangi bir web sayfasında anlık mesajlaşma widget'ları bırakılmasına izin verin.\n"
+"Müşterilerinize bu konuşmalarla yardımcı olun ve onları geri bildirimlerini analiz edin."
#. module: base
#: model:ir.module.module,description:base.module_mrp_maintenance
@@ -2216,6 +2785,14 @@ msgid ""
"* Equipments related to workcenters\n"
"* MTBF, MTTR, ...\n"
msgstr ""
+"\n"
+"MRP içinde Bakım\n"
+"\n"
+"* Engelleyici ve düzeltici bakım\n"
+"* Bakım ihtiyacınızın farklı aşamalarını tanımlayın\n"
+"* Bakım ihtiyacınızı planlayın (tekrarlayan önleyici)\n"
+"* İşyeri ekipmanları\n"
+"* MTBF, MTTR,..\n"
#. module: base
#: model:ir.module.module,description:base.module_account_3way_match
@@ -2242,6 +2819,21 @@ msgid ""
" - Exception (Received and invoiced quantities differ)\n"
" "
msgstr ""
+"\n"
+"Tedarikçi faturalarında 3 yönlü eşleştirmeyi yönetin.\n"
+"\n"
+"\n"
+"İmalat sanayinde, insanlar genellikle satın almadan önce satıcı faturalarını alırlar, ancak mallar teslim edilene kadar faturayı ödemek istemezler.\n"
+"\n"
+"Bu durumun çözümü, satıcı faturanızı (sipariş edilen miktarlara göre) ürünü aldığınız zaman oluşturmaktır, ancak sadece alınan miktarlar (satın alma sipariş satırlarında) kayıtlı satıcı faturasıyla eşleştiğinde faturayı ödemeniz gerekir.\n"
+"\n"
+"Bu modül, her bir satıcı faturasının ödenip ödenmeyeceğini belirten bir \"ödeme serbestliği\" mekanizmasını sunar.\n"
+"\n"
+"Her satıcı faturası aşağıdaki üç durumdan birini alır:\n"
+"\n"
+" - Evet (Fatura ödenebilir)\n"
+" - Hayır (Fatura ödenemez, henüz bir şey teslim edilmedi)\n"
+" - İstisna (Alınan ve faturalanan miktarlar farklı)"
#. module: base
#: model:ir.module.module,description:base.module_stock_dropshipping
@@ -2260,6 +2852,11 @@ msgid ""
"internal transfer document is needed.\n"
"\n"
msgstr ""
+"\n"
+"Transit satış siparişlerini yönetin\n"
+"\n"
+"Bu modül, Transit satış ürünlerinin ve siparişlerinin yapılandırılmasına izin veren bir tedarik güzergahının yanı sıra önceden yapılandırılmış bir transit satış işletim türünü de ekler.\n"
+"Transit satış kullanıldığında, mallar tedarikçilerden depoya gitmeden, doğrudan tedarikçiden müşterilere (doğrudan teslimat) aktarılır.\n"
#. module: base
#: model:ir.module.module,description:base.module_hr_expense
@@ -2282,6 +2879,19 @@ msgid ""
"This module also uses analytic accounting and is compatible with the invoice on timesheet module so that you are able to automatically re-invoice your customers' expenses if your work by project.\n"
" "
msgstr ""
+"\n"
+"Personel Giderlerini Yönetin\n"
+"\n"
+"Bu uygulama personellerinizin günlük giderlerinizi yönetmenize izin verir. Uygulama size personellerinizin ödeme notlarına erişimi hakkı ve size o notu onaylayıp, reddetme hakkı verir. Onaylamadan sonra, personel için bir fatura oluşturur.\n"
+"Personel kendi harcamalarını kodlayabilir ve doğrulama akışı yöneticinin onayından sonra otomatik olarak muhasebeleşir.\n"
+"\n"
+"Bu akış şu şekilde uygulanır:\n"
+"*Taslak gider\n"
+"* Personelden, yöneticisine gönderilir.\n"
+"* Yönetici tarafından kabul edilir.\n"
+"* Muhasebeci onayından sonra, muhasebe girişi yapılır.\n"
+"\n"
+"Bu modül ayrıca analitik muhasebeyi kullanır ve zaman çizelgesi modülü üzerindeki fatura ile uyumludur, böylece projenize göre işiniz varsa müşterilerinizin masraflarını otomatik olarak yeniden faturalandırabilirsiniz."
#. module: base
#: model:ir.module.module,description:base.module_hr_holidays
@@ -2340,6 +2950,34 @@ msgid ""
"* Monthly Turnover (Graph)\n"
" "
msgstr ""
+"\n"
+"Satış taleplerini ve siparişlerini yönetin\n"
+"\n"
+"Bu uygulama, tüm satış siparişlerini ve geçmişini takip ederek satış hedeflerinizi etkili ve verimli bir şekilde yönetmenizi sağlar.\n"
+"\n"
+"O, tüm satış iş akışı ile baş eder:\n"
+"\n"
+"Teklif -> Satış Siparişi -> Fatura\n"
+"\n"
+"Tercihler ( sadece Depo Yönetimi kurulu ise)\n"
+"\n"
+"Depo Yönetimini yüklediyseniz, takip eden tercihleri kullanabilirsiniz:\n"
+"\n"
+"* Sevkıyat: Tek seferde yada parçalı teslimat seçimi.\n"
+"* Faturalama: Faturalarınız nasıl ödeneceğini seçin.\n"
+"* Incoterm: Uluslararası Ticari şartlar\n"
+"\n"
+"Esnek faturalama yöntemleri seçebilirsiniz.\n"
+"\n"
+"Talep üzerine: Fatura, ihtiyacınız olduğunda, Satış Siparişlerinden oluşturulur.\n"
+"Teslimat Emrinde: Faturalar transferden oluşturulur (teslimat)\n"
+"Teslimat Öncesi: Bir taslak fatura oluşturulur ve teslimattan önce ödenmesi gerekir.\n"
+"\n"
+"Bu modülle birlikte satış siparişlerinizi ve fatura raporlarınızı, kategorilerle, ara toplamlarla ya da kırılımlarla özelleştirebilirsiniz.\n"
+"\n"
+"Satış yönetim paneli şunları içerecektir,\n"
+"* Taleplerim\n"
+"* Aylık Kayıplarım (Grafik)"
#. module: base
#: model:ir.module.module,description:base.module_sale_stock
@@ -2362,6 +3000,24 @@ msgid ""
"* *On Delivery Order*: Invoices are generated from picking (delivery)\n"
"* *Before Delivery*: A Draft invoice is created and must be paid before delivery\n"
msgstr ""
+"\n"
+"Satış taleplerini ve siparişlerini yönetin\n"
+"\n"
+"Bu modül satış ve depo yönetimi uygulamaları arasında bir bağlantı sağlar.\n"
+"\n"
+"Tercihler\n"
+"\n"
+"\n"
+"* Sevkıyat: Tek seferde yada parçalı teslimat seçimi.\n"
+"* Faturalama: Faturalarınız nasıl ödeneceğini seçin.\n"
+"* Incoterm: Uluslararası Ticari şartlar\n"
+"\n"
+"Esnek faturalama yöntemleri seçebilirsiniz.\n"
+"\n"
+"Talep üzerine: Fatura, ihtiyacınız olduğunda, Satış Siparişlerinden oluşturulur.\n"
+"Teslimat Emrinde: Faturalar transferden oluşturulur (teslimat)\n"
+"Teslimat Öncesi: Bir taslak fatura oluşturulur ve teslimattan önce ödenmesi gerekir.\n"
+"\n"
#. module: base
#: model:ir.module.module,description:base.module_mass_mailing_event
@@ -2373,6 +3029,10 @@ msgid ""
"Bridge module adding UX requirements to ease mass mailing of event attendees.\n"
" "
msgstr ""
+"\n"
+"Toplu mail etkinliği katılımcıları\n"
+"\n"
+"Etkinlik katılımcılarının toplu e-postalarını kolaylaştırmak için UX gereksinimlerini ekleyen köprü modülü."
#. module: base
#: model:ir.module.module,description:base.module_mass_mailing_event_track
@@ -2384,6 +3044,9 @@ msgid ""
"Bridge module adding UX requirements to ease mass mailing of event track speakers.\n"
" "
msgstr ""
+"\n"
+"Toplu mail etkinliği izleme konuşmacıları\n"
+"Olay izleme konuşmacılarının toplu postalanmasını kolaylaştırmak için UX gereksinimlerini ekleyen köprü modülü."
#. module: base
#: model:ir.module.module,description:base.module_mrp_mps
@@ -2403,6 +3066,16 @@ msgid ""
"safety stock, min/max to supply and to manually override the amount you will\n"
"procure.\n"
msgstr ""
+"\n"
+"Ana Üretim Çizelgesi\n"
+"\n"
+"Bazen yalnızca daha sonra oluşturulacak üretim siparişlerinin bileşenleri için satınalma siparişlerini oluşturmanız gerekir.\n"
+"Ya da sadece satış siparişlerini alacağınız üretim siparişleri için.\n"
+"Çözüm, satış tahminlerinizi tahmin etmek ve zaten bazı üretim siparişleri veya satın alma siparişleri oluşturacağınızı temel almaktır.\n"
+"\n"
+"Rapora eklemek istediğiniz ürünleri seçmeniz gerekiyor\n"
+"Rapor için dönem seçebilirsiniz: gün, hafta, ay,...\n"
+"Ayrıca, tedarik edilecek olan stok miktarını, min / max değerini tanımlamak ve tedarik edeceğiniz miktarı manuel olarak geçersiz kılmak da mümkündür.\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_mx
@@ -2427,6 +3100,21 @@ msgid ""
".. _SAT: http://www.sat.gob.mx/\n"
" "
msgstr ""
+"\n"
+"Meksika için en düşük muhasebe yapılandırması.\n"
+"\n"
+"Bu Hesap Planı, Odoo'nun muhasebe özelliğini kullanabilmesi için minimum bir tekliftir.\n"
+"\n"
+"Bu, MX için tüm yerelleştirme gibi görünmüyor. Meksika'daki yerelleştirmede 0'dan başlamak için gereken en az veri.\n"
+"\n"
+"Bu modüller ve içeriği openerp-mexico ekibi tarafından sık sık güncellenmektedir.\n"
+"\n"
+"Bu modülle şunlara sahip olacaksınız:\n"
+"\n"
+"- Üretim ortamlarında test edilen minimum hesap çizelgesi.\n"
+"- SAT_ gereksinimlerine uymak için en az vergi grafiği.\n"
+"\n"
+".. _SAT: http://www.sat.gob.mx/"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@@ -2441,6 +3129,12 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
+"\n"
+"Analitik muhasebe nesnesini tanımlamak için modül.\n"
+"\n"
+"Odoo'da, analitik hesaplar genel hesaplarla ilişkilendirilir, ancak tamamen bağımsız olarak ele alınır.\n"
+"\n"
+"Böylece, genel finansal hesaplarda muadili olmayan farklı analitik işlemler girebilirsiniz."
#. module: base
#: model:ir.module.module,description:base.module_resource
@@ -2454,6 +3148,10 @@ msgid ""
"associated to every resource. It also manages the leaves of every resource.\n"
" "
msgstr ""
+"\n"
+"Kaynak Yönetimi Yönetimi\n"
+"\n"
+"Bir kaynak planlanabilen bir şeyi temsil eder (bir siparişte geliştirici veya imalat siparişleri üzerinde bir iş merkezi). Bu modül, her kaynağa bağlı bir kaynak takvimi yönetir.Ayrıca her kaynağın izinlerini yönetir."
#. module: base
#: model:ir.module.module,description:base.module_website_mail
@@ -2462,6 +3160,9 @@ msgid ""
"Module holding mail improvements for website.\n"
"It is responsible of comments moderation for published documents (forum, slides, blog, ...)\n"
msgstr ""
+"\n"
+"Websitesi için mail geliştirmelerini tutan modül.\n"
+"Yayınlanmış dokümanlar için yorumların moderatörlüğünden sorumludur (forum, slaytlar, blog, ...)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_reports_followup
@@ -2493,6 +3194,10 @@ msgid ""
"Improve the import of bank statement feature to support the SEPA recommanded Cash Management format (CAMT.053).\n"
" "
msgstr ""
+"\n"
+"Module to import CAMT bank statements.\n"
+"\n"
+"SEPA tarafından önerilen Nakit Yönetimi formatını (CAMT.053) desteklemek için banka ekstresi özelliğini içe aktarın."
#. module: base
#: model:ir.module.module,description:base.module_l10n_be_coda
@@ -5965,7 +6670,7 @@ msgstr "Uygulamalar:"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_ui_view__arch_db
msgid "Arch Blob"
-msgstr ""
+msgstr "Damlayı kavislendir"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_ui_view__arch_fs
@@ -9169,7 +9874,7 @@ msgstr ""
#. module: base
#: model:res.country.group,name:base.europe
msgid "Europe"
-msgstr ""
+msgstr "Avrupa"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_server_object_lines__type
@@ -10954,6 +11659,8 @@ msgid ""
"If this field is empty, the view applies to all users. Otherwise, the view "
"applies to the users of those groups only."
msgstr ""
+"Bu alan boşsa, görünüm tüm kullanıcılara uygulanır. Değilse, görünüm sadece "
+"grup kullanıcılarına uygulanır."
#. module: base
#: model:ir.model.fields,help:base.field_ir_ui_view__active
@@ -10963,6 +11670,9 @@ msgid ""
"* if False, the view currently does not extend its parent but can be enabled\n"
" "
msgstr ""
+"Eğer bu görünüm kaldıysa,\n"
+"* Eğer doğruysa, görünüm her zaman üst öğeyi genişletir\n"
+"*Yanlış ise, görünüm şu anda üst öğeyi genişletmez ancak etkinleştirilebilir"
#. module: base
#: model:ir.ui.view,arch_db:base.view_rule_form
@@ -15878,7 +16588,7 @@ msgstr ""
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_actions_report__print_report_name
msgid "Printed Report Name"
-msgstr ""
+msgstr "Basılan Rapor Adı"
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_cron__priority
@@ -16797,7 +17507,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_subscription_dashboard
msgid "Sale Subscription Dashboard"
-msgstr ""
+msgstr "Satış Abonelik Paneli"
#. module: base
#: model:ir.module.category,name:base.module_category_sales
@@ -17360,7 +18070,7 @@ msgstr "Sierra Leone"
#. module: base
#: model:ir.module.module,shortdesc:base.module_website_sign
msgid "Sign"
-msgstr ""
+msgstr "İmzala"
#. module: base
#: model:ir.model.fields,field_description:base.field_res_users__signature
@@ -19068,7 +19778,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_website_delivery_ups
msgid "UPS Bill My Account"
-msgstr ""
+msgstr "UPS Fatura Hesabım"
#. module: base
#: model:ir.module.module,shortdesc:base.module_delivery_ups
@@ -19779,7 +20489,7 @@ msgstr ""
#. module: base
#: model:ir.model.fields,field_description:base.field_ir_ui_view__inherit_children_ids
msgid "Views which inherit from this one"
-msgstr ""
+msgstr "Birisinden kalan görünümler."
#. module: base
#: model:res.country,name:base.vg
@@ -20704,7 +21414,7 @@ msgstr "ir.actions.client"
#: model:ir.model,name:base.model_ir_actions_report
#: selection:ir.ui.menu,action:0
msgid "ir.actions.report"
-msgstr ""
+msgstr "ir.actions.report"
#. module: base
#: model:ir.model,name:base.model_ir_actions_server
diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py
index e2c38035ab1..258b0e98c38 100644
--- a/odoo/addons/base/models/ir_actions.py
+++ b/odoo/addons/base/models/ir_actions.py
@@ -34,6 +34,7 @@ class IrActions(models.Model):
binding_model_id = fields.Many2one('ir.model', ondelete='cascade',
help="Setting a value makes this action available in the sidebar for the given model.")
binding_type = fields.Selection([('action', 'Action'),
+ ('action_form_only', "Form-only"),
('report', 'Report')],
required=True, default='action')
diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py
index 3727d5aa512..501eef2ed90 100644
--- a/odoo/addons/base/models/ir_qweb_fields.py
+++ b/odoo/addons/base/models/ir_qweb_fields.py
@@ -357,8 +357,9 @@ class FloatTimeConverter(models.AbstractModel):
@api.model
def value_to_html(self, value, options):
- hours, minutes = divmod(value * 60, 60)
- return '%02d:%02d' % (hours, minutes)
+ factor = -1 if value < 0 else 1
+ hours, minutes = divmod(abs(value) * 60, 60)
+ return '%02d:%02d' % (hours * factor, minutes)
class DurationConverter(models.AbstractModel):
diff --git a/odoo/addons/base/models/res_currency.py b/odoo/addons/base/models/res_currency.py
index 24e30fd4200..4e36221f1ef 100644
--- a/odoo/addons/base/models/res_currency.py
+++ b/odoo/addons/base/models/res_currency.py
@@ -58,6 +58,7 @@ class Currency(models.Model):
return currency_rates
@api.multi
+ @api.depends('rate_ids.rate')
def _compute_current_rate(self):
date = self._context.get('date') or fields.Date.today()
company = self._context.get('company_id') or self.env['res.users']._get_company()
diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py
index b1fc2998f4d..90650522cfb 100644
--- a/odoo/addons/base/models/res_partner.py
+++ b/odoo/addons/base/models/res_partner.py
@@ -179,7 +179,8 @@ class Partner(models.Model):
('invoice', 'Invoice address'),
('delivery', 'Shipping address'),
('other', 'Other address'),
- ("private", "Private Address")], string='Address Type',
+ ("private", "Private Address"),
+ ], string='Address Type',
default='contact',
help="Used to select automatically the right address according to the context in sales and purchases documents.")
street = fields.Char()
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index 9d31cf72bf8..92c2b9351b9 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -15,6 +15,7 @@ import passlib.context
from odoo import api, fields, models, tools, SUPERUSER_ID, _
from odoo.exceptions import AccessDenied, AccessError, UserError, ValidationError
+from odoo.http import request
from odoo.osv import expression
from odoo.service.db import check_super
from odoo.tools import partition, pycompat
@@ -537,8 +538,12 @@ class Users(models.Model):
user.sudo(user_id).check_credentials(password)
user.sudo(user_id)._update_last_login()
except AccessDenied:
- _logger.info("Login failed for db:%s login:%s", db, login)
user_id = False
+
+ status = "successful" if user_id else "failed"
+ ip = request.httprequest.environ['REMOTE_ADDR'] if request else 'n/a'
+ _logger.info("Login %s for db:%s login:%s from %s", status, db, login, ip)
+
return user_id
@classmethod
diff --git a/odoo/addons/base/security/base_security.xml b/odoo/addons/base/security/base_security.xml
index 4eeac276f83..9852bb1f6fe 100644
--- a/odoo/addons/base/security/base_security.xml
+++ b/odoo/addons/base/security/base_security.xml
@@ -1,5 +1,9 @@
<?xml version="1.0"?>
<odoo>
+ <record id="group_private_addresses" model="res.groups">
+ <field name="name">Access to Private Addresses</field>
+ </record>
+
<data noupdate="1">
<record model="ir.rule" id="res_users_log_rule">
<field name="name">res.users.log per user</field>
@@ -100,6 +104,37 @@
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>
+ <!-- Security restriction for private addresses -->
+ <record id="res_partner_rule_private_employee" model="ir.rule">
+ <field name="name">res.partner.rule.private.employee</field>
+ <field name="model_id" ref="base.model_res_partner"/>
+ <field name="domain_force">
+ [('type', '!=', 'private')]
+ </field>
+ <field name="groups" eval="[
+ (4, ref('base.group_user')),
+ ]"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_unlink" eval="False"/>
+ </record>
+ <!-- Relex previous rule for group_private_addresses -->
+ <record id="res_partner_rule_private_group" model="ir.rule">
+ <field name="name">res.partner.rule.private.group</field>
+ <field name="model_id" ref="base.model_res_partner"/>
+ <field name="domain_force">
+ [('type', '=', 'private')]
+ </field>
+ <field name="groups" eval="[
+ (4, ref('base.group_private_addresses'))
+ ]"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_unlink" eval="False"/>
+ </record>
+
<!-- Restrict modifications on ir.filters to owner only -->
<record id="ir_filters_admin_all_rights_rule" model="ir.rule">
<field name="name">ir.filters.admin.all.rights</field>
diff --git a/odoo/addons/base/tests/test_mail.py b/odoo/addons/base/tests/test_mail.py
index c0f437be385..5693906c092 100644
--- a/odoo/addons/base/tests/test_mail.py
+++ b/odoo/addons/base/tests/test_mail.py
@@ -116,7 +116,7 @@ class TestSanitizer(unittest.TestCase):
test_data = [
(
'<span style="position: fixed; top: 0px; left: 50px; width: 40%; height: 50%; background-color: red;">Coin coin </span>',
- ['background-color: red', 'Coin coin'],
+ ['background-color:red', 'Coin coin'],
['position', 'top', 'left']
), (
"""<div style='before: "Email Address; coincoin cheval: lapin";
@@ -124,7 +124,7 @@ class TestSanitizer(unittest.TestCase):
this; means: anything ?#ùµ"
; some-property: 2px; top: 3'>youplaboum</div>""",
- ['font-size: 30px', 'youplaboum'],
+ ['font-size:30px', 'youplaboum'],
['some-property', 'top', 'cheval']
), (
'<span style="width">Coincoin</span>',
diff --git a/odoo/addons/base/tests/test_mail_examples.py b/odoo/addons/base/tests/test_mail_examples.py
index 4f3b5b48300..032d321ff06 100644
--- a/odoo/addons/base/tests/test_mail_examples.py
+++ b/odoo/addons/base/tests/test_mail_examples.py
@@ -510,7 +510,7 @@ REMOVE_CLASS = u"""
</div>
"""
REMOVE_CLASS_IN = [
- u'<div style="font-size: 12pt; font-family: \'Times New Roman\'; color: #000000">',
+ u'<div style="font-size:12pt; font-family:\'Times New Roman\'; color:#000000">',
u'An error occured in a modal and I will send you back the html to try opening one on your end']
REMOVE_CLASS_OUT = [
u'<div class="modal-backdrop in">',
diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml
index ed7dc49bff5..ebf1f72479f 100644
--- a/odoo/addons/base/views/res_users_views.xml
+++ b/odoo/addons/base/views/res_users_views.xml
@@ -283,7 +283,7 @@
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div class="o_kanban_image">
- <img t-att-src="kanban_image('res.users', 'image_medium', record.id.value)"/>
+ <img t-att-src="kanban_image('res.users', 'image_medium', record.id.raw_value)"/>
</div>
<div class="oe_kanban_details">
<ul>
diff --git a/odoo/addons/base/wizard/base_partner_merge.py b/odoo/addons/base/wizard/base_partner_merge.py
index 755e0d3e99a..b987e469c5d 100644
--- a/odoo/addons/base/wizard/base_partner_merge.py
+++ b/odoo/addons/base/wizard/base_partner_merge.py
@@ -223,7 +223,7 @@ class MergePartnerAutomatic(models.TransientModel):
"""
_logger.debug('_update_values for dst_partner: %s for src_partners: %r', dst_partner.id, src_partners.ids)
- model_fields = dst_partner._fields
+ model_fields = dst_partner.fields_get().keys()
def write_serializer(item):
if isinstance(item, models.BaseModel):
@@ -232,7 +232,8 @@ class MergePartnerAutomatic(models.TransientModel):
return item
# get all fields that are not computed or x2many
values = dict()
- for column, field in model_fields.items():
+ for column in model_fields:
+ field = dst_partner._fields[column]
if field.type not in ('many2many', 'one2many') and field.compute is None:
for item in itertools.chain(src_partners, [dst_partner]):
if item[column]:
diff --git a/odoo/api.py b/odoo/api.py
index 3f55669023e..d1b1872e7f5 100644
--- a/odoo/api.py
+++ b/odoo/api.py
@@ -1014,6 +1014,14 @@ class Cache(object):
]
return model.browse(ids)
+ def get_missing_ids(self, records, field):
+ """ Return the ids of ``records`` that have no value for ``field``. """
+ key = field.cache_key(records)
+ field_cache = self._data[field]
+ for record_id in records._ids:
+ if key not in field_cache.get(record_id, ()):
+ yield record_id
+
def copy(self, records, env):
""" Copy the cache of ``records`` to ``env``. """
src = records
diff --git a/odoo/fields.py b/odoo/fields.py
index db975603979..3f7b734796d 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -1828,6 +1828,8 @@ class Selection(Field):
def convert_to_cache(self, value, record, validate=True):
if not validate:
return value or False
+ if value and self.column_type[0] == 'int4':
+ value = int(value)
if value in self.get_values(record.env):
return value
elif not value:
diff --git a/odoo/http.py b/odoo/http.py
index b1ebb9affd4..c66962d16d6 100644
--- a/odoo/http.py
+++ b/odoo/http.py
@@ -166,7 +166,7 @@ def redirect_with_hash(url, code=303):
# FIXME: decide whether urls should be bytes or text, apparently
# addons/website/controllers/main.py:91 calls this with a bytes url
# but addons/web/controllers/main.py:481 uses text... (blows up on login)
- url = pycompat.to_text(url)
+ url = pycompat.to_text(url).strip()
if urls.url_parse(url, scheme='http').scheme not in ('http', 'https'):
url = u'http://' + url
url = url.replace("'", "%27").replace("<", "%3C")
diff --git a/odoo/models.py b/odoo/models.py
index 05c1d30c2f7..dff80d21463 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -1401,6 +1401,9 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
resaction = [action
for action in bindings['action']
if view_type == 'tree' or not action.get('multi')]
+ resrelate = []
+ if view_type == 'form':
+ resrelate = bindings['action_form_only']
for res in itertools.chain(resreport, resaction):
res['string'] = res['name']
@@ -1408,6 +1411,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
result['toolbar'] = {
'print': resreport,
'action': resaction,
+ 'relate': resrelate,
}
return result
@@ -4748,12 +4752,16 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
(:class:`Field` instance), including ``self``.
Return at most ``limit`` records.
"""
- ids0 = self._prefetch[self._name]
- ids1 = set(self.env.cache.get_records(self, field)._ids)
- recs = self.browse([it for it in ids0 if it and it not in ids1])
- if limit and len(recs) > limit:
- recs = self + (recs - self)[:(limit - len(self))]
- return recs
+ recs = self.browse(self._prefetch[self._name])
+ ids = [self.id]
+ for record_id in self.env.cache.get_missing_ids(recs - self, field):
+ if not record_id:
+ # Do not prefetch `NewId`
+ continue
+ ids.append(record_id)
+ if limit and limit <= len(ids):
+ break
+ return self.browse(ids)
@api.model
def refresh(self):
diff --git a/odoo/netsvc.py b/odoo/netsvc.py
index 7772d7d47cd..c8d9dbb6441 100644
--- a/odoo/netsvc.py
+++ b/odoo/netsvc.py
@@ -119,6 +119,13 @@ def init_logger():
if dirname and not os.path.isdir(dirname):
os.makedirs(dirname)
if tools.config['logrotate'] is not False:
+ if tools.config['workers'] > 1:
+ # TODO: fallback to regular file logging in master for safe(r) defaults?
+ #
+ # Doing so here would be a good idea but also might break
+ # situations were people do log-shipping of rotated data?
+ _logger.warn("WARNING: built-in log rotation is not reliable in multi-worker scenarios and may incur significant data loss. "
+ "It is strongly recommended to use an external log rotation utility or use system loggers (--syslog) instead.")
handler = logging.handlers.TimedRotatingFileHandler(filename=logf, when='D', interval=1, backupCount=30)
elif os.name == 'posix':
handler = logging.handlers.WatchedFileHandler(logf)
diff --git a/odoo/service/server.py b/odoo/service/server.py
index e64aafe4440..d246a3d80f1 100644
--- a/odoo/service/server.py
+++ b/odoo/service/server.py
@@ -205,6 +205,9 @@ class ThreadedServer(CommonServer):
os._exit(0)
# interrupt run() to start shutdown
raise KeyboardInterrupt()
+ elif sig == signal.SIGXCPU:
+ sys.stderr.write("CPU time limit exceeded! Shutting down immediately\n")
+ os._exit(0)
elif sig == signal.SIGHUP:
# restart on kill -HUP
odoo.phoenix = True
@@ -263,6 +266,7 @@ class ThreadedServer(CommonServer):
signal.signal(signal.SIGTERM, self.signal_handler)
signal.signal(signal.SIGCHLD, self.signal_handler)
signal.signal(signal.SIGHUP, self.signal_handler)
+ signal.signal(signal.SIGXCPU, self.signal_handler)
signal.signal(signal.SIGQUIT, dumpstacks)
signal.signal(signal.SIGUSR1, log_ormcache_stats)
elif os.name == 'nt':
@@ -370,7 +374,7 @@ class GeventServer(CommonServer):
signal.signal(signal.SIGQUIT, dumpstacks)
signal.signal(signal.SIGUSR1, log_ormcache_stats)
gevent.spawn(self.watchdog)
-
+
self.httpd = WSGIServer((self.interface, self.port), self.app)
_logger.info('Evented Service (longpolling) running on %s:%s', self.interface, self.port)
try:
diff --git a/odoo/tests/common.py b/odoo/tests/common.py
index cbfabf857d7..aabf179df53 100644
--- a/odoo/tests/common.py
+++ b/odoo/tests/common.py
@@ -211,16 +211,16 @@ class BaseCase(TreeCase, MetaCase('DummyCase', (object,), {})):
yield
count = self.cr.sql_log_count - count0
if count > (expected + margin):
- msg = "Too much query count: user %s: got %d instead of %d (margin %s)"
- self.fail(msg % (login, count, expected, margin))
+ msg = "Query count beyond margin for user %s: %d > %d"
+ self.fail(msg % (login, count, expected + margin))
elif count > expected and count <= (expected + margin):
logger = logging.getLogger(type(self).__module__)
- msg = "Query count greater but still in margin : user %s: got %d instead of %d (margin %s)"
- logger.warn(msg, login, count, expected, margin)
+ msg = "Query count within margin for user %s: %d > %d (margin %s)"
+ logger.info(msg, login, count, expected, margin)
elif count < expected:
logger = logging.getLogger(type(self).__module__)
- msg = "Better query count: user %s: got %d instead of %d (margin %s)"
- logger.info(msg, login, count, expected, margin)
+ msg = "Query count less than expected for user %s: %d < %d"
+ logger.info(msg, login, count, expected)
else:
yield
diff --git a/odoo/tools/convert.py b/odoo/tools/convert.py
index 9a46a88f175..16dd569239f 100644
--- a/odoo/tools/convert.py
+++ b/odoo/tools/convert.py
@@ -426,11 +426,14 @@ form: module.record_id""" % (xml_id,)
if rec.get('target'):
res['target'] = rec.get('target','')
+ if rec.get('multi'):
+ res['multi'] = safe_eval(rec.get('multi', 'False'))
if src_model:
res['binding_model_id'] = self.env['ir.model']._get(src_model).id
res['binding_type'] = 'report' if rec.get('key2') == 'client_print_multi' else 'action'
- if rec.get('multi'):
- res['multi'] = safe_eval(rec.get('multi', 'False'))
+ if rec.get('key2') in (None, 'client_action_relate'):
+ if not res.get('multi'):
+ res['binding_type'] = 'action_form_only'
id = self.env['ir.model.data']._update('ir.actions.act_window', self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
self.idref[xml_id] = int(id)
diff --git a/odoo/tools/mail.py b/odoo/tools/mail.py
index 0b4608c62e3..d3291e648fb 100644
--- a/odoo/tools/mail.py
+++ b/odoo/tools/mail.py
@@ -10,7 +10,7 @@ import socket
import threading
import time
-from email.header import decode_header
+from email.header import decode_header, Header
from email.utils import getaddresses, formataddr
from lxml import etree
@@ -45,11 +45,12 @@ class _Cleaner(clean.Cleaner):
_style_whitelist = [
'font-size', 'font-family', 'font-weight', 'background-color', 'color', 'text-align',
'line-height', 'letter-spacing', 'text-transform', 'text-decoration',
+ 'float', 'vertical-align',
'padding', 'padding-top', 'padding-left', 'padding-bottom', 'padding-right',
- 'margin', 'margin-top', 'margin-left', 'margin-bottom', 'margin-right'
+ 'margin', 'margin-top', 'margin-left', 'margin-bottom', 'margin-right',
# box model
- 'border', 'border-color', 'border-radius', 'border-style', 'height',
- 'margin', 'padding', 'width', 'max-width', 'min-width',
+ 'border', 'border-color', 'border-radius', 'border-style', 'border-width',
+ 'height', 'margin', 'padding', 'width', 'max-width', 'min-width',
# tables
'border-collapse', 'border-spacing', 'caption-side', 'empty-cells', 'table-layout']
@@ -154,7 +155,7 @@ class _Cleaner(clean.Cleaner):
if style[0].lower() in self._style_whitelist:
valid_styles[style[0].lower()] = style[1]
if valid_styles:
- el.attrib['style'] = '; '.join('%s: %s' % (key, val) for (key, val) in valid_styles.items())
+ el.attrib['style'] = '; '.join('%s:%s' % (key, val) for (key, val) in valid_styles.items())
else:
del el.attrib['style']
@@ -520,11 +521,14 @@ def decode_smtp_header(smtp_header):
text. email.header decode_header method return a decoded string and its
charset for each decoded par of the header. This method unicodes the
decoded header and join them in a complete string. """
+ if isinstance(smtp_header, Header):
+ smtp_header = ustr(smtp_header)
if smtp_header:
text = decode_header(smtp_header.replace('\r', ''))
# The joining space will not be needed as of Python 3.3
- # See https://hg.python.org/cpython/rev/8c03fe231877
- return ' '.join([ustr(x[0], x[1]) for x in text])
+ # See https://github.com/python/cpython/commit/07ea53cb218812404cdbde820647ce6e4b2d0f8e
+ sep = ' ' if pycompat.PY2 else ''
+ return sep.join([ustr(x[0], x[1]) for x in text])
return u''
# was mail_thread.decode_header()
diff --git a/setup/package.py b/setup/package.py
index eeea18aabe1..dd15b84e224 100755
--- a/setup/package.py
+++ b/setup/package.py
@@ -181,7 +181,7 @@ class KVM(object):
self.login = login
def timeout(self,signum,frame):
- logging.warning("vm timeout kill",self.pid)
+ logging.warning("vm timeout kill (pid: {})".format(self.pid))
os.kill(self.pid,15)
def start(self):