[FIX] sale, _management: portal sale order optional products

Forward Port 0c46c8a929 from v10.0
has dome flows, namely, the new feature of grouping the taxes by tax group was not supported

Now it is supported: when modifying an optional product's quantity, every field is updated with the new values

OPW 1974708

closes odoo/odoo#32980

Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
This commit is contained in:
Lucas Perais (lpe)
2019-04-29 07:46:39 +00:00
parent 9c4b52000f
commit c7773f9f72
4 changed files with 92 additions and 12 deletions
+14
View File
@@ -48,6 +48,7 @@ msgstr ""
#. module: sale #. module: sale
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document #: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content_totals_table
msgid "&amp;nbsp;<span>on</span>&amp;nbsp;" msgid "&amp;nbsp;<span>on</span>&amp;nbsp;"
msgstr "" msgstr ""
@@ -220,6 +221,12 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Sold</span>" msgid "<span class=\"o_stat_text\">Sold</span>"
msgstr "" msgstr ""
#. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
msgid "<span groups=\"account.group_show_line_subtotals_tax_excluded\">Amount</span>\n"
" <span groups=\"account.group_show_line_subtotals_tax_included\">Total Price</span>"
msgstr ""
#. module: sale #. module: sale
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template
msgid "<span>Accepted on the behalf of:</span>" msgid "<span>Accepted on the behalf of:</span>"
@@ -331,6 +338,7 @@ msgstr ""
#. module: sale #. module: sale
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document #: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content_totals_table
msgid "<strong>Subtotal</strong>" msgid "<strong>Subtotal</strong>"
msgstr "" msgstr ""
@@ -362,6 +370,7 @@ msgstr ""
#. module: sale #. module: sale
#: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document #: model_terms:ir.ui.view,arch_db:sale.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content
#: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_content_totals_table
msgid "<strong>Total</strong>" msgid "<strong>Total</strong>"
msgstr "" msgstr ""
@@ -3062,6 +3071,11 @@ msgstr ""
msgid "Sell and purchase products in different units of measure" msgid "Sell and purchase products in different units of measure"
msgstr "" msgstr ""
#. module: sale
#: model:ir.model.fields,field_description:sale.field_res_config_settings__module_website_sale_digital
msgid "Sell digital products - provide downloadable content on your customer portal"
msgstr ""
#. module: sale #. module: sale
#: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form
msgid "Sell products by multiple of unit # per package" msgid "Sell products by multiple of unit # per package"
+50 -5
View File
@@ -127,7 +127,7 @@
<t t-set="classes" t-value="'col-lg-auto d-print-none'"/> <t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
<t t-set="title"> <t t-set="title">
<h2 class="mb-0"><b t-field="sale_order.amount_total"/> </h2> <h2 class="mb-0"><b t-field="sale_order.amount_total" data-id="total_amount"/> </h2>
</t> </t>
<t t-set="entries"> <t t-set="entries">
<ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column"> <ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column">
@@ -167,14 +167,15 @@
<b t-field="sale_order.amount_undiscounted" <b t-field="sale_order.amount_undiscounted"
t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}' t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'
style="text-decoration: line-through" style="text-decoration: line-through"
class="d-block mt-1"/> class="d-block mt-1"
data-id="amount_undiscounted" />
</small> </small>
<t t-if="sale_order.amount_untaxed == sale_order.amount_total"> <t t-if="sale_order.amount_untaxed == sale_order.amount_total">
<h4 t-field="sale_order.amount_total" class="text-success"/> <h4 t-field="sale_order.amount_total" class="text-success" data-id="total_amount"/>
</t> </t>
<t t-else=""> <t t-else="">
<h4 t-field="sale_order.amount_untaxed" class="text-success mb-0"/> <h4 t-field="sale_order.amount_untaxed" class="text-success mb-0" data-id="total_untaxed"/>
<small>(<span t-field="sale_order.amount_total"/> Incl. tax)</small> <small>(<span t-field="sale_order.amount_total" data-id="total_amount"/> Incl. tax)</small>
</t> </t>
</li> </li>
</t> </t>
@@ -519,6 +520,7 @@
<div id="total" class="row" name="total" style="page-break-inside: avoid;"> <div id="total" class="row" name="total" style="page-break-inside: avoid;">
<div t-attf-class="#{'col-4' if report_type != 'html' else 'col-sm-7 col-md-5'} ml-auto"> <div t-attf-class="#{'col-4' if report_type != 'html' else 'col-sm-7 col-md-5'} ml-auto">
<!-- Should be replaced in master by t-call="sale.sale_order_portal_content_totals_table" -->
<table class="table table-sm"> <table class="table table-sm">
<tr class="border-black" style="border-bottom:1px solid #dddddd;"> <tr class="border-black" style="border-bottom:1px solid #dddddd;">
<td><strong>Subtotal</strong></td> <td><strong>Subtotal</strong></td>
@@ -582,4 +584,47 @@
</div> </div>
</template> </template>
<template id="sale_order_portal_content_totals_table">
<table class="table table-sm">
<tr class="border-black">
<td><strong>Subtotal</strong></td>
<td class="text-right">
<span
data-id="total_untaxed"
t-field="sale_order.amount_untaxed"
t-options='{"widget": "monetary","display_currency": sale_order.pricelist_id.currency_id}'
/>
</td>
</tr>
<t t-foreach="sale_order.amount_by_group" t-as="amount_by_group">
<tr>
<t t-if="amount_by_group[3] == 1 and sale_order.amount_untaxed == amount_by_group[2]">
<td>
<span t-esc="amount_by_group[0]"/>
<span>&amp;nbsp;<span>on</span>&amp;nbsp;<t t-esc="amount_by_group[2]" t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'/></span>
</td>
<td class="text-right">
<span t-esc="amount_by_group[1]"
t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'/>
</td>
</t>
<t t-else ="">
<td>
<span t-esc="amount_by_group[0]"/>
</td>
<td class="text-right">
<span t-esc="amount_by_group[1]"
t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'/>
</td>
</t>
</tr>
</t>
<tr class="border-black">
<td><strong>Total</strong></td>
<td class="text-right">
<span data-id="total_amount" t-field="sale_order.amount_total" t-options='{"widget": "monetary", "display_currency": sale_order.pricelist_id.currency_id}'/>
</td>
</tr>
</table>
</template>
</odoo> </odoo>
+8 -1
View File
@@ -47,14 +47,21 @@ class CustomerPortal(CustomerPortal):
currency = order_sudo.currency_id currency = order_sudo.currency_id
format_price = partial(formatLang, request.env, digits=currency.decimal_places) format_price = partial(formatLang, request.env, digits=currency.decimal_places)
return { results = {
'order_line_product_uom_qty': str(quantity), 'order_line_product_uom_qty': str(quantity),
'order_line_price_total': format_price(order_line.price_total), 'order_line_price_total': format_price(order_line.price_total),
'order_line_price_subtotal': format_price(order_line.price_subtotal), 'order_line_price_subtotal': format_price(order_line.price_subtotal),
'order_amount_total': format_price(order_sudo.amount_total), 'order_amount_total': format_price(order_sudo.amount_total),
'order_amount_untaxed': format_price(order_sudo.amount_untaxed), 'order_amount_untaxed': format_price(order_sudo.amount_untaxed),
'order_amount_tax': format_price(order_sudo.amount_tax), 'order_amount_tax': format_price(order_sudo.amount_tax),
'order_amount_undiscounted': format_price(order_sudo.amount_undiscounted),
} }
try:
results['order_totals_table'] = request.env['ir.ui.view'].render_template('sale.sale_order_portal_content_totals_table', {'sale_order': order_sudo})
except ValueError:
pass
return results
@http.route(["/my/orders/<int:order_id>/add_option/<int:option_id>"], type='http', auth="public", website=True) @http.route(["/my/orders/<int:order_id>/add_option/<int:option_id>"], type='http', auth="public", website=True)
def add(self, order_id, option_id, access_token=None, **post): def add(self, order_id, option_id, access_token=None, **post):
@@ -39,7 +39,7 @@ if (!$('.o_portal_sale_sidebar').length) {
var order_id = href.match(/my\/orders\/([0-9]+)/); var order_id = href.match(/my\/orders\/([0-9]+)/);
var line_id = href.match(/update_line\/([0-9]+)/); var line_id = href.match(/update_line\/([0-9]+)/);
var params = { var params = {
'line_id': line_id[1], 'line_id': parseInt(line_id[1]),
'remove': this.$el.is('[href*="remove"]'), 'remove': this.$el.is('[href*="remove"]'),
'unlink': this.$el.is('[href*="unlink"]'), 'unlink': this.$el.is('[href*="unlink"]'),
'input_quantity': quantity >= 0 ? quantity : false, 'input_quantity': quantity >= 0 ? quantity : false,
@@ -49,6 +49,7 @@ if (!$('.o_portal_sale_sidebar').length) {
params.access_token = token; params.access_token = token;
} }
order_id = parseInt(order_id[1])
this._callUpdateLineRoute(order_id, params).then(this._updateOrderValues.bind(this)); this._callUpdateLineRoute(order_id, params).then(this._updateOrderValues.bind(this));
return false; return false;
}, },
@@ -66,19 +67,20 @@ if (!$('.o_portal_sale_sidebar').length) {
* when the quantity of a product has changed * when the quantity of a product has changed
* *
* @private * @private
* @param {integer} order_id
* @param {Object} params * @param {Object} params
* @return {Deferred} * @return {Deferred}
*/ */
_callUpdateLineRoute: function (order_id, params) { _callUpdateLineRoute: function (order_id, params) {
var def = new $.Deferred(); var def = new $.Deferred();
var url = "/my/orders/" + parseInt(order_id[1]) + "/update_line_dict"; var url = "/my/orders/" + order_id + "/update_line_dict";
ajax.jsonRpc(url, 'call', params) ajax.jsonRpc(url, 'call', params)
.then(def.resolve.bind(def)) .then(def.resolve.bind(def))
.fail(function () { .fail(function () {
// Compatibility: the server may not have been restarted // Compatibility: the server may not have been restarted
// So the real route may not exist // So the real route may not exist
delete params.input_quantity; delete params.input_quantity;
ajax.jsonRpc("/quote/update_line", 'call', params) ajax.jsonRpc("/my/orders/" + order_id + "/update_line", 'call', params)
.fail(def.reject.bind(def)) .fail(def.reject.bind(def))
.then(function (data) { .then(function (data) {
// Data is an array, convert it to a dict // Data is an array, convert it to a dict
@@ -108,6 +110,8 @@ if (!$('.o_portal_sale_sidebar').length) {
var orderAmountTotal = data.order_amount_total; var orderAmountTotal = data.order_amount_total;
var orderAmountUntaxed = data.order_amount_untaxed; var orderAmountUntaxed = data.order_amount_untaxed;
var orderAmountTax = data.order_amount_tax; var orderAmountTax = data.order_amount_tax;
var orderAmountUndiscounted = data.order_amount_undiscounted;
var orderTotalsTable = $(data.order_totals_table);
var lineProductUomQty = data.order_line_product_uom_qty; var lineProductUomQty = data.order_line_product_uom_qty;
var linePriceTotal = data.order_line_price_total; var linePriceTotal = data.order_line_price_total;
@@ -129,6 +133,13 @@ if (!$('.o_portal_sale_sidebar').length) {
if (orderAmountTotal !== undefined) { if (orderAmountTotal !== undefined) {
this.elems.$orderAmountTotal.text(orderAmountTotal); this.elems.$orderAmountTotal.text(orderAmountTotal);
} }
if (orderAmountUndiscounted !== undefined) {
this.elems.$orderAmountUndiscounted.text(orderAmountUndiscounted);
}
if (orderTotalsTable) {
this.elems.$orderTotalsTable.find('table').replaceWith(orderTotalsTable);
}
}, },
/** /**
* Locate in the DOM the elements to update * Locate in the DOM the elements to update
@@ -147,12 +158,13 @@ if (!$('.o_portal_sale_sidebar').length) {
$linePriceTotal = $linePriceSubTotal = $parentTr.find('.oe_currency_value').last(); $linePriceTotal = $linePriceSubTotal = $parentTr.find('.oe_currency_value').last();
} }
var $orderAmountUntaxed = $('[data-id="total_untaxed"]>span'); var $orderAmountUntaxed = $('[data-id="total_untaxed"]').find('span, b');
var $orderAmountTotal = $('[data-id="total_amount"]>span'); var $orderAmountTotal = $('[data-id="total_amount"]').find('span, b');
var $orderAmountUndiscounted = $('[data-id="amount_undiscounted"]').find('span, b');
if (!$orderAmountUntaxed.length) { if (!$orderAmountUntaxed.length) {
$orderAmountUntaxed = $orderAmountTotal.eq(1); $orderAmountUntaxed = $orderAmountTotal.eq(1);
$orderAmountTotal = $orderAmountTotal.eq(0).add($orderAmountTotal.eq(3)); $orderAmountTotal = $orderAmountTotal.eq(0).add($orderAmountTotal.eq(2));
} }
return { return {
@@ -161,6 +173,8 @@ if (!$('.o_portal_sale_sidebar').length) {
$linePriceTotal: $linePriceTotal, $linePriceTotal: $linePriceTotal,
$orderAmountUntaxed: $orderAmountUntaxed, $orderAmountUntaxed: $orderAmountUntaxed,
$orderAmountTotal: $orderAmountTotal, $orderAmountTotal: $orderAmountTotal,
$orderTotalsTable: $('#total'),
$orderAmountUndiscounted: $orderAmountUndiscounted,
} }
} }
}); });