[IMP] ensan_website_sale: product item gifting

This commit is contained in:
Abdurrahman Saber 2025-04-17 12:27:29 +02:00
parent e9f31e4134
commit 6607a679d1
30 changed files with 392 additions and 713 deletions

View File

@ -12,6 +12,7 @@
'security/ir.model.access.csv',
'data/sms_data.xml',
'views/sale_order_views.xml',
'views/product_views.xml'
'views/product_views.xml',
'views/sale_report.xml',
],
}

View File

@ -1,2 +1,3 @@
from . import sale_order
from . import product
from . import sale_report

View File

@ -1,21 +1,7 @@
from odoo import models, fields, api
from odoo.tools.json import scriptsafe as json_scriptsafe
class SaleOrder_Inherit(models.Model):
_inherit = 'sale.order'
done_with_quick_donation = fields.Boolean(default=False)
order_mobile_number = fields.Char("Donor Number")
order_name = fields.Char("Donor Name")
sale_order_portal_url = fields.Char("Sale Order Url", compute="get_sale_order_portal_url")
donators_ids = fields.One2many('sale.order.extra_donators', 'sale_id', string="Donators", store=True, readonly=True)
def get_sale_order_portal_url(self):
for sale in self:
sale.sale_order_portal_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + sale.get_portal_url()
def check_mobile_number_validation(self, phone):
def check_mobile_number_validation(phone):
if phone[0] == '+' and phone[1] != '0':
if phone[1:4] == '966':
if len(phone[4:]) >= 8:
@ -39,25 +25,53 @@ class SaleOrder_Inherit(models.Model):
phone = '+' + '966' + phone
return phone
class SaleOrder_Inherit(models.Model):
_inherit = 'sale.order'
done_with_quick_donation = fields.Boolean(default=False)
order_mobile_number = fields.Char("Donor Number")
order_name = fields.Char("Donor Name")
sale_order_portal_url = fields.Char("Sale Order Url", compute="get_sale_order_portal_url")
donators_ids = fields.One2many('sale.order.extra_donators', 'sale_id', string="Donators", store=True, readonly=True)
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)
def get_sale_order_portal_url(self):
for sale in self:
sale.sale_order_portal_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + sale.get_portal_url()
def _cart_update(self, *args, **kwargs):
res = super(SaleOrder_Inherit, self)._cart_update(*args, **kwargs)
order_line = self.env['sale.order.line'].browse(res.get('line_id'))
qty = kwargs.get('add_qty', False) or kwargs.get('set_qty', False)
if qty and order_line:
self.convert_donation_qty_to_price(order_line, qty)
if 'donators_ids' in kwargs:
order_line = self.env['sale.order.line'].browse(res.get('line_id')).sudo()
order_line.extra_donators_ids.sudo().unlink()
extra_donators_ids = []
gift_sender_name = None
gift_sender_mobile = None
for i in json_scriptsafe.loads(kwargs.get('donators_ids')):
extra_donators_ids.append((0, 0, {
'sale_id': order_line.order_id.id,
'product_id': int(i.get('product_id')),
'donated_amount': float(i.get('donated_amount')),
'donator_name': i.get('donator_name'),
'donator_mobile_number': self.check_mobile_number_validation(i.get('donator_mobile_number')).replace('+', '')
'donator_mobile_number': check_mobile_number_validation(i.get('donator_mobile_number')).replace('+', '')
}))
gift_sender_name = i.get("gift_sender_name")
gift_sender_mobile = i.get("gift_sender_mobile")
order_line.extra_donators_ids = extra_donators_ids
if gift_sender_name:
self.order_name = gift_sender_name
if gift_sender_mobile:
self.order_mobile_number = gift_sender_mobile
return res
def convert_donation_qty_to_price(self, order_line, qty):
@ -87,6 +101,29 @@ class SaleOrder_Inherit(models.Model):
)
return call_super
@api.depends('donators_ids')
def _compute_receiver_details(self):
for rec in self:
first_receiver_number = ''
first_receiver_name = ''
if rec.donators_ids:
gift_donators_id = rec.donators_ids.filtered(lambda l:l.product_id.product_tmpl_id.is_gift)
if not gift_donators_id:
gift_donators_id = rec.donators_ids
gift_donators_id = gift_donators_id[0]
first_receiver_number = gift_donators_id.donator_mobile_number
first_receiver_name = gift_donators_id.donator_name
rec.first_receiver_number = first_receiver_number
rec.first_receiver_name = first_receiver_name
@api.depends('order_line.is_gift')
def compute_gift_order(self):
for rec in self:
if rec.order_line.filtered(lambda l: l.is_gift):
rec.is_gift = True
else:
rec.is_gift = False
class ExtraDonators(models.Model):
_name = "sale.order.extra_donators"
@ -100,16 +137,17 @@ class ExtraDonators(models.Model):
sale_id = fields.Many2one("sale.order", string="Sale Order", ondelete='cascade')
product_id = fields.Many2one('product.product', string="Product", ondelete='cascade')
class SaleOrderLineInherit(models.Model):
_inherit = 'sale.order.line'
extra_donators_ids = fields.One2many('sale.order.extra_donators', 'line_id')
is_gift = fields.Boolean("Is Gift Product?", store=True)
@api.model_create_multi
def create(self, vals_list):
call_super = super(SaleOrderLineInherit, self).create(vals_list)
for line in call_super:
if line.product_id:
line.is_gift = line.product_id.is_gift
return call_super
@api.depends('product_id', 'product_uom', 'product_uom_qty')
def _compute_price_unit(self):
for line in self:
if line.product_id and line.product_id.is_donation and line.product_id.donation_type == 'Free Amount':
continue
super(SaleOrderLineInherit, line)._compute_price_unit()

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class SaleReport(models.Model):
_inherit = "sale.report"
is_gift = fields.Boolean("Order Contains Gift", readonly=True)
first_receiver_number = fields.Char("Receiver Number", readonly=True)
first_receiver_name = fields.Char("Receiver Name", readonly=True)
order_mobile_number = fields.Char("Donor Number", readonly=True)
order_name = fields.Char("Donor Name", readonly=True)
def _select_additional_fields(self, fields):
fields['is_gift'] = ", s.is_gift"
fields['first_receiver_number'] = ", s.first_receiver_number"
fields['first_receiver_name'] = ", s.first_receiver_name"
fields['order_mobile_number'] = ", s.order_mobile_number"
fields['order_name'] = ", s.order_name"
return super()._select_additional_fields(fields)
def _group_by_sale(self, groupby=''):
res = super()._group_by_sale(groupby)
res += """, s.is_gift, s.first_receiver_number,s.first_receiver_name,s.order_mobile_number,s.order_name"""
return res

View File

@ -10,6 +10,7 @@
<field name="order_name" />
<field name="order_mobile_number" />
<field name="done_with_quick_donation" readonly="1" />
<field name="is_gift" string="Order Contains Gift?" />
</xpath>
<xpath expr="//notebook" position="inside">
<page name="extra_donators" string="Donators">
@ -20,10 +21,114 @@
<field name="donated_amount" />
<field name="donator_mobile_number" />
</tree>
<form>
<group>
<field name="product_id" />
<field name="donator_name" />
<field name="donated_amount" />
<field name="donator_mobile_number" />
</group>
</form>
</field>
</page>
</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>
<field name="inherit_id" ref="sale.view_sales_order_filter" />
<field name="arch" type="xml">
<xpath expr="//field[@name='analytic_account_id']" position="after">
<field name="first_receiver_number"
filter_domain="[('first_receiver_number', 'ilike', self)]" />
<field name="first_receiver_name"
filter_domain="[('first_receiver_name', 'ilike', self)]" />
<field name="order_mobile_number"
filter_domain="[('order_mobile_number', 'ilike', self)]" />
<field name="order_name" filter_domain="[('order_name', 'ilike', self)]" />
<separator />
<filter string="Order Contains Gift?" name="is_gift"
domain="[('is_gift', '=', True)]" />
</xpath>
<xpath expr="//filter[@name='order_month']" position="after">
<separator />
<filter string="Receiver Name" name="first_receiver_name" domain="[]"
context="{'group_by': 'first_receiver_name'}" />
<filter string="Receiver Number" name="first_receiver_number" domain="[]"
context="{'group_by': 'first_receiver_number'}" />
<separator />
<filter string="Sender Name" name="order_name" domain="[]"
context="{'group_by': 'order_name'}" />
<filter string="Sender Number" name="order_mobile_number" domain="[]"
context="{'group_by': 'order_mobile_number'}" />
<separator />
</xpath>
</field>
</record>
<!--Sales
Order:- Custom Group By Gift Filters-->
<record id="sale_filter_order_mobile_number" model="ir.filters">
<field name="name">Group By Gift Sender Number</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['order_mobile_number']}</field>
</record>
<record id="sale_filter_order_name" model="ir.filters">
<field name="name">Group By Gift Sender Name</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['order_name']}</field>
</record>
<record id="sale_filter_first_receiver_number" model="ir.filters">
<field name="name">Group By Gift Receiver Number</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['first_receiver_number']}</field>
</record>
<record id="sale_filter_first_receiver_name" model="ir.filters">
<field name="name">Group By Gift Receiver Name</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['first_receiver_name']}</field>
</record>
<!--Online
Sales Report:- Custom Group By Gift Filters-->
<record id="sale_report_filter_order_mobile_number" model="ir.filters">
<field name="name">Group By Gift Sender Number</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['order_mobile_number']}</field>
</record>
<record id="sale_report_filter_order_name" model="ir.filters">
<field name="name">Group By Gift Sender Name</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['order_name']}</field>
</record>
<record id="sale_report_filter_first_receiver_number" model="ir.filters">
<field name="name">Group By Gift Receiver Number</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['first_receiver_number']}</field>
</record>
<record id="sale_report_filter_first_receiver_name" model="ir.filters">
<field name="name">Group By Gift Receiver Name</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False" />
<field name="context">{'group_by': ['first_receiver_name']}</field>
</record>
</odoo>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_report_view_search_website" model="ir.ui.view">
<field name="name">sale.report.form.view</field>
<field name="model">sale.report</field>
<field name="inherit_id" ref="website_sale.sale_report_view_search_website"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='confirmed']" position="after">
<field name="first_receiver_number" filter_domain="[('first_receiver_number', 'ilike', self)]"/>
<field name="first_receiver_name" filter_domain="[('first_receiver_name', 'ilike', self)]"/>
<field name="order_mobile_number" filter_domain="[('order_mobile_number', 'ilike', self)]"/>
<field name="order_name" filter_domain="[('order_name', 'ilike', self)]"/>
<separator/>
<filter string="Order Contains Gift?" name="is_gift" domain="[('is_gift', '=', True)]"/>
<separator/>
<filter string="Receiver Name" name="first_receiver_name" domain="[]"
context="{'group_by': 'first_receiver_name'}"/>
<filter string="Receiver Number" name="first_receiver_number" domain="[]"
context="{'group_by': 'first_receiver_number'}"/>
<separator/>
<filter string="Sender Name" name="order_name" domain="[]"
context="{'group_by': 'order_name'}"/>
<filter string="Sender Number" name="order_mobile_number" domain="[]"
context="{'group_by': 'order_mobile_number'}"/>
<separator/>
</xpath>
</field>
</record>
</odoo>

View File

@ -1 +1,2 @@
from . import controllers
from . import models

View File

@ -13,28 +13,31 @@ _logger = logging.getLogger(__name__)
class WebsiteSaleExtended(WebsiteSale):
@http.route()
def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
res = super(WebsiteSaleExtended, self).cart_update(product_id, add_qty=add_qty, set_qty=set_qty, **kw)
sale_order = request.website.sale_get_order()
# @http.route()
# def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
# res = super(WebsiteSaleExtended, self).cart_update(product_id, add_qty=add_qty, set_qty=set_qty, **kw)
# sale_order = request.website.sale_get_order()
product_custom_attribute_values = None
if kw.get('product_custom_attribute_values'):
product_custom_attribute_values = json.loads(kw.pop('product_custom_attribute_values'))
# product_custom_attribute_values = None
# if kw.get('product_custom_attribute_values'):
# product_custom_attribute_values = json.loads(kw.pop('product_custom_attribute_values'))
no_variant_attribute_values = None
if kw.get('no_variant_attribute_values'):
no_variant_attribute_values = json.loads(kw.pop('no_variant_attribute_values'))
# no_variant_attribute_values = None
# if kw.get('no_variant_attribute_values'):
# no_variant_attribute_values = json.loads(kw.pop('no_variant_attribute_values'))
sale_order._cart_update(
product_id=int(product_id),
add_qty=add_qty,
set_qty=set_qty,
product_custom_attribute_values=product_custom_attribute_values,
no_variant_attribute_values=no_variant_attribute_values,
**kw
)
return res
# sale_order._cart_update(
# product_id=int(product_id),
# add_qty=0,
# set_qty=set_qty,
# product_custom_attribute_values=product_custom_attribute_values,
# no_variant_attribute_values=no_variant_attribute_values,
# **kw
# )
# gift_redirect = 'gift_redirect' in kw and kw.pop('gift_redirect') or False
# if gift_redirect:
# return request.redirect("/shop/payment")
# return res
@http.route()
def checkout(self, **post):

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import ir_http

View File

@ -12,7 +12,7 @@ odoo.define('ensan_website_sale.payment', require => {
},
checkMobileNumberFormat: function() {
const mobileInput = this.$('#order_mobile_number');
const mobileRegex = /^(?:(\+966|00966|0)?5[0-9]{8}|5[0-9]{8})$/;
const mobileRegex = /^(?:(\+966|00966|0|966)?5[0-9]{8}|5[0-9]{8})$/;
if (mobileRegex.test(mobileInput.val())) {
mobileInput.removeClass('is-invalid').addClass('is-valid');

View File

@ -1,8 +1,7 @@
odoo.define('p_donation_gift.gift', function (require) {
odoo.define('ensan_website_sale.gift', function (require) {
"use strict";
require('web.dom_ready');
require('p_donation_theme.product-gift-card');
var publicWidget = require('web.public.widget');
const { _t } = require('web.core');
@ -114,7 +113,7 @@ odoo.define('p_donation_gift.gift', function (require) {
gift_sender_name: gift_sender_name,
gift_sender_mobile: gift_sender_number
})
gift_form.find('input[name=donate_list]').val(JSON.stringify(gift_box_list))
gift_form.find('input[name=donators_ids]').val(JSON.stringify(gift_box_list))
gift_form.find('input[name=gift_redirect]').val('/shop/payment')
gift_form.find('button[type=submit]').click()
})

View File

@ -5,11 +5,13 @@
<xpath expr="." position="inside">
<link rel="stylesheet" type="text/scss" href="/ensan_website_sale/static/src/scss/quick_donation.scss"/>
<link rel="stylesheet" type="text/scss" href="/ensan_website_sale/static/src/scss/applepay_checkout.scss"/>
<link rel="stylesheet" type="text/scss" href="/ensan_website_sale/static/src/scss/gift_popup.scss"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/checkout.js"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/quick_donation.js"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/website_sale_tracking.js"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/product_details_gifts.js"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/website_sale.js"/>
<script type="text/javascript" src="/ensan_website_sale/static/src/js/gift.js"/>
</xpath>
</template>

View File

@ -11,7 +11,8 @@
Your Name
</label>
<input type="text" id="order_name" name="order_name"
placeholder="Enter your name" />
placeholder="Enter your name"
t-att-value="website_sale_order.order_name" />
</h5>
</div>
<div class="d-flex align-items-left mt16">
@ -21,7 +22,7 @@
</label>
<input class="allow-ar-number" id="order_mobile_number"
name="order_mobile_number" placeholder="05XXXXXXXX" maxlength="10"
inputmode="numeric" />
inputmode="numeric" t-att-value="website_sale_order.order_mobile_number" />
</h5>
</div>
</div>
@ -924,7 +925,9 @@
<input name="product-tracking-info" type="hidden"
t-att-value="json.dumps(request.env['product.template'].get_google_analytics_data(combination_info))"
/> -->
<input name="product_id" t-att-value="product_variant_id" type="hidden" />
<input type="hidden" name="product_id" t-att-value="product_variant_id" />
<input type="hidden" name="donate_list" value="" />
<input type="hidden" name="gift_redirect" value="" />
</xpath>
<xpath expr="//h6[hasclass('o_wsale_products_item_title')]" position="after">
<button
@ -1116,6 +1119,13 @@
aria-label="Donate Now">
Donate Now
</button>
<a t-if="product.is_gift" style="margin:5px 0px;" id="gift_product_popup_button"
href="#" role="button"
class="gift-product-button btn btn-secondary shadow-none rounded-pill"
t-att-data-product_id="product_variant_id"
t-att-data-product_name="product.name">
<i class="fa fa-gift" />
</a>
<a style="margin:5px 0px;" id="add_to_cart" href="#" role="button"
class="a-submit btn btn-secondary shadow-none rounded-pill"
aria-label="Add to Cart">
@ -1133,4 +1143,97 @@
<xpath expr="//div[hasclass('product_price')]" position="replace" />
</template>
<template id="products" inherit_id="website_sale.products">
<xpath expr="//div[@id='products_grid']" position="inside">
<div class="modal fade" id="action_gift_product_popup" tabindex="-1" role="dialog"
aria-labelledby="GiftProductPopup" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm" role="document">
<div class="modal-content" style="border-radius:10px;">
<div class="modal-header">
<div id="gift-header">
<div class="col-sm-2">
<i class="fa fa-gift" style="font-size:2rem;" />
</div>
<div class="col-sm-9 mt-1" style="padding:0px 10px;">
<h5 class="modal-title">Donate on behalf of your family or
friends</h5>
</div>
<div class="col-sm-1 mt-1">
<button id="gift-popup-close" class="btn btn-close"
type="button" aria-label="Close" />
</div>
</div>
</div>
<div class="modal-body">
<div class="row"
style="border: 1px solid var(--o-color-1);border-radius: 10px !important;margin:1px;padding-bottom:10px">
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold">Sender
Name</label>
<input type="text"
class="form-control"
data-checkname="true" name="gift_sender_name" maxlength="25"
placeholder="Sender Name" />
<!-- <div class="valid-feedback">Valid Name!</div>-->
<div class="invalid-feedback">Invalid Name!</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold"
for="gift_sender_number">Sender Mobile</label>
<div class="mobile-container"
role="group">
<input type="text"
class="donation-input-amt payment-input form-control only-number-with-paste number-input"
inputmode="numeric" pattern="[0-9]*" autocomplete="off"
data-val="true" maxlength="10"
placeholder="05xxxxxxxx"
name="gift_sender_number" id="gift_sender_number" />
<!-- <div class="valid-feedback">Valid Number!</div>-->
<div class="invalid-feedback">Invalid Number! It Should
start with 05 and minimum length 10</div>
</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold">Receiver
Name</label>
<input type="text"
class="form-control"
data-checkname="true" name="gift_receiver_name"
maxlength="25"
placeholder="Receiver Name" />
<!-- <div class="valid-feedback">Valid Name!</div>-->
<div class="invalid-feedback">Invalid Name!</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold"
for="gift_receiver_mobile">Receiver Mobile</label>
<div class="mobile-container"
role="group">
<input type="text"
class="donation-input-amt payment-input form-control only-number-with-paste number-input"
inputmode="numeric" pattern="[0-9]*" autocomplete="off"
data-val="true" maxlength="10"
placeholder="05xxxxxxxx"
name="gift_receiver_mobile" id="gift_receiver_mobile" />
<!-- <div class="valid-feedback">Valid Number!</div>-->
<div class="invalid-feedback">Invalid Number! It Should
start with 05 and minimum length 10</div>
</div>
</div>
</div>
<div class="row" id="gift-popup-buttons">
<div class="col-sm-12 mt-3 text-center">
<a style="margin:5px 1px;" width="100%" href="#" role="button"
class="btn btn-primary shadow-none rounded-pill"
aria-label="Dedicate Now">Dedicate Now</a>
</div>
</div>
</div>
</div>
</div>
</div>
</xpath>
</template>
</odoo>

View File

@ -1,27 +0,0 @@
Odoo Proprietary License v1.0
This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).
You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).
It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.
The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models

View File

@ -1,29 +0,0 @@
# -*- coding: utf-8 -*-
{
'name': "GIFT Feature on donation platform",
'summary': 'GIFT Feature on donation platform',
'description': 'this module adds GIFT Feature in Ensan.sa interface',
'author': 'Shah Enterprise',
'maintainer': 'Shah Enterprise',
'company': 'Shah Enterprise',
'website': 'https://shahenterprise.co',
'price': 600,
'currency': 'USD',
'license': 'LGPL-3',
'category': 'Uncategorized',
'version': '16.0.1',
'depends': [
'base', 'website_sale', 'theme_prime', 'p_donation_theme'
],
'data': [
'views/website_template.xml',
'views/sale_view.xml'
],
'assets': {
'web.assets_frontend': [
'p_donation_gift/static/src/js/*.js',
'p_donation_gift/static/src/scss/*.scss',
# 'p_donation_gift/static/src/xml/gift.xml',
],
}
}

View File

@ -1 +0,0 @@
from . import main

View File

@ -1,16 +0,0 @@
from odoo import http, _
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.http import request
class WebsiteSale_Cart(WebsiteSale):
@http.route(['/shop/cart/update'], type='http', auth="public", methods=['POST'], website=True)
def cart_update(
self, product_id, add_qty=1, set_qty=0,
product_custom_attribute_values=None, no_variant_attribute_values=None,
express=False, **kwargs):
gift_redirect = 'gift_redirect' in kwargs and kwargs.pop('gift_redirect') or False
call_super = super(WebsiteSale_Cart, self).cart_update(product_id, add_qty, set_qty, product_custom_attribute_values, no_variant_attribute_values, express, **kwargs)
if gift_redirect:
return request.redirect("/shop/payment")
return call_super

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1,162 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * p_donation_gift
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-28 18:33+0000\n"
"PO-Revision-Date: 2024-05-28 18:33+0000\n"
"Last-Translator: Harshil Shah, 2024\n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "05xxxxxxxx"
msgstr ""
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Close"
msgstr ""
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Dedicate Now"
msgstr "تبرع الان"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Donate on behalf of your family or friends"
msgstr "اهدٍ من احببت اجرًا"
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_report__order_name
msgid "Donor Name"
msgstr "اسم المهدي"
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_report__order_mobile_number
msgid "Donor Number"
msgstr "رقم جوال المهدي"
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_ir_http
msgid "HTTP Routing"
msgstr "مسار HTTP"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Invalid Name!"
msgstr "الاسم خطأ"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Invalid Number! It Should start with 05 and minimum length 10"
msgstr "رقم الجوال خطأ، الصيغة الصحيحة"
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_product_product__is_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_product_template__is_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_order__is_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_order_line__is_gift
msgid "Is Gift Product?"
msgstr ""
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_report__is_gift
msgid "Order Contains Gift"
msgstr ""
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.sale_report_view_search_website
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_order_form
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_sales_order_filter
msgid "Order Contains Gift?"
msgstr ""
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_product_template
msgid "Product"
msgstr "المنتج"
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_product_product
msgid "Product Variant"
msgstr "متغير المنتج "
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_order__first_receiver_name
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_report__first_receiver_name
#: model_terms:ir.ui.view,arch_db:p_donation_gift.sale_report_view_search_website
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_sales_order_filter
msgid "Receiver Name"
msgstr "اسم المهدى له"
#. module: p_donation_gift
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_order__first_receiver_number
#: model:ir.model.fields,field_description:p_donation_gift.field_sale_report__first_receiver_number
#: model_terms:ir.ui.view,arch_db:p_donation_gift.sale_report_view_search_website
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_sales_order_filter
msgid "Receiver Number"
msgstr "رقم جوال المهدى له"
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_sale_report
msgid "Sales Analysis Report"
msgstr "تقرير المبيعات التحليلي"
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_sale_order
msgid "Sales Order"
msgstr "أمر البيع"
#. module: p_donation_gift
#: model:ir.model,name:p_donation_gift.model_sale_order_line
msgid "Sales Order Line"
msgstr "بند أمر المبيعات"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.sale_report_view_search_website
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_sales_order_filter
msgid "Sender Name"
msgstr "اسم المهدي"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.sale_report_view_search_website
#: model_terms:ir.ui.view,arch_db:p_donation_gift.view_sales_order_filter
msgid "Sender Number"
msgstr "رقم جوال المهدي"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Valid Name!"
msgstr "الاسم صحيح "
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
#. module: p_donation_gift
#. odoo-javascript
#: code:addons/p_donation_gift/static/src/js/gift.js:0
#, python-format
msgid "Please Fill out this field."
msgstr "يرجى ملئ مبلغ التبرع"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Sender Mobile"
msgstr "رقم جوال المهدي"
#. module: p_donation_gift
#: model_terms:ir.ui.view,arch_db:p_donation_gift.shop_layout
msgid "Receiver Mobile"
msgstr "رقم جوال المهدى له"

View File

@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import sale, product, sale_report, ir_http

View File

@ -1,13 +0,0 @@
from odoo import models, fields
class ProductTemplate_Inherit(models.Model):
_inherit = 'product.template'
is_gift = fields.Boolean("Is Gift Product?", default=False)
class ProductProduct_Inherit(models.Model):
_inherit = 'product.product'
is_gift = fields.Boolean("Is Gift Product?", related="product_tmpl_id.is_donation")

View File

@ -1,66 +0,0 @@
from odoo import models, fields, api
from odoo.tools.json import scriptsafe as json_scriptsafe
class SaleOrder_Inherit(models.Model):
_inherit = 'sale.order'
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)
@api.depends('donators_ids')
def _compute_receiver_details(self):
for rec in self:
first_receiver_number = ''
first_receiver_name = ''
if rec.donators_ids:
gift_donators_id = rec.donators_ids.filtered(lambda l:l.product_id.product_tmpl_id.is_gift)
if not gift_donators_id:
gift_donators_id = rec.donators_ids
gift_donators_id = gift_donators_id[0]
first_receiver_number = gift_donators_id.donator_mobile_number
first_receiver_name = gift_donators_id.donator_name
rec.first_receiver_number = first_receiver_number
rec.first_receiver_name = first_receiver_name
@api.depends('order_line.is_gift')
def compute_gift_order(self):
for rec in self:
if rec.order_line.filtered(lambda l: l.is_gift):
rec.is_gift = True
else:
rec.is_gift = False
def _cart_update(self, *args, **kwargs):
donate_list = kwargs.get('donate_list', [])
if donate_list:
donate_list = json_scriptsafe.loads(donate_list)
donate_dict = donate_list[0]
gift_sender_name = donate_dict.get("gift_sender_name")
gift_sender_mobile = donate_dict.get("gift_sender_mobile")
kwargs.pop('donate_list')
kwargs.update({
'donators_ids': json_scriptsafe.dumps([donate_dict])
})
self.write({
'order_mobile_number': gift_sender_mobile,
'order_name': gift_sender_name
})
call_super = super(SaleOrder_Inherit, self)._cart_update(*args, **kwargs)
return call_super
class SaleOrderLineInherit(models.Model):
_inherit = 'sale.order.line'
is_gift = fields.Boolean("Is Gift Product?", store=True)
@api.model_create_multi
def create(self, vals_list):
call_super = super(SaleOrderLineInherit, self).create(vals_list)
for line in call_super:
if line.product_id:
line.is_gift = line.product_id.is_gift
return call_super

View File

@ -1,27 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class SaleReport(models.Model):
_inherit = "sale.report"
is_gift = fields.Boolean("Order Contains Gift", readonly=True)
first_receiver_number = fields.Char("Receiver Number", readonly=True)
first_receiver_name = fields.Char("Receiver Name", readonly=True)
order_mobile_number = fields.Char("Donor Number", readonly=True)
order_name = fields.Char("Donor Name", readonly=True)
def _select_additional_fields(self):
res = super()._select_additional_fields()
res['is_gift'] = "s.is_gift"
res['first_receiver_number'] = "s.first_receiver_number"
res['first_receiver_name'] = "s.first_receiver_name"
res['order_mobile_number'] = "s.order_mobile_number"
res['order_name'] = "s.order_name"
return res
def _group_by_sale(self):
res = super()._group_by_sale()
res += """,
s.is_gift, s.first_receiver_number,s.first_receiver_name,s.order_mobile_number,s.order_name"""
return res

View File

@ -1,149 +0,0 @@
<odoo>
<data>
<record id="product_template_inherit_form" model="ir.ui.view">
<field name="name">product.template.form.inherit</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="p_donation_theme.product_template_inherit_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='is_quick_donation']" position="before">
<field name="is_gift"/>
</xpath>
</field>
</record>
<record id="view_order_form" model="ir.ui.view">
<field name="name">extrafield.sale.order.form.view</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="p_donation_theme.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='done_with_quick_donation']" position="after">
<field name="is_gift" string="Order Contains Gift?"/>
</xpath>
<xpath expr="//field[@name='donators_ids']" position="inside">
<form>
<group>
<field name="product_id"/>
<field name="donator_name"/>
<field name="donated_amount"/>
<field name="donator_mobile_number"/>
</group>
</form>
</xpath>
</field>
</record>
<record id="sale_report_view_search_website" model="ir.ui.view">
<field name="name">sale.report.form.view</field>
<field name="model">sale.report</field>
<field name="inherit_id" ref="website_sale.sale_report_view_search_website"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='confirmed']" position="after">
<field name="first_receiver_number" filter_domain="[('first_receiver_number', 'ilike', self)]"/>
<field name="first_receiver_name" filter_domain="[('first_receiver_name', 'ilike', self)]"/>
<field name="order_mobile_number" filter_domain="[('order_mobile_number', 'ilike', self)]"/>
<field name="order_name" filter_domain="[('order_name', 'ilike', self)]"/>
<separator/>
<filter string="Order Contains Gift?" name="is_gift" domain="[('is_gift', '=', True)]"/>
<separator/>
<filter string="Receiver Name" name="first_receiver_name" domain="[]"
context="{'group_by': 'first_receiver_name'}"/>
<filter string="Receiver Number" name="first_receiver_number" domain="[]"
context="{'group_by': 'first_receiver_number'}"/>
<separator/>
<filter string="Sender Name" name="order_name" domain="[]"
context="{'group_by': 'order_name'}"/>
<filter string="Sender Number" name="order_mobile_number" domain="[]"
context="{'group_by': 'order_mobile_number'}"/>
<separator/>
</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>
<field name="inherit_id" ref="sale.view_sales_order_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='analytic_account_id']" position="after">
<field name="first_receiver_number" filter_domain="[('first_receiver_number', 'ilike', self)]"/>
<field name="first_receiver_name" filter_domain="[('first_receiver_name', 'ilike', self)]"/>
<field name="order_mobile_number" filter_domain="[('order_mobile_number', 'ilike', self)]"/>
<field name="order_name" filter_domain="[('order_name', 'ilike', self)]"/>
<separator/>
<filter string="Order Contains Gift?" name="is_gift" domain="[('is_gift', '=', True)]"/>
</xpath>
<xpath expr="//filter[@name='order_month']" position="after">
<separator/>
<filter string="Receiver Name" name="first_receiver_name" domain="[]" context="{'group_by': 'first_receiver_name'}"/>
<filter string="Receiver Number" name="first_receiver_number" domain="[]" context="{'group_by': 'first_receiver_number'}"/>
<separator/>
<filter string="Sender Name" name="order_name" domain="[]" context="{'group_by': 'order_name'}"/>
<filter string="Sender Number" name="order_mobile_number" domain="[]" context="{'group_by': 'order_mobile_number'}"/>
<separator/>
</xpath>
</field>
</record>
<!--Sales Order:- Custom Group By Gift Filters-->
<record id="sale_filter_order_mobile_number" model="ir.filters">
<field name="name">Group By Gift Sender Number</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['order_mobile_number']}</field>
</record>
<record id="sale_filter_order_name" model="ir.filters">
<field name="name">Group By Gift Sender Name</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['order_name']}</field>
</record>
<record id="sale_filter_first_receiver_number" model="ir.filters">
<field name="name">Group By Gift Receiver Number</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['first_receiver_number']}</field>
</record>
<record id="sale_filter_first_receiver_name" model="ir.filters">
<field name="name">Group By Gift Receiver Name</field>
<field name="model_id">sale.order</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['first_receiver_name']}</field>
</record>
<!--Online Sales Report:- Custom Group By Gift Filters-->
<record id="sale_report_filter_order_mobile_number" model="ir.filters">
<field name="name">Group By Gift Sender Number</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['order_mobile_number']}</field>
</record>
<record id="sale_report_filter_order_name" model="ir.filters">
<field name="name">Group By Gift Sender Name</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['order_name']}</field>
</record>
<record id="sale_report_filter_first_receiver_number" model="ir.filters">
<field name="name">Group By Gift Receiver Number</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['first_receiver_number']}</field>
</record>
<record id="sale_report_filter_first_receiver_name" model="ir.filters">
<field name="name">Group By Gift Receiver Name</field>
<field name="model_id">sale.report</field>
<field name="domain">[('is_gift', '=', True)]</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by': ['first_receiver_name']}</field>
</record>
</data>
</odoo>

View File

@ -1,136 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="product_item_grid_3" model="ir.ui.view">
<field name="name">Product Item Grid: Donation Style</field>
<field name="type">qweb</field>
<field name="inherit_id" ref="p_donation_theme.product_item_grid_3"/>
<field name="website_id" eval="1"/>
<field name="arch" type="xml">
<xpath expr="//input[@name='csrf_token']" position="after">
<input type="hidden" name="donate_list" value=""/>
<input type="hidden" name="gift_redirect" value=""/>
</xpath>
<xpath expr="//button[@type='submit']" position="after">
<a t-if="product.is_gift" style="margin:5px 0px;" id="gift_product_popup_button" href="#" role="button"
class="gift-product-button btn btn-secondary shadow-none rounded-pill"
t-att-data-product_id="product_variant_id" t-att-data-product_name="product.name">
<i class="fa fa-gift"/>
</a>
</xpath>
<xpath expr="//input[hasclass('donation-product-detail-layout')]/.." position="attributes">
<attribute name="style"></attribute>
<attribute name="t-attf-style">margin:5px 0px; #{'width: 100%;' if product.is_gift else ''}</attribute>
</xpath>
<xpath expr="//input[hasclass('donation-product-detail-layout')]" position="attributes">
<attribute name="style"></attribute>
<attribute name="t-attf-style">text-align: center !important;
#{'width: 90px;' if not product.is_gift else ''}
</attribute>
</xpath>
</field>
</record>
<template id="payment_sale_extra_field" inherit_id="p_donation_theme.payment_sale_extra_field"
name="Gift: Order Extra Fields">
<xpath expr="//input[@name='order_name']" position="attributes">
<attribute name="t-att-value">website_sale_order.order_name</attribute>
</xpath>
<xpath expr="//input[@name='order_mobile_number']" position="attributes">
<attribute name="t-att-value">website_sale_order.order_mobile_number</attribute>
</xpath>
</template>
<record id="shop_layout" model="ir.ui.view">
<field name="name">shop_layout: Donation Style</field>
<field name="type">qweb</field>
<field name="key">p_donation_gift.shop_layout</field>
<field name="inherit_id" search="[('website_id', '=', 1), ('key', '=', 'theme_prime.shop_layout')]"/>
<field name="website_id" eval="1"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='products_grid']" position="inside">
<div class="modal fade" id="action_gift_product_popup" tabindex="-1" role="dialog"
aria-labelledby="GiftProductPopup" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm" role="document">
<div class="modal-content" style="border-radius:10px;">
<div class="modal-header">
<div id="gift-header">
<div class="col-sm-2">
<i class="fa fa-gift" style="font-size:2rem;"/>
</div>
<div class="col-sm-9 mt-1" style="padding:0px 10px;">
<h5 class="modal-title">Donate on behalf of your family or friends</h5>
</div>
<div class="col-sm-1 mt-1">
<button id="gift-popup-close" class="btn btn-close" type="button" aria-label="Close"/>
</div>
</div>
</div>
<div class="modal-body">
<div class="row"
style="border: 1px solid var(--o-color-1);border-radius: 10px !important;margin:1px;padding-bottom:10px">
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold">Sender Name</label>
<input type="text"
class="form-control"
data-checkname="true" name="gift_sender_name" maxlength="25"
placeholder="Sender Name"/>
<!-- <div class="valid-feedback">Valid Name!</div>-->
<div class="invalid-feedback">Invalid Name!</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold"
for="gift_sender_number">Sender Mobile</label>
<div class="mobile-container"
role="group">
<input type="text"
class="donation-input-amt payment-input form-control only-number-with-paste number-input"
inputmode="numeric" pattern="[0-9]*" autocomplete="off"
data-val="true" maxlength="10"
placeholder="05xxxxxxxx"
name="gift_sender_number" id="gift_sender_number"/>
<!-- <div class="valid-feedback">Valid Number!</div>-->
<div class="invalid-feedback">Invalid Number! It Should start with 05 and minimum length 10</div>
</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold">Receiver Name</label>
<input type="text"
class="form-control"
data-checkname="true" name="gift_receiver_name" maxlength="25"
placeholder="Receiver Name"/>
<!-- <div class="valid-feedback">Valid Name!</div>-->
<div class="invalid-feedback">Invalid Name!</div>
</div>
<div class="col-lg-12">
<label class="col-form-label text-primary-blue font-bold" for="gift_receiver_mobile">Receiver Mobile</label>
<div class="mobile-container"
role="group">
<input type="text"
class="donation-input-amt payment-input form-control only-number-with-paste number-input"
inputmode="numeric" pattern="[0-9]*" autocomplete="off"
data-val="true" maxlength="10"
placeholder="05xxxxxxxx"
name="gift_receiver_mobile" id="gift_receiver_mobile"/>
<!-- <div class="valid-feedback">Valid Number!</div>-->
<div class="invalid-feedback">Invalid Number! It Should start with 05 and minimum length 10</div>
</div>
</div>
</div>
<div class="row" id="gift-popup-buttons">
<div class="col-sm-12 mt-3 text-center">
<a style="margin:5px 1px;" width="100%" href="#" role="button"
class="btn btn-primary shadow-none rounded-pill"
aria-label="Dedicate Now">Dedicate Now</a>
</div>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -18,7 +18,6 @@ class Website(models.Model):
return False
else:
return True
elif min_amount_type == 'taxed':
taxed_amount = order.amount_total
if taxed_amount < float(min_checkout_amount):

View File

@ -5,7 +5,7 @@
<xpath expr="//div[hasclass('row')]/div" position="after">
<t t-set="min_amount" t-value="website.check_cart_amount()"/>
<t t-set="message" t-value="website.info_message()"/>
<div id="message" t-attf-class="col-12 #{'d-none' if min_amount else ''}">
<div id="message" t-attf-class="col-12 {{'d-none' if min_amount else ''}}">
<div class="alert alert-warning my-2">
<em>
<i class="fa fa-info-circle"/>
@ -18,7 +18,7 @@
<template id="short_cart_summary" inherit_id="website_sale.short_cart_summary">
<xpath expr="//a" position="attributes">
<attribute name="t-attf-class">btn btn-secondary float-right d-none d-xl-inline-block checkout_one #{"disabled" if not website.check_cart_amount() else ""}</attribute>
<attribute name="t-attf-class">btn btn-secondary float-right d-none d-xl-inline-block checkout_one {{"disabled" if not website.check_cart_amount() else ""}}</attribute>
</xpath>
</template>