[IMP] website_sale : onboarding. Allow user to print saleorder when confirm its command, display delivery method menu in sale and in warehouse (with access right stock.group_stock_manager and base.group_sale_manager) and improve quantity ui widget.

This commit is contained in:
jpa-odoo
2015-01-26 17:06:00 +01:00
committed by Jérome Maes
parent 4caeda8669
commit de331d5aae
9 changed files with 191 additions and 174 deletions
+29
View File
@@ -1,6 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- Create a transporter -->
<record id="res_partner_delivery" model="res.partner">
<field name="name">Transporter (Delivery provider)</field>
<field name="is_company" eval="True"/>
<field name="supplier" eval="True"/>
<field name="customer" eval="False"/>
</record>
<!-- Create a service product -->
<record id="product_product_delivery" model="product.product">
<field name="name">Standard delivery</field>
<field name="default_code">Delivery</field>
<field name="type">service</field>
<field name="categ_id" ref="product.product_category_all"/>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="image" type="base64" file="delivery/static/img/product_product_delivery-image.jpg"/>
</record>
<record id="free_delivery_carrier" model="delivery.carrier">
<field name="name">Free delivery charges</field>
<field name="normal_price">0</field>
<field name="free_if_more_than" eval="True"/>
<field name="amount">1000</field>
<field name="partner_id" ref="res_partner_delivery"/>
<field name="product_id" ref="product_product_delivery"/>
</record>
<record forcecreate="True" id="property_delivery_carrier" model="ir.property">
<field name="name">property_delivery_carrier</field>
<field name="fields_id" search="[('model','=','res.partner'),('name','=','property_delivery_carrier')]"/>
+4 -30
View File
@@ -2,54 +2,28 @@
<openerp>
<data noupdate="1">
<!-- Create a transporter -->
<record id="res_partner_23" model="res.partner">
<field name="name">The Poste</field>
<field name="is_company">1</field>
<field name="supplier">1</field>
<field eval="0" name="customer"/>
<!-- Update a transporter -->
<record id="res_partner_delivery" model="res.partner">
<field name="city">Manchester</field>
<field name="zip">06040</field>
<field model="res.country" name="country_id" search="[('code','ilike','us')]"/>
<field name="street">3958 Maxwell Street</field>
</record>
<!-- Create a service product -->
<record id="product_product_delivery" model="product.product">
<field name="name">Delivery by Poste</field>
<field name="default_code">Delivery</field>
<field name="type">service</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="image" type="base64" file="delivery/static/img/product_product_delivery-image.jpg"/>
</record>
<!-- Carrier -->
<record id="delivery_carrier" model="delivery.carrier">
<field name="name">The Poste</field>
<field name="normal_price">20</field>
<field name="partner_id" ref="res_partner_23"/>
<field name="partner_id" ref="res_partner_delivery"/>
<field name="product_id" ref="product_product_delivery"/>
<field name="use_detailed_pricelist" eval="True"/>
</record>
<record id="free_delivery_carrier" model="delivery.carrier">
<field name="name">Free delivery charges</field>
<field name="normal_price">0</field>
<field name="free_if_more_than">True</field>
<field name="amount">1000</field>
<field name="partner_id" ref="res_partner_23"/>
<field name="product_id" ref="product_product_delivery"/>
</record>
<record id="normal_delivery_carrier" model="delivery.carrier">
<field name="name">Normal Delivery Charges</field>
<field name="normal_price">10</field>
<field name="partner_id" ref="res_partner_23"/>
<field name="partner_id" ref="res_partner_delivery"/>
<field name="product_id" ref="product_product_delivery"/>
</record>
+4 -1
View File
@@ -1,7 +1,8 @@
<openerp>
<data>
<!-- Delivery Carriers -->
<menuitem id="menu_delivery" name="Delivery" parent="stock.menu_stock_configuration" groups="base.group_no_one" sequence="50"/>
<menuitem id="menu_delivery" name="Delivery" parent="stock.menu_stock_configuration" groups="stock.group_stock_manager" sequence="50"/>
<menuitem id="sale_menu_delivery" name="Delivery" parent="base.menu_base_config" groups="base.group_sale_manager" sequence="12"/>
<record id="view_delivery_carrier_tree" model="ir.ui.view">
<field name="name">delivery.carrier.tree</field>
@@ -109,6 +110,7 @@
</record>
<menuitem action="action_delivery_carrier_form" id="menu_action_delivery_carrier_form" parent="menu_delivery" sequence="1"/>
<menuitem action="action_delivery_carrier_form" id="sale_menu_action_delivery_carrier_form" parent="sale_menu_delivery" sequence="1"/>
<!-- Delivery Grids -->
<record id="view_delivery_grid_tree" model="ir.ui.view">
@@ -171,6 +173,7 @@
</field>
</record>
<menuitem action="action_delivery_grid_form" id="menu_action_delivery_grid_form" parent="menu_delivery" sequence="2"/>
<menuitem action="action_delivery_grid_form" id="sale_menu_action_delivery_grid_form" parent="sale_menu_delivery" sequence="2"/>
<record id="view_delivery_grid_line_form" model="ir.ui.view">
<field name="name">delivery.grid.line.form</field>
@@ -6,3 +6,6 @@ access_delivery_carrier_manager,delivery.carrier,model_delivery_carrier,base.gro
access_delivery_grid_manager,delivery.grid,model_delivery_grid,base.group_sale_manager,1,1,1,1
access_delivery_grid_line_manager,delivery.grid.line,model_delivery_grid_line,base.group_sale_manager,1,1,1,1
access_delivery_carrier_partner_manager,delivery.carrier partner_manager,model_delivery_carrier,base.group_partner_manager,1,0,0,0
access_delivery_carrier_stock_manager,delivery.carrier,model_delivery_carrier,stock.group_stock_manager,1,1,1,1
access_delivery_grid_stock_manager,delivery.grid,model_delivery_grid,stock.group_stock_manager,1,1,1,1
access_delivery_grid_line_stock_manager,delivery.grid.line,model_delivery_grid_line,stock.group_stock_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
6 access_delivery_grid_manager delivery.grid model_delivery_grid base.group_sale_manager 1 1 1 1
7 access_delivery_grid_line_manager delivery.grid.line model_delivery_grid_line base.group_sale_manager 1 1 1 1
8 access_delivery_carrier_partner_manager delivery.carrier partner_manager model_delivery_carrier base.group_partner_manager 1 0 0 0
9 access_delivery_carrier_stock_manager delivery.carrier model_delivery_carrier stock.group_stock_manager 1 1 1 1
10 access_delivery_grid_stock_manager delivery.grid model_delivery_grid stock.group_stock_manager 1 1 1 1
11 access_delivery_grid_line_stock_manager delivery.grid.line model_delivery_grid_line stock.group_stock_manager 1 1 1 1
+37 -41
View File
@@ -413,7 +413,7 @@ class website_sale(http.Controller):
checkout.update( self.checkout_parse("billing", order.partner_id) )
else:
checkout = self.checkout_parse('billing', data)
try:
try:
shipping_id = int(shipping_id)
except (ValueError, TypeError):
pass
@@ -757,48 +757,33 @@ class website_sale(http.Controller):
order = request.registry['sale.order'].browse(cr, SUPERUSER_ID, sale_order_id, context=context)
assert order.id == request.session.get('sale_last_order_id')
values = {}
flag = False
if not order:
return {
'state': 'error',
'message': '<p>%s</p>' % _('There seems to be an error with your request.'),
}
tx_ids = request.registry['payment.transaction'].search(
cr, SUPERUSER_ID, [
'|', ('sale_order_id', '=', order.id), ('reference', '=', order.name)
], context=context)
if not tx_ids:
if order.amount_total:
return {
'state': 'error',
'message': '<p>%s</p>' % _('There seems to be an error with your request.'),
}
else:
state = 'done'
message = '<h2>%s</h2>' % _('Your order has been confirmed, thank you for your loyalty.')
validation = None
values.update({'not_order': True, 'state': 'error'})
else:
tx = request.registry['payment.transaction'].browse(cr, SUPERUSER_ID, tx_ids[0], context=context)
state = tx.state
message = '<h2>%s</h2>' % _('Thank you for your order.')
if state == 'done':
message += '<p>%s</p>' % _('Your payment has been received.')
elif state == 'cancel':
message += '<p>%s</p>' % _('The payment seems to have been canceled.')
elif state == 'pending' and tx.acquirer_id.validation == 'manual':
message += '<p>%s</p>' % _('Your transaction is waiting confirmation.')
if tx.acquirer_id.post_msg:
message += tx.acquirer_id.post_msg
else:
message += '<p>%s</p>' % _('Your transaction is waiting confirmation.')
validation = tx.acquirer_id.validation
tx_ids = request.registry['payment.transaction'].search(
cr, SUPERUSER_ID, [
'|', ('sale_order_id', '=', order.id), ('reference', '=', order.name)
], context=context)
return {
'state': state,
'message': message,
'validation': validation
}
if not tx_ids:
if order.amount_total:
values.update({'tx_ids': False, 'state': 'error'})
else:
values.update({'tx_ids': False, 'state': 'done', 'validation': None})
else:
tx = request.registry['payment.transaction'].browse(cr, SUPERUSER_ID, tx_ids[0], context=context)
state = tx.state
flag = True if state == 'pending' and tx.acquirer_id.validation == 'automatic' else False
values.update({
'tx_ids': True,
'state': state,
'validation' : tx.acquirer_id.validation,
'tx_post_msg': tx.acquirer_id.post_msg or None
})
return {'recall': flag, 'message': request.website._render("website_sale.order_state_message", values)}
@http.route('/shop/payment/validate', type='http', auth="public", website=True)
def payment_validate(self, transaction_id=None, sale_order_id=None, **post):
@@ -870,6 +855,17 @@ class website_sale(http.Controller):
return request.website.render("website_sale.confirmation", {'order': order})
@http.route(['/shop/print'], type='http', auth="public", website=True)
def print_saleorder(self):
cr, uid, context = request.cr, SUPERUSER_ID, request.context
sale_order_id = request.session.get('sale_last_order_id')
if sale_order_id:
pdf = request.registry['report'].get_pdf(cr, uid, [sale_order_id], 'sale.report_saleorder', data=None, context=context)
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
return request.make_response(pdf, headers=pdfhttpheaders)
else:
return request.redirect('/shop')
#------------------------------------------------------
# Edit
#------------------------------------------------------
@@ -953,4 +949,4 @@ class website_sale(http.Controller):
'currency': order.currency_id.name
}
ret['lines'] = self.order_lines_2_google_api(order.order_line)
return ret
return ret
@@ -63,7 +63,7 @@ $('.oe_website_sale').each(function () {
$(oe_website_sale).on('click', 'a.js_add_cart_json', function (ev) {
ev.preventDefault();
var $link = $(ev.currentTarget);
var $input = $link.parent().parent().find("input");
var $input = $link.parent().find("input");
var min = parseFloat($input.data("min") || 0);
var max = parseFloat($input.data("max") || Infinity);
var quantity = ($link.has(".fa-minus").length ? -1 : 1) + parseFloat($input.val(),10);
@@ -4,24 +4,17 @@ $(document).ready(function () {
function payment_transaction_poll_status() {
var order_node = $('div.oe_website_sale_tx_status');
if (! order_node || order_node.data('orderId') === undefined) {
if (! order_node || order_node.data('order-id') === undefined) {
return;
}
var order_id = order_node.data('orderId');
var order_id = order_node.data('order-id');
return openerp.jsonRpc('/shop/payment/get_status/' + order_id, 'call', {
}).then(function (result) {
var tx_node = $('div.oe_website_sale_tx_status');
_poll_nbr += 1;
if (result.state == 'pending' && result.validation == 'automatic' && _poll_nbr <= 5) {
var txt = result.mesage;
setTimeout(function () {
payment_transaction_poll_status();
}, 1000);
if(result.recall && _poll_nbr <= 5){
setTimeout(function () { payment_transaction_poll_status(); }, 1000);
}
else {
var txt = result.message;
}
tx_node.html(txt);
$('div.oe_website_sale_tx_status').html(result.message);
});
}
+102 -79
View File
@@ -287,7 +287,7 @@
<div class="row">
<div class="col-sm-4">
<ol class="breadcrumb">
<li><a t-att-href="keep(category=0)" onclick="history.go(-1); return false;">Products</a></li>
<li><a t-att-href="keep(category=0)">Products</a></li>
<li t-if="category"><a t-att-href="keep('/shop/category/%s' % slug(category), category=0)" t-field="category.name"/></li>
<li class="active"><span t-field="product.name"/></li>
</ol>
@@ -351,17 +351,13 @@
<template id="product_quantity" inherit_id="website_sale.product" customize_show="True" name="Select Quantity">
<xpath expr="//a[@id='add_to_cart']" position="before">
<div class="css_quantity input-group oe_website_spinner">
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 js_add_cart_json">
<i class="fa fa-minus"></i>
</a>
</span>
<input type="text" class="js_quantity form-control" data-min="1" name="add_qty" value="1"/>
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 float_left js_add_cart_json">
<i class="fa fa-plus"></i>
</a>
</span>
<a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json">
<i class="fa fa-minus"></i>
</a>
<input type="text" class="form-control" data-min="1" name="add_qty" value="1"/>
<a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json">
<i class="fa fa-plus"></i>
</a>
</div>
</xpath>
</template>
@@ -638,20 +634,16 @@
</td>
<td class="text-center">
<div class="input-group oe_website_spinner">
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 js_add_cart_json" data-no-instant="">
<i class="fa fa-minus"></i>
</a>
</span>
<a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json" data-no-instant="">
<i class="fa fa-minus"></i>
</a>
<input type="text" class="js_quantity form-control"
t-att-data-line-id="line.id"
t-att-data-line-id="line.id"
t-att-data-product-id="line.product_id.id"
t-att-value="int(line.product_uom_qty)"/>
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 float_left js_add_cart_json" data-no-instant="">
<i class="fa fa-plus"></i>
</a>
</span>
<a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json" data-no-instant="">
<i class="fa fa-plus"></i>
</a>
</div>
</td>
</tr>
@@ -1083,61 +1075,69 @@
</ul>
<h1 class="mb32">Order <em t-field="order.name"/> Confirmed</h1>
<div class="row">
<div class="col-md-8 oe_cart">
<div class="oe_website_sale_tx_status" t-att-data-order-id="order.id">
</div>
<h3 class="mt32"><strong>Order Details:</strong></h3>
<table class="table">
<thead>
<tr>
<th>Products</th>
<th>Quantity</th>
<th class="text-right" width="100">Unit Price</th>
<th class="text-right" width="100">Subtotal</th>
</tr>
</thead>
<tbody>
<tr t-foreach="order.order_line" t-as="line">
<td>
<div>
<a t-attf-href="/shop/product/#{ slug(line.product_id.product_tmpl_id) }">
<strong t-esc="line.product_id.name_get()[0][1]"/>
</a>
</div>
<div class="text-muted" t-field="line.name"/>
</td>
<td>
<div id="quote_qty">
<span t-field="line.product_uom_qty"/>
<span t-field="line.product_uom"/>
</div>
</td>
<td>
<strong class="text-right">
<div t-field="line.price_unit"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</strong>
</td>
<td>
<div class="text-right"
t-field="line.price_subtotal"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr>
<td></td><td></td>
<td class="text-right"><strong>Total:</strong></td>
<td class="text-right">
<strong t-field="order.amount_total"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
<div class="clearfix"/>
<div class="oe_structure"/>
<div class="col-md-8">
<div class="thanks_msg">
<h2>Thank you for your order.
<a class="btn btn-primary pull-right" href="/shop/print" target="_blank">
<i class="fa fa-print"></i> Print
</a>
</h2>
<div class="oe_website_sale_tx_status" t-att-data-order-id="order.id"></div>
</div>
<div class="oe_cart">
<h3 class="mt32 text-left"><strong>Order Details:</strong></h3>
<table class="table">
<thead>
<tr>
<th>Products</th>
<th>Quantity</th>
<th class="text-right" width="100">Unit Price</th>
<th class="text-right" width="100">Subtotal</th>
</tr>
</thead>
<tbody>
<tr t-foreach="order.order_line" t-as="line">
<td>
<div>
<a t-attf-href="/shop/product/#{ slug(line.product_id.product_tmpl_id) }">
<strong t-esc="line.product_id.name_get()[0][1]"/>
</a>
</div>
<div class="text-muted" t-field="line.name"/>
</td>
<td>
<div id="quote_qty">
<span t-field="line.product_uom_qty"/>
<span t-field="line.product_uom"/>
</div>
</td>
<td>
<strong class="text-right">
<div t-field="line.price_unit"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</strong>
</td>
<td>
<div class="text-right"
t-field="line.price_subtotal"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr>
<td></td><td></td>
<td class="text-right"><strong>Total:</strong></td>
<td class="text-right">
<strong t-field="order.amount_total"
t-field-options='{"widget": "monetary", "display_currency": "order.pricelist_id.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
<div class="clearfix"/>
<div class="oe_structure"/>
</div>
</div>
<div class="col-md-3 col-md-offset-1 text-muted" id="right_column">
<div class="col-md-3 col-md-offset-1 text-muted">
<h4>Bill To:</h4>
<div t-field="order.partner_invoice_id" t-field-options='{
"widget": "contact",
@@ -1163,8 +1163,31 @@
</t>
</template>
<!-- Page Shop my cart and payment total -->
<template id="order_state_message" name="Order State Message">
<t t-if="(not_order and state == 'error') or (not tx_ids and state == 'error')">
<p>There seems to be an error with your request.</p>
</t>
<t t-if="not tx_ids and state == 'done'">
<p>Your order has been confirmed, thank you for your loyalty.</p>
</t>
<t t-if="tx_ids and state == 'done'">
<p>Your payment has been received.</p>
</t>
<t t-if="tx_ids and state == 'cancel'">
<p>The payment seems to have been canceled.</p>
</t>
<t t-if="tx_ids and state == 'pending' and validation == 'manual'">
<p>Your transaction is waiting confirmation.</p><br />
<t t-if="tx_post_msg">
<div class="hidden-print"><t t-raw="tx_post_msg"/></div>
</t>
</t>
<t t-if="tx_ids and state not in ['done', 'cancel', 'pending']">
<p>Your transaction is waiting confirmation.</p>
</t>
</template>
<!-- Page Shop my cart and payment total -->
<template id="total">
<table class='pull-right mb16' id="cart_total" t-if="website_sale_order">
<thead>
@@ -1356,7 +1379,7 @@
<template id="sales_backend_access" inherit_id='website_sale.orders_followup' customize_show="True" name="Backend Access">
<xpath expr="//div[@class='container oe_website_sale']" position="before">
<h4 class="text-muted text-center mt64 mb64">
If you wish to access the complete application to manage your orders, you can follow
If you wish to access the complete application to manage your orders, you can follow
<a href="/web#action=portal_sale.action_orders_portal">this link</a>.
</h4>
</xpath>
@@ -72,17 +72,13 @@
</td>
<td>
<div class="input-group oe_website_spinner">
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 js_add_cart_json">
<i class="fa fa-minus"></i>
</a>
</span>
<a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json">
<i class="fa fa-minus"></i>
</a>
<input type="text" class="js_quantity form-control" data-min="1" name="add_qty" value="1"/>
<span class="input-group-addon">
<a t-attf-href="#" class="mb8 float_left js_add_cart_json">
<i class="fa fa-plus"></i>
</a>
</span>
<a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json">
<i class="fa fa-plus"></i>
</a>
</div>
</td>
</tr>