Browse Source
[ADD] pos_loyalty: loyalty programs for POS (#185)
[ADD] pos_loyalty: loyalty programs for POS (#185)
* [ADD] pos_loyalty: loyalty programs for POS * [FIX] Limit to one discount reward per order * [FIX] Remove unused variables and returns * [IMP] Refactoring rules loadingpull/414/head
Gelu
8 years ago
committed by
Wolfgang Pichler
23 changed files with 2000 additions and 0 deletions
-
58pos_loyalty/README.rst
-
4pos_loyalty/__init__.py
-
33pos_loyalty/__manifest__.py
-
467pos_loyalty/i18n/es.po
-
466pos_loyalty/i18n/pos_loyalty.pot
-
9pos_loyalty/models/__init__.py
-
31pos_loyalty/models/loyalty_program.py
-
68pos_loyalty/models/loyalty_reward.py
-
33pos_loyalty/models/loyalty_rule.py
-
15pos_loyalty/models/pos_config.py
-
31pos_loyalty/models/pos_order.py
-
14pos_loyalty/models/res_partner.py
-
7pos_loyalty/security/ir.model.access.csv
-
21pos_loyalty/static/src/css/pos.css
-
453pos_loyalty/static/src/js/pos.js
-
85pos_loyalty/static/src/xml/pos.xml
-
83pos_loyalty/views/loyalty_program_view.xml
-
37pos_loyalty/views/loyalty_reward_view.xml
-
31pos_loyalty/views/loyalty_rule_view.xml
-
15pos_loyalty/views/pos_config_view.xml
-
15pos_loyalty/views/pos_order_view.xml
-
15pos_loyalty/views/res_partner_view.xml
-
9pos_loyalty/views/templates.xml
@ -0,0 +1,58 @@ |
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
|
|||
=============== |
|||
Loyalty Program |
|||
=============== |
|||
|
|||
This module allows you to define a loyalty program in the point of sale, |
|||
where the customers earn loyalty points and get rewards. |
|||
|
|||
This module is a forward-port to v10 of the pos_loyalty module from Odoo's |
|||
saas-6 branch. |
|||
The functionality was moved to the Enterprise edition in later versions. |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
To use this module, you need to: |
|||
|
|||
* Go to *Point of Sale > Configuration > Loyalty Programs* and define a new loyalty program with specific rules and gifts. |
|||
* Assign the loyalty program to the desired Point of Sale. |
|||
|
|||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
|||
:alt: Try me on Runbot |
|||
:target: https://runbot.odoo-community.org/runbot/{repo_id}/{branch} |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues |
|||
<https://github.com/OCA/{project_repo}/issues>`_. In case of trouble, please |
|||
check there if your issue has already been reported. If you spotted it first, |
|||
help us smash it by providing detailed and welcomed feedback. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* RGB Consulting SL (http://www.rgbconsulting.com) |
|||
* Forward-port from Odoo SA saas-6 branch |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use. |
|||
|
|||
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import models |
@ -0,0 +1,33 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
{ |
|||
'name': 'Loyalty Program', |
|||
'version': '10.0.1.0.0', |
|||
'category': 'Point of Sale', |
|||
'license': 'AGPL-3', |
|||
'author': "OpenERP SA, " |
|||
"RGB Consulting SL, " |
|||
"Odoo Community Association (OCA)", |
|||
'website': "https://odoo-community.org/", |
|||
'depends': ['point_of_sale'], |
|||
|
|||
'data': [ |
|||
'security/ir.model.access.csv', |
|||
'views/templates.xml', |
|||
'views/loyalty_program_view.xml', |
|||
'views/loyalty_reward_view.xml', |
|||
'views/loyalty_rule_view.xml', |
|||
'views/pos_config_view.xml', |
|||
'views/pos_order_view.xml', |
|||
'views/res_partner_view.xml', |
|||
], |
|||
|
|||
'qweb': [ |
|||
'static/src/xml/pos.xml', |
|||
], |
|||
|
|||
'installable': True, |
|||
} |
@ -0,0 +1,467 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * pos_loyalty |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 10.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2017-06-23 06:36+0000\n" |
|||
"PO-Revision-Date: 2017-06-23 06:36+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_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_order |
|||
msgid "Amount of loyalty points given to the customer for each point of sale order" |
|||
msgstr "Cantidad de puntos de fidelidad añadidos al cliente por cada pedido del punto de venta" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_product |
|||
msgid "Amount of loyalty points given to the customer per product sold" |
|||
msgstr "Cantidad de puntos de fidelidad añadidos al cliente por producto vendido" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_currency |
|||
msgid "Amount of loyalty points given to the customer per sold currency" |
|||
msgstr "Cantidad de puntos de fidelidad añadidos al cliente por moneda vendida" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_pp_currency |
|||
msgid "Amount of points earned per currency" |
|||
msgstr "Cantidad de puntos ganados por moneda" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_pp_product |
|||
msgid "Amount of points earned per product" |
|||
msgstr "Cantidad de puntos ganados por producto" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.rule,type:0 |
|||
msgid "Category" |
|||
msgstr "Categoría" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,help:pos_loyalty.loyalty_program_action |
|||
msgid "Click create to define a Loyalty Program." |
|||
msgstr "Haga clic en crear para definir un Programa de Fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_point_cost |
|||
msgid "Cost of the reward per monetary unit discounted" |
|||
msgstr "Coste de la recompensa por unidad monetaria descontada" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_create_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_create_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_create_uid |
|||
msgid "Created by" |
|||
msgstr "Creado por" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_create_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_create_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_create_date |
|||
msgid "Created on" |
|||
msgstr "Creado el" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_cumulative |
|||
msgid "Cumulative" |
|||
msgstr "Cumulativo" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Discount" |
|||
msgstr "Descuento" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount_product_id |
|||
msgid "Discount Product" |
|||
msgstr "Producto de descuento" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount_max |
|||
msgid "Discount limit" |
|||
msgstr "Límite de descuento" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:59 |
|||
#, python-format |
|||
msgid "Discount product field is mandatory for discount rewards" |
|||
msgstr "El campo Producto de descuento es obligatorio para las recompensas de tipo descuento." |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_display_name |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_display_name |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_display_name |
|||
msgid "Display Name" |
|||
msgstr "Nombre a mostrar" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Gift" |
|||
msgstr "Regalo" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_gift_product_id |
|||
msgid "Gift Product" |
|||
msgstr "Producto de regalo" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:52 |
|||
#, python-format |
|||
msgid "Gift product field is mandatory for gift rewards" |
|||
msgstr "El campo Producto de regalo es obligatorio para las recompensas de tipo regalo" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program___last_update |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward___last_update |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule___last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Última modificación en" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_write_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_write_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Última actualización por" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_write_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_write_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Última actualización el" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_pos_order_loyalty_points |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_res_partner_loyalty_points |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_res_users_loyalty_points |
|||
msgid "Loyalty Points" |
|||
msgstr "Puntos de fidelidad" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_pos_config_loyalty_id |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.pos_config_form_view |
|||
msgid "Loyalty Program" |
|||
msgstr "Programa de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_name |
|||
msgid "Loyalty Program Name" |
|||
msgstr "Nombre programa de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,name:pos_loyalty.loyalty_program_action |
|||
#: model:ir.ui.menu,name:pos_loyalty.loyalty_program_menu |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_tree_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.partner_property_form_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.pos_order_form_view |
|||
msgid "Loyalty Programs" |
|||
msgstr "Programas de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,help:pos_loyalty.loyalty_program_action |
|||
msgid "Loyalty Programs allow you customers to earn points\n" |
|||
" and rewards when purchasing from your shops." |
|||
msgstr "Los programas de fidelización le permiten a los clientes ganar puntos\n" |
|||
" y recompensas al comprar en tus tiendas." |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_reward_form_view |
|||
msgid "Loyalty Reward" |
|||
msgstr "Recompensa de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_rule_form_view |
|||
msgid "Loyalty Rule" |
|||
msgstr "Regla de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_rounding |
|||
msgid "Loyalty point amounts will be rounded to multiples of this value" |
|||
msgstr "Los puntos de fidelidad se redondearán a múltiplos de este valor" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount_max |
|||
msgid "Maximum discounted amount allowed for this discount reward" |
|||
msgstr "Importe máximo de descuento permitido para este descuento" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_minimum_points |
|||
msgid "Minimum Points" |
|||
msgstr "Puntos mínimos" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_minimum_points |
|||
msgid "Minimum amount of points the customer must have to qualify for this reward" |
|||
msgstr "Cantidad mínima de puntos de cliente para acceder a esta recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:365 |
|||
#, python-format |
|||
msgid "No Rewards Available" |
|||
msgstr "No hay recompensas disponibles" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_res_partner |
|||
msgid "Partner" |
|||
msgstr "Empresa" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:381 |
|||
#, python-format |
|||
msgid "Please select a reward" |
|||
msgstr "Selecciona una recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_point_cost |
|||
msgid "Point Cost" |
|||
msgstr "Coste Puntos" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_point_product_id |
|||
msgid "Point Product" |
|||
msgstr "Producto Punto" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_pos_order |
|||
msgid "Point of Sale Orders" |
|||
msgstr "Pedidos del TPV" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:67 |
|||
#, python-format |
|||
msgid "Point product field is mandatory for point resale rewards" |
|||
msgstr "El campo Producto Punto es obligatorio para recompensas de reventa de puntos" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:6 |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:71 |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:81 |
|||
#, python-format |
|||
msgid "Points" |
|||
msgstr "Puntos" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_rounding |
|||
msgid "Points Rounding" |
|||
msgstr "Redondeo Puntos" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:57 |
|||
#, python-format |
|||
msgid "Points Spent" |
|||
msgstr "Puntos Gastados" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:54 |
|||
#, python-format |
|||
msgid "Points Won" |
|||
msgstr "Puntos Ganados" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_currency |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_pp_currency |
|||
msgid "Points per currency" |
|||
msgstr "Puntos por moneda" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_order |
|||
msgid "Points per order" |
|||
msgstr "Points per order" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_product |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_pp_product |
|||
msgid "Points per product" |
|||
msgstr "Puntos por producto" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.rule,type:0 |
|||
msgid "Product" |
|||
msgstr "Producto" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_point_product_id |
|||
msgid "Product that represents a point that is sold by the customer" |
|||
msgstr "Producto que representa un punto vendido por el cliente" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Resale" |
|||
msgstr "Reventa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_name |
|||
msgid "Reward Name" |
|||
msgstr "Nombre recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Reward the customer with gifts or discounts for loyalty points" |
|||
msgstr "Recompensar al cliente con regalos o descuentos por puntos de fidelidad" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:25 |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_reward_ids |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
#, python-format |
|||
msgid "Rewards" |
|||
msgstr "Recompensas" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_name |
|||
msgid "Rule Name" |
|||
msgstr "Nombre de regla" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_rule_ids |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Rules" |
|||
msgstr "Reglas" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Rules define how loyalty points are earned for specific products or categories" |
|||
msgstr "Las reglas definen cómo se obtienen puntos de fidelidad para productos o categorías específicos" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_category_id |
|||
msgid "Target Category" |
|||
msgstr "Categoría afectada" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_product_id |
|||
msgid "Target Product" |
|||
msgstr "Producto afectado" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_loyalty_program_id |
|||
msgid "The Loyalty Program this reward belongs to" |
|||
msgstr "El programa de fidelización al que pertenece esta recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_loyalty_program_id |
|||
msgid "The Loyalty Program this rule belongs to" |
|||
msgstr "El programa de fidelización al que pertenece esta regla" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_pos_order_loyalty_points |
|||
msgid "The amount of Loyalty points awarded to the customer with this order" |
|||
msgstr "La cantidad de puntos de fidelidad que el cliente obtiene con este pedido" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_category_id |
|||
msgid "The category affected by this rule" |
|||
msgstr "La categoría afectada por esta regla" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_type |
|||
msgid "The concept this rule applies to" |
|||
msgstr "El concepto al que aplica esta regla" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount |
|||
msgid "The discount percentage" |
|||
msgstr "El porcentaje de descuento" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_res_partner_loyalty_points |
|||
#: model:ir.model.fields,help:pos_loyalty.field_res_users_loyalty_points |
|||
msgid "The loyalty points the user won as part of a Loyalty Program" |
|||
msgstr "Los puntos de fidelidad que el usuario ganó como parte de un Programa de Fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_pos_config_loyalty_id |
|||
msgid "The loyalty program used by this Point of Sale" |
|||
msgstr "El programa de fidelización utilizado en este Punto de Venta" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_cumulative |
|||
msgid "The points from this rule will be added to points won from other rules with the same concept" |
|||
msgstr "Los puntos de esta regla se añadirán a los puntos ganados en otras reglas con el mismo concepto" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_product_id |
|||
msgid "The product affected by this rule" |
|||
msgstr "El producto afectado por esta regla" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_gift_product_id |
|||
msgid "The product given as a reward" |
|||
msgstr "El producto utilizado como recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount_product_id |
|||
msgid "The product used to apply discounts" |
|||
msgstr "El producto utilizado para aplicar descuentos" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:366 |
|||
#, python-format |
|||
msgid "There are no rewards available for this customer as part of the loyalty program" |
|||
msgstr "No hay recompensas disponibles para este cliente como parte de este programa de fidelización" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:60 |
|||
#, python-format |
|||
msgid "Total Points" |
|||
msgstr "Total Puntos" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_type |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_type |
|||
msgid "Type" |
|||
msgstr "Tipo" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_type |
|||
msgid "Type of the reward" |
|||
msgstr "Tipo de recompensa" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_program |
|||
msgid "loyalty.program" |
|||
msgstr "loyalty.program" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_reward |
|||
msgid "loyalty.reward" |
|||
msgstr "loyalty.reward" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_rule |
|||
msgid "loyalty.rule" |
|||
msgstr "loyalty.rule" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_pos_config |
|||
msgid "pos.config" |
|||
msgstr "Configuración del TPV" |
|||
|
@ -0,0 +1,466 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * pos_loyalty |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 10.0\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2017-06-23 06:35+0000\n" |
|||
"PO-Revision-Date: 2017-06-23 06:35+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_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_order |
|||
msgid "Amount of loyalty points given to the customer for each point of sale order" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_product |
|||
msgid "Amount of loyalty points given to the customer per product sold" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_pp_currency |
|||
msgid "Amount of loyalty points given to the customer per sold currency" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_pp_currency |
|||
msgid "Amount of points earned per currency" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_pp_product |
|||
msgid "Amount of points earned per product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.rule,type:0 |
|||
msgid "Category" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,help:pos_loyalty.loyalty_program_action |
|||
msgid "Click create to define a Loyalty Program." |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_point_cost |
|||
msgid "Cost of the reward per monetary unit discounted" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_create_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_create_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_create_uid |
|||
msgid "Created by" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_create_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_create_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_create_date |
|||
msgid "Created on" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_cumulative |
|||
msgid "Cumulative" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Discount" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount_product_id |
|||
msgid "Discount Product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_discount_max |
|||
msgid "Discount limit" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:59 |
|||
#, python-format |
|||
msgid "Discount product field is mandatory for discount rewards" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_display_name |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_display_name |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_display_name |
|||
msgid "Display Name" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Gift" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_gift_product_id |
|||
msgid "Gift Product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:52 |
|||
#, python-format |
|||
msgid "Gift product field is mandatory for gift rewards" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_id |
|||
msgid "ID" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program___last_update |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward___last_update |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule___last_update |
|||
msgid "Last Modified on" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_write_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_write_uid |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_write_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_write_date |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_write_date |
|||
msgid "Last Updated on" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_pos_order_loyalty_points |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_res_partner_loyalty_points |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_res_users_loyalty_points |
|||
msgid "Loyalty Points" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_loyalty_program_id |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_pos_config_loyalty_id |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.pos_config_form_view |
|||
msgid "Loyalty Program" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_name |
|||
msgid "Loyalty Program Name" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,name:pos_loyalty.loyalty_program_action |
|||
#: model:ir.ui.menu,name:pos_loyalty.loyalty_program_menu |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_tree_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.partner_property_form_view |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.pos_order_form_view |
|||
msgid "Loyalty Programs" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.actions.act_window,help:pos_loyalty.loyalty_program_action |
|||
msgid "Loyalty Programs allow you customers to earn points\n" |
|||
" and rewards when purchasing from your shops." |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_reward_form_view |
|||
msgid "Loyalty Reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_rule_form_view |
|||
msgid "Loyalty Rule" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_program_rounding |
|||
msgid "Loyalty point amounts will be rounded to multiples of this value" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount_max |
|||
msgid "Maximum discounted amount allowed for this discount reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_minimum_points |
|||
msgid "Minimum Points" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_minimum_points |
|||
msgid "Minimum amount of points the customermust have to qualify for this reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:365 |
|||
#, python-format |
|||
msgid "No Rewards Available" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_res_partner |
|||
msgid "Partner" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:381 |
|||
#, python-format |
|||
msgid "Please select a reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_point_cost |
|||
msgid "Point Cost" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_point_product_id |
|||
msgid "Point Product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_pos_order |
|||
msgid "Point of Sale Orders" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: code:addons/pos_loyalty/models/loyalty_reward.py:67 |
|||
#, python-format |
|||
msgid "Point product field is mandatory for point resale rewards" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:6 |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:71 |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:81 |
|||
#, python-format |
|||
msgid "Points" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_rounding |
|||
msgid "Points Rounding" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:57 |
|||
#, python-format |
|||
msgid "Points Spent" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:54 |
|||
#, python-format |
|||
msgid "Points Won" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_currency |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_pp_currency |
|||
msgid "Points per currency" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_order |
|||
msgid "Points per order" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_pp_product |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_pp_product |
|||
msgid "Points per product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.rule,type:0 |
|||
msgid "Product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_point_product_id |
|||
msgid "Product that represents a point that is sold by the customer" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: selection:loyalty.reward,type:0 |
|||
msgid "Resale" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_name |
|||
msgid "Reward Name" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Reward the customer with gifts or discounts for loyalty points" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:25 |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_reward_ids |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
#, python-format |
|||
msgid "Rewards" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_name |
|||
msgid "Rule Name" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_program_rule_ids |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Rules" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.ui.view,arch_db:pos_loyalty.loyalty_program_form_view |
|||
msgid "Rules define how loyalty points are earned for specific products or categories" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_category_id |
|||
msgid "Target Category" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_product_id |
|||
msgid "Target Product" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_loyalty_program_id |
|||
msgid "The Loyalty Program this reward belongs to" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_loyalty_program_id |
|||
msgid "The Loyalty Program this rule belongs to" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_pos_order_loyalty_points |
|||
msgid "The amount of Loyalty points awarded to the customer with this order" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_category_id |
|||
msgid "The category affected by this rule" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_type |
|||
msgid "The concept this rule applies to" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount |
|||
msgid "The discount percentage" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_res_partner_loyalty_points |
|||
#: model:ir.model.fields,help:pos_loyalty.field_res_users_loyalty_points |
|||
msgid "The loyalty points the user won as part of a Loyalty Program" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_pos_config_loyalty_id |
|||
msgid "The loyalty program used by this Point of Sale" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_cumulative |
|||
msgid "The points from this rule will be added to points won from other rules with the same concept" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_rule_product_id |
|||
msgid "The product affected by this rule" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_gift_product_id |
|||
msgid "The product given as a reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_discount_product_id |
|||
msgid "The product used to apply discounts" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/js/pos.js:366 |
|||
#, python-format |
|||
msgid "There are no rewards available for this customer as part of the loyalty program" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#. openerp-web |
|||
#: code:addons/pos_loyalty/static/src/xml/pos.xml:60 |
|||
#, python-format |
|||
msgid "Total Points" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_reward_type |
|||
#: model:ir.model.fields,field_description:pos_loyalty.field_loyalty_rule_type |
|||
msgid "Type" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model.fields,help:pos_loyalty.field_loyalty_reward_type |
|||
msgid "Type of the reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_program |
|||
msgid "loyalty.program" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_reward |
|||
msgid "loyalty.reward" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_loyalty_rule |
|||
msgid "loyalty.rule" |
|||
msgstr "" |
|||
|
|||
#. module: pos_loyalty |
|||
#: model:ir.model,name:pos_loyalty.model_pos_config |
|||
msgid "pos.config" |
|||
msgstr "" |
|||
|
@ -0,0 +1,9 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import loyalty_program |
|||
from . import loyalty_reward |
|||
from . import loyalty_rule |
|||
from . import pos_config |
|||
from . import pos_order |
|||
from . import res_partner |
@ -0,0 +1,31 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class LoyaltyProgram(models.Model): |
|||
_name = 'loyalty.program' |
|||
|
|||
name = fields.Char(string='Loyalty Program Name', size=32, index=True, |
|||
required=True) |
|||
pp_currency = fields.Float(string='Points per currency', |
|||
help='Amount of loyalty points given to the ' |
|||
'customer per sold currency') |
|||
pp_product = fields.Float(string='Points per product', |
|||
help='Amount of loyalty points given to the ' |
|||
'customer per product sold') |
|||
pp_order = fields.Float(string='Points per order', |
|||
help='Amount of loyalty points given to the ' |
|||
'customer for each point of sale order') |
|||
rounding = fields.Float(string='Points Rounding', default=1, |
|||
help='Loyalty point amounts will be rounded to ' |
|||
'multiples of this value') |
|||
rule_ids = fields.One2many(comodel_name='loyalty.rule', |
|||
inverse_name='loyalty_program_id', |
|||
string='Rules') |
|||
reward_ids = fields.One2many(comodel_name='loyalty.reward', |
|||
inverse_name='loyalty_program_id', |
|||
string='Rewards') |
@ -0,0 +1,68 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models, api, _ |
|||
from odoo.exceptions import ValidationError |
|||
|
|||
|
|||
class LoyaltyReward(models.Model): |
|||
_name = 'loyalty.reward' |
|||
|
|||
name = fields.Char(string='Reward Name', size=32, index=True, |
|||
required=True) |
|||
type = fields.Selection(selection=[('gift', 'Gift'), |
|||
('discount', 'Discount'), |
|||
('resale', 'Resale')], |
|||
string='Type', required=True, |
|||
help='Type of the reward') |
|||
minimum_points = fields.Float(string='Minimum Points', |
|||
help='Minimum amount of points the customer' |
|||
' must have to qualify for this reward') |
|||
point_cost = fields.Float(string='Point Cost', |
|||
help='Cost of the reward per monetary unit ' |
|||
'discounted') |
|||
discount = fields.Float(help='The discount percentage') |
|||
discount_max = fields.Float(string='Discount limit', |
|||
help='Maximum discounted amount allowed for' |
|||
'this discount reward') |
|||
loyalty_program_id = fields.Many2one(comodel_name='loyalty.program', |
|||
string='Loyalty Program', |
|||
help='The Loyalty Program this reward' |
|||
' belongs to') |
|||
gift_product_id = fields.Many2one(comodel_name='product.product', |
|||
string='Gift Product', |
|||
help='The product given as a reward') |
|||
discount_product_id = fields.Many2one(comodel_name='product.product', |
|||
string='Discount Product', |
|||
help='The product used to apply ' |
|||
'discounts') |
|||
point_product_id = fields.Many2one(comodel_name='product.product', |
|||
string='Point Product', |
|||
help='Product that represents a point ' |
|||
'that is sold by the customer') |
|||
|
|||
@api.multi |
|||
@api.constrains('type', 'gift_product_id') |
|||
def _check_gift_product(self): |
|||
for reward in self: |
|||
if reward.type == 'gift' and not reward.gift_product_id: |
|||
raise ValidationError( |
|||
_('Gift product field is mandatory for gift rewards')) |
|||
|
|||
@api.multi |
|||
@api.constrains('type', 'discount_product_id') |
|||
def _check_discount_product(self): |
|||
for reward in self: |
|||
if reward.type == 'discount' and not reward.discount_product_id: |
|||
raise ValidationError(_('Discount product field is ' |
|||
'mandatory for discount rewards')) |
|||
|
|||
@api.multi |
|||
@api.constrains('type', 'point_product_id') |
|||
def _check_point_product(self): |
|||
for reward in self: |
|||
if reward.type == 'resale' and not reward.point_product_id: |
|||
raise ValidationError(_('Point product field is ' |
|||
'mandatory for point resale rewards')) |
@ -0,0 +1,33 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class LoyaltyRule(models.Model): |
|||
_name = 'loyalty.rule' |
|||
|
|||
name = fields.Char(string='Rule Name', size=32, index=True, required=True) |
|||
type = fields.Selection(selection=[('product', 'Product'), |
|||
('category', 'Category')], |
|||
string='Type', required=True, default='product', |
|||
help='The concept this rule applies to') |
|||
cumulative = fields.Boolean(help='The points from this rule will be added ' |
|||
'to points won from other rules with ' |
|||
'the same concept') |
|||
pp_product = fields.Float(string='Points per product', |
|||
help='Amount of points earned per product') |
|||
pp_currency = fields.Float(string='Points per currency', |
|||
help='Amount of points earned per currency') |
|||
loyalty_program_id = fields.Many2one(comodel_name='loyalty.program', |
|||
string='Loyalty Program', |
|||
help='The Loyalty Program this rule ' |
|||
'belongs to') |
|||
product_id = fields.Many2one(comodel_name='product.product', |
|||
string='Target Product', |
|||
help='The product affected by this rule') |
|||
category_id = fields.Many2one(comodel_name='pos.category', |
|||
string='Target Category', |
|||
help='The category affected by this rule') |
@ -0,0 +1,15 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class PosConfig(models.Model): |
|||
_inherit = 'pos.config' |
|||
|
|||
loyalty_id = fields.Many2one(comodel_name='loyalty.program', |
|||
string='Loyalty Program', |
|||
help='The loyalty program used by this ' |
|||
'Point of Sale') |
@ -0,0 +1,31 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models, api |
|||
|
|||
|
|||
class PosOrder(models.Model): |
|||
_inherit = 'pos.order' |
|||
|
|||
loyalty_points = fields.Float(string='Loyalty Points', |
|||
help='The amount of Loyalty points awarded ' |
|||
'to the customer with this order') |
|||
|
|||
@api.model |
|||
def _order_fields(self, ui_order): |
|||
res = super(PosOrder, self)._order_fields(ui_order) |
|||
res['loyalty_points'] = ui_order.get('loyalty_points', 0) |
|||
return res |
|||
|
|||
@api.model |
|||
def create_from_ui(self, orders): |
|||
res = super(PosOrder, self).create_from_ui(orders) |
|||
for order in orders: |
|||
order_partner = order['data']['partner_id'] |
|||
order_points = order['data']['loyalty_points'] |
|||
if order_points != 0 and order_partner: |
|||
partner = self.env['res.partner'].browse(order_partner) |
|||
partner.loyalty_points += order_points |
|||
return res |
@ -0,0 +1,14 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2004-2010 OpenERP SA |
|||
# Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class ResPartner(models.Model): |
|||
_inherit = 'res.partner' |
|||
|
|||
loyalty_points = fields.Float(string='Loyalty Points', |
|||
help='The loyalty points the user won as ' |
|||
'part of a Loyalty Program') |
@ -0,0 +1,7 @@ |
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
|||
access_loyalty_program,loyalty.program.user,model_loyalty_program,point_of_sale.group_pos_user,1,0,0,0 |
|||
access_loyalty_program_manager,loyalty.program.manager,model_loyalty_program,point_of_sale.group_pos_manager,1,1,1,1 |
|||
access_loyalty_rule,loyalty.rule.user,model_loyalty_rule,point_of_sale.group_pos_user,1,0,0,0 |
|||
access_loyalty_rule_manager,loyalty.rule.manager,model_loyalty_rule,point_of_sale.group_pos_manager,1,1,1,1 |
|||
access_loyalty_reward,loyalty.reward.user,model_loyalty_reward,point_of_sale.group_pos_user,1,0,0,0 |
|||
access_loyalty_reward_manager,loyalty.reward.manager,model_loyalty_reward,point_of_sale.group_pos_manager,1,1,1,1 |
@ -0,0 +1,21 @@ |
|||
|
|||
.pos .order .summary .loyalty-points{ |
|||
margin-left: 20px; |
|||
float: left; |
|||
padding: 10px; |
|||
max-width: 216px; |
|||
text-align: left; |
|||
color: #6EC89B; |
|||
background: rgba(110, 200, 155, 0.17); |
|||
border-radius: 3px; |
|||
} |
|||
.pos .order .summary .loyalty-points.negative{ |
|||
color: #C86E6E; |
|||
background: rgba(200, 110, 110, 0.17); |
|||
} |
|||
.pos .order .summary .loyalty-points-total { |
|||
border-top: solid 2px; |
|||
text-align: center; |
|||
padding-top: 4px; |
|||
margin-top: 4px; |
|||
} |
@ -0,0 +1,453 @@ |
|||
/* Copyright 2004-2010 OpenERP SA |
|||
* Copyright 2017 RGB Consulting S.L. (https://www.rgbconsulting.com)
|
|||
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
|
|||
|
|||
odoo.define('pos_loyalty.loyalty_program', function (require){ |
|||
"use strict" |
|||
|
|||
var models = require('point_of_sale.models'); |
|||
var screens = require('point_of_sale.screens'); |
|||
|
|||
var utils = require('web.utils'); |
|||
var round_pr = utils.round_precision; |
|||
|
|||
var core = require('web.core'); |
|||
var QWeb = core.qweb; |
|||
var _t = core._t; |
|||
|
|||
models.load_fields('res.partner','loyalty_points'); |
|||
|
|||
models.load_models([ |
|||
{ |
|||
model: 'loyalty.program', |
|||
condition: function(self){ return !!self.config.loyalty_id[0]; }, |
|||
fields: ['name','pp_currency','pp_product','pp_order','rounding'], |
|||
domain: function(self){ return [['id','=',self.config.loyalty_id[0]]]; }, |
|||
loaded: function(self,loyalties){ |
|||
self.loyalty = loyalties[0]; |
|||
}, |
|||
},{ |
|||
model: 'loyalty.rule', |
|||
condition: function(self){ return !!self.loyalty; }, |
|||
fields: ['name','type','product_id','category_id','cumulative','pp_product','pp_currency'], |
|||
domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, |
|||
loaded: function(self,rules){ |
|||
|
|||
self.loyalty.rules = rules; |
|||
self.loyalty.rules_by_product_id = {}; |
|||
self.loyalty.rules_by_category_id = {}; |
|||
|
|||
function update_rules(rules, rule, id) { |
|||
if (!rules[id]){ |
|||
rules[id] = [rule]; |
|||
} else if (rule.cumulative){ |
|||
rules[id].unshift(rule); |
|||
} else { |
|||
rules[id].push(rule); |
|||
} |
|||
} |
|||
|
|||
_.each(rules, function(rule) { |
|||
if (rule.type === 'product') |
|||
update_rules(self.loyalty.rules_by_product_id, rule, rule.product_id[0]) |
|||
else if (rule.type === 'category') |
|||
update_rules(self.loyalty.rules_by_category_id, rule, rule.category_id[0]); |
|||
}); |
|||
}, |
|||
},{ |
|||
model: 'loyalty.reward', |
|||
condition: function(self){ return !!self.loyalty; }, |
|||
fields: ['name','type','minimum_points','gift_product_id','point_cost','discount_product_id','discount','discount_max','point_product_id'], |
|||
domain: function(self){ return [['loyalty_program_id','=',self.loyalty.id]]; }, |
|||
loaded: function(self,rewards){ |
|||
self.loyalty.rewards = rewards; |
|||
self.loyalty.rewards_by_id = {}; |
|||
for (var i = 0; i < rewards.length;i++) { |
|||
self.loyalty.rewards_by_id[rewards[i].id] = rewards[i]; |
|||
} |
|||
}, |
|||
}, |
|||
],{'after': 'product.product'}); |
|||
|
|||
var _orderline_super = models.Orderline.prototype; |
|||
models.Orderline = models.Orderline.extend({ |
|||
get_reward: function(){ |
|||
return this.pos.loyalty.rewards_by_id[this.reward_id]; |
|||
}, |
|||
set_reward: function(reward){ |
|||
this.reward_id = reward.id; |
|||
}, |
|||
export_as_JSON: function(){ |
|||
var json = _orderline_super.export_as_JSON.apply(this, arguments); |
|||
json.reward_id = this.reward_id; |
|||
return json; |
|||
}, |
|||
init_from_JSON: function(json){ |
|||
_orderline_super.init_from_JSON.apply(this, arguments); |
|||
this.reward_id = json.reward_id; |
|||
}, |
|||
}); |
|||
|
|||
var _order_super = models.Order.prototype; |
|||
models.Order = models.Order.extend({ |
|||
|
|||
/* The total of points won, excluding the points spent on rewards */ |
|||
get_won_points: function(){ |
|||
if (!this.pos.loyalty || !this.get_client()) { |
|||
return 0; |
|||
} |
|||
|
|||
var orderLines = this.get_orderlines(); |
|||
var rounding = this.pos.loyalty.rounding; |
|||
|
|||
var product_sold = 0; |
|||
var total_sold = 0; |
|||
var total_points = 0; |
|||
|
|||
for (var i = 0; i < orderLines.length; i++) { |
|||
var line = orderLines[i]; |
|||
var product = line.get_product(); |
|||
var rules = this.pos.loyalty.rules_by_product_id[product.id] || []; |
|||
var overriden = false; |
|||
|
|||
if (line.get_reward()) { // Reward products are ignored
|
|||
continue; |
|||
} |
|||
|
|||
for (var j = 0; j < rules.length; j++) { |
|||
var rule = rules[j]; |
|||
total_points += round_pr(line.get_quantity() * rule.pp_product, rounding); |
|||
total_points += round_pr(line.get_price_with_tax() * rule.pp_currency, rounding); |
|||
// if affected by a non cumulative rule, skip the others. (non cumulative rules are put
|
|||
// at the beginning of the list when they are loaded )
|
|||
if (!rule.cumulative) { |
|||
overriden = true; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
// Test the category rules
|
|||
if ( product.pos_categ_id ) { |
|||
var category = this.pos.db.get_category_by_id(product.pos_categ_id[0]); |
|||
while (category && !overriden) { |
|||
var rules = this.pos.loyalty.rules_by_category_id[category.id] || []; |
|||
for (var j = 0; j < rules.length; j++) { |
|||
var rule = rules[j]; |
|||
total_points += round_pr(line.get_quantity() * rule.pp_product, rounding); |
|||
total_points += round_pr(line.get_price_with_tax() * rule.pp_currency, rounding); |
|||
if (!rule.cumulative) { |
|||
overriden = true; |
|||
break; |
|||
} |
|||
} |
|||
var _category = category; |
|||
category = this.pos.db.get_category_by_id(this.pos.db.get_category_parent_id(category.id)); |
|||
if (_category === category) { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (!overriden) { |
|||
product_sold += line.get_quantity(); |
|||
total_sold += line.get_price_with_tax(); |
|||
} |
|||
} |
|||
|
|||
total_points += round_pr( total_sold * this.pos.loyalty.pp_currency, rounding ); |
|||
total_points += round_pr( product_sold * this.pos.loyalty.pp_product, rounding ); |
|||
total_points += round_pr( this.pos.loyalty.pp_order, rounding ); |
|||
|
|||
return total_points; |
|||
}, |
|||
|
|||
/* The total number of points spent on rewards */ |
|||
get_spent_points: function() { |
|||
if (!this.pos.loyalty || !this.get_client()) { |
|||
return 0; |
|||
} else { |
|||
var lines = this.get_orderlines(); |
|||
var rounding = this.pos.loyalty.rounding; |
|||
var points = 0; |
|||
|
|||
for (var i = 0; i < lines.length; i++) { |
|||
var line = lines[i]; |
|||
var reward = line.get_reward(); |
|||
if (reward) { |
|||
if (reward.type === 'gift') { |
|||
points += round_pr(line.get_quantity() * reward.point_cost, rounding); |
|||
} else if (reward.type === 'discount') { |
|||
points += reward.point_cost; |
|||
} else if (reward.type === 'resale') { |
|||
points += (-line.get_quantity()); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return points; |
|||
} |
|||
}, |
|||
|
|||
/* The total number of points lost or won after the order is validated */ |
|||
get_new_points: function() { |
|||
if (!this.pos.loyalty || !this.get_client()) { |
|||
return 0; |
|||
} else { |
|||
return round_pr(this.get_won_points() - this.get_spent_points(), this.pos.loyalty.rounding); |
|||
} |
|||
}, |
|||
|
|||
/* The total number of points that the customer will have after this order is validated */ |
|||
get_new_total_points: function() { |
|||
if (!this.pos.loyalty || !this.get_client()) { |
|||
return 0; |
|||
} else { |
|||
return round_pr(this.get_client().loyalty_points + this.get_new_points(), this.pos.loyalty.rounding); |
|||
} |
|||
}, |
|||
|
|||
/* The number of loyalty points currently owned by the customer */ |
|||
get_current_points: function(){ |
|||
return this.get_client() ? this.get_client().loyalty_points : 0; |
|||
}, |
|||
|
|||
/* The total number of points spendable on rewards */ |
|||
get_spendable_points: function(){ |
|||
if (!this.pos.loyalty || !this.get_client()) { |
|||
return 0; |
|||
} else { |
|||
return round_pr(this.get_client().loyalty_points - this.get_spent_points(), this.pos.loyalty.rounding); |
|||
} |
|||
}, |
|||
|
|||
has_discount_reward: function(){ |
|||
var res = false; |
|||
var lines = this.get_orderlines(); |
|||
|
|||
for (var i = 0; i < lines.length; i++) { |
|||
var line = lines[i]; |
|||
var reward = line.get_reward(); |
|||
if (reward && reward.type === 'discount') { |
|||
res = true; |
|||
break; |
|||
} |
|||
} |
|||
return res; |
|||
}, |
|||
|
|||
/* The list of rewards that the current customer can get */ |
|||
get_available_rewards: function(){ |
|||
var client = this.get_client(); |
|||
if (!client) { |
|||
return []; |
|||
} |
|||
var rewards = []; |
|||
var discount_reward_set = this.has_discount_reward(); |
|||
for (var i = 0; i < this.pos.loyalty.rewards.length; i++) { |
|||
var reward = this.pos.loyalty.rewards[i]; |
|||
|
|||
if (reward.minimum_points > this.get_spendable_points()) { |
|||
continue; |
|||
} else if(reward.type === 'gift' && |
|||
reward.point_cost > this.get_spendable_points()) { |
|||
continue; |
|||
} else if(reward.type === 'discount' && |
|||
(discount_reward_set || reward.point_cost > this.get_spendable_points())){ |
|||
continue; |
|||
} |
|||
rewards.push(reward); |
|||
} |
|||
return rewards; |
|||
}, |
|||
|
|||
apply_reward: function(reward){ |
|||
var client = this.get_client(); |
|||
if (!client) { |
|||
return; |
|||
} else if (reward.type === 'gift') { |
|||
var product = this.pos.db.get_product_by_id(reward.gift_product_id[0]); |
|||
|
|||
if (!product) { |
|||
return; |
|||
} |
|||
|
|||
this.add_product(product, { |
|||
price: 0, |
|||
quantity: 1, |
|||
merge: false, |
|||
extras: { reward_id: reward.id }, |
|||
}); |
|||
|
|||
} else if (reward.type === 'discount') { |
|||
|
|||
var crounding = this.pos.currency.rounding; |
|||
var order_total = this.get_total_with_tax(); |
|||
var discount = round_pr(order_total * reward.discount,crounding); |
|||
var discount_max = reward.discount_max |
|||
|
|||
if (discount_max && discount > discount_max ) { |
|||
discount = discount_max; |
|||
} |
|||
|
|||
var product = this.pos.db.get_product_by_id(reward.discount_product_id[0]); |
|||
|
|||
if (!product) { |
|||
return; |
|||
} |
|||
|
|||
this.add_product(product, { |
|||
price: -discount, |
|||
quantity: 1, |
|||
merge: false, |
|||
extras: { reward_id: reward.id }, |
|||
}); |
|||
|
|||
} else if (reward.type === 'resale') { |
|||
|
|||
var lrounding = this.pos.loyalty.rounding; |
|||
var crounding = this.pos.currency.rounding; |
|||
var spendable = this.get_spendable_points(); |
|||
|
|||
var order_total = this.get_total_with_tax(); |
|||
var product = this.pos.db.get_product_by_id(reward.point_product_id[0]); |
|||
|
|||
if (!product) { |
|||
return; |
|||
} |
|||
|
|||
if ( round_pr( spendable * product.price, crounding ) > order_total ) { |
|||
spendable = round_pr( Math.floor(order_total / product.price), lrounding); |
|||
} |
|||
|
|||
if ( spendable < 0.00001 ) { |
|||
return; |
|||
} |
|||
|
|||
this.add_product(product, { |
|||
quantity: -spendable, |
|||
merge: false, |
|||
extras: { reward_id: reward.id }, |
|||
}); |
|||
} |
|||
}, |
|||
|
|||
finalize: function(){ |
|||
var client = this.get_client(); |
|||
if ( client ) { |
|||
client.loyalty_points = this.get_new_total_points(); |
|||
this.pos.gui.screen_instances.clientlist.partner_cache.clear_node(client.id); |
|||
} |
|||
_order_super.finalize.apply(this, arguments); |
|||
}, |
|||
|
|||
export_for_printing: function(){ |
|||
var json = _order_super.export_for_printing.apply(this, arguments); |
|||
if (this.pos.loyalty && this.get_client()) { |
|||
json.loyalty = { |
|||
rounding: this.pos.loyalty.rounding || 1, |
|||
name: this.pos.loyalty.name, |
|||
client: this.get_client().name, |
|||
points_won : this.get_won_points(), |
|||
points_spent: this.get_spent_points(), |
|||
points_total: this.get_new_total_points(), |
|||
}; |
|||
} |
|||
return json; |
|||
}, |
|||
|
|||
export_as_JSON: function(){ |
|||
var json = _order_super.export_as_JSON.apply(this, arguments); |
|||
json.loyalty_points = this.get_new_points(); |
|||
return json; |
|||
}, |
|||
}); |
|||
|
|||
var LoyaltyButton = screens.ActionButtonWidget.extend({ |
|||
template: 'LoyaltyButton', |
|||
button_click: function(){ |
|||
var self = this; |
|||
var order = this.pos.get_order(); |
|||
var client = order.get_client(); |
|||
if (!client) { |
|||
this.gui.show_screen('clientlist'); |
|||
return; |
|||
} |
|||
|
|||
var rewards = order.get_available_rewards(); |
|||
if (rewards.length === 0) { |
|||
this.gui.show_popup('error',{ |
|||
'title': _t('No Rewards Available'), |
|||
'body': _t('There are no rewards available for this customer as part of the loyalty program'), |
|||
}); |
|||
} else if (rewards.length === 1 && this.pos.loyalty.rewards.length === 1) { |
|||
order.apply_reward(rewards[0]); |
|||
} else { |
|||
var list = []; |
|||
for (var i = 0; i < rewards.length; i++) { |
|||
list.push({ |
|||
label: rewards[i].name, |
|||
item: rewards[i], |
|||
}); |
|||
} |
|||
this.gui.show_popup('selection',{ |
|||
'title': _t('Please select a reward'), |
|||
'list': list, |
|||
'confirm': function(reward){ |
|||
order.apply_reward(reward); |
|||
}, |
|||
}); |
|||
} |
|||
}, |
|||
}); |
|||
|
|||
screens.define_action_button({ |
|||
'name': 'loyalty', |
|||
'widget': LoyaltyButton, |
|||
'condition': function(){ |
|||
return this.pos.loyalty && this.pos.loyalty.rewards.length; |
|||
}, |
|||
}); |
|||
|
|||
screens.OrderWidget.include({ |
|||
update_summary: function(){ |
|||
this._super(); |
|||
|
|||
var order = this.pos.get_order(); |
|||
|
|||
var $loypoints = $(this.el).find('.summary .loyalty-points'); |
|||
|
|||
if(this.pos.loyalty && order.get_client()){ |
|||
var points_won = order.get_won_points(); |
|||
var points_spent = order.get_spent_points(); |
|||
var points_total = order.get_new_total_points(); |
|||
$loypoints.replaceWith($(QWeb.render('LoyaltyPoints',{ |
|||
widget: this, |
|||
rounding: this.pos.loyalty.rounding, |
|||
points_won: points_won, |
|||
points_spent: points_spent, |
|||
points_total: points_total, |
|||
}))); |
|||
$loypoints = $(this.el).find('.summary .loyalty-points'); |
|||
$loypoints.removeClass('oe_hidden'); |
|||
|
|||
if(points_total < 0){ |
|||
$loypoints.addClass('negative'); |
|||
}else{ |
|||
$loypoints.removeClass('negative'); |
|||
} |
|||
}else{ |
|||
$loypoints.empty(); |
|||
$loypoints.addClass('oe_hidden'); |
|||
} |
|||
|
|||
if (this.pos.loyalty && |
|||
order.get_client() && |
|||
this.getParent().action_buttons && |
|||
this.getParent().action_buttons.loyalty) { |
|||
|
|||
var rewards = order.get_available_rewards(); |
|||
this.getParent().action_buttons.loyalty.highlight(!!rewards.length); |
|||
} |
|||
}, |
|||
}); |
|||
}); |
@ -0,0 +1,85 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<templates id="template" xml:space="preserve"> |
|||
|
|||
<t t-name="LoyaltyPoints"> |
|||
<div class='loyalty-points'> |
|||
<div class='loyalty-points-title'>Points</div> |
|||
<t t-if='points_won'> |
|||
<div class="loyalty-points-won"> |
|||
<span class='value'>+<t t-esc='widget.format_pr(points_won,rounding)'/></span> |
|||
</div> |
|||
</t> |
|||
<t t-if='points_spent'> |
|||
<div class="loyalty-points-spent"> |
|||
<span class='value'>-<t t-esc='widget.format_pr(points_spent,rounding)'/></span> |
|||
</div> |
|||
</t> |
|||
<div class='loyalty-points-total'> |
|||
<span class='value'><t t-esc='widget.format_pr(points_total,rounding)' /></span> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
|
|||
<t t-name="LoyaltyButton"> |
|||
<div class='control-button'> |
|||
<i class='fa fa-star' /> Rewards |
|||
</div> |
|||
</t> |
|||
|
|||
<t t-extend='OrderWidget'> |
|||
<t t-jquery='.summary' t-operation='prepend'> |
|||
<div class='loyalty-points oe_hidden'>.</div> |
|||
</t> |
|||
</t> |
|||
|
|||
<t t-extend='ClientLine'> |
|||
<t t-jquery='.client-line' t-operation='append'> |
|||
<td> |
|||
<t t-esc='widget.format_pr(partner.loyalty_points || 0, widget.pos.loyalty ? widget.pos.loyalty.rounding : 1.0)' /> |
|||
</td> |
|||
</t> |
|||
</t> |
|||
|
|||
<t t-extend="XmlReceipt"> |
|||
<t t-jquery='.before-footer' t-operation='append'> |
|||
<t t-if='receipt.loyalty'> |
|||
<div class='loyalty' value-decimals='2' value-autoint='on'> |
|||
<div>--------------------------------</div> |
|||
<br/> |
|||
<div size='double-height'><t t-esc='receipt.loyalty.name'/></div> |
|||
<br /> |
|||
<div><t t-esc='receipt.loyalty.client' /></div> |
|||
<br/> |
|||
<t t-if='receipt.loyalty.points_won'> |
|||
<line><left>Points Won</left><right><value><t t-esc='receipt.loyalty.points_won' /></value></right></line> |
|||
</t> |
|||
<t t-if='receipt.loyalty.points_spent'> |
|||
<line><left>Points Spent</left><right><value><t t-esc='receipt.loyalty.points_spent' /></value></right></line> |
|||
</t> |
|||
<t t-if='receipt.loyalty.points_total'> |
|||
<line><left>Total Points</left><right><value><t t-esc='receipt.loyalty.points_total' /></value></right></line> |
|||
</t> |
|||
<br /> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</t> |
|||
|
|||
<t t-extend='ClientDetails'> |
|||
<t t-jquery='.client-details-right' t-operation='prepend'> |
|||
<div class='client-detail'> |
|||
<span class='label'>Points</span> |
|||
<span class='detail client-points'> |
|||
<t t-esc='widget.format_pr(partner.loyalty_points || 0, widget.pos.loyalty ? widget.pos.loyalty.rounding : 1.0)' /> |
|||
</span> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
|
|||
<t t-extend='ClientListScreenWidget'> |
|||
<t t-jquery='.client-list thead tr' t-operation='append'> |
|||
<th>Points</th> |
|||
</t> |
|||
</t> |
|||
|
|||
</templates> |
@ -0,0 +1,83 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="loyalty_program_form_view" model="ir.ui.view"> |
|||
<field name="name">loyalty.program.form</field> |
|||
<field name="model">loyalty.program</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Loyalty Program"> |
|||
<sheet> |
|||
<div class="oe_title"> |
|||
<label class="oe_edit_only" for="name"/> |
|||
<h1> |
|||
<field name="name" class="oe_inline"/> |
|||
</h1> |
|||
</div> |
|||
|
|||
<group> |
|||
<group> |
|||
<field name="pp_product"/> |
|||
<field name="pp_currency"/> |
|||
</group> |
|||
<group> |
|||
<field name="pp_order"/> |
|||
<field name="rounding"/> |
|||
</group> |
|||
</group> |
|||
|
|||
<separator string="Rules" colspan="4"/> |
|||
<p>Rules define how loyalty points are earned for specific products or categories</p> |
|||
<field name="rule_ids" colspan="4" nolabel="1"> |
|||
<tree string="Rules"> |
|||
<field name="name"/> |
|||
<field name="pp_product"/> |
|||
<field name="pp_currency"/> |
|||
<field name="cumulative"/> |
|||
</tree> |
|||
</field> |
|||
|
|||
<separator string="Rewards" colspan="4"/> |
|||
<p>Reward the customer with gifts or discounts for loyalty points</p> |
|||
<field name="reward_ids" colspan="4" nolabel="1"> |
|||
<tree string="Rewards"> |
|||
<field name="name"/> |
|||
<field name="type"/> |
|||
</tree> |
|||
</field> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="loyalty_program_tree_view" model="ir.ui.view"> |
|||
<field name="name">loyalty.program.tree</field> |
|||
<field name="model">loyalty.program</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Loyalty Programs"> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="loyalty_program_action" model="ir.actions.act_window"> |
|||
<field name="name">Loyalty Programs</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">loyalty.program</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click create to define a Loyalty Program. |
|||
</p> |
|||
<p> |
|||
Loyalty Programs allow you customers to earn points |
|||
and rewards when purchasing from your shops. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem parent="point_of_sale.menu_point_config_product" |
|||
action="loyalty_program_action" |
|||
id="loyalty_program_menu" |
|||
sequence="30" |
|||
groups="point_of_sale.group_pos_manager"/> |
|||
</odoo> |
@ -0,0 +1,37 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="loyalty_reward_form_view" model="ir.ui.view"> |
|||
<field name="name">loyalty.reward.form</field> |
|||
<field name="model">loyalty.reward</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Loyalty Reward"> |
|||
<div class="oe_title"> |
|||
<label class="oe_edit_only" for="name"/> |
|||
<h1> |
|||
<field name="name" class="oe_inline"/> |
|||
</h1> |
|||
</div> |
|||
<group> |
|||
<field name="type"/> |
|||
</group> |
|||
<group > |
|||
<field name="gift_product_id" |
|||
attrs="{'invisible':[('type','!=','gift')], 'required':[('type','=','gift')]}"/> |
|||
<field name="discount" |
|||
attrs="{'invisible':[('type','!=','discount')]}"/> |
|||
<field name="discount_max" |
|||
attrs="{'invisible':[('type','!=','discount')]}"/> |
|||
<field name="discount_product_id" |
|||
attrs="{'invisible':[('type','!=','discount')], 'required':[('type','=','discount')]}"/> |
|||
<field name="point_product_id" |
|||
attrs="{'invisible': [('type','!=','resale')], 'required': [('type','=','resale')]}"/> |
|||
</group> |
|||
<group> |
|||
<field name="point_cost" |
|||
attrs="{'invisible':[('type','=','resale')]}"/> |
|||
<field name="minimum_points"/> |
|||
</group> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,31 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="loyalty_rule_form_view" model="ir.ui.view"> |
|||
<field name="name">loyalty.rule.form</field> |
|||
<field name="model">loyalty.rule</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Loyalty Rule"> |
|||
<div class="oe_title"> |
|||
<label class="oe_edit_only" for="name"/> |
|||
<h1> |
|||
<field name="name" class="oe_inline"/> |
|||
</h1> |
|||
</div> |
|||
<group> |
|||
<group> |
|||
<field name="type"/> |
|||
</group> |
|||
<group> |
|||
<field name="product_id" attrs="{'invisible': [('type','!=','product')], 'required': [('type','=','product')]}"/> |
|||
<field name="category_id" attrs="{'invisible': [('type','!=','category')], 'required': [('type','=','category')]}"/> |
|||
</group> |
|||
</group> |
|||
<group col="6"> |
|||
<field name="pp_product"/> |
|||
<field name="pp_currency"/> |
|||
<field name="cumulative"/> |
|||
</group> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="pos_config_form_view" model="ir.ui.view"> |
|||
<field name="name">pos.config.form</field> |
|||
<field name="model">pos.config</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_pos_config_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//group[@name='receipt']" position="after"> |
|||
<group string="Loyalty Program" col="4"> |
|||
<field name="loyalty_id"/> |
|||
</group> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="pos_order_form_view" model="ir.ui.view"> |
|||
<field name="name">pos.order.form</field> |
|||
<field name="model">pos.order</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_pos_pos_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//page[@name='extra']" position="inside"> |
|||
<group name="loyalty" string="Loyalty Programs"> |
|||
<field name="loyalty_points"/> |
|||
</group> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0"?> |
|||
<odoo> |
|||
<record id="partner_property_form_view" model="ir.ui.view"> |
|||
<field name="name">partner.property.form</field> |
|||
<field name="model">res.partner</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_partner_property_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//group[@name='point_of_sale']" position="after"> |
|||
<group name="loyalty" string="Loyalty Programs"> |
|||
<field name="loyalty_points"/> |
|||
</group> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<template id="assets" inherit_id="point_of_sale.assets"> |
|||
<xpath expr="." position="inside"> |
|||
<script type="text/javascript" src="/pos_loyalty/static/src/js/pos.js"></script> |
|||
<link rel="stylesheet" href="/pos_loyalty/static/src/css/pos.css"/> |
|||
</xpath> |
|||
</template> |
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue