summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
Diffstat (limited to 'addons')
-rw-r--r--addons/sale_coupon/data/sale_coupon_email_data.xml12
-rw-r--r--addons/sale_coupon/models/__init__.py1
-rw-r--r--addons/sale_coupon/models/sale_coupon.py29
-rw-r--r--addons/sale_coupon/views/sale_coupon_views.xml5
-rw-r--r--addons/sale_coupon/wizard/sale_coupon_generate.py2
5 files changed, 41 insertions, 8 deletions
diff --git a/addons/sale_coupon/data/sale_coupon_email_data.xml b/addons/sale_coupon/data/sale_coupon_email_data.xml
index 9d385b9272c..6d09a51e62c 100644
--- a/addons/sale_coupon/data/sale_coupon_email_data.xml
+++ b/addons/sale_coupon/data/sale_coupon_email_data.xml
@@ -101,5 +101,17 @@
<field name="auto_delete" eval="True"/>
<field name="user_signature" eval="False"/>
</record>
+
+ <record id="expire_coupon_cron" model="ir.cron">
+ <field name="name">Coupon: expire coupon based on date</field>
+ <field name="model_id" ref="sale_coupon.model_sale_coupon"/>
+ <field name="state">code</field>
+ <field name="code">model.cron_expire_coupon()</field>
+ <field name="active" eval="True"/>
+ <field name="user_id" ref="base.user_root"/>
+ <field name="interval_number">1</field>
+ <field name="interval_type">days</field>
+ <field name="numbercall">-1</field>
+ </record>
</data>
</odoo> \ No newline at end of file
diff --git a/addons/sale_coupon/models/__init__.py b/addons/sale_coupon/models/__init__.py
index 903f2686d6d..f9faf790d5c 100644
--- a/addons/sale_coupon/models/__init__.py
+++ b/addons/sale_coupon/models/__init__.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from . import mail_compose_message
from . import sale_coupon
from . import sale_coupon_reward
from . import sale_coupon_rules
diff --git a/addons/sale_coupon/models/sale_coupon.py b/addons/sale_coupon/models/sale_coupon.py
index 4a0ae195bfc..686e697f624 100644
--- a/addons/sale_coupon/models/sale_coupon.py
+++ b/addons/sale_coupon/models/sale_coupon.py
@@ -27,16 +27,18 @@ class SaleCoupon(models.Model):
code = fields.Char(default=_generate_code, required=True, readonly=True)
expiration_date = fields.Date('Expiration Date', compute='_compute_expiration_date')
state = fields.Selection([
- ('reserved', 'Reserved'),
+ ('reserved', 'Pending'),
('new', 'Valid'),
- ('used', 'Consumed'),
- ('expired', 'Expired')
- ], required=True, default='new')
+ ('sent', 'Sent'),
+ ('used', 'Used'),
+ ('expired', 'Expired'),
+ ('cancel', 'Cancelled')
+ ], required=True, default='new')
partner_id = fields.Many2one('res.partner', "For Customer")
program_id = fields.Many2one('sale.coupon.program', "Program")
order_id = fields.Many2one('sale.order', 'Order Reference', readonly=True,
help="The sales order from which coupon is generated")
- sales_order_id = fields.Many2one('sale.order', 'Applied on order', readonly=True,
+ sales_order_id = fields.Many2one('sale.order', 'Used in', readonly=True,
help="The sales order on which the coupon is applied")
discount_line_product_id = fields.Many2one('product.product', related='program_id.discount_line_product_id', readonly=False,
help='Product used in the sales order to apply the discount.')
@@ -98,6 +100,8 @@ class SaleCoupon(models.Model):
default_template_id=template.id,
default_composition_mode='comment',
custom_layout='mail.mail_notification_light',
+ mark_coupon_as_sent=True,
+ force_email=True,
)
return {
'name': _('Compose Email'),
@@ -109,3 +113,18 @@ class SaleCoupon(models.Model):
'target': 'new',
'context': ctx,
}
+
+ def action_coupon_cancel(self):
+ for coupon in self:
+ coupon.state = 'cancel'
+
+ def cron_expire_coupon(self):
+ self._cr.execute("""
+ SELECT C.id FROM SALE_COUPON as C
+ INNER JOIN SALE_COUPON_PROGRAM as P ON C.program_id = P.id
+ WHERE C.STATE in ('reserved', 'new', 'sent')
+ AND P.validity_duration > 0
+ AND C.create_date + interval '1 day' * P.validity_duration < now()""")
+
+ expired_ids = [res[0] for res in self._cr.fetchall()]
+ self.browse(expired_ids).write({'state': 'expired'})
diff --git a/addons/sale_coupon/views/sale_coupon_views.xml b/addons/sale_coupon/views/sale_coupon_views.xml
index 2cc22c6f89b..6b7dc0e7cca 100644
--- a/addons/sale_coupon/views/sale_coupon_views.xml
+++ b/addons/sale_coupon/views/sale_coupon_views.xml
@@ -30,8 +30,9 @@
<field name="arch" type="xml">
<form string="Coupons" create="false" edit="false" delete="false">
<header>
- <button name="action_coupon_sent" type="object" string="Send by Email" class="oe_highlight"/>
- <field name="state" widget="statusbar" statusbar_visible="new,used,expired" context="{'state': state}"/>
+ <button name="action_coupon_sent" type="object" string="Send by Email" class="oe_highlight" attrs="{'invisible': [('state', 'not in', ['new', 'sent'])]}"/>
+ <button name="action_coupon_cancel" type="object" string="Cancel" class="oe_highlight" attrs="{'invisible': [('state', '!=', 'new')]}"/>
+ <field name="state" widget="statusbar" statusbar_visible="new,sent,used,expired" context="{'state': state}"/>
</header>
<sheet>
<group>
diff --git a/addons/sale_coupon/wizard/sale_coupon_generate.py b/addons/sale_coupon/wizard/sale_coupon_generate.py
index cadf07e4016..08bdfffc4e1 100644
--- a/addons/sale_coupon/wizard/sale_coupon_generate.py
+++ b/addons/sale_coupon/wizard/sale_coupon_generate.py
@@ -42,5 +42,5 @@ class SaleCouponGenerate(models.TransientModel):
@api.depends('partners_domain')
def _compute_has_partner_email(self):
for record in self:
- domain = expression.AND([safe_eval(record.partners_domain), [('email', '=', False)]])
+ domain = expression.AND([ast.literal_eval(record.partners_domain), [('email', '=', False)]])
record.has_partner_email = self.env['res.partner'].search_count(domain) == 0