From 389e7789c6076eac30851375ba016c718f66db9b Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 21 Feb 2022 12:19:40 +0100 Subject: [PATCH 01/19] [IMP] web: expose control panel component and context This commit exposes the ControlPanel component aswell as its context in order to make it easier to extend. TaskId-2675382 --- .../src/legacy/js/fields/relational_fields.js | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/legacy/js/fields/relational_fields.js b/addons/web/static/src/legacy/js/fields/relational_fields.js index fdbe1ea30d4..cf78f604c51 100644 --- a/addons/web/static/src/legacy/js/fields/relational_fields.js +++ b/addons/web/static/src/legacy/js/fields/relational_fields.js @@ -1173,10 +1173,10 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { const _super = this._super.bind(this); if (this.view) { this._renderButtons(); - this._controlPanelWrapper = new ComponentWrapper(this, ControlPanelX2Many, { - cp_content: { $buttons: this.$buttons }, - pager: this.pagingState, - }); + this._controlPanelWrapper = new ComponentWrapper(this, + this._getControlPanelComponent(), + this._getControlPanelContext(), + ); await this._controlPanelWrapper.mount(this.el, { position: 'first-child' }); } return _super(...arguments); @@ -1429,6 +1429,25 @@ var FieldX2Many = AbstractField.extend(WidgetAdapterMixin, { return KanbanRenderer; } }, + /** + * Provides a way to override the control panel component to be used. + * + * @private + * @returns {Component} The component to use. + */ + _getControlPanelComponent: function () { + return ControlPanelX2Many; + }, + /** + * @private + * @returns {Object} The context that will be passed to the control panel. + */ + _getControlPanelContext: function () { + return { + cp_content: { $buttons: this.$buttons }, + pager: this.pagingState, + }; + }, /** * @private * @returns {boolean} true iff the list should contain a 'create' line. From aa1c6f05c5e7d93fefb26dd634b1fc483fad7d9b Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 4 Apr 2022 16:36:06 +0200 Subject: [PATCH 02/19] [FIX] stock: fix null value for product tracking Due to the recent changes of precompute. The `tracking` fields of `product.template` would never be filled with the default 'none' when the module was not loaded. This means that any new product.product demo/data would fail the upgrade scripts. TaskId-2675382 --- addons/stock/models/product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index b86fa90d766..f2222e20714 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -638,7 +638,7 @@ class ProductTemplate(models.Model): ('serial', 'By Unique Serial Number'), ('lot', 'By Lots'), ('none', 'No Tracking')], - string="Tracking", required=True, + string="Tracking", required=True, default='none', # Not having a default value here causes issues when migrating. compute='_compute_tracking', store=True, readonly=False, precompute=True, help="Ensure the traceability of a storable product in your warehouse.") description_picking = fields.Text('Description on Picking', translate=True) From 56eaec5934565ee5f5544e1c5a764c2b3b02b8c8 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:02:36 +0100 Subject: [PATCH 03/19] [REM] coupon: remove coupon module Removes the coupon module as it is merged inside of `loyalty`. TaskId-2675382 --- addons/coupon/__init__.py | 6 - addons/coupon/__manifest__.py | 25 - addons/coupon/data/expire_coupon_cron.xml | 16 - addons/coupon/demo/coupon_demo.xml | 60 - addons/coupon/i18n/coupon.pot | 1096 ----------------- addons/coupon/models/__init__.py | 8 - addons/coupon/models/coupon.py | 117 -- addons/coupon/models/coupon_program.py | 175 --- addons/coupon/models/coupon_reward.py | 92 -- addons/coupon/models/coupon_rules.py | 38 - addons/coupon/models/mail_compose_message.py | 15 - addons/coupon/report/__init__.py | 4 - addons/coupon/report/coupon_report.py | 19 - addons/coupon/report/coupon_report.xml | 14 - .../coupon/report/coupon_report_templates.xml | 101 -- addons/coupon/security/coupon_security.xml | 8 - addons/coupon/security/ir.model.access.csv | 7 - addons/coupon/views/coupon_program_views.xml | 286 ----- addons/coupon/views/coupon_views.xml | 49 - addons/coupon/wizard/__init__.py | 4 - addons/coupon/wizard/coupon_generate.py | 48 - .../coupon/wizard/coupon_generate_views.xml | 39 - 22 files changed, 2227 deletions(-) delete mode 100644 addons/coupon/__init__.py delete mode 100644 addons/coupon/__manifest__.py delete mode 100644 addons/coupon/data/expire_coupon_cron.xml delete mode 100644 addons/coupon/demo/coupon_demo.xml delete mode 100644 addons/coupon/i18n/coupon.pot delete mode 100644 addons/coupon/models/__init__.py delete mode 100644 addons/coupon/models/coupon.py delete mode 100644 addons/coupon/models/coupon_program.py delete mode 100644 addons/coupon/models/coupon_reward.py delete mode 100644 addons/coupon/models/coupon_rules.py delete mode 100644 addons/coupon/models/mail_compose_message.py delete mode 100644 addons/coupon/report/__init__.py delete mode 100644 addons/coupon/report/coupon_report.py delete mode 100644 addons/coupon/report/coupon_report.xml delete mode 100644 addons/coupon/report/coupon_report_templates.xml delete mode 100644 addons/coupon/security/coupon_security.xml delete mode 100644 addons/coupon/security/ir.model.access.csv delete mode 100644 addons/coupon/views/coupon_program_views.xml delete mode 100644 addons/coupon/views/coupon_views.xml delete mode 100644 addons/coupon/wizard/__init__.py delete mode 100644 addons/coupon/wizard/coupon_generate.py delete mode 100644 addons/coupon/wizard/coupon_generate_views.xml diff --git a/addons/coupon/__init__.py b/addons/coupon/__init__.py deleted file mode 100644 index de3c67453a7..00000000000 --- a/addons/coupon/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import models -from . import report -from . import wizard diff --git a/addons/coupon/__manifest__.py b/addons/coupon/__manifest__.py deleted file mode 100644 index b4a6897f794..00000000000 --- a/addons/coupon/__manifest__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -{ - 'name': "Coupon", - 'summary': "Use discount coupons in different sales channels.", - 'description': """Integrate coupon mechanism in orders.""", - 'category': 'Sales', - 'version': '1.0', - 'depends': ['account'], - 'data': [ - 'wizard/coupon_generate_views.xml', - 'security/ir.model.access.csv', - 'security/coupon_security.xml', - 'views/coupon_views.xml', - 'views/coupon_program_views.xml', - 'report/coupon_report.xml', - 'report/coupon_report_templates.xml', - 'data/expire_coupon_cron.xml', - ], - 'demo': [ - 'demo/coupon_demo.xml', - ], - 'installable': True, - 'license': 'LGPL-3', -} diff --git a/addons/coupon/data/expire_coupon_cron.xml b/addons/coupon/data/expire_coupon_cron.xml deleted file mode 100644 index f72f93eb1ad..00000000000 --- a/addons/coupon/data/expire_coupon_cron.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Coupon: expire coupon based on date - - code - model.cron_expire_coupon() - - - 1 - days - -1 - - - diff --git a/addons/coupon/demo/coupon_demo.xml b/addons/coupon/demo/coupon_demo.xml deleted file mode 100644 index a31fc68c7be..00000000000 --- a/addons/coupon/demo/coupon_demo.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - 10.0% discount on total amount - service - - - - - 10PERCENTDISC - - - - - Code for 10% on orders - code_needed - 10pc - on_order - percentage - 10.0 - promotion_program - - 0 - - - - Free Product - Large Cabinet - service - - - - - FREELARGECABINET - - - - - Buy 3 large cabinets, get one for free - no_code_needed - on_order - product - promotion_program - - 3 - [["name","ilike","large cabinet"]] - - 0 - - - - 10% Discount - code_needed - on_order - percentage - 10.0 - coupon_program - - - diff --git a/addons/coupon/i18n/coupon.pot b/addons/coupon/i18n/coupon.pot deleted file mode 100644 index ff41ccc0d71..00000000000 --- a/addons/coupon/i18n/coupon.pot +++ /dev/null @@ -1,1096 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~14.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-14 10:28+0000\n" -"PO-Revision-Date: 2021-09-14 10:28+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "%(amount)s %(currency)s discount on total amount" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "%(percentage)s%% discount on %(product_name)s" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "%s%% discount on cheapest product" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "%s%% discount on products" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "%s%% discount on total amount" -msgstr "" - -#. module: coupon -#: code:addons/coupon/wizard/coupon_generate.py:0 -#, python-format -msgid "%s, a coupon has been generated for you" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "*Valid for following products:" -msgstr "" - -#. module: coupon -#: model:coupon.program,name:coupon.10_percent_coupon -msgid "10% Discount" -msgstr "" - -#. module: coupon -#: model:product.product,name:coupon.product_product_10_percent_discount -#: model:product.template,name:coupon.product_product_10_percent_discount_product_template -msgid "10.0% discount on total amount" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "" -"%" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_coupon_program_form -msgid "" -" Days if 0, infinite use" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid " if 0, no limit" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "" -" Days\n" -" if 0, coupon doesn't expire" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "" -" Orders\n" -" if 0, infinite use" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Minimum purchase of" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Valid for purchase above" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "products" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "" -"get free shipping" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.view_coupon_program_kanban -msgid "Active" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.view_coupon_program_kanban -msgid "Coupons" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__active -msgid "A program is available for the customers when active" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__promo_code -msgid "" -"A promotion code is a code that is associated with a marketing discount. For" -" example, a retailer might tell frequent customers to enter the promotion " -"code 'THX001' to receive a 10%% discount on their whole order." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__program_type -msgid "" -"A promotional program can be either a limited promotional offer without code (applied automatically)\n" -" or with a code (displayed on a magazine for example) that may generate a discount on the current\n" -" order or create a coupon for a next order.\n" -"\n" -" A coupon program generates coupons with a code that can be used to generate a discount on the current\n" -" order or create a coupon for a next order." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__active -msgid "Active" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__promo_applicability -msgid "Applicability" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Apply Discount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__promo_applicability__on_current_order -msgid "Apply On Current Order" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "Apply on First" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_search -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_search -msgid "Archived" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__promo_code_usage__no_code_needed -msgid "Automatically Applied" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__promo_code_usage -msgid "" -"Automatically Applied - No code is required, if the program rules are met, the reward is applied (Except the global discount or the free shipping rewards which are not cumulative)\n" -"Use a code - If the program rules are met, a valid code is mandatory for the reward to be applied\n" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_partners_domain -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_partners_domain -msgid "Based on Customers" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_products_domain -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_products_domain -msgid "Based on Products" -msgstr "" - -#. module: coupon -#: model_terms:ir.actions.act_window,help:coupon.coupon_program_action_promo_program -msgid "" -"Build up promotion programs to attract more customers with discounts, free products, free delivery, etc.\n" -" You can share promotion codes or grant the promotions automatically if some conditions are met." -msgstr "" - -#. module: coupon -#: model:coupon.program,name:coupon.3_cabinets_plus_1_free -msgid "Buy 3 large cabinets, get one for free" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_generate_view_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_tree -msgid "Cancel" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__cancel -msgid "Cancelled" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__code -msgid "Code" -msgstr "" - -#. module: coupon -#: model:coupon.program,name:coupon.10_percent_auto_applied -msgid "Code for 10% on orders" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__company_id -msgid "Company" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "Compose Email" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Conditions" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Congratulations" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_coupon_coupon -msgid "Coupon" -msgstr "" - -#. module: coupon -#: model:ir.actions.report,name:coupon.report_coupon_code -msgid "Coupon Code" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__coupon_count -msgid "Coupon Count" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_coupon_program -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__program_type__coupon_program -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Coupon Program" -msgstr "" - -#. module: coupon -#: model:ir.actions.act_window,name:coupon.coupon_program_action_coupon_program -msgid "Coupon Programs" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_coupon_reward -msgid "Coupon Reward" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_coupon_rule -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_id -msgid "Coupon Rule" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "Coupon Validity" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_date_to -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_date_to -msgid "Coupon program end date" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_date_from -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_date_from -msgid "Coupon program start date" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__sequence -msgid "" -"Coupon program will be applied based on given sequence if multiple programs " -"are defined on same condition(For minimum amount)" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_partners_domain -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_partners_domain -msgid "Coupon program will work for selected customers only" -msgstr "" - -#. module: coupon -#: model:ir.actions.server,name:coupon.expire_coupon_cron_ir_actions_server -#: model:ir.cron,cron_name:coupon.expire_coupon_cron -#: model:ir.cron,name:coupon.expire_coupon_cron -msgid "Coupon: expire coupon based on date" -msgstr "" - -#. module: coupon -#: model:ir.actions.act_window,name:coupon.coupon_action -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_coupon_program_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_tree -msgid "Coupons" -msgstr "" - -#. module: coupon -#: model_terms:ir.actions.act_window,help:coupon.coupon_program_action_coupon_program -msgid "Create a new coupon program" -msgstr "" - -#. module: coupon -#: model_terms:ir.actions.act_window,help:coupon.coupon_program_action_promo_program -msgid "Create a new promotion program" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__create_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__create_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_program__create_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__create_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__create_uid -msgid "Created by" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__create_date -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__create_date -#: model:ir.model.fields,field_description:coupon.field_coupon_program__create_date -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__create_date -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__create_date -msgid "Created on" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__currency_id -msgid "Currency" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__partners_domain -msgid "Customer" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__reward_product_uom_id -#: model:ir.model.fields,help:coupon.field_coupon_reward__reward_product_uom_id -msgid "Default unit of measure used for all stock operations." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_percentage -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_percentage -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__reward_type__discount -msgid "Discount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__reward_type -#: model:ir.model.fields,help:coupon.field_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_apply_on -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_apply_on -msgid "Discount Apply On" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_max_amount -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_max_amount -msgid "Discount Max Amount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_type -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_type -msgid "Discount Type" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "Discount percentage should be between 1-100" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__display_name -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__display_name -#: model:ir.model.fields,field_description:coupon.field_coupon_program__display_name -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__display_name -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__display_name -msgid "Display Name" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_mail_compose_message -msgid "Email composition wizard" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_date_to -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_date_to -msgid "End Date" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__expiration_date -msgid "Expiration Date" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__expired -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_search -msgid "Expired" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_search -msgid "Expired Programs" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_fixed_amount -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_fixed_amount -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__discount_type__fixed_amount -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Fixed Amount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__partner_id -msgid "For Customer" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_product_id -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__reward_product_id -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__reward_type__product -msgid "Free Product" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_reward.py:0 -#, python-format -msgid "Free Product - %s" -msgstr "" - -#. module: coupon -#: model:product.product,name:coupon.product_product_free_large_cabinet -#: model:product.template,name:coupon.product_product_free_large_cabinet_product_template -msgid "Free Product - Large Cabinet" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_generate_view_form -msgid "Generate" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_coupon_generate_wizard -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_coupon_program_form -msgid "Generate Coupon" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_generate_view_form -msgid "Generate Coupons" -msgstr "" - -#. module: coupon -#: model_terms:ir.actions.act_window,help:coupon.coupon_program_action_coupon_program -msgid "" -"Generate and share coupon codes with your customers to get discounts or free" -" products." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__coupon_ids -msgid "Generated Coupons" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__generation_type -msgid "Generation Type" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__has_partner_email -msgid "Has Partner Email" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Here is your reward from" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__id -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__id -#: model:ir.model.fields,field_description:coupon.field_coupon_program__id -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__id -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__id -msgid "ID" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "Invalid partner." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon____last_update -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard____last_update -#: model:ir.model.fields,field_description:coupon.field_coupon_program____last_update -#: model:ir.model.fields,field_description:coupon.field_coupon_reward____last_update -#: model:ir.model.fields,field_description:coupon.field_coupon_rule____last_update -msgid "Last Modified on" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__write_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__write_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_program__write_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__write_uid -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__write_uid -msgid "Last Updated by" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__write_date -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__write_date -#: model:ir.model.fields,field_description:coupon.field_coupon_program__write_date -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__write_date -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__write_date -msgid "Last Updated on" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Logo" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Max Discount Amount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__maximum_use_number -msgid "Maximum Use Number" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_max_amount -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_max_amount -msgid "Maximum amount of discount that can be provided" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__maximum_use_number -msgid "Maximum number of sales orders in which reward can be provided" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Minimum Purchase Of" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_min_quantity -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_min_quantity -msgid "Minimum Quantity" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_rules.py:0 -#, python-format -msgid "Minimum purchased amount should be greater than 0" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_rules.py:0 -#, python-format -msgid "Minimum quantity should be greater than 0" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_minimum_amount -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_minimum_amount -msgid "Minimum required amount to get the reward" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_min_quantity -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_min_quantity -msgid "Minimum required product quantity to get the reward" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__name -msgid "Name" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__nbr_coupons -#: model:ir.model.fields.selection,name:coupon.selection__coupon_generate_wizard__generation_type__nbr_coupon -msgid "Number of Coupons" -msgstr "" - -#. module: coupon -#: model:ir.actions.act_window,name:coupon.coupon_generate_action -msgid "Number of Coupons To Generate" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_generate_wizard__generation_type__nbr_customer -msgid "Number of Selected Customers" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_generate_wizard__nbr_coupons -msgid "Number of coupons" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__discount_apply_on__cheapest_product -msgid "On Cheapest Product" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__discount_apply_on__on_order -msgid "On Order" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_apply_on -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_apply_on -msgid "" -"On Order - Discount on whole order\n" -"Cheapest product - Discount on cheapest product of the order\n" -"Specific products - Discount on selected specific products" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__rule_products_domain -#: model:ir.model.fields,help:coupon.field_coupon_rule__rule_products_domain -msgid "On Purchase of selected product, reward will be given" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__discount_apply_on__specific_products -msgid "On Specific Products" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__reserved -msgid "Pending" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_reward__discount_type__percentage -msgid "Percentage" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_type -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_type -msgid "" -"Percentage - Entered percentage discount will be provided\n" -"Amount - Entered fixed amount discount will be provided" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_coupon__discount_line_product_id -msgid "Product used in the sales order to apply the discount." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_line_product_id -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_line_product_id -msgid "" -"Product used in the sales order to apply the discount. Each coupon program " -"has its own reward product for reporting purpose" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_specific_product_ids -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_specific_product_ids -msgid "Products" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_specific_product_ids -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_specific_product_ids -msgid "" -"Products that will be discounted if the discount is applied on specific " -"products" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__program_id -msgid "Program" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_coupon_program_form -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "Program Name" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__program_type -msgid "Program Type" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__promo_code_usage -msgid "Promo Code Usage" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__promo_code -msgid "Promotion Code" -msgstr "" - -#. module: coupon -#: model:ir.actions.act_window,name:coupon.coupon_program_action_promo_program -msgid "Promotion Programs" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__program_type__promotion_program -msgid "Promotional Program" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_product_quantity -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__reward_product_quantity -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Quantity" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_id -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Reward" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_description -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__reward_description -msgid "Reward Description" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__discount_line_product_id -#: model:ir.model.fields,field_description:coupon.field_coupon_program__discount_line_product_id -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__discount_line_product_id -msgid "Reward Line Product" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__reward_product_id -#: model:ir.model.fields,help:coupon.field_coupon_reward__reward_product_id -msgid "Reward Product" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_type -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__reward_product_quantity -#: model:ir.model.fields,help:coupon.field_coupon_reward__reward_product_quantity -msgid "Reward product quantity" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Rewards" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_minimum_amount -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_minimum_amount -msgid "Rule Minimum Amount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_minimum_amount_tax_inclusion -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_minimum_amount_tax_inclusion -msgid "Rule Minimum Amount Tax Inclusion" -msgstr "" - -#. module: coupon -#: model:ir.model,name:coupon.model_report_coupon_report_coupon -msgid "Sales Coupon Report" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Select company" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "Select customer" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Select product" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Select products" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Select reward product" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_tree -msgid "Send" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__promo_applicability__on_next_order -msgid "Send a Coupon" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_view_form -msgid "Send by Email" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__sent -msgid "Sent" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__sequence -msgid "Sequence" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_generate_view_form -msgid "" -"Some selected customers do not have an email address and will not receive " -"the coupon." -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_generate_view_form -msgid "Specify a mail template to send the generated coupons as email." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__rule_date_from -#: model:ir.model.fields,field_description:coupon.field_coupon_rule__rule_date_from -msgid "Start Date" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_coupon__state -msgid "State" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_rule__rule_minimum_amount_tax_inclusion__tax_excluded -msgid "Tax Excluded" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_rule__rule_minimum_amount_tax_inclusion__tax_included -msgid "Tax Included" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Thank you," -msgstr "" - -#. module: coupon -#: model:ir.model.constraint,message:coupon.constraint_coupon_coupon_unique_coupon_code -msgid "The coupon code must be unique!" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "The coupon program for %s is in draft or closed state" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_fixed_amount -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_fixed_amount -msgid "The discount in fixed amount" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__discount_percentage -#: model:ir.model.fields,help:coupon.field_coupon_reward__discount_percentage -msgid "The discount in percentage, between 1 and 100" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_program.py:0 -#, python-format -msgid "The program code must be unique!" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_rules.py:0 -#, python-format -msgid "The start date must be before the end date" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "This coupon %s exists but the origin sales order is not validated yet." -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "This coupon has already been used (%s)." -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "This coupon has been cancelled (%s)." -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon.py:0 -#, python-format -msgid "This coupon is expired (%s)." -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__total_order_count -msgid "Total Order Count" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__reward_product_uom_id -#: model:ir.model.fields,field_description:coupon.field_coupon_reward__reward_product_uom_id -msgid "Unit of Measure" -msgstr "" - -#. module: coupon -#: model:product.product,uom_name:coupon.product_product_10_percent_discount -#: model:product.product,uom_name:coupon.product_product_free_large_cabinet -#: model:product.template,uom_name:coupon.product_product_10_percent_discount_product_template -#: model:product.template,uom_name:coupon.product_product_free_large_cabinet_product_template -msgid "Units" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_program__promo_code_usage__code_needed -msgid "Use a code" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_generate_wizard__template_id -msgid "Use template" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "Use this promo code before" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__used -msgid "Used" -msgstr "" - -#. module: coupon -#: model:ir.model.fields.selection,name:coupon.selection__coupon_coupon__state__new -msgid "Valid" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_form_common -msgid "Validity" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,field_description:coupon.field_coupon_program__validity_duration -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_coupon_program_form -msgid "Validity Duration" -msgstr "" - -#. module: coupon -#: model:ir.model.fields,help:coupon.field_coupon_program__validity_duration -msgid "Validity duration for a coupon after its generation" -msgstr "" - -#. module: coupon -#: code:addons/coupon/models/coupon_program.py:0 -#, python-format -msgid "You can not delete a program in active state" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.coupon_program_view_promo_program_form -msgid "e.g. 10% Discount" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "off %s" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "off on %s" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "off on some products*" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "off on the cheapest product" -msgstr "" - -#. module: coupon -#: model_terms:ir.ui.view,arch_db:coupon.report_coupon -msgid "on your next order" -msgstr "" diff --git a/addons/coupon/models/__init__.py b/addons/coupon/models/__init__.py deleted file mode 100644 index 14d4dcf92a1..00000000000 --- a/addons/coupon/models/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import mail_compose_message -from . import coupon -from . import coupon_reward -from . import coupon_rules -from . import coupon_program diff --git a/addons/coupon/models/coupon.py b/addons/coupon/models/coupon.py deleted file mode 100644 index 4bed33c8a3e..00000000000 --- a/addons/coupon/models/coupon.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -import random -from dateutil.relativedelta import relativedelta - -from odoo import api, fields, models, _ - -from uuid import uuid4 - -class Coupon(models.Model): - _name = 'coupon.coupon' - _description = "Coupon" - _rec_name = 'code' - - @api.model - def _generate_code(self): - """Generate a 20 char long pseudo-random string of digits for barcode - generation. - - A decimal serialisation is longer than a hexadecimal one *but* it - generates a more compact barcode (Code128C rather than Code128A). - - Generate 8 bytes (64 bits) barcodes as 16 bytes barcodes are not - compatible with all scanners. - """ - return str(uuid4())[:22] - - code = fields.Char(default=lambda self: self._generate_code(), required=True, readonly=True) - expiration_date = fields.Date('Expiration Date', compute='_compute_expiration_date') - state = fields.Selection([ - ('reserved', 'Pending'), - ('new', 'Valid'), - ('sent', 'Sent'), - ('used', 'Used'), - ('expired', 'Expired'), - ('cancel', 'Cancelled') - ], required=True, default='new') - partner_id = fields.Many2one('res.partner', "For Customer") - program_id = fields.Many2one('coupon.program', "Program") - discount_line_product_id = fields.Many2one('product.product', related='program_id.discount_line_product_id', readonly=False, - help='Product used in the sales order to apply the discount.') - - _sql_constraints = [ - ('unique_coupon_code', 'unique(code)', 'The coupon code must be unique!'), - ] - - @api.depends('create_date', 'program_id.validity_duration') - def _compute_expiration_date(self): - self.expiration_date = 0 - for coupon in self.filtered(lambda x: x.program_id.validity_duration > 0): - coupon.expiration_date = (coupon.create_date + relativedelta(days=coupon.program_id.validity_duration)).date() - - def _get_default_template(self): - return False - - def action_coupon_send(self): - """ Open a window to compose an email, with the edi invoice template - message loaded by default - """ - self.ensure_one() - default_template = self._get_default_template() - compose_form = self.env.ref('mail.email_compose_message_wizard_form', False) - ctx = dict( - default_model='coupon.coupon', - default_res_id=self.id, - default_use_template=bool(default_template), - default_template_id=default_template and default_template.id, - default_composition_mode='comment', - default_email_layout_xmlid='mail.mail_notification_light', - mark_coupon_as_sent=True, - force_email=True, - ) - return { - 'name': _('Compose Email'), - 'type': 'ir.actions.act_window', - 'view_mode': 'form', - 'res_model': 'mail.compose.message', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, - } - - def action_coupon_cancel(self): - self.state = 'cancel' - - def cron_expire_coupon(self): - self._cr.execute(""" - SELECT C.id FROM COUPON_COUPON as C - INNER JOIN COUPON_PROGRAM as P ON C.program_id = P.id - WHERE C.STATE in ('reserved', 'new', 'sent') - AND P.validity_duration > 0 - AND C.create_date + interval '1 day' * P.validity_duration < now()""") - - expired_ids = [res[0] for res in self._cr.fetchall()] - self.browse(expired_ids).write({'state': 'expired'}) - - def _check_coupon_code(self, order_date, partner_id, **kwargs): - """ Check the validity of this single coupon. - :param order_date Date: - :param partner_id int | boolean: - """ - self.ensure_one() - message = {} - if self.state == 'used': - message = {'error': _('This coupon has already been used (%s).') % (self.code)} - elif self.state == 'reserved': - message = {'error': _('This coupon %s exists but the origin sales order is not validated yet.') % (self.code)} - elif self.state == 'cancel': - message = {'error': _('This coupon has been cancelled (%s).') % (self.code)} - elif self.state == 'expired' or (self.expiration_date and self.expiration_date < order_date): - message = {'error': _('This coupon is expired (%s).') % (self.code)} - elif not self.program_id.active: - message = {'error': _('The coupon program for %s is in draft or closed state') % (self.code)} - elif self.partner_id and self.partner_id.id != partner_id: - message = {'error': _('Invalid partner.')} - return message diff --git a/addons/coupon/models/coupon_program.py b/addons/coupon/models/coupon_program.py deleted file mode 100644 index e5b55603a44..00000000000 --- a/addons/coupon/models/coupon_program.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models, _ -from odoo.exceptions import UserError, ValidationError - -import ast - - -class CouponProgram(models.Model): - _name = 'coupon.program' - _description = "Coupon Program" - _inherits = {'coupon.rule': 'rule_id', 'coupon.reward': 'reward_id'} - # We should apply 'discount' promotion first to avoid offering free product when we should not. - # Eg: If the discount lower the SO total below the required threshold - # Note: This is only revelant when programs have the same sequence (which they have by default) - _order = "sequence, reward_type" - - name = fields.Char(required=True, translate=True) - active = fields.Boolean('Active', default=True, help="A program is available for the customers when active") - rule_id = fields.Many2one('coupon.rule', string="Coupon Rule", ondelete='restrict', required=True) - reward_id = fields.Many2one('coupon.reward', string="Reward", ondelete='restrict', required=True, copy=False) - sequence = fields.Integer(copy=False, - help="Coupon program will be applied based on given sequence if multiple programs are " + - "defined on same condition(For minimum amount)") - maximum_use_number = fields.Integer(help="Maximum number of sales orders in which reward can be provided") - program_type = fields.Selection([ - ('promotion_program', 'Promotional Program'), - ('coupon_program', 'Coupon Program'), - ], - help="""A promotional program can be either a limited promotional offer without code (applied automatically) - or with a code (displayed on a magazine for example) that may generate a discount on the current - order or create a coupon for a next order. - - A coupon program generates coupons with a code that can be used to generate a discount on the current - order or create a coupon for a next order.""") - promo_code_usage = fields.Selection([ - ('no_code_needed', 'Automatically Applied'), - ('code_needed', 'Use a code')], - help="Automatically Applied - No code is required, if the program rules are met, the reward is applied (Except the global discount or the free shipping rewards which are not cumulative)\n" + - "Use a code - If the program rules are met, a valid code is mandatory for the reward to be applied\n") - promo_code = fields.Char('Promotion Code', copy=False, - help="A promotion code is a code that is associated with a marketing discount. For example, a retailer might tell frequent customers to enter the promotion code 'THX001' to receive a 10%% discount on their whole order.") - promo_applicability = fields.Selection([ - ('on_current_order', 'Apply On Current Order'), - ('on_next_order', 'Send a Coupon')], - default='on_current_order', string="Applicability") - coupon_ids = fields.One2many('coupon.coupon', 'program_id', string="Generated Coupons", copy=False) - coupon_count = fields.Integer(compute='_compute_coupon_count') - company_id = fields.Many2one('res.company', string="Company", required=True, default=lambda self: self.env.company) - currency_id = fields.Many2one(string="Currency", related='company_id.currency_id', readonly=True) - validity_duration = fields.Integer(default=30, - help="Validity duration for a coupon after its generation") - total_order_count = fields.Integer("Total Order Count", compute="_compute_total_order_count") - - @api.constrains('promo_code') - def _check_promo_code_constraint(self): - """ Program code must be unique """ - for program in self.filtered(lambda p: p.promo_code): - domain = [('id', '!=', program.id), ('promo_code', '=', program.promo_code)] - if self.search(domain): - raise ValidationError(_('The program code must be unique!')) - - @api.depends('coupon_ids') - def _compute_coupon_count(self): - coupon_data = self.env['coupon.coupon']._read_group([('program_id', 'in', self.ids)], ['program_id'], ['program_id']) - mapped_data = dict([(m['program_id'][0], m['program_id_count']) for m in coupon_data]) - for program in self: - program.coupon_count = mapped_data.get(program.id, 0) - - @api.onchange('promo_code_usage') - def _onchange_promo_code_usage(self): - if self.promo_code_usage == 'no_code_needed': - self.promo_code = False - - @api.onchange('reward_product_id') - def _onchange_reward_product_id(self): - if self.reward_product_id: - self.reward_product_uom_id = self.reward_product_id.uom_id - - @api.onchange('discount_type') - def _onchange_discount_type(self): - if self.discount_type == 'fixed_amount': - self.discount_apply_on = 'on_order' - - @api.model_create_multi - def create(self, vals_list): - programs = super().create(vals_list) - for program in programs: - if program.discount_line_product_id: - continue - values = program._get_discount_product_values() - discount_line_product_id = self.env['product.product'].create(values) - program.write({'discount_line_product_id': discount_line_product_id.id}) - return programs - - def write(self, vals): - res = super(CouponProgram, self).write(vals) - reward_fields = [ - 'reward_type', 'reward_product_id', 'discount_type', 'discount_percentage', - 'discount_apply_on', 'discount_specific_product_ids', 'discount_fixed_amount' - ] - if any(field in reward_fields for field in vals): - self.mapped('discount_line_product_id').write({'name': self[0].reward_id.display_name}) - return res - - @api.ondelete(at_uninstall=False) - def _unlink_except_active(self): - if self.filtered('active'): - raise UserError(_('You can not delete a program in active state')) - - def unlink(self): - # get reference to rule and reward - rule = self.rule_id - reward = self.reward_id - # unlink the program - super(CouponProgram, self).unlink() - # then unlink the rule and reward - rule.unlink() - reward.unlink() - return True - - def toggle_active(self): - super(CouponProgram, self).toggle_active() - for program in self: - program.discount_line_product_id.active = program.active - coupons = self.filtered(lambda p: not p.active and p.promo_code_usage == 'code_needed').mapped('coupon_ids') - coupons.filtered(lambda x: x.state != 'used').write({'state': 'expired'}) - - def _compute_program_amount(self, field, currency_to): - self.ensure_one() - return self.currency_id._convert(self[field], currency_to, self.company_id, fields.Date.today()) - - def _is_valid_partner(self, partner): - if self.rule_partners_domain and self.rule_partners_domain != '[]': - domain = ast.literal_eval(self.rule_partners_domain) + [('id', '=', partner.id)] - return bool(self.env['res.partner'].search_count(domain)) - else: - return True - - def _get_valid_products(self, products): - """Get valid products for the program. - - :param products: records of product.product - :return: valid products recordset - """ - if self.rule_products_domain and self.rule_products_domain != "[]": - domain = ast.literal_eval(self.rule_products_domain) - return products.filtered_domain(domain) - return products - - def _generate_coupons(self, partner_id): - '''Generate coupons that can be used in the next order for the given partner_id.''' - generated_coupons = self.env['coupon.coupon'] - for program in self: - generated_coupons |= self.env['coupon.coupon'].create({ - 'program_id': program.id, - 'partner_id': partner_id, - }) - return generated_coupons - - def _compute_total_order_count(self): - for program in self: - program.total_order_count = 0 - - def _get_discount_product_values(self): - return { - 'name': self.reward_id.display_name, - 'type': 'service', - 'taxes_id': False, - 'supplier_taxes_id': False, - 'sale_ok': False, - 'purchase_ok': False, - 'lst_price': 0, #Do not set a high value to avoid issue with coupon code - } diff --git a/addons/coupon/models/coupon_reward.py b/addons/coupon/models/coupon_reward.py deleted file mode 100644 index d5ad92a9196..00000000000 --- a/addons/coupon/models/coupon_reward.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError - - -class CouponReward(models.Model): - _name = 'coupon.reward' - _description = "Coupon Reward" - _rec_name = 'reward_description' - - # VFE FIXME multi company - """Rewards are not restricted to a company... - You could have a reward_product_id limited to a specific company A. - But still use this reward as reward of a program of company B... - """ - reward_description = fields.Char('Reward Description') - reward_type = fields.Selection([ - ('discount', 'Discount'), - ('product', 'Free Product'), - ], string='Reward Type', default='discount', - help="Discount - Reward will be provided as discount.\n" + - "Free Product - Free product will be provide as reward \n" + - "Free Shipping - Free shipping will be provided as reward (Need delivery module)") - # Product Reward - reward_product_id = fields.Many2one('product.product', string="Free Product", - help="Reward Product") - reward_product_quantity = fields.Integer(string="Quantity", default=1, help="Reward product quantity") - # Discount Reward - discount_type = fields.Selection([ - ('percentage', 'Percentage'), - ('fixed_amount', 'Fixed Amount')], default="percentage", - help="Percentage - Entered percentage discount will be provided\n" + - "Amount - Entered fixed amount discount will be provided") - discount_percentage = fields.Float(string="Discount", default=10, - help='The discount in percentage, between 1 and 100') - discount_apply_on = fields.Selection([ - ('on_order', 'On Order'), - ('cheapest_product', 'On Cheapest Product'), - ('specific_products', 'On Specific Products')], default="on_order", - help="On Order - Discount on whole order\n" + - "Cheapest product - Discount on cheapest product of the order\n" + - "Specific products - Discount on selected specific products") - discount_specific_product_ids = fields.Many2many('product.product', string="Products", - help="Products that will be discounted if the discount is applied on specific products") - discount_max_amount = fields.Float(default=0, - help="Maximum amount of discount that can be provided") - discount_fixed_amount = fields.Float(string="Fixed Amount", help='The discount in fixed amount') - reward_product_uom_id = fields.Many2one(related='reward_product_id.product_tmpl_id.uom_id', string='Unit of Measure', readonly=True) - discount_line_product_id = fields.Many2one('product.product', string='Reward Line Product', copy=False, - help="Product used in the sales order to apply the discount. Each coupon program has its own reward product for reporting purpose") - - @api.constrains('discount_percentage') - def _check_discount_percentage(self): - if self.filtered(lambda reward: reward.discount_type == 'percentage' and (reward.discount_percentage < 0 or reward.discount_percentage > 100)): - raise ValidationError(_('Discount percentage should be between 1-100')) - - def name_get(self): - """ - Returns a complete description of the reward - """ - result = [] - for reward in self: - reward_string = "" - if reward.reward_type == 'product': - reward_string = _("Free Product - %s", reward.reward_product_id.name) - elif reward.reward_type == 'discount': - if reward.discount_type == 'percentage': - reward_percentage = str(reward.discount_percentage) - if reward.discount_apply_on == 'on_order': - reward_string = _("%s%% discount on total amount", reward_percentage) - elif reward.discount_apply_on == 'specific_products': - if len(reward.discount_specific_product_ids) > 1: - reward_string = _("%s%% discount on products", reward_percentage) - else: - reward_string = _( - "%(percentage)s%% discount on %(product_name)s", - percentage=reward_percentage, - product_name=reward.discount_specific_product_ids.name - ) - elif reward.discount_apply_on == 'cheapest_product': - reward_string = _("%s%% discount on cheapest product", reward_percentage) - elif reward.discount_type == 'fixed_amount': - program = self.env['coupon.program'].search([('reward_id', '=', reward.id)]) - reward_string = _( - "%(amount)s %(currency)s discount on total amount", - amount=reward.discount_fixed_amount, - currency=program.currency_id.name - ) - result.append((reward.id, reward_string)) - return result diff --git a/addons/coupon/models/coupon_rules.py b/addons/coupon/models/coupon_rules.py deleted file mode 100644 index 1412d683db0..00000000000 --- a/addons/coupon/models/coupon_rules.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError - - -class CouponRule(models.Model): - _name = 'coupon.rule' - _description = "Coupon Rule" - - rule_date_from = fields.Datetime(string="Start Date", help="Coupon program start date") - rule_date_to = fields.Datetime(string="End Date", help="Coupon program end date") - rule_partners_domain = fields.Char(string="Based on Customers", help="Coupon program will work for selected customers only") - rule_products_domain = fields.Char(string="Based on Products", default=[['sale_ok', '=', True]], help="On Purchase of selected product, reward will be given") - rule_min_quantity = fields.Integer(string="Minimum Quantity", default=1, - help="Minimum required product quantity to get the reward") - rule_minimum_amount = fields.Float(default=0.0, help="Minimum required amount to get the reward") - rule_minimum_amount_tax_inclusion = fields.Selection([ - ('tax_included', 'Tax Included'), - ('tax_excluded', 'Tax Excluded')], default="tax_excluded") - - @api.constrains('rule_date_to', 'rule_date_from') - def _check_rule_date_from(self): - if any(applicability for applicability in self - if applicability.rule_date_to and applicability.rule_date_from - and applicability.rule_date_to < applicability.rule_date_from): - raise ValidationError(_('The start date must be before the end date')) - - @api.constrains('rule_minimum_amount') - def _check_rule_minimum_amount(self): - if self.filtered(lambda applicability: applicability.rule_minimum_amount < 0): - raise ValidationError(_('Minimum purchased amount should be greater than 0')) - - @api.constrains('rule_min_quantity') - def _check_rule_min_quantity(self): - if not self.rule_min_quantity > 0: - raise ValidationError(_('Minimum quantity should be greater than 0')) diff --git a/addons/coupon/models/mail_compose_message.py b/addons/coupon/models/mail_compose_message.py deleted file mode 100644 index d4b50a79464..00000000000 --- a/addons/coupon/models/mail_compose_message.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models - - -class MailComposeMessage(models.TransientModel): - _inherit = 'mail.compose.message' - - def _action_send_mail(self, **kwargs): - for wizard in self: - if self._context.get('mark_coupon_as_sent') and wizard.model == 'coupon.coupon' and wizard.partner_ids: - # Mark coupon as sent in sudo, as helpdesk users don't have the right to write on coupons - self.env[wizard.model].sudo().browse(wizard.res_id).state = 'sent' - return super()._action_send_mail(**kwargs) diff --git a/addons/coupon/report/__init__.py b/addons/coupon/report/__init__.py deleted file mode 100644 index 69484aac781..00000000000 --- a/addons/coupon/report/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import coupon_report diff --git a/addons/coupon/report/coupon_report.py b/addons/coupon/report/coupon_report.py deleted file mode 100644 index fd154f6d4d3..00000000000 --- a/addons/coupon/report/coupon_report.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, models - - -class CouponReport(models.AbstractModel): - _name = 'report.coupon.report_coupon' - _description = 'Sales Coupon Report' - - @api.model - def _get_report_values(self, docids, data=None): - docs = self.env['coupon.coupon'].browse(docids) - return { - 'doc_ids': docs.ids, - 'doc_model': 'coupon.coupon', - 'data': data, - 'docs': docs, - } diff --git a/addons/coupon/report/coupon_report.xml b/addons/coupon/report/coupon_report.xml deleted file mode 100644 index 1311db8bbb9..00000000000 --- a/addons/coupon/report/coupon_report.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Coupon Code - coupon.coupon - qweb-pdf - coupon.report_coupon_i18n - coupon.report_coupon_i18n - - report - - - diff --git a/addons/coupon/report/coupon_report_templates.xml b/addons/coupon/report/coupon_report_templates.xml deleted file mode 100644 index 459c6e6dd0c..00000000000 --- a/addons/coupon/report/coupon_report_templates.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - diff --git a/addons/coupon/security/coupon_security.xml b/addons/coupon/security/coupon_security.xml deleted file mode 100644 index 349af6c2b50..00000000000 --- a/addons/coupon/security/coupon_security.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Generate Sales Coupon Rule - - [('create_uid', '=', user.id)] - - diff --git a/addons/coupon/security/ir.model.access.csv b/addons/coupon/security/ir.model.access.csv deleted file mode 100644 index 34836cfdb7c..00000000000 --- a/addons/coupon/security/ir.model.access.csv +++ /dev/null @@ -1,7 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_coupon_coupon,access_coupon_coupon,model_coupon_coupon,base.group_user,0,0,0,0 -access_coupon_reward,access_coupon_reward,model_coupon_reward,base.group_user,0,0,0,0 -access_coupon_rule,access_coupon_rule,model_coupon_rule,base.group_user,0,0,0,0 -access_coupon_program,access_coupon_program,model_coupon_program,base.group_user,0,0,0,0 -access_coupon_generate_wizard,access_coupon_generate_wizard,model_coupon_generate_wizard,base.group_user,0,0,0,0 - diff --git a/addons/coupon/views/coupon_program_views.xml b/addons/coupon/views/coupon_program_views.xml deleted file mode 100644 index 062ee396a83..00000000000 --- a/addons/coupon/views/coupon_program_views.xml +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - coupon.program.common.form - coupon.program - -
- -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - coupon.program.form - coupon.program - - primary - - -
-
-
- - - - - - - -
-
- - - coupon.program.tree - coupon.program - - - - - - - - - - - - coupon.program.search - coupon.program - - - - - - - - - - - - coupon.program.kanban - coupon.program - - - - - - -
-
- -
-
-
-
Coupons
-
Active
-
-
- -
-
-
-
-
-
-
-
- - - Coupon Programs - coupon.program - tree,kanban,form - - - [('program_type','=', 'coupon_program')] - { - 'default_program_type': 'coupon_program', - 'promo_code_usage': 'code_needed', - 'search_default_opened': 1 - } - -

- Create a new coupon program -

- Generate and share coupon codes with your customers to get discounts or free products. -

-
-
- - - - - coupon.promotion.program.form - coupon.program - - primary - - - - - - - - - - - - - - - - - - - - - - - - - - - - coupon.promotion.program.tree - coupon.program - - - - - - - - - - - - coupon.promotion.program.search - coupon.program - - - - - - - - - - - Promotion Programs - coupon.program - tree,kanban,form - - - [('program_type', '=', 'promotion_program')] - { - 'default_program_type': 'promotion_program', - 'default_promo_code_usage': 'no_code_needed', - 'default_validity_duration': 0, - 'search_default_opened': 1 - } - -

- Create a new promotion program -

- Build up promotion programs to attract more customers with discounts, free products, free delivery, etc. - You can share promotion codes or grant the promotions automatically if some conditions are met. -

-
-
- diff --git a/addons/coupon/views/coupon_views.xml b/addons/coupon/views/coupon_views.xml deleted file mode 100644 index 8b7cc3968aa..00000000000 --- a/addons/coupon/views/coupon_views.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - coupon.coupon.tree - coupon.coupon - - - - - - - - - - - - - coupon.program.form - coupon.program - - - - - - - - - - - coupon.program.kanban - coupon.program - - - -
- Sales -
-
- -
- -
-
-
-
-
diff --git a/addons/sale_coupon/views/coupon_views.xml b/addons/sale_coupon/views/coupon_views.xml deleted file mode 100644 index 1a4f5ca3743..00000000000 --- a/addons/sale_coupon/views/coupon_views.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - coupon.coupon.tree - coupon.coupon - - - - - - - - - - coupon.coupon.form - coupon.coupon - - - - - - - - - - - - diff --git a/addons/sale_coupon/views/res_config_settings_views.xml b/addons/sale_coupon/views/res_config_settings_views.xml deleted file mode 100644 index 52fa0929abb..00000000000 --- a/addons/sale_coupon/views/res_config_settings_views.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - res.config.settings.view.form.inherit.sale.coupon - res.config.settings - - - -
-
-
-
-
-
-
-
-
- -
diff --git a/addons/sale_coupon/views/sale_order_views.xml b/addons/sale_coupon/views/sale_order_views.xml deleted file mode 100644 index b44eed5afef..00000000000 --- a/addons/sale_coupon/views/sale_order_views.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - sale.order.form.inherit.coupon - sale.order - - 10 - - -
-
-
-
-
- - - Sales Order - sale.order - - [('state', '!=', 'cancel')] - {} - -
diff --git a/addons/sale_coupon/wizard/__init__.py b/addons/sale_coupon/wizard/__init__.py deleted file mode 100644 index 5de288778c4..00000000000 --- a/addons/sale_coupon/wizard/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import sale_coupon_apply_code diff --git a/addons/sale_coupon/wizard/sale_coupon_apply_code.py b/addons/sale_coupon/wizard/sale_coupon_apply_code.py deleted file mode 100644 index 4e801eedea6..00000000000 --- a/addons/sale_coupon/wizard/sale_coupon_apply_code.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- - -from odoo import api, fields, models, _ -from odoo.exceptions import UserError - - -class SaleCouponApplyCode(models.TransientModel): - _name = 'sale.coupon.apply.code' - _rec_name = 'coupon_code' - _description = 'Sales Coupon Apply Code' - - coupon_code = fields.Char(string="Code", required=True) - - def process_coupon(self): - """ - Apply the entered coupon code if valid, raise an UserError otherwise. - """ - sales_order = self.env['sale.order'].browse(self.env.context.get('active_id')) - error_status = self.apply_coupon(sales_order, self.coupon_code) - if error_status.get('error', False): - raise UserError(error_status.get('error', False)) - if error_status.get('not_found', False): - raise UserError(error_status.get('not_found', False)) - - def apply_coupon(self, order, coupon_code): - error_status = {} - program = self.env['coupon.program'].search([('promo_code', '=', coupon_code)]) - if program: - error_status = program._check_promo_code(order, coupon_code) - if not error_status: - if program.promo_applicability == 'on_next_order': - # Avoid creating the coupon if it already exist - if program.discount_line_product_id.id not in order.generated_coupon_ids.filtered(lambda coupon: coupon.state in ['new', 'reserved']).mapped('discount_line_product_id').ids: - coupon = order._create_reward_coupon(program) - return { - 'generated_coupon': { - 'reward': coupon.program_id.discount_line_product_id.name, - 'code': coupon.code, - } - } - else: # The program is applied on this order - order._create_reward_line(program) - order.code_promo_program_id = program - else: - coupon = self.env['coupon.coupon'].search([('code', '=', coupon_code)], limit=1) - if coupon: - error_status = coupon._check_coupon_code(order.date_order.date(), order.partner_id.id, order=order) - if not error_status: - order._create_reward_line(coupon.program_id) - order.applied_coupon_ids += coupon - coupon.write({'state': 'used'}) - else: - error_status = {'not_found': _('This coupon is invalid (%s).') % (coupon_code)} - return error_status diff --git a/addons/sale_coupon/wizard/sale_coupon_apply_code_views.xml b/addons/sale_coupon/wizard/sale_coupon_apply_code_views.xml deleted file mode 100644 index 929315dc414..00000000000 --- a/addons/sale_coupon/wizard/sale_coupon_apply_code_views.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - sale.coupon.apply.code.form - sale.coupon.apply.code - -
- - - - - -
-
-
-
-
- - - Enter Promotion or Coupon Code - sale.coupon.apply.code - form - new - - -
From b1ca5e4e45707103d32864a90fc0dbd6196f2e3d Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:06:23 +0100 Subject: [PATCH 05/19] [REM] sale_coupon_delivery: remove sale_coupon_delivery module Removes the sale_coupon_delivery module as it is merged inside of sale_loyalty_delivery. TaskId-2675382 --- addons/sale_coupon_delivery/__init__.py | 3 - addons/sale_coupon_delivery/__manifest__.py | 16 -- addons/sale_coupon_delivery/i18n/af.po | 52 ---- addons/sale_coupon_delivery/i18n/am.po | 49 ---- addons/sale_coupon_delivery/i18n/ar.po | 78 ------ addons/sale_coupon_delivery/i18n/az.po | 79 ------ addons/sale_coupon_delivery/i18n/bg.po | 52 ---- addons/sale_coupon_delivery/i18n/bs.po | 82 ------ addons/sale_coupon_delivery/i18n/ca.po | 86 ------ addons/sale_coupon_delivery/i18n/cs.po | 79 ------ addons/sale_coupon_delivery/i18n/da.po | 77 ------ addons/sale_coupon_delivery/i18n/de.po | 80 ------ addons/sale_coupon_delivery/i18n/el.po | 85 ------ addons/sale_coupon_delivery/i18n/en_GB.po | 52 ---- addons/sale_coupon_delivery/i18n/es.po | 80 ------ addons/sale_coupon_delivery/i18n/es_BO.po | 52 ---- addons/sale_coupon_delivery/i18n/es_CL.po | 52 ---- addons/sale_coupon_delivery/i18n/es_CO.po | 52 ---- addons/sale_coupon_delivery/i18n/es_CR.po | 52 ---- addons/sale_coupon_delivery/i18n/es_DO.po | 52 ---- addons/sale_coupon_delivery/i18n/es_EC.po | 52 ---- addons/sale_coupon_delivery/i18n/es_PE.po | 52 ---- addons/sale_coupon_delivery/i18n/es_PY.po | 52 ---- addons/sale_coupon_delivery/i18n/es_VE.po | 52 ---- addons/sale_coupon_delivery/i18n/et.po | 85 ------ addons/sale_coupon_delivery/i18n/eu.po | 52 ---- addons/sale_coupon_delivery/i18n/fa.po | 83 ------ addons/sale_coupon_delivery/i18n/fi.po | 84 ------ addons/sale_coupon_delivery/i18n/fo.po | 52 ---- addons/sale_coupon_delivery/i18n/fr.po | 79 ------ addons/sale_coupon_delivery/i18n/fr_CA.po | 52 ---- addons/sale_coupon_delivery/i18n/gl.po | 52 ---- addons/sale_coupon_delivery/i18n/gu.po | 79 ------ addons/sale_coupon_delivery/i18n/he.po | 76 ------ addons/sale_coupon_delivery/i18n/hr.po | 76 ------ addons/sale_coupon_delivery/i18n/hu.po | 76 ------ addons/sale_coupon_delivery/i18n/id.po | 53 ---- addons/sale_coupon_delivery/i18n/is.po | 84 ------ addons/sale_coupon_delivery/i18n/it.po | 80 ------ addons/sale_coupon_delivery/i18n/ja.po | 82 ------ addons/sale_coupon_delivery/i18n/ka.po | 53 ---- addons/sale_coupon_delivery/i18n/kab.po | 52 ---- addons/sale_coupon_delivery/i18n/km.po | 82 ------ addons/sale_coupon_delivery/i18n/ko.po | 85 ------ addons/sale_coupon_delivery/i18n/lb.po | 71 ----- addons/sale_coupon_delivery/i18n/lo.po | 52 ---- addons/sale_coupon_delivery/i18n/lt.po | 76 ------ addons/sale_coupon_delivery/i18n/lv.po | 52 ---- addons/sale_coupon_delivery/i18n/mk.po | 52 ---- addons/sale_coupon_delivery/i18n/mn.po | 77 ------ addons/sale_coupon_delivery/i18n/nb.po | 75 ------ addons/sale_coupon_delivery/i18n/ne.po | 52 ---- addons/sale_coupon_delivery/i18n/nl.po | 79 ------ addons/sale_coupon_delivery/i18n/nl_BE.po | 52 ---- addons/sale_coupon_delivery/i18n/pl.po | 80 ------ addons/sale_coupon_delivery/i18n/pt.po | 71 ----- addons/sale_coupon_delivery/i18n/pt_BR.po | 80 ------ addons/sale_coupon_delivery/i18n/ro.po | 71 ----- addons/sale_coupon_delivery/i18n/ru.po | 76 ------ .../i18n/sale_coupon_delivery.pot | 71 ----- addons/sale_coupon_delivery/i18n/sk.po | 83 ------ addons/sale_coupon_delivery/i18n/sl.po | 49 ---- addons/sale_coupon_delivery/i18n/sq.po | 49 ---- addons/sale_coupon_delivery/i18n/sr.po | 82 ------ addons/sale_coupon_delivery/i18n/sr@latin.po | 53 ---- addons/sale_coupon_delivery/i18n/sv.po | 85 ------ addons/sale_coupon_delivery/i18n/th.po | 84 ------ addons/sale_coupon_delivery/i18n/tr.po | 81 ------ addons/sale_coupon_delivery/i18n/uk.po | 79 ------ addons/sale_coupon_delivery/i18n/vi.po | 76 ------ addons/sale_coupon_delivery/i18n/zh_CN.po | 80 ------ addons/sale_coupon_delivery/i18n/zh_TW.po | 81 ------ .../sale_coupon_delivery/models/__init__.py | 6 - .../models/sale_coupon.py | 15 -- .../models/sale_coupon_program.py | 24 -- .../models/sale_coupon_reward.py | 19 -- .../sale_coupon_delivery/models/sale_order.py | 65 ----- addons/sale_coupon_delivery/tests/__init__.py | 4 - .../tests/test_free_shipping_reward.py | 255 ------------------ 79 files changed, 5192 deletions(-) delete mode 100644 addons/sale_coupon_delivery/__init__.py delete mode 100644 addons/sale_coupon_delivery/__manifest__.py delete mode 100644 addons/sale_coupon_delivery/i18n/af.po delete mode 100644 addons/sale_coupon_delivery/i18n/am.po delete mode 100644 addons/sale_coupon_delivery/i18n/ar.po delete mode 100644 addons/sale_coupon_delivery/i18n/az.po delete mode 100644 addons/sale_coupon_delivery/i18n/bg.po delete mode 100644 addons/sale_coupon_delivery/i18n/bs.po delete mode 100644 addons/sale_coupon_delivery/i18n/ca.po delete mode 100644 addons/sale_coupon_delivery/i18n/cs.po delete mode 100644 addons/sale_coupon_delivery/i18n/da.po delete mode 100644 addons/sale_coupon_delivery/i18n/de.po delete mode 100644 addons/sale_coupon_delivery/i18n/el.po delete mode 100644 addons/sale_coupon_delivery/i18n/en_GB.po delete mode 100644 addons/sale_coupon_delivery/i18n/es.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_BO.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_CL.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_CO.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_CR.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_DO.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_EC.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_PE.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_PY.po delete mode 100644 addons/sale_coupon_delivery/i18n/es_VE.po delete mode 100644 addons/sale_coupon_delivery/i18n/et.po delete mode 100644 addons/sale_coupon_delivery/i18n/eu.po delete mode 100644 addons/sale_coupon_delivery/i18n/fa.po delete mode 100644 addons/sale_coupon_delivery/i18n/fi.po delete mode 100644 addons/sale_coupon_delivery/i18n/fo.po delete mode 100644 addons/sale_coupon_delivery/i18n/fr.po delete mode 100644 addons/sale_coupon_delivery/i18n/fr_CA.po delete mode 100644 addons/sale_coupon_delivery/i18n/gl.po delete mode 100644 addons/sale_coupon_delivery/i18n/gu.po delete mode 100644 addons/sale_coupon_delivery/i18n/he.po delete mode 100644 addons/sale_coupon_delivery/i18n/hr.po delete mode 100644 addons/sale_coupon_delivery/i18n/hu.po delete mode 100644 addons/sale_coupon_delivery/i18n/id.po delete mode 100644 addons/sale_coupon_delivery/i18n/is.po delete mode 100644 addons/sale_coupon_delivery/i18n/it.po delete mode 100644 addons/sale_coupon_delivery/i18n/ja.po delete mode 100644 addons/sale_coupon_delivery/i18n/ka.po delete mode 100644 addons/sale_coupon_delivery/i18n/kab.po delete mode 100644 addons/sale_coupon_delivery/i18n/km.po delete mode 100644 addons/sale_coupon_delivery/i18n/ko.po delete mode 100644 addons/sale_coupon_delivery/i18n/lb.po delete mode 100644 addons/sale_coupon_delivery/i18n/lo.po delete mode 100644 addons/sale_coupon_delivery/i18n/lt.po delete mode 100644 addons/sale_coupon_delivery/i18n/lv.po delete mode 100644 addons/sale_coupon_delivery/i18n/mk.po delete mode 100644 addons/sale_coupon_delivery/i18n/mn.po delete mode 100644 addons/sale_coupon_delivery/i18n/nb.po delete mode 100644 addons/sale_coupon_delivery/i18n/ne.po delete mode 100644 addons/sale_coupon_delivery/i18n/nl.po delete mode 100644 addons/sale_coupon_delivery/i18n/nl_BE.po delete mode 100644 addons/sale_coupon_delivery/i18n/pl.po delete mode 100644 addons/sale_coupon_delivery/i18n/pt.po delete mode 100644 addons/sale_coupon_delivery/i18n/pt_BR.po delete mode 100644 addons/sale_coupon_delivery/i18n/ro.po delete mode 100644 addons/sale_coupon_delivery/i18n/ru.po delete mode 100644 addons/sale_coupon_delivery/i18n/sale_coupon_delivery.pot delete mode 100644 addons/sale_coupon_delivery/i18n/sk.po delete mode 100644 addons/sale_coupon_delivery/i18n/sl.po delete mode 100644 addons/sale_coupon_delivery/i18n/sq.po delete mode 100644 addons/sale_coupon_delivery/i18n/sr.po delete mode 100644 addons/sale_coupon_delivery/i18n/sr@latin.po delete mode 100644 addons/sale_coupon_delivery/i18n/sv.po delete mode 100644 addons/sale_coupon_delivery/i18n/th.po delete mode 100644 addons/sale_coupon_delivery/i18n/tr.po delete mode 100644 addons/sale_coupon_delivery/i18n/uk.po delete mode 100644 addons/sale_coupon_delivery/i18n/vi.po delete mode 100644 addons/sale_coupon_delivery/i18n/zh_CN.po delete mode 100644 addons/sale_coupon_delivery/i18n/zh_TW.po delete mode 100644 addons/sale_coupon_delivery/models/__init__.py delete mode 100644 addons/sale_coupon_delivery/models/sale_coupon.py delete mode 100644 addons/sale_coupon_delivery/models/sale_coupon_program.py delete mode 100644 addons/sale_coupon_delivery/models/sale_coupon_reward.py delete mode 100644 addons/sale_coupon_delivery/models/sale_order.py delete mode 100644 addons/sale_coupon_delivery/tests/__init__.py delete mode 100644 addons/sale_coupon_delivery/tests/test_free_shipping_reward.py diff --git a/addons/sale_coupon_delivery/__init__.py b/addons/sale_coupon_delivery/__init__.py deleted file mode 100644 index be9f4fab00a..00000000000 --- a/addons/sale_coupon_delivery/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import models diff --git a/addons/sale_coupon_delivery/__manifest__.py b/addons/sale_coupon_delivery/__manifest__.py deleted file mode 100644 index 922cf9521b1..00000000000 --- a/addons/sale_coupon_delivery/__manifest__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -{ - 'name': "Sale Coupon Delivery", - 'summary': """Allows to offer free shippings in coupon reward""", - 'description': """Integrate coupon mechanism with shipping costs.""", - 'category': 'Sales/Sales', - 'version': '1.0', - 'depends': ['sale_coupon', 'delivery'], - 'data': [ - ], - 'demo': [ - ], - 'auto_install': True, - 'license': 'LGPL-3', -} diff --git a/addons/sale_coupon_delivery/i18n/af.po b/addons/sale_coupon_delivery/i18n/af.po deleted file mode 100644 index eb5b0cecd60..00000000000 --- a/addons/sale_coupon_delivery/i18n/af.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Afrikaans (https://www.transifex.com/odoo/teams/41243/af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Kwotasie" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/am.po b/addons/sale_coupon_delivery/i18n/am.po deleted file mode 100644 index 15036e1c8fe..00000000000 --- a/addons/sale_coupon_delivery/i18n/am.po +++ /dev/null @@ -1,49 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Amharic (https://www.transifex.com/odoo/teams/41243/am/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: am\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ar.po b/addons/sale_coupon_delivery/i18n/ar.po deleted file mode 100644 index 8e7814c228a..00000000000 --- a/addons/sale_coupon_delivery/i18n/ar.po +++ /dev/null @@ -1,78 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Mustafa Rawi , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Mustafa Rawi , 2019\n" -"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"خصم - ستُمنح المكافأة على شكل خصم.\n" -"منتج مجاني - ستُمنح المكافأة على شكل منتج مجاني.\n" -"شحن مجاني - ستُمنح المكافأة على شكل شحن مجاني (يحتاج لموديول التسليم)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "الخصم: " - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "شحن مجاني" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "نوع المكافأة" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "برنامج كوبون المبيعات" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "مكافأة كوبون المبيعات" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "أمر البيع" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "بند أمر المبيعات" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/az.po b/addons/sale_coupon_delivery/i18n/az.po deleted file mode 100644 index 437ef26416d..00000000000 --- a/addons/sale_coupon_delivery/i18n/az.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-08-24 11:48+0000\n" -"Language-Team: Azerbaijani (https://www.transifex.com/odoo/teams/41243/az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/bg.po b/addons/sale_coupon_delivery/i18n/bg.po deleted file mode 100644 index 6bc0c32426d..00000000000 --- a/addons/sale_coupon_delivery/i18n/bg.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Bulgarian (https://www.transifex.com/odoo/teams/41243/bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Оферта" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Ред от нареждане за продажба" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/bs.po b/addons/sale_coupon_delivery/i18n/bs.po deleted file mode 100644 index 682f7d990f8..00000000000 --- a/addons/sale_coupon_delivery/i18n/bs.po +++ /dev/null @@ -1,82 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Martin Trigaux, 2018\n" -"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Popust" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "Prodajni nalog" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Stavka prodajne narudžbe" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ca.po b/addons/sale_coupon_delivery/i18n/ca.po deleted file mode 100644 index 1acb43c5a51..00000000000 --- a/addons/sale_coupon_delivery/i18n/ca.po +++ /dev/null @@ -1,86 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Manel Fernandez , 2019 -# Quim - eccit , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:46+0000\n" -"Last-Translator: Quim - eccit , 2019\n" -"Language-Team: Catalan (https://www.transifex.com/odoo/teams/41243/ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Descompte" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Comanda de venda" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línia comanda de venda" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/cs.po b/addons/sale_coupon_delivery/i18n/cs.po deleted file mode 100644 index beef58451d3..00000000000 --- a/addons/sale_coupon_delivery/i18n/cs.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# trendspotter , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: trendspotter , 2019\n" -"Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Sleva - Odměna bude poskytnuta jako sleva. \n" -"Produkt zdarma - bezplatný produkt bude poskytnut jako odměna \n" -"Doprava zdarma - Doprava zdarma bude poskytnuta jako odměna (Potřebný dodací modul)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Sleva:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Doprava zdarma" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Typ odměny" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Prodejní kupónový program" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Prodejní kupónová odměna " - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Prodejní objednávka" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Řádek zakázky" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Náklady na přepravu nejsou v řádcích objednávky." diff --git a/addons/sale_coupon_delivery/i18n/da.po b/addons/sale_coupon_delivery/i18n/da.po deleted file mode 100644 index 94ad9c986eb..00000000000 --- a/addons/sale_coupon_delivery/i18n/da.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Sanne Kristensen , 2019 -# lhmflexerp , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: lhmflexerp , 2019\n" -"Language-Team: Danish (https://www.transifex.com/odoo/teams/41243/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Rabat: " - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Gratis levering" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Belønningstype" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Salgsrabat program" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Rabatkupon belønning" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Salgsordre" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Salgsordrelinje" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Fragtomkostningerne er ikke i ordrelinjerne." diff --git a/addons/sale_coupon_delivery/i18n/de.po b/addons/sale_coupon_delivery/i18n/de.po deleted file mode 100644 index 1894d2a5f36..00000000000 --- a/addons/sale_coupon_delivery/i18n/de.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Leon Grill , 2019 -# Martin Trigaux, 2019 -# Chris Egal , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Chris Egal , 2019\n" -"Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Rabatt – Prämie wird als Rabatt ausgezahlt.\n" -"Gratisprodukt – Prämie in Form eines Gratisproduktes \n" -"Kostenloser Versand – Prämie in Form von kostenlosem Versand (Liefermodul wird benötigt)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Rabatt:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Kostenloser Versand" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Prämientyp" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Verkaufsgutscheinprogramm" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Verkaufsgutscheinprämie" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Verkaufsauftrag " - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Kundenauftragszeile" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Die Versandkosten sind nicht in den Auftragspositionen enthalten." diff --git a/addons/sale_coupon_delivery/i18n/el.po b/addons/sale_coupon_delivery/i18n/el.po deleted file mode 100644 index d3a219f88e6..00000000000 --- a/addons/sale_coupon_delivery/i18n/el.po +++ /dev/null @@ -1,85 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Kostas Goutoudis , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:46+0000\n" -"Last-Translator: Kostas Goutoudis , 2019\n" -"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Έκπτωση" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Παραγγελία" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Γραμμή Παραγγελίας" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/en_GB.po b/addons/sale_coupon_delivery/i18n/en_GB.po deleted file mode 100644 index f4e046c4de3..00000000000 --- a/addons/sale_coupon_delivery/i18n/en_GB.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: English (United Kingdom) (https://www.transifex.com/odoo/teams/41243/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Sales Order Line" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es.po b/addons/sale_coupon_delivery/i18n/es.po deleted file mode 100644 index 64e6d70420a..00000000000 --- a/addons/sale_coupon_delivery/i18n/es.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Miguel Orueta , 2019 -# Jon Perez , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Jon Perez , 2019\n" -"Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Descuento: La recompensa se otorgará en forma de descuento.\n" -"Producto gratis: Se otorgará un producto gratuito a modo de recompensa\n" -"Envío gratis: Se ofrecerá envío gratuito a modo de recompensa (módulo de entrega requerido)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Descuento:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Envío gratis" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Tipo de recompensa" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programa de cupones de ventas" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Recompensa de cupones de ventas" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea de pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Los gastos de envío no están presentes en las líneas de pedido." diff --git a/addons/sale_coupon_delivery/i18n/es_BO.po b/addons/sale_coupon_delivery/i18n/es_BO.po deleted file mode 100644 index a638d1906d6..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_BO.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Bolivia) (https://www.transifex.com/odoo/teams/41243/es_BO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_BO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_CL.po b/addons/sale_coupon_delivery/i18n/es_CL.po deleted file mode 100644 index 647bb469341..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_CL.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Chile) (https://www.transifex.com/odoo/teams/41243/es_CL/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea de pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_CO.po b/addons/sale_coupon_delivery/i18n/es_CO.po deleted file mode 100644 index cd2298c5ad1..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_CO.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Colombia) (https://www.transifex.com/odoo/teams/41243/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea de la Orden de Venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_CR.po b/addons/sale_coupon_delivery/i18n/es_CR.po deleted file mode 100644 index 66281efb3e5..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_CR.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/odoo/teams/41243/es_CR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_DO.po b/addons/sale_coupon_delivery/i18n/es_DO.po deleted file mode 100644 index d397d311a34..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_DO.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Dominican Republic) (https://www.transifex.com/odoo/teams/41243/es_DO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_DO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_EC.po b/addons/sale_coupon_delivery/i18n/es_EC.po deleted file mode 100644 index 2fdab4eff92..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_EC.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Ecuador) (https://www.transifex.com/odoo/teams/41243/es_EC/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_EC\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_PE.po b/addons/sale_coupon_delivery/i18n/es_PE.po deleted file mode 100644 index 44d361ce349..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_PE.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Peru) (https://www.transifex.com/odoo/teams/41243/es_PE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_PE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea de Pedido de Venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_PY.po b/addons/sale_coupon_delivery/i18n/es_PY.po deleted file mode 100644 index 35f631015c9..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_PY.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Paraguay) (https://www.transifex.com/odoo/teams/41243/es_PY/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_PY\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/es_VE.po b/addons/sale_coupon_delivery/i18n/es_VE.po deleted file mode 100644 index b50293d6f2c..00000000000 --- a/addons/sale_coupon_delivery/i18n/es_VE.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Venezuela) (https://www.transifex.com/odoo/teams/41243/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/et.po b/addons/sale_coupon_delivery/i18n/et.po deleted file mode 100644 index 61c4a38fd57..00000000000 --- a/addons/sale_coupon_delivery/i18n/et.po +++ /dev/null @@ -1,85 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Wanradt Koell , 2018 -# Arma Gedonsky , 2018 -# Eneli Õigus , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-08-24 11:48+0000\n" -"Last-Translator: Eneli Õigus , 2018\n" -"Language-Team: Estonian (https://www.transifex.com/odoo/teams/41243/et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Allahindlus" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "Müügitellimus" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Müügitellimuse rida" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Transpordi hind ei ole tellimuse ridadel." diff --git a/addons/sale_coupon_delivery/i18n/eu.po b/addons/sale_coupon_delivery/i18n/eu.po deleted file mode 100644 index 2d4b5106949..00000000000 --- a/addons/sale_coupon_delivery/i18n/eu.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Basque (https://www.transifex.com/odoo/teams/41243/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Aurrekontua" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Salmenta lerroa" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/fa.po b/addons/sale_coupon_delivery/i18n/fa.po deleted file mode 100644 index b25a60b9ff5..00000000000 --- a/addons/sale_coupon_delivery/i18n/fa.po +++ /dev/null @@ -1,83 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Hamid Darabi, 2018 -# Martin Trigaux, 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Martin Trigaux, 2018\n" -"Language-Team: Persian (https://www.transifex.com/odoo/teams/41243/fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "تخفیف" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "سفارش فروش" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "سطر سفارش‌فروش" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/fi.po b/addons/sale_coupon_delivery/i18n/fi.po deleted file mode 100644 index c27329a822f..00000000000 --- a/addons/sale_coupon_delivery/i18n/fi.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Kari Lindgren , 2018 -# Jussi Lehto , 2018 -# Tuomo Aura , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Tuomo Aura , 2018\n" -"Language-Team: Finnish (https://www.transifex.com/odoo/teams/41243/fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Alennus" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "Myyntitilaus" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Myyntitilauksen rivi" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/fo.po b/addons/sale_coupon_delivery/i18n/fo.po deleted file mode 100644 index 2fc451c679d..00000000000 --- a/addons/sale_coupon_delivery/i18n/fo.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Faroese (https://www.transifex.com/odoo/teams/41243/fo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Søluordra-linja" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/fr.po b/addons/sale_coupon_delivery/i18n/fr.po deleted file mode 100644 index dcaa84e23ad..00000000000 --- a/addons/sale_coupon_delivery/i18n/fr.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Eloïse Stilmant , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Eloïse Stilmant , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Remise : la récompense sera appliquée sous forme de remise.\n" -"Produit gratuit : un produit sera offert à titre de récompense. \n" -"Livraison gratuite : la livraison sera offerte à titre de récompense (module Livraison nécessaire)." - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Réduction:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Livraison gratuite" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Type de récompense" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programme de coupon de vente" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Récompense de coupon de vente" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Bon de commande" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Ligne de bons de commande" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Les frais de livraison ne figurent pas dans les lignes de commande." diff --git a/addons/sale_coupon_delivery/i18n/fr_CA.po b/addons/sale_coupon_delivery/i18n/fr_CA.po deleted file mode 100644 index 2fffc926ccf..00000000000 --- a/addons/sale_coupon_delivery/i18n/fr_CA.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: French (Canada) (https://www.transifex.com/odoo/teams/41243/fr_CA/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fr_CA\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Soumission" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/gl.po b/addons/sale_coupon_delivery/i18n/gl.po deleted file mode 100644 index ed4fc8a0ad9..00000000000 --- a/addons/sale_coupon_delivery/i18n/gl.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Galician (https://www.transifex.com/odoo/teams/41243/gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Liña de ordes de venda" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/gu.po b/addons/sale_coupon_delivery/i18n/gu.po deleted file mode 100644 index 819195c4fc3..00000000000 --- a/addons/sale_coupon_delivery/i18n/gu.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Language-Team: Gujarati (https://www.transifex.com/odoo/teams/41243/gu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: gu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/he.po b/addons/sale_coupon_delivery/i18n/he.po deleted file mode 100644 index 3aa7bd9dea8..00000000000 --- a/addons/sale_coupon_delivery/i18n/he.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# ZVI BLONDER , 2019 -# Amit Spilman , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Amit Spilman , 2019\n" -"Language-Team: Hebrew (https://www.transifex.com/odoo/teams/41243/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "הזמנת לקוח" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "שורת הזמנת לקוח" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/hr.po b/addons/sale_coupon_delivery/i18n/hr.po deleted file mode 100644 index 70c962ae8f9..00000000000 --- a/addons/sale_coupon_delivery/i18n/hr.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Bole , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Bole , 2019\n" -"Language-Team: Croatian (https://www.transifex.com/odoo/teams/41243/hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Besplatna dostava" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Prodajni nalog" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Stavka prodajnog naloga" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/hu.po b/addons/sale_coupon_delivery/i18n/hu.po deleted file mode 100644 index 6334c245a83..00000000000 --- a/addons/sale_coupon_delivery/i18n/hu.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# krnkris, 2019 -# gezza , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: gezza , 2019\n" -"Language-Team: Hungarian (https://www.transifex.com/odoo/teams/41243/hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Vásárlói megrendelés" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Értékesítési megrendelés sor" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/id.po b/addons/sale_coupon_delivery/i18n/id.po deleted file mode 100644 index 930f5051437..00000000000 --- a/addons/sale_coupon_delivery/i18n/id.po +++ /dev/null @@ -1,53 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Andi Fadhel , 2017 -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Indonesian (https://www.transifex.com/odoo/teams/41243/id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Quotation" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Daftr Order Penjualan" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/is.po b/addons/sale_coupon_delivery/i18n/is.po deleted file mode 100644 index 0f52cd1de41..00000000000 --- a/addons/sale_coupon_delivery/i18n/is.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Birgir Steinarsson , 2018 -# Bjorn Ingvarsson , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-08-24 11:48+0000\n" -"Last-Translator: Bjorn Ingvarsson , 2018\n" -"Language-Team: Icelandic (https://www.transifex.com/odoo/teams/41243/is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Afsláttur" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Sales Order Line" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/it.po b/addons/sale_coupon_delivery/i18n/it.po deleted file mode 100644 index 8df7d0f9dce..00000000000 --- a/addons/sale_coupon_delivery/i18n/it.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Sergio Zanchetta , 2019 -# Paolo Valier, 2019 -# Léonie Bouchat , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Léonie Bouchat , 2019\n" -"Language-Team: Italian (https://www.transifex.com/odoo/teams/41243/it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Sconto - Il premio sarà applicato sotto forma di sconto.\n" -"Prodotto gratuito - Un prodotto sarà offerto come premio\n" -"Spedizione gratuita - La spedizione sarà offerta come premio (modulo di consegna necessaria)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Sconto:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Spedizione gratuita" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Tipo premio" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programma buono sconto vendita" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Premio buono sconto vendita" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Ordine di vendita" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Riga ordine di vendita" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Le spese di spedizione non sono incluse nelle righe di ordine." diff --git a/addons/sale_coupon_delivery/i18n/ja.po b/addons/sale_coupon_delivery/i18n/ja.po deleted file mode 100644 index 954c5d44bfc..00000000000 --- a/addons/sale_coupon_delivery/i18n/ja.po +++ /dev/null @@ -1,82 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Yoshi Tashiro , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Yoshi Tashiro , 2018\n" -"Language-Team: Japanese (https://www.transifex.com/odoo/teams/41243/ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "値引" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "販売オーダ" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "販売オーダ明細" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ka.po b/addons/sale_coupon_delivery/i18n/ka.po deleted file mode 100644 index 43ba7f37138..00000000000 --- a/addons/sale_coupon_delivery/i18n/ka.po +++ /dev/null @@ -1,53 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -# Giorgi Melitauri , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Giorgi Melitauri , 2018\n" -"Language-Team: Georgian (https://www.transifex.com/odoo/teams/41243/ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ka\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "ციტატა" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "გაყიდვის ორდერის ხაზი" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/kab.po b/addons/sale_coupon_delivery/i18n/kab.po deleted file mode 100644 index ce9215d9e8d..00000000000 --- a/addons/sale_coupon_delivery/i18n/kab.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Kabyle (https://www.transifex.com/odoo/teams/41243/kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Asuter n ssuma" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Izirig n tladna n uznuzu" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/km.po b/addons/sale_coupon_delivery/i18n/km.po deleted file mode 100644 index a2039e73f6b..00000000000 --- a/addons/sale_coupon_delivery/i18n/km.po +++ /dev/null @@ -1,82 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Samkhann Seang , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Samkhann Seang , 2018\n" -"Language-Team: Khmer (https://www.transifex.com/odoo/teams/41243/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "បញ្ចុះតម្លៃ" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ko.po b/addons/sale_coupon_delivery/i18n/ko.po deleted file mode 100644 index a90912bb91c..00000000000 --- a/addons/sale_coupon_delivery/i18n/ko.po +++ /dev/null @@ -1,85 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# 최재호 , 2018 -# Linkup , 2018 -# Seongseok Shin , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-08-24 11:48+0000\n" -"Last-Translator: Seongseok Shin , 2018\n" -"Language-Team: Korean (https://www.transifex.com/odoo/teams/41243/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "할인" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "판매 주문" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "판매 주문 라인" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/lb.po b/addons/sale_coupon_delivery/i18n/lb.po deleted file mode 100644 index 2e21968fbc5..00000000000 --- a/addons/sale_coupon_delivery/i18n/lb.po +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/lo.po b/addons/sale_coupon_delivery/i18n/lo.po deleted file mode 100644 index a398d532c21..00000000000 --- a/addons/sale_coupon_delivery/i18n/lo.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Lao (https://www.transifex.com/odoo/teams/41243/lo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lo\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "ໃບສະເໜີລາຄາ" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "ລາຍການສິນຄ້າທີ່ສັ່ງຊື້" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/lt.po b/addons/sale_coupon_delivery/i18n/lt.po deleted file mode 100644 index 634fe3e5b15..00000000000 --- a/addons/sale_coupon_delivery/i18n/lt.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Silvija Butko , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Silvija Butko , 2019\n" -"Language-Team: Lithuanian (https://www.transifex.com/odoo/teams/41243/lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Nemokamas pristatymas" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Pardavimo užsakymas" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Pardavimo užsakymo eilutė" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/lv.po b/addons/sale_coupon_delivery/i18n/lv.po deleted file mode 100644 index ed2c37dbfe3..00000000000 --- a/addons/sale_coupon_delivery/i18n/lv.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Latvian (https://www.transifex.com/odoo/teams/41243/lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Tāme" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Pasūtījuma Rinda" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/mk.po b/addons/sale_coupon_delivery/i18n/mk.po deleted file mode 100644 index 492e8bb4a59..00000000000 --- a/addons/sale_coupon_delivery/i18n/mk.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Macedonian (https://www.transifex.com/odoo/teams/41243/mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Цитат" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Ставка од налог за продажба" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/mn.po b/addons/sale_coupon_delivery/i18n/mn.po deleted file mode 100644 index 10c8b90f1ec..00000000000 --- a/addons/sale_coupon_delivery/i18n/mn.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Baskhuu Lodoikhuu , 2019 -# Baasansuren Sharavsuren , 2019 -# nurbakhit nurka , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: nurbakhit nurka , 2019\n" -"Language-Team: Mongolian (https://www.transifex.com/odoo/teams/41243/mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Шагналын төрөл" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Борлуулалтын купон шагнал" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Борлуулалтын захиалга" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Борлуулалтын захиалгын мөр" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/nb.po b/addons/sale_coupon_delivery/i18n/nb.po deleted file mode 100644 index 56558e4cc3d..00000000000 --- a/addons/sale_coupon_delivery/i18n/nb.po +++ /dev/null @@ -1,75 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Norwegian Bokmål (https://www.transifex.com/odoo/teams/41243/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Gratis frakt" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Belønningstype" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Salgskupongprogram" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Salgskupongbelønning" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Salgsordre" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Salgsordrelinje" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Fraktkostnadene er ikke i ordrelinjene." diff --git a/addons/sale_coupon_delivery/i18n/ne.po b/addons/sale_coupon_delivery/i18n/ne.po deleted file mode 100644 index 16ad7aca12a..00000000000 --- a/addons/sale_coupon_delivery/i18n/ne.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Bishisht Bhatta , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Bishisht Bhatta , 2017\n" -"Language-Team: Nepali (https://www.transifex.com/odoo/teams/41243/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "उद्धरण" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "सेल्स अर्डर लाइन" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/nl.po b/addons/sale_coupon_delivery/i18n/nl.po deleted file mode 100644 index f3e6abfc14c..00000000000 --- a/addons/sale_coupon_delivery/i18n/nl.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Erwin van der Ploeg , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Erwin van der Ploeg , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Korting - Beloning wordt gegeven als korting.\n" -"Gratis product - Gratis product wordt als beloning gegeven.\n" -"Gratis verzending - Gratis verzending wordt als beloning gegeven (verzend module is nodig)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Korting:" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Gratis verzending" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Type beloning" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Verkoop kortingsbonnenprogramma" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Kortingsbon beloning" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Verkooporder" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Verkooporderregel" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "De verzendkosten zitten niet in de orderregels" diff --git a/addons/sale_coupon_delivery/i18n/nl_BE.po b/addons/sale_coupon_delivery/i18n/nl_BE.po deleted file mode 100644 index e3e123efaff..00000000000 --- a/addons/sale_coupon_delivery/i18n/nl_BE.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Dutch (Belgium) (https://www.transifex.com/odoo/teams/41243/nl_BE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: nl_BE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Offerte" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Verkooporderregel" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/pl.po b/addons/sale_coupon_delivery/i18n/pl.po deleted file mode 100644 index 25ed09681e7..00000000000 --- a/addons/sale_coupon_delivery/i18n/pl.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Tomasz Leppich , 2019 -# Paweł Wodyński , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Paweł Wodyński , 2019\n" -"Language-Team: Polish (https://www.transifex.com/odoo/teams/41243/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Rabat - Nagroda będzie udzielana jako zniżka.\n" -"Bezpłatny produkt - darmowy produkt zostanie dostarczony jako nagroda \n" -"Darmowa wysyłka - darmowa dostawa będzie dostarczona jako nagroda (potrzebujesz modułu dostawy)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Darmowa dostawa" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Program do sprzedaży kuponów" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Nagroda kuponu sprzedaży" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Zamówienie sprzedaży" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Pozycja zamówienia sprzedaży" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Koszty wysyłki nie znajdują się w wierszach zamówienia." diff --git a/addons/sale_coupon_delivery/i18n/pt.po b/addons/sale_coupon_delivery/i18n/pt.po deleted file mode 100644 index 27c2071d26a..00000000000 --- a/addons/sale_coupon_delivery/i18n/pt.po +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Language-Team: Portuguese (https://www.transifex.com/odoo/teams/41243/pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/pt_BR.po b/addons/sale_coupon_delivery/i18n/pt_BR.po deleted file mode 100644 index 4d0366e84e0..00000000000 --- a/addons/sale_coupon_delivery/i18n/pt_BR.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Mateus Lopes , 2019 -# grazziano , 2019 -# mariana rodrigues , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: mariana rodrigues , 2019\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/odoo/teams/41243/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Desconto - A recompensa será fornecida como desconto.\n" -"Produto grátis - O produto gratuito será fornecido como recompensa\n" -"Frete Grátis - O envio gratuito será fornecido como recompensa (Precisa de um módulo de entrega)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Frete grátis" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programa de cupom de vendas" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Recompensa de cupom de vendas" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Ordem de Venda" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Linha do Pedido de Vendas" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ro.po b/addons/sale_coupon_delivery/i18n/ro.po deleted file mode 100644 index e09ac22732b..00000000000 --- a/addons/sale_coupon_delivery/i18n/ro.po +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Language-Team: Romanian (https://www.transifex.com/odoo/teams/41243/ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/ru.po b/addons/sale_coupon_delivery/i18n/ru.po deleted file mode 100644 index 01281f0ac5f..00000000000 --- a/addons/sale_coupon_delivery/i18n/ru.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Konstantin Korovin , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Konstantin Korovin , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Заказ на продажу" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Строка заказа на продажу" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sale_coupon_delivery.pot b/addons/sale_coupon_delivery/i18n/sale_coupon_delivery.pot deleted file mode 100644 index 5628f898e06..00000000000 --- a/addons/sale_coupon_delivery/i18n/sale_coupon_delivery.pot +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~14.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-12 07:50+0000\n" -"PO-Revision-Date: 2021-07-12 07:50+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_coupon_program -msgid "Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_coupon_reward -msgid "Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: %s" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sk.po b/addons/sale_coupon_delivery/i18n/sk.po deleted file mode 100644 index bd65a63fbde..00000000000 --- a/addons/sale_coupon_delivery/i18n/sk.po +++ /dev/null @@ -1,83 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2018 -# Jaroslav Bosansky , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Jaroslav Bosansky , 2018\n" -"Language-Team: Slovak (https://www.transifex.com/odoo/teams/41243/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Zľava" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "Objednávka predaja" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Položky objednávky" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sl.po b/addons/sale_coupon_delivery/i18n/sl.po deleted file mode 100644 index 7b0ee62620f..00000000000 --- a/addons/sale_coupon_delivery/i18n/sl.po +++ /dev/null @@ -1,49 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Slovenian (https://www.transifex.com/odoo/teams/41243/sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sq.po b/addons/sale_coupon_delivery/i18n/sq.po deleted file mode 100644 index 390094a778b..00000000000 --- a/addons/sale_coupon_delivery/i18n/sq.po +++ /dev/null @@ -1,49 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Albanian (https://www.transifex.com/odoo/teams/41243/sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sr.po b/addons/sale_coupon_delivery/i18n/sr.po deleted file mode 100644 index 25e665254ff..00000000000 --- a/addons/sale_coupon_delivery/i18n/sr.po +++ /dev/null @@ -1,82 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-09-21 14:06+0000\n" -"Last-Translator: Martin Trigaux, 2018\n" -"Language-Team: Serbian (https://www.transifex.com/odoo/teams/41243/sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "Nalog za prodaju" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sr@latin.po b/addons/sale_coupon_delivery/i18n/sr@latin.po deleted file mode 100644 index d735ce50eed..00000000000 --- a/addons/sale_coupon_delivery/i18n/sr@latin.po +++ /dev/null @@ -1,53 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Nemanja Dragovic , 2017 -# Djordje Marjanovic , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Djordje Marjanovic , 2017\n" -"Language-Team: Serbian (Latin) (https://www.transifex.com/odoo/teams/41243/sr%40latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Quotation" -msgstr "Ponuda" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Stavka naloga za prodaju" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/sv.po b/addons/sale_coupon_delivery/i18n/sv.po deleted file mode 100644 index 3652b591842..00000000000 --- a/addons/sale_coupon_delivery/i18n/sv.po +++ /dev/null @@ -1,85 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:46+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Swedish (https://www.transifex.com/odoo/teams/41243/sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "Rabatt" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Kundorder" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Orderrad" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/th.po b/addons/sale_coupon_delivery/i18n/th.po deleted file mode 100644 index f1292adb99a..00000000000 --- a/addons/sale_coupon_delivery/i18n/th.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2018 -# Khwunchai Jaengsawang , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:06+0000\n" -"PO-Revision-Date: 2018-08-24 11:48+0000\n" -"Last-Translator: Khwunchai Jaengsawang , 2018\n" -"Language-Team: Thai (https://www.transifex.com/odoo/teams/41243/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Discount" -msgstr "ส่วนลด" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:33 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: selection:sale.coupon.reward,reward_type:0 -msgid "Free Product" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:18 -#: selection:sale.coupon.reward,reward_type:0 -#, python-format -msgid "Free Shipping" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "รายการคำสั่งขาย" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:13 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:23 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/i18n/tr.po b/addons/sale_coupon_delivery/i18n/tr.po deleted file mode 100644 index 39197b01145..00000000000 --- a/addons/sale_coupon_delivery/i18n/tr.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Ediz Duman , 2019 -# Martin Trigaux, 2019 -# Ertuğrul Güreş , 2019 -# Umur Akın , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Umur Akın , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"İndirim - Ödül indirim olarak karşılanacak.\n" -"Ücretsiz Ürün - Ücretsiz ürün ödül olarak karşılanacak\n" -"Ücretsiz Sevkiyat - Ücretsiz sevkiyat ödül olarak karşılanacak ( Teslimat modülü gereklidir)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Ücretsiz Sevkiyat" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Ödül Türü" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Satış Kuponu Programı" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Satış Kuponu Ödülü" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Satış Siparişi" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Satış Sipariş Satırı" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Sevkiyat maliyetleri sipariş satırlarında değildir." diff --git a/addons/sale_coupon_delivery/i18n/uk.po b/addons/sale_coupon_delivery/i18n/uk.po deleted file mode 100644 index 53e468a299c..00000000000 --- a/addons/sale_coupon_delivery/i18n/uk.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Alina Lisnenko , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Alina Lisnenko , 2019\n" -"Language-Team: Ukrainian (https://www.transifex.com/odoo/teams/41243/uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"Знижка - винагорода буде надаватися у вигляді знижки.\n" -"Безкоштовний товар - безкоштовний товар буде надаватися як винагорода\n" -"Безкоштовна доставка - безкоштовна доставка буде надана в якості винагороди (Необхідний модуль доставки)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "Знижка: " - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Безкоштовна доставка" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Тип нагороди" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Купонна програма продажу" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Нагорода продажу купонів" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Замовлення на продаж" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Рядок замовлення на продаж" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Вартість доставки не в рядках замовлення." diff --git a/addons/sale_coupon_delivery/i18n/vi.po b/addons/sale_coupon_delivery/i18n/vi.po deleted file mode 100644 index 899c3e47117..00000000000 --- a/addons/sale_coupon_delivery/i18n/vi.po +++ /dev/null @@ -1,76 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Nancy Momoland , 2019 -# Chinh Chinh , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: Chinh Chinh , 2019\n" -"Language-Team: Vietnamese (https://www.transifex.com/odoo/teams/41243/vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "Miễn phí giao hàng" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "Loại phần thưởng" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Chương trình phiếu giảm giá bán hàng" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "Phần thưởng phiếu giảm giá bán hàng" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "Đơn bán hàng" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "Chi tiết đơn hàng" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "Không đưa giá vận chuyển vào chi tiết đơn hàng." diff --git a/addons/sale_coupon_delivery/i18n/zh_CN.po b/addons/sale_coupon_delivery/i18n/zh_CN.po deleted file mode 100644 index 606f4d1ea0c..00000000000 --- a/addons/sale_coupon_delivery/i18n/zh_CN.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# Jeffery CHEN , 2019 -# inspur qiuguodong , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: inspur qiuguodong , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"折扣 - 奖励将作为折扣提供。\n" -"免费产品 - 免费产品将作为奖励提供\n" -"免费送货 - 免费送货将提供作为奖励(需要交付模块)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "折扣: " - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "免费送货" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "奖励类型" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "销售优惠券方案" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "销售券奖励" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "销售订单" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "销售订单分录" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "运输费用不是按订单行中的" diff --git a/addons/sale_coupon_delivery/i18n/zh_TW.po b/addons/sale_coupon_delivery/i18n/zh_TW.po deleted file mode 100644 index e2bef1f76bc..00000000000 --- a/addons/sale_coupon_delivery/i18n/zh_TW.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_coupon_delivery -# -# Translators: -# Martin Trigaux, 2019 -# 敬雲 林 , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" -"PO-Revision-Date: 2019-08-26 09:14+0000\n" -"Last-Translator: 敬雲 林 , 2019\n" -"Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,help:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "" -"Discount - Reward will be provided as discount.\n" -"Free Product - Free product will be provide as reward \n" -"Free Shipping - Free shipping will be provided as reward (Need delivery module)" -msgstr "" -"折扣獎勵將提供折扣。\n" -"\n" -"免費的產品-免費產品將提供獎勵\n" -"\n" -"免費送貨,免費送貨將提供獎勵(需要交付模組)" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_order.py:0 -#, python-format -msgid "Discount: " -msgstr "折扣: " - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon_reward.py:0 -#: model:ir.model.fields.selection,name:sale_coupon_delivery.selection__sale_coupon_reward__reward_type__free_shipping -#, python-format -msgid "Free Shipping" -msgstr "免費送貨" - -#. module: sale_coupon_delivery -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_program__reward_type -#: model:ir.model.fields,field_description:sale_coupon_delivery.field_sale_coupon_reward__reward_type -msgid "Reward Type" -msgstr "獎勵類型" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "銷售優惠計劃" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_coupon_reward -msgid "Sales Coupon Reward" -msgstr "銷售券獎勵" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order -msgid "Sales Order" -msgstr "銷售訂單" - -#. module: sale_coupon_delivery -#: model:ir.model,name:sale_coupon_delivery.model_sale_order_line -msgid "Sales Order Line" -msgstr "銷售訂單明細" - -#. module: sale_coupon_delivery -#: code:addons/sale_coupon_delivery/models/sale_coupon.py:0 -#: code:addons/sale_coupon_delivery/models/sale_coupon_program.py:0 -#, python-format -msgid "The shipping costs are not in the order lines." -msgstr "" diff --git a/addons/sale_coupon_delivery/models/__init__.py b/addons/sale_coupon_delivery/models/__init__.py deleted file mode 100644 index 9c652c3aac3..00000000000 --- a/addons/sale_coupon_delivery/models/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import sale_order -from . import sale_coupon_program -from . import sale_coupon_reward \ No newline at end of file diff --git a/addons/sale_coupon_delivery/models/sale_coupon.py b/addons/sale_coupon_delivery/models/sale_coupon.py deleted file mode 100644 index df1f7204478..00000000000 --- a/addons/sale_coupon_delivery/models/sale_coupon.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - - -from odoo import models, _ - - -class Coupon(models.Model): - _inherit = "coupon.coupon" - - def _check_coupon_code(self, order_date, partner_id, **kwargs): - order = kwargs.get('order', False) - if order and self.program_id.reward_type == 'free_shipping' and not order.order_line.filtered(lambda line: line.is_delivery): - return {'error': _('The shipping costs are not in the order lines.')} - return super(Coupon, self)._check_coupon_code(order_date, partner_id, **kwargs) diff --git a/addons/sale_coupon_delivery/models/sale_coupon_program.py b/addons/sale_coupon_delivery/models/sale_coupon_program.py deleted file mode 100644 index aefde1c290b..00000000000 --- a/addons/sale_coupon_delivery/models/sale_coupon_program.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - - -from odoo import models, _, api - - -class CouponProgram(models.Model): - _inherit = "coupon.program" - - def _filter_not_ordered_reward_programs(self, order): - """ - Returns the programs when the reward is actually in the order lines - """ - programs = super(CouponProgram, self)._filter_not_ordered_reward_programs(order) - # Do not filter on free delivery programs. As delivery_unset is called everywhere (which is - # rather stupid), the delivery line is unliked to be created again instead of writing on it to - # modify the price_unit. That way, the reward is unlink and is not set back again. - return programs - - def _check_promo_code(self, order, coupon_code): - if self.reward_type == 'free_shipping' and not any(line.is_delivery for line in order.order_line): - return {'error': _('The shipping costs are not in the order lines.')} - return super(CouponProgram, self)._check_promo_code(order, coupon_code) diff --git a/addons/sale_coupon_delivery/models/sale_coupon_reward.py b/addons/sale_coupon_delivery/models/sale_coupon_reward.py deleted file mode 100644 index 589db2a224a..00000000000 --- a/addons/sale_coupon_delivery/models/sale_coupon_reward.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models, _ - - -class CouponReward(models.Model): - _inherit = 'coupon.reward' - _description = "Coupon Reward" - - reward_type = fields.Selection(selection_add=[('free_shipping', 'Free Shipping')]) - - def name_get(self): - result = [] - reward_names = super(CouponReward, self).name_get() - free_shipping_reward_ids = self.filtered(lambda reward: reward.reward_type == 'free_shipping').ids - for res in reward_names: - result.append((res[0], res[0] in free_shipping_reward_ids and _("Free Shipping") or res[1])) - return result diff --git a/addons/sale_coupon_delivery/models/sale_order.py b/addons/sale_coupon_delivery/models/sale_order.py deleted file mode 100644 index 96e01274eb0..00000000000 --- a/addons/sale_coupon_delivery/models/sale_order.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models, _ - -class SaleOrder(models.Model): - _inherit = "sale.order" - - def _get_no_effect_on_threshold_lines(self): - self.ensure_one() - # Do not count shipping and free shipping - free_delivery_product = self.env['coupon.program'].search([('reward_type', '=', 'free_shipping')]).mapped('discount_line_product_id') - lines = self.order_line.filtered(lambda line: line.is_delivery or line.product_id in free_delivery_product) - return lines + super(SaleOrder, self)._get_no_effect_on_threshold_lines() - - def _get_paid_order_lines(self): - """ Returns the taxes included sale order total amount without the rewards amount""" - free_reward_product = self.env['coupon.program'].search([('reward_type', '=', 'product')]).mapped('discount_line_product_id') - return self.order_line.filtered(lambda x: not x._is_not_sellable_line() or x.product_id in free_reward_product) - - def _get_reward_line_values(self, program): - if program.reward_type == 'free_shipping': - return [self._get_reward_values_free_shipping(program)] - else: - return super(SaleOrder, self)._get_reward_line_values(program) - - def _get_reward_values_free_shipping(self, program): - delivery_line = self.order_line.filtered(lambda x: x.is_delivery) - taxes = delivery_line.product_id.taxes_id.filtered(lambda t: t.company_id.id == self.company_id.id) - taxes = self.fiscal_position_id.map_tax(taxes) - return { - 'name': _("Discount: %s", program.name), - 'product_id': program.discount_line_product_id.id, - 'price_unit': delivery_line and - delivery_line.price_unit or 0.0, - 'product_uom_qty': 1.0, - 'product_uom': program.discount_line_product_id.uom_id.id, - 'order_id': self.id, - 'is_reward_line': True, - 'tax_id': [(4, tax.id, False) for tax in taxes], - } - - def _get_cheapest_line(self): - # Unit prices tax included - return min(self.order_line.filtered(lambda x: not x._is_not_sellable_line() and x.price_reduce > 0), key=lambda x: x['price_reduce']) - -class SalesOrderLine(models.Model): - _inherit = "sale.order.line" - - def unlink(self): - # Due to delivery_set and delivery_unset methods that are called everywhere, don't unlink - # reward lines if it's a free shipping - self = self.exists() - orders = self.mapped('order_id') - applied_programs = orders.mapped('no_code_promo_program_ids') + \ - orders.mapped('code_promo_program_id') + \ - orders.mapped('applied_coupon_ids').mapped('program_id') - free_shipping_products = applied_programs.filtered( - lambda program: program.reward_type == 'free_shipping' - ).mapped('discount_line_product_id') - lines_to_unlink = self.filtered(lambda line: line.product_id not in free_shipping_products) - # Unless these lines are the last ones - res = super(SalesOrderLine, lines_to_unlink).unlink() - only_free_shipping_line_orders = orders.filtered(lambda order: len(order.order_line.ids) == 1 and order.order_line.is_reward_line) - super(SalesOrderLine, only_free_shipping_line_orders.mapped('order_line')).unlink() - return res diff --git a/addons/sale_coupon_delivery/tests/__init__.py b/addons/sale_coupon_delivery/tests/__init__.py deleted file mode 100644 index 0f8b647a735..00000000000 --- a/addons/sale_coupon_delivery/tests/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import test_free_shipping_reward \ No newline at end of file diff --git a/addons/sale_coupon_delivery/tests/test_free_shipping_reward.py b/addons/sale_coupon_delivery/tests/test_free_shipping_reward.py deleted file mode 100644 index 81fc7a241ad..00000000000 --- a/addons/sale_coupon_delivery/tests/test_free_shipping_reward.py +++ /dev/null @@ -1,255 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.addons.sale_coupon.tests.common import TestSaleCouponCommon -from odoo.tests import Form, tagged - - -@tagged('post_install', '-at_install') -class TestSaleCouponProgramRules(TestSaleCouponCommon): - - @classmethod - def setUpClass(cls): - super(TestSaleCouponProgramRules, cls).setUpClass() - cls.iPadMini = cls.env['product.product'].create({'name': 'Large Cabinet', 'list_price': 320.0}) - tax_15pc_excl = cls.env['account.tax'].create({ - 'name': "15% Tax excl", - 'amount_type': 'percent', - 'amount': 15, - }) - cls.product_delivery_poste = cls.env['product.product'].create({ - 'name': 'The Poste', - 'type': 'service', - 'categ_id': cls.env.ref('delivery.product_category_deliveries').id, - 'sale_ok': False, - 'purchase_ok': False, - 'list_price': 20.0, - 'taxes_id': [(6, 0, [tax_15pc_excl.id])], - }) - cls.carrier = cls.env['delivery.carrier'].create({ - 'name': 'The Poste', - 'fixed_price': 20.0, - 'delivery_type': 'base_on_rule', - 'product_id': cls.product_delivery_poste.id, - }) - cls.env['delivery.price.rule'].create([{ - 'carrier_id': cls.carrier.id, - 'max_value': 5, - 'list_base_price': 20, - }, { - 'carrier_id': cls.carrier.id, - 'operator': '>=', - 'max_value': 5, - 'list_base_price': 50, - }, { - 'carrier_id': cls.carrier.id, - 'operator': '>=', - 'max_value': 300, - 'variable': 'price', - 'list_base_price': 0, - }]) - - - # Test a free shipping reward + some expected behavior - # (automatic line addition or removal) - - def test_free_shipping_reward(self): - # Test case 1: The minimum amount is not reached, the reward should - # not be created - self.immediate_promotion_program.active = False - self.env['coupon.program'].create({ - 'name': 'Free Shipping if at least 100 euros', - 'promo_code_usage': 'no_code_needed', - 'reward_type': 'free_shipping', - 'rule_minimum_amount': 100.0, - 'rule_minimum_amount_tax_inclusion': 'tax_included', - 'active': True, - }) - - order = self.env['sale.order'].create({ - 'partner_id': self.steve.id, - }) - - # Price of order will be 5*1.15 = 5.75 (tax included) - order.write({'order_line': [ - (0, False, { - 'product_id': self.product_B.id, - 'name': 'Product B', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }) - ]}) - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 1) - - # I add delivery cost in Sales order - delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ - 'default_order_id': order.id, - 'default_carrier_id': self.env['delivery.carrier'].search([])[1] - })) - choose_delivery_carrier = delivery_wizard.save() - choose_delivery_carrier.button_confirm() - - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2) - - # Test Case 1b: amount is not reached but is on a threshold - # The amount of deliverable product + the one of the delivery exceeds the minimum amount - # yet the program shouldn't be applied - # Order price will be 5.75 + 81.74*1.15 = 99.75 - order.write({'order_line': [ - (0, False, { - 'product_id': self.product_B.id, - 'name': 'Product 1B', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - 'price_unit': 81.74, - }) - ]}) - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 3) - - # Test case 2: the amount is sufficient, the shipping should - # be reimbursed - order.write({'order_line': [ - (0, False, { - 'product_id': self.product_A.id, - 'name': 'Product 1', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - 'price_unit': 0.30, - }) - ]}) - - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 5) - - # Test case 3: the amount is not sufficient now, the reward should be removed - order.write({'order_line': [ - (2, order.order_line.filtered(lambda line: line.product_id.id == self.product_A.id).id, False) - ]}) - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 3) - - def test_shipping_cost(self): - # Free delivery should not be taken into account when checking for minimum required threshold - p_minimum_threshold_free_delivery = self.env['coupon.program'].create({ - 'name': 'free shipping if > 872 tax exl', - 'promo_code_usage': 'no_code_needed', - 'reward_type': 'free_shipping', - 'program_type': 'promotion_program', - 'rule_minimum_amount': 872, - }) - p_minimum_threshold_discount = self.env['coupon.program'].create({ - 'name': '10% reduction if > 872 tax exl', - 'promo_code_usage': 'no_code_needed', - 'reward_type': 'discount', - 'program_type': 'promotion_program', - 'discount_type': 'percentage', - 'discount_percentage': 10.0, - 'rule_minimum_amount': 872, - }) - order = self.empty_order - self.iPadMini.taxes_id = self.tax_10pc_incl - sol1 = self.env['sale.order.line'].create({ - 'product_id': self.iPadMini.id, - 'name': 'Large Cabinet', - 'product_uom_qty': 3.0, - 'order_id': order.id, - }) - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2, "We should get the 10% discount line since we bought 872.73$") - order.carrier_id = self.env['delivery.carrier'].search([])[1] - - # I add delivery cost in Sales order - delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ - 'default_order_id': order.id, - 'default_carrier_id': self.env['delivery.carrier'].search([])[1] - })) - choose_delivery_carrier = delivery_wizard.save() - choose_delivery_carrier.button_confirm() - - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 3, "We should get the delivery line but not the free delivery since we are below 872.73$ with the 10% discount") - - p_minimum_threshold_free_delivery.sequence = 10 - (order.order_line - sol1).unlink() - # I add delivery cost in Sales order - delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ - 'default_order_id': order.id, - 'default_carrier_id': self.env['delivery.carrier'].search([])[1] - })) - choose_delivery_carrier = delivery_wizard.save() - choose_delivery_carrier.button_confirm() - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 4, "We should get both promotion line since the free delivery will be applied first and won't change the SO total") - - def test_shipping_cost_numbers(self): - # Free delivery should not be taken into account when checking for minimum required threshold - p_minimum_threshold_free_delivery = self.env['coupon.program'].create({ - 'name': 'free shipping if > 872 tax exl', - 'promo_code_usage': 'code_needed', - 'promo_code': 'free_shipping', - 'reward_type': 'free_shipping', - 'program_type': 'promotion_program', - 'rule_minimum_amount': 872, - }) - self.p2 = self.env['coupon.program'].create({ - 'name': 'Buy 4 large cabinet, get one for free', - 'promo_code_usage': 'no_code_needed', - 'reward_type': 'product', - 'program_type': 'promotion_program', - 'reward_product_id': self.iPadMini.id, - 'rule_min_quantity': 3, - 'rule_products_domain': '[["name","ilike","large cabinet"]]', - }) - order = self.empty_order - self.iPadMini.taxes_id = self.tax_10pc_incl - sol1 = self.env['sale.order.line'].create({ - 'product_id': self.iPadMini.id, - 'name': 'Large Cabinet', - 'product_uom_qty': 3.0, - 'order_id': order.id, - }) - - # I add delivery cost in Sales order - delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ - 'default_order_id': order.id, - 'default_carrier_id': self.carrier.id - })) - choose_delivery_carrier = delivery_wizard.save() - choose_delivery_carrier.button_confirm() - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2) - self.assertEqual(order.reward_amount, 0) - # Shipping is 20 + 15%tax - self.assertEqual(sum([line.price_total for line in order._get_no_effect_on_threshold_lines()]), 23) - self.assertEqual(order.amount_untaxed, 872.73 + 20) - - self.env['sale.coupon.apply.code'].sudo().apply_coupon(order, 'free_shipping') - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 3, "We should get the delivery line and the free delivery since we are below 872.73$ with the 10% discount") - self.assertEqual(order.reward_amount, -20) - self.assertEqual(sum([line.price_total for line in order._get_no_effect_on_threshold_lines()]), 0) - self.assertEqual(order.amount_untaxed, 872.73) - - sol1.product_uom_qty = 4 - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 4, "We should get a free Large Cabinet") - self.assertEqual(order.reward_amount, -20 -290.91) - self.assertEqual(sum([line.price_total for line in order._get_no_effect_on_threshold_lines()]), 0) - self.assertEqual(order.amount_untaxed, 872.73) - - p_specific_product = self.env['coupon.program'].create({ - 'name': '20% reduction on large cabinet in cart', - 'promo_code_usage': 'no_code_needed', - 'reward_type': 'discount', - 'program_type': 'promotion_program', - 'discount_type': 'percentage', - 'discount_percentage': 20.0, - 'discount_apply_on': 'cheapest_product', - }) - p_specific_product.discount_apply_on = 'cheapest_product' - order.recompute_coupon_lines() - # 872.73 - (20% of 1 iPad) = 872.73 - 58.18 = 814.55 - self.assertAlmostEqual(order.amount_untaxed, 814.55, 2, "One large cabinet should be discounted by 20%") From 91af1cacee602617608babd3ceea2ba82d96d00c Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:07:43 +0100 Subject: [PATCH 06/19] [REM] website_sale_coupon: remove website_sale_coupon module Removes the website_sale_coupon module as it is merged inside of website_sale_loyalty. TaskId-2675382 --- addons/website_sale_coupon/__init__.py | 6 - addons/website_sale_coupon/__manifest__.py | 32 --- .../controllers/__init__.py | 4 - .../website_sale_coupon/controllers/main.py | 59 ----- addons/website_sale_coupon/i18n/af.po | 80 ------- addons/website_sale_coupon/i18n/am.po | 77 ------ addons/website_sale_coupon/i18n/ar.po | 78 ------ addons/website_sale_coupon/i18n/az.po | 84 ------- addons/website_sale_coupon/i18n/bg.po | 80 ------- addons/website_sale_coupon/i18n/bs.po | 88 ------- addons/website_sale_coupon/i18n/ca.po | 79 ------ addons/website_sale_coupon/i18n/cs.po | 79 ------ addons/website_sale_coupon/i18n/da.po | 81 ------- addons/website_sale_coupon/i18n/de.po | 80 ------- addons/website_sale_coupon/i18n/el.po | 79 ------ addons/website_sale_coupon/i18n/en_GB.po | 77 ------ addons/website_sale_coupon/i18n/es.po | 80 ------- addons/website_sale_coupon/i18n/es_BO.po | 80 ------- addons/website_sale_coupon/i18n/es_CL.po | 80 ------- addons/website_sale_coupon/i18n/es_CO.po | 80 ------- addons/website_sale_coupon/i18n/es_CR.po | 80 ------- addons/website_sale_coupon/i18n/es_DO.po | 80 ------- addons/website_sale_coupon/i18n/es_EC.po | 80 ------- addons/website_sale_coupon/i18n/es_PE.po | 80 ------- addons/website_sale_coupon/i18n/es_PY.po | 77 ------ addons/website_sale_coupon/i18n/es_VE.po | 80 ------- addons/website_sale_coupon/i18n/et.po | 92 ------- addons/website_sale_coupon/i18n/eu.po | 80 ------- addons/website_sale_coupon/i18n/fa.po | 87 ------- addons/website_sale_coupon/i18n/fi.po | 89 ------- addons/website_sale_coupon/i18n/fo.po | 77 ------ addons/website_sale_coupon/i18n/fr.po | 79 ------ addons/website_sale_coupon/i18n/fr_CA.po | 80 ------- addons/website_sale_coupon/i18n/gl.po | 77 ------ addons/website_sale_coupon/i18n/gu.po | 84 ------- addons/website_sale_coupon/i18n/he.po | 79 ------ addons/website_sale_coupon/i18n/hr.po | 78 ------ addons/website_sale_coupon/i18n/hu.po | 79 ------ addons/website_sale_coupon/i18n/id.po | 80 ------- addons/website_sale_coupon/i18n/is.po | 89 ------- addons/website_sale_coupon/i18n/it.po | 80 ------- addons/website_sale_coupon/i18n/ja.po | 87 ------- addons/website_sale_coupon/i18n/ka.po | 80 ------- addons/website_sale_coupon/i18n/kab.po | 80 ------- addons/website_sale_coupon/i18n/km.po | 87 ------- addons/website_sale_coupon/i18n/ko.po | 89 ------- addons/website_sale_coupon/i18n/lb.po | 74 ------ addons/website_sale_coupon/i18n/lo.po | 80 ------- addons/website_sale_coupon/i18n/lt.po | 80 ------- addons/website_sale_coupon/i18n/lv.po | 80 ------- addons/website_sale_coupon/i18n/mk.po | 80 ------- addons/website_sale_coupon/i18n/mn.po | 80 ------- addons/website_sale_coupon/i18n/nb.po | 78 ------ addons/website_sale_coupon/i18n/ne.po | 80 ------- addons/website_sale_coupon/i18n/nl.po | 79 ------ addons/website_sale_coupon/i18n/nl_BE.po | 80 ------- addons/website_sale_coupon/i18n/pl.po | 80 ------- addons/website_sale_coupon/i18n/pt.po | 74 ------ addons/website_sale_coupon/i18n/pt_BR.po | 80 ------- addons/website_sale_coupon/i18n/ro.po | 74 ------ addons/website_sale_coupon/i18n/ru.po | 80 ------- addons/website_sale_coupon/i18n/sk.po | 87 ------- addons/website_sale_coupon/i18n/sl.po | 77 ------ addons/website_sale_coupon/i18n/sq.po | 77 ------ addons/website_sale_coupon/i18n/sr.po | 87 ------- addons/website_sale_coupon/i18n/sr@latin.po | 80 ------- addons/website_sale_coupon/i18n/sv.po | 79 ------ addons/website_sale_coupon/i18n/th.po | 89 ------- addons/website_sale_coupon/i18n/tr.po | 81 ------- addons/website_sale_coupon/i18n/uk.po | 79 ------ addons/website_sale_coupon/i18n/vi.po | 79 ------ .../i18n/website_sale_coupon.pot | 224 ------------------ addons/website_sale_coupon/i18n/zh_CN.po | 81 ------- addons/website_sale_coupon/i18n/zh_TW.po | 79 ------ addons/website_sale_coupon/models/__init__.py | 6 - .../website_sale_coupon/models/sale_coupon.py | 19 -- .../models/sale_coupon_program.py | 41 ---- .../website_sale_coupon/models/sale_order.py | 116 --------- addons/website_sale_coupon/models/website.py | 11 - .../security/ir.model.access.csv | 2 - .../static/description/icon.png | Bin 5909 -> 0 bytes .../static/description/icon.svg | 1 - .../static/src/js/coupon_toaster_widget.js | 34 --- .../static/tests/tours/website_sale_coupon.js | 177 -------------- addons/website_sale_coupon/tests/__init__.py | 3 - .../tests/test_apply_pending_coupon.py | 61 ----- .../tests/test_sale_coupon_multiwebsite.py | 149 ------------ .../tests/test_shop_sale_coupon.py | 164 ------------- .../views/coupon_share_views.xml | 32 --- .../views/res_config_settings_views.xml | 21 -- .../views/sale_coupon_coupon_views.xml | 13 - .../views/sale_coupon_program_views.xml | 34 --- .../views/website_sale_templates.xml | 87 ------- addons/website_sale_coupon/wizard/__init__.py | 4 - .../wizard/sale_coupon_share.py | 99 -------- 95 files changed, 6965 deletions(-) delete mode 100644 addons/website_sale_coupon/__init__.py delete mode 100644 addons/website_sale_coupon/__manifest__.py delete mode 100644 addons/website_sale_coupon/controllers/__init__.py delete mode 100644 addons/website_sale_coupon/controllers/main.py delete mode 100644 addons/website_sale_coupon/i18n/af.po delete mode 100644 addons/website_sale_coupon/i18n/am.po delete mode 100644 addons/website_sale_coupon/i18n/ar.po delete mode 100644 addons/website_sale_coupon/i18n/az.po delete mode 100644 addons/website_sale_coupon/i18n/bg.po delete mode 100644 addons/website_sale_coupon/i18n/bs.po delete mode 100644 addons/website_sale_coupon/i18n/ca.po delete mode 100644 addons/website_sale_coupon/i18n/cs.po delete mode 100644 addons/website_sale_coupon/i18n/da.po delete mode 100644 addons/website_sale_coupon/i18n/de.po delete mode 100644 addons/website_sale_coupon/i18n/el.po delete mode 100644 addons/website_sale_coupon/i18n/en_GB.po delete mode 100644 addons/website_sale_coupon/i18n/es.po delete mode 100644 addons/website_sale_coupon/i18n/es_BO.po delete mode 100644 addons/website_sale_coupon/i18n/es_CL.po delete mode 100644 addons/website_sale_coupon/i18n/es_CO.po delete mode 100644 addons/website_sale_coupon/i18n/es_CR.po delete mode 100644 addons/website_sale_coupon/i18n/es_DO.po delete mode 100644 addons/website_sale_coupon/i18n/es_EC.po delete mode 100644 addons/website_sale_coupon/i18n/es_PE.po delete mode 100644 addons/website_sale_coupon/i18n/es_PY.po delete mode 100644 addons/website_sale_coupon/i18n/es_VE.po delete mode 100644 addons/website_sale_coupon/i18n/et.po delete mode 100644 addons/website_sale_coupon/i18n/eu.po delete mode 100644 addons/website_sale_coupon/i18n/fa.po delete mode 100644 addons/website_sale_coupon/i18n/fi.po delete mode 100644 addons/website_sale_coupon/i18n/fo.po delete mode 100644 addons/website_sale_coupon/i18n/fr.po delete mode 100644 addons/website_sale_coupon/i18n/fr_CA.po delete mode 100644 addons/website_sale_coupon/i18n/gl.po delete mode 100644 addons/website_sale_coupon/i18n/gu.po delete mode 100644 addons/website_sale_coupon/i18n/he.po delete mode 100644 addons/website_sale_coupon/i18n/hr.po delete mode 100644 addons/website_sale_coupon/i18n/hu.po delete mode 100644 addons/website_sale_coupon/i18n/id.po delete mode 100644 addons/website_sale_coupon/i18n/is.po delete mode 100644 addons/website_sale_coupon/i18n/it.po delete mode 100644 addons/website_sale_coupon/i18n/ja.po delete mode 100644 addons/website_sale_coupon/i18n/ka.po delete mode 100644 addons/website_sale_coupon/i18n/kab.po delete mode 100644 addons/website_sale_coupon/i18n/km.po delete mode 100644 addons/website_sale_coupon/i18n/ko.po delete mode 100644 addons/website_sale_coupon/i18n/lb.po delete mode 100644 addons/website_sale_coupon/i18n/lo.po delete mode 100644 addons/website_sale_coupon/i18n/lt.po delete mode 100644 addons/website_sale_coupon/i18n/lv.po delete mode 100644 addons/website_sale_coupon/i18n/mk.po delete mode 100644 addons/website_sale_coupon/i18n/mn.po delete mode 100644 addons/website_sale_coupon/i18n/nb.po delete mode 100644 addons/website_sale_coupon/i18n/ne.po delete mode 100644 addons/website_sale_coupon/i18n/nl.po delete mode 100644 addons/website_sale_coupon/i18n/nl_BE.po delete mode 100644 addons/website_sale_coupon/i18n/pl.po delete mode 100644 addons/website_sale_coupon/i18n/pt.po delete mode 100644 addons/website_sale_coupon/i18n/pt_BR.po delete mode 100644 addons/website_sale_coupon/i18n/ro.po delete mode 100644 addons/website_sale_coupon/i18n/ru.po delete mode 100644 addons/website_sale_coupon/i18n/sk.po delete mode 100644 addons/website_sale_coupon/i18n/sl.po delete mode 100644 addons/website_sale_coupon/i18n/sq.po delete mode 100644 addons/website_sale_coupon/i18n/sr.po delete mode 100644 addons/website_sale_coupon/i18n/sr@latin.po delete mode 100644 addons/website_sale_coupon/i18n/sv.po delete mode 100644 addons/website_sale_coupon/i18n/th.po delete mode 100644 addons/website_sale_coupon/i18n/tr.po delete mode 100644 addons/website_sale_coupon/i18n/uk.po delete mode 100644 addons/website_sale_coupon/i18n/vi.po delete mode 100644 addons/website_sale_coupon/i18n/website_sale_coupon.pot delete mode 100644 addons/website_sale_coupon/i18n/zh_CN.po delete mode 100644 addons/website_sale_coupon/i18n/zh_TW.po delete mode 100644 addons/website_sale_coupon/models/__init__.py delete mode 100644 addons/website_sale_coupon/models/sale_coupon.py delete mode 100644 addons/website_sale_coupon/models/sale_coupon_program.py delete mode 100644 addons/website_sale_coupon/models/sale_order.py delete mode 100644 addons/website_sale_coupon/models/website.py delete mode 100644 addons/website_sale_coupon/security/ir.model.access.csv delete mode 100644 addons/website_sale_coupon/static/description/icon.png delete mode 100644 addons/website_sale_coupon/static/description/icon.svg delete mode 100644 addons/website_sale_coupon/static/src/js/coupon_toaster_widget.js delete mode 100644 addons/website_sale_coupon/static/tests/tours/website_sale_coupon.js delete mode 100644 addons/website_sale_coupon/tests/__init__.py delete mode 100644 addons/website_sale_coupon/tests/test_apply_pending_coupon.py delete mode 100644 addons/website_sale_coupon/tests/test_sale_coupon_multiwebsite.py delete mode 100644 addons/website_sale_coupon/tests/test_shop_sale_coupon.py delete mode 100644 addons/website_sale_coupon/views/coupon_share_views.xml delete mode 100644 addons/website_sale_coupon/views/res_config_settings_views.xml delete mode 100644 addons/website_sale_coupon/views/sale_coupon_coupon_views.xml delete mode 100644 addons/website_sale_coupon/views/sale_coupon_program_views.xml delete mode 100644 addons/website_sale_coupon/views/website_sale_templates.xml delete mode 100644 addons/website_sale_coupon/wizard/__init__.py delete mode 100644 addons/website_sale_coupon/wizard/sale_coupon_share.py diff --git a/addons/website_sale_coupon/__init__.py b/addons/website_sale_coupon/__init__.py deleted file mode 100644 index 88710707227..00000000000 --- a/addons/website_sale_coupon/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import controllers -from . import models -from . import wizard diff --git a/addons/website_sale_coupon/__manifest__.py b/addons/website_sale_coupon/__manifest__.py deleted file mode 100644 index ba9f72a47ab..00000000000 --- a/addons/website_sale_coupon/__manifest__.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -{ - 'name': "Coupons & Promotions for eCommerce", - 'summary': """Use coupon & promotion programs in your eCommerce store""", - 'description': """ -Create coupon and promotion codes to share in order to boost your sales (free products, discounts, etc.). Shoppers can use them in the eCommerce checkout. - -Coupon & promotion programs can be edited in the Catalog menu of the Website app. - """, - 'category': 'Website/Website', - 'version': '1.0', - 'depends': ['website_sale', 'website_links', 'sale_coupon'], - 'data': [ - 'security/ir.model.access.csv', - 'views/coupon_share_views.xml', - 'views/website_sale_templates.xml', - 'views/res_config_settings_views.xml', - 'views/sale_coupon_coupon_views.xml', - 'views/sale_coupon_program_views.xml', - ], - 'auto_install': ['website_sale', 'sale_coupon'], - 'assets': { - 'web.assets_frontend': [ - 'website_sale_coupon/static/src/js/coupon_toaster_widget.js', - ], - 'web.assets_tests': [ - 'website_sale_coupon/static/tests/**/*', - ], - }, - 'license': 'LGPL-3', -} diff --git a/addons/website_sale_coupon/controllers/__init__.py b/addons/website_sale_coupon/controllers/__init__.py deleted file mode 100644 index 5d4b25db9c0..00000000000 --- a/addons/website_sale_coupon/controllers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import main diff --git a/addons/website_sale_coupon/controllers/main.py b/addons/website_sale_coupon/controllers/main.py deleted file mode 100644 index 9334927d424..00000000000 --- a/addons/website_sale_coupon/controllers/main.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo import http, _ -from odoo.addons.website_sale.controllers import main -from odoo.exceptions import UserError -from odoo.http import request - -from werkzeug.urls import url_encode, url_parse - - -class WebsiteSale(main.WebsiteSale): - - @http.route(['/shop/pricelist']) - def pricelist(self, promo, **post): - order = request.website.sale_get_order() - coupon_status = request.env['sale.coupon.apply.code'].sudo().apply_coupon(order, promo) - if coupon_status.get('not_found'): - return super(WebsiteSale, self).pricelist(promo, **post) - elif coupon_status.get('error'): - request.session['error_promo_code'] = coupon_status['error'] - return request.redirect(post.get('r', '/shop/cart')) - - @http.route() - def shop_payment(self, **post): - order = request.website.sale_get_order() - order.recompute_coupon_lines() - return super(WebsiteSale, self).shop_payment(**post) - - @http.route(['/shop/cart'], type='http', auth="public", website=True) - def cart(self, **post): - order = request.website.sale_get_order() - order.recompute_coupon_lines() - return super(WebsiteSale, self).cart(**post) - - @http.route(['/coupon/'], type='http', auth='public', website=True, sitemap=False) - def activate_coupon(self, code, r='/shop', **kw): - url_parts = url_parse(r) - url_query = url_parts.decode_query() - url_query.pop('coupon_error', False) # trust only Odoo error message - - request.session['pending_coupon_code'] = code - order = request.website.sale_get_order() - if order: - result = order._try_pending_coupon() - order.recompute_coupon_lines() - if isinstance(result, UserError): - url_query['coupon_error'] = result - else: - url_query['notify_coupon'] = code - else: - url_query['coupon_error'] = _("The coupon will be automatically applied when you add something in your cart.") - redirect = url_parts.replace(query=url_encode(url_query)) - return request.redirect(redirect.to_url()) - - # Override - # Add in the rendering the free_shipping_line - def _get_shop_payment_values(self, order, **kwargs): - values = super(WebsiteSale, self)._get_shop_payment_values(order, **kwargs) - values['free_shipping_lines'] = order._get_free_shipping_lines() - return values diff --git a/addons/website_sale_coupon/i18n/af.po b/addons/website_sale_coupon/i18n/af.po deleted file mode 100644 index 42a2ceed57c..00000000000 --- a/addons/website_sale_coupon/i18n/af.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Afrikaans (https://www.transifex.com/odoo/teams/41243/af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Kwotasie" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/am.po b/addons/website_sale_coupon/i18n/am.po deleted file mode 100644 index e3ae366737c..00000000000 --- a/addons/website_sale_coupon/i18n/am.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Amharic (https://www.transifex.com/odoo/teams/41243/am/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: am\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ar.po b/addons/website_sale_coupon/i18n/ar.po deleted file mode 100644 index bb164d2c802..00000000000 --- a/addons/website_sale_coupon/i18n/ar.po +++ /dev/null @@ -1,78 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Mustafa Rawi , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Mustafa Rawi , 2019\n" -"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ar\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "برامج الكوبونات" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "الخصم:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "البرامج الترويجية" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "برنامج كوبون المبيعات" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "أمر البيع" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/az.po b/addons/website_sale_coupon/i18n/az.po deleted file mode 100644 index d1662bd7b84..00000000000 --- a/addons/website_sale_coupon/i18n/az.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-08-24 11:49+0000\n" -"Language-Team: Azerbaijani (https://www.transifex.com/odoo/teams/41243/az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/bg.po b/addons/website_sale_coupon/i18n/bg.po deleted file mode 100644 index 41d10a015a5..00000000000 --- a/addons/website_sale_coupon/i18n/bg.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Bulgarian (https://www.transifex.com/odoo/teams/41243/bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Оферта" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/bs.po b/addons/website_sale_coupon/i18n/bs.po deleted file mode 100644 index c0ca2d07716..00000000000 --- a/addons/website_sale_coupon/i18n/bs.po +++ /dev/null @@ -1,88 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2018 -# Boško Stojaković , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Boško Stojaković , 2018\n" -"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Popust:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "Prodajni nalog" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Web stranica" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ca.po b/addons/website_sale_coupon/i18n/ca.po deleted file mode 100644 index ed02592afec..00000000000 --- a/addons/website_sale_coupon/i18n/ca.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Manel Fernandez , 2019 -# Quim - eccit , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:47+0000\n" -"Last-Translator: Quim - eccit , 2019\n" -"Language-Team: Catalan (https://www.transifex.com/odoo/teams/41243/ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Descompte:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Comanda de venda" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/cs.po b/addons/website_sale_coupon/i18n/cs.po deleted file mode 100644 index bd42ed501ce..00000000000 --- a/addons/website_sale_coupon/i18n/cs.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# trendspotter , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: trendspotter , 2019\n" -"Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kupónové programy" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Sleva:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Zvýhodněná částka" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "Neplatný nebo expirovaný promo kód." - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Promo programy" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Prodejní kupónový program" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Prodejní objednávka" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "Kód programu musí být jedinečný pro každou webovou stránku!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Úspěšně jste uplatnili tento promo kód:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Vaše odměna" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "je k dispozici na další objednávce s tímto propagačním kódem:" diff --git a/addons/website_sale_coupon/i18n/da.po b/addons/website_sale_coupon/i18n/da.po deleted file mode 100644 index 0add99edbfc..00000000000 --- a/addons/website_sale_coupon/i18n/da.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# jonas jensen , 2019 -# Sanne Kristensen , 2019 -# lhmflexerp , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: lhmflexerp , 2019\n" -"Language-Team: Danish (https://www.transifex.com/odoo/teams/41243/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kupon kampagner" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Rabat:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Rabat" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Salgskampagner" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Salgsrabat program" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Salgsordre" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "Programkoden skal være unik på hjemmesiden!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Du har med succes tilføjet følgende kampagnekode:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Din belønning" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "er tilgængelig ved den næste ordre med denne kampagnekode:" diff --git a/addons/website_sale_coupon/i18n/de.po b/addons/website_sale_coupon/i18n/de.po deleted file mode 100644 index 0cab986564f..00000000000 --- a/addons/website_sale_coupon/i18n/de.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Leon Grill , 2019 -# Martin Trigaux, 2019 -# Chris Egal , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Chris Egal , 2019\n" -"Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Gutschein-Programme" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Rabatt:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Rabattierter Betrag" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "Ungültiger oder abgelaufener Gutscheincode." - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Promo-Kampagnen" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Verkaufsgutscheinprogramm" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Verkaufsauftrag " - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "Der Programmcode muss auf der Website eindeutig sein!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Sie haben erfolgreich folgenden Promo-Code angewendet:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Ihre Prämie" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "ist bei einer nächsten Bestellung mit diesem Promo-Code verfügbar:" diff --git a/addons/website_sale_coupon/i18n/el.po b/addons/website_sale_coupon/i18n/el.po deleted file mode 100644 index 4f8f0c397dc..00000000000 --- a/addons/website_sale_coupon/i18n/el.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Kostas Goutoudis , 2019 -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:47+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Έκπτωση:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Παραγγελία" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/en_GB.po b/addons/website_sale_coupon/i18n/en_GB.po deleted file mode 100644 index ac40276f760..00000000000 --- a/addons/website_sale_coupon/i18n/en_GB.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: English (United Kingdom) (https://www.transifex.com/odoo/teams/41243/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es.po b/addons/website_sale_coupon/i18n/es.po deleted file mode 100644 index 9025b1f55ed..00000000000 --- a/addons/website_sale_coupon/i18n/es.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Miguel Orueta , 2019 -# Jon Perez , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Jon Perez , 2019\n" -"Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Programas de cupones" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Descuento:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Cantidad descontada" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "Código de promoción no válido o caducado." - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Programa de promociones" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programa de cupones de ventas" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "¡El código del programa debe ser único por sitio web!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Usted ha aplicado satisfactoriamente el siguiente código promocional:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Su recompenza" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "esta disponible en una siguiente orden con este código promocional:" diff --git a/addons/website_sale_coupon/i18n/es_BO.po b/addons/website_sale_coupon/i18n/es_BO.po deleted file mode 100644 index 59489573316..00000000000 --- a/addons/website_sale_coupon/i18n/es_BO.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Bolivia) (https://www.transifex.com/odoo/teams/41243/es_BO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_BO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_CL.po b/addons/website_sale_coupon/i18n/es_CL.po deleted file mode 100644 index 30575361a4e..00000000000 --- a/addons/website_sale_coupon/i18n/es_CL.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Chile) (https://www.transifex.com/odoo/teams/41243/es_CL/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_CO.po b/addons/website_sale_coupon/i18n/es_CO.po deleted file mode 100644 index 251b6f0af87..00000000000 --- a/addons/website_sale_coupon/i18n/es_CO.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Colombia) (https://www.transifex.com/odoo/teams/41243/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_CR.po b/addons/website_sale_coupon/i18n/es_CR.po deleted file mode 100644 index 852196326fb..00000000000 --- a/addons/website_sale_coupon/i18n/es_CR.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/odoo/teams/41243/es_CR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_CR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_DO.po b/addons/website_sale_coupon/i18n/es_DO.po deleted file mode 100644 index b5aa3c01053..00000000000 --- a/addons/website_sale_coupon/i18n/es_DO.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Dominican Republic) (https://www.transifex.com/odoo/teams/41243/es_DO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_DO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_EC.po b/addons/website_sale_coupon/i18n/es_EC.po deleted file mode 100644 index fb6c2e447df..00000000000 --- a/addons/website_sale_coupon/i18n/es_EC.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Ecuador) (https://www.transifex.com/odoo/teams/41243/es_EC/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_EC\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_PE.po b/addons/website_sale_coupon/i18n/es_PE.po deleted file mode 100644 index 66745c50b70..00000000000 --- a/addons/website_sale_coupon/i18n/es_PE.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Peru) (https://www.transifex.com/odoo/teams/41243/es_PE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_PE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Cotización" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_PY.po b/addons/website_sale_coupon/i18n/es_PY.po deleted file mode 100644 index cb67ab4e7bb..00000000000 --- a/addons/website_sale_coupon/i18n/es_PY.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Spanish (Paraguay) (https://www.transifex.com/odoo/teams/41243/es_PY/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_PY\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/es_VE.po b/addons/website_sale_coupon/i18n/es_VE.po deleted file mode 100644 index 1d16391bc7d..00000000000 --- a/addons/website_sale_coupon/i18n/es_VE.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Spanish (Venezuela) (https://www.transifex.com/odoo/teams/41243/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Presupuesto" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/et.po b/addons/website_sale_coupon/i18n/et.po deleted file mode 100644 index 8ab9cbdb3ce..00000000000 --- a/addons/website_sale_coupon/i18n/et.po +++ /dev/null @@ -1,92 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Rivo Zängov , 2018 -# Arma Gedonsky , 2018 -# Eneli Õigus , 2018 -# Helen Sulaoja , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-08-24 11:49+0000\n" -"Last-Translator: Helen Sulaoja , 2018\n" -"Language-Team: Estonian (https://www.transifex.com/odoo/teams/41243/et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kupongiprogrammid" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "llahindlus:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Kampaaniaprogrammid" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "Müügitellimus" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Veebileht" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Oled rakendanud selle promokoodi:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Sinu tasu" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" -"on saadaval pärast järgmist tellimust, mis tehakse selle promokoodiga:" diff --git a/addons/website_sale_coupon/i18n/eu.po b/addons/website_sale_coupon/i18n/eu.po deleted file mode 100644 index 7d95f35c595..00000000000 --- a/addons/website_sale_coupon/i18n/eu.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Basque (https://www.transifex.com/odoo/teams/41243/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Aurrekontua" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/fa.po b/addons/website_sale_coupon/i18n/fa.po deleted file mode 100644 index 511f91d34b3..00000000000 --- a/addons/website_sale_coupon/i18n/fa.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Martin Trigaux, 2018\n" -"Language-Team: Persian (https://www.transifex.com/odoo/teams/41243/fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "سفارش فروش" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "تارنما" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/fi.po b/addons/website_sale_coupon/i18n/fi.po deleted file mode 100644 index 4f6c867bc62..00000000000 --- a/addons/website_sale_coupon/i18n/fi.po +++ /dev/null @@ -1,89 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Kari Lindgren , 2018 -# Jarmo Kortetjärvi , 2018 -# Tuomo Aura , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Tuomo Aura , 2018\n" -"Language-Team: Finnish (https://www.transifex.com/odoo/teams/41243/fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Alennus:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "Myyntitilaus" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Verkkosivu" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/fo.po b/addons/website_sale_coupon/i18n/fo.po deleted file mode 100644 index c3343e4064c..00000000000 --- a/addons/website_sale_coupon/i18n/fo.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Faroese (https://www.transifex.com/odoo/teams/41243/fo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/fr.po b/addons/website_sale_coupon/i18n/fr.po deleted file mode 100644 index 3e438b67ccd..00000000000 --- a/addons/website_sale_coupon/i18n/fr.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Elise Carton , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Elise Carton , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Campagnes de bons de réduction" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Réduction :" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Montant Réduit" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Campagnes de promotion" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programme de coupon de vente" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Bon de commande" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Vous avez bien appliqué le code promo suivant :" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Votre récompense" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "est disponible sur une prochaine commande avec ce code promo :" diff --git a/addons/website_sale_coupon/i18n/fr_CA.po b/addons/website_sale_coupon/i18n/fr_CA.po deleted file mode 100644 index 76e3675533e..00000000000 --- a/addons/website_sale_coupon/i18n/fr_CA.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: French (Canada) (https://www.transifex.com/odoo/teams/41243/fr_CA/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fr_CA\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Soumission" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/gl.po b/addons/website_sale_coupon/i18n/gl.po deleted file mode 100644 index 857d6028d7a..00000000000 --- a/addons/website_sale_coupon/i18n/gl.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Galician (https://www.transifex.com/odoo/teams/41243/gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/gu.po b/addons/website_sale_coupon/i18n/gu.po deleted file mode 100644 index a96c8e44e89..00000000000 --- a/addons/website_sale_coupon/i18n/gu.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Language-Team: Gujarati (https://www.transifex.com/odoo/teams/41243/gu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: gu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/he.po b/addons/website_sale_coupon/i18n/he.po deleted file mode 100644 index a5eb01081c8..00000000000 --- a/addons/website_sale_coupon/i18n/he.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# שהאב חוסיין , 2019 -# Amit Spilman , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Amit Spilman , 2019\n" -"Language-Team: Hebrew (https://www.transifex.com/odoo/teams/41243/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "הנחה" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "הזמנת לקוח" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/hr.po b/addons/website_sale_coupon/i18n/hr.po deleted file mode 100644 index 92f866c3f01..00000000000 --- a/addons/website_sale_coupon/i18n/hr.po +++ /dev/null @@ -1,78 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Croatian (https://www.transifex.com/odoo/teams/41243/hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Popust:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Prodajni nalog" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/hu.po b/addons/website_sale_coupon/i18n/hu.po deleted file mode 100644 index 5035b932f3c..00000000000 --- a/addons/website_sale_coupon/i18n/hu.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# krnkris, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: krnkris, 2019\n" -"Language-Team: Hungarian (https://www.transifex.com/odoo/teams/41243/hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Árengedmény:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Vásárlói megrendelés" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/id.po b/addons/website_sale_coupon/i18n/id.po deleted file mode 100644 index 28527d388af..00000000000 --- a/addons/website_sale_coupon/i18n/id.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Indonesian (https://www.transifex.com/odoo/teams/41243/id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Quotation" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/is.po b/addons/website_sale_coupon/i18n/is.po deleted file mode 100644 index 9e9f209d686..00000000000 --- a/addons/website_sale_coupon/i18n/is.po +++ /dev/null @@ -1,89 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Birgir Steinarsson , 2018 -# Bjorn Ingvarsson , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-08-24 11:49+0000\n" -"Last-Translator: Bjorn Ingvarsson , 2018\n" -"Language-Team: Icelandic (https://www.transifex.com/odoo/teams/41243/is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Afsláttur:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Vefsíða" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/it.po b/addons/website_sale_coupon/i18n/it.po deleted file mode 100644 index a8dc7523c21..00000000000 --- a/addons/website_sale_coupon/i18n/it.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Sergio Zanchetta , 2019 -# Paolo Valier, 2019 -# Léonie Bouchat , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Léonie Bouchat , 2019\n" -"Language-Team: Italian (https://www.transifex.com/odoo/teams/41243/it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Programmi buono sconto" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Sconto:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Importo ribassato " - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Programmi promozionali" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programma buono sconto vendita" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Ordine di vendita" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "Il codice del programma deve essere unico per ogni sito web." - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Hai applicato il seguente codice promozionale:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "La tua ricompensa" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "è disponibile per un prossimo ordine con questo codice promozionale:" diff --git a/addons/website_sale_coupon/i18n/ja.po b/addons/website_sale_coupon/i18n/ja.po deleted file mode 100644 index 857c89ce290..00000000000 --- a/addons/website_sale_coupon/i18n/ja.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Yoshi Tashiro , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Yoshi Tashiro , 2018\n" -"Language-Team: Japanese (https://www.transifex.com/odoo/teams/41243/ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "値引:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "販売オーダ" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "ウェブサイト" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ka.po b/addons/website_sale_coupon/i18n/ka.po deleted file mode 100644 index a207f7072aa..00000000000 --- a/addons/website_sale_coupon/i18n/ka.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Giorgi Melitauri , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Giorgi Melitauri , 2018\n" -"Language-Team: Georgian (https://www.transifex.com/odoo/teams/41243/ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ka\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "ციტატა" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/kab.po b/addons/website_sale_coupon/i18n/kab.po deleted file mode 100644 index 6e6ee15d5f7..00000000000 --- a/addons/website_sale_coupon/i18n/kab.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Kabyle (https://www.transifex.com/odoo/teams/41243/kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Asuter n ssuma" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/km.po b/addons/website_sale_coupon/i18n/km.po deleted file mode 100644 index 9f3fdd6aeea..00000000000 --- a/addons/website_sale_coupon/i18n/km.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Chan Nath , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Chan Nath , 2018\n" -"Language-Team: Khmer (https://www.transifex.com/odoo/teams/41243/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "វែបសាយ" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ko.po b/addons/website_sale_coupon/i18n/ko.po deleted file mode 100644 index 82ad44b6fbf..00000000000 --- a/addons/website_sale_coupon/i18n/ko.po +++ /dev/null @@ -1,89 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# 최재호 , 2018 -# Seongseok Shin , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-08-24 11:49+0000\n" -"Last-Translator: Seongseok Shin , 2018\n" -"Language-Team: Korean (https://www.transifex.com/odoo/teams/41243/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "할인 :" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "판매 주문" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "웹사이트" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/lb.po b/addons/website_sale_coupon/i18n/lb.po deleted file mode 100644 index 0d7afb1c45d..00000000000 --- a/addons/website_sale_coupon/i18n/lb.po +++ /dev/null @@ -1,74 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/lo.po b/addons/website_sale_coupon/i18n/lo.po deleted file mode 100644 index 945d2c29ae5..00000000000 --- a/addons/website_sale_coupon/i18n/lo.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Lao (https://www.transifex.com/odoo/teams/41243/lo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lo\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "ໃບສະເໜີລາຄາ" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/lt.po b/addons/website_sale_coupon/i18n/lt.po deleted file mode 100644 index 722a598bb83..00000000000 --- a/addons/website_sale_coupon/i18n/lt.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# digitouch UAB , 2019 -# Linas Versada , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Linas Versada , 2019\n" -"Language-Team: Lithuanian (https://www.transifex.com/odoo/teams/41243/lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Nuolaida:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Pardavimo užsakymas" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Sėkmingai pritaikėte šį nuolaidos kodą:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "Galimas kitam užsakymui su šiuo nuolaidos kodu:" diff --git a/addons/website_sale_coupon/i18n/lv.po b/addons/website_sale_coupon/i18n/lv.po deleted file mode 100644 index 1892e2495b7..00000000000 --- a/addons/website_sale_coupon/i18n/lv.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Latvian (https://www.transifex.com/odoo/teams/41243/lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Tāme" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/mk.po b/addons/website_sale_coupon/i18n/mk.po deleted file mode 100644 index 7dbf51bcedf..00000000000 --- a/addons/website_sale_coupon/i18n/mk.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Macedonian (https://www.transifex.com/odoo/teams/41243/mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Цитат" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/mn.po b/addons/website_sale_coupon/i18n/mn.po deleted file mode 100644 index 03c3fd40945..00000000000 --- a/addons/website_sale_coupon/i18n/mn.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Baskhuu Lodoikhuu , 2019 -# Martin Trigaux, 2019 -# nurbakhit nurka , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: nurbakhit nurka , 2019\n" -"Language-Team: Mongolian (https://www.transifex.com/odoo/teams/41243/mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Хөнгөлөлт:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Урамшууллын хөтөлбөрүүд" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Борлуулалтын захиалга" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/nb.po b/addons/website_sale_coupon/i18n/nb.po deleted file mode 100644 index fd37dd32836..00000000000 --- a/addons/website_sale_coupon/i18n/nb.po +++ /dev/null @@ -1,78 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Norwegian Bokmål (https://www.transifex.com/odoo/teams/41243/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kupongprogrammer" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Rabatt:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Kampanjeprogrammer" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Salgskupongprogram" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Salgsordre" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Du har lagt til denne kampanjekoden:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Belønningen din" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "er tilgjengelig på en fremtidig bestilling med denne kampanjekoden:" diff --git a/addons/website_sale_coupon/i18n/ne.po b/addons/website_sale_coupon/i18n/ne.po deleted file mode 100644 index eb165a5c7a6..00000000000 --- a/addons/website_sale_coupon/i18n/ne.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Bishisht Bhatta , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Bishisht Bhatta , 2018\n" -"Language-Team: Nepali (https://www.transifex.com/odoo/teams/41243/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "उद्धरण" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/nl.po b/addons/website_sale_coupon/i18n/nl.po deleted file mode 100644 index c1965b2a914..00000000000 --- a/addons/website_sale_coupon/i18n/nl.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Erwin van der Ploeg , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Erwin van der Ploeg , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kortingsbonnenprogramma's" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Korting:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Kortingsbedrag" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Promotieprogramma's" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Verkoop kortingsbonnenprogramma" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Verkooporder" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "De programma code moet uniek zijn per website!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "U heeft succesvol de volgende promotie code toegepast:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Uw beloning" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "is beschikbaar op het volgende order met de promotie code:" diff --git a/addons/website_sale_coupon/i18n/nl_BE.po b/addons/website_sale_coupon/i18n/nl_BE.po deleted file mode 100644 index 7b5b6260083..00000000000 --- a/addons/website_sale_coupon/i18n/nl_BE.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Martin Trigaux , 2017\n" -"Language-Team: Dutch (Belgium) (https://www.transifex.com/odoo/teams/41243/nl_BE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: nl_BE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Offerte" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/pl.po b/addons/website_sale_coupon/i18n/pl.po deleted file mode 100644 index 2e4e0e45781..00000000000 --- a/addons/website_sale_coupon/i18n/pl.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Tomasz Leppich , 2019 -# Paweł Wodyński , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Paweł Wodyński , 2019\n" -"Language-Team: Polish (https://www.transifex.com/odoo/teams/41243/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Programy kuponowe" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Upust:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Programy Promocyjne" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Program do sprzedaży kuponów" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Zamówienie sprzedaży" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Pomyślnie zastosowałeś następujący kod promocyjny:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Twoja nagroda" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "jest dostępny w następnym zamówieniu z tym kodem promocyjnym:" diff --git a/addons/website_sale_coupon/i18n/pt.po b/addons/website_sale_coupon/i18n/pt.po deleted file mode 100644 index 6c0a9d6ab9e..00000000000 --- a/addons/website_sale_coupon/i18n/pt.po +++ /dev/null @@ -1,74 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Language-Team: Portuguese (https://www.transifex.com/odoo/teams/41243/pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/pt_BR.po b/addons/website_sale_coupon/i18n/pt_BR.po deleted file mode 100644 index 8f72042049f..00000000000 --- a/addons/website_sale_coupon/i18n/pt_BR.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# grazziano , 2019 -# mariana rodrigues , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: mariana rodrigues , 2019\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/odoo/teams/41243/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Programas de cupom" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Desconto:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Programas de Promoção" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Programa de cupom de vendas" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Ordem de Venda" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ro.po b/addons/website_sale_coupon/i18n/ro.po deleted file mode 100644 index 1e9560aefaa..00000000000 --- a/addons/website_sale_coupon/i18n/ro.po +++ /dev/null @@ -1,74 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Language-Team: Romanian (https://www.transifex.com/odoo/teams/41243/ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/ru.po b/addons/website_sale_coupon/i18n/ru.po deleted file mode 100644 index a565c43a54a..00000000000 --- a/addons/website_sale_coupon/i18n/ru.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Oleg Kuryan , 2019 -# Konstantin Korovin , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Konstantin Korovin , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: ru\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Descuento:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Программы продвижения" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Заказ на продажу" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Вы успешно применили следующий код купона:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Твоя награда" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "доступен при следующем заказе с кодом:" diff --git a/addons/website_sale_coupon/i18n/sk.po b/addons/website_sale_coupon/i18n/sk.po deleted file mode 100644 index 2ac47b0bf47..00000000000 --- a/addons/website_sale_coupon/i18n/sk.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Jaroslav Bosansky , 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Jaroslav Bosansky , 2018\n" -"Language-Team: Slovak (https://www.transifex.com/odoo/teams/41243/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Zľava:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "Objednávka predaja" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Webová stránka" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/sl.po b/addons/website_sale_coupon/i18n/sl.po deleted file mode 100644 index 014fbb91e8c..00000000000 --- a/addons/website_sale_coupon/i18n/sl.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Slovenian (https://www.transifex.com/odoo/teams/41243/sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/sq.po b/addons/website_sale_coupon/i18n/sq.po deleted file mode 100644 index 6881ee9f0c1..00000000000 --- a/addons/website_sale_coupon/i18n/sq.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Language-Team: Albanian (https://www.transifex.com/odoo/teams/41243/sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/sr.po b/addons/website_sale_coupon/i18n/sr.po deleted file mode 100644 index 6dd3b33b6de..00000000000 --- a/addons/website_sale_coupon/i18n/sr.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2018 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-09-21 14:07+0000\n" -"Last-Translator: Martin Trigaux, 2018\n" -"Language-Team: Serbian (https://www.transifex.com/odoo/teams/41243/sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "Nalog za prodaju" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "Web stranica" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/sr@latin.po b/addons/website_sale_coupon/i18n/sr@latin.po deleted file mode 100644 index 814f6a07074..00000000000 --- a/addons/website_sale_coupon/i18n/sr@latin.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Djordje Marjanovic , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.saas~18+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-02 11:50+0000\n" -"PO-Revision-Date: 2017-10-02 11:50+0000\n" -"Last-Translator: Djordje Marjanovic , 2017\n" -"Language-Team: Serbian (Latin) (https://www.transifex.com/odoo/teams/41243/sr%40latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "" -" " -"Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Include Public User" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program_is_public_included -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_rule_is_public_included -msgid "Is the public user included into the set of autorized customers" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Quotation" -msgstr "Ponuda" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_rule -msgid "Sales Coupon Rule" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/sv.po b/addons/website_sale_coupon/i18n/sv.po deleted file mode 100644 index ac6695521ab..00000000000 --- a/addons/website_sale_coupon/i18n/sv.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Anders Wallenquist , 2018 -# Martin Trigaux, 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.1+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 08:13+0000\n" -"PO-Revision-Date: 2017-02-15 11:47+0000\n" -"Last-Translator: Martin Trigaux, 2019\n" -"Language-Team: Swedish (https://www.transifex.com/odoo/teams/41243/sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Rabatt:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Kundorder" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/th.po b/addons/website_sale_coupon/i18n/th.po deleted file mode 100644 index 248cc036619..00000000000 --- a/addons/website_sale_coupon/i18n/th.po +++ /dev/null @@ -1,89 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# monchai7 , 2018 -# gsong , 2018 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~11.5+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-21 14:07+0000\n" -"PO-Revision-Date: 2018-08-24 11:49+0000\n" -"Last-Translator: gsong , 2018\n" -"Language-Team: Thai (https://www.transifex.com/odoo/teams/41243/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "ส่วนลด:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sale Order" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_sale_coupon_program__website_id -msgid "Website" -msgstr "เว็บไซต์" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/tr.po b/addons/website_sale_coupon/i18n/tr.po deleted file mode 100644 index 256c47b3b5e..00000000000 --- a/addons/website_sale_coupon/i18n/tr.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Murat Kaplan , 2019 -# Ertuğrul Güreş , 2019 -# Umur Akın , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Umur Akın , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Kupon Kampanyaları" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "İndirim:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Promosyon Kampanyaları" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Satış Kuponu Programı" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Satış Siparişi" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Kampanya kodu başarılı bir şekilde uygulandı:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Ödülünüz" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "Bu promosyon kodu bir sonraki siparişte kullanılabilir:" diff --git a/addons/website_sale_coupon/i18n/uk.po b/addons/website_sale_coupon/i18n/uk.po deleted file mode 100644 index 789dbf5784d..00000000000 --- a/addons/website_sale_coupon/i18n/uk.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Alina Lisnenko , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Alina Lisnenko , 2019\n" -"Language-Team: Ukrainian (https://www.transifex.com/odoo/teams/41243/uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: uk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Купонні програми" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Знижка:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "Сума знижок" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "Недійсний промо-код або термін його дії минув." - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Програми лояльності" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Купонна програма продажу" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Замовлення на продаж" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "Код програми повинен бути унікальним за веб-сайтом!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Ви успішно застосували промо-код:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Ваша нагорода" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "доступний у наступному порядку за допомогою цього промо-коду:" diff --git a/addons/website_sale_coupon/i18n/vi.po b/addons/website_sale_coupon/i18n/vi.po deleted file mode 100644 index bda36acd52a..00000000000 --- a/addons/website_sale_coupon/i18n/vi.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Nancy Momoland , 2019 -# Duy BQ , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Duy BQ , 2019\n" -"Language-Team: Vietnamese (https://www.transifex.com/odoo/teams/41243/vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "Chương trình phiếu giảm giá" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "Chiết khấu:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "Chương trình khuyến mãi" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "Chương trình phiếu giảm giá bán hàng" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "Đơn bán hàng" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "Bạn đã áp dụng thành công mã khuyến mãi sau:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "Phần thưởng của bạn" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "có sẵn trên đơn hàng tiếp theo với mã khuyến mãi này:" diff --git a/addons/website_sale_coupon/i18n/website_sale_coupon.pot b/addons/website_sale_coupon/i18n/website_sale_coupon.pot deleted file mode 100644 index add865d848e..00000000000 --- a/addons/website_sale_coupon/i18n/website_sale_coupon.pot +++ /dev/null @@ -1,224 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~14.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-14 10:29+0000\n" -"PO-Revision-Date: 2021-09-14 10:29+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/wizard/sale_coupon_share.py:0 -#, python-format -msgid "A coupon is needed for coupon programs." -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.layout -msgid "Could not apply the promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_coupon_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__coupon_id -msgid "Coupon" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_coupon_program -msgid "Coupon Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_coupon_share -msgid "Create links that apply a coupon and redirect to a specific page" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__create_uid -msgid "Created by" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__create_date -msgid "Created on" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__display_name -msgid "Display Name" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.coupon_share_view_form -msgid "Done" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.coupon_share_view_form -msgid "Generate Short Link" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__id -msgid "ID" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share____last_update -msgid "Last Modified on" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__write_uid -msgid "Last Updated by" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__write_date -msgid "Last Updated on" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__program_id -msgid "Program" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__program_website_id -msgid "Program Website" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__promo_code -msgid "Promo Code" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/wizard/sale_coupon_share.py:0 -#, python-format -msgid "Provide either a coupon or a program." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__redirect -msgid "Redirect" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,help:website_sale_coupon.field_coupon_program__website_id -#: model:ir.model.fields,help:website_sale_coupon.field_coupon_share__program_website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.coupon_view_tree -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_program_view_tree_website -msgid "Share" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/wizard/sale_coupon_share.py:0 -#: code:addons/website_sale_coupon/wizard/sale_coupon_share.py:0 -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.coupon_share_view_form -#, python-format -msgid "Share Coupon" -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__share_link -msgid "Share Link" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/controllers/main.py:0 -#, python-format -msgid "" -"The coupon will be automatically applied when you add something in your " -"cart." -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.layout -msgid "The following promo code was applied on your order:" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:0 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/wizard/sale_coupon_share.py:0 -#, python-format -msgid "The shared website should correspond to the website of the program." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_program__website_id -#: model:ir.model.fields,field_description:website_sale_coupon.field_coupon_share__website_id -msgid "Website" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.coupon_share_view_form -msgid "" -"You can share this promotion with your customers.\n" -" It will be applied at checkout when the customer uses this link." -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/i18n/zh_CN.po b/addons/website_sale_coupon/i18n/zh_CN.po deleted file mode 100644 index 686a56edbfc..00000000000 --- a/addons/website_sale_coupon/i18n/zh_CN.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# Maie , 2019 -# Jeffery CHEN , 2019 -# Felix Yuen , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: Felix Yuen , 2019\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" -"Content-Transfer-Encoding: \n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "优惠券方案" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "折扣:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "折扣金额" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "促销代码无效或过期。" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "促销方案" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "销售优惠券方案" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "销售订单" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "方案代码必须是每个网站所独有的!" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "下面的优惠码已经使用成功:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "您的报酬" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "此优惠码在下个订单是否可用" diff --git a/addons/website_sale_coupon/i18n/zh_TW.po b/addons/website_sale_coupon/i18n/zh_TW.po deleted file mode 100644 index 24138b30a91..00000000000 --- a/addons/website_sale_coupon/i18n/zh_TW.po +++ /dev/null @@ -1,79 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_coupon -# -# Translators: -# Martin Trigaux, 2019 -# 敬雲 林 , 2019 -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~12.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-12 11:33+0000\n" -"PO-Revision-Date: 2019-08-26 09:16+0000\n" -"Last-Translator: 敬雲 林 , 2019\n" -"Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_coupon_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Coupon Programs" -msgstr "優惠券規劃" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discount:" -msgstr "折扣:" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.cart_discount -msgid "Discounted amount" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Invalid or expired promo code." -msgstr "" - -#. module: website_sale_coupon -#: model:ir.ui.menu,name:website_sale_coupon.menu_promotion_type_config -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.res_config_settings_view_form -msgid "Promotion Programs" -msgstr "促銷規劃" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_coupon_program -msgid "Sales Coupon Program" -msgstr "銷售優惠計劃" - -#. module: website_sale_coupon -#: model:ir.model,name:website_sale_coupon.model_sale_order -msgid "Sales Order" -msgstr "銷售訂單" - -#. module: website_sale_coupon -#: code:addons/website_sale_coupon/models/sale_coupon_program.py:23 -#, python-format -msgid "The program code must be unique by website!" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "You have successfully applied following promo code:" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "Your reward" -msgstr "" - -#. module: website_sale_coupon -#: model_terms:ir.ui.view,arch_db:website_sale_coupon.sale_coupon_result -msgid "is available on a next order with this promo code:" -msgstr "" diff --git a/addons/website_sale_coupon/models/__init__.py b/addons/website_sale_coupon/models/__init__.py deleted file mode 100644 index 3ac5d4890a1..00000000000 --- a/addons/website_sale_coupon/models/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import sale_coupon -from . import sale_coupon_program -from . import sale_order diff --git a/addons/website_sale_coupon/models/sale_coupon.py b/addons/website_sale_coupon/models/sale_coupon.py deleted file mode 100644 index 3bd3973907e..00000000000 --- a/addons/website_sale_coupon/models/sale_coupon.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models - - -class SaleCoupon(models.Model): - _inherit = 'coupon.coupon' - - def _check_coupon_code(self, order_date, partner_id, **kwargs): - order = kwargs.get('order', False) - if order and self.program_id.website_id and self.program_id.website_id != order.website_id: - return {'error': 'This coupon is not valid on this website.'} - return super()._check_coupon_code(order_date, partner_id, **kwargs) - - def action_coupon_share(self): - """ Open a window to copy the coupon link """ - self.ensure_one() - return self.env['coupon.share'].create_share_action(coupon=self) diff --git a/addons/website_sale_coupon/models/sale_coupon_program.py b/addons/website_sale_coupon/models/sale_coupon_program.py deleted file mode 100644 index bca4164cd41..00000000000 --- a/addons/website_sale_coupon/models/sale_coupon_program.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, models, _ -from odoo.exceptions import ValidationError - - -class CouponProgram(models.Model): - _name = 'coupon.program' - _inherit = ['coupon.program', 'website.multi.mixin'] - - @api.constrains('promo_code', 'website_id') - def _check_promo_code_constraint(self): - """ Only case where multiple same code could coexists is if they all belong to their own website. - If the program is website generic, we should ensure there is no generic and no specific (even for other website) already - If the program is website specific, we should ensure there is no existing code for this website or False - """ - for program in self.filtered(lambda p: p.promo_code): - domain = [('id', '!=', program.id), ('promo_code', '=', program.promo_code)] - if program.website_id: - domain += program.website_id.website_domain() - if self.search(domain): - raise ValidationError(_('The program code must be unique by website!')) - - def _filter_programs_on_website(self, order): - return self.filtered(lambda program: not program.website_id or program.website_id.id == order.website_id.id) - - @api.model - def _filter_programs_from_common_rules(self, order, next_order=False): - programs = self._filter_programs_on_website(order) - return super(CouponProgram, programs)._filter_programs_from_common_rules(order, next_order) - - def _check_promo_code(self, order, coupon_code): - if self.website_id and self.website_id != order.website_id: - return {'error': 'This promo code is not valid on this website.'} - return super()._check_promo_code(order, coupon_code) - - def action_program_share(self): - """ Open a window to copy the program link """ - self.ensure_one() - return self.env['coupon.share'].create_share_action(program=self) diff --git a/addons/website_sale_coupon/models/sale_order.py b/addons/website_sale_coupon/models/sale_order.py deleted file mode 100644 index 070cc80269a..00000000000 --- a/addons/website_sale_coupon/models/sale_order.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- -from datetime import timedelta - -from odoo import api, fields, models -from odoo.exceptions import UserError -from odoo.http import request - - -class SaleOrder(models.Model): - _inherit = "sale.order" - - def _try_pending_coupon(self): - if not request: - return - - pending_coupon_code = request.session.get('pending_coupon_code') - if pending_coupon_code: - try: - self.env['sale.coupon.apply.code'].with_context(active_id=self.id).create({ - 'coupon_code': pending_coupon_code - }).process_coupon() - request.session.pop('pending_coupon_code') - except UserError as e: - return e - return True - - def recompute_coupon_lines(self): - for order in self: - order._try_pending_coupon() - return super().recompute_coupon_lines() - - def _compute_website_order_line(self): - """ This method will merge multiple discount lines generated by a same program - into a single one (temporary line with `new()`). - This case will only occur when the program is a discount applied on multiple - products with different taxes. - In this case, each taxes will have their own discount line. This is required - to have correct amount of taxes according to the discount. - But we wan't these lines to be `visually` merged into a single one in the - e-commerce since the end user should only see one discount line. - This is only possible since we don't show taxes in cart. - eg: - line 1: 10% discount on product with tax `A` - $15 - line 2: 10% discount on product with tax `B` - $11.5 - line 3: 10% discount on product with tax `C` - $10 - would be `hidden` and `replaced` by - line 1: 10% discount - $36.5 - - Note: The line will be created without tax(es) and the amount will be computed - depending if B2B or B2C is enabled. - """ - super()._compute_website_order_line() - for order in self: - # TODO: potential performance bottleneck downstream - programs = order._get_applied_programs_with_rewards_on_current_order() - for program in programs: - program_lines = order.order_line.filtered(lambda line: - line.product_id == program.discount_line_product_id) - if len(program_lines) > 1: - if self.env.user.has_group('sale.group_show_price_subtotal'): - price_unit = sum(program_lines.mapped('price_subtotal')) - else: - price_unit = sum(program_lines.mapped('price_total')) - # TODO: batch then flush - order.website_order_line += self.env['sale.order.line'].new({ - 'product_id': program_lines[0].product_id.id, - 'price_unit': price_unit, - 'name': program_lines[0].name, - 'product_uom_qty': 1, - 'product_uom': program_lines[0].product_uom.id, - 'order_id': order.id, - 'is_reward_line': True, - }) - order.website_order_line -= program_lines - - def _compute_cart_info(self): - super(SaleOrder, self)._compute_cart_info() - for order in self: - reward_lines = order.website_order_line.filtered(lambda line: line.is_reward_line) - order.cart_quantity -= int(sum(reward_lines.mapped('product_uom_qty'))) - - def get_promo_code_error(self, delete=True): - error = request.session.get('error_promo_code') - if error and delete: - request.session.pop('error_promo_code') - return error - - def _cart_update(self, *args, **kwargs): - res = super()._cart_update(*args, **kwargs) - self.recompute_coupon_lines() - return res - - def _get_free_shipping_lines(self): - self.ensure_one() - free_shipping_prgs_ids = self._get_applied_programs_with_rewards_on_current_order().filtered(lambda p: p.reward_type == 'free_shipping') - if not free_shipping_prgs_ids: - return self.env['sale.order.line'] - free_shipping_product_ids = free_shipping_prgs_ids.mapped('discount_line_product_id') - return self.order_line.filtered(lambda l: l.product_id in free_shipping_product_ids) - - @api.autovacuum - def _gc_abandoned_coupons(self, *args, **kwargs): - """Remove/free coupon from abandonned ecommerce order.""" - ICP = self.env['ir.config_parameter'] - validity = ICP.get_param('website_sale_coupon.abandonned_coupon_validity', 4) - validity = fields.Datetime.to_string(fields.datetime.now() - timedelta(days=int(validity))) - coupon_to_reset = self.env['coupon.coupon'].search([ - ('state', '=', 'used'), - ('sales_order_id.state', '=', 'draft'), - ('sales_order_id.write_date', '<', validity), - ('sales_order_id.website_id', '!=', False), - ]) - for coupon in coupon_to_reset: - coupon.sales_order_id.applied_coupon_ids -= coupon - coupon_to_reset.write({'state': 'new'}) - coupon_to_reset.mapped('sales_order_id').recompute_coupon_lines() diff --git a/addons/website_sale_coupon/models/website.py b/addons/website_sale_coupon/models/website.py deleted file mode 100644 index 06be29c42d1..00000000000 --- a/addons/website_sale_coupon/models/website.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -from odoo import models -from odoo.http import request - - -class Website(models.Model): - _inherit = 'website' - - def sale_reset(self): - request.session.pop('pending_coupon_code') - return super().sale_reset() diff --git a/addons/website_sale_coupon/security/ir.model.access.csv b/addons/website_sale_coupon/security/ir.model.access.csv deleted file mode 100644 index 208fe7ebb18..00000000000 --- a/addons/website_sale_coupon/security/ir.model.access.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_coupon_share,access_coupon_share,model_coupon_share,sales_team.group_sale_manager,1,1,1,0 diff --git a/addons/website_sale_coupon/static/description/icon.png b/addons/website_sale_coupon/static/description/icon.png deleted file mode 100644 index 1833c60a1c169cf9d2c1ddfd852f5a269849f76f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5909 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 diff --git a/addons/website_sale_coupon/static/description/icon.svg b/addons/website_sale_coupon/static/description/icon.svg deleted file mode 100644 index 4bb830714c8..00000000000 --- a/addons/website_sale_coupon/static/description/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/website_sale_coupon/static/src/js/coupon_toaster_widget.js b/addons/website_sale_coupon/static/src/js/coupon_toaster_widget.js deleted file mode 100644 index fe966e94e6f..00000000000 --- a/addons/website_sale_coupon/static/src/js/coupon_toaster_widget.js +++ /dev/null @@ -1,34 +0,0 @@ -/** @odoo-module **/ - -import publicWidget from 'web.public.widget'; -import {registry} from "@web/core/registry"; - -const CouponToasterWidget = publicWidget.Widget.extend({ - start() { - let options = {}; - const $content = this.$('.coupon-message-content'); - const $title = this.$('.coupon-message-title'); - - if ($content.length) { - Object.assign(options, {message: $content[0].innerHTML}); - } - if ($title.length) { - Object.assign(options, {title: $title[0].innerHTML}); - } - - if (this.$el.hasClass('coupon-info-message')) { - this.displayNotification(Object.assign({type: 'success'}, options)); - } else if (this.$el.hasClass('coupon-error-message')) { - this.displayNotification(Object.assign({type: 'danger'}, options)); - } - - return this._super(...arguments); - }, -}); - -registry.category("public_root_widgets").add("CouponToasterWidget", { - Widget: CouponToasterWidget, - selector: '.coupon-message', -}); - -export default CouponToasterWidget; diff --git a/addons/website_sale_coupon/static/tests/tours/website_sale_coupon.js b/addons/website_sale_coupon/static/tests/tours/website_sale_coupon.js deleted file mode 100644 index 15c4f968248..00000000000 --- a/addons/website_sale_coupon/static/tests/tours/website_sale_coupon.js +++ /dev/null @@ -1,177 +0,0 @@ -odoo.define('website_sale_coupon.test', function (require) { -'use strict'; - -require("website_sale.tour"); -var tour = require("web_tour.tour"); -var ajax = require('web.ajax'); -const tourUtils = require('website_sale.tour_utils'); - -tour.register('shop_sale_coupon', { - test: true, - url: '/shop?search=Small%20Cabinet', -}, - [ - { - content: "open customize menu", - extra_trigger: '.oe_website_sale .o_wsale_products_searchbar_form', - trigger: '#customize-menu > a', - }, - { - content: "enable 'Show # found' if needed", - trigger: "#customize-menu label:contains(Show # found)", - run: function () { - if (!$('#customize-menu label:contains(Show # found) input').prop('checked')) { - $('#customize-menu label:contains(Show # found)').click(); - } - } - }, - /* 1. Buy 1 Small Cabinet, enable coupon code & insert 10% code */ - { - content: "select Small Cabinet", - extra_trigger: '.oe_search_found', - trigger: '.oe_product_cart a:contains("Small Cabinet")', - }, - { - content: "add 2 Small Cabinet into cart", - trigger: '#product_details input[name="add_qty"]', - run: "text 2", - }, - { - content: "click on 'Add to Cart' button", - trigger: "a:contains(ADD TO CART)", - }, - tourUtils.goToCart(2), - { - content: "open customize menu", - extra_trigger: '.oe_website_sale .oe_cart', - trigger: '#customize-menu > a', - }, - { - content: "enable 'Promo Code' if needed", - trigger: "#customize-menu label:contains(Promo Code)", - run: function () { - if (!$('#customize-menu label:contains(Promo Code) input').prop('checked')) { - $('#customize-menu label:contains(Promo Code)').click(); - } - } - }, - { - content: "click on 'I have a promo code'", - extra_trigger: '.show_coupon', - trigger: '.show_coupon', - }, - { - content: "insert promo code 'testcode'", - extra_trigger: 'form[name="coupon_code"]', - trigger: 'form[name="coupon_code"] input[name="promo"]', - run: "text testcode", - }, - { - content: "validate the coupon", - trigger: 'form[name="coupon_code"] .a-submit', - }, - { - content: "check reward product", - trigger: '.td-product_name:contains("10.0% discount on total amount")', - run: function () {}, // it's a check - }, - /* 2. Add some cabinet to get a free one, play with quantity */ - { - content: "go to shop", - trigger: '.td-product_name:contains("10.0% discount on total amount")', - run: function () { - ajax.jsonRpc('/web/dataset/call_kw', 'call', { - model: 'account.tax', - method: 'create', - args: [{ - 'name':'15% tax incl ' + _.now(), - 'amount': 15, - }], - kwargs: {}, - }).then(function (tax_id) { - ajax.jsonRpc('/web/dataset/call_kw', 'call', { - model: 'product.template', - method: 'create', - args: [{ - 'name': 'Taxed Product', - 'taxes_id': [([6, false, [tax_id]])], - 'list_price': 100, - 'website_published': true, - }], - kwargs: {}, - }).then(function (data) { - location.href = '/shop'; - }); - }); - }, - }, - { - content: "type Taxed Product in search", - trigger: 'form input[name="search"]', - run: "text Taxed Product", - }, - { - content: "start search", - trigger: 'form:has(input[name="search"]) .oe_search_button', - }, - { - content: "select Taxed Product", - extra_trigger: '.oe_search_found', // Wait to be on search results or it sometimes throws concurent error (sent search form + click on product on /shop) - trigger: '.oe_product_cart a:containsExact("Taxed Product")', - }, - { - content: "click on 'Add to Cart' button", - trigger: "a:contains(ADD TO CART)", - }, - tourUtils.goToCart(3), - { - content: "check reduction amount got recomputed and merged both discount lines into one only", - extra_trigger: '.oe_currency_value:contains("-75.50"):not(#cart_total .oe_currency_value:contains("-75.50"))', - trigger: '.oe_website_sale .oe_cart', - run: function () {}, // it's a check - }, - /* 3. Add some cabinet to get a free one, play with quantity */ - { - content: "add one Small Cabinet", - trigger: '#cart_products input.js_quantity', - run: "text 3", - }, - { - content: "check reduction amount got recomputed when changing qty", - trigger: '.oe_currency_value:contains("-107.50")', - run: function () {}, // it's a check - }, - { - content: "add more Small Cabinet into cart", - trigger: '#cart_products input.js_quantity', - run: "text 4", - }, - { - content: "check free product is added", - trigger: '#wrap:has(.td-product_name:contains("Free Product - Small Cabinet"))', - run: function () {}, // it's a check - }, - { - content: "remove one cabinet from cart", - trigger: '#cart_products input.js_quantity[value="4"]', - run: "text 3", - }, - { - content: "check free product is removed", - trigger: '#wrap:not(:has(.td-product_name:contains("Free Product - Small Cabinet")))', - run: function () {}, // it's a check - }, - /* 4. Check /shop/payment does not break the `merged discount lines split per tax` (eg: with _compute_tax_id) */ - { - content: "go to checkout", - trigger: 'a[href="/shop/checkout?express=1"]', - }, - { - content: "check total is unchanged once we land on payment page", - extra_trigger: '#payment_method h3:contains("Pay with")', - trigger: 'tr#order_total .oe_currency_value:contains("967.50")', - run: function () {}, // it's a check - }, - ] -); -}); diff --git a/addons/website_sale_coupon/tests/__init__.py b/addons/website_sale_coupon/tests/__init__.py deleted file mode 100644 index 35870353044..00000000000 --- a/addons/website_sale_coupon/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from . import test_apply_pending_coupon -from . import test_sale_coupon_multiwebsite -from . import test_shop_sale_coupon diff --git a/addons/website_sale_coupon/tests/test_apply_pending_coupon.py b/addons/website_sale_coupon/tests/test_apply_pending_coupon.py deleted file mode 100644 index f8eecbf8487..00000000000 --- a/addons/website_sale_coupon/tests/test_apply_pending_coupon.py +++ /dev/null @@ -1,61 +0,0 @@ -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.addons.sale_coupon.tests.test_program_numbers import TestSaleCouponProgramNumbers -from odoo.addons.website.tools import MockRequest -from odoo.addons.website_sale_coupon.controllers.main import WebsiteSale -from odoo.tests import tagged - - -@tagged('-at_install', 'post_install') -class TestSaleCouponApplyPending(TestSaleCouponProgramNumbers): - - def setUp(self): - super().setUp() - - self.WebsiteSaleController = WebsiteSale() - - self.website = self.env['website'].browse(1) - self.global_program = self.p1 - self.coupon_program = self.env['coupon.program'].create({ - 'name': 'One Free Product', - 'program_type': 'coupon_program', - 'rule_min_quantity': 2.0, - 'reward_type': 'product', - 'reward_product_id': self.largeCabinet.id, - 'active': True, - }) - - self.coupon = self.env['coupon.coupon'].create({ - 'program_id': self.coupon_program.id, - }) - - def test_01_activate_coupon_with_existing_program(self): - order = self.empty_order - - with MockRequest(self.env, website=self.website, sale_order_id=order.id, website_sale_current_pl=1) as request: - self.WebsiteSaleController.cart_update_json(self.largeCabinet.id, set_qty=3) - self.WebsiteSaleController.pricelist(self.global_program.promo_code) - self.assertEqual(order.amount_total, 864, "The order total should equal 864: 3*320 - 10% discount ") - - self.WebsiteSaleController.activate_coupon(self.coupon.code) - promo_code = request.session.get('pending_coupon_code') - self.assertFalse(promo_code, "The promo code should be removed from the pending coupon dict") - self.assertEqual(order.amount_total, 576, "The order total should equal 576: 3*320 - 320 (free product) - 10%") - - def test_02_pending_coupon_with_existing_program(self): - order = self.empty_order - - with MockRequest(self.env, website=self.website, sale_order_id=order.id, website_sale_current_pl=1) as request: - self.WebsiteSaleController.cart_update_json(self.largeCabinet.id, set_qty=1) - self.WebsiteSaleController.pricelist(self.global_program.promo_code) - self.assertEqual(order.amount_total, 288, "The order total should equal 288: 320 - 10%") - - self.WebsiteSaleController.activate_coupon(self.coupon.code) - promo_code = request.session.get('pending_coupon_code') - self.assertEqual(order.amount_total, 288, "The order total should still equal 288 as the coupon for free product can't be applied since it requires 2 min qty") - self.assertEqual(promo_code, self.coupon.code, "The promo code should be set in the pending coupon dict as it couldn't be applied, we save it for later reuse") - - self.WebsiteSaleController.cart_update_json(self.largeCabinet.id, add_qty=2) - promo_code = request.session.get('pending_coupon_code') - self.assertFalse(promo_code, "The promo code should be removed from the pending coupon dict as it should have been applied") - self.assertEqual(order.amount_total, 576, "The order total should equal 576: 3*320 - 320 (free product) - 10%") diff --git a/addons/website_sale_coupon/tests/test_sale_coupon_multiwebsite.py b/addons/website_sale_coupon/tests/test_sale_coupon_multiwebsite.py deleted file mode 100644 index 4c50d5f8072..00000000000 --- a/addons/website_sale_coupon/tests/test_sale_coupon_multiwebsite.py +++ /dev/null @@ -1,149 +0,0 @@ -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.addons.sale_coupon.tests.test_program_numbers import TestSaleCouponProgramNumbers -from odoo.addons.website.tools import MockRequest -from odoo.exceptions import UserError -from odoo.tests import tagged - - -@tagged('-at_install', 'post_install') -class TestSaleCouponMultiwebsite(TestSaleCouponProgramNumbers): - - def setUp(self): - super(TestSaleCouponMultiwebsite, self).setUp() - self.website = self.env['website'].browse(1) - self.website2 = self.env['website'].create({'name': 'website 2'}) - - def test_01_multiwebsite_checks(self): - """ Ensure the multi website compliance of programs and coupons, both in - backend and frontend. - """ - order = self.empty_order - self.env['sale.order.line'].create({ - 'product_id': self.largeCabinet.id, - 'name': 'Large Cabinet', - 'product_uom_qty': 2.0, - 'order_id': order.id, - }) - - def _remove_reward(): - order.order_line.filtered('is_reward_line').unlink() - self.assertEqual(len(order.order_line.ids), 1, "Program should have been removed") - - def _apply_code(code, backend=True): - if backend: - self.env['sale.coupon.apply.code'].with_context(active_id=order.id).create({ - 'coupon_code': code - }).process_coupon() - else: - self.env['sale.coupon.apply.code'].sudo().apply_coupon(order, code) - - # ========================================== - # ========== Programs (with code) ========== - # ========================================== - - # 1. Backend - Generic - _apply_code(self.p1.promo_code) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic promo program") - _remove_reward() - - # 2. Frontend - Generic - with MockRequest(self.env, website=self.website): - _apply_code(self.p1.promo_code, False) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic promo program (2)") - _remove_reward() - - # make program specific - self.p1.website_id = self.website.id - # 3. Backend - Specific - with self.assertRaises(UserError): - _apply_code(self.p1.promo_code) # the order has no website_id so not possible to use a website specific code - - # 4. Frontend - Specific - Correct website - order.website_id = self.website.id - with MockRequest(self.env, website=self.website): - _apply_code(self.p1.promo_code, False) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a specific promo program for the correct website") - _remove_reward() - - # 5. Frontend - Specific - Wrong website - self.p1.website_id = self.website2.id - with MockRequest(self.env, website=self.website): - _apply_code(self.p1.promo_code, False) - self.assertEqual(len(order.order_line.ids), 1, "Should not get the reward as wrong website") - - # ============================== - # =========== Coupons ========== - # ============================== - - order.website_id = False - self.env['coupon.generate.wizard'].with_context(active_id=self.discount_coupon_program.id).create({ - 'nbr_coupons': 4, - }).generate_coupon() - coupons = self.discount_coupon_program.coupon_ids - - # 1. Backend - Generic - _apply_code(coupons[0].code) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic coupon program") - _remove_reward() - - # 2. Frontend - Generic - with MockRequest(self.env, website=self.website): - _apply_code(coupons[1].code, False) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic coupon program (2)") - _remove_reward() - - # make program specific - self.discount_coupon_program.website_id = self.website.id - # 3. Backend - Specific - with self.assertRaises(UserError): - _apply_code(coupons[2].code) # the order has no website_id so not possible to use a website specific code - - # 4. Frontend - Specific - Correct website - order.website_id = self.website.id - with MockRequest(self.env, website=self.website): - _apply_code(coupons[2].code, False) - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a specific coupon program for the correct website") - _remove_reward() - - # 5. Frontend - Specific - Wrong website - self.discount_coupon_program.website_id = self.website2.id - with MockRequest(self.env, website=self.website): - _apply_code(coupons[3].code, False) - self.assertEqual(len(order.order_line.ids), 1, "Should not get the reward as wrong website") - - # ======================================== - # ========== Programs (no code) ========== - # ======================================== - - order.website_id = False - self.p1.website_id = False - self.p1.promo_code = False - self.p1.promo_code_usage = 'no_code_needed' - - # 1. Backend - Generic - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic promo program") - - # 2. Frontend - Generic - with MockRequest(self.env, website=self.website): - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a generic promo program (2)") - - # make program specific - self.p1.website_id = self.website.id - # 3. Backend - Specific - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 1, "The order has no website_id so not possible to use a website specific code") - - # 4. Frontend - Specific - Correct website - order.website_id = self.website.id - with MockRequest(self.env, website=self.website): - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 2, "Should get the discount line as it is a specific promo program for the correct website") - - # 5. Frontend - Specific - Wrong website - self.p1.website_id = self.website2.id - with MockRequest(self.env, website=self.website): - order.recompute_coupon_lines() - self.assertEqual(len(order.order_line.ids), 1, "Should not get the reward as wrong website") diff --git a/addons/website_sale_coupon/tests/test_shop_sale_coupon.py b/addons/website_sale_coupon/tests/test_shop_sale_coupon.py deleted file mode 100644 index 0604455af06..00000000000 --- a/addons/website_sale_coupon/tests/test_shop_sale_coupon.py +++ /dev/null @@ -1,164 +0,0 @@ -# Part of Odoo. See LICENSE file for full copyright and licensing details. -from datetime import timedelta - -from odoo import fields -from odoo.tests import HttpCase, tagged, TransactionCase -from odoo.addons.sale.tests.test_sale_product_attribute_value_config import TestSaleProductAttributeValueCommon - - -@tagged('post_install', '-at_install') -class TestUi(TestSaleProductAttributeValueCommon, HttpCase): - - @classmethod - def setUpClass(cls): - super(TestUi, cls).setUpClass() - # set currency to not rely on demo data and avoid possible race condition - cls.currency_ratio = 1.0 - pricelist = cls.env.ref('product.list0') - new_currency = cls._setup_currency(cls.currency_ratio) - pricelist.currency_id = new_currency - pricelist.flush() - - - def test_01_admin_shop_sale_coupon_tour(self): - # pre enable "Show # found" option to avoid race condition... - public_category = self.env['product.public.category'].create({'name': 'Public Category'}) - - large_cabinet = self.env['product.product'].create({ - 'name': 'Small Cabinet', - 'list_price': 320.0, - 'type': 'consu', - 'is_published': True, - 'sale_ok': True, - 'public_categ_ids': [(4, public_category.id)], - 'taxes_id': False, - }) - - free_large_cabinet = self.env['product.product'].create({ - 'name': 'Free Product - Small Cabinet', - 'type': 'service', - 'taxes_id': False, - 'supplier_taxes_id': False, - 'sale_ok': False, - 'purchase_ok': False, - 'invoice_policy': 'order', - 'default_code': 'FREELARGECABINET', - 'categ_id': self.env.ref('product.product_category_all').id, - 'taxes_id': False, - }) - - ten_percent = self.env['product.product'].create({ - 'name': '10.0% discount on total amount', - 'type': 'service', - 'taxes_id': False, - 'supplier_taxes_id': False, - 'sale_ok': False, - 'purchase_ok': False, - 'invoice_policy': 'order', - 'default_code': '10PERCENTDISC', - 'categ_id': self.env.ref('product.product_category_all').id, - 'taxes_id': False, - }) - - self.env['coupon.program'].search([]).write({'active': False}) - - self.env['coupon.program'].create({ - 'name': "Buy 3 Small Cabinets, get one for free", - 'promo_code_usage': 'no_code_needed', - 'discount_apply_on': 'on_order', - 'reward_type': 'product', - 'program_type': 'promotion_program', - 'reward_product_id': large_cabinet.id, - 'rule_min_quantity': 3, - 'rule_products_domain': "[['name', 'ilike', 'Small Cabinet']]", - 'discount_line_product_id': free_large_cabinet.id - }) - - self.env['coupon.program'].create({ - 'name': "Code for 10% on orders", - 'promo_code_usage': 'code_needed', - 'promo_code': 'testcode', - 'discount_apply_on': 'on_order', - 'discount_type': 'percentage', - 'discount_percentage': 10.0, - 'program_type': 'promotion_program', - 'discount_line_product_id': ten_percent.id - }) - - self.env.ref("website_sale.search_count_box").write({"active": True}) - self.start_tour("/", 'shop_sale_coupon', login="admin") - - -@tagged('post_install', '-at_install') -class TestWebsiteSaleCoupon(TransactionCase): - - def setUp(self): - super(TestWebsiteSaleCoupon, self).setUp() - program = self.env['coupon.program'].create({ - 'name': '10% TEST Discount', - 'promo_code_usage': 'code_needed', - 'discount_apply_on': 'on_order', - 'discount_type': 'percentage', - 'discount_percentage': 10.0, - 'program_type': 'coupon_program', - }) - - self.env['coupon.generate.wizard'].with_context(active_id=program.id).create({}).generate_coupon() - self.coupon = program.coupon_ids[0] - - self.steve = self.env['res.partner'].create({ - 'name': 'Steve Bucknor', - 'email': 'steve.bucknor@example.com', - }) - self.empty_order = self.env['sale.order'].create({ - 'partner_id': self.steve.id - }) - - def test_01_gc_coupon(self): - # 1. Simulate a frontend order (website, product) - order = self.empty_order - order.website_id = self.env['website'].browse(1) - self.env['sale.order.line'].create({ - 'product_id': self.env['product.product'].create({ - 'name': 'Product A', - 'list_price': 100, - 'sale_ok': True, - }).id, - 'name': 'Product A', - 'product_uom_qty': 2.0, - 'order_id': order.id, - }) - - # 2. Apply the coupon - self.env['sale.coupon.apply.code'].with_context(active_id=order.id).create({ - 'coupon_code': self.coupon.code - }).process_coupon() - order.recompute_coupon_lines() - - self.assertEqual(len(order.applied_coupon_ids), 1, "The coupon should've been applied on the order") - self.assertEqual(self.coupon, order.applied_coupon_ids) - self.assertEqual(self.coupon.state, 'used') - - # 3. Test recent order -> Should not be removed - order._gc_abandoned_coupons() - - self.assertEqual(len(order.applied_coupon_ids), 1, "The coupon shouldn't have been removed from the order no more than 4 days") - self.assertEqual(self.coupon.state, 'used', "Should not have been changed") - - # 4. Test order not older than ICP validity -> Should not be removed - ICP = self.env['ir.config_parameter'] - icp_validity = ICP.create({'key': 'website_sale_coupon.abandonned_coupon_validity', 'value': 5}) - order.flush() - query = """UPDATE %s SET write_date = %%s WHERE id = %%s""" % (order._table,) - self.env.cr.execute(query, (fields.Datetime.to_string(fields.datetime.now() - timedelta(days=4, hours=2)), order.id)) - order._gc_abandoned_coupons() - - self.assertEqual(len(order.applied_coupon_ids), 1, "The coupon shouldn't have been removed from the order the order is 4 days old but icp validity is 5 days") - self.assertEqual(self.coupon.state, 'used', "Should not have been changed (2)") - - # 5. Test order with no ICP and older then 4 default days -> Should be removed - icp_validity.unlink() - order._gc_abandoned_coupons() - - self.assertEqual(len(order.applied_coupon_ids), 0, "The coupon should've been removed from the order as more than 4 days") - self.assertEqual(self.coupon.state, 'new', "Should have been reset.") diff --git a/addons/website_sale_coupon/views/coupon_share_views.xml b/addons/website_sale_coupon/views/coupon_share_views.xml deleted file mode 100644 index 29fdc252305..00000000000 --- a/addons/website_sale_coupon/views/coupon_share_views.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - coupon.share.form - coupon.share - -
- - -
-

- You can share this promotion with your customers. - It will be applied at checkout when the customer uses this link. -

-
- -
-
- - - - -
-
- -
-
-
diff --git a/addons/website_sale_coupon/views/res_config_settings_views.xml b/addons/website_sale_coupon/views/res_config_settings_views.xml deleted file mode 100644 index ae0837b65bb..00000000000 --- a/addons/website_sale_coupon/views/res_config_settings_views.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - res.config.settings.view.form.inherit.website.sale.coupon - res.config.settings - - - -
-
-
-
-
-
-
-
-
-
diff --git a/addons/website_sale_coupon/views/sale_coupon_coupon_views.xml b/addons/website_sale_coupon/views/sale_coupon_coupon_views.xml deleted file mode 100644 index 3544c8a80d2..00000000000 --- a/addons/website_sale_coupon/views/sale_coupon_coupon_views.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - coupon.coupon.tree - coupon.coupon - - - - - - diff --git a/addons/website_sale_coupon/views/sale_coupon_program_views.xml b/addons/website_sale_coupon/views/sale_coupon_program_views.xml deleted file mode 100644 index c122229149a..00000000000 --- a/addons/website_sale_coupon/views/sale_coupon_program_views.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - coupon.program.common.form - coupon.program - - - - - - - - - coupon.program.tree - coupon.program - - - - - - - - - - - - coupon.program.form - coupon.program - - - - - - - - - - - diff --git a/addons/pos_coupon/views/coupon_views.xml b/addons/pos_coupon/views/coupon_views.xml deleted file mode 100644 index 6de4678c280..00000000000 --- a/addons/pos_coupon/views/coupon_views.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - coupon.coupon.form - coupon.coupon - - - - - - - - - - - - diff --git a/addons/pos_coupon/views/pos_config_views.xml b/addons/pos_coupon/views/pos_config_views.xml deleted file mode 100644 index 80f4194730c..00000000000 --- a/addons/pos_coupon/views/pos_config_views.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - pos.config.form - pos.config - - - -
-
- -
-
-
-
-
-
-
-
diff --git a/addons/pos_coupon/views/res_config_settings_views.xml b/addons/pos_coupon/views/res_config_settings_views.xml deleted file mode 100644 index 8eabf8aeb79..00000000000 --- a/addons/pos_coupon/views/res_config_settings_views.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - res.config.form.inherit.pos.coupon - res.config.settings - - - -
-
-
-
-
-
-
-
From 1d57b44678c0af5f4352dee271214fd1bb638c26 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:09:48 +0100 Subject: [PATCH 09/19] [REM] gift_card: remove gift_card module Removes the gift_card modules as it is merged inside of loyalty. TaskId-2675382 --- addons/gift_card/__init__.py | 4 - addons/gift_card/__manifest__.py | 17 -- addons/gift_card/data/gift_card_data.xml | 23 --- addons/gift_card/i18n/gift_card.pot | 179 ------------------ addons/gift_card/models/__init__.py | 5 - addons/gift_card/models/gift_card.py | 58 ------ addons/gift_card/models/product.py | 23 --- addons/gift_card/security/ir.model.access.csv | 2 - addons/gift_card/static/img/gift_card.png | Bin 24678 -> 0 bytes addons/gift_card/views/views.xml | 62 ------ 10 files changed, 373 deletions(-) delete mode 100644 addons/gift_card/__init__.py delete mode 100644 addons/gift_card/__manifest__.py delete mode 100644 addons/gift_card/data/gift_card_data.xml delete mode 100644 addons/gift_card/i18n/gift_card.pot delete mode 100644 addons/gift_card/models/__init__.py delete mode 100644 addons/gift_card/models/gift_card.py delete mode 100644 addons/gift_card/models/product.py delete mode 100644 addons/gift_card/security/ir.model.access.csv delete mode 100644 addons/gift_card/static/img/gift_card.png delete mode 100644 addons/gift_card/views/views.xml diff --git a/addons/gift_card/__init__.py b/addons/gift_card/__init__.py deleted file mode 100644 index dc5e6b693d1..00000000000 --- a/addons/gift_card/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import models diff --git a/addons/gift_card/__manifest__.py b/addons/gift_card/__manifest__.py deleted file mode 100644 index 66150174ae0..00000000000 --- a/addons/gift_card/__manifest__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -{ - 'name': "Gift Card", - 'summary': "Use gift card", - 'description': """Integrate gift card mechanism""", - 'category': 'Sales/Sales', - 'version': '1.0', - 'depends': ['product'], - 'data': [ - 'data/gift_card_data.xml', - 'views/views.xml', - 'security/ir.model.access.csv', - ], - 'license': 'LGPL-3', -} diff --git a/addons/gift_card/data/gift_card_data.xml b/addons/gift_card/data/gift_card_data.xml deleted file mode 100644 index 89708f6398c..00000000000 --- a/addons/gift_card/data/gift_card_data.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Gift Card - 0 - service - - - - - - - - Gift Card - 50 - gift - - - - - diff --git a/addons/gift_card/i18n/gift_card.pot b/addons/gift_card/i18n/gift_card.pot deleted file mode 100644 index e6ad6829e9e..00000000000 --- a/addons/gift_card/i18n/gift_card.pot +++ /dev/null @@ -1,179 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * gift_card -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~14.5\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-14 10:28+0000\n" -"PO-Revision-Date: 2021-09-14 10:28+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: gift_card -#: model:ir.model.fields,help:gift_card.field_product_product__detailed_type -#: model:ir.model.fields,help:gift_card.field_product_template__detailed_type -msgid "" -"A storable product is a product for which you manage stock. The Inventory app has to be installed.\n" -"A consumable product is a product for which stock is not managed.\n" -"A service is a non-material product you provide." -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__balance -msgid "Balance" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__code -msgid "Code" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__company_id -msgid "Company" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__create_uid -msgid "Created by" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__create_date -msgid "Created on" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__currency_id -msgid "Currency" -msgstr "" - -#. module: gift_card -#: code:addons/gift_card/models/product.py:0 -#, python-format -msgid "Deleting the Gift Card Pay product is not allowed." -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__display_name -msgid "Display Name" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields.selection,name:gift_card.selection__gift_card__state__expired -msgid "Expired" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__expired_date -msgid "Expired Date" -msgstr "" - -#. module: gift_card -#: code:addons/gift_card/models/gift_card.py:0 -#, python-format -msgid "Gift #%s" -msgstr "" - -#. module: gift_card -#: model:ir.model,name:gift_card.model_gift_card -#: model:ir.model.fields.selection,name:gift_card.selection__product_template__detailed_type__gift -#: model:product.product,name:gift_card.gift_card_product_50 -#: model:product.product,name:gift_card.pay_with_gift_card_product -#: model:product.template,name:gift_card.gift_card_product_50_product_template -#: model:product.template,name:gift_card.pay_with_gift_card_product_product_template -#: model_terms:ir.ui.view,arch_db:gift_card.gift_card_view_search -#: model_terms:ir.ui.view,arch_db:gift_card.gift_card_view_tree -msgid "Gift Card" -msgstr "" - -#. module: gift_card -#: model:ir.actions.act_window,name:gift_card.gift_card_action -msgid "Gift Cards" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__id -msgid "ID" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,help:gift_card.field_gift_card__partner_id -msgid "If empty, all users can use it" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__initial_amount -msgid "Initial Amount" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card____last_update -msgid "Last Modified on" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__write_uid -msgid "Last Updated by" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__write_date -msgid "Last Updated on" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__name -msgid "Name" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__partner_id -msgid "Partner" -msgstr "" - -#. module: gift_card -#: model:ir.model,name:gift_card.model_product_template -msgid "Product Template" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_product_product__detailed_type -#: model:ir.model.fields,field_description:gift_card.field_product_template__detailed_type -msgid "Product Type" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields,field_description:gift_card.field_gift_card__state -msgid "State" -msgstr "" - -#. module: gift_card -#: model:ir.model.constraint,message:gift_card.constraint_gift_card_unique_gift_card_code -msgid "The gift card code must be unique." -msgstr "" - -#. module: gift_card -#: model:ir.model.constraint,message:gift_card.constraint_gift_card_check_amount -msgid "The initial amount must be positive." -msgstr "" - -#. module: gift_card -#: model:product.product,uom_name:gift_card.gift_card_product_50 -#: model:product.product,uom_name:gift_card.pay_with_gift_card_product -#: model:product.template,uom_name:gift_card.gift_card_product_50_product_template -#: model:product.template,uom_name:gift_card.pay_with_gift_card_product_product_template -msgid "Units" -msgstr "" - -#. module: gift_card -#: model:ir.model.fields.selection,name:gift_card.selection__gift_card__state__valid -#: model_terms:ir.ui.view,arch_db:gift_card.gift_card_view_search -msgid "Valid" -msgstr "" diff --git a/addons/gift_card/models/__init__.py b/addons/gift_card/models/__init__.py deleted file mode 100644 index 798243253f1..00000000000 --- a/addons/gift_card/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import gift_card -from . import product diff --git a/addons/gift_card/models/gift_card.py b/addons/gift_card/models/gift_card.py deleted file mode 100644 index 516a392c7ed..00000000000 --- a/addons/gift_card/models/gift_card.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import _, api, fields, models -from uuid import uuid4 - - -class GiftCard(models.Model): - _name = "gift.card" - _description = "Gift Card" - _order = 'id desc' - _check_company_auto = True - - @api.model - def _generate_code(self): - return '044' + str(uuid4())[4:-8][3:] - - name = fields.Char(compute='_compute_name') - code = fields.Char(default=lambda x: x._generate_code(), required=True, readonly=True, copy=False) - partner_id = fields.Many2one('res.partner', help="If empty, all users can use it") - company_id = fields.Many2one('res.company', default=lambda self: self.env.company) - currency_id = fields.Many2one('res.currency', readonly=True, related='company_id.currency_id') - initial_amount = fields.Monetary(required=True, currency_field='currency_id') - balance = fields.Monetary(compute="_compute_balance") # in company currency - expired_date = fields.Date(default=lambda self: fields.Date.add(fields.Date.today(), years=1)) - state = fields.Selection( - selection=[('valid', 'Valid'), ('expired', 'Expired')], - default='valid', - copy=False - ) - - _sql_constraints = [ - ('unique_gift_card_code', 'UNIQUE(code)', 'The gift card code must be unique.'), - ('check_amount', 'CHECK(initial_amount >= 0)', 'The initial amount must be positive.') - ] - - def _compute_name(self): - for record in self: - record.name = _("Gift #%s", record.id) - - @api.autovacuum - def _gc_mark_expired_gift_card(self): - self.env['gift.card'].search([ - '&', ('state', '=', 'valid'), ('expired_date', '<', fields.Date.today()) - ]).write({'state': 'expired'}) - - def balance_converted(self, currency_id=False): - # helper to convert the current balance in the currency provided - return self.currency_id._convert(self.balance, currency_id, self.env.company, fields.Date.today()) - - def can_be_used(self): - # expired state are computed once a day, so can be not synchro - return self.state == 'valid' and self.balance > 0 and self.expired_date >= fields.Date.today() - - @api.depends("initial_amount") - def _compute_balance(self): - for record in self: - record.balance = record.initial_amount diff --git a/addons/gift_card/models/product.py b/addons/gift_card/models/product.py deleted file mode 100644 index 636891e41e1..00000000000 --- a/addons/gift_card/models/product.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import _, api, fields, models -from odoo.exceptions import UserError - - -class ProductTemplate(models.Model): - _inherit = "product.template" - - detailed_type = fields.Selection(selection_add=[ - ('gift', 'Gift Card'), - ], ondelete={'gift': 'set service'}) - - def _detailed_type_mapping(self): - type_mapping = super()._detailed_type_mapping() - type_mapping['gift'] = 'service' - return type_mapping - - @api.ondelete(at_uninstall=False) - def _unlink_gift_card_product(self): - if self.env.ref('gift_card.pay_with_gift_card_product').product_tmpl_id in self: - raise UserError(_('Deleting the Gift Card Pay product is not allowed.')) diff --git a/addons/gift_card/security/ir.model.access.csv b/addons/gift_card/security/ir.model.access.csv deleted file mode 100644 index 64ddf646f26..00000000000 --- a/addons/gift_card/security/ir.model.access.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_gift_card_all,Gift Card Program All,model_gift_card,,0,0,0,0 diff --git a/addons/gift_card/static/img/gift_card.png b/addons/gift_card/static/img/gift_card.png deleted file mode 100644 index 15a42a747dd8ef367e8e9ecb64d3c5c5e2e9e169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24678 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 diff --git a/addons/gift_card/views/views.xml b/addons/gift_card/views/views.xml deleted file mode 100644 index 19169d9f60b..00000000000 --- a/addons/gift_card/views/views.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Gift Cards - gift.card - tree,form - {'search_default_valid': True} - - - - - gift.card.tree - gift.card - - - - - - - - - - - gift.card.form - gift.card - -
-
- -
- - - - - - - - - - - - - - - -
-
-
- - - - gift.card.search - gift.card - - - - - - - -
From 310fde17f0197832359ee76d2d377155abab3af6 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:10:26 +0100 Subject: [PATCH 10/19] [REM] sale_gift_card: remove sale_gift_card module Removes the sale_gift_card module as it is being merged inside of sale_loyalty. TaskId-2675382 --- addons/sale_gift_card/__init__.py | 4 - addons/sale_gift_card/__manifest__.py | 20 --- addons/sale_gift_card/data/gift_card_data.xml | 14 -- .../data/mail_template_data.xml | 36 ---- addons/sale_gift_card/i18n/sale_gift_card.pot | 158 ------------------ addons/sale_gift_card/models/__init__.py | 5 - addons/sale_gift_card/models/gift_card.py | 24 --- addons/sale_gift_card/models/sale_order.py | 103 ------------ .../security/ir.model.access.csv | 3 - addons/sale_gift_card/tests/__init__.py | 5 - addons/sale_gift_card/tests/common.py | 52 ------ .../tests/test_buy_gift_card.py | 62 ------- .../tests/test_pay_with_gift_card.py | 55 ------ .../sale_gift_card/views/sale_order_view.xml | 47 ------ addons/sale_gift_card/views/templates.xml | 56 ------- 15 files changed, 644 deletions(-) delete mode 100644 addons/sale_gift_card/__init__.py delete mode 100644 addons/sale_gift_card/__manifest__.py delete mode 100644 addons/sale_gift_card/data/gift_card_data.xml delete mode 100644 addons/sale_gift_card/data/mail_template_data.xml delete mode 100644 addons/sale_gift_card/i18n/sale_gift_card.pot delete mode 100644 addons/sale_gift_card/models/__init__.py delete mode 100644 addons/sale_gift_card/models/gift_card.py delete mode 100644 addons/sale_gift_card/models/sale_order.py delete mode 100644 addons/sale_gift_card/security/ir.model.access.csv delete mode 100644 addons/sale_gift_card/tests/__init__.py delete mode 100644 addons/sale_gift_card/tests/common.py delete mode 100644 addons/sale_gift_card/tests/test_buy_gift_card.py delete mode 100644 addons/sale_gift_card/tests/test_pay_with_gift_card.py delete mode 100644 addons/sale_gift_card/views/sale_order_view.xml delete mode 100644 addons/sale_gift_card/views/templates.xml diff --git a/addons/sale_gift_card/__init__.py b/addons/sale_gift_card/__init__.py deleted file mode 100644 index dc5e6b693d1..00000000000 --- a/addons/sale_gift_card/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import models diff --git a/addons/sale_gift_card/__manifest__.py b/addons/sale_gift_card/__manifest__.py deleted file mode 100644 index 328f215e89e..00000000000 --- a/addons/sale_gift_card/__manifest__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -{ - 'name': "Gift Card for sales module", - 'summary': "Use gift card in your sales orders", - 'description': """Integrate gift card mechanism in sales orders.""", - 'category': 'Sales/Sales', - 'version': '1.0', - 'depends': ['gift_card', 'sale'], - 'auto_install': True, - 'data': [ - 'data/gift_card_data.xml', - 'data/mail_template_data.xml', - 'views/sale_order_view.xml', - 'views/templates.xml', - 'security/ir.model.access.csv', - ], - 'license': 'LGPL-3', -} diff --git a/addons/sale_gift_card/data/gift_card_data.xml b/addons/sale_gift_card/data/gift_card_data.xml deleted file mode 100644 index 1830684c64e..00000000000 --- a/addons/sale_gift_card/data/gift_card_data.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/addons/sale_gift_card/data/mail_template_data.xml b/addons/sale_gift_card/data/mail_template_data.xml deleted file mode 100644 index a0008743532..00000000000 --- a/addons/sale_gift_card/data/mail_template_data.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - Gift Card: Send by Email - - Your Gift Card - {{ object.partner_id.id or object.buy_line_id.order_id.partner_id.id }} - -
- Here is your gift card! -
-
- -
-
-

- $ 150.00

-
-
-

- Gift Card Code -

-

4f10-15d6-41b7-b04c-7b3e

-
-
-

Card expires 05/05/2021

-
- -
- -
-
diff --git a/addons/sale_gift_card/i18n/sale_gift_card.pot b/addons/sale_gift_card/i18n/sale_gift_card.pot deleted file mode 100644 index 616156b152d..00000000000 --- a/addons/sale_gift_card/i18n/sale_gift_card.pot +++ /dev/null @@ -1,158 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_gift_card -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-05 10:54+0000\n" -"PO-Revision-Date: 2021-10-05 10:54+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_gift_card -#: model:mail.template,body_html:sale_gift_card.mail_template_gift_card -msgid "" -"
\n" -" Here is your gift card!\n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -"

\n" -" $ 150.00

\n" -"
\n" -"
\n" -"

\n" -" Gift Card Code\n" -"

\n" -"

4f10-15d6-41b7-b04c-7b3e

\n" -"
\n" -"
\n" -"

Card expires 05/05/2021

\n" -"
\n" -"
\n" -" \n" -" Use it right now!\n" -" \n" -"
\n" -" " -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.sale_purchased_gift_card -msgid " Copy" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,field_description:sale_gift_card.field_sale_order_line__generated_gift_card_ids -msgid "Bought Gift Card" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,field_description:sale_gift_card.field_gift_card__buy_line_id -msgid "Buy Line" -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.used_gift_card -msgid "Code:" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,help:sale_gift_card.field_sale_order_line__gift_card_id -msgid "Deducted from this Gift Card" -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.used_gift_card -msgid "Expired Date:" -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.sale_purchased_gift_card -msgid "Gift #" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model,name:sale_gift_card.model_gift_card -#: model:ir.model.fields,field_description:sale_gift_card.field_sale_order_line__gift_card_id -msgid "Gift Card" -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.sale_purchased_gift_card -msgid "Gift Card Code" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,field_description:sale_gift_card.field_sale_order__gift_card_count -msgid "Gift Card Count" -msgstr "" - -#. module: sale_gift_card -#: code:addons/sale_gift_card/models/sale_order.py:0 -#, python-format -msgid "Gift Card already used." -msgstr "" - -#. module: sale_gift_card -#: code:addons/sale_gift_card/models/sale_order.py:0 -#, python-format -msgid "Gift Card are restricted for another user." -msgstr "" - -#. module: sale_gift_card -#: model:mail.template,name:sale_gift_card.mail_template_gift_card -msgid "Gift Card: Send by Email" -msgstr "" - -#. module: sale_gift_card -#: model:ir.actions.act_window,name:sale_gift_card.gift_card_sale_order_action -#: model_terms:ir.ui.view,arch_db:sale_gift_card.sale_order_view_extend_gift_card_form -msgid "Gift Cards" -msgstr "" - -#. module: sale_gift_card -#: code:addons/sale_gift_card/models/sale_order.py:0 -#, python-format -msgid "Invalid or Expired Gift Card." -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,field_description:sale_gift_card.field_gift_card__redeem_line_ids -msgid "Redeems" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model.fields,help:sale_gift_card.field_gift_card__buy_line_id -msgid "Sale Order line where this gift card has been bought." -msgstr "" - -#. module: sale_gift_card -#: model:ir.model,name:sale_gift_card.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_gift_card -#: model:ir.model,name:sale_gift_card.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: sale_gift_card -#: model_terms:ir.ui.view,arch_db:sale_gift_card.sale_purchased_gift_card -msgid "" -"You will find below your gift cards code. An email has been sent with it. " -"You can use it starting right now." -msgstr "" - -#. module: sale_gift_card -#: model:mail.template,subject:sale_gift_card.mail_template_gift_card -msgid "Your Gift Card" -msgstr "" diff --git a/addons/sale_gift_card/models/__init__.py b/addons/sale_gift_card/models/__init__.py deleted file mode 100644 index 733bcda9ea8..00000000000 --- a/addons/sale_gift_card/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import gift_card -from . import sale_order diff --git a/addons/sale_gift_card/models/gift_card.py b/addons/sale_gift_card/models/gift_card.py deleted file mode 100644 index 8bc5568b741..00000000000 --- a/addons/sale_gift_card/models/gift_card.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models - - -class GiftCard(models.Model): - _inherit = "gift.card" - - buy_line_id = fields.Many2one("sale.order.line", copy=False, readonly=True, - help="Sale Order line where this gift card has been bought.") - redeem_line_ids = fields.One2many('sale.order.line', 'gift_card_id', string="Redeems") - - @api.depends("redeem_line_ids") - def _compute_balance(self): - super()._compute_balance() - for record in self: - confirmed_line = record.redeem_line_ids.filtered(lambda l: l.state in ('sale', 'done')) - balance = record.balance - if confirmed_line: - balance -= sum(confirmed_line.mapped( - lambda line: line.currency_id._convert(line.price_unit, record.currency_id, record.env.company, line.create_date) * -1 - )) - record.balance = balance diff --git a/addons/sale_gift_card/models/sale_order.py b/addons/sale_gift_card/models/sale_order.py deleted file mode 100644 index 5237ce90425..00000000000 --- a/addons/sale_gift_card/models/sale_order.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import _, api, fields, models - - -class SaleOrder(models.Model): - _inherit = "sale.order" - - gift_card_count = fields.Integer(compute="_compute_gift_card_count") - - @api.depends("order_line.generated_gift_card_ids") - def _compute_gift_card_count(self): - for record in self: - record.gift_card_count = len(record.order_line.mapped("generated_gift_card_ids")) - - @api.constrains('state') - def _constrains_state(self): - # release gift card amount when order state become canceled - for record in self.filtered(lambda so: so.state == 'cancel'): - record.order_line.filtered(lambda ol: ol.gift_card_id).unlink() - - # create and send gift card when order become confirmed - for record in self.filtered(lambda so: so.state == 'sale'): - for gift_card_order_line in record.order_line.filtered(lambda ol: ol.product_id.detailed_type == 'gift'): - gift_card_order_line._create_gift_cards() - record.sudo()._send_gift_card_mail() - - def _pay_with_gift_card(self, gift_card): - error = False - - if not gift_card.can_be_used(): - error = _('Invalid or Expired Gift Card.') - elif gift_card in self.order_line.mapped("gift_card_id"): - error = _('Gift Card already used.') - elif gift_card.partner_id and gift_card.partner_id != self.env.user.partner_id: - error = _('Gift Card are restricted for another user.') - - amount = min(self.amount_total, gift_card.balance_converted(self.currency_id)) - if not error and amount > 0: - pay_gift_card_id = self.env.ref('gift_card.pay_with_gift_card_product') - gift_card.redeem_line_ids.filtered(lambda redeem: redeem.state != "sale").unlink() - self.env["sale.order.line"].create({ - 'product_id': pay_gift_card_id.id, - 'price_unit': - amount, - 'gift_card_id': gift_card.id, - 'order_id': self.id - }) - return error - - def _send_gift_card_mail(self): - template = self.env.ref('sale_gift_card.mail_template_gift_card', raise_if_not_found=False) - if template and self.gift_card_count: - for gift in self.order_line.mapped("generated_gift_card_ids"): - template.send_mail(gift.id, force_send=True, email_layout_xmlid='mail.mail_notification_light') - - def _recompute_gift_card_lines(self): - for record in self: - lines_to_remove = self.env['sale.order.line'] - lines_to_update = [] - - gift_payment_lines = record.order_line.filtered('gift_card_id') - to_pay = sum((self.order_line - gift_payment_lines).mapped('price_total')) - - # consume older gift card first - for gift_card_line in gift_payment_lines.sorted(lambda line: line.gift_card_id.expired_date): - amount = min(to_pay, gift_card_line.gift_card_id.balance_converted(record.currency_id)) - if amount: - to_pay -= amount - if gift_card_line.price_unit != -amount or gift_card_line.product_uom_qty != 1: - lines_to_update.append( - fields.Command.update(gift_card_line.id, {'price_unit': -amount, 'product_uom_qty': 1}) - ) - else: - lines_to_remove += gift_card_line - lines_to_remove.unlink() - record.update({'order_line': lines_to_update}) - - -class SaleOrderLine(models.Model): - _inherit = "sale.order.line" - - generated_gift_card_ids = fields.One2many('gift.card', "buy_line_id", string="Bought Gift Card") - gift_card_id = fields.Many2one('gift.card', help="Deducted from this Gift Card", copy=False) - - def _is_not_sellable_line(self): - return self.gift_card_id or super()._is_not_sellable_line() - - def _create_gift_cards(self): - return self.env['gift.card'].create( - [self._build_gift_card() for _ in range(int(self.product_uom_qty))] - ) - - def _build_gift_card(self): - return { - 'initial_amount': self.order_id.currency_id._convert( - self.price_unit, - self.order_id.env.company.currency_id, - self.order_id.env.company, - fields.Date.today() - ), - 'buy_line_id': self.id, - } diff --git a/addons/sale_gift_card/security/ir.model.access.csv b/addons/sale_gift_card/security/ir.model.access.csv deleted file mode 100644 index 99bb48e912b..00000000000 --- a/addons/sale_gift_card/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_gift_card_sales,Gift Card Program Salesman,model_gift_card,sales_team.group_sale_salesman,1,0,0,0 -access_gift_card_manager,Gift Card Program Sale Manager,model_gift_card,sales_team.group_sale_manager,1,1,1,1 diff --git a/addons/sale_gift_card/tests/__init__.py b/addons/sale_gift_card/tests/__init__.py deleted file mode 100644 index f068a01afad..00000000000 --- a/addons/sale_gift_card/tests/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import test_buy_gift_card -from . import test_pay_with_gift_card diff --git a/addons/sale_gift_card/tests/common.py b/addons/sale_gift_card/tests/common.py deleted file mode 100644 index dd138295c36..00000000000 --- a/addons/sale_gift_card/tests/common.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.addons.sale.tests.test_sale_product_attribute_value_config import TestSaleProductAttributeValueCommon - - -class TestSaleGiftCardCommon(TestSaleProductAttributeValueCommon): - - @classmethod - def setUpClass(cls): - super().setUpClass() - - # set currency to not rely on demo data and avoid possible race condition - cls.currency_ratio = 1.0 - pricelist = cls.env.ref("product.list0") - pricelist.currency_id = cls._setup_currency(cls.currency_ratio) - - - # create partner for sale order. - cls.fatima = cls.env['res.partner'].create({ - 'name': 'Fatima Kalai', - 'email': 'fatima.kalai@example.com', - }) - - cls.empty_order = cls.env['sale.order'].create({ - 'partner_id': cls.fatima.id - }) - - cls.uom_unit = cls.env.ref('uom.product_uom_unit') - - # Taxes - cls.tax_15pc_excl = cls.env['account.tax'].create({ - 'name': "Tax 15%", - 'amount_type': 'percent', - 'amount': 15, - 'type_tax_use': 'sale', - }) - - #products - cls.product_A = cls.env['product.product'].create({ - 'name': 'Product A', - 'list_price': 100, - 'sale_ok': True, - 'taxes_id': [(6, 0, [cls.tax_15pc_excl.id])], - }) - cls.product_gift_card = cls.env['product.product'].create({ - 'name': 'Gift Card 50', - 'detailed_type': 'gift', - 'list_price': 50, - 'sale_ok': True, - 'taxes_id': False, - }) diff --git a/addons/sale_gift_card/tests/test_buy_gift_card.py b/addons/sale_gift_card/tests/test_buy_gift_card.py deleted file mode 100644 index b426e844da4..00000000000 --- a/addons/sale_gift_card/tests/test_buy_gift_card.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import Command -from odoo.addons.sale_gift_card.tests.common import TestSaleGiftCardCommon -from odoo.tests.common import tagged - -@tagged('-at_install', 'post_install') -class TestBuyGiftCard(TestSaleGiftCardCommon): - - def test_buying_simple_gift_card(self): - order = self.empty_order - order.write({'order_line': [ - (0, False, { - 'product_id': self.product_A.id, - 'name': 'Ordinary Product A', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }), - (0, False, { - 'product_id': self.product_gift_card.id, - 'name': 'Gift Card Product', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }) - ]}) - self.assertEqual(len(order.order_line.ids), 2) - self.assertEqual(order.gift_card_count, 0) - self.assertEqual(len(order.order_line.mapped('generated_gift_card_ids')), 0) - order.action_confirm() - # After Confirmation - self.assertEqual(order.gift_card_count, 1) - self.assertEqual(len(order.order_line.mapped('generated_gift_card_ids')), 1) - - def test_buying_multiple_gift_card(self): - order = self.empty_order - order.write({'order_line': [ - Command.create({ - 'product_id': self.product_A.id, - 'name': 'Ordinary Product A', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }), - Command.create({ - 'product_id': self.product_gift_card.id, - 'name': 'Gift Card Product', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }), - Command.create({ - 'product_id': self.product_gift_card.id, - 'name': 'Gift Card Product', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }) - ]}) - self.assertEqual(order.gift_card_count, 0) - self.assertEqual(len(order.order_line.mapped('generated_gift_card_ids')), 0) - order.action_confirm() - # After Confirmation - self.assertEqual(order.gift_card_count, 2) - self.assertEqual(len(order.order_line.mapped('generated_gift_card_ids')), 2) diff --git a/addons/sale_gift_card/tests/test_pay_with_gift_card.py b/addons/sale_gift_card/tests/test_pay_with_gift_card.py deleted file mode 100644 index e0d16065288..00000000000 --- a/addons/sale_gift_card/tests/test_pay_with_gift_card.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import Command -from odoo.addons.sale_gift_card.tests.common import TestSaleGiftCardCommon -from odoo.exceptions import UserError -from odoo.tests.common import tagged - -@tagged('-at_install', 'post_install') -class TestPayWithGiftCard(TestSaleGiftCardCommon): - - def test_paying_with_single_gift_card(self): - gift_card = self.env['gift.card'].create({ - 'initial_amount': 100, - }) - order = self.empty_order - order.write({'order_line': [ - Command.create({ - 'product_id': self.product_A.id, - 'name': 'Ordinary Product A', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 1.0, - }) - ]}) - before_gift_card_payment = order.amount_total - self.assertNotEqual(before_gift_card_payment, 0) - order._pay_with_gift_card(gift_card) - order.action_confirm() - self.assertEqual(before_gift_card_payment - order.amount_total, gift_card.initial_amount - gift_card.balance) - - def test_paying_with_multiple_gift_card(self): - gift_card_1 = self.env['gift.card'].create({ - 'initial_amount': 100, - }) - gift_card_2 = self.env['gift.card'].create({ - 'initial_amount': 100, - }) - order = self.empty_order - order.write({'order_line': [ - Command.create({ - 'product_id': self.product_A.id, - 'name': 'Ordinary Product A', - 'product_uom': self.uom_unit.id, - 'product_uom_qty': 20.0, - }) - ]}) - before_gift_card_payment = order.amount_total - order._pay_with_gift_card(gift_card_1) - order._pay_with_gift_card(gift_card_2) - self.assertEqual(order.amount_total, before_gift_card_payment - 200) - - def test_unlink_gift_card_product(self): - with self.assertRaises(UserError): - # try to delete several product including pay_with_gift_card_product - self.env['product.template'].search([('purchase_ok', '=', False), ('sale_ok', '=', False)]).unlink() diff --git a/addons/sale_gift_card/views/sale_order_view.xml b/addons/sale_gift_card/views/sale_order_view.xml deleted file mode 100644 index 4c5afdab155..00000000000 --- a/addons/sale_gift_card/views/sale_order_view.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - Gift Cards - gift.card - tree,form - [('buy_line_id.order_id', '=', active_id)] - - - - sale.order.view.form.inherit.gift.card - sale.order - - - - - - - - - - gift.card.form Website - gift.card - - - - - - - - - - - - - - - - - diff --git a/addons/sale_gift_card/views/templates.xml b/addons/sale_gift_card/views/templates.xml deleted file mode 100644 index 45f0e65051b..00000000000 --- a/addons/sale_gift_card/views/templates.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - From 3cb14481336f7959ea1be91858f190ead6ec7537 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:11:01 +0100 Subject: [PATCH 11/19] [REM] website_sale_gift_card: remove website_sale_gift_card module Removes the website_sale_gift_card module as it is being merged inside of website_sale_loyalty. TaskId-2675382 --- addons/website_sale_gift_card/__init__.py | 5 -- addons/website_sale_gift_card/__manifest__.py | 25 ------- .../controllers/__init__.py | 4 -- .../controllers/gift_card_controller.py | 33 --------- .../data/product_demo.xml | 6 -- .../i18n/website_sale_gift_card.pot | 67 ------------------- .../website_sale_gift_card/models/__init__.py | 5 -- .../models/gift_card.py | 15 ----- .../models/sale_order.py | 33 --------- .../static/src/js/website_sale_gift_card.js | 30 --------- .../views/gift_card_menus.xml | 8 --- .../views/gift_card_views.xml | 25 ------- .../website_sale_gift_card/views/template.xml | 63 ----------------- 13 files changed, 319 deletions(-) delete mode 100644 addons/website_sale_gift_card/__init__.py delete mode 100644 addons/website_sale_gift_card/__manifest__.py delete mode 100644 addons/website_sale_gift_card/controllers/__init__.py delete mode 100644 addons/website_sale_gift_card/controllers/gift_card_controller.py delete mode 100644 addons/website_sale_gift_card/data/product_demo.xml delete mode 100644 addons/website_sale_gift_card/i18n/website_sale_gift_card.pot delete mode 100644 addons/website_sale_gift_card/models/__init__.py delete mode 100644 addons/website_sale_gift_card/models/gift_card.py delete mode 100644 addons/website_sale_gift_card/models/sale_order.py delete mode 100644 addons/website_sale_gift_card/static/src/js/website_sale_gift_card.js delete mode 100644 addons/website_sale_gift_card/views/gift_card_menus.xml delete mode 100644 addons/website_sale_gift_card/views/gift_card_views.xml delete mode 100644 addons/website_sale_gift_card/views/template.xml diff --git a/addons/website_sale_gift_card/__init__.py b/addons/website_sale_gift_card/__init__.py deleted file mode 100644 index 7d34c7c054a..00000000000 --- a/addons/website_sale_gift_card/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import controllers -from . import models diff --git a/addons/website_sale_gift_card/__manifest__.py b/addons/website_sale_gift_card/__manifest__.py deleted file mode 100644 index 13c2130da21..00000000000 --- a/addons/website_sale_gift_card/__manifest__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -{ - 'name': "Website Sale Gift Card", - 'summary': "Use gift card in eCommerce", - 'description': """Integrate gift card mechanism in your ecommerce.""", - 'category': 'Website/Website', - 'version': '1.0', - 'depends': ['website_sale', 'sale_gift_card'], - 'data': [ - 'views/template.xml', - 'views/gift_card_views.xml', - 'views/gift_card_menus.xml', - ], - 'demo': [ - 'data/product_demo.xml', - ], - 'assets': { - 'web.assets_frontend': [ - 'website_sale_gift_card/static/**/*', - ], - }, - 'license': 'LGPL-3', -} diff --git a/addons/website_sale_gift_card/controllers/__init__.py b/addons/website_sale_gift_card/controllers/__init__.py deleted file mode 100644 index d4bda54b506..00000000000 --- a/addons/website_sale_gift_card/controllers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import gift_card_controller diff --git a/addons/website_sale_gift_card/controllers/gift_card_controller.py b/addons/website_sale_gift_card/controllers/gift_card_controller.py deleted file mode 100644 index ed0a5360681..00000000000 --- a/addons/website_sale_gift_card/controllers/gift_card_controller.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import http -from odoo.http import request -from odoo.addons.website_sale.controllers import main - - -class GiftCardController(main.WebsiteSale): - - @http.route('/shop/pay_with_gift_card', type='http', methods=['POST'], website=True, auth='public') - def add_gift_card(self, gift_card_code, **post): - gift_card = request.env["gift.card"].sudo().search([('code', '=', gift_card_code.strip())], limit=1) - order = request.env['website'].get_current_website().sale_get_order() - gift_card_status = order._pay_with_gift_card(gift_card) - return request.redirect('/shop/payment' + ('?gift_card_error=%s' % gift_card_status if gift_card_status else '')) - - @http.route() - def shop_payment(self, **post): - order = request.website.sale_get_order() - order._recompute_gift_card_lines() - return super().shop_payment(**post) - - @http.route(['/shop/cart'], type='http', auth="public", website=True) - def cart(self, **post): - order = request.website.sale_get_order() - order._recompute_gift_card_lines() - return super().cart(**post) - - def _get_shop_payment_values(self, order, **kwargs): - values = super()._get_shop_payment_values(order, **kwargs) - values['allow_pay_with_gift_card'] = True - return values diff --git a/addons/website_sale_gift_card/data/product_demo.xml b/addons/website_sale_gift_card/data/product_demo.xml deleted file mode 100644 index 79251b8431b..00000000000 --- a/addons/website_sale_gift_card/data/product_demo.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/addons/website_sale_gift_card/i18n/website_sale_gift_card.pot b/addons/website_sale_gift_card/i18n/website_sale_gift_card.pot deleted file mode 100644 index 65d49a2de5f..00000000000 --- a/addons/website_sale_gift_card/i18n/website_sale_gift_card.pot +++ /dev/null @@ -1,67 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * website_sale_gift_card -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~14.4\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-12 07:50+0000\n" -"PO-Revision-Date: 2021-07-12 07:50+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: website_sale_gift_card -#: model:ir.model,name:website_sale_gift_card.model_gift_card -#: model_terms:ir.ui.view,arch_db:website_sale_gift_card.gift_card_view_search -msgid "Gift Card" -msgstr "" - -#. module: website_sale_gift_card -#: model:ir.ui.menu,name:website_sale_gift_card.website_product_gift_card_menu -msgid "Gift Cards" -msgstr "" - -#. module: website_sale_gift_card -#: model_terms:ir.ui.view,arch_db:website_sale_gift_card.pay_with_gift_card_form -msgid "Gift card code..." -msgstr "" - -#. module: website_sale_gift_card -#: model_terms:ir.ui.view,arch_db:website_sale_gift_card.pay_with_gift_card_form -msgid "Pay" -msgstr "" - -#. module: website_sale_gift_card -#: model_terms:ir.ui.view,arch_db:website_sale_gift_card.add_gift_card -msgid "Pay with a gift card" -msgstr "" - -#. module: website_sale_gift_card -#: model:ir.model.fields,help:website_sale_gift_card.field_gift_card__website_id -msgid "Restrict publishing to this website." -msgstr "" - -#. module: website_sale_gift_card -#: model:ir.model,name:website_sale_gift_card.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: website_sale_gift_card -#: model:ir.model,name:website_sale_gift_card.model_sale_order_line -msgid "Sales Order Line" -msgstr "" - -#. module: website_sale_gift_card -#: model_terms:ir.ui.view,arch_db:website_sale_gift_card.gift_card_view_search -msgid "Valid" -msgstr "" - -#. module: website_sale_gift_card -#: model:ir.model.fields,field_description:website_sale_gift_card.field_gift_card__website_id -msgid "Website" -msgstr "" diff --git a/addons/website_sale_gift_card/models/__init__.py b/addons/website_sale_gift_card/models/__init__.py deleted file mode 100644 index 733bcda9ea8..00000000000 --- a/addons/website_sale_gift_card/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import gift_card -from . import sale_order diff --git a/addons/website_sale_gift_card/models/gift_card.py b/addons/website_sale_gift_card/models/gift_card.py deleted file mode 100644 index dc0ddf8009c..00000000000 --- a/addons/website_sale_gift_card/models/gift_card.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models, fields - - -class GiftCard(models.Model): - _name = "gift.card" - _inherit = ['website.multi.mixin', 'gift.card'] - - website_id = fields.Many2one('website', related='buy_line_id.order_id.website_id', store=True, readonly=False) - - def can_be_used(self): - website = self.env['website'].get_current_website() - return super(GiftCard, self).can_be_used() and self.website_id.id in [website.id, False] diff --git a/addons/website_sale_gift_card/models/sale_order.py b/addons/website_sale_gift_card/models/sale_order.py deleted file mode 100644 index 7c356052c03..00000000000 --- a/addons/website_sale_gift_card/models/sale_order.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models - - -class SaleOrder(models.Model): - _inherit = "sale.order" - - def _compute_website_order_line(self): - super()._compute_website_order_line() - for order in self: - order.website_order_line = order.website_order_line.sorted(lambda ol: ol.gift_card_id.id) - - def _compute_cart_info(self): - super()._compute_cart_info() - for order in self: - gift_card_payment_lines = order.website_order_line.filtered('gift_card_id') - order.cart_quantity -= int(sum(gift_card_payment_lines.mapped('product_uom_qty'))) - - def _cart_update(self, *args, **kwargs): - res = super()._cart_update(*args, **kwargs) - self._recompute_gift_card_lines() - return res - - -class SaleOrderLine(models.Model): - _inherit = "sale.order.line" - - def _build_gift_card(self): - gift_card = super()._build_gift_card() - gift_card['website_id'] = self.order_id.website_id.id - return gift_card diff --git a/addons/website_sale_gift_card/static/src/js/website_sale_gift_card.js b/addons/website_sale_gift_card/static/src/js/website_sale_gift_card.js deleted file mode 100644 index bcd322db27e..00000000000 --- a/addons/website_sale_gift_card/static/src/js/website_sale_gift_card.js +++ /dev/null @@ -1,30 +0,0 @@ -odoo.define('website_sale_gift_card.website_sale_gift_card', function (require) { - 'use strict'; - - var publicWidget = require('web.public.widget'); - - publicWidget.registry.WebsiteSaleGiftCard = publicWidget.Widget.extend({ - selector: '.oe_website_sale_gift_card', - events: { - 'click .js_show_gift_card': '_onShowGiftCardClick', - }, - /** - * @private - * @param {Event} ev - */ - _onShowGiftCardClick: function (ev) { - $(ev.currentTarget).hide(); - this.$('.gift_card_form').removeClass('d-none'); - } - } - ) - publicWidget.registry.WebsiteSaleGiftCardCopy = publicWidget.Widget.extend({ - selector: '.o_purchased_gift_card', - /** - * @override - */ - start: function () { - new ClipboardJS(this.$el.find('.copy-to-clipboard')[0]); - } - }) -}) diff --git a/addons/website_sale_gift_card/views/gift_card_menus.xml b/addons/website_sale_gift_card/views/gift_card_menus.xml deleted file mode 100644 index d5c31266689..00000000000 --- a/addons/website_sale_gift_card/views/gift_card_menus.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/addons/website_sale_gift_card/views/gift_card_views.xml b/addons/website_sale_gift_card/views/gift_card_views.xml deleted file mode 100644 index 71ada7cdb4b..00000000000 --- a/addons/website_sale_gift_card/views/gift_card_views.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - gift.card.form Website - gift.card - - - - - - - - - - - gift.card.search - gift.card - - - - - - - - diff --git a/addons/website_sale_gift_card/views/template.xml b/addons/website_sale_gift_card/views/template.xml deleted file mode 100644 index 872bc8b936d..00000000000 --- a/addons/website_sale_gift_card/views/template.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - From 29888f1cd97a7b3ff5362c0c1684b7cb742e1f37 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:11:42 +0100 Subject: [PATCH 12/19] [REM] pos_gift_card: remove pos_gift_card module Removes the pos_gift_card module as it is merged inside of pos_loyalty. TaskId-2675382 --- addons/pos_gift_card/__init__.py | 4 - addons/pos_gift_card/__manifest__.py | 32 -- addons/pos_gift_card/data/gift_card_data.xml | 54 ---- addons/pos_gift_card/i18n/pos_gift_card.pot | 282 ------------------ addons/pos_gift_card/models/__init__.py | 9 - addons/pos_gift_card/models/barcode_rule.py | 14 - addons/pos_gift_card/models/gift_card.py | 44 --- addons/pos_gift_card/models/pos_config.py | 36 --- addons/pos_gift_card/models/pos_order.py | 64 ---- addons/pos_gift_card/models/pos_order_line.py | 34 --- addons/pos_gift_card/models/pos_session.py | 15 - .../security/ir.model.access.csv | 3 - .../pos_gift_card/static/src/css/giftCard.css | 46 --- .../static/src/js/GiftCardButton.js | 30 -- .../static/src/js/GiftCardPopup.js | 158 ---------- .../static/src/js/PaymentScreen.js | 80 ----- addons/pos_gift_card/static/src/js/models.js | 46 --- .../static/src/xml/GiftCardButton.xml | 12 - .../static/src/xml/GiftCardPopup.xml | 138 --------- .../pos_gift_card/views/gift_card_views.xml | 33 -- .../pos_gift_card/views/pos_config_views.xml | 29 -- .../views/res_config_settings_views.xml | 15 - 22 files changed, 1178 deletions(-) delete mode 100644 addons/pos_gift_card/__init__.py delete mode 100644 addons/pos_gift_card/__manifest__.py delete mode 100644 addons/pos_gift_card/data/gift_card_data.xml delete mode 100644 addons/pos_gift_card/i18n/pos_gift_card.pot delete mode 100644 addons/pos_gift_card/models/__init__.py delete mode 100644 addons/pos_gift_card/models/barcode_rule.py delete mode 100644 addons/pos_gift_card/models/gift_card.py delete mode 100644 addons/pos_gift_card/models/pos_config.py delete mode 100644 addons/pos_gift_card/models/pos_order.py delete mode 100644 addons/pos_gift_card/models/pos_order_line.py delete mode 100644 addons/pos_gift_card/models/pos_session.py delete mode 100644 addons/pos_gift_card/security/ir.model.access.csv delete mode 100644 addons/pos_gift_card/static/src/css/giftCard.css delete mode 100644 addons/pos_gift_card/static/src/js/GiftCardButton.js delete mode 100644 addons/pos_gift_card/static/src/js/GiftCardPopup.js delete mode 100644 addons/pos_gift_card/static/src/js/PaymentScreen.js delete mode 100644 addons/pos_gift_card/static/src/js/models.js delete mode 100644 addons/pos_gift_card/static/src/xml/GiftCardButton.xml delete mode 100644 addons/pos_gift_card/static/src/xml/GiftCardPopup.xml delete mode 100644 addons/pos_gift_card/views/gift_card_views.xml delete mode 100644 addons/pos_gift_card/views/pos_config_views.xml delete mode 100644 addons/pos_gift_card/views/res_config_settings_views.xml diff --git a/addons/pos_gift_card/__init__.py b/addons/pos_gift_card/__init__.py deleted file mode 100644 index dc5e6b693d1..00000000000 --- a/addons/pos_gift_card/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import models diff --git a/addons/pos_gift_card/__manifest__.py b/addons/pos_gift_card/__manifest__.py deleted file mode 100644 index d248853a47c..00000000000 --- a/addons/pos_gift_card/__manifest__.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -{ - 'name': "Gift Card for point of sales module", - 'summary': "Use gift card in your sales orders", - 'description': """Integrate gift card mechanism in sales orders.""", - 'category': 'Sales/Sales', - 'version': '1.0', - 'depends': ['gift_card', 'point_of_sale'], - 'auto_install': True, - 'data': [ - 'data/gift_card_data.xml', - 'views/gift_card_views.xml', - 'views/res_config_settings_views.xml', - 'views/pos_config_views.xml', - 'security/ir.model.access.csv', - ], - 'assets': { - 'point_of_sale.assets': [ - 'pos_gift_card/static/src/css/giftCard.css', - 'pos_gift_card/static/src/js/models.js', - 'pos_gift_card/static/src/js/GiftCardButton.js', - 'pos_gift_card/static/src/js/GiftCardPopup.js', - 'pos_gift_card/static/src/js/PaymentScreen.js', - ], - 'web.assets_qweb': [ - 'pos_gift_card/static/src/xml/**/*', - ], - }, - 'license': 'LGPL-3', -} diff --git a/addons/pos_gift_card/data/gift_card_data.xml b/addons/pos_gift_card/data/gift_card_data.xml deleted file mode 100644 index 4ec5db91191..00000000000 --- a/addons/pos_gift_card/data/gift_card_data.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - True - - - - Gift Card - gift.card - qweb-pdf - pos_gift_card.gift_card_template - report - - - - - - diff --git a/addons/pos_gift_card/i18n/pos_gift_card.pot b/addons/pos_gift_card/i18n/pos_gift_card.pot deleted file mode 100644 index 64be6360b22..00000000000 --- a/addons/pos_gift_card/i18n/pos_gift_card.pot +++ /dev/null @@ -1,282 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * pos_gift_card -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server saas~15.2\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-11 14:34+0000\n" -"PO-Revision-Date: 2022-02-11 14:34+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: pos_gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.gift_card_template -msgid "Gift Card Code" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Amount of the gift card:" -msgstr "" - -#. module: pos_gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.gift_card_template -msgid "Barcode" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model,name:pos_gift_card.model_barcode_rule -msgid "Barcode Rule" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_order_line__generated_gift_card_ids -msgid "Bought Gift Card" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_gift_card__buy_pos_order_line_id -msgid "Buy Pos Order Line" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Cancel" -msgstr "" - -#. module: pos_gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.gift_card_template -msgid "Card expires" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Check a gift card" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Confirm" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,help:pos_gift_card.field_pos_order_line__gift_card_id -msgid "Deducted from this Gift Card" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,help:pos_gift_card.field_pos_config__gift_card_settings -msgid "Defines the way you want to set your gift cards." -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Discard" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields.selection,name:pos_gift_card.selection__pos_config__gift_card_settings__create_set -msgid "Generate a new barcode and set a price" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Generate barcode" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardButton.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: model:ir.actions.report,name:pos_gift_card.gift_card_report_pdf -#: model:ir.model,name:pos_gift_card.model_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_config__use_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_order_line__gift_card_id -#: model:ir.model.fields.selection,name:pos_gift_card.selection__barcode_rule__type__gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.pos_gift_card_config_view_form -#: model_terms:ir.ui.view,arch_db:pos_gift_card.res_config_view_form_inherit_pos_coupon -#, python-format -msgid "Gift Card" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Gift Card Barcode:" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_order__gift_card_count -msgid "Gift Card Count" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/js/PaymentScreen.js:0 -#: code:addons/pos_gift_card/static/src/js/PaymentScreen.js:0 -#, python-format -msgid "Gift Card Error" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_config__gift_card_product_id -#: model_terms:ir.ui.view,arch_db:pos_gift_card.pos_gift_card_config_view_form -msgid "Gift Card Product" -msgstr "" - -#. module: pos_gift_card -#: model:ir.ui.menu,name:pos_gift_card.pos_gift_card_menu -msgid "Gift Cards" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_pos_config__gift_card_settings -msgid "Gift Cards settings" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/js/PaymentScreen.js:0 -#, python-format -msgid "Gift card balance is too low." -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/js/PaymentScreen.js:0 -#, python-format -msgid "Gift card is not valid." -msgstr "" - -#. module: pos_gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.pos_gift_card_config_view_form -msgid "Gift card settings" -msgstr "" - -#. module: pos_gift_card -#: model_terms:ir.ui.view,arch_db:pos_gift_card.gift_card_template -msgid "Here is your gift card!" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model,name:pos_gift_card.model_pos_config -msgid "Point of Sale Configuration" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model,name:pos_gift_card.model_pos_order_line -msgid "Point of Sale Order Lines" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model,name:pos_gift_card.model_pos_order -msgid "Point of Sale Orders" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model,name:pos_gift_card.model_pos_session -msgid "Point of Sale Session" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,help:pos_gift_card.field_gift_card__buy_pos_order_line_id -msgid "Pos Order line where this gift card has been bought." -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_gift_card__redeem_pos_order_line_ids -msgid "Pos Redeems" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Remaining amount of the gift card:" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields.selection,name:pos_gift_card.selection__pos_config__gift_card_settings__scan_set -msgid "Scan an existing barcode and set a price" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields.selection,name:pos_gift_card.selection__pos_config__gift_card_settings__scan_use -msgid "Scan an existing barcode with an existing price" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Scan and set price on gift card" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Scan gift card" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/js/GiftCardPopup.js:0 -#, python-format -msgid "This gift card has already been sold" -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,help:pos_gift_card.field_pos_config__gift_card_product_id -msgid "This product is used as reference on customer receipts." -msgstr "" - -#. module: pos_gift_card -#: model:ir.model.fields,field_description:pos_gift_card.field_barcode_rule__type -msgid "Type" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/xml/GiftCardPopup.xml:0 -#, python-format -msgid "Use a gift card" -msgstr "" - -#. module: pos_gift_card -#. openerp-web -#: code:addons/pos_gift_card/static/src/js/GiftCardPopup.js:0 -#, python-format -msgid "You cannot sell a gift card that has already been sold" -msgstr "" diff --git a/addons/pos_gift_card/models/__init__.py b/addons/pos_gift_card/models/__init__.py deleted file mode 100644 index b35598fd84e..00000000000 --- a/addons/pos_gift_card/models/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import barcode_rule -from . import gift_card -from . import pos_config -from . import pos_order -from . import pos_order_line -from . import pos_session diff --git a/addons/pos_gift_card/models/barcode_rule.py b/addons/pos_gift_card/models/barcode_rule.py deleted file mode 100644 index bf4a97eec01..00000000000 --- a/addons/pos_gift_card/models/barcode_rule.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models, fields - - -class BarcodeRule(models.Model): - _inherit = 'barcode.rule' - - type = fields.Selection(selection_add=[ - ('gift_card', 'Gift Card'), - ], ondelete={ - 'gift_card': 'set default', - }) diff --git a/addons/pos_gift_card/models/gift_card.py b/addons/pos_gift_card/models/gift_card.py deleted file mode 100644 index fcde18d10c8..00000000000 --- a/addons/pos_gift_card/models/gift_card.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models - - -class GiftCard(models.Model): - _inherit = "gift.card" - - buy_pos_order_line_id = fields.Many2one( - "pos.order.line", - copy=False, - readonly=True, - help="Pos Order line where this gift card has been bought.", - ) - redeem_pos_order_line_ids = fields.One2many( - "pos.order.line", "gift_card_id", string="Pos Redeems" - ) - - @api.depends("redeem_pos_order_line_ids") - def _compute_balance(self): - super()._compute_balance() - for record in self: - confirmed_line = record.redeem_pos_order_line_ids.sudo().filtered( - lambda l: l.order_id.state in ('paid', 'done', 'invoiced') - ) - balance = record.balance - if confirmed_line: - balance -= sum( - confirmed_line.mapped( - lambda line: line.currency_id._convert( - line.price_unit, - record.currency_id, - record.env.company, - line.create_date, - ) - * -1 - ) - ) - record.balance = balance - - def can_be_used_in_pos(self): - # expired state are computed once a day, so can be not synchro - return self.state == 'valid' and self.balance > 0 and self.expired_date >= fields.Date.today() diff --git a/addons/pos_gift_card/models/pos_config.py b/addons/pos_gift_card/models/pos_config.py deleted file mode 100644 index ef55d864364..00000000000 --- a/addons/pos_gift_card/models/pos_config.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models - - -class PosConfig(models.Model): - _inherit = "pos.config" - - use_gift_card = fields.Boolean(string="Gift Card") - - gift_card_product_id = fields.Many2one( - "product.product", - string="Gift Card Product", - help="This product is used as reference on customer receipts.", - ) - - gift_card_settings = fields.Selection( - [ - ("create_set", "Generate a new barcode and set a price"), - ("scan_set", "Scan an existing barcode and set a price"), - ("scan_use", "Scan an existing barcode with an existing price"), - ], - string="Gift Cards settings", - default="create_set", - help="Defines the way you want to set your gift cards.", - ) - - @api.onchange("use_gift_card") - def _onchange_giftproduct(self): - if self.use_gift_card: - self.gift_card_product_id = self.env.ref( - "gift_card.pay_with_gift_card_product", False - ) - else: - self.gift_card_product_id = False diff --git a/addons/pos_gift_card/models/pos_order.py b/addons/pos_gift_card/models/pos_order.py deleted file mode 100644 index dace6d2a7da..00000000000 --- a/addons/pos_gift_card/models/pos_order.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models -import base64 - - -class PosOrder(models.Model): - _inherit = "pos.order" - - gift_card_count = fields.Integer(compute="_compute_gift_card_count") - - @api.depends("lines.generated_gift_card_ids") - def _compute_gift_card_count(self): - for record in self: - record.gift_card_count = len(record.lines.mapped("generated_gift_card_ids")) - - @api.model - def create_from_ui(self, orders, draft=False): - order_ids = super(PosOrder, self).create_from_ui(orders, draft) - for order in self.sudo().browse([o["id"] for o in order_ids]): - gift_card_config = order.config_id.gift_card_settings - for line in order.lines: - if line.product_id.id == order.config_id.gift_card_product_id.id: - if not line.gift_card_id: - if gift_card_config == "create_set": - new_card = line._create_gift_cards() - new_card.partner_id = order.partner_id or False - line.generated_gift_card_ids = new_card - else: - gift_card = self.env["gift.card"].search( - [("id", "=", line.generated_gift_card_ids.id)] - ) - gift_card.buy_pos_order_line_id = line.id - gift_card.expired_date = fields.Date.add( - fields.Date.today(), years=1 - ) - gift_card.partner_id = order.partner_id or False - - if gift_card_config == "scan_set": - gift_card.initial_amount = line.price_unit - - return order_ids - - def get_new_card_ids(self): - return self.lines.mapped("generated_gift_card_ids").ids - - def _add_mail_attachment(self, name, ticket): - attachment = super()._add_mail_attachment(name, ticket) - if self.config_id.use_gift_card and len(self.get_new_card_ids()) > 0: - report = self.env.ref('pos_gift_card.gift_card_report_pdf')._render_qweb_pdf(self.get_new_card_ids()) - filename = name + '.pdf' - gift_card = self.env['ir.attachment'].create({ - 'name': filename, - 'type': 'binary', - 'datas': base64.b64encode(report[0]), - 'store_fname': filename, - 'res_model': 'pos.order', - 'res_id': self.ids[0], - 'mimetype': 'application/x-pdf' - }) - attachment += [(4, gift_card.id)] - - return attachment diff --git a/addons/pos_gift_card/models/pos_order_line.py b/addons/pos_gift_card/models/pos_order_line.py deleted file mode 100644 index 0f4bc9e9eb7..00000000000 --- a/addons/pos_gift_card/models/pos_order_line.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - - -class PosOrderLine(models.Model): - _inherit = "pos.order.line" - - generated_gift_card_ids = fields.One2many( - "gift.card", "buy_pos_order_line_id", string="Bought Gift Card" - ) - gift_card_id = fields.Many2one( - "gift.card", help="Deducted from this Gift Card", copy=False - ) - - def _is_not_sellable_line(self): - return self.gift_card_id or super()._is_not_sellable_line() - - def _create_gift_cards(self): - return self.env["gift.card"].create( - [self._build_gift_card() for _ in range(int(self.qty))] - ) - - def _build_gift_card(self): - return { - "initial_amount": self.order_id.currency_id._convert( - self.price_unit, - self.company_id.currency_id, - self.company_id, - fields.Date.today(), - ), - "buy_pos_order_line_id": self.id, - } diff --git a/addons/pos_gift_card/models/pos_session.py b/addons/pos_gift_card/models/pos_session.py deleted file mode 100644 index 1907daa83ac..00000000000 --- a/addons/pos_gift_card/models/pos_session.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models -from odoo.osv.expression import OR - - -class PosSession(models.Model): - _inherit = 'pos.session' - - def _loader_params_product_product(self): - result = super()._loader_params_product_product() - if self.config_id.use_gift_card and self.config_id.gift_card_product_id: - result['search_params']['domain'] = OR([result['search_params']['domain'], [('id', '=', self.config_id.gift_card_product_id.id)]]) - return result diff --git a/addons/pos_gift_card/security/ir.model.access.csv b/addons/pos_gift_card/security/ir.model.access.csv deleted file mode 100644 index 1468d9216f2..00000000000 --- a/addons/pos_gift_card/security/ir.model.access.csv +++ /dev/null @@ -1,3 +0,0 @@ -id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_gift_card_sales,Gift Card Program Salesman,model_gift_card,point_of_sale.group_pos_manager,1,0,0,0 -access_pos_gift_card_manager,Gift Card Program Sale Manager,model_gift_card,point_of_sale.group_pos_manager,1,1,1,1 diff --git a/addons/pos_gift_card/static/src/css/giftCard.css b/addons/pos_gift_card/static/src/css/giftCard.css deleted file mode 100644 index 061367a5bdf..00000000000 --- a/addons/pos_gift_card/static/src/css/giftCard.css +++ /dev/null @@ -1,46 +0,0 @@ -.giftCardPopupMain { - display: flex; - flex-wrap: wrap; - - justify-content: space-around; - - text-align: center; - padding: 1em; -} - -.giftCardPopupContainer { - display: flex; - justify-content: center; - flex-wrap: wrap; - padding: 5px; - - font-weight: bold; - text-align: center; - width: 100%; -} - -.giftCardPopupFooter { - display: flex; - justify-content: space-evenly; - - text-align: center; -} - -.giftCardPopupInput { - border-bottom: 1px solid !important; - background-color: #F0EEEE !important; - box-shadow: none !important; - text-align: right !important; -} - -.giftCardPopupButton { - width: auto !important; - height: auto !important; - padding: 10px; -} - -.giftCardPopupConfirmButton { - flex-grow: 1; - height: auto !important; - padding: 10px; -} diff --git a/addons/pos_gift_card/static/src/js/GiftCardButton.js b/addons/pos_gift_card/static/src/js/GiftCardButton.js deleted file mode 100644 index 8e8da6be5fe..00000000000 --- a/addons/pos_gift_card/static/src/js/GiftCardButton.js +++ /dev/null @@ -1,30 +0,0 @@ -odoo.define("pos_gift_card.GiftCardButton", function (require) { - "use strict"; - - const PosComponent = require("point_of_sale.PosComponent"); - const ProductScreen = require("point_of_sale.ProductScreen"); - const { useListener } = require("@web/core/utils/hooks"); - const Registries = require("point_of_sale.Registries"); - - class GiftCardButton extends PosComponent { - setup() { - super.setup(); - useListener("click", this.onClick); - } - async onClick() { - this.showPopup("GiftCardPopup", {}); - } - } - GiftCardButton.template = "GiftCardButton"; - - ProductScreen.addControlButton({ - component: GiftCardButton, - condition: function () { - return this.env.pos.config.use_gift_card; - }, - }); - - Registries.Component.add(GiftCardButton); - - return GiftCardButton; -}); diff --git a/addons/pos_gift_card/static/src/js/GiftCardPopup.js b/addons/pos_gift_card/static/src/js/GiftCardPopup.js deleted file mode 100644 index 6133057bb9c..00000000000 --- a/addons/pos_gift_card/static/src/js/GiftCardPopup.js +++ /dev/null @@ -1,158 +0,0 @@ -odoo.define("pos_gift_card.GiftCardPopup", function (require) { - "use strict"; - - const AbstractAwaitablePopup = require("point_of_sale.AbstractAwaitablePopup"); - const Registries = require("point_of_sale.Registries"); - - const { useState } = owl; - - class GiftCardPopup extends AbstractAwaitablePopup { - setup() { - super.setup(); - this.state = useState({ - giftCardConfig: this.env.pos.config.gift_card_settings, - showBarcodeGeneration: false, - showNewGiftCardMenu: false, - showUseGiftCardMenu: false, - showGiftCardDetails: false, - amountToSet: 0, - giftCardBarcode: "", - }); - } - - switchBarcodeView() { - this.state.showBarcodeGeneration = !this.state.showBarcodeGeneration; - if (this.state.showUseGiftCardMenu) - this.state.showUseGiftCardMenu = false; - if (this.state.showGiftCardDetails) - this.state.showGiftCardDetails = false; - } - - switchToUseGiftCardMenu() { - this.switchBarcodeView(); - this.state.showUseGiftCardMenu = true; - } - - switchToShowGiftCardDetails() { - this.switchBarcodeView(); - this.state.showGiftCardDetails = true; - } - - async addGiftCardProduct(giftCard) { - let gift = - this.env.pos.db.product_by_id[ - this.env.pos.config.gift_card_product_id[0] - ]; - - let can_be_sold = true; - if (giftCard) { - can_be_sold = !(giftCard.buy_pos_order_line_id || giftCard.buy_line_id); - } - - if (can_be_sold) { - this.env.pos.get_order().add_product(gift, { - price: this.state.amountToSet, - quantity: 1, - merge: false, - generated_gift_card_ids: giftCard ? giftCard.id : false, - extras: { price_manually_set: true }, - }); - } else { - await this.showPopup('ErrorPopup', { - 'title': this.env._t('This gift card has already been sold'), - 'body': this.env._t('You cannot sell a gift card that has already been sold'), - }); - } - } - - async getGiftCard() { - if (this.state.giftCardBarcode == "") return; - - let giftCard = await this.rpc({ - model: "gift.card", - method: "search_read", - args: [[["code", "=", this.state.giftCardBarcode]]], - }); - if (giftCard.length) { - giftCard = giftCard[0]; - } else { - return false; - } - - return giftCard; - } - - async scanAndUseGiftCard() { - let giftCard = await this.getGiftCard(); - if (!giftCard) return; - - if (this.state.giftCardConfig === "scan_use") - this.state.amountToSet = giftCard.initial_amount; - - await this.addGiftCardProduct(giftCard); - this.cancel(); - } - - async generateBarcode() { - await this.addGiftCardProduct(false); - this.confirm(); - } - - async isGiftCardAlreadyUsed() { - let order = this.env.pos.get_order(); - let giftProduct = - this.env.pos.db.product_by_id[ - this.env.pos.config.gift_card_product_id[0] - ]; - - for (let line of order.orderlines) { - if (line.product.id === giftProduct.id && line.price < 0) { - if (line.gift_card_id === await this.getGiftCard().id) return line; - } - } - return false; - } - - getPriceToRemove(giftCard) { - let currentOrder = this.env.pos.get_order(); - return currentOrder.get_total_with_tax() > giftCard.balance - ? -giftCard.balance - : -currentOrder.get_total_with_tax(); - } - - async payWithGiftCard() { - let giftCard = await this.getGiftCard(); - if (!giftCard) return; - - let gift = - this.env.pos.db.product_by_id[ - this.env.pos.config.gift_card_product_id[0] - ]; - - let currentOrder = this.env.pos.get_order(); - let lineUsed = this.isGiftCardAlreadyUsed() - if (lineUsed) currentOrder.remove_orderline(lineUsed); - - currentOrder.add_product(gift, { - price: this.getPriceToRemove(giftCard), - quantity: 1, - merge: false, - gift_card_id: giftCard.id, - }); - - this.cancel(); - } - - async ShowRemainingAmount() { - let giftCard = await this.getGiftCard(); - if (!giftCard) return; - - this.state.amountToSet = giftCard.balance; - } - } - GiftCardPopup.template = "GiftCardPopup"; - - Registries.Component.add(GiftCardPopup); - - return GiftCardPopup; -}); diff --git a/addons/pos_gift_card/static/src/js/PaymentScreen.js b/addons/pos_gift_card/static/src/js/PaymentScreen.js deleted file mode 100644 index 01094035b4f..00000000000 --- a/addons/pos_gift_card/static/src/js/PaymentScreen.js +++ /dev/null @@ -1,80 +0,0 @@ -odoo.define('pos_gift_card.PaymentScreen', function(require) { - "use strict"; - - const PaymentScreen = require('point_of_sale.PaymentScreen'); - const Registries = require('point_of_sale.Registries'); - var core = require('web.core'); - var _t = core._t; - - - const PosGiftCardPaymentScreen = PaymentScreen => class extends PaymentScreen { - //@Override - async validateOrder(isForceValidate) { - if(this.env.pos.config.use_gift_card) { - if (await this._isOrderValid(isForceValidate)) { - try { - let giftProduct = this.env.pos.db.product_by_id[this.env.pos.config.gift_card_product_id[0]]; - - for (let line of this.currentOrder.orderlines) { - if(line.product.id === giftProduct.id && line.price <= 0) { - let is_valid = await this.rpc({ - model: "gift.card", - method: 'can_be_used_in_pos', - args: [line.gift_card_id], - }); - - if(!is_valid) { - await this.showPopup('ErrorPopup', { - 'title': _t("Gift Card Error"), - 'body': _t("Gift card is not valid."), - }); - return; - } - - let gift_card = await this.rpc({ - model: "gift.card", - method: 'search_read', - domain: [['id', '=', line.gift_card_id]], - fields: ['balance'], - }); - - if(Math.abs(line.price) > gift_card[0].balance) { - await this.showPopup('ErrorPopup', { - 'title': _t("Gift Card Error"), - 'body': _t("Gift card balance is too low."), - }); - return; - } - } - } - } catch (_e) { - // do nothing with the error - } - } - } - await super.validateOrder(...arguments); - } - - async _postPushOrderResolve(order, server_ids) { - if(this.env.pos.config.use_gift_card) { - let ids = await this.rpc({ - model: 'pos.order', - method: 'get_new_card_ids', - args: [server_ids] - }); - if (ids.length > 0) { - this.env.legacyActionManager.do_action('pos_gift_card.gift_card_report_pdf', { - additional_context: { - active_ids: [ids], - }, - }); - } - } - return super._postPushOrderResolve(order, server_ids); - } - }; - - Registries.Component.extend(PaymentScreen, PosGiftCardPaymentScreen); - - return PosGiftCardPaymentScreen; -}); diff --git a/addons/pos_gift_card/static/src/js/models.js b/addons/pos_gift_card/static/src/js/models.js deleted file mode 100644 index c56440a9976..00000000000 --- a/addons/pos_gift_card/static/src/js/models.js +++ /dev/null @@ -1,46 +0,0 @@ -odoo.define("pos_gift_card.gift_card", function (require) { - "use strict"; - - const { Order, Orderline } = require("point_of_sale.models"); - const Registries = require('point_of_sale.Registries'); - - - const PosGiftCardOrder = (Order) => class PosGiftCardOrder extends Order { - set_orderline_options(orderline, options) { - super.set_orderline_options(...arguments); - if (options && options.generated_gift_card_ids) { - orderline.generated_gift_card_ids = [options.generated_gift_card_ids]; - } - if (options && options.gift_card_id) { - orderline.gift_card_id = options.gift_card_id; - } - } - wait_for_push_order() { - if(this.pos.config.use_gift_card) { - let giftProduct = this.pos.db.product_by_id[this.pos.config.gift_card_product_id[0]]; - for (let line of this.orderlines) { - if(line.product.id === giftProduct.id) - return true; - } - } - return super.wait_for_push_order(...arguments); - } - } - Registries.Model.extend(Order, PosGiftCardOrder); - - - const PosGiftCardOrderline = (Orderline) => class PosGiftCardOrderline extends Orderline { - export_as_JSON() { - var json = super.export_as_JSON(...arguments); - json.generated_gift_card_ids = this.generated_gift_card_ids; - json.gift_card_id = this.gift_card_id; - return json; - } - init_from_JSON(json) { - super.init_from_JSON(...arguments); - this.generated_gift_card_ids = json.generated_gift_card_ids; - this.gift_card_id = json.gift_card_id; - } - } - Registries.Model.extend(Orderline, PosGiftCardOrderline); -}); diff --git a/addons/pos_gift_card/static/src/xml/GiftCardButton.xml b/addons/pos_gift_card/static/src/xml/GiftCardButton.xml deleted file mode 100644 index 0ac7c533ac0..00000000000 --- a/addons/pos_gift_card/static/src/xml/GiftCardButton.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - Gift Card - - - - diff --git a/addons/pos_gift_card/static/src/xml/GiftCardPopup.xml b/addons/pos_gift_card/static/src/xml/GiftCardPopup.xml deleted file mode 100644 index aea1ffc0478..00000000000 --- a/addons/pos_gift_card/static/src/xml/GiftCardPopup.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - diff --git a/addons/pos_gift_card/views/gift_card_views.xml b/addons/pos_gift_card/views/gift_card_views.xml deleted file mode 100644 index 8904e07c1fd..00000000000 --- a/addons/pos_gift_card/views/gift_card_views.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - gift.card.form Website - gift.card - - - - - - - - - - - - - - - - - - - diff --git a/addons/pos_gift_card/views/pos_config_views.xml b/addons/pos_gift_card/views/pos_config_views.xml deleted file mode 100644 index 9ae52ae0a82..00000000000 --- a/addons/pos_gift_card/views/pos_config_views.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - pos.config.form - pos.config - - - -
-
- -
-
-
-
-
-
-
-
diff --git a/addons/pos_gift_card/views/res_config_settings_views.xml b/addons/pos_gift_card/views/res_config_settings_views.xml deleted file mode 100644 index 702b619466d..00000000000 --- a/addons/pos_gift_card/views/res_config_settings_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - res.config.form.inherit.pos.coupon - res.config.settings - - - -
-
-
-
-
-
From 9bb9eaf06726ec6a97c377c1cc2dfa550c1f2be7 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:13:07 +0100 Subject: [PATCH 13/19] [ADD] loyalty: manage loyalty, promotions and more This module is an unification of `coupon`, `gift_card` and an extraction of the program models of `pos_loyalty`. The goal of this module is to unify the creation of coupon, promotion, gift_card, loyalty programs etc.. into a single base module and share the same models. Managers will be able to create programs based on rules and rewards. Programs may apply on the current order (rules and rewards) or on future orders, where the rules must match the first order to get a reward on the second order or even be nominative and accumulate points over multiple orders. Every program is based on a point system. And each use of the program will result in the creation of a coupon (except for nominative programs which should be limited to one card per customer). A rule may filter on quantity, money spent and products and give points on the order, the amount of units paid or the amount of money spent. A reward could be a free product, a discount or (with an additional module) free shipping. Discounts can be percentage based, fixed, or based on the amount of points the card has. They can also be filtered on products or tags, to discount specific products. A new feature is also being able to select communication plan for these programs. The manager can define a template to be sent upon the creation of a new coupon/card or when reaching a certain amount of points. TaskId-2675382 For empty list design: Co-authored-by: Carlos Valverde --- addons/loyalty/__init__.py | 5 + addons/loyalty/__manifest__.py | 39 ++ addons/loyalty/data/loyalty_data.xml | 18 + addons/loyalty/data/loyalty_demo.xml | 97 +++++ addons/loyalty/data/mail_template_data.xml | 99 +++++ addons/loyalty/models/__init__.py | 9 + addons/loyalty/models/loyalty_card.py | 154 +++++++ addons/loyalty/models/loyalty_mail.py | 20 + addons/loyalty/models/loyalty_program.py | 383 ++++++++++++++++++ addons/loyalty/models/loyalty_reward.py | 196 +++++++++ addons/loyalty/models/loyalty_rule.py | 107 +++++ addons/loyalty/models/product_product.py | 16 + addons/loyalty/report/loyalty_report.xml | 24 ++ .../report/loyalty_report_templates.xml | 120 ++++++ addons/loyalty/security/ir.model.access.csv | 7 + addons/loyalty/security/loyalty_security.xml | 28 ++ addons/loyalty/static/img/2_plus_1.svg | 1 + addons/loyalty/static/img/coupons.svg | 1 + addons/loyalty/static/img/ewallet.svg | 1 + addons/loyalty/static/img/fidelity_cards.svg | 1 + addons/loyalty/static/img/gift_card.png | Bin 0 -> 24678 bytes addons/loyalty/static/img/gift_card.svg | 1 + addons/loyalty/static/img/loyalty_cards.svg | 1 + addons/loyalty/static/img/loyalty_cards_2.svg | 1 + addons/loyalty/static/img/promo_code.svg | 1 + .../static/img/promotional_program.svg | 1 + .../src/js/loyalty_control_panel_widget.js | 36 ++ .../static/src/js/loyalty_list_view.js | 23 ++ addons/loyalty/static/src/js/loyalty_views.js | 61 +++ addons/loyalty/static/src/scss/loyalty.scss | 57 +++ .../static/src/xml/loyalty_templates.xml | 39 ++ addons/loyalty/tests/__init__.py | 4 + addons/loyalty/tests/test_loyalty.py | 98 +++++ addons/loyalty/views/loyalty_card_views.xml | 49 +++ addons/loyalty/views/loyalty_mail_views.xml | 15 + .../loyalty/views/loyalty_program_views.xml | 147 +++++++ addons/loyalty/views/loyalty_reward_views.xml | 110 +++++ addons/loyalty/views/loyalty_rule_views.xml | 110 +++++ addons/loyalty/wizard/__init__.py | 4 + .../loyalty/wizard/loyalty_generate_wizard.py | 69 ++++ .../wizard/loyalty_generate_wizard_views.xml | 39 ++ 41 files changed, 2192 insertions(+) create mode 100644 addons/loyalty/__init__.py create mode 100644 addons/loyalty/__manifest__.py create mode 100644 addons/loyalty/data/loyalty_data.xml create mode 100644 addons/loyalty/data/loyalty_demo.xml create mode 100644 addons/loyalty/data/mail_template_data.xml create mode 100644 addons/loyalty/models/__init__.py create mode 100644 addons/loyalty/models/loyalty_card.py create mode 100644 addons/loyalty/models/loyalty_mail.py create mode 100644 addons/loyalty/models/loyalty_program.py create mode 100644 addons/loyalty/models/loyalty_reward.py create mode 100644 addons/loyalty/models/loyalty_rule.py create mode 100644 addons/loyalty/models/product_product.py create mode 100644 addons/loyalty/report/loyalty_report.xml create mode 100644 addons/loyalty/report/loyalty_report_templates.xml create mode 100644 addons/loyalty/security/ir.model.access.csv create mode 100644 addons/loyalty/security/loyalty_security.xml create mode 100644 addons/loyalty/static/img/2_plus_1.svg create mode 100644 addons/loyalty/static/img/coupons.svg create mode 100644 addons/loyalty/static/img/ewallet.svg create mode 100644 addons/loyalty/static/img/fidelity_cards.svg create mode 100644 addons/loyalty/static/img/gift_card.png create mode 100644 addons/loyalty/static/img/gift_card.svg create mode 100644 addons/loyalty/static/img/loyalty_cards.svg create mode 100644 addons/loyalty/static/img/loyalty_cards_2.svg create mode 100644 addons/loyalty/static/img/promo_code.svg create mode 100644 addons/loyalty/static/img/promotional_program.svg create mode 100644 addons/loyalty/static/src/js/loyalty_control_panel_widget.js create mode 100644 addons/loyalty/static/src/js/loyalty_list_view.js create mode 100644 addons/loyalty/static/src/js/loyalty_views.js create mode 100644 addons/loyalty/static/src/scss/loyalty.scss create mode 100644 addons/loyalty/static/src/xml/loyalty_templates.xml create mode 100644 addons/loyalty/tests/__init__.py create mode 100644 addons/loyalty/tests/test_loyalty.py create mode 100644 addons/loyalty/views/loyalty_card_views.xml create mode 100644 addons/loyalty/views/loyalty_mail_views.xml create mode 100644 addons/loyalty/views/loyalty_program_views.xml create mode 100644 addons/loyalty/views/loyalty_reward_views.xml create mode 100644 addons/loyalty/views/loyalty_rule_views.xml create mode 100644 addons/loyalty/wizard/__init__.py create mode 100644 addons/loyalty/wizard/loyalty_generate_wizard.py create mode 100644 addons/loyalty/wizard/loyalty_generate_wizard_views.xml diff --git a/addons/loyalty/__init__.py b/addons/loyalty/__init__.py new file mode 100644 index 00000000000..2ae6446f9dc --- /dev/null +++ b/addons/loyalty/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models +from . import wizard diff --git a/addons/loyalty/__manifest__.py b/addons/loyalty/__manifest__.py new file mode 100644 index 00000000000..820dabe1291 --- /dev/null +++ b/addons/loyalty/__manifest__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': 'Coupons & Loyalty', + 'summary': "Use discounts, gift card, eWallets and loyalty programs in different sales channels", + 'category': 'Sales', + 'version': '1.0', + 'depends': ['product'], + 'data': [ + 'security/ir.model.access.csv', + 'security/loyalty_security.xml', + 'report/loyalty_report_templates.xml', + 'report/loyalty_report.xml', + 'data/loyalty_data.xml', + 'data/mail_template_data.xml', + 'wizard/loyalty_generate_wizard_views.xml', + 'views/loyalty_card_views.xml', + 'views/loyalty_mail_views.xml', + 'views/loyalty_program_views.xml', + 'views/loyalty_reward_views.xml', + 'views/loyalty_rule_views.xml', + ], + 'demo': [ + 'data/loyalty_demo.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'loyalty/static/src/js/loyalty_control_panel_widget.js', + 'loyalty/static/src/js/loyalty_views.js', + 'loyalty/static/src/js/loyalty_list_view.js', + 'loyalty/static/src/scss/loyalty.scss', + ], + 'web.assets_qweb': [ + 'loyalty/static/src/xml/loyalty_templates.xml', + ], + }, + 'installable': True, + 'license': 'LGPL-3', +} diff --git a/addons/loyalty/data/loyalty_data.xml b/addons/loyalty/data/loyalty_data.xml new file mode 100644 index 00000000000..091e68cfd96 --- /dev/null +++ b/addons/loyalty/data/loyalty_data.xml @@ -0,0 +1,18 @@ + + + + + Gift Card + 50 + service + + + + + + Top-up eWallet + 50 + service + + + diff --git a/addons/loyalty/data/loyalty_demo.xml b/addons/loyalty/data/loyalty_demo.xml new file mode 100644 index 00000000000..76f0338ecde --- /dev/null +++ b/addons/loyalty/data/loyalty_demo.xml @@ -0,0 +1,97 @@ + + + + + Code for 10% on orders + promotion + with_code + + + + with_code + 10pc + + + + + discount + 10 + percent + order + + + + + + + Buy 3 large cabinets, get one for free + promotion + auto + + + + 3 + unit + 1 + + + + + + product + + 3 + + + + + + 10% Discount + future + with_code + + + + + + + + discount + 10 + percent + order + + + + + create + + + + + + + Gift Cards + gift_card + future + auto + + + + 1 + money + True + + + + + + discount + per_point + 1 + order + 1 + + + + diff --git a/addons/loyalty/data/mail_template_data.xml b/addons/loyalty/data/mail_template_data.xml new file mode 100644 index 00000000000..2e88a278c4e --- /dev/null +++ b/addons/loyalty/data/mail_template_data.xml @@ -0,0 +1,99 @@ + + + + Gift Card: Send by Email + + Your Gift Card at {{ object.company_id.name }} + {{ object._get_mail_partner().id }} + +
+ Here is your gift card! +
+
+ +
+
+

+ $ 150.00

+
+
+

+ Gift Card Code +

+

4f10-15d6-41b7-b04c-7b3e

+
+
+

Card expires 05/05/2021

+
+ +
+ + Your Gift Card + +
+ + + [Loyalty] Coupon: Send by Email + + Your reward coupon from {{ object.program_id.company_id.name }} + {{ object.program_id.company_id.email }} + {{ object._get_mail_partner().id }} + {{ object._get_mail_partner().lang }} + + + + + + + + +
+ + Congratulations Brandon Freeman,
+
+ + Here is your reward from YourCompany.
+ + + + Reward Description +
+
+
+
+ Use this promo code + + before 2021-06-16 + +

+ 15637502648479132902 +

+ + + + Minimum purchase of 10 products +
+
+ + + Valid for purchase above $10.00 +
+
+
+
+ Thank you, + +
+ --
Mitchell Admin
+
+
+
+ + Your Coupon Code + +
+
diff --git a/addons/loyalty/models/__init__.py b/addons/loyalty/models/__init__.py new file mode 100644 index 00000000000..5bd9ac8fccb --- /dev/null +++ b/addons/loyalty/models/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import loyalty_card +from . import loyalty_mail +from . import loyalty_reward +from . import loyalty_rule +from . import loyalty_program +from . import product_product diff --git a/addons/loyalty/models/loyalty_card.py b/addons/loyalty/models/loyalty_card.py new file mode 100644 index 00000000000..d387caeee2d --- /dev/null +++ b/addons/loyalty/models/loyalty_card.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from uuid import uuid4 + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +class LoyaltyCard(models.Model): + _name = 'loyalty.card' + _inherit = ['mail.thread'] + _description = 'Loyalty Coupon' + _rec_name = 'code' + + @api.model + def _generate_code(self): + """ + Barcode identifiable codes. + """ + return '044' + str(uuid4())[4:-8][3:] + + def name_get(self): + return [(card.id, f'{card.program_id.name}: {card.code}') for card in self] + + program_id = fields.Many2one('loyalty.program', ondelete='restrict') + company_id = fields.Many2one(related='program_id.company_id', store=True) + currency_id = fields.Many2one(related='program_id.currency_id') + # Reserved for this partner if non-empty + partner_id = fields.Many2one('res.partner', index=True) + points = fields.Float(tracking=True) + point_name = fields.Char(related='program_id.portal_point_name', readonly=True) + + code = fields.Char(default=lambda self: self._generate_code(), required=True, readonly=True, index=True) + expiration_date = fields.Date() + + use_count = fields.Integer(compute='_compute_use_count') + + _sql_constraints = [ + ('card_code_unique', 'UNIQUE(code)', 'A coupon/loyalty card must have a unique code.') + ] + + @api.constrains('code') + def _contrains_code(self): + # Prevent a coupon from having the same code a program + if self.env['loyalty.rule'].search_count([('mode', '=', 'with_code'), ('code', 'in', self.mapped('code'))]): + raise ValidationError(_('A trigger with the same code as one of your coupon already exists.')) + + # Meant to be overriden + def _compute_use_count(self): + self.use_count = 0 + + def _get_default_template(self): + self.ensure_one() + return self.program_id.communication_plan_ids.filtered(lambda m: m.trigger == 'create').mail_template_id[:1] + + def _get_mail_partner(self): + self.ensure_one() + return self.partner_id + + def _get_signature(self): + """To be overriden""" + self.ensure_one() + return None + + def action_coupon_send(self): + """ Open a window to compose an email, with the default template returned by `_get_default_template` + message loaded by default + """ + self.ensure_one() + default_template = self._get_default_template() + compose_form = self.env.ref('mail.email_compose_message_wizard_form', False) + ctx = dict( + default_model='loyalty.card', + default_res_id=self.id, + default_use_template=bool(default_template), + default_template_id=default_template and default_template.id, + default_composition_mode='comment', + default_email_layout_xmlid='mail.mail_notification_light', + mark_coupon_as_sent=True, + force_email=True, + ) + return { + 'name': _('Compose Email'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'mail.compose.message', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + + def _send_creation_communication(self): + """ + Sends the 'At Creation' communication plan if it exist for the given coupons. + """ + if self.env.context.get('loyalty_no_mail', False): + return + # Ideally one per program, but multiple is supported + create_comm_per_program = dict() + for program in self.program_id: + create_comm_per_program[program] = program.communication_plan_ids.filtered(lambda c: c.trigger == 'create') + for coupon in self: + if not create_comm_per_program[coupon.program_id] or not coupon._get_mail_partner(): + continue + for comm in create_comm_per_program[coupon.program_id]: + comm.mail_template_id.send_mail(res_id=coupon.id, email_layout_xmlid='mail.mail_notification_light') + + def _send_points_reach_communication(self, points_changes): + """ + Send the 'When Reaching' communicaton plans for the given coupons. + + If a coupons passes multiple milestones we will only send the one with the highest target. + """ + if self.env.context.get('loyalty_no_mail', False): + return + milestones_per_program = dict() + for program in self.program_id: + milestones_per_program[program] = program.communication_plan_ids\ + .filtered(lambda c: c.trigger == 'points_reach')\ + .sorted('points', reverse=True) + for coupon in self: + if not coupon._get_mail_partner(): + continue + coupon_change = points_changes[coupon] + # Do nothing if coupon lost points or did not change + if not milestones_per_program[coupon.program_id] or\ + not coupon.partner_id or\ + coupon_change['old'] >= coupon_change['new']: + continue + this_milestone = False + for milestone in milestones_per_program[coupon.program_id]: + if coupon_change['old'] < milestone.points and milestone.points <= coupon_change['new']: + this_milestone = milestone + break + if not this_milestone: + continue + this_milestone.mail_template_id.send_mail(res_id=coupon.id, email_layout_xmlid='mail.mail_notification_light') + + + @api.model_create_multi + def create(self, vals_list): + res = super().create(vals_list) + res._send_creation_communication() + return res + + def write(self, vals): + if not self.env.context.get('loyalty_no_mail', False) and 'points' in vals: + points_before = {coupon: coupon.points for coupon in self} + res = super().write(vals) + if not self.env.context.get('loyalty_no_mail', False) and 'points' in vals: + points_changes = {coupon: {'old': points_before[coupon], 'new': coupon.points} for coupon in self} + self._send_points_reach_communication(points_changes) + return res diff --git a/addons/loyalty/models/loyalty_mail.py b/addons/loyalty/models/loyalty_mail.py new file mode 100644 index 00000000000..ed03b8eb881 --- /dev/null +++ b/addons/loyalty/models/loyalty_mail.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +# Allow promo programs to send mails upon certain triggers +# Like : 'At creation' and 'When reaching X points' + +class LoyaltyMail(models.Model): + _name = 'loyalty.mail' + _description = 'Loyalty Communication' + + active = fields.Boolean(default=True) + program_id = fields.Many2one('loyalty.program', required=True, ondelete='cascade') + trigger = fields.Selection([ + ('create', 'At Creation'), + ('points_reach', 'When Reaching')], string='When', required=True + ) + points = fields.Float() + mail_template_id = fields.Many2one('mail.template', string="Email Template", required=True, domain=[('model', '=', 'loyalty.card')]) diff --git a/addons/loyalty/models/loyalty_program.py b/addons/loyalty/models/loyalty_program.py new file mode 100644 index 00000000000..10a216393f4 --- /dev/null +++ b/addons/loyalty/models/loyalty_program.py @@ -0,0 +1,383 @@ +# -*- 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.exceptions import UserError, ValidationError + +from uuid import uuid4 + +class LoyaltyProgram(models.Model): + _name = 'loyalty.program' + _description = 'Loyalty Program' + _order = 'sequence' + _rec_name = 'name' + + name = fields.Char('Program Name', required=True, translate=True) + active = fields.Boolean(default=True) + sequence = fields.Integer(copy=False) + company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company) + currency_id = fields.Many2one('res.currency', 'Currency', compute='_compute_currency_id', + readonly=False, required=True, store=True, precompute=True) + currency_symbol = fields.Char(related='currency_id.symbol') + + total_order_count = fields.Integer("Total Order Count", compute="_compute_total_order_count") + + rule_ids = fields.One2many('loyalty.rule', 'program_id', 'Triggers', copy=True, + compute='_compute_from_program_type', readonly=False, store=True) + reward_ids = fields.One2many('loyalty.reward', 'program_id', 'Rewards', copy=True, + compute='_compute_from_program_type', readonly=False, store=True) + communication_plan_ids = fields.One2many('loyalty.mail', 'program_id', copy=True, + compute='_compute_from_program_type', readonly=False, store=True) + coupon_ids = fields.One2many('loyalty.card', 'program_id') + coupon_count = fields.Integer(compute='_compute_coupon_count') + + program_type = fields.Selection([ + ('coupons', 'Coupons'), + ('gift_card', 'Gift Card'), + ('loyalty', 'Loyalty Cards'), + ('promotion', 'Promotions'), + ('ewallet', 'eWallet')], default='promotion', required=True, + ) + date_to = fields.Date(string='Validity') + limit_usage = fields.Boolean(string='Limit Usage') + max_usage = fields.Integer() + # Dictates when the points can be used: + # current: if the order gives enough points on that order, the reward may directly be claimed, points lost otherwise + # future: if the order gives enough points on that order, a coupon is generated for a next order + # both: points are accumulated on the coupon to claim rewards, the reward may directly be claimed + applies_on = fields.Selection([ + ('current', 'Current order'), + ('future', 'Future orders'), + ('both', 'Current & Future orders')], default='current', required=True, + compute='_compute_from_program_type', readonly=False, store=True, + ) + trigger = fields.Selection([ + ('auto', 'Automatic'), + ('with_code', 'Use a code')], + compute='_compute_from_program_type', readonly=False, store=True, + help=""" + Automatic: Customers will be eligible for a reward automatically in their cart. + Use a code: Customers will be eligible for a reward if they enter a code. + """ + ) + portal_visible = fields.Boolean(default=False, + help=""" + Show in web portal, PoS customer ticket, eCommerce checkout, the number of points available and used by reward. + """) + portal_point_name = fields.Char(default='Points', translate=True, + compute='_compute_from_program_type', readonly=False, store=True) + is_nominative = fields.Boolean(compute='_compute_is_nominative') + + _sql_constraints = [ + ('check_max_usage', 'CHECK (limit_usage = False OR max_usage > 0)', + 'Max usage must be strictly positive if a limit is used.'), + ] + + @api.constrains('reward_ids') + def _constrains_reward_ids(self): + if any(not program.reward_ids for program in self): + raise ValidationError(_('A program must have at least one reward.')) + + def _compute_total_order_count(self): + self.total_order_count = 0 + + @api.depends('company_id') + def _compute_currency_id(self): + for program in self: + program.currency_id = program.company_id.currency_id or program.currency_id + + @api.depends('coupon_ids') + def _compute_coupon_count(self): + read_group_data = self.env['loyalty.card']._read_group([('program_id', 'in', self.ids)], ['program_id'], ['program_id']) + count_per_program = {r['program_id'][0]: r['program_id_count'] for r in read_group_data} + for program in self: + program.coupon_count = count_per_program.get(program.id, 0) + + @api.depends('program_type', 'applies_on') + def _compute_is_nominative(self): + for program in self: + program.is_nominative = program.applies_on == 'both' or\ + (program.program_type == 'ewallet' and program.applies_on == 'future') + + @api.model + def _program_type_default_values(self): + # All values to change when program_type changes + # NOTE: any field used in `rule_ids`, `reward_ids` and `communication_plan_ids` MUST be present in the kanban view for it to work properly. + return { + 'coupons': { + 'applies_on': 'current', + 'trigger': 'with_code', + 'portal_visible': False, + 'portal_point_name': _('Points'), + # Coupons don't use rules by default + 'rule_ids': [(5, 0, 0)], + 'reward_ids': [(5, 0, 0), (0, 0, { + 'required_points': 1, + 'discount': 10, + })], + 'communication_plan_ids': [(5, 0, 0), (0, 0, { + 'trigger': 'create', + 'mail_template_id': (self.env.ref('loyalty.mail_template_loyalty_card', raise_if_not_found=False) or self.env['mail.template']).id, + })], + }, + 'promotion': { + 'applies_on': 'current', + 'trigger': 'auto', + 'portal_visible': False, + 'portal_point_name': _('Points'), + 'rule_ids': [(5, 0, 0), (0, 0, { + 'reward_point_amount': 1, + 'reward_point_mode': 'order', + 'minimum_amount': 50, + })], + 'reward_ids': [(5, 0, 0), (0, 0, { + 'required_points': 1, + 'discount': 10, + })], + 'communication_plan_ids': [(5, 0, 0)], + }, + 'gift_card': { + 'applies_on': 'future', + 'trigger': 'auto', + 'portal_visible': True, + 'portal_point_name': self.env.company.currency_id.symbol, + 'rule_ids': [(5, 0, 0), (0, 0, { + 'reward_point_amount': 1, + 'reward_point_mode': 'money', + 'reward_point_split': True, + 'product_ids': self.env.ref('loyalty.gift_card_product_50', raise_if_not_found=False), + })], + 'reward_ids': [(5, 0, 0), (0, 0, { + 'reward_type': 'discount', + 'discount_mode': 'per_point', + 'discount': 1, + 'discount_applicability': 'order', + 'required_points': 1, + 'description': _('Pay With Gift Card'), + })], + 'communication_plan_ids': [(5, 0, 0), (0, 0, { + 'trigger': 'create', + 'mail_template_id': (self.env.ref('loyalty.mail_template_gift_card', raise_if_not_found=False) or self.env['mail.template']).id, + })], + }, + 'loyalty': { + 'applies_on': 'both', + 'trigger': 'auto', + 'portal_visible': True, + 'portal_point_name': _('Loyalty Points'), + 'rule_ids': [(5, 0, 0), (0, 0, { + 'reward_point_mode': 'money', + })], + 'reward_ids': [(5, 0, 0), (0, 0, { + 'discount': 5, + 'required_points': 200, + })], + 'communication_plan_ids': [(5, 0, 0)], + }, + 'ewallet': { + 'applies_on': 'future', + 'trigger': 'auto', + 'portal_visible': True, + 'portal_point_name': self.env.company.currency_id.symbol, + 'rule_ids': [(5, 0, 0), (0, 0, { + 'reward_point_amount': '1', + 'reward_point_mode': 'money', + 'product_ids': self.env.ref('loyalty.ewallet_product_50'), + })], + 'reward_ids': [(5, 0, 0), (0, 0, { + 'reward_type': 'discount', + 'discount_mode': 'per_point', + 'discount': 1, + 'discount_applicability': 'order', + 'required_points': 1, + })], + 'communication_plan_ids': [(5, 0, 0)], + }, + } + + @api.depends('program_type') + def _compute_from_program_type(self): + program_type_defaults = self._program_type_default_values() + grouped_programs = defaultdict(lambda: self.env['loyalty.program']) + for program in self: + grouped_programs[program.program_type] |= program + for program_type, programs in grouped_programs.items(): + if program_type in program_type_defaults: + programs.write(program_type_defaults[program_type]) + + def _get_valid_products(self, products): + ''' + Returns a dict containing the products that match per rule of the program + ''' + rule_products = dict() + for rule in self.rule_ids: + domain = rule._get_valid_product_domain() + if domain: + rule_products[rule] = products.filtered_domain(domain) + else: + rule_products[rule] = products + return rule_products + + @api.ondelete(at_uninstall=False) + def _unlink_except_active(self): + if any(program.active for program in self): + raise UserError(_('You can not delete a program in an active state')) + + def toggle_active(self): + super().toggle_active() + # Propagate active state to children + for program in self: + program.rule_ids.active = program.active + program.reward_ids.active = program.active + program.communication_plan_ids.active = program.active + program.reward_ids.discount_line_product_id.active = program.active + + @api.model + def get_program_templates(self): + ''' + Returns the templates to be used for promotional programs. + ''' + return { + 'promo_code': { + 'title': _('Promo Code'), + 'description': _('Get a code to receive 10% discount on specific products'), + 'icon': 'promo_code', + }, + 'gift_card': { + 'title': _('Gift Card'), + 'description': _('Sell Gift Cards, that can be used to purchase products'), + 'icon': 'gift_card', + }, + 'loyalty': { + 'title': _('Loyalty Cards'), + 'description': _('Win points with each purchases, and use points to get gifts'), + 'icon': 'loyalty_cards', + }, + 'fidelity': { + 'title': _('Fidelity Cards'), + 'description': _('Buy 10 products, and get 10$ discount on the 11th one'), + 'icon': 'fidelity_cards', + }, + 'promotion': { + 'title': _('Promotional Program'), + 'description': _('Automatic promotion: 10% discount on orders higher than $50'), + 'icon': 'promotional_program', + }, + 'coupons': { + 'title': _('Coupons'), + 'description': _('Send unique coupons that give access to rewards'), + 'icon': 'coupons', + }, + 'buy_two_get_one': { + 'title': _('2+1 Free'), + 'description': _('Buy 2 products and get a third one for free'), + 'icon': '2_plus_1', + }, + 'ewallet': { + 'title': _('eWallet'), + 'description': _('Fill in your eWallet, and use it to pay future orders'), + 'icon': 'ewallet', + }, + } + + @api.model + def create_from_template(self, template_id): + ''' + Creates the program from the template id defined in `get_program_templates`. + + Returns an action leading to that new record. + ''' + template_values = self._get_template_values() + if template_id not in template_values: + return False + program = self.create(template_values[template_id]) + action = self.env['ir.actions.act_window']._for_xml_id('loyalty.loyalty_program_action') + action['view_type'] = 'form' + action['res_id'] = program.id + return action + + @api.model + def _get_template_values(self): + ''' + Returns the values to create a program using the template keys defined above. + ''' + program_type_defaults = self._program_type_default_values() + # For programs that require a product get the first sellable. + product = self.env['product.product'].search([('sale_ok', '=', True)], limit=1) + return { + 'gift_card': { + 'name': _('Gift Card'), + 'program_type': 'gift_card', + **program_type_defaults['gift_card'] + }, + 'ewallet': { + 'name': _('eWallet'), + 'program_type': 'ewallet', + **program_type_defaults['ewallet'], + }, + 'loyalty': { + 'name': _('Loyalty Cards'), + 'program_type': 'loyalty', + **program_type_defaults['loyalty'], + }, + 'coupons': { + 'name': _('Coupons'), + 'program_type': 'coupons', + **program_type_defaults['coupons'], + }, + 'promotion': { + 'name': _('Promotional Program'), + 'program_type': 'promotion', + **program_type_defaults['promotion'], + }, + 'promo_code': { + 'name': _('Promo Code'), + 'program_type': 'promotion', + 'applies_on': 'current', + 'trigger': 'with_code', + 'rule_ids': [(0, 0, { + 'mode': 'with_code', + 'code': '10PERCENT_' + str(uuid4())[:4], # Require a random code in case a user creates multiple program using this template + })], + 'reward_ids': [(0, 0, { + 'discount_applicability': 'specific', + 'discount_product_ids': product, + 'discount_mode': 'percent', + 'discount': 10, + })] + }, + 'fidelity': { + 'name': _('Fidelity Cards'), + 'program_type': 'loyalty', + 'applies_on': 'both', + 'trigger': 'auto', + 'rule_ids': [(0, 0, { + 'reward_point_mode': 'unit', + 'product_ids': product, + })], + 'reward_ids': [(0, 0, { + 'discount_mode': 'per_order', + 'required_points': 11, + 'discount_applicability': 'specific', + 'discount_product_ids': product, + 'discount': 10, + })] + }, + 'buy_two_get_one': { + 'name': _('2+1 Free'), + 'program_type': 'promotion', + 'applies_on': 'current', + 'trigger': 'auto', + 'rule_ids': [(0, 0, { + 'reward_point_mode': 'unit', + 'product_ids': product, + })], + 'reward_ids': [(0, 0, { + 'reward_type': 'product', + 'reward_product_id': product and product.id or False, + 'required_points': 2, + })] + }, + } diff --git a/addons/loyalty/models/loyalty_reward.py b/addons/loyalty/models/loyalty_reward.py new file mode 100644 index 00000000000..6ee6785bd5b --- /dev/null +++ b/addons/loyalty/models/loyalty_reward.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import ast + +from odoo import _, api, fields, models +from odoo.osv import expression + +class LoyaltyReward(models.Model): + _name = 'loyalty.reward' + _description = 'Loyalty Reward' + _rec_name = 'description' + _order = 'required_points asc' + + def _get_discount_mode_select(self): + # The value is provided in the loyalty program's view since we may not have a program_id yet + # and makes sure to display the currency related to the program instead of the company's. + symbol = self.env.context.get('currency_symbol', self.env.company.currency_id.symbol) + return [ + ('percent', '%'), + ('per_point', _('%s per point', symbol)), + ('per_order', _('%s per order', symbol)) + ] + + def name_get(self): + return [(reward.id, '%s - %s' % (reward.program_id.name, reward.description)) for reward in self] + + active = fields.Boolean(default=True) + program_id = fields.Many2one('loyalty.program', required=True, ondelete='cascade') + # Stored for security rules + company_id = fields.Many2one(related='program_id.company_id', store=True) + currency_id = fields.Many2one(related='program_id.currency_id') + + description = fields.Char(compute='_compute_description', readonly=False, store=True, translate=True) + + reward_type = fields.Selection([ + ('product', 'Free Product'), + ('discount', 'Discount')], + default='discount', required=True, + ) + + # Discount rewards + discount = fields.Float('Discount', default=10) + discount_mode = fields.Selection(selection=_get_discount_mode_select, required=True, default='percent') + discount_applicability = fields.Selection([ + ('order', 'Order'), + ('cheapest', 'Cheapest Product'), + ('specific', 'Specific Products')], default='order', + ) + discount_product_domain = fields.Char(default="[]") + discount_product_ids = fields.Many2many('product.product', string="Discounted Products") + discount_product_category_id = fields.Many2one('product.category', string="Discounted Prod. Categories") + discount_product_tag_id = fields.Many2one('product.tag', string="Discounted Prod. Tag") + all_discount_product_ids = fields.Many2many('product.product', compute='_compute_all_discount_product_ids') + discount_max_amount = fields.Monetary('Max Discount', 'currency_id', + help="This is the max amount this reward may discount, leave to 0 for no limit.") + discount_line_product_id = fields.Many2one('product.product', copy=False, ondelete='restrict', + help="Product used in the sales order to apply the discount. Each reward has its own product for reporting purpose") + is_global_discount = fields.Boolean(compute='_compute_is_global_discount') + + # Product rewards + reward_product_id = fields.Many2one('product.product', string='Product') + reward_product_tag_id = fields.Many2one('product.tag', string='Product Tag') + multi_product = fields.Boolean(compute='_compute_multi_product') + reward_product_ids = fields.Many2many( + 'product.product', string="Reward Products", compute='_compute_multi_product', + help="These are the products that can be claimed with this rule.") + reward_product_qty = fields.Integer(default=1) + reward_product_uom_id = fields.Many2one('uom.uom', compute='_compute_reward_product_uom_id') + + required_points = fields.Float('Points needed', default=1) + point_name = fields.Char(related='program_id.portal_point_name', readonly=True) + clear_wallet = fields.Boolean(default=False) + + _sql_constraints = [ + ('required_points_positive', 'CHECK (required_points > 0)', + 'The required points for a reward must be strictly positive.'), + ('product_qty_positive', "CHECK (reward_type != 'product' OR reward_product_qty > 0)", + 'The reward product quantity must be strictly positive.'), + ('discount_positive', "CHECK (reward_type != 'discount' OR discount > 0)", + 'The discount must be strictly positive.'), + ] + + @api.depends('reward_product_id.product_tmpl_id.uom_id', 'reward_product_tag_id') + def _compute_reward_product_uom_id(self): + for reward in self: + reward.reward_product_uom_id = reward.reward_product_ids.product_tmpl_id.uom_id[:1] + + def _get_discount_product_domain(self): + self.ensure_one() + domain = [] + if self.discount_product_ids: + domain = [('id', 'in', self.discount_product_ids.ids)] + if self.discount_product_category_id: + domain = expression.OR([domain, [('categ_id', 'child_of', self.discount_product_category_id.id)]]) + if self.discount_product_tag_id: + domain = expression.OR([domain, [('all_product_tag_ids', 'in', self.discount_product_tag_id.id)]]) + if self.discount_product_domain and self.discount_product_domain != '[]': + domain = expression.AND([domain, ast.literal_eval(self.discount_product_domain)]) + return domain + + @api.depends('discount_product_ids', 'discount_product_category_id', 'discount_product_tag_id', 'discount_product_domain') + def _compute_all_discount_product_ids(self): + for reward in self: + reward.all_discount_product_ids = self.env['product.product'].search(reward._get_discount_product_domain()) + + @api.depends('reward_product_id', 'reward_product_tag_id', 'reward_type') + def _compute_multi_product(self): + for reward in self: + products = reward.reward_product_id + reward.reward_product_tag_id.product_ids + reward.multi_product = reward.reward_type == 'product' and len(products) > 1 + reward.reward_product_ids = reward.reward_type == 'product' and products or self.env['product.product'] + + @api.depends('reward_type', 'reward_product_id', 'discount_mode', + 'discount', 'currency_id', 'discount_applicability', 'all_discount_product_ids') + def _compute_description(self): + for reward in self: + reward_string = "" + if reward.reward_type == 'product': + products = reward.reward_product_ids + if len(products) == 1: + reward_string = _('Free Product - %s', reward.reward_product_id.name) + else: + reward_string = _('Free Product - [%s]', ', '.join(products.mapped('name'))) + elif reward.reward_type == 'discount': + format_string = '%(amount)g %(symbol)s' + if reward.currency_id.position == 'before': + format_string = '%(symbol)s %(amount)g' + formatted_amount = format_string % {'amount': reward.discount, 'symbol': reward.currency_id.symbol} + if reward.discount_mode == 'percent': + reward_string = _('%g%% on ', reward.discount) + elif reward.discount_mode == 'per_point': + reward_string = _('%s per point on ', formatted_amount) + elif reward.discount_mode == 'per_order': + reward_string = _('%s per order on ', formatted_amount) + if reward.discount_applicability == 'order': + reward_string += _('your order') + elif reward.discount_applicability == 'cheapest': + reward_string += _('the cheapest product') + elif reward.discount_applicability == 'specific': + if len(reward.all_discount_product_ids) == 1: + reward_string += reward.all_discount_product_ids.name + else: + reward_string += _('specific products') + if reward.discount_max_amount: + format_string = '%(amount)g %(symbol)s' + if reward.currency_id.position == 'before': + format_string = '%(symbol)s %(amount)g' + formatted_amount = format_string % {'amount': reward.discount_max_amount, 'symbol': reward.currency_id.symbol} + reward_string += _(' (Max %s)', formatted_amount) + reward.description = reward_string + + @api.depends('reward_type', 'discount_applicability', 'discount_mode') + def _compute_is_global_discount(self): + for reward in self: + reward.is_global_discount = reward.reward_type == 'discount' and\ + reward.discount_applicability == 'order' and\ + reward.discount_mode == 'percent' + + def _create_missing_discount_line_products(self): + # Make sure we create the product that will be used for our discounts + rewards = self.filtered(lambda r: not r.discount_line_product_id) + products = self.env['product.product'].create(rewards._get_discount_product_values()) + for reward, product in zip(rewards, products): + reward.discount_line_product_id = product + + @api.model_create_multi + def create(self, vals_list): + res = super().create(vals_list) + res._create_missing_discount_line_products() + return res + + def write(self, vals): + res = super().write(vals) + if 'description' in vals: + self._create_missing_discount_line_products() + # Keep the name of our discount product up to date + for reward in self: + reward.discount_line_product_id.write({'name': reward.description}) + return res + + def unlink(self): + programs = self.program_id + res = super().unlink() + # Not guaranteed to trigger the constraint + programs._constrains_reward_ids() + return res + + def _get_discount_product_values(self): + return [{ + 'name': reward.description, + 'type': 'service', + 'sale_ok': False, + 'purchase_ok': False, + 'lst_price': 0, + } for reward in self] diff --git a/addons/loyalty/models/loyalty_rule.py b/addons/loyalty/models/loyalty_rule.py new file mode 100644 index 00000000000..ecab0d8d222 --- /dev/null +++ b/addons/loyalty/models/loyalty_rule.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import ast + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.osv import expression + +class LoyaltyRule(models.Model): + _name = 'loyalty.rule' + _description = 'Loyalty Rule' + + def _get_reward_point_mode_selection(self): + # The value is provided in the loyalty program's view since we may not have a program_id yet + # and makes sure to display the currency related to the program instead of the company's. + symbol = self.env.context.get('currency_symbol', self.env.company.currency_id.symbol) + return [ + ('order', _('per order')), + ('money', _('per %s spent', symbol)), + ('unit', _('per unit paid')), + ] + + active = fields.Boolean(default=True) + program_id = fields.Many2one('loyalty.program', required=True, ondelete='cascade') + # Stored for security rules + company_id = fields.Many2one(related='program_id.company_id', store=True) + currency_id = fields.Many2one(related='program_id.currency_id') + + # Only for dev mode + product_domain = fields.Char(default="[]") + + product_ids = fields.Many2many('product.product', string='Products') + product_category_id = fields.Many2one('product.category', string='Categories') + product_tag_id = fields.Many2one('product.tag', string='Product Tag') + + reward_point_amount = fields.Float(default=1, string="Reward") + # Only used for program_id.applies_on == 'future' + reward_point_split = fields.Boolean(string='Split per unit', default=False, + help="Whether to separate reward coupons per matched unit, only applies to 'future' programs and trigger mode per money spent or unit paid..") + reward_point_name = fields.Char(related='program_id.portal_point_name', readonly=True) + reward_point_mode = fields.Selection(selection=_get_reward_point_mode_selection, required=True, default='order') + + minimum_qty = fields.Integer('Minimum Quantity', default=1) + minimum_amount = fields.Monetary('Minimum Purchase', 'currency_id') + minimum_amount_tax_mode = fields.Selection([ + ('incl', 'Included'), + ('excl', 'Excluded')], default='incl', required=True, + ) + + mode = fields.Selection([ + ('auto', 'Automatic'), + ('with_code', 'With a promotion code'), + ], string="Application", default="auto") + code = fields.Char(string='Promotion Code', compute='_compute_code', store=True, readonly=False) + + _sql_constraints = [ + ('reward_point_amount_positive', 'CHECK (reward_point_amount > 0)', 'Rule points reward must be strictly positive.'), + ] + + @api.constrains('reward_point_split') + def _constraint_trigger_multi(self): + # Prevent setting trigger multi in case of nominative programs, it does not make sense to allow this + for rule in self: + if rule.reward_point_split and (rule.program_id.applies_on == 'both' or rule.program_id.program_type == 'ewallet'): + raise ValidationError(_('Split per unit is not allowed for Loyalty and eWallet programs.')) + + @api.constrains('code') + def _constrains_code(self): + mapped_codes = self.filtered('code').mapped('code') + # Program code must be unique + if len(mapped_codes) != len(set(mapped_codes)) or\ + self.env['loyalty.rule'].search_count( + [('mode', '=', 'with_code'), ('code', 'in', mapped_codes), ('id', 'not in', self.ids)]): + raise ValidationError(_('The promo code must be unique.')) + # Prevent coupons and programs from sharing a code + if self.env['loyalty.card'].search_count([('code', 'in', mapped_codes)]): + raise ValidationError(_('A coupon with the same code was found.')) + + @api.depends('mode') + def _compute_code(self): + # Reset code when mode is set to auto + for rule in self: + if rule.mode == 'auto': + rule.code = False + + def _get_valid_product_domain(self): + self.ensure_one() + domain = [] + if self.product_ids: + domain = [('id', 'in', self.product_ids.ids)] + if self.product_category_id: + domain = expression.OR([domain, [('categ_id', 'child_of', self.product_category_id.id)]]) + if self.product_tag_id: + domain = expression.OR([domain, [('all_product_tag_ids', 'in', self.product_tag_id.id)]]) + if self.product_domain and self.product_domain != '[]': + domain = expression.AND([domain, ast.literal_eval(self.product_domain)]) + return domain + + def _get_valid_products(self): + self.ensure_one() + return self.env['product.product'].search(self._get_valid_product_domain()) + + def _compute_amount(self, currency_to): + self.ensure_one() + return self.currency_id._convert( + self.minimum_amount, currency_to, self.company_id, fields.Date.today()) diff --git a/addons/loyalty/models/product_product.py b/addons/loyalty/models/product_product.py new file mode 100644 index 00000000000..772291d1029 --- /dev/null +++ b/addons/loyalty/models/product_product.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, models +from odoo.exceptions import ValidationError + +class ProductProduct(models.Model): + _inherit = 'product.product' + + def write(self, vals): + if not vals.get('active', True) and any(product.active for product in self): + # Prevent archiving products used for giving rewards + rewards = self.env['loyalty.reward'].search([('discount_line_product_id', 'in', self.ids)]) + if rewards: + raise ValidationError(_("This product may not be archived. It is being used for an active promotion program.")) + return super().write(vals) diff --git a/addons/loyalty/report/loyalty_report.xml b/addons/loyalty/report/loyalty_report.xml new file mode 100644 index 00000000000..c062eedf05f --- /dev/null +++ b/addons/loyalty/report/loyalty_report.xml @@ -0,0 +1,24 @@ + + + + + Coupon Code + loyalty.card + qweb-pdf + loyalty.loyalty_report_i18n + loyalty.loyalty_report_i18n + + report + + + + Gift Card + loyalty.card + qweb-pdf + loyalty.gift_card_report_i18n + loyalty.gift_card_report_i18n + + report + + + diff --git a/addons/loyalty/report/loyalty_report_templates.xml b/addons/loyalty/report/loyalty_report_templates.xml new file mode 100644 index 00000000000..950c243caba --- /dev/null +++ b/addons/loyalty/report/loyalty_report_templates.xml @@ -0,0 +1,120 @@ + + + + + + + + + + diff --git a/addons/loyalty/security/ir.model.access.csv b/addons/loyalty/security/ir.model.access.csv new file mode 100644 index 00000000000..b6b82436879 --- /dev/null +++ b/addons/loyalty/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_loyalty_card,access_loyalty_card,model_loyalty_card,base.group_user,0,0,0,0 +access_loyalty_mail,access_loyalty_mail,model_loyalty_mail,base.group_user,0,0,0,0 +access_loyalty_program,access_loyalty_program,model_loyalty_program,base.group_user,0,0,0,0 +access_loyalty_reward,access_loyalty_reward,model_loyalty_reward,base.group_user,0,0,0,0 +access_loyalty_rule,access_loyalty_rule,model_loyalty_rule,base.group_user,0,0,0,0 +access_loyalty_generate_wizard,access_loyalty_generate_wizard,model_loyalty_generate_wizard,base.group_user,0,0,0,0 diff --git a/addons/loyalty/security/loyalty_security.xml b/addons/loyalty/security/loyalty_security.xml new file mode 100644 index 00000000000..4c7419a803b --- /dev/null +++ b/addons/loyalty/security/loyalty_security.xml @@ -0,0 +1,28 @@ + + + + + Loyalty program multi company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + Loyalty card multi company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + Loyalty rule multi company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + Loyalty reward multi company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + diff --git a/addons/loyalty/static/img/2_plus_1.svg b/addons/loyalty/static/img/2_plus_1.svg new file mode 100644 index 00000000000..923421d4443 --- /dev/null +++ b/addons/loyalty/static/img/2_plus_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/coupons.svg b/addons/loyalty/static/img/coupons.svg new file mode 100644 index 00000000000..08e70e2e278 --- /dev/null +++ b/addons/loyalty/static/img/coupons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/ewallet.svg b/addons/loyalty/static/img/ewallet.svg new file mode 100644 index 00000000000..4eef7991375 --- /dev/null +++ b/addons/loyalty/static/img/ewallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/fidelity_cards.svg b/addons/loyalty/static/img/fidelity_cards.svg new file mode 100644 index 00000000000..3032e11ef40 --- /dev/null +++ b/addons/loyalty/static/img/fidelity_cards.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/gift_card.png b/addons/loyalty/static/img/gift_card.png new file mode 100644 index 0000000000000000000000000000000000000000..15a42a747dd8ef367e8e9ecb64d3c5c5e2e9e169 GIT binary patch literal 24678 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 literal 0 HcmV?d00001 diff --git a/addons/loyalty/static/img/gift_card.svg b/addons/loyalty/static/img/gift_card.svg new file mode 100644 index 00000000000..7086772e353 --- /dev/null +++ b/addons/loyalty/static/img/gift_card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/loyalty_cards.svg b/addons/loyalty/static/img/loyalty_cards.svg new file mode 100644 index 00000000000..661ca73d46a --- /dev/null +++ b/addons/loyalty/static/img/loyalty_cards.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/loyalty_cards_2.svg b/addons/loyalty/static/img/loyalty_cards_2.svg new file mode 100644 index 00000000000..daaf88d67b3 --- /dev/null +++ b/addons/loyalty/static/img/loyalty_cards_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/promo_code.svg b/addons/loyalty/static/img/promo_code.svg new file mode 100644 index 00000000000..a0cce441fb4 --- /dev/null +++ b/addons/loyalty/static/img/promo_code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/img/promotional_program.svg b/addons/loyalty/static/img/promotional_program.svg new file mode 100644 index 00000000000..aa5d2d40387 --- /dev/null +++ b/addons/loyalty/static/img/promotional_program.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/loyalty/static/src/js/loyalty_control_panel_widget.js b/addons/loyalty/static/src/js/loyalty_control_panel_widget.js new file mode 100644 index 00000000000..382c1ce6520 --- /dev/null +++ b/addons/loyalty/static/src/js/loyalty_control_panel_widget.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ + +import ControlPanelX2Many from 'web.ControlPanelX2Many'; +import { FieldOne2Many } from 'web.relational_fields'; +import fieldRegistry from 'web.field_registry'; + +export class LoyaltyControlPanelX2Many extends ControlPanelX2Many { +} + +LoyaltyControlPanelX2Many.props = Object.assign({}, ControlPanelX2Many.props, { + label: String, +}); +LoyaltyControlPanelX2Many.template = 'LoyaltyControlPanelX2Many'; + +export const LoyaltyFieldOne2Many = FieldOne2Many.extend({ + /** + * @override + * @private + */ + _getControlPanelComponent: function () { + return LoyaltyControlPanelX2Many; + }, + /** + * @override + * @private + */ + _getControlPanelContext: function () { + const context = this._super.apply(this); + Object.assign(context, { + label: this.string, + }); + return context; + } +}); + +fieldRegistry.add('loyalty_one2many', LoyaltyFieldOne2Many); diff --git a/addons/loyalty/static/src/js/loyalty_list_view.js b/addons/loyalty/static/src/js/loyalty_list_view.js new file mode 100644 index 00000000000..2e3287782fe --- /dev/null +++ b/addons/loyalty/static/src/js/loyalty_list_view.js @@ -0,0 +1,23 @@ +/** @odoo-module **/ + +import { LoyaltyModelMixin, LoyaltyRendererMixin } from "@loyalty/js/loyalty_views"; +import ListModel from 'web.ListModel'; +import ListRenderer from 'web.ListRenderer'; +import ListView from 'web.ListView'; +import viewRegistry from 'web.view_registry'; + +export const LoyaltyListModel = ListModel.extend(LoyaltyModelMixin); +export const LoyaltyListRenderer = ListRenderer.extend(LoyaltyRendererMixin, { + events: _.extend({}, ListRenderer.prototype.events, { + 'click .loyalty-template': '_onTemplateClick', + }), +}); + +export const LoyaltyListView = ListView.extend({ + config: _.extend({}, ListView.prototype.config, { + Model: LoyaltyListModel, + Renderer: LoyaltyListRenderer, + }) +}); + +viewRegistry.add('loyalty_program_list_view', LoyaltyListView); diff --git a/addons/loyalty/static/src/js/loyalty_views.js b/addons/loyalty/static/src/js/loyalty_views.js new file mode 100644 index 00000000000..ad99f47e427 --- /dev/null +++ b/addons/loyalty/static/src/js/loyalty_views.js @@ -0,0 +1,61 @@ +/** @odoo-module **/ + +import session from 'web.session'; +import core from 'web.core'; +const qweb = core.qweb; + +/* +* This file provides the necessary mixins that can be used on views to change the behaviour of the help +* display (no records) in order to provide templates to the user +*/ + +export const LoyaltyModelMixin = { + __load: async function () { + const res = await this._super.apply(this, arguments); + + this.loyaltyTemplateData = await this._rpc({ + model: 'loyalty.program', + method: 'get_program_templates', + context: session.user_context, + }); + return res; + }, + + __get: function () { + const res = this._super.apply(this, arguments); + if (res) { + res.loyaltyTemplateData = this.loyaltyTemplateData; + } + return res; + } +}; + +export const LoyaltyRendererMixin = { + _renderNoContentHelper: function (context) { + this._super.apply(this, arguments); + + if (!this.state.loyaltyTemplateData) { + return; + } + const noContentHelper = this.$('.o_view_nocontent'); + if (noContentHelper) { + noContentHelper.append(qweb.render('loyalty_program_helper', { + templateData: this.state.loyaltyTemplateData, + })); + } + }, + + _onTemplateClick: async function (ev) { + ev.stopPropagation(); + const action = await this._rpc({ + model: 'loyalty.program', + method: 'create_from_template', + args: [ev.currentTarget.id || ''], + context: session.user_context, + }); + if (!action) { + return; + } + this.do_action(action); + } +}; diff --git a/addons/loyalty/static/src/scss/loyalty.scss b/addons/loyalty/static/src/scss/loyalty.scss new file mode 100644 index 00000000000..61c918f0a23 --- /dev/null +++ b/addons/loyalty/static/src/scss/loyalty.scss @@ -0,0 +1,57 @@ +.o_loyalty_kanban_inline { + + width: 100% !important; + + .o_kanban_record .o_kanban_tags .o_tag span { + // Remove the small ball before the tags + width: auto !important; + height: auto !important; + background-color: none !important; + } +} + +.o_loyalty_not_found { + margin-top: -15vh; +} + +.loyalty-templates-container { + pointer-events: auto; + margin-top: -5vh; + + .loyalty-template { + &, * { + transition: all .15s; + } + + cursor: pointer !important; + + img { + filter: invert(.5); + } + + &:hover { + * { + color: #7C6576 !important; + } + + background-color: var(--o-color-4); + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 2px 0 rgba(0, 0, 0, 0.05); + border-color: #7C6576 !important; + + img { + filter: invert(0); + } + + .card-body { + background-color: var(--o-color-4) !important; + } + } + } +} + +.loyalty-rule-form { + // The base width for this field is 100px which is problematic for us. + .o_field_widget.o_field_monetary.o_input > input { + width: 100%; + } +} diff --git a/addons/loyalty/static/src/xml/loyalty_templates.xml b/addons/loyalty/static/src/xml/loyalty_templates.xml new file mode 100644 index 00000000000..baf4fa418bf --- /dev/null +++ b/addons/loyalty/static/src/xml/loyalty_templates.xml @@ -0,0 +1,39 @@ + + + +
+
+ + + +
+
+
+
+
+ +
+
+
+
+

+

+

+
+
+
+
+
+
+
+
+ + +
+

+ +
+
+
diff --git a/addons/loyalty/tests/__init__.py b/addons/loyalty/tests/__init__.py new file mode 100644 index 00000000000..88b0b0cf637 --- /dev/null +++ b/addons/loyalty/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_loyalty diff --git a/addons/loyalty/tests/test_loyalty.py b/addons/loyalty/tests/test_loyalty.py new file mode 100644 index 00000000000..2c8984597a8 --- /dev/null +++ b/addons/loyalty/tests/test_loyalty.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from psycopg2 import IntegrityError + +from odoo.tests import tagged, TransactionCase +from odoo.tools import mute_logger + +from unittest.mock import patch + +@tagged('post_install', '-at_install') +class TestLoyalty(TransactionCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.program = cls.env['loyalty.program'].create({ + 'name': 'Test Program', + 'reward_ids': [(0, 0, {})], + }) + + + def test_discount_product_unlink(self): + # Test that we can not unlink dicount line product id + with mute_logger('odoo.sql_db'): + with self.assertRaises(IntegrityError): + with self.cr.savepoint(): + self.program.reward_ids.discount_line_product_id.unlink() + + def test_loyalty_mail(self): + # Test basic loyalty_mail functionalities + loyalty_card_model_id = self.env.ref('loyalty.model_loyalty_card') + create_tmpl, fifty_tmpl, hundred_tmpl = self.env['mail.template'].create([ + { + 'name': 'CREATE', + 'model_id': loyalty_card_model_id.id, + }, + { + 'name': '50 points', + 'model_id': loyalty_card_model_id.id, + }, + { + 'name': '100 points', + 'model_id': loyalty_card_model_id.id, + }, + ]) + self.program.write({'communication_plan_ids': [ + (0, 0, { + 'program_id': self.program.id, + 'trigger': 'create', + 'mail_template_id': create_tmpl.id, + }), + (0, 0, { + 'program_id': self.program.id, + 'trigger': 'points_reach', + 'points': 50, + 'mail_template_id': fifty_tmpl.id, + }), + (0, 0, { + 'program_id': self.program.id, + 'trigger': 'points_reach', + 'points': 100, + 'mail_template_id': hundred_tmpl.id, + }), + ]}) + + sent_mails = self.env['mail.template'] + + def mock_send_mail(self, *args, **kwargs): + nonlocal sent_mails + sent_mails |= self + + partner = self.env['res.partner'].create({'name': 'Test Partner'}) + with patch('odoo.addons.mail.models.mail_template.MailTemplate.send_mail', new=mock_send_mail): + # Send mail at creation + coupon = self.env['loyalty.card'].create({ + 'program_id': self.program.id, + 'partner_id': partner.id, + 'points': 0, + }) + self.assertEqual(sent_mails, create_tmpl) + sent_mails = self.env['mail.template'] + # 50 points mail + coupon.points = 50 + self.assertEqual(sent_mails, fifty_tmpl) + sent_mails = self.env['mail.template'] + # Check that it does not get sent again + coupon.points = 99 + self.assertFalse(sent_mails) + # 100 points mail + coupon.points = 100 + self.assertEqual(sent_mails, hundred_tmpl) + sent_mails = self.env['mail.template'] + # Reset and go straight to 100 points + coupon.points = 0 + self.assertFalse(sent_mails) + coupon.points = 100 + self.assertEqual(sent_mails, hundred_tmpl) diff --git a/addons/loyalty/views/loyalty_card_views.xml b/addons/loyalty/views/loyalty_card_views.xml new file mode 100644 index 00000000000..e616aadcec2 --- /dev/null +++ b/addons/loyalty/views/loyalty_card_views.xml @@ -0,0 +1,49 @@ + + + + loyalty.card.view.form + loyalty.card + +
+ + + + + + + + +
+ +
+
+
+
+ + + loyalty.card.view.tree + loyalty.card + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + loyalty.program.view.tree + loyalty.program + + + + + + + + + + + + + loyalty.program.view.search + loyalty.program + + + + + + + + + + + Promotions, Gift Card, Loyalty + loyalty.program + tree,form + +
+

No loyalty program found.

+

Create a new one from scratch, or use one of the templates below.

+
+
+
+
diff --git a/addons/loyalty/views/loyalty_reward_views.xml b/addons/loyalty/views/loyalty_reward_views.xml new file mode 100644 index 00000000000..66d4f5eb374 --- /dev/null +++ b/addons/loyalty/views/loyalty_reward_views.xml @@ -0,0 +1,110 @@ + + + + loyalty.reward.view.form + loyalty.reward + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + loyalty.reward.view.kanban + loyalty.reward + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + +
+
+ + +
+
+
+

With (or more)

+
+
+
+
+
+
+
diff --git a/addons/loyalty/views/loyalty_rule_views.xml b/addons/loyalty/views/loyalty_rule_views.xml new file mode 100644 index 00000000000..bafc74b4d91 --- /dev/null +++ b/addons/loyalty/views/loyalty_rule_views.xml @@ -0,0 +1,110 @@ + + + + loyalty.rule.view.form + loyalty.rule + +
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + loyalty.rule.view.kanban + loyalty.rule + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/addons/loyalty/wizard/__init__.py b/addons/loyalty/wizard/__init__.py new file mode 100644 index 00000000000..18790e0b824 --- /dev/null +++ b/addons/loyalty/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import loyalty_generate_wizard diff --git a/addons/loyalty/wizard/loyalty_generate_wizard.py b/addons/loyalty/wizard/loyalty_generate_wizard.py new file mode 100644 index 00000000000..fbb7397c420 --- /dev/null +++ b/addons/loyalty/wizard/loyalty_generate_wizard.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.osv import expression + +class LoyaltyGenerateWizard(models.TransientModel): + _name = 'loyalty.generate.wizard' + _description = 'Generate Coupons' + + program_id = fields.Many2one('loyalty.program', required=True, default=lambda self: self.env.context.get('active_id', False)) + program_type = fields.Selection(related='program_id.program_type') + + mode = fields.Selection([ + ('anonymous', 'Anonymous Customers'), + ('selected', 'Selected Customers')], + string='For', required=True, default='anonymous' + ) + + customer_ids = fields.Many2many('res.partner', string='Customers') + customer_tag_ids = fields.Many2many('res.partner.category', string='Customer Tags') + + coupon_qty = fields.Integer('Quantity', + compute='_compute_coupon_qty', readonly=False, store=True) + points_granted = fields.Float('Grant', required=True, default=1) + points_name = fields.Char(related='program_id.portal_point_name', readonly=True) + valid_until = fields.Date() + + def _get_partners(self): + self.ensure_one() + if self.mode != 'selected': + return self.env['res.partner'] + domain = [] + if self.customer_ids: + domain = [('id', 'in', self.customer_ids.ids)] + if self.customer_tag_ids: + domain = expression.OR([domain, [('category_id', 'in', self.customer_tag_ids.ids)]]) + return self.env['res.partner'].search(domain) + + @api.depends('customer_ids', 'customer_tag_ids', 'mode') + def _compute_coupon_qty(self): + for wizard in self: + if wizard.mode == 'selected': + wizard.coupon_qty = len(wizard._get_partners()) + else: + wizard.coupon_qty = wizard.coupon_qty or 0 + + def _get_coupon_values(self, partner): + self.ensure_one() + return { + 'program_id': self.program_id.id, + 'points': self.points_granted, + 'expiration_date': self.valid_until, + 'partner_id': partner.id if self.mode == 'selected' else False, + } + + def generate_coupons(self): + if any(not wizard.program_id for wizard in self): + raise ValidationError(_("Can not generate coupon, no program is set.")) + if any(wizard.coupon_qty <= 0 for wizard in self): + raise ValidationError(_("Invalid quantity.")) + coupon_create_vals = [] + for wizard in self: + customers = wizard._get_partners() or range(wizard.coupon_qty) + for partner in customers: + coupon_create_vals.append(wizard._get_coupon_values(partner)) + self.env['loyalty.card'].create(coupon_create_vals) + return True diff --git a/addons/loyalty/wizard/loyalty_generate_wizard_views.xml b/addons/loyalty/wizard/loyalty_generate_wizard_views.xml new file mode 100644 index 00000000000..ed4b5f18d89 --- /dev/null +++ b/addons/loyalty/wizard/loyalty_generate_wizard_views.xml @@ -0,0 +1,39 @@ + + + + loyalty.generate.wizard.view.form + loyalty.generate.wizard + +
+ + + + + + + + + + + +
+
+
+
+
+ + + Generate Coupons + loyalty.generate.wizard + form + new + +
From e996ff630d3fa99c38dc405582fd31ab5859f88f Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:31:52 +0100 Subject: [PATCH 14/19] [ADD] loyalty_delivery: add free shipping as reward Complementary module for `loyalty` that adds a new reward type: Free Shipping. TaskId-2675382 --- addons/loyalty_delivery/__init__.py | 4 +++ addons/loyalty_delivery/__manifest__.py | 18 +++++++++++ .../data/loyalty_delivery_data.xml | 9 ++++++ addons/loyalty_delivery/models/__init__.py | 5 +++ .../models/loyalty_program.py | 32 +++++++++++++++++++ .../loyalty_delivery/models/loyalty_reward.py | 23 +++++++++++++ .../views/loyalty_reward_views.xml | 15 +++++++++ 7 files changed, 106 insertions(+) create mode 100644 addons/loyalty_delivery/__init__.py create mode 100644 addons/loyalty_delivery/__manifest__.py create mode 100644 addons/loyalty_delivery/data/loyalty_delivery_data.xml create mode 100644 addons/loyalty_delivery/models/__init__.py create mode 100644 addons/loyalty_delivery/models/loyalty_program.py create mode 100644 addons/loyalty_delivery/models/loyalty_reward.py create mode 100644 addons/loyalty_delivery/views/loyalty_reward_views.xml diff --git a/addons/loyalty_delivery/__init__.py b/addons/loyalty_delivery/__init__.py new file mode 100644 index 00000000000..dc5e6b693d1 --- /dev/null +++ b/addons/loyalty_delivery/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/addons/loyalty_delivery/__manifest__.py b/addons/loyalty_delivery/__manifest__.py new file mode 100644 index 00000000000..94acac101bc --- /dev/null +++ b/addons/loyalty_delivery/__manifest__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': 'Coupons & Loyalty - Delivery', + 'summary': "Add a free shipping option to your rewards", + 'category': 'Sales', + 'version': '1.0', + 'depends': ['loyalty', 'delivery'], + 'data': [ + 'data/loyalty_delivery_data.xml', + 'views/loyalty_reward_views.xml', + ], + 'assets': { + }, + 'installable': True, + 'auto_install': True, + 'license': 'LGPL-3', +} diff --git a/addons/loyalty_delivery/data/loyalty_delivery_data.xml b/addons/loyalty_delivery/data/loyalty_delivery_data.xml new file mode 100644 index 00000000000..e2bbacbc133 --- /dev/null +++ b/addons/loyalty_delivery/data/loyalty_delivery_data.xml @@ -0,0 +1,9 @@ + + + + none + + + none + + diff --git a/addons/loyalty_delivery/models/__init__.py b/addons/loyalty_delivery/models/__init__.py new file mode 100644 index 00000000000..29b01a33788 --- /dev/null +++ b/addons/loyalty_delivery/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import loyalty_program +from . import loyalty_reward diff --git a/addons/loyalty_delivery/models/loyalty_program.py b/addons/loyalty_delivery/models/loyalty_program.py new file mode 100644 index 00000000000..98155c27709 --- /dev/null +++ b/addons/loyalty_delivery/models/loyalty_program.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, models + +class LoyaltyProgram(models.Model): + _inherit = 'loyalty.program' + + @api.model + def _program_type_default_values(self): + res = super()._program_type_default_values() + # Add a loyalty reward for free shipping + res['loyalty']['reward_ids'].append((0, 0, { + 'reward_type': 'shipping', + 'required_points': 100, + })) + return res + + @api.model + def get_program_templates(self): + # Override 'promotion' template to say free shipping + res = super().get_program_templates() + res['promotion']['description'] = _("Automatic promotion: free shipping on orders higher than $50") + return res + + @api.model + def _get_template_values(self): + res = super()._get_template_values() + res['promotion']['reward_ids'] = [(5, 0, 0), (0, 0, { + 'reward_type': 'shipping', + })] + return res diff --git a/addons/loyalty_delivery/models/loyalty_reward.py b/addons/loyalty_delivery/models/loyalty_reward.py new file mode 100644 index 00000000000..cbf35ac6b0e --- /dev/null +++ b/addons/loyalty_delivery/models/loyalty_reward.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, fields, models + +class LoyaltyReward(models.Model): + _inherit = 'loyalty.reward' + + reward_type = fields.Selection( + selection_add=[('shipping', 'Free Shipping')], + ondelete={'shipping': 'set default'}) + + def _compute_description(self): + shipping_rewards = self.filtered(lambda r: r.reward_type == 'shipping') + super(LoyaltyReward, self - shipping_rewards)._compute_description() + shipping_rewards.description = _('Free shipping') + for reward in shipping_rewards: + if reward.discount_max_amount: + format_string = '%(amount)g %(symbol)s' + if reward.currency_id.position == 'before': + format_string = '%(symbol)s %(amount)g' + formatted_amount = format_string % {'amount': reward.discount_max_amount, 'symbol': reward.currency_id.symbol} + reward.description += _(' (Max %s)', formatted_amount) diff --git a/addons/loyalty_delivery/views/loyalty_reward_views.xml b/addons/loyalty_delivery/views/loyalty_reward_views.xml new file mode 100644 index 00000000000..559c3257161 --- /dev/null +++ b/addons/loyalty_delivery/views/loyalty_reward_views.xml @@ -0,0 +1,15 @@ + + + + loyalty.reward.view.form.inherit.loyalty.delivery + loyalty.reward + + + + + + + + + + From 1d92a264a666e2c6bdf4705502bd58ff6d08cf7b Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:33:37 +0100 Subject: [PATCH 15/19] [ADD] sale_loyalty: manage loyalty in sales orders This module replaces both sale_coupon and sale_gift_card aswell as adding new loyalty programs feature to sale. TaskId-2675382 --- addons/sale/models/res_config_settings.py | 2 +- .../sale/views/res_config_settings_views.xml | 4 +- addons/sale_loyalty/__init__.py | 5 + addons/sale_loyalty/__manifest__.py | 21 + .../sale_loyalty/data/sale_loyalty_data.xml | 11 + addons/sale_loyalty/models/__init__.py | 9 + addons/sale_loyalty/models/loyalty_card.py | 31 + addons/sale_loyalty/models/loyalty_program.py | 22 + addons/sale_loyalty/models/loyalty_reward.py | 16 + addons/sale_loyalty/models/sale_order.py | 972 +++++++++++ .../models/sale_order_coupon_points.py | 17 + addons/sale_loyalty/models/sale_order_line.py | 116 ++ .../sale_loyalty/security/ir.model.access.csv | 16 + addons/sale_loyalty/tests/__init__.py | 12 + addons/sale_loyalty/tests/common.py | 201 +++ .../sale_loyalty/tests/test_buy_gift_card.py | 36 + addons/sale_loyalty/tests/test_loyalty.py | 78 + .../tests/test_pay_with_gift_card.py | 71 + .../tests/test_program_multi_company.py | 83 + .../tests/test_program_numbers.py | 1463 +++++++++++++++++ .../sale_loyalty/tests/test_program_rules.py | 276 ++++ .../test_program_with_code_operations.py | 333 ++++ .../test_program_without_code_operations.py | 64 + .../sale_loyalty/tests/test_sale_invoicing.py | 61 + .../sale_loyalty/views/loyalty_card_views.xml | 13 + .../views/loyalty_program_views.xml | 11 + .../sale_loyalty/views/sale_order_views.xml | 20 + addons/sale_loyalty/views/templates.xml | 60 + addons/sale_loyalty/wizard/__init__.py | 5 + .../wizard/sale_loyalty_coupon_wizard.py | 30 + .../sale_loyalty_coupon_wizard_views.xml | 29 + .../wizard/sale_loyalty_reward_wizard.py | 54 + .../sale_loyalty_reward_wizard_views.xml | 49 + 33 files changed, 4188 insertions(+), 3 deletions(-) create mode 100644 addons/sale_loyalty/__init__.py create mode 100644 addons/sale_loyalty/__manifest__.py create mode 100644 addons/sale_loyalty/data/sale_loyalty_data.xml create mode 100644 addons/sale_loyalty/models/__init__.py create mode 100644 addons/sale_loyalty/models/loyalty_card.py create mode 100644 addons/sale_loyalty/models/loyalty_program.py create mode 100644 addons/sale_loyalty/models/loyalty_reward.py create mode 100644 addons/sale_loyalty/models/sale_order.py create mode 100644 addons/sale_loyalty/models/sale_order_coupon_points.py create mode 100644 addons/sale_loyalty/models/sale_order_line.py create mode 100644 addons/sale_loyalty/security/ir.model.access.csv create mode 100644 addons/sale_loyalty/tests/__init__.py create mode 100644 addons/sale_loyalty/tests/common.py create mode 100644 addons/sale_loyalty/tests/test_buy_gift_card.py create mode 100644 addons/sale_loyalty/tests/test_loyalty.py create mode 100644 addons/sale_loyalty/tests/test_pay_with_gift_card.py create mode 100644 addons/sale_loyalty/tests/test_program_multi_company.py create mode 100644 addons/sale_loyalty/tests/test_program_numbers.py create mode 100644 addons/sale_loyalty/tests/test_program_rules.py create mode 100644 addons/sale_loyalty/tests/test_program_with_code_operations.py create mode 100644 addons/sale_loyalty/tests/test_program_without_code_operations.py create mode 100644 addons/sale_loyalty/tests/test_sale_invoicing.py create mode 100644 addons/sale_loyalty/views/loyalty_card_views.xml create mode 100644 addons/sale_loyalty/views/loyalty_program_views.xml create mode 100644 addons/sale_loyalty/views/sale_order_views.xml create mode 100644 addons/sale_loyalty/views/templates.xml create mode 100644 addons/sale_loyalty/wizard/__init__.py create mode 100644 addons/sale_loyalty/wizard/sale_loyalty_coupon_wizard.py create mode 100644 addons/sale_loyalty/wizard/sale_loyalty_coupon_wizard_views.xml create mode 100644 addons/sale_loyalty/wizard/sale_loyalty_reward_wizard.py create mode 100644 addons/sale_loyalty/wizard/sale_loyalty_reward_wizard_views.xml diff --git a/addons/sale/models/res_config_settings.py b/addons/sale/models/res_config_settings.py index a077b690030..806a81187d9 100644 --- a/addons/sale/models/res_config_settings.py +++ b/addons/sale/models/res_config_settings.py @@ -77,7 +77,7 @@ class ResConfigSettings(models.TransientModel): module_product_email_template = fields.Boolean("Specific Email") module_sale_amazon = fields.Boolean("Amazon Sync") - module_sale_coupon = fields.Boolean("Coupons & Promotions") + module_sale_loyalty = fields.Boolean("Coupons & Loyalty") module_sale_margin = fields.Boolean("Margins") #=== ONCHANGE METHODS ===# diff --git a/addons/sale/views/res_config_settings_views.xml b/addons/sale/views/res_config_settings_views.xml index b7bec091b48..2b778e70fbe 100644 --- a/addons/sale/views/res_config_settings_views.xml +++ b/addons/sale/views/res_config_settings_views.xml @@ -105,10 +105,10 @@ id="coupon_settings" title="Boost your sales with two kinds of discount programs: promotions and coupon codes. Specific conditions can be set (products, customers, minimum purchase amount, period). Rewards can be discounts (% or amount) or free products.">
- +
-
+ title="Boost your sales with multiple kinds of programs: Coupons, Promotions, Gift Card, Loyalty. Specific conditions can be set (products, customers, minimum purchase amount, period). Rewards can be discounts (% or amount) or free products.">
- +
-
+
+ + + + diff --git a/addons/website_sale_loyalty/views/website_sale_templates.xml b/addons/website_sale_loyalty/views/website_sale_templates.xml new file mode 100644 index 00000000000..33091ffb6a7 --- /dev/null +++ b/addons/website_sale_loyalty/views/website_sale_templates.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/website_sale_loyalty/wizard/__init__.py b/addons/website_sale_loyalty/wizard/__init__.py new file mode 100644 index 00000000000..3d4fe11e986 --- /dev/null +++ b/addons/website_sale_loyalty/wizard/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import loyalty_generate_wizard +from . import sale_coupon_share diff --git a/addons/website_sale_loyalty/wizard/loyalty_generate_wizard.py b/addons/website_sale_loyalty/wizard/loyalty_generate_wizard.py new file mode 100644 index 00000000000..828ab3fe592 --- /dev/null +++ b/addons/website_sale_loyalty/wizard/loyalty_generate_wizard.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class LoyaltyGenerateWizard(models.TransientModel): + _inherit = 'loyalty.generate.wizard' + + website_id = fields.Many2one('website', 'Website') + + def _get_coupon_values(self, partner): + res = super()._get_coupon_values(partner) + if self.website_id: + res.update(website_id=self.website_id.id) + return res diff --git a/addons/website_sale_loyalty/wizard/loyalty_generate_wizard_views.xml b/addons/website_sale_loyalty/wizard/loyalty_generate_wizard_views.xml new file mode 100644 index 00000000000..6df0890c9ab --- /dev/null +++ b/addons/website_sale_loyalty/wizard/loyalty_generate_wizard_views.xml @@ -0,0 +1,13 @@ + + + + loyalty.generate.wizard.view.form.inherit.website.sale.loyalty + loyalty.generate.wizard + + + + + + + + diff --git a/addons/website_sale_loyalty/wizard/sale_coupon_share.py b/addons/website_sale_loyalty/wizard/sale_coupon_share.py new file mode 100644 index 00000000000..808fffedc0d --- /dev/null +++ b/addons/website_sale_loyalty/wizard/sale_coupon_share.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from werkzeug.urls import url_encode + +from odoo import fields, models, api, _ +from odoo.exceptions import UserError, ValidationError + + +class SaleCouponShare(models.TransientModel): + _name = 'coupon.share' + _description = 'Create links that apply a coupon and redirect to a specific page' + + def _get_default_website_id(self): + program_website_id = self.env['loyalty.program'].browse(self.env.context.get('default_program_id')).website_id + if program_website_id: + return program_website_id + else: + Website = self.env['website'] + websites = Website.search([]) + return len(websites) == 1 and websites or Website + + website_id = fields.Many2one('website', required=True, default=_get_default_website_id) + coupon_id = fields.Many2one('loyalty.card', domain="[('program_id', '=', program_id)]") + program_id = fields.Many2one('loyalty.program', required=True, domain=[ + '|', ('program_type', '=', 'coupons'), # All coupons programs + '|', ('trigger', '=', 'with_code'), # All programs that require a code + ('rule_ids.code', '!=', False), # All programs that can not trigger without a code + ]) + program_website_id = fields.Many2one('website', string='Program Website', related='program_id.website_id') + + promo_code = fields.Char(compute='_compute_promo_code') + share_link = fields.Char(compute='_compute_share_link') + redirect = fields.Char(required=True, default='/shop') + + @api.constrains('coupon_id', 'program_id') + def _check_program(self): + if self.filtered(lambda record: not record.coupon_id and record.program_id.program_type == 'coupons'): + raise ValidationError(_("A coupon is needed for coupon programs.")) + + @api.constrains('website_id', 'program_id') + def _check_website(self): + if self.filtered(lambda record: record.program_website_id and record.program_website_id != record.website_id): + raise ValidationError(_("The shared website should correspond to the website of the program.")) + + @api.depends('coupon_id.code', 'program_id.rule_ids.code') + def _compute_promo_code(self): + for record in self: + record.promo_code = record.coupon_id.code or record.program_id.rule_ids.filtered('code')[:1].code + + @api.depends('website_id', 'redirect') + @api.depends_context('use_short_link') + def _compute_share_link(self): + for record in self: + target_url = '{base}/coupon/{code}?{query}'.format( + base=record.website_id.get_base_url(), + code=record.promo_code, + query=url_encode({'r': record.redirect}), + ) + + if record.env.context.get('use_short_link'): + tracker = self.env['link.tracker'].search([('url', '=', target_url)], limit=1) + if not tracker: + tracker = self.env['link.tracker'].create({'url': target_url}) + record.share_link = tracker.short_url + else: + record.share_link = target_url + + def action_generate_short_link(self): + return { + 'name': _('Share Coupon'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'coupon.share', + 'target': 'new', + 'res_id': self.id, + 'context': { + 'use_short_link': True, + } + } + + @api.model + def create_share_action(self, coupon=None, program=None): + if bool(program) == bool(coupon): + raise UserError(_("Provide either a coupon or a program.")) + + return { + 'name': _('Share Coupon'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'coupon.share', + 'target': 'new', + 'flags': {'form': {'action_buttons': True}}, + 'context': { + 'form_view_initial_mode': 'edit', + 'default_program_id': program and program.id or coupon.program_id.id, + 'default_coupon_id': coupon and coupon.id or None, + } + } diff --git a/addons/website_sale_loyalty/wizard/sale_coupon_share_views.xml b/addons/website_sale_loyalty/wizard/sale_coupon_share_views.xml new file mode 100644 index 00000000000..e75866e90ee --- /dev/null +++ b/addons/website_sale_loyalty/wizard/sale_coupon_share_views.xml @@ -0,0 +1,32 @@ + + + + coupon.share.form + coupon.share + +
+ + +
+

+ You can share this promotion with your customers. + It will be applied at checkout when the customer uses this link. +

+
+ +
+
+ + + + +
+
+ +
+
+
From 38b907814f255739e28884da912108bc8d387b0c Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:45:00 +0100 Subject: [PATCH 18/19] [ADD] website_sale_loyalty_delivery: offer free shipping in eCommerce Connects sale_loyalty_delivery and website_sale_loyalty. This module replaces website_sale_coupon_delivery TaskId-2675382 --- .../website_sale_loyalty_delivery/__init__.py | 4 ++ .../__manifest__.py | 17 +++++++ .../controllers/__init__.py | 4 ++ .../controllers/main.py | 50 +++++++++++++++++++ .../src/js/website_sale_loyalty_delivery.js | 35 +++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 addons/website_sale_loyalty_delivery/__init__.py create mode 100644 addons/website_sale_loyalty_delivery/__manifest__.py create mode 100644 addons/website_sale_loyalty_delivery/controllers/__init__.py create mode 100644 addons/website_sale_loyalty_delivery/controllers/main.py create mode 100644 addons/website_sale_loyalty_delivery/static/src/js/website_sale_loyalty_delivery.js diff --git a/addons/website_sale_loyalty_delivery/__init__.py b/addons/website_sale_loyalty_delivery/__init__.py new file mode 100644 index 00000000000..dd15b5c32e5 --- /dev/null +++ b/addons/website_sale_loyalty_delivery/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import controllers diff --git a/addons/website_sale_loyalty_delivery/__manifest__.py b/addons/website_sale_loyalty_delivery/__manifest__.py new file mode 100644 index 00000000000..59e0826dffd --- /dev/null +++ b/addons/website_sale_loyalty_delivery/__manifest__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': "Free Delivery with Coupon & Loyalty on eCommerce", + 'summary': """Allows to offer free shippings in loyalty program rewards on eCommerce""", + 'description': """Allows to offer free shippings in loyalty program rewards on eCommerce""", + 'category': 'Website/Website', + 'version': '1.0', + 'depends': ['website_sale_delivery', 'website_sale_loyalty', 'sale_loyalty_delivery'], + 'auto_install': True, + 'assets': { + 'web.assets_frontend': [ + 'website_sale_loyalty_delivery/static/**/*', + ], + }, + 'license': 'LGPL-3', +} diff --git a/addons/website_sale_loyalty_delivery/controllers/__init__.py b/addons/website_sale_loyalty_delivery/controllers/__init__.py new file mode 100644 index 00000000000..5d4b25db9c0 --- /dev/null +++ b/addons/website_sale_loyalty_delivery/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons/website_sale_loyalty_delivery/controllers/main.py b/addons/website_sale_loyalty_delivery/controllers/main.py new file mode 100644 index 00000000000..3d9d217086c --- /dev/null +++ b/addons/website_sale_loyalty_delivery/controllers/main.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery +from odoo.http import request + + +class WebsiteSaleLoyaltyDelivery(WebsiteSaleDelivery): + + @http.route() + def update_eshop_carrier(self, **post): + Monetary = request.env['ir.qweb.field.monetary'] + result = super().update_eshop_carrier(**post) + order = request.website.sale_get_order() + free_shipping_lines = None + + if order: + order._update_programs_and_rewards() + order.validate_taxes_on_sales_order() + free_shipping_lines = order._get_free_shipping_lines() + + if free_shipping_lines: + currency = order.currency_id + amount_free_shipping = sum(free_shipping_lines.mapped('price_subtotal')) + result.update({ + 'new_amount_delivery': Monetary.value_to_html(0.0, {'display_currency': currency}), + 'new_amount_untaxed': Monetary.value_to_html(order.amount_untaxed, {'display_currency': currency}), + 'new_amount_tax': Monetary.value_to_html(order.amount_tax, {'display_currency': currency}), + 'new_amount_total': Monetary.value_to_html(order.amount_total, {'display_currency': currency}), + 'new_amount_order_discounted': Monetary.value_to_html(order.reward_amount - amount_free_shipping, {'display_currency': currency}), + 'new_amount_total_raw': order.amount_total, + }) + return result + + @http.route() + def cart_carrier_rate_shipment(self, carrier_id, **kw): + Monetary = request.env['ir.qweb.field.monetary'] + order = request.website.sale_get_order(force_create=True) + free_shipping_lines = order._get_free_shipping_lines() + # Avoid computing carrier price delivery is free (coupon). It means if + # the carrier has error (eg 'delivery only for Belgium') it will show + # Free until the user clicks on it. + if free_shipping_lines: + return { + 'carrier_id': carrier_id, + 'status': True, + 'is_free_delivery': True, + 'new_amount_delivery': Monetary.value_to_html(0.0, {'display_currency': order.currency_id}), + 'error_message': None, + } + return super().cart_carrier_rate_shipment(carrier_id, **kw) diff --git a/addons/website_sale_loyalty_delivery/static/src/js/website_sale_loyalty_delivery.js b/addons/website_sale_loyalty_delivery/static/src/js/website_sale_loyalty_delivery.js new file mode 100644 index 00000000000..ad783c2edbd --- /dev/null +++ b/addons/website_sale_loyalty_delivery/static/src/js/website_sale_loyalty_delivery.js @@ -0,0 +1,35 @@ +/** @odoo-module **/ + +import PublicWidget from 'web.public.widget'; +import { patch } from 'web.utils'; +import core from 'web.core'; + +const _t = core._t; + +patch(PublicWidget.registry.websiteSaleDelivery, 'addons/website_sale_loyalty_delivery/statis/src/js/website_sale_loyalty_delivery.js', { + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _handleCarrierUpdateResult: function (result) { + this._super.apply(this, arguments); + if (result.new_amount_order_discounted) { + // Update discount of the order + $('#order_discounted').html(result.new_amount_order_discounted); + } + }, + /** + * @override + */ + _handleCarrierUpdateResultBadge: function (result) { + this._super.apply(this, arguments); + if (result.new_amount_order_discounted) { + // We are in freeshipping, so every carrier is Free but we don't + // want to replace error message by 'Free' + $('#delivery_carrier .badge:not(.o_wsale_delivery_carrier_error)').text(_t('Free')); + } + }, +}); From 26e79061f5aeb687455e99f817870027af91f1a1 Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 7 Mar 2022 12:47:15 +0100 Subject: [PATCH 19/19] [ADD] pos_loyalty: manage loyalty in PoS This module was moved from enterprise to community and now includes pos_coupon and pos_gift_card aswell. TaskId-2675382 --- .../models/res_config_settings.py | 2 - .../views/res_config_settings_views.xml | 22 - addons/pos_loyalty/__init__.py | 4 + addons/pos_loyalty/__manifest__.py | 47 + .../data/default_barcode_patterns.xml | 12 + addons/pos_loyalty/data/gift_card_data.xml | 48 + addons/pos_loyalty/data/pos_loyalty_demo.xml | 83 ++ addons/pos_loyalty/models/__init__.py | 12 + addons/pos_loyalty/models/barcode_rule.py | 10 + addons/pos_loyalty/models/loyalty_card.py | 30 + addons/pos_loyalty/models/loyalty_mail.py | 11 + addons/pos_loyalty/models/loyalty_program.py | 36 + addons/pos_loyalty/models/loyalty_rule.py | 39 + addons/pos_loyalty/models/pos_config.py | 147 ++ addons/pos_loyalty/models/pos_order.py | 126 ++ addons/pos_loyalty/models/pos_order_line.py | 30 + addons/pos_loyalty/models/pos_session.py | 96 ++ .../pos_loyalty/security/ir.model.access.csv | 12 + addons/pos_loyalty/static/img/simple_pen.png | Bin 0 -> 23497 bytes .../pos_loyalty/static/src/css/Loyalty.scss | 131 ++ .../src/js/ControlButtons/GiftCardButton.js | 28 + .../src/js/ControlButtons/PromoCodeButton.js | 34 + .../js/ControlButtons/ResetProgramsButton.js | 28 + .../src/js/ControlButtons/RewardButton.js | 91 ++ addons/pos_loyalty/static/src/js/Loyalty.js | 1311 +++++++++++++++++ .../pos_loyalty/static/src/js/OrderSummary.js | 17 + .../pos_loyalty/static/src/js/OrderWidget.js | 42 + addons/pos_loyalty/static/src/js/Orderline.js | 13 + .../static/src/js/PaymentScreen.js | 171 +++ .../static/src/js/Popups/GiftCardPopup.js | 142 ++ .../static/src/js/ProductScreen.js | 82 ++ .../static/src/js/tours/PosLoyaltyTour.js | 158 ++ .../src/js/tours/PosLoyaltyTourMethods.js | 143 ++ .../src/js/tours/PosLoyaltyValidityTour.js | 36 + .../src/xml/ControlButtons/GiftCardButton.xml | 12 + .../xml/ControlButtons/PromoCodeButton.xml | 12 + .../ControlButtons/ResetProgramsButton.xml | 12 + .../src/xml/ControlButtons/RewardButton.xml | 12 + .../static/src/xml/OrderReceipt.xml | 62 + .../static/src/xml/OrderSummary.xml | 31 + .../static/src/xml/OrderWidget.xml | 34 + .../static/src/xml/Popups/GiftCardPopup.xml | 106 ++ addons/pos_loyalty/tests/__init__.py | 4 + addons/pos_loyalty/tests/test_frontend.py | 210 +++ .../pos_loyalty/views/loyalty_card_views.xml | 13 + .../pos_loyalty/views/loyalty_mail_views.xml | 13 + addons/pos_loyalty/views/pos_config_views.xml | 68 + .../views/pos_loyalty_menu_views.xml | 11 + 48 files changed, 3770 insertions(+), 24 deletions(-) create mode 100644 addons/pos_loyalty/__init__.py create mode 100644 addons/pos_loyalty/__manifest__.py create mode 100644 addons/pos_loyalty/data/default_barcode_patterns.xml create mode 100644 addons/pos_loyalty/data/gift_card_data.xml create mode 100644 addons/pos_loyalty/data/pos_loyalty_demo.xml create mode 100644 addons/pos_loyalty/models/__init__.py create mode 100644 addons/pos_loyalty/models/barcode_rule.py create mode 100644 addons/pos_loyalty/models/loyalty_card.py create mode 100644 addons/pos_loyalty/models/loyalty_mail.py create mode 100644 addons/pos_loyalty/models/loyalty_program.py create mode 100644 addons/pos_loyalty/models/loyalty_rule.py create mode 100644 addons/pos_loyalty/models/pos_config.py create mode 100644 addons/pos_loyalty/models/pos_order.py create mode 100644 addons/pos_loyalty/models/pos_order_line.py create mode 100644 addons/pos_loyalty/models/pos_session.py create mode 100644 addons/pos_loyalty/security/ir.model.access.csv create mode 100644 addons/pos_loyalty/static/img/simple_pen.png create mode 100644 addons/pos_loyalty/static/src/css/Loyalty.scss create mode 100644 addons/pos_loyalty/static/src/js/ControlButtons/GiftCardButton.js create mode 100644 addons/pos_loyalty/static/src/js/ControlButtons/PromoCodeButton.js create mode 100644 addons/pos_loyalty/static/src/js/ControlButtons/ResetProgramsButton.js create mode 100644 addons/pos_loyalty/static/src/js/ControlButtons/RewardButton.js create mode 100644 addons/pos_loyalty/static/src/js/Loyalty.js create mode 100644 addons/pos_loyalty/static/src/js/OrderSummary.js create mode 100644 addons/pos_loyalty/static/src/js/OrderWidget.js create mode 100644 addons/pos_loyalty/static/src/js/Orderline.js create mode 100644 addons/pos_loyalty/static/src/js/PaymentScreen.js create mode 100644 addons/pos_loyalty/static/src/js/Popups/GiftCardPopup.js create mode 100644 addons/pos_loyalty/static/src/js/ProductScreen.js create mode 100644 addons/pos_loyalty/static/src/js/tours/PosLoyaltyTour.js create mode 100644 addons/pos_loyalty/static/src/js/tours/PosLoyaltyTourMethods.js create mode 100644 addons/pos_loyalty/static/src/js/tours/PosLoyaltyValidityTour.js create mode 100644 addons/pos_loyalty/static/src/xml/ControlButtons/GiftCardButton.xml create mode 100644 addons/pos_loyalty/static/src/xml/ControlButtons/PromoCodeButton.xml create mode 100644 addons/pos_loyalty/static/src/xml/ControlButtons/ResetProgramsButton.xml create mode 100644 addons/pos_loyalty/static/src/xml/ControlButtons/RewardButton.xml create mode 100644 addons/pos_loyalty/static/src/xml/OrderReceipt.xml create mode 100644 addons/pos_loyalty/static/src/xml/OrderSummary.xml create mode 100644 addons/pos_loyalty/static/src/xml/OrderWidget.xml create mode 100644 addons/pos_loyalty/static/src/xml/Popups/GiftCardPopup.xml create mode 100644 addons/pos_loyalty/tests/__init__.py create mode 100644 addons/pos_loyalty/tests/test_frontend.py create mode 100644 addons/pos_loyalty/views/loyalty_card_views.xml create mode 100644 addons/pos_loyalty/views/loyalty_mail_views.xml create mode 100644 addons/pos_loyalty/views/pos_config_views.xml create mode 100644 addons/pos_loyalty/views/pos_loyalty_menu_views.xml diff --git a/addons/point_of_sale/models/res_config_settings.py b/addons/point_of_sale/models/res_config_settings.py index 038f5fef792..7b41fc7c2d5 100644 --- a/addons/point_of_sale/models/res_config_settings.py +++ b/addons/point_of_sale/models/res_config_settings.py @@ -11,9 +11,7 @@ class ResConfigSettings(models.TransientModel): module_pos_adyen = fields.Boolean(string="Adyen Payment Terminal", help="The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.") module_pos_six = fields.Boolean(string="Six Payment Terminal", help="The transactions are processed by Six. Set the IP address of the terminal on the related payment method.") update_stock_quantities = fields.Selection(related="company_id.point_of_sale_update_stock_quantities", readonly=False) - module_pos_coupon = fields.Boolean("Coupon and Promotion Programs", help="Allow the use of coupon and promotion programs in PoS.") account_default_pos_receivable_account_id = fields.Many2one(string='Default Account Receivable (PoS)', related='company_id.account_default_pos_receivable_account_id', readonly=False) - module_pos_gift_card = fields.Boolean("Gift Cards", help="Allow the use of gift card") def set_values(self): super(ResConfigSettings, self).set_values() diff --git a/addons/point_of_sale/views/res_config_settings_views.xml b/addons/point_of_sale/views/res_config_settings_views.xml index 21257f2aa5e..6e269caa1ef 100644 --- a/addons/point_of_sale/views/res_config_settings_views.xml +++ b/addons/point_of_sale/views/res_config_settings_views.xml @@ -66,28 +66,6 @@ -
-
- -
-
-
-
-
-
- -
-
-
-

Payments

diff --git a/addons/pos_loyalty/__init__.py b/addons/pos_loyalty/__init__.py new file mode 100644 index 00000000000..dc5e6b693d1 --- /dev/null +++ b/addons/pos_loyalty/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/addons/pos_loyalty/__manifest__.py b/addons/pos_loyalty/__manifest__.py new file mode 100644 index 00000000000..7074f2e7072 --- /dev/null +++ b/addons/pos_loyalty/__manifest__.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': "Point of Sale - Coupons & Loyalty", + 'version': '2.0', + 'category': 'Sales/Point Of Sale', + 'sequence': 6, + 'summary': 'Use Coupons, Gift Cards and Loyalty programs in Point of Sale', + 'description': '', + 'depends': ['loyalty', 'point_of_sale'], + 'data': [ + 'security/ir.model.access.csv', + 'data/default_barcode_patterns.xml', + 'views/loyalty_card_views.xml', + 'views/loyalty_mail_views.xml', + 'views/pos_config_views.xml', + 'views/pos_loyalty_menu_views.xml', + ], + 'demo': [ + 'data/pos_loyalty_demo.xml', + ], + 'installable': True, + 'assets': { + 'point_of_sale.assets': [ + 'pos_loyalty/static/src/css/Loyalty.scss', + 'pos_loyalty/static/src/js/Loyalty.js', + 'pos_loyalty/static/src/js/Orderline.js', + 'pos_loyalty/static/src/js/OrderSummary.js', + 'pos_loyalty/static/src/js/OrderWidget.js', + 'pos_loyalty/static/src/js/PaymentScreen.js', + 'pos_loyalty/static/src/js/ProductScreen.js', + 'pos_loyalty/static/src/js/ControlButtons/GiftCardButton.js', + 'pos_loyalty/static/src/js/ControlButtons/ResetProgramsButton.js', + 'pos_loyalty/static/src/js/ControlButtons/PromoCodeButton.js', + 'pos_loyalty/static/src/js/ControlButtons/RewardButton.js', + 'pos_loyalty/static/src/js/Popups/GiftCardPopup.js', + ], + 'web.assets_tests': [ + 'pos_loyalty/static/src/js/tours/**/*', + ], + 'web.assets_qweb': [ + 'pos_loyalty/static/src/xml/**/*', + ], + }, + 'license': 'LGPL-3', +} diff --git a/addons/pos_loyalty/data/default_barcode_patterns.xml b/addons/pos_loyalty/data/default_barcode_patterns.xml new file mode 100644 index 00000000000..68a73c883d3 --- /dev/null +++ b/addons/pos_loyalty/data/default_barcode_patterns.xml @@ -0,0 +1,12 @@ + + + + Coupon & Gift Card Barcodes + + 50 + coupon + any + + 043|044 + + diff --git a/addons/pos_loyalty/data/gift_card_data.xml b/addons/pos_loyalty/data/gift_card_data.xml new file mode 100644 index 00000000000..dd676c142b0 --- /dev/null +++ b/addons/pos_loyalty/data/gift_card_data.xml @@ -0,0 +1,48 @@ + + + + + Gift Card + loyalty.card + qweb-pdf + sale_loyalty.gift_card_template + report + + + + + diff --git a/addons/pos_loyalty/data/pos_loyalty_demo.xml b/addons/pos_loyalty/data/pos_loyalty_demo.xml new file mode 100644 index 00000000000..d9f49ab83c8 --- /dev/null +++ b/addons/pos_loyalty/data/pos_loyalty_demo.xml @@ -0,0 +1,83 @@ + + + + + + 15% on next order + promotion + auto + future + + + + 100 + + + + + percent + 15 + order + + + + + True + + + + + + + + + + + + + + + + + + + + True + 1.20 + Simple Pen + 0.01 + CONS_0002 + + + + + + + + Loyalty Program + loyalty + auto + both + + + + money + 10 + + + + + product + 5 + + + + + + diff --git a/addons/pos_loyalty/models/__init__.py b/addons/pos_loyalty/models/__init__.py new file mode 100644 index 00000000000..7ca3abc1682 --- /dev/null +++ b/addons/pos_loyalty/models/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import barcode_rule +from . import loyalty_card +from . import loyalty_mail +from . import loyalty_program +from . import loyalty_rule +from . import pos_config +from . import pos_order_line +from . import pos_order +from . import pos_session diff --git a/addons/pos_loyalty/models/barcode_rule.py b/addons/pos_loyalty/models/barcode_rule.py new file mode 100644 index 00000000000..a33a132fb62 --- /dev/null +++ b/addons/pos_loyalty/models/barcode_rule.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models, fields + + +class BarcodeRule(models.Model): + _inherit = 'barcode.rule' + + type = fields.Selection(selection_add=[('coupon', 'Coupon')], ondelete={'coupon': 'set default'}) diff --git a/addons/pos_loyalty/models/loyalty_card.py b/addons/pos_loyalty/models/loyalty_card.py new file mode 100644 index 00000000000..b4e40048e0d --- /dev/null +++ b/addons/pos_loyalty/models/loyalty_card.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class LoyaltyCard(models.Model): + _inherit = 'loyalty.card' + + source_pos_order_id = fields.Many2one('pos.order', "PoS Order Reference", + help="PoS order where this coupon was generated.") + + def _get_default_template(self): + self.ensure_one() + if self.source_pos_order_id: + return self.env.ref('pos_loyalty.mail_coupon_template', False) + return super()._get_default_template() + + def _get_mail_partner(self): + return super()._get_mail_partner() or self.source_pos_order_id.partner_id + + def _get_signature(self): + return self.source_pos_order_id.user_id.signature or super()._get_signature() + + def _compute_use_count(self): + super()._compute_use_count() + read_group_res = self.env['pos.order.line']._read_group( + [('coupon_id', 'in', self.ids)], ['id'], ['coupon_id']) + count_per_coupon = {r['coupon_id'][0]: r['coupon_id_count'] for r in read_group_res} + for card in self: + card.use_count += count_per_coupon.get(card.id, 0) diff --git a/addons/pos_loyalty/models/loyalty_mail.py b/addons/pos_loyalty/models/loyalty_mail.py new file mode 100644 index 00000000000..4277cccc2c0 --- /dev/null +++ b/addons/pos_loyalty/models/loyalty_mail.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class LoyaltyMail(models.Model): + _inherit = 'loyalty.mail' + + pos_report_print_id = fields.Many2one('ir.actions.report', string="Print Report", domain=[('model', '=', 'loyalty.card')], + help="The report action to be executed when creating a coupon/gift card/loyalty card in the PoS.", + ) diff --git a/addons/pos_loyalty/models/loyalty_program.py b/addons/pos_loyalty/models/loyalty_program.py new file mode 100644 index 00000000000..65c19a20819 --- /dev/null +++ b/addons/pos_loyalty/models/loyalty_program.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, fields, models +from odoo.tools import unique + +class LoyaltyProgram(models.Model): + _inherit = 'loyalty.program' + + pos_config_ids = fields.Many2many('pos.config', string="Point of Sales", readonly=True) + pos_order_count = fields.Integer("PoS Order Count", compute='_compute_pos_order_count') + + def _compute_pos_order_count(self): + read_group_res = self.env['pos.order.line']._read_group( + [('reward_id', 'in', self.reward_ids.ids)], ['reward_id:array_agg'], ['order_id']) + for program in self: + program_reward_ids = program.reward_ids.ids + program.pos_order_count = sum(1 if any(id in group['reward_id'] for id in program_reward_ids) else 0 for group in read_group_res) + + def _compute_total_order_count(self): + super()._compute_total_order_count() + for program in self: + program.total_order_count += program.pos_order_count + + def action_view_pos_orders(self): + self.ensure_one() + pos_order_ids = list(unique(r['order_id'] for r in\ + self.env['pos.order.line'].search_read([('reward_id', 'in', self.reward_ids.ids)], fields=['order_id']))) + return { + 'name': _("PoS Orders"), + 'view_mode': 'tree,form', + 'res_model': 'pos.order', + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', pos_order_ids)], + 'context': dict(self._context, create=False), + } diff --git a/addons/pos_loyalty/models/loyalty_rule.py b/addons/pos_loyalty/models/loyalty_rule.py new file mode 100644 index 00000000000..5bbf45d02bd --- /dev/null +++ b/addons/pos_loyalty/models/loyalty_rule.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models +from odoo.osv import expression + +class LoyaltyRule(models.Model): + _inherit = 'loyalty.rule' + + valid_product_ids = fields.Many2many( + 'product.product', "Valid Products", compute='_compute_valid_product_ids', + help="These are the products that are valid for this rule.") + any_product = fields.Boolean( + compute='_compute_valid_product_ids', help="Technical field, whether all product match") + + promo_barcode = fields.Char("Barcode", compute='_compute_promo_barcode', store=True, readonly=False, + help="A technical field used as an alternative to the promo code. " + "This is automatically generated when the promo code is changed." + ) + + @api.depends('product_ids', 'product_category_id', 'product_tag_id') #TODO later: product tags + def _compute_valid_product_ids(self): + for rule in self: + if rule.product_ids or\ + rule.product_category_id or\ + rule.product_tag_id or\ + rule.product_domain not in ('[]', "[['sale_ok', '=', True]]"): + domain = rule._get_valid_product_domain() + domain = expression.AND([[('available_in_pos', '=', True)], domain]) + rule.valid_product_ids = self.env['product.product'].search(domain) + rule.any_product = False + else: + rule.any_product = True + rule.valid_product_ids = self.env['product.product'] + + @api.depends('code') + def _compute_promo_barcode(self): + for rule in self: + rule.promo_barcode = self.env['loyalty.card']._generate_code() diff --git a/addons/pos_loyalty/models/pos_config.py b/addons/pos_loyalty/models/pos_config.py new file mode 100644 index 00000000000..5ace5c8a6b2 --- /dev/null +++ b/addons/pos_loyalty/models/pos_config.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + +class PosConfig(models.Model): + _inherit = 'pos.config' + + def _default_loyalty_program(self): + return self.env['loyalty.program'].search([('program_type', '=', 'loyalty')], limit=1) + + use_coupon_programs = fields.Boolean('Coupons & Promotions', + help="Use coupon and promotion programs in this PoS configuration.") + coupon_program_ids = fields.Many2many( + 'loyalty.program', string="Coupon Programs", domain=[('program_type', '=', 'coupons')], + relation='pos_config_coupon_program_rel') + promo_program_ids = fields.Many2many( + 'loyalty.program', string="Promotion Programs", domain=[('program_type', '=', 'promotion')], + relation='pos_config_promo_program_rel') + + loyalty_program_id = fields.Many2one('loyalty.program', "PoS Loyalty Programs", domain=[('program_type', '=', 'loyalty')], default=_default_loyalty_program) + + use_gift_card = fields.Boolean('Gift Cards') + gift_card_program_id = fields.Many2one('loyalty.program', "PoS Gift Card Program", domain=[('program_type', '=', 'gift_card')]) + gift_card_settings = fields.Selection( + [ + ("create_set", "Generate a new barcode and set a price"), + ("scan_set", "Scan an existing barcode and set a price"), + ("scan_use", "Scan an existing barcode with an existing price"), + ], + string="Gift Cards settings", + default="create_set", + help="Defines the way you want to set your gift cards.", + ) + + # While we select all program types separately they will all behave the same + all_program_ids = fields.Many2many('loyalty.program', compute='_compute_all_programs') + + @api.depends('use_coupon_programs', 'coupon_program_ids', 'promo_program_ids', + 'loyalty_program_id', 'use_gift_card', 'gift_card_program_id') + def _compute_all_programs(self): + for config in self: + programs = self.env['loyalty.program'] + if config.use_coupon_programs: + programs |= config.coupon_program_ids + programs |= config.promo_program_ids + # This may be a separate field on the config but it actually will be handled just like any other program + if config.loyalty_program_id: + programs |= config.loyalty_program_id + # We also include the gift card program to be able to claim the reward (discount) + # This one will behave a little differently as it will display more options + if config.use_gift_card: + programs |= config.gift_card_program_id + config.all_program_ids = programs + + @api.model + def set_loyalty_program_to_main_config(self): + main_config = self.env.ref('point_of_sale.pos_config_main') + default_loyalty_program = self._default_loyalty_program() + main_config.write({'module_pos_loyalty': bool(default_loyalty_program), 'loyalty_program_id': default_loyalty_program.id}) + + def open_session_cb(self): + self.ensure_one() + # Check validity of programs before opening a new session + invalid_reward_products_msg = '' + for reward in self.all_program_ids.reward_ids: + if reward.reward_type == 'product': + for product in reward.reward_product_ids: + if product.available_in_pos: + continue + invalid_reward_products_msg += "\n\t" + invalid_reward_products_msg += _( + "Program: %(name)s, Reward Product: `%(reward_product)s`", + name=reward.program_id.name, + reward_product=product.name, + ) + if self.gift_card_program_id: + for product in self.gift_card_program_id.rule_ids.valid_product_ids: + if product.available_in_pos: + continue + invalid_reward_products_msg += "\n\t" + invalid_reward_products_msg += _( + "Program: %(name)s, Rule Product: `%(rule_product)s`", + name=reward.program_id.name, + rule_product=product.name, + ) + + if invalid_reward_products_msg: + prefix_error_msg = _("To continue, make the following reward products available in Point of Sale.") + raise UserError(f"{prefix_error_msg}\n{invalid_reward_products_msg}") + if self.use_gift_card and self.gift_card_program_id: + # Do not allow gift_card_program_id with more than one rule or reward, and check that they make sense + gc_program = self.gift_card_program_id + if len(gc_program.reward_ids) > 1: + raise UserError(_('Invalid gift card program. More than one reward.')) + elif len(gc_program.rule_ids) > 1: + raise UserError(_('Invalid gift card program. More than one rule.')) + rule = gc_program.rule_ids + if rule.reward_point_amount != 1 or rule.reward_point_mode != 'money': + raise UserError(_('Invalid gift card program rule. Use 1 point per currency spent.')) + reward = gc_program.reward_ids + if reward.reward_type != 'discount' or reward.discount_mode != 'per_point' or reward.discount != 1: + raise UserError(_('Invalid gift card program reward. Use 1 currency per point discount.')) + return super().open_session_cb() + + def use_coupon_code(self, code, creation_date, partner_id): + self.ensure_one() + # Ordering by partner id to use the first assigned to the partner in case multiple coupons have the same code + # it could happen with loyalty programs using a code + # Points desc so that in coupon mode one could use a coupon multiple times + coupon = self.env['loyalty.card'].search( + [('program_id', 'in', self.all_program_ids.ids), ('partner_id', 'in', (False, partner_id)), ('code', '=', code)], + order='partner_id, points desc', limit=1) + if not coupon or not coupon.program_id.active: + return { + 'successful': False, + 'payload': { + 'error_message': _('This coupon is invalid (%s).', code), + }, + } + check_date = fields.Date.from_string(creation_date[:11]) + if (coupon.expiration_date and coupon.expiration_date < check_date) or\ + (coupon.program_id.date_to and coupon.program_id.date_to <= fields.Date.context_today(self)) or\ + (coupon.program_id.limit_usage and coupon.program_id.total_order_count >= coupon.program_id.max_usage): + return { + 'successful': False, + 'payload': { + 'error_message': _('This coupon is expired (%s).', code), + }, + } + if not coupon.program_id.reward_ids or not any(reward.required_points <= coupon.points for reward in coupon.program_id.reward_ids): + return { + 'successful': False, + 'payload': { + 'error_message': _('No reward can be claimed with this coupon.'), + }, + } + return { + 'successful': True, + 'payload': { + 'program_id': coupon.program_id.id, + 'coupon_id': coupon.id, + 'coupon_partner_id': coupon.partner_id.id, + 'points': coupon.points, + }, + } diff --git a/addons/pos_loyalty/models/pos_order.py b/addons/pos_loyalty/models/pos_order.py new file mode 100644 index 00000000000..c6dd256701a --- /dev/null +++ b/addons/pos_loyalty/models/pos_order.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from collections import defaultdict +from odoo import _, models + +class PosOrder(models.Model): + _inherit = 'pos.order' + + def validate_coupon_programs(self, point_changes, new_codes): + """ + This is called upon validating the order in the pos. + + This will check the balance for any pre-existing coupon to make sure that the rewards are in fact all claimable. + This will also check that any set code for coupons do not exist in the database. + """ + point_changes = {int(k): v for k, v in point_changes.items()} + coupon_ids_from_pos = set(point_changes.keys()) + coupons = self.env['loyalty.card'].browse(coupon_ids_from_pos).exists().filtered('program_id.active') + coupon_difference = set(coupons.ids) ^ coupon_ids_from_pos + if coupon_difference: + return { + 'successful': False, + 'payload': { + 'message': _('Some coupons are invalid. The applied coupons have been updated. Please check the order.'), + 'removed_coupons': list(coupon_difference), + } + } + for coupon in coupons: + if (coupon.points + point_changes[coupon.id]) < 0: + return { + 'successful': False, + 'payload': { + 'message': _('There are not enough points for the coupon: %s.', coupon.code), + 'updated_points': {c.id: c.points for c in coupons} + } + } + # Check existing coupons + coupons = self.env['loyalty.card'].search([('code', 'in', new_codes)]) + if coupons: + return { + 'successful': False, + 'payload': { + 'message': _('The following codes already exist in the database, perhaps they were already sold?\n%s', + ', '.join(coupons.mapped('code'))), + } + } + return { + 'successful': True, + 'payload': {}, + } + + def confirm_coupon_programs(self, coupon_data): + """ + This is called after the order is created. + + This will create all necessary coupons and link them to their line orders etc.. + + It will also return the points of all concerned coupons to be updated in the cache. + """ + # Keys are stringified when using rpc + coupon_data = {int(k): v for k, v in coupon_data.items()} + # Map negative id to newly created ids. + coupon_new_id_map = {k: k for k in coupon_data.keys() if k > 0} + + # Create the coupons that were awarded by the order. + coupons_to_create = {k: v for k, v in coupon_data.items() if k < 0} + coupon_create_vals = [{ + 'program_id': p['program_id'], + 'partner_id': p.get('partner_id', False), + 'code': p.get('barcode') or self.env['loyalty.card']._generate_code(), + 'points': 0, + 'source_pos_order_id': self.id, + } for p in coupons_to_create.values()] + # Pos users don't have the create permission + new_coupons = self.env['loyalty.card'].sudo().create(coupon_create_vals) + # Map the newly created coupons + for old_id, new_id in zip(coupons_to_create.keys(), new_coupons): + coupon_new_id_map[new_id.id] = old_id + + all_coupons = self.env['loyalty.card'].browse(coupon_new_id_map.keys()).exists() + lines_per_reward_code = defaultdict(lambda: self.env['pos.order.line']) + for line in self.lines: + if not line.reward_identifier_code: + continue + lines_per_reward_code[line.reward_identifier_code] |= line + for coupon in all_coupons: + if coupon.id in coupon_new_id_map: + # Coupon existed previously, update amount of points. + coupon.points += coupon_data[coupon_new_id_map[coupon.id]]['points'] + for reward_code in coupon_data[coupon_new_id_map[coupon.id]].get('line_codes', []): + lines_per_reward_code[reward_code].coupon_id = coupon + # Reports per program + report_per_program = {} + coupon_per_report = defaultdict(list) + for coupon in new_coupons: + if coupon.program_id not in report_per_program: + report_per_program[coupon.program_id] = coupon.program_id.communication_plan_ids.\ + filtered(lambda c: c.trigger == 'create').pos_report_print_id + for report in report_per_program[coupon.program_id]: + coupon_per_report[report.id].append(coupon.id) + return { + 'coupon_updates': [{ + 'old_id': coupon_new_id_map[coupon.id], + 'id': coupon.id, + 'points': coupon.points, + 'code': coupon.code, + 'program_id': coupon.program_id.id, + 'partner_id': coupon.partner_id.id, + } for coupon in all_coupons if coupon.program_id.is_nominative], + 'program_updates': [{ + 'program_id': program.id, + 'usages': program.total_order_count, + } for program in all_coupons.program_id], + 'new_coupon_info': [{ + 'program_name': coupon.program_id.name, + 'expiration_date': coupon.expiration_date, + 'code': coupon.code, + } for coupon in new_coupons if coupon.program_id.applies_on == 'future'], + 'coupon_report': coupon_per_report, + } + + def _get_fields_for_order_line(self): + fields = super(PosOrder, self)._get_fields_for_order_line() + fields.extend(['is_reward_line', 'reward_id', 'coupon_id', 'reward_identifier_code', 'points_cost']) + return fields diff --git a/addons/pos_loyalty/models/pos_order_line.py b/addons/pos_loyalty/models/pos_order_line.py new file mode 100644 index 00000000000..1895d31e15c --- /dev/null +++ b/addons/pos_loyalty/models/pos_order_line.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + +class PosOrderLine(models.Model): + _inherit = 'pos.order.line' + + is_reward_line = fields.Boolean( + help="Whether this line is part of a reward or not.") + reward_id = fields.Many2one( + 'loyalty.reward', "Reward", ondelete='restrict', + help="The reward associated with this line.") + coupon_id = fields.Many2one( + 'loyalty.card', "Coupon", ondelete='restrict', + help="The coupon used to claim that reward.") + reward_identifier_code = fields.Char(help=""" + Technical field used to link multiple reward lines from the same reward together. + """) + points_cost = fields.Float(help="How many point this reward cost on the coupon.") + + def _order_line_fields(self, line, session_id=None): + res = super()._order_line_fields(line, session_id) + # coupon_id may be negative in case of new coupons, they will be added after validating the order. + if 'coupon_id' in res[2] and res[2]['coupon_id'] < 1: + res[2].pop('coupon_id') + return res + + def _is_not_sellable_line(self): + return super().is_not_sellable_line() or self.reward_id diff --git a/addons/pos_loyalty/models/pos_session.py b/addons/pos_loyalty/models/pos_session.py new file mode 100644 index 00000000000..7744df6617c --- /dev/null +++ b/addons/pos_loyalty/models/pos_session.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models +from odoo.osv.expression import OR + +class PosSession(models.Model): + _inherit = 'pos.session' + + def _pos_ui_models_to_load(self): + result = super()._pos_ui_models_to_load() + if self.config_id.all_program_ids: + result += [ + 'loyalty.program', + 'loyalty.rule', + 'loyalty.reward', + ] + return result + + def _loader_params_loyalty_program(self): + return { + 'search_params': { + 'domain': [('id', 'in', self.config_id.all_program_ids.ids)], + 'fields': ['name', 'trigger', 'applies_on', 'program_type', 'date_to', + 'limit_usage', 'max_usage', 'is_nominative', 'portal_point_name'], + }, + } + + def _loader_params_loyalty_rule(self): + return { + 'search_params': { + 'domain': [('program_id', 'in', self.config_id.all_program_ids.ids)], + 'fields': ['program_id', 'valid_product_ids', 'any_product', 'currency_id', + 'reward_point_amount', 'reward_point_split', 'reward_point_mode', + 'minimum_qty', 'minimum_amount', 'minimum_amount_tax_mode', 'mode', 'code'], + } + } + + def _loader_params_loyalty_reward(self): + return { + 'search_params': { + 'domain': [('program_id', 'in', self.config_id.all_program_ids.ids)], + 'fields': ['description', 'program_id', 'reward_type', 'required_points', 'clear_wallet', 'currency_id', + 'discount', 'discount_mode', 'discount_applicability', 'all_discount_product_ids', 'is_global_discount', + 'discount_max_amount', 'discount_line_product_id', + 'multi_product', 'reward_product_ids', 'reward_product_qty', 'reward_product_uom_id'], + } + } + + def _get_pos_ui_loyalty_program(self, params): + return self.env['loyalty.program'].search_read(**params['search_params']) + + def _get_pos_ui_loyalty_rule(self, params): + return self.env['loyalty.rule'].search_read(**params['search_params']) + + def _get_pos_ui_loyalty_reward(self, params): + return self.env['loyalty.reward'].search_read(**params['search_params']) + + def _get_pos_ui_res_partner(self, params): + result = super()._get_pos_ui_res_partner(params) + # In order to make loyalty programs work offline we load the partner's point into + # a non-existant field 'loyalty_points'. + if self.config_id.loyalty_program_id: + # collect ids in a list, group by id and default points to 0 + partner_ids = [] + res_by_id = {} + for res in result: + partner_ids.append(res['id']) + res_by_id[res['id']] = res + res['loyalty_points'] = 0 + res['loyalty_card_id'] = False + # Direct query to avoid loading loyalty cards in the cache for no reason. + # There is no context where we would need to flush. + query = self.env['loyalty.card']._search( + [('program_id', '=', self.config_id.loyalty_program_id.id), ('partner_id', 'in', partner_ids)] + ) + query_str, params = query.select('id', 'partner_id', 'points') + self.env.cr.execute(query_str, params) + for res in self.env.cr.dictfetchall(): + # The result of where_calc also includes partner_id is null. + if not res.get('partner_id'): + continue + res_by_id[res['partner_id']]['loyalty_points'] = res['points'] + res_by_id[res['partner_id']]['loyalty_card_id'] = res['id'] + return result + + def _loader_params_product_product(self): + result = super(PosSession, self)._loader_params_product_product() + config = self.config_id + if config.all_program_ids: + programs = config.all_program_ids + rewards = programs.reward_ids + products = (programs.rule_ids.valid_product_ids | rewards.discount_line_product_id) |\ + (rewards.all_discount_product_ids | rewards.reward_product_ids) + result['search_params']['domain'] = OR([result['search_params']['domain'], [('id', 'in', products.ids)]]) + return result diff --git a/addons/pos_loyalty/security/ir.model.access.csv b/addons/pos_loyalty/security/ir.model.access.csv new file mode 100644 index 00000000000..97e0ddb58ec --- /dev/null +++ b/addons/pos_loyalty/security/ir.model.access.csv @@ -0,0 +1,12 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_program_pos_user,Loyalty Program (PoS User),loyalty.model_loyalty_program,point_of_sale.group_pos_user,1,0,0,0 +access_program_pos_manager,Loyalty Program (PoS Manager),loyalty.model_loyalty_program,point_of_sale.group_pos_manager,1,1,1,1 +access_applicability_pos_user,Loyalty Rule (PoS User),loyalty.model_loyalty_rule,point_of_sale.group_pos_user,1,0,0,0 +access_applicability_pos_manager,Loyalty Rule (PoS Manager),loyalty.model_loyalty_rule,point_of_sale.group_pos_manager,1,1,1,1 +access_coupon_pos_user,Loyalty (PoS User),loyalty.model_loyalty_card,point_of_sale.group_pos_user,1,1,0,0 +access_coupon_pos_manager,Loyalty (PoS Manager),loyalty.model_loyalty_card,point_of_sale.group_pos_manager,1,1,1,0 +access_reward_pos_user,Loyalty Reward (PoS User),loyalty.model_loyalty_reward,point_of_sale.group_pos_user,1,0,0,0 +access_reward_pos_manager,Loyalty Reward (PoS Manager),loyalty.model_loyalty_reward,point_of_sale.group_pos_manager,1,1,1,1 +access_communication_pos_user,Loyalty Communication (PoS User),loyalty.model_loyalty_mail,point_of_sale.group_pos_user,1,0,0,0 +access_communication_pos_manager,Loyalty Communication (PoS Manager),loyalty.model_loyalty_mail,point_of_sale.group_pos_manager,1,1,1,1 +access_sale_coupon_generate,Coupon Generation,loyalty.model_loyalty_generate_wizard,point_of_sale.group_pos_user,1,1,1,0 diff --git a/addons/pos_loyalty/static/img/simple_pen.png b/addons/pos_loyalty/static/img/simple_pen.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca4cd6626e36e734f972bb35b17792017855a2a GIT binary patch literal 23497 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 0; + } + + /** + * Applies the reward on the current order, if multiple products can be claimed opens a popup asking for which one. + * + * @param {Object} reward + * @param {Integer} coupon_id + */ + async _applyReward(reward, coupon_id) { + const args = {}; + if (reward.reward_type === 'product' && reward.multi_product) { + const productsList = reward.reward_product_ids.map((product_id) => ({ + id: product_id, + label: this.env.pos.db.get_product_by_id(product_id).display_name, + item: product_id, + })); + const { confirmed, payload: selectedProduct } = await this.showPopup('SelectionPopup', { + title: this.env._t('Please select a product for this reward'), + list: productsList, + }); + if (!confirmed) { + return false; + } + args['product'] = selectedProduct; + } + const result = this.env.pos.get_order()._applyReward(reward, coupon_id, args); + if (result !== true) { + // Returned an error + Gui.showNotification(result); + } + this.env.pos.get_order()._updateRewards(); + return result; + } + + async onClick() { + const order = this.env.pos.get_order(); + const rewards = order.getClaimableRewards(); + if (rewards.length === 0) { + await this.showPopup('ErrorPopup', { + title: this.env._t('No rewards available.'), + body: this.env._t('There are no rewards claimable for this customer.') + }); + return false; + } else if (rewards.length === 1) { + return this._applyReward(rewards[0].reward, rewards[0].coupon_id); + } else { + const rewardsList = rewards.map((reward) => ({ + id: reward.reward.id, + label: reward.reward.description, + item: reward, + })); + const { confirmed, payload: selectedReward } = await this.showPopup('SelectionPopup', { + title: this.env._t('Please select a reward'), + list: rewardsList, + }); + if (confirmed) { + return this._applyReward(selectedReward.reward, selectedReward.coupon_id); + } + } + return false; + } +} + +RewardButton.template = 'RewardButton'; + +ProductScreen.addControlButton({ + component: RewardButton, + condition: function() { + return this.env.pos.config.use_coupon_programs || this.env.pos.config.loyalty_program_id || this.env.pos.config.use_gift_card; + } +}); + +Registries.Component.add(RewardButton); diff --git a/addons/pos_loyalty/static/src/js/Loyalty.js b/addons/pos_loyalty/static/src/js/Loyalty.js new file mode 100644 index 00000000000..a29f5787e80 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/Loyalty.js @@ -0,0 +1,1311 @@ +/** @odoo-module **/ + +import { Order, Orderline, PosGlobalState} from 'point_of_sale.models'; +import Registries from 'point_of_sale.Registries'; +import session from 'web.session'; +import concurrency from 'web.concurrency'; +import { Gui } from 'point_of_sale.Gui'; +import { round_precision } from 'web.utils'; +import core from 'web.core'; + +const _t = core._t; +const dropPrevious = new concurrency.MutexedDropPrevious(); // Used for queuing reward updates +const mutex = new concurrency.Mutex(); // Used for sequential cache updates + +const COUPON_CACHE_MAX_SIZE = 4096 // Maximum coupon cache size, prevents long run memory issues and (to some extent) invalid data + +function _newRandomRewardCode() { + return (Math.random() + 1).toString(36).substring(3); +} + +let nextId = -1; +export class PosLoyaltyCard { + /** + * @param {string} code coupon code + * @param {number} id id of loyalty.card, negative if it is cache local only + * @param {number} program_id id of loyalty.program + * @param {number} partner_id id of res.partner + * @param {number} balance points on the coupon, not counting the order's changes + */ + constructor(code, id, program_id, partner_id, balance) { + this.code = code; + this.id = id || nextId--; + this.program_id = program_id; + this.partner_id = partner_id; + this.balance = balance; + } +} + +const PosLoyaltyGlobalState = (PosGlobalState) => class PosLoyaltyGlobalState extends PosGlobalState { + async _processData(loadedData) { + await super._processData(loadedData); + this.programs = loadedData['loyalty.program'] || []; //TODO: rename to `loyaltyPrograms` etc + this.rules = loadedData['loyalty.rule'] || []; + this.rewards = loadedData['loyalty.reward'] || []; + this.couponCache = {}; + this._loadLoyaltyData(); + } + _loadLoyaltyData() { + this.program_by_id = {}; + this.reward_by_id = {}; + + for (const program of this.programs) { + this.program_by_id[program.id] = program; + if (program.date_to) { + program.date_to = new Date(program.date_to); + } + program.rules = []; + program.rewards = []; + } + for (const rule of this.rules) { + rule.valid_product_ids = new Set(rule.valid_product_ids); + rule.program_id = this.program_by_id[rule.program_id[0]]; + rule.program_id.rules.push(rule); + } + for (const reward of this.rewards) { + this.reward_by_id[reward.id] = reward + reward.program_id = this.program_by_id[reward.program_id[0]];; + reward.discount_line_product_id = this.db.get_product_by_id(reward.discount_line_product_id[0]); + reward.all_discount_product_ids = new Set(reward.all_discount_product_ids); + reward.program_id.rewards.push(reward); + } + } + async load_server_data() { + await super.load_server_data(...arguments); + if (this.selectedOrder) { + this.selectedOrder._updateRewards(); + } + } + set_order(order) { + const result = super.set_order(...arguments); + // FIXME - JCB: This is a temporary fix. + // When an order is selected, it doesn't always contain the reward lines. + // And the list of active programs are not always correct. This is because + // of the use of DropPrevious in _updateRewards. + if (order) { + order._updateRewards(); + } + return result; + } + /** + * Fetches `loyalty.card` records from the server and adds/updates them in our cache. + * + * @param {domain} domain For the search + * @param {int} limit Default to 1 + */ + async fetchCoupons(domain, limit=1) { + const result = await this.env.services.rpc({ + model: 'loyalty.card', + method: 'search_read', + kwargs: { + domain: domain, + fields: ['id', 'points', 'code', 'partner_id', 'program_id'], + limit: limit, + context: session.user_context, + } + }); + if (Object.keys(this.couponCache).length + result.length > COUPON_CACHE_MAX_SIZE) { + this.couponCache = {}; + // Make sure that the current order has no invalid data. + if (this.selectedOrder) { + this.selectedOrder.invalidCoupons = true; + } + } + const couponList = []; + for (const dbCoupon of result) { + const coupon = new PosLoyaltyCard(dbCoupon.code, dbCoupon.id, dbCoupon.program_id[0], dbCoupon.partner_id[0], dbCoupon.points); + this.couponCache[coupon.id] = coupon; + couponList.push(coupon); + } + return couponList; + } + /** + * Fetches a loyalty card for the given program and partner, put in cache afterwards + * if a matching card is found in the cache, that one is used instead. + * If no card is found a local only card will be created until the order is validated. + * + * @param {int} programId + * @param {int} partnerId + */ + async fetchLoyaltyCard(programId, partnerId) { + if (programId === this.config.loyalty_program_id[0]) { + // In this case we actually have it loaded separately to avoid needing to be online + // for the loyalty program functionalities + // see `_get_pos_ui_res_partner` in pos_session.py + const partner = this.db.get_partner_by_id(partnerId); + return new PosLoyaltyCard(null, partner.loyalty_card_id, programId, partnerId, partner.loyalty_points); + } + for (const coupon of Object.values(this.couponCache)) { + if (coupon.partner_id === partnerId && coupon.program_id === programId) { + return coupon; + } + } + const dbCoupon = await this.fetchCoupons([['partner_id', '=', partnerId], ['program_id', '=', programId]])[0]; + return dbCoupon || new PosLoyaltyCard(null, null, programId, partnerId, 0); + } +} +Registries.Model.extend(PosGlobalState, PosLoyaltyGlobalState); + +const PosLoyaltyOrderline = (Orderline) => class PosLoyaltyOrderline extends Orderline { + export_as_JSON() { + const result = super.export_as_JSON(...arguments); + result.is_reward_line = this.is_reward_line; + result.reward_id = this.reward_id; + result.reward_product_id = this.reward_product_id; + result.coupon_id = this.coupon_id; + result.reward_identifier_code = this.reward_identifier_code; + result.points_cost = this.points_cost; + result.giftBarcode = this.giftBarcode; + return result; + } + init_from_JSON(json) { + if (json.is_reward_line) { + this.is_reward_line = json.is_reward_line; + this.reward_id = json.reward_id; + this.reward_product_id = json.reward_product_id; + // Since non existing coupon have a negative id, of which the counter is lost upon reloading + // we make sure that they are kept the same between after a reload between the order and the lines. + this.coupon_id = this.order.oldCouponMapping[json.coupon_id] || json.coupon_id; + this.reward_identifier_code = json.reward_identifier_code; + this.points_cost = json.points_cost; + this.giftBarcode = json.giftBarcode; + } + super.init_from_JSON(...arguments); + } + set_quantity(quantity, keep_price) { + if (quantity === 'remove' && this.is_reward_line) { + // Remove any line that is part of that same reward aswell. + const linesToRemove = [] + this.order.get_orderlines().forEach((line) => { + if (line != this && + line.reward_id === this.reward_id && + line.coupon_id === this.coupon_id && + line.reward_identifier_code === this.reward_identifier_code) { + linesToRemove.push(line); + } + }); + for (const line of linesToRemove) { + this.order.orderlines.remove(line); + } + } + return super.set_quantity(...arguments); + } +} +Registries.Model.extend(Orderline, PosLoyaltyOrderline); + +const PosLoyaltyOrder = (Order) => class PosLoyaltyOrder extends Order { + constructor() { + super(...arguments); + this._initializePrograms({}); + } + export_as_JSON() { + const json = super.export_as_JSON(...arguments); + json.disabledRewards = this.disabledRewards; + json.codeActivatedProgramRules = this.codeActivatedProgramRules; + json.codeActivatedCoupons = this.codeActivatedCoupons; + json.couponPointChanges = this.couponPointChanges; + return json; + } + init_from_JSON(json) { + this.couponPointChanges = json.couponPointChanges; + // Remapping of coupon_id for both couponPointChanges and Orderline.coupon_id + this.oldCouponMapping = {}; + if (this.couponPointChanges) { + for (const pe of Object.values(this.couponPointChanges)) { + if (pe.coupon_id > 0) { + continue; + } + const newId = nextId--; + delete this.oldCouponMapping[pe.coupon_id]; + pe.coupon_id = newId; + this.couponPointChanges[newId] = pe; + } + } + super.init_from_JSON(...arguments); + delete this.oldCouponMapping; + this.disabledRewards = json.disabledRewards; + this.codeActivatedProgramRules = json.codeActivatedProgramRules; + this.codeActivatedCoupons = json.codeActivatedCoupons; + this.invalidCoupons = true; + } + /** + * We need to update the rewards upon changing the partner as it may impact the points available + * for rewards. + * + * @override + */ + set_partner(partner) { + const oldPartner = this.get_partner(); + super.set_partner(...arguments); + if (oldPartner !== this.get_partner()) { + this._updateRewards(); + } + } + wait_for_push_order() { + return (!_.isEmpty(this.couponPointChanges) || this._get_reward_lines().length || super.wait_for_push_order(...arguments)); + } + /** + * Add additional information for our ticket, such as new coupons and loyalty point gains. + * + * @override + */ + export_for_printing() { + const result = super.export_for_printing(...arguments); + if (this.pos.config.loyalty_program_id && this.get_partner()) { + const loyaltyProgram = this.pos.program_by_id[this.pos.config.loyalty_program_id[0]]; + result.loyalty = { + name: loyaltyProgram.name, + point_name: loyaltyProgram.portal_point_name, + partner_name: this.get_partner().name, + newPoints: this.getLoyaltyPoints(), + }; + } + result.new_coupon_info = this.new_coupon_info; + return result; + } + /** + * Apply changes to loyalty program points directly to support offline loyalty. + * + * @override + */ + finalize() { + const partner = this.get_partner(); + const loyaltyProgramId = this.pos.config.loyalty_program_id ? this.pos.config.loyalty_program_id[0]: 0; + if (partner && loyaltyProgramId) { + for (const pe of Object.values(this.couponPointChanges)) { + if (pe.program_id === loyaltyProgramId) { + partner.loyalty_points += pe.points; + break; + } + } + for (const line of this.get_orderlines()) { + if (line.reward_id) { + const reward = this.pos.reward_by_id[line.reward_id]; + if (reward.program_id.id !== loyaltyProgramId) { + continue; + } + partner.loyalty_points -= line.points_cost; + } + } + } + super.finalize(...arguments); + } + + get_orderlines() { + const orderlines = super.get_orderlines(this, arguments); + const rewardLines = []; + const nonRewardLines = []; + for (const line of orderlines) { + if (line.is_reward_line) { + rewardLines.push(line); + } else { + nonRewardLines.push(line); + } + } + return [...nonRewardLines, ...rewardLines]; + } + _get_reward_lines() { + const orderLines = super.get_orderlines(...arguments); + if (orderLines) { + return orderLines.filter((line) => line.is_reward_line); + } + return orderLines; + } + _get_regular_order_lines() { + const orderLines = super.get_orderlines(...arguments); + if (orderLines) { + return orderLines.filter((line) => !line.is_reward_line && !line.refunded_orderline_id); + } + return orderLines; + } + get_last_orderline() { + const orderLines = super.get_orderlines(...arguments).filter((line) => !line.is_reward_line); + return orderLines[orderLines.length - 1]; + } + set_orderline_options(line, options) { + super.set_orderline_options(...arguments); + if (options && options.is_reward_line) { + line.is_reward_line = options.is_reward_line; + line.reward_id = options.reward_id; + line.reward_product_id = options.reward_product_id; + line.coupon_id = options.coupon_id; + line.reward_identifier_code = options.reward_identifier_code; + line.points_cost = options.points_cost; + line.price_manually_set = true; + } + line.giftBarcode = options.giftBarcode; + } + add_product(product, options) { + super.add_product(...arguments); + this._updateRewards(); + } + + async _initializePrograms() { + // When deleting a reward line, a popup will be displayed if the reward was automatic, + // if confirmed the reward is added to this list and will not be claimed automatically again. + if (!this.disabledRewards) { + this.disabledRewards = []; + } + // List of programs that require a code that are activated. + if (!this.codeActivatedProgramRules) { + this.codeActivatedProgramRules = []; + } + // List of coupons activated manually + if (!this.codeActivatedCoupons) { + this.codeActivatedCoupons = []; + } + // This field will hold the added points for each coupon. + // Points lost are directly linked to the order lines. + if (!this.couponPointChanges) { + this.couponPointChanges = {}; + } + } + _resetPrograms() { + this.disabledRewards = []; + this.codeActivatedProgramRules = []; + this.codeActivatedCoupons = []; + this.couponPointChanges = {}; + this.orderlines.remove(this._get_reward_lines()); + this._updateRewards(); + } + _updateRewards() { + // Calls are not expected to take some time besides on the first load + when loyalty programs are made applicable + if (this.pos.programs.length === 0) { + return; + } + dropPrevious.exec(() => {return this._updateLoyaltyPrograms().then(async () => { + // Try auto claiming rewards + const claimableRewards = this.getClaimableRewards(false, false, true); + let changed = false; + for (const {coupon_id, reward} of claimableRewards) { + if (reward.program_id.rewards.length === 1 && !reward.program_id.is_nominative && + (reward.reward_type !== 'product' || !reward.multi_product)) { + this._applyReward(reward, coupon_id); + changed = true; + } + } + // Rewards may impact the number of points gained + if (changed) { + await this._updateLoyaltyPrograms(); + } + this._updateRewardLines(); + })}).catch(() => {/* catch the reject of dp when calling `add` to avoid unhandledrejection */}); + } + async _updateLoyaltyPrograms() { + await this._checkMissingCoupons(); + await this._updatePrograms(); + } + /** + * Checks that all 'existing' coupons are in our cache, and if not load/update them. + */ + async _checkMissingCoupons() { + // This function must stay sequential to avoid potential concurrency errors. + await mutex.exec(async () => { + if (!this.invalidCoupons) { + return; + } + this.invalidCoupons = false; + const allCoupons = []; + for (const pe of Object.values(this.couponPointChanges)) { + if (pe.coupon_id > 0) { + allCoupons.push(pe.coupon_id); + } + } + allCoupons.push(...this.codeActivatedCoupons.map((coupon) => coupon.id)); + const couponsToFetch = allCoupons.filter((elem) => !this.pos.couponCache[elem]); + if (couponsToFetch.length) { + await this.pos.fetchCoupons([['id', 'in', couponsToFetch]], couponsToFetch.length); + // Remove coupons that could not be loaded from the db + this.codeActivatedCoupons = this.codeActivatedCoupons.filter((coupon) => this.pos.couponCache[coupon.id]); + this.couponPointChanges = Object.fromEntries(Object.entries(this.couponPointChanges).filter((k, pe) => this.pos.couponCache[pe.coupon_id])); + } + }); + } + /** + * Refreshes the currently applied rewards, if they are not applicable anymore they are removed. + */ + _updateRewardLines() { + if (!this.orderlines.length) { + return; + } + const rewardLines = this._get_reward_lines(); + if (!rewardLines.length) { + return; + } + const claimedRewards = []; + const paymentRewards = []; // Gift card and ewallet rewards are considered payments and must stay at the end + for (const line of rewardLines) { + const claimedReward = { + reward: this.pos.reward_by_id[line.reward_id], + coupon_id: line.coupon_id, + args: { + product: line.reward_product_id, + } + } + if (claimedReward.reward.program_id.program_type === 'gift_card' || claimedReward.reward.program_id.program_type === 'ewallet') { + paymentRewards.push(claimedReward); + } else if (claimedReward.reward.reward_type === 'product') { + claimedRewards.unshift(claimedReward); + } else { + claimedRewards.push(claimedReward); + } + this.orderlines.remove(line); + } + claimedRewards.push(...paymentRewards); + for (const claimedReward of claimedRewards) { + // For existing coupons check that they are still claimed, they can exist in either `couponPointChanges` or `codeActivatedCoupons` + if (!this.codeActivatedCoupons.find((coupon) => coupon.id === claimedReward.coupon_id) && + !this.couponPointChanges[claimedReward.coupon_id]) { + continue; + } + this._applyReward(claimedReward.reward, claimedReward.coupon_id, claimedReward.args); + } + } + /** + * Update our couponPointChanges, meaning the points/coupons each program give etc. + */ + async _updatePrograms() { + const changesPerProgram = {}; + const programsToCheck = new Set(); + // By default include all programs that are considered 'applicable' + for (const program of this.pos.programs) { + if (this._programIsApplicable(program)) { + programsToCheck.add(program.id); + } + } + for (const pe of Object.values(this.couponPointChanges)) { + if (!changesPerProgram[pe.program_id]) { + changesPerProgram[pe.program_id] = []; + programsToCheck.add(pe.program_id); + } + changesPerProgram[pe.program_id].push(pe); + } + for (const coupon of this.codeActivatedCoupons) { + programsToCheck.add(coupon.program_id); + } + const programs = [...programsToCheck].map((programId) => this.pos.program_by_id[programId]); + const pointsAddedPerProgram = this.pointsForPrograms(programs); + for (const program of this.pos.programs) { + // Future programs may split their points per unit paid (gift cards for example), consider a non applicable program to give no points + const pointsAdded = this._programIsApplicable(program) ? pointsAddedPerProgram[program.id] : []; + // For programs that apply to both (loyalty) we always add a change of 0 points, if there is none, since it makes it easier to + // track for claimable rewards, and makes sure to load the partner's loyalty card. + if (program.is_nominative && !pointsAdded.length && this.get_partner()) { + pointsAdded.push({points: 0}); + } + const oldChanges = changesPerProgram[program.id] || []; + // Update point changes for those that exist + for (let idx = 0; idx < Math.min(pointsAdded.length, oldChanges.length); idx++) { + Object.assign(oldChanges[idx], pointsAdded[idx]); + } + if (pointsAdded.length < oldChanges.length) { + const removedIds = oldChanges.map((pe) => pe.coupon_id); + this.couponPointChanges = Object.fromEntries(Object.entries(this.couponPointChanges).filter(([k, pe]) => { + return !removedIds.includes(pe.coupon_id); + })); + } else if (pointsAdded.length > oldChanges.length) { + for (const pa of pointsAdded.splice(oldChanges.length)) { + const coupon = await this._couponForProgram(program); + this.couponPointChanges[coupon.id] = { + points: pa.points, + program_id: program.id, + coupon_id: coupon.id, + barcode: pa.barcode, + }; + } + } + } + // Also remove coupons from codeActivatedCoupons if their program applies_on current orders and the program does not give any points + this.codeActivatedCoupons = this.codeActivatedCoupons.filter((coupon) => { + const program = this.pos.program_by_id[coupon.program_id]; + if (program.applies_on === 'current' && pointsAddedPerProgram[program.id].length === 0) { + return false; + } + return true; + }); + } + /** + * @returns {Object} containing the following keys: `won`, `spent`, `total` and `name` for the points name + */ + getLoyaltyPoints() { + let won = 0; + let spent = 0; + let total = 0; + const partner = this.get_partner(); + if (partner && this.pos.config.loyalty_program_id) { + let couponId = partner.loyalty_card_id; + let balance = partner.loyalty_points; + for (const pe of Object.values(this.couponPointChanges)) { + if (pe.program_id === this.pos.config.loyalty_program_id[0]) { + if (!couponId) { + couponId = pe.coupon_id; + } + won += pe.points; + break; + } + } + if (couponId !== 0) { + for (const line of this._get_reward_lines()) { + if (line.coupon_id === couponId) { + spent += line.points_cost; + } + } + } + total = balance + won - spent; + } + let name = _t('Points'); + if (this.pos.config.loyalty_program_id) { + name = this.pos.program_by_id[this.pos.config.loyalty_program_id[0]].portal_point_name; + } + return { + won: parseFloat(won.toFixed(2)), + spent: parseFloat(spent.toFixed(2)), + total: parseFloat(total.toFixed(2)), + name: name, + } + } + /** + * @returns {number} The points that are left for the given coupon for this order. + */ + _getRealCouponPoints(coupon_id) { + let points = 0; + const dbCoupon = this.pos.couponCache[coupon_id]; + if (dbCoupon) { + points += dbCoupon.balance; + } + Object.values(this.couponPointChanges).some((pe) => { + if (pe.coupon_id === coupon_id) { + if (this.pos.program_by_id[pe.program_id].applies_on !== 'future') { + points += pe.points; + } + // couponPointChanges is not supposed to have a coupon multiple times + return true; + } + return false + }); + for (const line of this.get_orderlines()) { + if (line.is_reward_line && line.coupon_id === coupon_id) { + points -= line.points_cost; + } + } + return points + } + /** + * Depending on the program type returns a new (local) instance of coupon or tries to retrieve the coupon in case of loyalty cards. + * Existing coupons are put in a cache which is also used to fetch the coupons. + * + * @param {object} program + */ + async _couponForProgram(program) { + if (program.is_nominative) { + return this.pos.fetchLoyaltyCard(program.id, this.get_partner().id); + } + // This type of coupons don't need to really exist up until validating the order, so no need to cache + return new PosLoyaltyCard(null, null, program.id, (this.get_partner() || {id: -1}).id, 0); + } + _programIsApplicable(program) { + if (program.trigger === 'auto' && !program.rules.find((rule) => rule.mode === 'auto' || this.codeActivatedProgramRules.includes(rule.id))) { + return false; + } + if (program.trigger === 'with_code' && !program.rules.find((rule) => this.codeActivatedProgramRules.includes(rule.id))) { + return false; + } + if (program.is_nominative && !this.get_partner()) { + return false; + } + if (program.date_to && program.date_to <= new Date()) { + return false; + } + if (program.limit_usage && program.total_order_count >= program.max_usage) { + return false; + } + return true; + } + /** + * Computes how much points each program gives. + * + * @param {Array} programs list of loyalty.program + * @returns {Object} Containing the points gained per program + */ + pointsForPrograms(programs) { + const totalTaxed = this.get_total_with_tax(); + const totalUntaxed = this.get_total_without_tax(); + const totalsPerProgram = Object.fromEntries(programs.map((program) => [program.id, {'untaxed': totalUntaxed, 'taxed': totalTaxed}])); + const orderLines = this.get_orderlines(); + for (const line of orderLines) { + if (!line.reward_id) { + continue; + } + const reward = this.pos.reward_by_id[line.reward_id]; + if (reward.reward_type !== 'discount') { + continue; + } + const rewardProgram = reward.program_id; + for (const program of programs) { + // Remove automatic discount and this program's discounts from the totals. + if (program.id === rewardProgram.id || rewardProgram.trigger === 'auto') { + totalsPerProgram[program.id]['taxed'] -= line.get_price_with_tax(); + totalsPerProgram[program.id]['untaxed'] -= line.get_price_without_tax(); + } + } + } + const result = {} + for (const program of programs) { + let points = 0; + const splitPoints = []; + for (const rule of program.rules) { + if (rule.mode === 'with_code' && !this.codeActivatedProgramRules.includes(rule.id)) { + continue; + } + const amountCheck = rule.minimum_amount_tax_mode === 'incl' && totalsPerProgram[program.id]['taxed'] || totalsPerProgram[program.id]['untaxed']; + if (rule.minimum_amount > amountCheck) { // NOTE: big doutes par rapport au fait de compter tous les produits + continue; + } + let totalProductQty = 0; + // Only count points for paid lines. + const qtyPerProduct = {}; + let orderedProductPaid = 0; + for (const line of orderLines) { + + if ((!line.reward_product_id && (rule.any_product || rule.valid_product_ids.has(line.get_product().id))) || + (line.reward_product_id && (rule.any_product || rule.valid_product_ids.has(line.reward_product_id)))) { + // We only count reward products from the same program to avoid unwanted feedback loops + if (line.reward_product_id) { + const reward = this.pos.reward_by_id[line.reward_id]; + if (program.id !== reward.program_id) { + continue; + } + } + const lineQty = (line.reward_product_id ? -line.get_quantity() : line.get_quantity()); + totalProductQty += lineQty; + if (qtyPerProduct[line.reward_product_id || line.get_product().id]) { + qtyPerProduct[line.reward_product_id || line.get_product().id] += lineQty; + } else { + qtyPerProduct[line.reward_product_id || line.get_product().id] = lineQty; + } + orderedProductPaid += line.get_price_with_tax(); + } + } + if (totalProductQty < rule.minimum_qty) { + continue; + } + if (program.applies_on === 'future' && rule.reward_point_split && rule.reward_point_mode !== 'order') { + // In this case we count the points per rule + if (rule.reward_point_mode === 'unit') { + splitPoints.push(...Array.apply(null, Array(totalProductQty)).map((_) => {return {points: rule.reward_point_amount}})); + } else if (rule.reward_point_mode === 'money') { + for (const line of orderLines) { + if (line.is_reward_line || !(rule.valid_product_ids.has(line.get_product().id)) || line.get_quantity() <= 0) { + continue; + } + const pointsPerUnit = round_precision(rule.reward_point_amount * line.get_price_with_tax() / line.get_quantity(), 0.01); + if (pointsPerUnit > 0) { + splitPoints.push(...Array.apply(null, Array(line.get_quantity())).map(() => { + if (line.giftBarcode && line.get_quantity() == 1) { + return {points: pointsPerUnit, barcode: line.giftBarcode}; + } + return {points: pointsPerUnit} + })); + } + } + } + } else { + // In this case we add on to the global point count + if (rule.reward_point_mode === 'order') { + points += rule.reward_point_amount; + } else if (rule.reward_point_mode === 'money') { + // NOTE: unlike in sale_loyalty this performs a round half-up instead of round down + points += round_precision(rule.reward_point_amount * orderedProductPaid, 0.01); + } else if (rule.reward_point_mode === 'unit') { + points += rule.reward_point_amount * totalProductQty; + } + } + } + const res = points ? [{points}] : []; + if (splitPoints.length) { + res.push(...splitPoints); + } + result[program.id] = res; + } + return result; + } + /** + * @returns {Array} List of lines composing the global discount + */ + _getGlobalDiscountLines() { + return this.get_orderlines().filter((line) => line.reward_id && this.pos.reward_by_id[line.reward_id].is_global_discount); + } + /** + * @param {Integer} coupon_id (optional) Coupon id + * @param {Integer} program_id (optional) Program id + * @returns {Array} List of {Object} containing the coupon_id and reward keys + */ + getClaimableRewards(coupon_id=false, program_id=false, auto=false) { + const allCouponPrograms = Object.values(this.couponPointChanges).map((pe) => { + return { + program_id: pe.program_id, + coupon_id: pe.coupon_id, + }; + }).concat(this.codeActivatedCoupons.map((coupon) => { + return { + program_id: coupon.program_id, + coupon_id: coupon.id, + }; + })); + const result = []; + const totalIsZero = this.get_total_with_tax() === 0; + const globalDiscountLines = this._getGlobalDiscountLines(); + const globalDiscountPercent = globalDiscountLines.length ? + this.pos.reward_by_id[globalDiscountLines[0].reward_id].discount : 0; + for (const couponProgram of allCouponPrograms) { + if ((coupon_id && couponProgram.coupon_id !== coupon_id) || + (program_id && couponProgram.program_id !== program_id)) { + continue; + } + const program = this.pos.program_by_id[couponProgram.program_id]; + const points = this._getRealCouponPoints(couponProgram.coupon_id); + for (const reward of program.rewards) { + if (points < reward.required_points) { + continue; + } + if (auto && this.disabledRewards.includes(reward.id)) { + continue; + } + // Try to filter out rewards that will not be claimable anyway. + if (reward.is_global_discount && reward.discount <= globalDiscountPercent) { + continue; + } + if (reward.reward_type === 'discount' && totalIsZero) { + continue; + } + if (reward.reward_type === 'product' && !reward.multi_product) { + const product = this.pos.db.get_product_by_id(reward.reward_product_ids[0]); + const availableQty = this._computeAvailableFreeProduct(reward, couponProgram.coupon_id, product); + if (availableQty <= 0) { + continue; + } + } + result.push({ + coupon_id: couponProgram.coupon_id, + reward: reward, + }); + } + } + return result; + } + /** + * Applies a reward to the order, `_updateRewards` is expected to be called right after. + * + * @param {loyalty.reward} reward + * @param {Integer} coupon_id + * @param {Object} args Reward options + * @returns True if everything went right or an error message + */ + _applyReward(reward, coupon_id, args) { + if (this._getRealCouponPoints(coupon_id) < reward.required_points) { + return _t("There are not enough points on the coupon to claim this reward."); + } + if (reward.is_global_discount) { + const globalDiscountLines = this._getGlobalDiscountLines(); + if (globalDiscountLines.length) { + const rewardId = globalDiscountLines[0].reward_id; + if (rewardId != reward.id && this.pos.reward_by_id[rewardId].discount >= reward.discount) { + return _t("A better global discount is already applied."); + } else if (rewardId != rewardId.id) { + for (const line of globalDiscountLines) { + this.orderlines.remove(line); + } + } + } + } + args = args || {}; + const rewardLines = this._getRewardLineValues({ + reward: reward, + coupon_id: coupon_id, + product: args['product'] || null, + }); + if (!Array.isArray(rewardLines)) { + return rewardLines; // Returned an error. + } + if (!rewardLines.length) { + return _t("The reward could not be applied."); + } + for (const rewardLine of rewardLines) { + this.orderlines.add(this._createLineFromVals(rewardLine)); + } + return true; + } + _createLineFromVals(vals) { + vals['lst_price'] = vals['price']; + const line = Orderline.create({}, {pos: this.pos, order: this, product: vals['product']}); + this.fix_tax_included_price(line); + this.set_orderline_options(line, vals); + return line; + } + /** + * @param {loyalty.reward} reward + * @returns the discountable and discountable per tax for this discount on order reward. + */ + _getDiscountableOnOrder(reward) { + let discountable = 0; + const discountablePerTax = {}; + for (const line of this.get_orderlines()) { + if (!line.get_quantity()) { + continue; + } + const taxKey = line.get_taxes().map((t) => t.id); + discountable += line.get_price_with_tax(); + if (!discountablePerTax[taxKey]) { + discountablePerTax[taxKey] = 0; + } + discountablePerTax[taxKey] += line.price * line.get_quantity(); + } + return {discountable, discountablePerTax}; + } + /** + * @returns the order's cheapest line + */ + _getCheapestLine() { + let cheapestLine; + for (const line of this.get_orderlines()) { + if (line.reward_id || !line.get_quantity()) { + continue; + } + if (!cheapestLine || cheapestLine.price > line.price) { + cheapestLine = line; + } + } + return cheapestLine; + } + /** + * @param {loyalty.reward} reward + * @returns the discountable and discountable per tax for this discount on cheapest reward. + */ + _getDiscountableOnCheapest(reward) { + const cheapestLine = this._getCheapestLine(); + if (!cheapestLine) { + return {discountable: 0, discountablePerTax: {}}; + } + const taxKey = cheapestLine.get_taxes().map((t) => t.id); + return {discountable: cheapestLine.price, discountablePerTax: Object.fromEntries([[taxKey, cheapestLine.price]])}; + } + /** + * @param {loyalty.reward} reward + * @returns all lines to which the reward applies. + */ + _getSpecificDiscountableLines(reward) { + const discountableLines = []; + const applicableProducts = reward.all_discount_product_ids; + for (const line of this.get_orderlines()) { + if (!line.get_quantity()) { + continue; + } + if (applicableProducts.has(line.get_product().id) || + applicableProducts.has(line.reward_product_id)) { + discountableLines.push(line); + } + } + return discountableLines; + } + /** + * For a 'specific' type of discount it is more complicated as we have to make sure that we never + * discount more than what is available on a per line basis. + * @param {loyalty.reward} reward + * @returns the discountable and discountable per tax for this discount on specific reward. + */ + _getDiscountableOnSpecific(reward) { + const applicableProducts = reward.all_discount_product_ids; + const linesToDiscount = []; + const discountLinesPerReward = {}; + const orderLines = this.get_orderlines(); + const remainingAmountPerLine = {}; + for (const line of orderLines) { + if (!line.get_quantity() || !line.price) { + continue; + } + remainingAmountPerLine[line.cid] = line.get_price_with_tax(); + if (applicableProducts.has(line.get_product().id) || + (line.reward_product_id && applicableProducts.has(line.reward_product_id))) { + linesToDiscount.push(line); + } else if (line.reward_id) { + const lineReward = this.pos.reward_by_id[line.reward_id]; + if (lineReward.id === reward.id) { + continue; + } + if (!discountLinesPerReward[line.reward_identifier_code]) { + discountLinesPerReward[line.reward_identifier_code] = []; + } + discountLinesPerReward[line.reward_identifier_code].push(line); + } + } + + let cheapestLine = false; + for (const lines of Object.values(discountLinesPerReward)) { + const lineReward = this.pos.reward_by_id[lines[0].reward_id]; + let discountedLines = orderLines; + if (lineReward.discount_applicability === 'cheapest') { + cheapestLine = cheapestLine || this._getCheapestLine(); + discountedLines = [cheapestLine]; + } else if (lineReward.discount_applicability === 'specific') { + discountedLines = this._getSpecificDiscountableLines(lineReward); + } + if (!discountedLines.length) { + continue; + } + const commonLines = linesToDiscount.filter((line) => discountedLines.includes(line)); + if (lineReward.discount_mode === 'percent') { + const discount = lineReward.discount / 100; + for (const line of discountedLines) { + if (line.reward_id) { + continue; + } + if (lineReward.discount_applicability === 'cheapest') { + remainingAmountPerLine[line.cid] *= (1 - (discount / line.get_quantity())) + } else { + remainingAmountPerLine[line.cid] *= (1 - discount); + } + } + } else { + const nonCommonLines = discountedLines.filter((line) => !linesToDiscount.includes(line)); + let discountedAmount = Math.abs(lines.reduce((sum, line) => sum + line.get_price_with_tax(), 0)); + const process = (line) => { + if (!discountedAmount || line.reward_id) { + return; + } + const remaining = remainingAmountPerLine[line.cid]; + const consumed = Math.min(remaining, discountedAmount); + discountedAmount -= consumed; + remainingAmountPerLine[line.cid] -= consumed; + } + nonCommonLines.forEach(process); + commonLines.forEach(process); + } + } + + let discountable = 0; + const discountablePerTax = {}; + for (const line of linesToDiscount) { + discountable += remainingAmountPerLine[line.cid]; + const taxKey = line.get_taxes().map((t) => t.id); + if (!discountablePerTax[taxKey]) { + discountablePerTax[taxKey] = 0; + } + discountablePerTax[taxKey] += (line.price * line.get_quantity()) * (remainingAmountPerLine[line.cid] / line.get_price_with_tax()); + } + return {discountable, discountablePerTax}; + } + /** + * @param {Object} args See `_applyReward` + * @returns {Array} List of values to create the reward lines + */ + _getRewardLineValues(args) { + const reward = args['reward']; + if (reward.reward_type === 'discount') { + return this._getRewardLineValuesDiscount(args); + } else if (reward.reward_type === 'product') { + return this._getRewardLineValuesProduct(args); + } + // NOTE: we may reach this step if for some reason there is a free shipping reward + return []; + } + /** + * @param {Object} args See `_applyReward` + * @returns {Array} List of values to create the discount lines + */ + _getRewardLineValuesDiscount(args) { + const reward = args['reward']; + const coupon_id = args['coupon_id']; + const rewardAppliesTo = reward.discount_applicability; + let getDiscountable; + if (rewardAppliesTo === 'order') { + getDiscountable = this._getDiscountableOnOrder.bind(this); + } else if (rewardAppliesTo === 'cheapest') { + getDiscountable = this._getDiscountableOnCheapest.bind(this); + } else if (rewardAppliesTo === 'specific') { + getDiscountable = this._getDiscountableOnSpecific.bind(this); + } + if (!getDiscountable) { + return _t("Unknown discount type"); + } + let {discountable, discountablePerTax} = getDiscountable(reward); + discountable = Math.min(this.get_total_with_tax(), discountable); + if (!discountable) { + return []; + } + let maxDiscount = reward.discount_max_amount || Infinity; + if (reward.discount_mode === 'per_point') { + maxDiscount = Math.min(maxDiscount, reward.discount * this._getRealCouponPoints(coupon_id)); + } else if (reward.discount_mode === 'per_order') { + maxDiscount = Math.min(maxDiscount, reward.discount); + } else if (reward.discount_mode === 'percent') { + maxDiscount = Math.min(maxDiscount, discountable * (reward.discount / 100)); + } + const rewardCode = _newRandomRewardCode(); + let pointCost = reward.clear_wallet ? this._getRealCouponPoints(coupon_id) : reward.required_points; + if (reward.discount_mode === 'per_point' && !reward.clear_wallet) { + pointCost = Math.min(maxDiscount, discountable) / reward.discount; + } + // These are considered payments and do not require to be either taxed or split by tax + if (['ewallet', 'gift_card'].includes(reward.program_id.program_type)) { + return [{ + product: discountProduct, + price: -Math.min(maxDiscount, discountable), + quantity: 1, + reward_id: reward.id, + is_reward_line: true, + coupon_id: coupon_id, + points_cost: pointCost, + reward_identifier_code: rewardCode, + merge: false, + }]; + } + const discountFactor = discountable ? Math.min(1, (maxDiscount / discountable)) : 1; + const discountProduct = reward.discount_line_product_id; + const result = Object.entries(discountablePerTax).reduce((lst, entry) => { + const taxIds = entry[0] === '' ? [] : entry[0].split(',').map((str) => parseInt(str)); + lst.push({ + product: discountProduct, + price: -(entry[1] * discountFactor), + quantity: 1, + reward_id: reward.id, + is_reward_line: true, + coupon_id: coupon_id, + points_cost: 0, + reward_identifier_code: rewardCode, + tax_ids: taxIds, + merge: false, + }); + return lst; + }, []); + if (result.length) { + result[0]['points_cost'] = pointCost; + } + return result; + } + /** + * Tries to compute how many free product can be given out for the given product. + * Contrary to sale_loyalty, the product must be in the order lines in order to give it out + * (resulting in discount lines for the product's value). + * As such we need to approximate the effect of removing 1 quantity on the counting of points in order + * to avoid feedback loops between giving a product and it removing the required points for it. + * + * @param {loyalty.reward} reward + * @param {Integer} coupon_id + * @param {Product} product + * @returns {Integer} Available quantity to be given as reward for the given product + */ + _computeAvailableFreeProduct(reward, coupon_id, product) { + // Might not be perfect but good enough + let productPriceWithTax = null; + const orderlines = this.get_orderlines(); + const program = reward.program_id; + let freeClaimed = 0; + let available = 0; + for (const line of orderlines) { + if (line.get_product().id === product.id) { + if (productPriceWithTax === null) { + productPriceWithTax = line.get_price_with_tax() / line.get_quantity(); + } + available += line.get_quantity(); + } else if (line.reward_product_id === product.id) { + freeClaimed += line.get_quantity(); + } + } + // This only applies to programs that apply on current and both orders and only if points are being counted for that coupon. + const pointChangeEntry = this.couponPointChanges[coupon_id]; + if (available && (pointChangeEntry && program.applies_on === 'current' || program.applies_on === 'both')) { + /** + * We have to count the points again in this case because we have to know how much points will be lost + * after we apply the free product, take for example a 2+1 free program, you could have 1 points per unit paid + * with the reward being the free product that takes 1 point. At the time of counting the points + * if you have 2 units in your list you would technically be eligible for the reward since you have enough points. + * However because claiming the unit would result in a loss of 2 points, you would lose our eligibility. + * This seams like a small problem but we have to take note that we may also get points from other products and as such they + * a free product might not impact the points at all. + * Example program: + * 2 rules: + * 1: 1 point per unit paid on product A. + * 2 10 points per unit paid on product B. + * 1 reward: + * 1: for 2 point, 1 free product A. + * This means that if we have a product B we are eligible for 5 free product A. + * But also that we need at least 6 product A before rule 1 starts counting points again. + * Since reward lines at this point may or may not be present we have to remove the points we compute in this function. + */ + let points = this._getRealCouponPoints(coupon_id); + let totalTaxed = this.get_total_with_tax(); + let totalUntaxed = this.get_total_without_tax(); + orderlines.forEach((line) => { + if (!line.reward_id) { + return; + } + const lineReward = this.pos.reward_by_id[line.reward_id]; + if (lineReward.reward_type !== 'discount') { + return; + } + const rewardProgram = lineReward.program_id; + if (rewardProgram.id === program.id || rewardProgram.trigger === 'auto') { + totalTaxed -= line.get_price_with_tax(); + totalUntaxed -= line.get_price_without_tax(); + } + }); + // Compute how much one unit costs in terms of points + const ruleData = []; + for (const rule of program.rules) { + if (!rule.any_product && !rule.valid_product_ids.has(product.id)) { + continue; + } + const amountToCheck = (rule.minimum_amount_tax_mode === 'incl' ? totalTaxed : totalUntaxed); + if (rule.minimum_amount > amountToCheck) { + continue; + } + let totalProductQty = 0; + let orderedProductPaid = 0; + orderlines.forEach((line) => { + if ((!line.reward_product_id && (rule.any_product || rule.valid_product_ids.has(line.get_product().id))) || + (line.reward_product_id && (rule.any_product || rule.valid_product_ids.has(line.reward_product_id)))) { + // We only count reward products from the same program to avoid unwanted feedback loops + if (line.reward_product_id) { + const reward = this.pos.reward_by_id[line.reward_id]; + if (program.id !== reward.program_id.id) { + return; + } + } + const lineQty = (line.reward_product_id ? -line.get_quantity() : line.get_quantity()); + totalProductQty += lineQty; + orderedProductPaid += line.get_price_with_tax(); + } + }); + const thisRuleChanges = {}; + thisRuleChanges.maxUnits = product.price ? Math.floor((amountToCheck - rule.minimum_amount) / product.price) : Infinity; + thisRuleChanges.maxUnits = Math.min(available - rule.minimum_qty, thisRuleChanges.maxUnits); + if (rule.reward_point_mode === 'unit') { + thisRuleChanges.pointsPerUnit = rule.reward_point_amount; + thisRuleChanges.pointsAdded = rule.reward_point_amount * totalProductQty; + } else if (rule.reward_point_mode === 'money') { + thisRuleChanges.pointsPerUnit = rule.reward_point_amount * productPriceWithTax; + thisRuleChanges.pointsAdded = round_precision(rule.reward_point_amount * orderedProductPaid, 0.01); + } else if (rule.reward_point_mode === 'order') { + thisRuleChanges.pointsPerUnit = 0; + thisRuleChanges.pointsAdded = rule.reward_point_amount; + } + ruleData.push(thisRuleChanges); + } + // We actually have to try out all possible amounts + const maximumQty = Math.min(available, Math.floor(points / reward.required_points) * reward.reward_product_qty); + let totalLostPerUnit = ruleData.reduce((sum, data) => sum + data.pointsPerUnit, 0); + let lostPoints = 0; + let units; + for (units = 1; units <= maximumQty; units++) { + let localLostPoints = lostPoints + totalLostPerUnit; + for (const data of ruleData) { + if (units === (data.maxUnits + 1)) { + localLostPoints -= data.pointsPerUnit * units; + totalLostPerUnit -= data.pointsPerUnit; + localLostPoints += data.pointsAdded; + } + } + const consumedPoints = Math.ceil(units / reward.reward_product_qty) * reward.required_points; + if (points - consumedPoints - localLostPoints < 0) { + units -= 1; + break; + } + lostPoints = localLostPoints; + } + available = Math.max(0, Math.min(units, available) - freeClaimed); + } + return available; + } + /** + * @param {Object} args See `_applyReward` + * @returns {Array} List of values to create the reward lines + */ + _getRewardLineValuesProduct(args) { + const reward = args['reward']; + const product = this.pos.db.get_product_by_id(args['product'] || reward.reward_product_ids[0]); + const availableQty = this._computeAvailableFreeProduct(reward, args['coupon_id'], product); + if (availableQty <= 0) { + return _t("There are not enough products in the basket to claim this reward."); + } + const points = this._getRealCouponPoints(args['coupon_id']); + const claimable_count = reward.clear_wallet ? 1 : Math.min(Math.ceil(availableQty / reward.reward_product_qty), Math.floor(points / reward.required_points)); + const cost = reward.clear_wallet ? points : claimable_count * reward.required_points; + return [{ + product: reward.discount_line_product_id, + price: -product.lst_price, + tax_ids: product.taxes_id, + // In case the reward is the product multiple times, give it as many times as possible + quantity: Math.min(availableQty, reward.reward_product_qty * claimable_count), + reward_id: reward.id, + is_reward_line: true, + reward_product_id: product.id, + coupon_id: args['coupon_id'], + points_cost: cost, + reward_identifier_code: _newRandomRewardCode(), + merge: false, + }] + } + /** + * Full routine for activating a code for the order. + * If only one more reward is claimable after activating the code, that reward is claimed + * directly, to avoid more steps than necessary. + * If more rewards are claimable, the employee will have to manually select the reward + * in the reward selection menu. + * + * @param {String} code + * @returns true if everything went right, error message if not. + */ + async _activateCode(code) { + const rule = this.pos.rules.find((rule) => { + return rule.mode === 'with_code' && (rule.promo_barcode === code || rule.code === code) + }); + let claimableRewards = null; + if (rule) { + if (this.codeActivatedProgramRules.includes(rule.id)) { + return _t('That promo code program has already been activated.'); + } + this.codeActivatedProgramRules.push(rule.id); + await this._updateLoyaltyPrograms(); + claimableRewards = this.getClaimableRewards(false, rule.program_id.id); + } else { + if (this.codeActivatedCoupons.find((coupon) => coupon.code === code)) { + return _t('That coupon code has already been scanned and activated.'); + } + const customer = this.get_partner(); + const { successful, payload } = await this.pos.env.services.rpc({ + model: 'pos.config', + method: 'use_coupon_code', + args: [ + [this.pos.config.id], + code, + this.creation_date, + customer ? customer.id : false, + ], + kwargs: { context: session.user_context }, + }); + if (successful) { + const coupon = new PosLoyaltyCard(code, payload.coupon_id, payload.program_id, payload.partner_id, payload.points); + this.pos.couponCache[coupon.id] = coupon; + this.codeActivatedCoupons.push(coupon); + await this._updateLoyaltyPrograms(); + claimableRewards = this.getClaimableRewards(coupon.id); + } else { + return payload.error_message; + } + } + if (claimableRewards && claimableRewards.length === 1) { + if (claimableRewards[0].reward.reward_type !== 'product' || !claimableRewards[0].reward.multi_product) { + this._applyReward(claimableRewards[0].reward, claimableRewards[0].coupon_id); + this._updateRewards(); + } + } + return true; + } + async activateCode(code) { + const res = await this._activateCode(code); + if (res !== true) { + Gui.showNotification(res); + } + } +} +Registries.Model.extend(Order, PosLoyaltyOrder); diff --git a/addons/pos_loyalty/static/src/js/OrderSummary.js b/addons/pos_loyalty/static/src/js/OrderSummary.js new file mode 100644 index 00000000000..0633890835c --- /dev/null +++ b/addons/pos_loyalty/static/src/js/OrderSummary.js @@ -0,0 +1,17 @@ +/** @odoo-module **/ + +import OrderSummary from 'point_of_sale.OrderSummary'; +import Registries from 'point_of_sale.Registries'; + +export const PosLoyaltyOrderSummary = (OrderSummary) => + class PosLoyaltyOrderSummary extends OrderSummary { + getLoyaltyPoints() { + if (!this.env.pos.config.loyalty_program_id) { + return {}; + } + const order = this.env.pos.get_order(); + return order.getLoyaltyPoints(); + } + }; + +Registries.Component.extend(OrderSummary, PosLoyaltyOrderSummary) diff --git a/addons/pos_loyalty/static/src/js/OrderWidget.js b/addons/pos_loyalty/static/src/js/OrderWidget.js new file mode 100644 index 00000000000..4efccdf3f46 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/OrderWidget.js @@ -0,0 +1,42 @@ +/** @odoo-module **/ + +import OrderWidget from 'point_of_sale.OrderWidget'; +import Registries from 'point_of_sale.Registries'; + +export const PosLoyaltyOrderWidget = (OrderWidget) => + class PosLoyaltyOrderWidget extends OrderWidget { + getActiveProgramsAndRewards() { + const order = this.env.pos.get_order(); + const activePrograms = Object.values(order.couponPointChanges).map((pe) => this.env.pos.program_by_id[pe.program_id]); + const seenRewards = new Set(); + const activeRewards = []; + for (const line of order._get_reward_lines()) { + const key = line.reward_id + '-' + line.coupon_id + '-' + line.reward_identifier_code; + if (seenRewards.has(key)) { + continue; + } + seenRewards.add(key); + const dbCoupon = this.env.pos.couponCache[line.coupon_id]; + const couponCode = dbCoupon ? dbCoupon.code : false; + activeRewards.push({ + id: line.cid, + name: line.get_product().display_name, + code: couponCode, + }); + } + const activeCoupons = order.codeActivatedCoupons.map((coupon) => { + const program = this.env.pos.program_by_id[coupon.program_id]; + return { + programName: program.name, + code: coupon.code, + }; + }); + return { + activePrograms, + activeCoupons, + activeRewards, + } + } + }; + +Registries.Component.extend(OrderWidget, PosLoyaltyOrderWidget); diff --git a/addons/pos_loyalty/static/src/js/Orderline.js b/addons/pos_loyalty/static/src/js/Orderline.js new file mode 100644 index 00000000000..425ec9fe8e4 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/Orderline.js @@ -0,0 +1,13 @@ +/** @odoo-module **/ + +import Orderline from 'point_of_sale.Orderline'; +import Registries from 'point_of_sale.Registries'; + +export const PosLoyaltyOrderline = (Orderline) => + class extends Orderline{ + get addedClasses() { + return Object.assign({'program-reward': this.props.line.is_reward_line}, super.addedClasses); + } + }; + +Registries.Component.extend(Orderline, PosLoyaltyOrderline); diff --git a/addons/pos_loyalty/static/src/js/PaymentScreen.js b/addons/pos_loyalty/static/src/js/PaymentScreen.js new file mode 100644 index 00000000000..002a4b5cab8 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/PaymentScreen.js @@ -0,0 +1,171 @@ +/** @odoo-module **/ + +import PaymentScreen from 'point_of_sale.PaymentScreen'; +import Registries from 'point_of_sale.Registries'; +import session from 'web.session'; +import { PosLoyaltyCard } from '@pos_loyalty/js/Loyalty'; + +export const PosLoyaltyPaymentScreen = (PaymentScreen) => + class extends PaymentScreen { + /** + * @override + */ + async validateOrder(isForceValidate) { + const pointChanges = {}; + const newCodes = []; + for (const pe of Object.values(this.currentOrder.couponPointChanges)) { + if (pe.coupon_id > 0) { + pointChanges[pe.coupon_id] = pe.points; + } else if (pe.barcode) { + // New coupon with a specific code, validate that it does not exist + newCodes.push(pe.barcode); + } + } + for (const line of this.currentOrder._get_reward_lines()) { + if (line.coupon_id < 1) { + continue; + } + if (!pointChanges[line.coupon_id]) { + pointChanges[line.coupon_id] = -line.points_cost; + } else { + pointChanges[line.coupon_id] -= line.points_cost; + } + } + // No need to do an rpc if no existing coupon is being used. + if (await this._isOrderValid(isForceValidate) && (!_.isEmpty(pointChanges) || newCodes.length)) { + try { + const {successful, payload} = await this.rpc({ + model: 'pos.order', + method: 'validate_coupon_programs', + args: [[], pointChanges, newCodes], + kwargs: { context: session.user_context }, + }); + // Payload may contain the points of the concerned coupons to be updated in case of error. (So that rewards can be corrected) + if (payload && payload.updated_points) { + for (const pointChange of Object.entries(payload.updated_points)) { + if (this.env.pos.couponCache[pointChange[0]]) { + this.env.pos.couponCache[pointChange[0]].balance = pointChange[1]; + } + } + } + if (payload && payload.removed_coupons) { + for (const couponId of payload.removed_coupons) { + if (this.env.pos.couponCache[couponId]) { + delete this.env.pos.couponCache[couponId]; + } + } + this.currentOrder.codeActivatedCoupons = this.currentOrder.codeActivatedCoupons.filter((coupon) => !payload.removed_coupons.includes(coupon.id)); + } + if (!successful) { + this.showPopup('ErrorPopup', { + title: this.env._t('Error validating rewards'), + body: payload.message, + }); + return; + } + } catch (_e) { + // Do nothing with error, while this validation step is nice for error messages + // it should not be blocking. + } + } + await super.validateOrder(...arguments); + } + + /** + * @override + */ + async _postPushOrderResolve(order, server_ids) { + // Compile data for our function + const rewardLines = order._get_reward_lines(); + const loyaltyProgramId = this.env.pos.config.loyalty_program_id ? this.env.pos.config.loyalty_program_id[0] : 0; + const partner = order.get_partner(); + let partnerLoyaltyCardId = partner ? partner.loyalty_card_id : 0; + let couponData = Object.values(order.couponPointChanges).reduce((agg, pe) => { + agg[pe.coupon_id] = Object.assign({}, pe); + const program = this.env.pos.program_by_id[pe.program_id]; + if (program.is_nominative && order.get_partner()) { + agg[pe.coupon_id].partner_id = partner.id; + } + if (program.id === loyaltyProgramId) { + if (!partnerLoyaltyCardId) { + partnerLoyaltyCardId = pe.coupon_id; + } + } + return agg; + }, {}); + for (const line of rewardLines) { + const reward = this.env.pos.reward_by_id[line.reward_id]; + if (!couponData[line.coupon_id]) { + couponData[line.coupon_id] = { + points: 0, + program_id: reward.program_id.id, + coupon_id: line.coupon_id, + barcode: false, + } + } + if (!couponData[line.coupon_id].line_codes) { + couponData[line.coupon_id].line_codes = []; + } + if (!couponData[line.coupon_id].line_codes.includes(line.reward_identifier_code)) { + !couponData[line.coupon_id].line_codes.push(line.reward_identifier_code); + } + couponData[line.coupon_id].points -= line.points_cost; + } + // We actually do not care about coupons for 'current' programs that did not claim any reward, they will be lost if not validated + couponData = Object.fromEntries(Object.entries(couponData).filter(([key, value]) => { + const program = this.env.pos.program_by_id[value.program_id]; + if (program.applies_on === 'current') { + return value.line_codes && value.line_codes.length; + } + return true; + })); + if (!_.isEmpty(couponData)) { + const payload = await this.rpc({ + model: 'pos.order', + method: 'confirm_coupon_programs', + args: [server_ids, couponData], + kwargs: { context: session.user_context }, + }); + if (payload.coupon_updates) { + for (const couponUpdate of payload.coupon_updates) { + let dbCoupon = this.env.pos.couponCache[couponUpdate.old_id]; + if (dbCoupon) { + dbCoupon.id = couponUpdate.id; + dbCoupon.balance = couponUpdate.points; + dbCoupon.code = couponUpdate.code; + } else { + dbCoupon = new PosLoyaltyCard( + couponUpdate.code, couponUpdate.id, couponUpdate.program_id, couponUpdate.partner_id, couponUpdate.points); + } + if (couponUpdate.old_id === partnerLoyaltyCardId) { + partner.loyalty_card_id = couponUpdate.id; + } + delete this.env.pos.couponCache[couponUpdate.old_id]; + this.env.pos.couponCache[couponUpdate.id] = dbCoupon; + } + } + // Update the usage count since it is checked based on local data + if (payload.program_updates) { + for (const programUpdate of payload.program_updates) { + const program = this.env.pos.program_by_id[programUpdate.program_id]; + if (program) { + program.total_order_count = programUpdate.usages; + } + } + } + if (payload.coupon_report) { + for (const report_entry of Object.entries(payload.coupon_report)) { + this.env.legacyActionManager.do_action(report_entry[0], { + additional_context: { + active_ids: report_entry[1], + } + }); + } + } + order.new_coupon_info = payload.new_coupon_info; + } + return super._postPushOrderResolve(order, server_ids); + } + }; + +Registries.Component.extend(PaymentScreen, PosLoyaltyPaymentScreen); diff --git a/addons/pos_loyalty/static/src/js/Popups/GiftCardPopup.js b/addons/pos_loyalty/static/src/js/Popups/GiftCardPopup.js new file mode 100644 index 00000000000..b6cdae2fd36 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/Popups/GiftCardPopup.js @@ -0,0 +1,142 @@ +/** @odoo-module **/ + +import AbstractAwaitablePopup from 'point_of_sale.AbstractAwaitablePopup'; +import Registries from 'point_of_sale.Registries'; +import { useBarcodeReader } from 'point_of_sale.custom_hooks'; +import Core from 'web.core'; + +const _t = Core._t; +const { useState } = owl; + +export class GiftCardPopup extends AbstractAwaitablePopup { + setup() { + super.setup(); + + this.confirmFunctions = { + 'create_set': this.generateBarcode.bind(this), + 'scan_set': this.scanAndUseGiftCard.bind(this), + 'scan_use': this.scanAndUseGiftCard.bind(this), + 'pay': this.payWithGiftCard.bind(this), + 'balance': this.showRemainingAmount.bind(this), + }; + + this.state = useState({ + giftCardConfig: this.env.pos.config.gift_card_settings, + showMenu: true, + error: '', + context: '', + amountToSet: 0, + code: '', + }); + + useBarcodeReader({ + gift_card: this._onScan, + }, true); + } + + clickConfirm() { + this.confirmFunctions[this.state.context](); + } + + get code() { + return this.state.code.trim(); + } + + switchToMenu() { + this.state.showMenu = true; + this.state.context = ''; + this.state.amountToSet = 0; + this.state.code = ''; + this.state.error = ''; + } + + switchToBarcode() { + this.state.context = this.state.giftCardConfig; + this.state.showMenu = false; + } + + switchToPay() { + this.state.showMenu = false; + this.state.context = 'pay'; + } + + switchToBalance() { + this.state.showMenu = false; + this.state.context = 'balance'; + } + + _onScan(code) { + this.state.code = code.base_code; + } + + _getGiftCardProduct() { + const pos = this.env.pos; + const program = pos.program_by_id[pos.config.gift_card_program_id[0]]; + return pos.db.product_by_id[[...program.rules[0].valid_product_ids][0]]; + } + + addGiftCardProduct() { + const pos = this.env.pos; + const order = pos.get_order(); + const product = this._getGiftCardProduct(); + order.add_product(product, { + price: this.state.amountToSet, + quantity: 1, + merge: false, + giftBarcode: this.code || false, + }); + } + + async generateBarcode() { + this.addGiftCardProduct(false); + this.confirm(); + } + + scanAndUseGiftCard() { + if (this.state.giftCardConfig === "scan_use") { + // Use the default price of the first product to match + this.state.amountToSet = this._getGiftCardProduct().price; + } + this.addGiftCardProduct(); + this.confirm(); + } + + async payWithGiftCard() { + if (!this.code) { + this.state.error = _t('No gift card code set'); + return; + } + // This should load and enable the coupon and automatic rewards since the gift_card program is supposed to only have one + // (as long as there are enough points). + const res = await this.env.pos.get_order().activateCode(this.code); + if (res !== true) { + this.state.error = res; + } + this.confirm(); + } + + async showRemainingAmount() { + this.state.amountToSet = 0; + if (!this.code) { + this.state.error = _t('No gift card code set'); + return; + } + const coupon = await this.rpc({ + model: 'loyalty.card', + method: 'search_read', + args: [ + [['code', '=', this.code], ['program_id', '=', this.env.pos.config.gift_card_program_id[0]]], + ['points'], + ], + }); + if (!coupon || !coupon.length) { + this.state.error = _t('No gift card found'); + } else { + this.state.amountToSet = coupon[0].points; + } + } +} + +GiftCardPopup.template = 'GiftCardPopup'; + +Registries.Component.add(GiftCardPopup); diff --git a/addons/pos_loyalty/static/src/js/ProductScreen.js b/addons/pos_loyalty/static/src/js/ProductScreen.js new file mode 100644 index 00000000000..c2e6b1f3bc5 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/ProductScreen.js @@ -0,0 +1,82 @@ +/** @odoo-module **/ + +import ProductScreen from 'point_of_sale.ProductScreen'; +import Registries from 'point_of_sale.Registries'; +import { useBarcodeReader } from 'point_of_sale.custom_hooks'; + +export const PosLoyaltyProductScreen = (ProductScreen) => + class extends ProductScreen { + setup() { + super.setup(); + useBarcodeReader({ + coupon: this._onCouponScan, + }); + } + + _onCouponScan(code) { + this.currentOrder.activateCode(code.base_code); + } + + async _updateSelectedOrderline(event) { + const selectedLine = this.currentOrder.get_selected_orderline(); + if (selectedLine && selectedLine.is_reward_line && !selectedLine.manual_reward && + (event.detail.key === 'Backspace' || event.detail.key === 'Delete')) { + const reward = this.env.pos.reward_by_id[selectedLine.reward_id]; + const { confirmed } = await this.showPopup('ConfirmPopup', { + title: this.env._t('Deactivating reward'), + body: _.str.sprintf( + this.env._t('Are you sure you want to remove %s from this order?\n You will still be able to claim it through the reward button.'), + reward.description + ), + cancelText: this.env._t('No'), + confirmText: this.env._t('Yes'), + }); + if (confirmed) { + event.detail.buffer = null; + } else { + // Cancel backspace + return; + } + } + return super._updateSelectedOrderline(...arguments); + } + + + /** + * 1/ Perform the usual set value operation (super._setValue) if the line being modified + * is not a reward line or if it is a reward line, the `val` being set is '' or 'remove' only. + * + * 2/ Update activated programs and coupons when removing a reward line. + * + * 3/ Trigger 'update-rewards' if the line being modified is a regular line or + * if removing a reward line. + * + * @override + */ + _setValue(val) { + const selectedLine = this.currentOrder.get_selected_orderline(); + if ( + !selectedLine || + !selectedLine.is_reward_line || + (selectedLine.is_reward_line && ['', 'remove'].includes(val)) + ) { + super._setValue(val); + } + if (!selectedLine) return; + if (selectedLine.is_reward_line && val === 'remove') { + this.currentOrder.disabledRewards.push(selectedLine.reward_id); + const coupon = this.env.pos.couponCache[selectedLine.coupon_id]; + if (coupon && coupon.id > 0 && this.currentOrder.codeActivatedCoupons.find((c) => c.code === coupon.code)) { + delete this.env.pos.couponCache[selectedLine.coupon_id]; + this.currentOrder.codeActivatedCoupons.splice(this.currentOrder.codeActivatedCoupons.findIndex((coupon) => { + return coupon.id === selectedLine.coupon_id; + }), 1); + } + } + if (!selectedLine.is_reward_line || (selectedLine.is_reward_line && val === 'remove')) { + selectedLine.order._updateRewards(); + } + } + }; + +Registries.Component.extend(ProductScreen, PosLoyaltyProductScreen); diff --git a/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTour.js b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTour.js new file mode 100644 index 00000000000..5293c23cd35 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTour.js @@ -0,0 +1,158 @@ +/** @odoo-module **/ + +import { PosLoyalty } from 'pos_loyalty.tour.PosCouponTourMethods'; +import { ProductScreen } from 'point_of_sale.tour.ProductScreenTourMethods'; +import { getSteps, startSteps } from 'point_of_sale.tour.utils'; +import Tour from 'web_tour.tour'; + +// --- PoS Loyalty Tour Basic Part 1 --- +// Generate coupons for PosLoyaltyTour2. +startSteps(); + +ProductScreen.do.confirmOpeningPopup(); +ProductScreen.do.clickHomeCategory(); + +// basic order +// just accept the automatically applied promo program +// applied programs: +// - on cheapest product +ProductScreen.exec.addOrderline('Whiteboard Pen', '5'); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-2.88'); +PosLoyalty.do.selectRewardLine('on the cheapest product'); +PosLoyalty.check.orderTotalIs('13.12'); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +// remove the reward from auto promo program +// no applied programs +ProductScreen.exec.addOrderline('Whiteboard Pen', '6'); +PosLoyalty.check.hasRewardLine('on the cheapest product', '-2.88'); +PosLoyalty.check.orderTotalIs('16.32'); +PosLoyalty.exec.removeRewardLine('90% on the cheapest product'); +PosLoyalty.check.orderTotalIs('19.2'); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +// order with coupon code from coupon program +// applied programs: +// - coupon program +ProductScreen.exec.addOrderline('Desk Organizer', '9'); +PosLoyalty.check.hasRewardLine('on the cheapest product', '-4.59'); +PosLoyalty.exec.removeRewardLine('90% on the cheapest product'); +PosLoyalty.check.orderTotalIs('45.90'); +PosLoyalty.do.enterCode('invalid_code', false); +PosLoyalty.do.enterCode('1234'); +PosLoyalty.check.hasRewardLine('Free Product - Desk Organizer', '-15.30'); +PosLoyalty.exec.finalizeOrder('Cash', '50'); + +// Use coupon but eventually remove the reward +// applied programs: +// - on cheapest product +ProductScreen.exec.addOrderline('Letter Tray', '4'); +ProductScreen.exec.addOrderline('Desk Organizer', '9'); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-4.75'); +PosLoyalty.check.orderTotalIs('62.27'); +PosLoyalty.do.enterCode('5678'); +PosLoyalty.check.hasRewardLine('Free Product - Desk Organizer', '-15.30'); +PosLoyalty.check.orderTotalIs('46.97'); +PosLoyalty.exec.removeRewardLine('Free Product'); +PosLoyalty.check.orderTotalIs('62.27'); +PosLoyalty.exec.finalizeOrder('Cash', '90'); + +// specific product discount +// applied programs: +// - on cheapest product +// - on specific products +ProductScreen.exec.addOrderline('Magnetic Board', '10') // 1.98 +ProductScreen.exec.addOrderline('Desk Organizer', '3') // 5.1 +ProductScreen.exec.addOrderline('Letter Tray', '4') // 4.8 tax 10% +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-1.78') +PosLoyalty.check.orderTotalIs('54.44') +PosLoyalty.do.enterCode('promocode', false) +PosLoyalty.check.hasRewardLine('50% on specific products', '-16.66') // 17.55 - 1.78*0.5 +PosLoyalty.check.orderTotalIs('37.78') +PosLoyalty.exec.finalizeOrder('Cash', '50') + +Tour.register('PosLoyaltyTour1', { test: true, url: '/pos/web' }, getSteps()); + +// --- PoS Loyalty Tour Basic Part 2 --- +// Using the coupons generated from PosLoyaltyTour1. +startSteps(); + +ProductScreen.do.clickHomeCategory(); + +// Test that global discount and cheapest product discounts can be accumulated. +// Applied programs: +// - global discount +// - on cheapest discount +ProductScreen.exec.addOrderline('Desk Organizer', '10'); // 5.1 +PosLoyalty.check.hasRewardLine('on the cheapest product', '-4.59'); +ProductScreen.exec.addOrderline('Letter Tray', '4'); // 4.8 tax 10% +PosLoyalty.check.hasRewardLine('on the cheapest product', '-4.75'); +PosLoyalty.do.enterCode('123456'); +PosLoyalty.check.hasRewardLine('10% on your order', '-5.10'); +PosLoyalty.check.hasRewardLine('10% on your order', '-1.64'); +PosLoyalty.check.orderTotalIs('60.63'); //SUBTOTAL +PosLoyalty.exec.finalizeOrder('Cash', '70'); + +// Scanning coupon twice. +// Also apply global discount on top of free product to check if the +// calculated discount is correct. +// Applied programs: +// - coupon program (free product) +// - global discount +// - on cheapest discount +ProductScreen.exec.addOrderline('Desk Organizer', '11'); // 5.1 per item +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-4.59'); +PosLoyalty.check.orderTotalIs('51.51'); +// add global discount and the discount will be replaced +PosLoyalty.do.enterCode('345678'); +PosLoyalty.check.hasRewardLine('10% on your order', '-5.15'); +// add free product coupon (for qty=11, free=4) +// the discount should change after having free products +// it should go back to cheapest discount as it is higher +PosLoyalty.do.enterCode('5678'); +PosLoyalty.check.hasRewardLine('Free Product - Desk Organizer', '-20.40'); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-4.59'); +// set quantity to 18 +// free qty stays the same since the amount of points on the card only allows for 4 free products +ProductScreen.do.pressNumpad('Backspace 8') +PosLoyalty.check.hasRewardLine('10% on your order', '-6.68'); +PosLoyalty.check.hasRewardLine('Free Product - Desk Organizer', '-20.40'); +// scan the code again and check notification +PosLoyalty.do.enterCode('5678'); +PosLoyalty.check.orderTotalIs('60.13'); +PosLoyalty.exec.finalizeOrder('Cash', '65'); + +// Specific products discount (with promocode) and free product (1357) +// Applied programs: +// - discount on specific products +// - free product +ProductScreen.exec.addOrderline('Desk Organizer', '6'); // 5.1 per item +PosLoyalty.check.hasRewardLine('on the cheapest product', '-4.59'); +PosLoyalty.exec.removeRewardLine('90% on the cheapest product'); +PosLoyalty.do.enterCode('promocode', false); +PosLoyalty.check.hasRewardLine('50% on specific products', '-15.30'); +PosLoyalty.do.enterCode('1357'); +PosLoyalty.check.hasRewardLine('Free Product - Desk Organizer', '-10.20'); +PosLoyalty.check.hasRewardLine('50% on specific products', '-10.20'); +PosLoyalty.check.orderTotalIs('10.20'); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +// Check reset program +// Enter two codes and reset the programs. +// The codes should be checked afterwards. They should return to new. +// Applied programs: +// - cheapest product +ProductScreen.exec.addOrderline('Monitor Stand', '6'); // 3.19 per item +PosLoyalty.do.enterCode('098765'); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-2.87'); +PosLoyalty.check.hasRewardLine('10% on your order', '-1.63'); +PosLoyalty.check.orderTotalIs('14.64'); +PosLoyalty.exec.removeRewardLine('90% on the cheapest product'); +PosLoyalty.check.hasRewardLine('10% on your order', '-1.91'); +PosLoyalty.check.orderTotalIs('17.23'); +PosLoyalty.do.resetActivePrograms(); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-2.87'); +PosLoyalty.check.orderTotalIs('16.27'); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +Tour.register('PosLoyaltyTour2', { test: true, url: '/pos/web' }, getSteps()); diff --git a/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTourMethods.js b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTourMethods.js new file mode 100644 index 00000000000..eb0096d5576 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyTourMethods.js @@ -0,0 +1,143 @@ +odoo.define('pos_loyalty.tour.PosCouponTourMethods', function (require) { + 'use strict'; + + const { createTourMethods } = require('point_of_sale.tour.utils'); + const { Do: ProductScreenDo } = require('point_of_sale.tour.ProductScreenTourMethods'); + const { Do: PaymentScreenDo } = require('point_of_sale.tour.PaymentScreenTourMethods'); + const { Do: ReceiptScreenDo } = require('point_of_sale.tour.ReceiptScreenTourMethods'); + const { Do: ChromeDo } = require('point_of_sale.tour.ChromeTourMethods'); + + const ProductScreen = { do: new ProductScreenDo() }; + const PaymentScreen = { do: new PaymentScreenDo() }; + const ReceiptScreen = { do: new ReceiptScreenDo() }; + const Chrome = { do: new ChromeDo() }; + + class Do { + selectRewardLine(rewardName) { + return [ + { + content: 'select reward line', + trigger: `.orderline.program-reward .product-name:contains("${rewardName}")`, + }, + { + content: 'check reward line if selected', + trigger: `.orderline.selected.program-reward .product-name:contains("${rewardName}")`, + run: function () {}, // it's a check + }, + ]; + } + enterCode(code, valid=true) { + const steps = [ + { + content: 'open code input dialog', + trigger: '.control-button:contains("Enter Code")', + }, + { + content: `enter code value: ${code}`, + trigger: '.popup-textinput input[type="text"]', + run: `text ${code}`, + }, + { + content: 'confirm inputted code', + trigger: '.popup-textinput .button.confirm', + }, + ]; + if (valid) { + steps.push({ + content: 'wait for the coupon to be loaded', + trigger: `.active-coupon:contains("(${code})")`, + run: () => {}, + }); + } + return steps; + } + resetActivePrograms() { + return [ + { + content: 'open code input dialog', + trigger: '.control-button:contains("Reset Programs")', + }, + ]; + } + claimSingleReward() { + return [ + { + content: 'open reward dialog', + trigger: '.control-button:contains("Reward")', + }, + ]; + } + claimReward(rewardName) { + return [ + { + content: 'open reward dialog', + trigger: '.control-button:contains("Reward")', + }, + { + content: 'select reward', + trigger: `.selection-item:contains("${rewardName}")`, + } + ]; + } + } + + class Check { + hasRewardLine(rewardName, amount) { + return [ + { + content: 'check if reward line is there', + trigger: `.orderline.program-reward span.product-name:contains("${rewardName}")`, + run: function () {}, + }, + { + content: 'check if the reward price is correct', + trigger: `.orderline.program-reward span.price:contains("${amount}")`, + run: function () {}, + }, + ]; + } + orderTotalIs(total_str) { + return [ + { + content: 'order total contains ' + total_str, + trigger: '.order .total .value:contains("' + total_str + '")', + run: function () {}, // it's a check + }, + ]; + } + checkNoClaimableRewards() { + return [ + { + content: 'check that no reward can be claimed', + trigger: ".control-button:contains('Reward'):not(.highlight)", + run: function () {}, // it's a check + } + ] + } + } + + class Execute { + constructor() { + this.do = new Do(); + this.check = new Check(); + } + finalizeOrder(paymentMethod, amount) { + return [ + ...ProductScreen.do.clickPayButton(), + ...PaymentScreen.do.clickPaymentMethod(paymentMethod), + ...PaymentScreen.do.pressNumpad([...amount].join(' ')), + ...PaymentScreen.do.clickValidate(), + ...ReceiptScreen.do.clickNextOrder(), + ]; + } + removeRewardLine(name) { + return [ + ...this.do.selectRewardLine(name), + ...ProductScreen.do.pressNumpad('Backspace'), + ...Chrome.do.confirmPopup(), + ]; + } + } + + return createTourMethods('PosLoyalty', Do, Check, Execute); +}); diff --git a/addons/pos_loyalty/static/src/js/tours/PosLoyaltyValidityTour.js b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyValidityTour.js new file mode 100644 index 00000000000..1fca6847003 --- /dev/null +++ b/addons/pos_loyalty/static/src/js/tours/PosLoyaltyValidityTour.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ + +import { PosLoyalty } from 'pos_loyalty.tour.PosCouponTourMethods'; +import { ProductScreen } from 'point_of_sale.tour.ProductScreenTourMethods'; +import { getSteps, startSteps } from 'point_of_sale.tour.utils'; +import Tour from 'web_tour.tour'; + +// First tour should not get any automatic rewards +startSteps(); + +ProductScreen.do.confirmOpeningPopup(); +ProductScreen.do.clickHomeCategory(); + +// Not valid -> date +ProductScreen.exec.addOrderline('Whiteboard Pen', '5'); +PosLoyalty.check.checkNoClaimableRewards(); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +Tour.register('PosLoyaltyValidity1', { test: true, url: '/pos/web' }, getSteps()); + +// Second tour +startSteps(); + +ProductScreen.do.clickHomeCategory(); + +// Valid +ProductScreen.exec.addOrderline('Whiteboard Pen', '5'); +PosLoyalty.check.hasRewardLine('90% on the cheapest product', '-2.88'); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +// Not valid -> usage +ProductScreen.exec.addOrderline('Whiteboard Pen', '5'); +PosLoyalty.check.checkNoClaimableRewards(); +PosLoyalty.exec.finalizeOrder('Cash', '20'); + +Tour.register('PosLoyaltyValidity2', { test: true, url: '/pos/web' }, getSteps()); diff --git a/addons/pos_loyalty/static/src/xml/ControlButtons/GiftCardButton.xml b/addons/pos_loyalty/static/src/xml/ControlButtons/GiftCardButton.xml new file mode 100644 index 00000000000..0ac7c533ac0 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/ControlButtons/GiftCardButton.xml @@ -0,0 +1,12 @@ + + + + + + + + Gift Card + + + + diff --git a/addons/pos_loyalty/static/src/xml/ControlButtons/PromoCodeButton.xml b/addons/pos_loyalty/static/src/xml/ControlButtons/PromoCodeButton.xml new file mode 100644 index 00000000000..46c4220e1c5 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/ControlButtons/PromoCodeButton.xml @@ -0,0 +1,12 @@ + + + + + + + + Enter Code + + + + diff --git a/addons/pos_loyalty/static/src/xml/ControlButtons/ResetProgramsButton.xml b/addons/pos_loyalty/static/src/xml/ControlButtons/ResetProgramsButton.xml new file mode 100644 index 00000000000..46805b298d6 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/ControlButtons/ResetProgramsButton.xml @@ -0,0 +1,12 @@ + + + + + + + + Reset Programs + + + + diff --git a/addons/pos_loyalty/static/src/xml/ControlButtons/RewardButton.xml b/addons/pos_loyalty/static/src/xml/ControlButtons/RewardButton.xml new file mode 100644 index 00000000000..4520a408d03 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/ControlButtons/RewardButton.xml @@ -0,0 +1,12 @@ + + + + + + + + Reward + + + + diff --git a/addons/pos_loyalty/static/src/xml/OrderReceipt.xml b/addons/pos_loyalty/static/src/xml/OrderReceipt.xml new file mode 100644 index 00000000000..18e244d1056 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/OrderReceipt.xml @@ -0,0 +1,62 @@ + + + + + + +
+ +
--------------------------------
+
+
+
+
+
+ + +
Won:
+
+ +
Spent:
+
+ +
Total :
+
+
+
+ + +
+
------------------------
+
+
+ Coupon Codes +
+ +
+
+ +
+
+ Valid until: + + + + + no expiration + +
+
+ Barcode +
+
+ +
+
+
+
+
+ + + + diff --git a/addons/pos_loyalty/static/src/xml/OrderSummary.xml b/addons/pos_loyalty/static/src/xml/OrderSummary.xml new file mode 100644 index 00000000000..d4df290f2b1 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/OrderSummary.xml @@ -0,0 +1,31 @@ + + + + + + +
+
+ +
+ +
+ + +
+
+ +
+ - +
+
+
+ +
+
+
+ +
+
+
+
+
diff --git a/addons/pos_loyalty/static/src/xml/OrderWidget.xml b/addons/pos_loyalty/static/src/xml/OrderWidget.xml new file mode 100644 index 00000000000..eb1b3d95ae1 --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/OrderWidget.xml @@ -0,0 +1,34 @@ + + + + + +
+
+
Active Programs
+ +
+ +
+
+
+
+
Active Coupons
+ +
+ () +
+
+
+
+
Active Rewards
+ +
+ +
+
+
+
+
+
+
diff --git a/addons/pos_loyalty/static/src/xml/Popups/GiftCardPopup.xml b/addons/pos_loyalty/static/src/xml/Popups/GiftCardPopup.xml new file mode 100644 index 00000000000..9cfc77cbcac --- /dev/null +++ b/addons/pos_loyalty/static/src/xml/Popups/GiftCardPopup.xml @@ -0,0 +1,106 @@ + + + + + + + + + + diff --git a/addons/pos_loyalty/tests/__init__.py b/addons/pos_loyalty/tests/__init__.py new file mode 100644 index 00000000000..6f4bae0c7a2 --- /dev/null +++ b/addons/pos_loyalty/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_frontend diff --git a/addons/pos_loyalty/tests/test_frontend.py b/addons/pos_loyalty/tests/test_frontend.py new file mode 100644 index 00000000000..773946bebb0 --- /dev/null +++ b/addons/pos_loyalty/tests/test_frontend.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date, timedelta + +from odoo.addons.point_of_sale.tests.test_frontend import TestPointOfSaleHttpCommon +from odoo.tests import Form, tagged + + +@tagged("post_install", "-at_install") +class TestUi(TestPointOfSaleHttpCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + # Disable any programs during the test + cls.env['loyalty.program'].search([]).write({'active': False}) + + cls.promo_programs = cls.env["loyalty.program"] + + # code promo program -> discount on specific products + cls.code_promo_program = cls.env['loyalty.program'].create({ + 'name': 'Promo Code Program - Discount on Specific Products', + 'program_type': 'promotion', + 'trigger': 'with_code', + 'applies_on': 'current', + 'rule_ids': [(0, 0, { + 'mode': 'with_code', + 'code': 'promocode', + })], + 'reward_ids': [(0, 0, { + 'reward_type': 'discount', + 'discount': 50, + 'discount_mode': 'percent', + 'discount_applicability': 'specific', + 'discount_product_ids': cls.whiteboard_pen | cls.magnetic_board | cls.desk_organizer, + })], + }) + cls.promo_programs |= cls.code_promo_program + + # auto promo program on current order + # -> discount on cheapest product + cls.auto_promo_program_current = cls.env['loyalty.program'].create({ + 'name': 'Auto Promo Program - Cheapest Product', + 'program_type': 'promotion', + 'trigger': 'auto', + 'rule_ids': [(0, 0, {})], + 'reward_ids': [(0, 0, { + 'reward_type': 'discount', + 'discount': 90, + 'discount_mode': 'percent', + 'discount_applicability': 'cheapest', + })] + }) + cls.promo_programs |= cls.auto_promo_program_current + + # auto promo program on next order + # -> discount on order (global discount) + cls.auto_promo_program_next = cls.env['loyalty.program'].create({ + 'name': 'Auto Promo Program - Global Discount', + 'program_type': 'promotion', + 'trigger': 'auto', + 'applies_on': 'future', + 'rule_ids': [(0, 0, {})], + 'reward_ids': [(0, 0, { + 'reward_type': 'discount', + 'discount': 10, + 'discount_mode': 'percent', + 'discount_applicability': 'order', + })] + }) + cls.promo_programs |= cls.auto_promo_program_next + + # coupon program -> free product + cls.coupon_program = cls.env['loyalty.program'].create({ + 'name': 'Coupon Program - Buy 3 Take 2 Free Product', + 'program_type': 'coupons', + 'trigger': 'with_code', + 'applies_on': 'current', + 'rule_ids': [(0, 0, { + 'product_ids': cls.desk_organizer, + 'reward_point_mode': 'unit', + 'minimum_qty': 3, + })], + 'reward_ids': [(0, 0, { + 'reward_type': 'product', + 'reward_product_id': cls.desk_organizer.id, + 'reward_product_qty': 1, + 'required_points': 1.5, + })], + }) + + # Create coupons for the coupon program and change the code + # to be able to use them in the frontend tour. + cls.env["loyalty.generate.wizard"].with_context( + {"active_id": cls.coupon_program.id} + ).create({"coupon_qty": 4, 'points_granted': 4.5}).generate_coupons() + cls.coupon1, cls.coupon2, cls.coupon3, cls.coupon4 = cls.coupon_program.coupon_ids + cls.coupon1.write({"code": "1234"}) + cls.coupon2.write({"code": "5678"}) + cls.coupon3.write({"code": "1357"}) + cls.coupon4.write({"code": "2468"}) + + def setUp(self): + super().setUp() + # Set the programs to the pos config. + # Remove fiscal position and pricelist. + with Form(self.main_pos_config) as pos_config: + pos_config.tax_regime_selection = False + pos_config.use_pricelist = False + pos_config.pricelist_id = self.env["product.pricelist"].create( + {"name": "PoS Default Pricelist",} + ) + pos_config.use_coupon_programs = True + pos_config.coupon_program_ids.add(self.coupon_program) + for promo_program in self.promo_programs: + pos_config.promo_program_ids.add(promo_program) + self.main_pos_config.open_session_cb() + + + + def test_pos_loyalty_tour_basic(self): + """PoS Loyalty Basic Tour""" + ## + # Tour Part 1 + # This part will generate coupons for `auto_promo_program_next` + # that will be used in the second part of the tour. + # + + self.start_tour( + "/pos/web?config_id=%d" % self.main_pos_config.id, + "PosLoyaltyTour1", + login="accountman", + ) + + # check coupon usage + self.assertEqual(self.coupon1.points, 0, 'The coupon should have consumed its points.') + self.assertEqual(self.coupon2.points, 4.5, 'The coupon was used but never validated.') + # check pos_order_count in each program + self.assertEqual(self.auto_promo_program_current.pos_order_count, 3) + self.assertEqual(self.auto_promo_program_next.pos_order_count, 0) + self.assertEqual(self.code_promo_program.pos_order_count, 1) + self.assertEqual(self.coupon_program.pos_order_count, 1) + # check number of generated coupons + self.assertEqual(len(self.auto_promo_program_next.coupon_ids), 5) + # check number of orders in the session + pos_session = self.main_pos_config.current_session_id + self.assertEqual( + len(pos_session.order_ids), 5, msg="5 orders were made in tour part1." + ) + + ## + # Tour Part 2 + # The coupons generated in the first part will be used in this tour. + # + + # Manually set the code for some `auto_promo_program_next` coupons + # to be able to use them in defining the part2 tour. + ( + promo_coupon1, + promo_coupon2, + promo_coupon3, + promo_coupon4, + *_, + ) = self.auto_promo_program_next.coupon_ids + promo_coupon1.write({"code": "123456"}) + promo_coupon2.write({"code": "345678"}) + promo_coupon3.write({"code": "567890"}) + promo_coupon4.write({"code": "098765"}) + + self.coupon2.points = 6 + self.coupon3.points = 3 + + # use here the generated coupon + self.start_tour( + "/pos/web?config_id=%d" % self.main_pos_config.id, + "PosLoyaltyTour2", + login="accountman", + ) + # check pos_order_count in each program + self.assertEqual(self.auto_promo_program_current.pos_order_count, 6) + self.assertEqual(self.auto_promo_program_next.pos_order_count, 2) + self.assertEqual(self.code_promo_program.pos_order_count, 2) + self.assertEqual(self.coupon_program.pos_order_count, 3) + + def test_loyalty_validity_dates_and_use(self): + # Tests date validity and max usage for an automatic program. + self.auto_promo_program_current.write({ + 'date_to': date.today() - timedelta(days=2), + 'limit_usage': True, + 'max_usage': 1, + }) + # First tour check that the promotion is not applied + self.start_tour( + "/pos/web?config_id=%d" % self.main_pos_config.id, + "PosLoyaltyValidity1", + login="accountman", + ) + + self.auto_promo_program_current.write({ + 'date_to': date.today() + timedelta(days=2), + }) + + # Second tour that does 2 orders, the first should have the rewards, the second should not + self.start_tour( + "/pos/web?config_id=%d" % self.main_pos_config.id, + "PosLoyaltyValidity2", + login="accountman", + ) diff --git a/addons/pos_loyalty/views/loyalty_card_views.xml b/addons/pos_loyalty/views/loyalty_card_views.xml new file mode 100644 index 00000000000..ed1dd91df29 --- /dev/null +++ b/addons/pos_loyalty/views/loyalty_card_views.xml @@ -0,0 +1,13 @@ + + + + loyalty.card.view.form.inherit.pos.loyalty + loyalty.card + + + + + + + + diff --git a/addons/pos_loyalty/views/loyalty_mail_views.xml b/addons/pos_loyalty/views/loyalty_mail_views.xml new file mode 100644 index 00000000000..f69a8b66f12 --- /dev/null +++ b/addons/pos_loyalty/views/loyalty_mail_views.xml @@ -0,0 +1,13 @@ + + + + loyalty.mail.view.tree.inherit.pos.loyalty + loyalty.mail + + + + + + + + diff --git a/addons/pos_loyalty/views/pos_config_views.xml b/addons/pos_loyalty/views/pos_config_views.xml new file mode 100644 index 00000000000..68bba42cbca --- /dev/null +++ b/addons/pos_loyalty/views/pos_config_views.xml @@ -0,0 +1,68 @@ + + + + pos.config.view.form.inherit.pos.loyalty + pos.config + + +
+
+
+
+ + +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
diff --git a/addons/pos_loyalty/views/pos_loyalty_menu_views.xml b/addons/pos_loyalty/views/pos_loyalty_menu_views.xml new file mode 100644 index 00000000000..66dcb56e4dc --- /dev/null +++ b/addons/pos_loyalty/views/pos_loyalty_menu_views.xml @@ -0,0 +1,11 @@ + + + +