[FIX] website_event_sale: display the discounted price in website.
Add price_reduce compute method on ticket and sale order line
This commit is contained in:
parent
1a5bfdc055
commit
23f9736372
|
@ -23,6 +23,7 @@ from openerp import api
|
||||||
from openerp.fields import Integer, One2many, Html
|
from openerp.fields import Integer, One2many, Html
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
|
import openerp.addons.decimal_precision as dp
|
||||||
|
|
||||||
class product_template(osv.osv):
|
class product_template(osv.osv):
|
||||||
_inherit = 'product.template'
|
_inherit = 'product.template'
|
||||||
|
@ -180,7 +181,14 @@ class event_ticket(osv.osv):
|
||||||
current_date = fields.date.context_today(self, cr, uid, context=context)
|
current_date = fields.date.context_today(self, cr, uid, context=context)
|
||||||
return {ticket.id: ticket.deadline and ticket.deadline < current_date
|
return {ticket.id: ticket.deadline and ticket.deadline < current_date
|
||||||
for ticket in self.browse(cr, uid, ids, context=context)}
|
for ticket in self.browse(cr, uid, ids, context=context)}
|
||||||
|
|
||||||
|
def _get_price_reduce(self, cr, uid, ids, field_name, arg, context=None):
|
||||||
|
res = dict.fromkeys(ids, 0.0)
|
||||||
|
for ticket in self.browse(cr, uid, ids, context=context):
|
||||||
|
product = ticket.product_id
|
||||||
|
discount = product.lst_price and (product.lst_price - product.price) / product.lst_price or 0.0
|
||||||
|
res[ticket.id] = (1.0-discount) * ticket.price
|
||||||
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Name', required=True, translate=True),
|
'name': fields.char('Name', required=True, translate=True),
|
||||||
|
@ -189,7 +197,8 @@ class event_ticket(osv.osv):
|
||||||
'registration_ids': fields.one2many('event.registration', 'event_ticket_id', 'Registrations'),
|
'registration_ids': fields.one2many('event.registration', 'event_ticket_id', 'Registrations'),
|
||||||
'deadline': fields.date("Sales End"),
|
'deadline': fields.date("Sales End"),
|
||||||
'is_expired': fields.function(_is_expired, type='boolean', string='Is Expired'),
|
'is_expired': fields.function(_is_expired, type='boolean', string='Is Expired'),
|
||||||
'price': fields.float('Price'),
|
'price': fields.float('Price', digits_compute=dp.get_precision('Product Price')),
|
||||||
|
'price_reduce': fields.function(_get_price_reduce, type='float', string='Price Reduce', digits_compute=dp.get_precision('Product Price')),
|
||||||
'seats_max': fields.integer('Maximum Available Seats', oldname='register_max', help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )"),
|
'seats_max': fields.integer('Maximum Available Seats', oldname='register_max', help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )"),
|
||||||
'seats_reserved': fields.function(_get_seats, string='Reserved Seats', type='integer', multi='seats_reserved'),
|
'seats_reserved': fields.function(_get_seats, string='Reserved Seats', type='integer', multi='seats_reserved'),
|
||||||
'seats_available': fields.function(_get_seats, string='Available Seats', type='integer', multi='seats_reserved'),
|
'seats_available': fields.function(_get_seats, string='Available Seats', type='integer', multi='seats_reserved'),
|
||||||
|
|
|
@ -843,6 +843,11 @@ class sale_order_line(osv.osv):
|
||||||
WHERE rel.invoice_id = ANY(%s)""", (list(ids),))
|
WHERE rel.invoice_id = ANY(%s)""", (list(ids),))
|
||||||
return [i[0] for i in cr.fetchall()]
|
return [i[0] for i in cr.fetchall()]
|
||||||
|
|
||||||
|
def _get_price_reduce(self, cr, uid, ids, field_name, arg, context=None):
|
||||||
|
res = dict.fromkeys(ids, 0.0)
|
||||||
|
for line in self.browse(cr, uid, ids, context=context):
|
||||||
|
res[line.id] = line.price_subtotal / line.product_uom_qty
|
||||||
|
return res
|
||||||
|
|
||||||
_name = 'sale.order.line'
|
_name = 'sale.order.line'
|
||||||
_description = 'Sales Order Line'
|
_description = 'Sales Order Line'
|
||||||
|
@ -859,6 +864,7 @@ class sale_order_line(osv.osv):
|
||||||
}),
|
}),
|
||||||
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price'), readonly=True, states={'draft': [('readonly', False)]}),
|
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price'), readonly=True, states={'draft': [('readonly', False)]}),
|
||||||
'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute= dp.get_precision('Account')),
|
'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute= dp.get_precision('Account')),
|
||||||
|
'price_reduce': fields.function(_get_price_reduce, type='float', string='Price Reduce', digits_compute=dp.get_precision('Product Price')),
|
||||||
'tax_id': fields.many2many('account.tax', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes', readonly=True, states={'draft': [('readonly', False)]}),
|
'tax_id': fields.many2many('account.tax', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes', readonly=True, states={'draft': [('readonly', False)]}),
|
||||||
'address_allotment_id': fields.many2one('res.partner', 'Allotment Partner',help="A partner to whom the particular product needs to be allotted."),
|
'address_allotment_id': fields.many2one('res.partner', 'Allotment Partner',help="A partner to whom the particular product needs to be allotted."),
|
||||||
'product_uom_qty': fields.float('Quantity', digits_compute= dp.get_precision('Product UoS'), required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
'product_uom_qty': fields.float('Quantity', digits_compute= dp.get_precision('Product UoS'), required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||||
|
|
|
@ -23,11 +23,22 @@ from openerp import SUPERUSER_ID
|
||||||
from openerp.addons.web import http
|
from openerp.addons.web import http
|
||||||
from openerp.addons.web.http import request
|
from openerp.addons.web.http import request
|
||||||
from openerp.addons.website_event.controllers.main import website_event
|
from openerp.addons.website_event.controllers.main import website_event
|
||||||
|
from openerp.addons.website_sale.controllers.main import get_pricelist
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
|
|
||||||
|
|
||||||
class website_event(website_event):
|
class website_event(website_event):
|
||||||
|
|
||||||
|
@http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True)
|
||||||
|
def event_register(self, event, **post):
|
||||||
|
pricelist_id = int(get_pricelist())
|
||||||
|
values = {
|
||||||
|
'event': event.with_context(pricelist=pricelist_id),
|
||||||
|
'main_object': event.with_context(pricelist=pricelist_id),
|
||||||
|
'range': range,
|
||||||
|
}
|
||||||
|
return request.website.render("website_event.event_description_full", values)
|
||||||
|
|
||||||
@http.route(['/event/cart/update'], type='http', auth="public", methods=['POST'], website=True)
|
@http.route(['/event/cart/update'], type='http', auth="public", methods=['POST'], website=True)
|
||||||
def cart_update(self, event_id, **post):
|
def cart_update(self, event_id, **post):
|
||||||
cr, uid, context = request.cr, request.uid, request.context
|
cr, uid, context = request.cr, request.uid, request.context
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from openerp import SUPERUSER_ID
|
from openerp import SUPERUSER_ID
|
||||||
from openerp.osv import osv, fields
|
from openerp.osv import osv, fields
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
|
import openerp.addons.decimal_precision as dp
|
||||||
|
|
||||||
# defined for access rules
|
# defined for access rules
|
||||||
class sale_order(osv.Model):
|
class sale_order(osv.Model):
|
||||||
|
|
|
@ -19,12 +19,6 @@
|
||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template id="cart" inherit_id="website_sale.cart" name="My Cart Event's Price">
|
|
||||||
<xpath expr="//td[@name='price']/t" position="attributes">
|
|
||||||
<attribute name="t-if">abs(line.product_id.lst_price - line.price_unit) > 0.2 and not line.product_id.event_ok</attribute>
|
|
||||||
</xpath>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template id="event_description_full" inherit_id="website_event.event_description_full" customize_show="True" name="Event's Ticket form">
|
<template id="event_description_full" inherit_id="website_event.event_description_full" customize_show="True" name="Event's Ticket form">
|
||||||
<xpath expr="//div[@t-field='event.description']" position="before">
|
<xpath expr="//div[@t-field='event.description']" position="before">
|
||||||
<form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
|
<form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
|
||||||
|
@ -47,7 +41,15 @@
|
||||||
</td>
|
</td>
|
||||||
<td><span itemprop="priceValidUntil" t-field="ticket.deadline"/></td>
|
<td><span itemprop="priceValidUntil" t-field="ticket.deadline"/></td>
|
||||||
<td>
|
<td>
|
||||||
<t t-if="ticket.price or editable"><span t-field="ticket.price" t-field-options='{
|
<t t-if="ticket.price or editable">
|
||||||
|
<t t-if="(ticket.price-ticket.price_reduce) > 1">
|
||||||
|
<del class="text-danger" style="white-space: nowrap;" t-field="ticket.price" t-field-options='{
|
||||||
|
"widget": "monetary",
|
||||||
|
"from_currency": "website.currency_id",
|
||||||
|
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
|
||||||
|
}'/>&nbsp;
|
||||||
|
</t>
|
||||||
|
<span t-field="ticket.price_reduce" t-field-options='{
|
||||||
"widget": "monetary",
|
"widget": "monetary",
|
||||||
"display_currency": "website.pricelist_id.currency_id"
|
"display_currency": "website.pricelist_id.currency_id"
|
||||||
}'/>
|
}'/>
|
||||||
|
|
|
@ -102,17 +102,20 @@ class QueryURL(object):
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def get_pricelist():
|
||||||
|
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
|
||||||
|
sale_order = context.get('sale_order')
|
||||||
|
if sale_order:
|
||||||
|
pricelist = sale_order.pricelist_id
|
||||||
|
else:
|
||||||
|
partner = pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=context).partner_id
|
||||||
|
pricelist = partner.property_product_pricelist
|
||||||
|
return pricelist
|
||||||
|
|
||||||
class website_sale(http.Controller):
|
class website_sale(http.Controller):
|
||||||
|
|
||||||
def get_pricelist(self):
|
def get_pricelist(self):
|
||||||
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
|
return get_pricelist()
|
||||||
sale_order = context.get('sale_order')
|
|
||||||
if sale_order:
|
|
||||||
pricelist = sale_order.pricelist_id
|
|
||||||
else:
|
|
||||||
partner = pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=context).partner_id
|
|
||||||
pricelist = partner.property_product_pricelist
|
|
||||||
return pricelist
|
|
||||||
|
|
||||||
def get_attribute_value_ids(self, product):
|
def get_attribute_value_ids(self, product):
|
||||||
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
|
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
|
||||||
|
|
|
@ -683,15 +683,15 @@
|
||||||
<div class="text-muted" t-field="line.name"/>
|
<div class="text-muted" t-field="line.name"/>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-center" name="price">
|
<td class="text-center" name="price">
|
||||||
<t t-if="(compute_currency(line.product_id.lst_price) - line.price_unit) > 0.01">
|
<t t-if="(line.price_unit - line.price_reduce) > 1">
|
||||||
<del class="text-danger" style="white-space: nowrap;"
|
<del class="text-danger" style="white-space: nowrap;"
|
||||||
t-field="line.product_id.lst_price" t-field-options='{
|
t-field="line.price_unit" t-field-options='{
|
||||||
"widget": "monetary",
|
"widget": "monetary",
|
||||||
"from_currency": "website.currency_id",
|
"from_currency": "website.currency_id",
|
||||||
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
|
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
|
||||||
}'/>&nbsp;
|
}'/>&nbsp;
|
||||||
</t>
|
</t>
|
||||||
<span t-field="line.price_unit" style="white-space: nowrap;" t-field-options='{
|
<span t-field="line.price_reduce" style="white-space: nowrap;" t-field-options='{
|
||||||
"widget": "monetary",
|
"widget": "monetary",
|
||||||
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
|
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
|
||||||
}'/>
|
}'/>
|
||||||
|
|
Loading…
Reference in New Issue