Merge pull request #3444 from expsa/ENS-3510

Ens 3510
This commit is contained in:
abdurrahman-saber 2025-06-15 10:43:48 +03:00 committed by GitHub
commit 304a718e1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 103 additions and 4 deletions

View File

@ -7,7 +7,7 @@
'website': 'https://ensan.com',
'license': 'LGPL-3',
'category': 'Sales',
'depends': ['base', 'website_sale'],
'depends': ['base', 'website_sale', 'sms'],
'data': [
'security/ir.model.access.csv',
'data/sms_data.xml',
@ -15,5 +15,6 @@
'views/sale_order_views.xml',
'views/product_views.xml',
'views/sale_report.xml',
'views/res_config_settings_views.xml',
],
}

View File

@ -1,3 +1,6 @@
from . import sale_order
from . import product
from . import sale_report
from . import res_config_settings
from . import sms_composer
from . import website

View File

@ -181,7 +181,7 @@ class ProductTemplate_Inherit(models.Model):
# ('move_id.move_type', '=', 'out_invoice'), ('move_id.payment_state', '=', 'paid'),
# ('product_id.product_tmpl_id', '=', rec.id)
# ])
all_invoices_paid = self.env['account.move.line'].search(
all_invoices_paid = self.env['account.move.line'].sudo().search(
[
('move_id.move_type', '=', 'out_invoice'), ('move_id.payment_state', '=', 'paid'),
('product_id.product_tmpl_id', '=', rec.id)

View File

@ -0,0 +1,6 @@
from odoo import models, fields
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
cart_recovery_sms_template = fields.Many2one('sms.template', related='website_id.cart_recovery_sms_template_id', readonly=False)

View File

@ -1,4 +1,5 @@
from odoo import models, fields, api
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
from odoo.tools.json import scriptsafe as json_scriptsafe
def check_mobile_number_validation(phone):
@ -26,7 +27,7 @@ def check_mobile_number_validation(phone):
return phone
class SaleOrder_Inherit(models.Model):
class SaleOrder(models.Model):
_inherit = 'sale.order'
done_with_quick_donation = fields.Boolean(default=False)
@ -37,6 +38,7 @@ class SaleOrder_Inherit(models.Model):
is_gift = fields.Boolean("Is Gift Product?", store=True, compute="compute_gift_order")
first_receiver_number = fields.Char("Receiver Number", compute="_compute_receiver_details", store=True)
first_receiver_name = fields.Char("Receiver Name", compute="_compute_receiver_details", store=True)
cart_recovery_sms_sent = fields.Boolean('Cart recovery sms already sent')
def get_sale_order_portal_url(self):
for sale in self:
@ -124,6 +126,31 @@ class SaleOrder_Inherit(models.Model):
else:
rec.is_gift = False
def action_recovery_sms_send(self):
self.ensure_one()
if not self.order_mobile_number:
raise UserError(_("There is no phone number for this cart."))
context = dict(self.env.context)
context.update(default_res_model='sale.order', default_res_id=self.id, default_composition_mode='comment', default_number_field_name='order_mobile_number')
template = self.website_id.cart_recovery_sms_template_id
if not template:
raise ValidationError(_("There is no sms template defined in settings for abandoned carts."))
context['default_template_id'] = template.id
context['website_sale_send_recovery_sms'] = True
return {
"type": "ir.actions.act_window",
"res_model": "sms.composer",
"view_mode": 'form',
"context": context,
"name": "Send SMS Text Message",
"target": "new",
}
class ExtraDonators(models.Model):
_name = "sale.order.extra_donators"

View File

@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
from odoo import models
class SMSComposer(models.TransientModel):
_inherit = 'sms.composer'
def _action_send_sms(self):
context = self._context
if context.get('website_sale_send_recovery_sms') and self.model == 'sale.order' and context.get('active_ids'):
self.env['sale.order'].search([
('id', 'in', context.get('active_ids')),
('cart_recovery_sms_sent', '=', False),
('is_abandoned_cart', '=', True)
]).write({'cart_recovery_sms_sent': True})
return super(SMSComposer, self)._action_send_sms()

View File

@ -0,0 +1,7 @@
from odoo import models, fields
class Website(models.Model):
_inherit = 'website'
cart_recovery_sms_template_id = fields.Many2one('sms.template', string='Cart Recovery SMS', domain="[('model', '=', 'sale.order')]")

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="website.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@id='abandoned_carts_setting']//div[hasclass('content-group')][1]" position="after">
<div class="content-group"
title="This email template is required when you send a recovery sms.">
<div class="row mt16">
<label for="cart_recovery_sms_template" string="SMS Template"
class="col-lg-4 o_light_label" />
<field name="cart_recovery_sms_template" class="oe_inline" />
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -35,6 +35,22 @@
</field>
</record>
<record id="sale_order_form_add_sms_remainder" model="ir.ui.view">
<field name="name">sale.order.form.add.sms.remainder</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="website_sale.sale_order_view_form_cart_recovery"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_recovery_email_send']" position="after">
<field name="cart_recovery_sms_sent" invisible="1" />
<button name="action_recovery_sms_send"
string="Send a Recovery SMS"
type="object"
class="btn-primary"
attrs="{'invisible': ['|', ('is_abandoned_cart', '=', False), ('cart_recovery_sms_sent', '=', True)]}"/>
</xpath>
</field>
</record>
<record id="view_sales_order_filter" model="ir.ui.view">
<field name="name">sale.order.list.select</field>
<field name="model">sale.order</field>