diff --git a/website_coupon/README.rst b/website_coupon/README.rst new file mode 100644 index 000000000..7a614ed9e --- /dev/null +++ b/website_coupon/README.rst @@ -0,0 +1,53 @@ +Website Coupon Code v11 +======================= +Manage Website Coupon Codes for Products/Categories/All Products & Its Redeem Operations + +Features +======== + +* Create and configure vouchers for providing a discount for a single product. +* Generate a unique code for each coupon. +* Limit the usage of coupons by each user. +* Provide a validity for the coupons. +* History of coupons used by each customer. +* Create and configure vouchers for a category of products. +* Create and configure vouchers for all the products. +* The coupon cannot be applied, if the coupon value is greater than the total amount of an order. + +Installation +============ + +- www.odoo.com/documentation/11.0/setup/install.html +- Install our custom addon + +Configuration +============= + +After installing the module, go to sales and create vouchers from the vouchers menu. After voucher is created, we can +generate the coupons related to this voucher. Now go to website, go to cart and under the customize menu, enable the +voucher code option. + +License +======= +GNU LESSER GENERAL PUBLIC LICENSE, Version 3 (LGPLv3) +(http://www.gnu.org/licenses/agpl.html) + +Bug Tracker +=========== +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Credits +======= +* Cybrosys Techno Solutions + +Author +------ + +Developer: Linto CT @ cybrosys, linto@cybrosys.in + +Maintainer +---------- + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit https://www.cybrosys.com. diff --git a/website_coupon/__init__.py b/website_coupon/__init__.py new file mode 100644 index 000000000..71798ca1e --- /dev/null +++ b/website_coupon/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: LINTO C T() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## + +from . import models +from . import controllers diff --git a/website_coupon/__manifest__.py b/website_coupon/__manifest__.py new file mode 100644 index 000000000..cca70cfa5 --- /dev/null +++ b/website_coupon/__manifest__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: LINTO C T() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Website Coupon Code', + 'version': '11.0.1.0.0', + 'summary': 'Manage Website Coupon Codes for Products/Categories/All Products & Its Redeem Operations', + 'category': 'Website', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'depends': ['sale_management', 'website_sale'], + 'website': 'https://www.cybrosys.com', + 'data': [ + 'data/product_data.xml', + 'views/gift_voucher.xml', + 'views/applied_coupons.xml', + 'views/templates.xml', + 'security/ir.model.access.csv' + ], + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/website_coupon/__manifest__.py~ b/website_coupon/__manifest__.py~ new file mode 100644 index 000000000..0654e27a5 --- /dev/null +++ b/website_coupon/__manifest__.py~ @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: LINTO C T() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Website Coupon Code', + 'version': '10.0.2.0', + 'category': 'Website', + 'sequence': 56, + 'summary': 'Manage Website Coupon Codes for Products/Categories/All Products & Its Redeem Operations', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'depends': ['sale', 'website_sale'], + 'website': 'http://www.cybrosys.com', + 'data': [ + 'data/product_data.xml', + 'views/gift_voucher.xml', + 'views/applied_coupons.xml', + 'views/templates.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/website_coupon/controllers/__init__.py b/website_coupon/controllers/__init__.py new file mode 100644 index 000000000..65a8c1201 --- /dev/null +++ b/website_coupon/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main diff --git a/website_coupon/controllers/main.py b/website_coupon/controllers/main.py new file mode 100644 index 000000000..da990fbfb --- /dev/null +++ b/website_coupon/controllers/main.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from dateutil import parser + +from odoo import http, tools, _ +from odoo.http import request + + +class WebsiteCoupon(http.Controller): + + @http.route(['/shop/cart'], type='http', auth="public", website=True) + def cart(self, **post): + """This function is overwritten because we need to pass the value 'coupon_not_available' + to the template, inorder to show the error message to the user that, 'this coupon is not available'. """ + + order = request.website.sale_get_order() + if order: + from_currency = order.company_id.currency_id + to_currency = order.pricelist_id.currency_id + compute_currency = lambda price: from_currency.compute(price, to_currency) + else: + compute_currency = lambda price: price + + values = { + 'website_sale_order': order, + 'compute_currency': compute_currency, + 'suggested_products': [], + } + if order: + _order = order + if not request.env.context.get('pricelist'): + _order = order.with_context(pricelist=order.pricelist_id.id) + values['suggested_products'] = _order._cart_accessories() + + if post.get('type') == 'popover': + return request.render("website_sale.cart_popover", values) + + if post.get('code_not_available'): + values['code_not_available'] = post.get('code_not_available') + elif post.get('coupon_not_available'): + values['coupon_not_available'] = post.get('coupon_not_available') + return request.render("website_sale.cart", values) + + @http.route(['/shop/gift_coupon'], type='http', auth="public", website=True) + def gift_coupon(self, promo_voucher, **post): + """This function will be executed when we click the apply button of the voucher code in the website. + It will verify the validity and availability of that coupon. If it can be applied, the coupon will be applied + and coupon balance will also be updated""" + + curr_user = request.env.user + coupon = request.env['gift.coupon'].sudo().search([('code', '=', promo_voucher)], limit=1) + flag = True + if coupon and coupon.total_avail > 0: + applied_coupons = request.env['partner.coupon'].sudo().search([('coupon', '=', promo_voucher), + ('partner_id', '=', curr_user.partner_id.id)], limit=1) + + # checking voucher date and limit for each user for this coupon--------------------- + if coupon.partner_id: + if curr_user.partner_id.id != coupon.partner_id.id: + flag = False + today = datetime.now().date() + if flag and applied_coupons.number < coupon.limit and today <= parser.parse(coupon.voucher.expiry_date).date(): + # checking coupon validity --------------------------- + # checking date of coupon ------------ + if coupon.start_date and coupon.end_date: + if today < parser.parse(coupon.start_date).date() or today > parser.parse(coupon.end_date).date(): + flag = False + elif coupon.start_date: + if today < parser.parse(coupon.start_date).date(): + flag = False + elif coupon.end_date: + if today > parser.parse(coupon.end_date).date(): + flag = False + else: + flag = False + else: + flag = False + if flag: + voucher_type = coupon.voucher.voucher_type + voucher_val = coupon.voucher_val + type = coupon.type + coupon_product = request.env['product.product'].sudo().search([('name', '=', 'Gift Coupon')], limit=1) + if coupon_product: + order = request.website.sale_get_order(force_create=1) + flag_product = False + for line in order.order_line: + if line.product_id.name == 'Gift Coupon': + flag = False + break + if flag and order.order_line: + if voucher_type == 'product': + # the voucher type is product ---------------------------- + categ_id = coupon.voucher.product_id + for line in order.order_line: + if line.product_id.name == categ_id.name: + flag_product = True + elif voucher_type == 'category': + # the voucher type is category ---------------------------- + product_id = coupon.voucher.product_categ + for line in order.order_line: + if line.product_id.categ_id.name == product_id.name: + flag_product = True + elif voucher_type == 'all': + # the voucher is applicable to all products ---------------------------- + flag_product = True + if flag_product: + # the voucher is applicable -------------------------------------- + if type == 'fixed': + # coupon type is 'fixed'-------------------------------------- + if voucher_val < order.amount_total: + coupon_product.product_tmpl_id.write({'list_price': -voucher_val}) + + else: + return request.redirect("/shop/cart?coupon_not_available=3") + elif type == 'percentage': + # coupon type is percentage ------------------------------------- + amount_final = 0 + if voucher_type == 'product': + for line in order.order_line: + if line.product_id.name == categ_id.name: + amount_final = (voucher_val / 100) * line.price_total + break + elif voucher_type == 'category': + for line in order.order_line: + if line.product_id.categ_id.name == product_id.name: + amount_final += (voucher_val / 100) * line.price_total + elif voucher_type == 'all': + amount_final = (voucher_val/100) * order.amount_total + coupon_product.product_tmpl_id.write({'list_price': -amount_final}) + order._cart_update(product_id=coupon_product.id, set_qty=1, add_qty=1) + # updating coupon balance-------------- + total = coupon.total_avail - 1 + coupon.write({'total_avail': total}) + # creating a record for this partner, i.e he is used this coupon once----------- + if not applied_coupons: + curr_user.partner_id.write({'applied_coupon': [(0, 0, {'partner_id': curr_user.partner_id.id, + 'coupon': coupon.code, + 'number': 1})]}) + else: + applied_coupons.write({'number': applied_coupons.number + 1}) + else: + return request.redirect("/shop/cart?coupon_not_available=1") + else: + return request.redirect("/shop/cart?coupon_not_available=2") + else: + return request.redirect("/shop/cart?coupon_not_available=1") + + return request.redirect("/shop/cart") diff --git a/website_coupon/data/product_data.xml b/website_coupon/data/product_data.xml new file mode 100644 index 000000000..86681ee15 --- /dev/null +++ b/website_coupon/data/product_data.xml @@ -0,0 +1,6 @@ + + + + Gift Coupon + + diff --git a/website_coupon/i18n/fr.po b/website_coupon/i18n/fr.po new file mode 100644 index 000000000..e689e4a20 --- /dev/null +++ b/website_coupon/i18n/fr.po @@ -0,0 +1,315 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_coupon +# +# Xavier Brochard , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0-20171109\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-17 11:24+0000\n" +"PO-Revision-Date: 2017-11-17 15:04+0100\n" +"Last-Translator: Xavier Brochard \n" +"Language-Team: French <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" +"Language: fr\n" +"X-Generator: Lokalize 2.0\n" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended +msgid " Remove" +msgstr " Enlever" + +#. module: website_coupon +#: selection:gift.voucher,voucher_type:0 +msgid "All Products" +msgstr "Tous les articles" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_voucher_type +msgid "Applicable on " +msgstr "Valable sur" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.applied_coupons_view +msgid "Applied Coupons" +msgstr "" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "Apply" +msgstr "Valider" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_code +msgid "Code" +msgstr "" + +#. module: website_coupon +#: sql_constraint:gift.coupon:0 +msgid "Code already exists !" +msgstr "Ce code existe déjà!" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form +msgid "Conditions" +msgstr "Restrictions obligatoires" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_coupon +msgid "Coupon Applied" +msgstr "Code utilisé" + +#. module: website_coupon +#: model:ir.ui.menu,name:website_coupon.gift_coupon_history +msgid "Coupon History" +msgstr "Utilisation" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_res_partner_applied_coupon +#: model:ir.model.fields,field_description:website_coupon.field_res_users_applied_coupon +msgid "Coupons Applied" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_create_uid +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_create_uid +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_create_uid +msgid "Created by" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_create_date +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_create_date +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_create_date +msgid "Created on" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_display_name +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_display_name +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_end_date +msgid "End Date" +msgstr "Finit le" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_expiry_date +msgid "Expiry Date" +msgstr "Expire le" + +#. module: website_coupon +#: selection:gift.coupon,type:0 +msgid "Fixed Amount" +msgstr "Montant fixe" + +#. module: website_coupon +#: model:ir.actions.act_window,name:website_coupon.action_gift_coupon +msgid "Generate Gift Coupons" +msgstr "Créer des codes promotionnels" + +#. module: website_coupon +#: model:ir.ui.menu,name:website_coupon.gift_coupon +#: model:product.product,name:website_coupon.discount_product +#: model:product.template,name:website_coupon.discount_product_product_template +msgid "Gift Coupon" +msgstr "Code promotionel" + +#. module: website_coupon +#: model:ir.ui.menu,name:website_coupon.gift_coupon_main +msgid "Gift Coupons" +msgstr "Codes promo" + +#. module: website_coupon +#: model:ir.actions.act_window,name:website_coupon.action_gift_coupon_history +msgid "Gift Coupons History" +msgstr "Promotions utilisées" + +#. module: website_coupon +#: model:ir.ui.menu,name:website_coupon.gift_voucher +msgid "Gift Voucher" +msgstr "Promotions autorisées" + +#. module: website_coupon +#: model:ir.actions.act_window,name:website_coupon.action_gift_voucher +msgid "Gift Vouchers" +msgstr "Promotions autorisées" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "Have a voucher code? Fill this field and apply." +msgstr "Vous avez un code de réduction ? Remplissez ce champ et validez." + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_id +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_id +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_id +msgid "ID" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon___last_update +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher___last_update +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon___last_update +msgid "Last Modified on" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_write_uid +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_write_uid +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_write_date +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_write_date +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_write_date +msgid "Last Updated on" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_partner_id +msgid "Limit to a Single Partner" +msgstr "Limiter au contact" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_max_value +msgid "Maximum Voucher Value" +msgstr "Valeur de calcul maximum" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_min_value +msgid "Minimum Voucher Value" +msgstr "Valeur de calcul minimum" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_name +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_name +#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form +msgid "Name" +msgstr "Nom" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_number +msgid "Number of Times Used" +msgstr "Nombre de fois" + +#. module: website_coupon +#: model:ir.model,name:website_coupon.model_res_partner +#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_partner_id +msgid "Partner" +msgstr "Contact" + +#. module: website_coupon +#: selection:gift.coupon,type:0 +msgid "Percentage" +msgstr "Pourcentage" + +#. module: website_coupon +#: code:addons/website_coupon/models/gift_voucher.py:77 +#, python-format +msgid "Please check the voucher value" +msgstr "" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended +msgid "Price" +msgstr "Prix" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form +msgid "Pricing" +msgstr "Montant" + +#. module: website_coupon +#: selection:gift.voucher,voucher_type:0 +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_product_id +#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended +msgid "Product" +msgstr "Article" + +#. module: website_coupon +#: selection:gift.voucher,voucher_type:0 +#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_product_categ +msgid "Product Category" +msgstr "Catégorie d'articles" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended +msgid "Quantity" +msgstr "Quantité" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_start_date +msgid "Start Date" +msgstr "Débute le" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "The discount amount is too large" +msgstr "" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "This gift code is not available" +msgstr "Ce code n'est pas valable" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_total_avail +msgid "Total Available" +msgstr "Quantité totale disponible" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_limit +msgid "Total Available For Each User" +msgstr "Quantité maxi par personne" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_type +msgid "Type" +msgstr "" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_voucher +msgid "Voucher" +msgstr "Autorisation" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "Voucher Code" +msgstr "Code promo" + +#. module: website_coupon +#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_voucher_val +msgid "Voucher Value" +msgstr "Valeur de calcul" + +#. module: website_coupon +#: model:ir.ui.view,arch_db:website_coupon.voucher_code +msgid "code..." +msgstr "" + +#. module: website_coupon +#: model:ir.model,name:website_coupon.model_gift_coupon +msgid "gift.coupon" +msgstr "" + +#. module: website_coupon +#: model:ir.model,name:website_coupon.model_gift_voucher +msgid "gift.voucher" +msgstr "" + +#. module: website_coupon +#: model:ir.model,name:website_coupon.model_partner_coupon +msgid "partner.coupon" +msgstr "" + + diff --git a/website_coupon/models/__init__.py b/website_coupon/models/__init__.py new file mode 100644 index 000000000..247022186 --- /dev/null +++ b/website_coupon/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: LINTO C T() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from . import gift_voucher diff --git a/website_coupon/models/gift_voucher.py b/website_coupon/models/gift_voucher.py new file mode 100644 index 000000000..ec1b0daac --- /dev/null +++ b/website_coupon/models/gift_voucher.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies(). +# Author: LINTO C T() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import string +import random +from odoo import models, fields, api, _ +from odoo.exceptions import UserError + + +class GiftVoucher(models.Model): + _name = 'gift.voucher' + + name = fields.Char(string="Name", required=True) + voucher_type = fields.Selection( + selection=[ + ('product', 'Product'), + ('category', 'Product Category'), + ('all', 'All Products'), + ], string="Applicable on ", default='product' + ) + product_id = fields.Many2one('product.product', string="Product") + product_categ = fields.Many2one('product.category', string="Product Category") + min_value = fields.Integer(string="Minimum Voucher Value", required=True) + max_value = fields.Integer(string="Maximum Voucher Value", required=True) + expiry_date = fields.Date(string="Expiry Date", required=True) + + +class GiftCoupon(models.Model): + _name = 'gift.coupon' + + def get_code(self): + size = 7 + chars = string.ascii_uppercase + string.digits + return ''.join(random.choice(chars) for _ in range(size)) + + _sql_constraints = [ + ('name_uniq', 'unique (code)', "Code already exists !"), + ] + + name = fields.Char(string="Name", required=True) + code = fields.Char(string="Code", default=get_code) + voucher = fields.Many2one('gift.voucher', string="Voucher", required=True) + start_date = fields.Date(string="Start Date") + end_date = fields.Date(string="End Date") + partner_id = fields.Many2one('res.partner', string="Limit to a Single Partner") + limit = fields.Integer(string="Total Available For Each User", default=1) + total_avail = fields.Integer(string="Total Available", default=1) + voucher_val = fields.Float(string="Voucher Value") + type = fields.Selection([ + ('fixed', 'Fixed Amount'), + ('percentage', 'Percentage'), + ], store=True, default='fixed') + + @api.onchange('voucher_val') + def check_val(self): + if self.voucher_val > self.voucher.max_value or self.voucher_val < self.voucher.min_value: + raise UserError(_("Please check the voucher value")) + + +class CouponPartner(models.Model): + _name = 'partner.coupon' + + partner_id = fields.Many2one('res.partner', string="Partner") + coupon = fields.Char(string="Coupon Applied") + number = fields.Integer(string="Number of Times Used") + + +class PartnerExtended(models.Model): + _inherit = 'res.partner' + + applied_coupon = fields.One2many('partner.coupon', 'partner_id', string="Coupons Applied") diff --git a/website_coupon/security/ir.model.access.csv b/website_coupon/security/ir.model.access.csv new file mode 100644 index 000000000..4012abf0e --- /dev/null +++ b/website_coupon/security/ir.model.access.csv @@ -0,0 +1,10 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_website_coupon_voucher,website_coupon_gift_voucher,model_gift_voucher,sales_team.group_sale_manager,1,1,1,1 +access_website_coupon_coupon,website_coupon_gift_coupon,model_gift_coupon,sales_team.group_sale_manager,1,1,1,1 +access_website_coupon_partner,website_coupon_partner_coupon,model_partner_coupon,sales_team.group_sale_manager,1,1,1,1 +access_website_voucher_user1,website_coupon_voucher_usr1,model_gift_voucher,sales_team.group_sale_salesman_all_leads,1,0,0,0 +access_website_coupon_usr1,website_gift_coupon_usr1,model_gift_coupon,sales_team.group_sale_salesman_all_leads,1,0,0,0 +access_website_coupon_partner_usr1,website_coupon_partner_usr1,model_partner_coupon,sales_team.group_sale_salesman_all_leads,1,0,0,0 +access_website_voucher_user2,website_coupon_voucher_usr2,model_gift_voucher,sales_team.group_sale_salesman,1,0,0,0 +access_website_coupon_usr2,website_gift_coupon_usr2,model_gift_coupon,sales_team.group_sale_salesman,1,0,0,0 +access_website_coupon_partner_usr2,website_coupon_partner_usr2,model_partner_coupon,sales_team.group_sale_salesman,1,0,0,0 diff --git a/website_coupon/static/description/apply_coupon.png b/website_coupon/static/description/apply_coupon.png new file mode 100644 index 000000000..006f73d60 Binary files /dev/null and b/website_coupon/static/description/apply_coupon.png differ diff --git a/website_coupon/static/description/banner.jpg b/website_coupon/static/description/banner.jpg new file mode 100644 index 000000000..32924c0a7 Binary files /dev/null and b/website_coupon/static/description/banner.jpg differ diff --git a/website_coupon/static/description/coupon.png b/website_coupon/static/description/coupon.png new file mode 100644 index 000000000..f60126d5c Binary files /dev/null and b/website_coupon/static/description/coupon.png differ diff --git a/website_coupon/static/description/cybro_logo.png b/website_coupon/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/website_coupon/static/description/cybro_logo.png differ diff --git a/website_coupon/static/description/enable_voucher.png b/website_coupon/static/description/enable_voucher.png new file mode 100644 index 000000000..94c8a9663 Binary files /dev/null and b/website_coupon/static/description/enable_voucher.png differ diff --git a/website_coupon/static/description/history.png b/website_coupon/static/description/history.png new file mode 100644 index 000000000..797f09961 Binary files /dev/null and b/website_coupon/static/description/history.png differ diff --git a/website_coupon/static/description/index.html b/website_coupon/static/description/index.html new file mode 100644 index 000000000..d61f2fd7e --- /dev/null +++ b/website_coupon/static/description/index.html @@ -0,0 +1,170 @@ +
+
+

Website Coupon

+

..Manage Your Coupons Simply..

+

Cybrosys Technologies

+
+

+ This module by Cybrosys Technologies allows us to manage our customers in a better way by providing + discount coupons to our special customers, and thereby increase the sales. +

+
+
+ +
+
+

Features

+
+

+ ☛ Create and configure vouchers for providing a discount based on product, product category or for all products. +

+

+ ☛ Generate a unique code for each coupon. +

+

+ ☛ Limit the usage of coupons by each user. +

+

+ ☛ Provide a validity for the coupons. +

+

+ ☛ History of coupons used by each customer. +

+
+
+
+ +
+
+
+

Enable the voucher option from the website.

+
+ +
+

+ When we added some product to our cart, under the 'Customize' menu, we can see the 'Voucher Code' option. +

+
+
+
+ +
+
+
+

Apply the coupon by providing the secret code.

+
+ +
+

+ After enabling the 'Voucher Code' option, we can enter our coupon code. If that code is valid, + it will be applied to the order. The validation is based on the expiry date of the voucher, + the voucher type, coupon code entered, coupon balance, etc. + The total amount of an order can't be zero or less than, zero. After we have + entered the coupon code and pressed the apply button, the system will check the amount after + applying the coupon specified is greater than zero or not. If not, we cannot apply this coupon to this order. + In this case we will see a notification saying that this coupon is not applicable. +

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

Create and configure vouchers.

+

+ For creating a voucher, there are three options. We can create a voucher for a single product or a product category + or for the complete products. For the first option, we need to specify a product, that means, this voucher will be applicable only + if the customer has selected this product in his order. The minimum and maximum voucher values can be set here. + The expiry date indicates the validity of this voucher. +

+

+ For creating voucher for a product category, we need to select a category. In + this case, this voucher will be applicable only if the cart contains products from this category. +

+

+ The third option can be used to provide discounts for all the products. +

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

Create and configure coupons and codes.

+
+ +
+

+ When we create the coupon, a unique, auto-generated and editable code will be there for each coupon. There are mainly + two types of coupons, fixed and percentage. The fixed type is used to deduct a fixed amount from the order. The + percentage type will deduct a certain percentage of amount from the order. +

+

The total number of available coupons + and the number of times one user can use this coupon can be set here. It is also possible to limit this coupon to a single customer, + i.e, only one customer can use this coupon. +

+
+
+
+ +
+
+
+

Coupon History.

+
+ +
+

+ Under the 'Coupon History' menu, we can see the details of coupons used by all the customers. +

+
+
+
+ +
+

Need Any Help?

+ +
\ No newline at end of file diff --git a/website_coupon/static/description/unable_to_update.png b/website_coupon/static/description/unable_to_update.png new file mode 100644 index 000000000..ea912ede1 Binary files /dev/null and b/website_coupon/static/description/unable_to_update.png differ diff --git a/website_coupon/static/description/voucher_all.png b/website_coupon/static/description/voucher_all.png new file mode 100644 index 000000000..9455ea520 Binary files /dev/null and b/website_coupon/static/description/voucher_all.png differ diff --git a/website_coupon/static/description/voucher_category.png b/website_coupon/static/description/voucher_category.png new file mode 100644 index 000000000..61810282d Binary files /dev/null and b/website_coupon/static/description/voucher_category.png differ diff --git a/website_coupon/static/description/voucher_product.png b/website_coupon/static/description/voucher_product.png new file mode 100644 index 000000000..1758a552f Binary files /dev/null and b/website_coupon/static/description/voucher_product.png differ diff --git a/website_coupon/static/src/img/icon.png b/website_coupon/static/src/img/icon.png new file mode 100644 index 000000000..6a55fc088 Binary files /dev/null and b/website_coupon/static/src/img/icon.png differ diff --git a/website_coupon/views/applied_coupons.xml b/website_coupon/views/applied_coupons.xml new file mode 100644 index 000000000..9bb13cb56 --- /dev/null +++ b/website_coupon/views/applied_coupons.xml @@ -0,0 +1,46 @@ + + + + + applied_coupons_form + res.partner + + + + + + + + + + + + + + + + + + Gift Coupon History + partner.coupon + + + + + + + + + + + Gift Coupons History + partner.coupon + ir.actions.act_window + form + + tree + + + + + \ No newline at end of file diff --git a/website_coupon/views/gift_voucher.xml b/website_coupon/views/gift_voucher.xml new file mode 100644 index 000000000..bcc4c245c --- /dev/null +++ b/website_coupon/views/gift_voucher.xml @@ -0,0 +1,126 @@ + + + + + Gift Voucher + gift.voucher + +
+ + + + + + + + + + + + + +
+
+
+ + + Gift Voucher + gift.voucher + + + + + + + + + + + + + Gift Coupon + gift.coupon + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Gift Coupon + gift.coupon + + + + + + + + + + + + + + + + Gift Vouchers + gift.voucher + ir.actions.act_window + form + + tree,form + + + + Generate Gift Coupons + gift.coupon + ir.actions.act_window + form + + tree,form + + + + + +
+
\ No newline at end of file diff --git a/website_coupon/views/templates.xml b/website_coupon/views/templates.xml new file mode 100644 index 000000000..06b4c9579 --- /dev/null +++ b/website_coupon/views/templates.xml @@ -0,0 +1,98 @@ + + + + + + \ No newline at end of file