Skip to content

Commit 32a2819

Browse files
committed
[IMP] billing_address_in_website_sale: apply changes to match latest odoo 18.0
1 parent a818e49 commit 32a2819

File tree

11 files changed

+153
-138
lines changed

11 files changed

+153
-138
lines changed

Diff for: billing_address_in_website_sale/__manifest__.py

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"name": "Billing Address In Website",
33
"depends": [
44
"website_sale",
5-
"l10n_in",
65
],
76
"data": [
87
"views/templates.xml",

Diff for: billing_address_in_website_sale/controllers/main.py

+20-44
Original file line numberDiff line numberDiff line change
@@ -7,61 +7,37 @@ class WebsiteSaleInherit(WebsiteSale):
77
def get_address(self, vat=None):
88
if not vat:
99
return {"error": "Please enter VAT number"}
10-
address_values = request.env["res.partner"].sudo()._l10n_in_get_partner_vals_by_vat(vat)
10+
address_values = request.env["res.partner"].sudo().enrich_by_gst(vat)
1111
if not address_values:
1212
return {"error": "Please enter valid VAT number"}
13-
address_values["country"] = request.env["res.country"].browse(address_values["country_id"]).name
1413
return address_values
1514

16-
@route(
17-
"/shop/checkout",
18-
type="http",
19-
methods=["GET"],
20-
auth="public",
21-
website=True,
22-
sitemap=False,
23-
)
24-
def shop_checkout(self, try_skip_step=None, **query_params):
25-
response = super().shop_checkout(try_skip_step=try_skip_step, **query_params)
26-
if response.qcontext.get("order"):
27-
if response.qcontext.get(
28-
"order"
29-
).partner_invoice_id != response.qcontext.get("delivery_addresses"):
30-
response.qcontext["want_tax_credit"] = True
31-
response.qcontext["partner"] = response.qcontext.get(
32-
"order"
33-
).partner_invoice_id
34-
return response
35-
3615
@route(
3716
"/shop/billing_address/submit",
3817
type="json",
3918
auth="public",
4019
website=True,
4120
)
42-
def shop_billing_address_submit(self, vat=None, name=None, partner_id=None):
21+
def shop_billing_address_submit(self, address=None, name=None, partner_id=None):
4322
order_sudo = request.website.sale_get_order()
4423
if partner_id:
45-
partner_sudo, _ = self._prepare_address_update(order_sudo, partner_id=int(partner_id))
24+
partner_sudo = request.env["res.partner"].browse(int(partner_id))
4625
partner_sudo.write({"name": name})
47-
return {"partner_id": partner_id}
48-
address_values = (
49-
request.env["res.partner"].sudo()._l10n_in_get_partner_vals_by_vat(vat)
50-
)
51-
if not address_values:
52-
return {"error": "Please enter valid VAT number"}
53-
address_values.update(
54-
{
55-
"type": "invoice",
56-
"name": name,
57-
"phone": order_sudo.partner_id.phone,
58-
"email": order_sudo.partner_id.email,
59-
}
60-
)
61-
partner_sudo = request.env["res.partner"].sudo().create(address_values)
26+
return True
27+
partner_sudo = request.env["res.partner"].sudo().create({
28+
'name': name,
29+
'company_type': 'company',
30+
'parent_id': False,
31+
'street': address.get('street'),
32+
'street2': address.get('street2'),
33+
'city': address.get('city'),
34+
'state_id': address.get('state_id', {}).get('id', False),
35+
'country_id': address.get('country_id', {}).get('id', False),
36+
'zip': address.get('zip'),
37+
'vat': address.get('vat'),
38+
'email': address.get("email") or order_sudo.partner_id.email,
39+
'phone': address.get("phone") or order_sudo.partner_id.phone,
40+
})
6241
order_sudo._update_address(partner_sudo.id, {"partner_invoice_id"})
63-
order_sudo.partner_id.write(
64-
{"type": "delivery", "parent_id": partner_sudo}
65-
)
66-
return {"partner_sudo": partner_sudo}
67-
42+
order_sudo.partner_id.write({"type": "delivery", "parent_id": partner_sudo})
43+
return True

Diff for: billing_address_in_website_sale/static/src/checkout.js

+9-15
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ WebsiteSaleCheckout.include({
99
}, WebsiteSaleCheckout.prototype.events),
1010

1111
async start() {
12-
this._onTaxCreditToggle({
13-
currentTarget: this.el.querySelector('#want_tax_credit_checkbox'),
14-
});
12+
this.vatLable = this.el.querySelector('#vat_label');
13+
this.companyName = this.el.querySelector('#company_name');
14+
this.address = this.el.querySelector('#address');
15+
this.partnerId = this.el.querySelector('#partner_id');
1516
return this._super(...arguments);
1617
},
1718

@@ -27,18 +28,11 @@ WebsiteSaleCheckout.include({
2728

2829
async _onChangeVat(ev) {
2930
const vat = ev.currentTarget.value.trim();
30-
const address_values = await rpc('/shop/vat/address', { vat: vat });
31-
if (address_values.error) {
32-
this.el.querySelector('#vat_warning').textContent = address_values.error;
33-
this.el.querySelector('#vat_label').textContent = "Vat Number";
34-
this.el.querySelector('#company_name').value = "";
35-
}
36-
else {
37-
this.el.querySelector('#vat_warning').textContent = "";
38-
this.el.querySelector('#vat_label').textContent = address_values.country;
39-
this.el.querySelector('#company_name').value = address_values.name;
40-
}
41-
this.el.querySelector('#partner_id').value = "";
31+
const addressValues = await rpc('/shop/vat/address', { vat });
32+
this.vatLable.textContent = addressValues.country_id ? addressValues.country_id.display_name : "Vat Number";
33+
this.companyName.value = addressValues.name || "";
34+
this.address.value = JSON.stringify(addressValues);
35+
this.partnerId.value = "";
4236
},
4337

4438
});

Diff for: billing_address_in_website_sale/static/src/website_sale_tracking.js

+21-14
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,36 @@ import websiteSaleTracking from '@website_sale/js/website_sale_tracking'
22
import { rpc } from "@web/core/network/rpc";
33

44
websiteSaleTracking.include({
5+
56
events: Object.assign({
67
'click #confirm_btn': '_onConfirmClick',
78
}, websiteSaleTracking.prototype.events),
89

9-
async _onConfirmClick() {
10+
async _onConfirmClick(ev) {
11+
ev.preventDefault();
1012
const checkbox = this.el.querySelector("#want_tax_credit_checkbox");
11-
if (checkbox.checked) {
12-
const vat = this.el.querySelector("#vat_number").value.trim();
13-
const companyName = this.el.querySelector("#company_name").value.trim();
14-
const warning = document.querySelector('#vat_warning');
15-
const partnerId = this.el.querySelector('input[name="partner_id"]').value;
16-
if (!vat) {
17-
warning.textContent = "VAT number is required.";
13+
if (checkbox && checkbox.checked) {
14+
const name = this.el.querySelector("#company_name").value.trim();
15+
const partner_id = this.el.querySelector('input[name="partner_id"]').value;
16+
const address = JSON.parse(this.el.querySelector("#address").value || '{"error": "Please enter VAT number"}');
17+
if (address.error) {
18+
this._displayError(address.error);
1819
return;
1920
}
20-
const data = { vat, name: companyName };
21-
if (partnerId) data.partner_id = partnerId;
22-
const response = await rpc('/shop/billing_address/submit', data);
23-
if (response.error) {
24-
warning.textContent = response.error;
21+
if (!name) {
22+
this._displayError("Company name is required.");
2523
return;
2624
}
25+
await rpc('/shop/billing_address/submit', { name, partner_id, address, });
2726
}
2827
window.location.href = "/shop/confirm_order";
29-
}
28+
},
29+
30+
_displayError(msg) {
31+
const errorsDiv = this.el.querySelector("#errors");
32+
const errorHeader = document.createElement('h5');
33+
errorHeader.classList.add('text-danger', 'alert', 'alert-danger');
34+
errorHeader.textContent = msg;
35+
errorsDiv.replaceChildren(errorHeader);
36+
},
3037
})

Diff for: billing_address_in_website_sale/static/tests/tours/test_tax_credit_checkbox.js

+43-5
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@ registry.category("web_tour.tours").add("tax_credit_checkbox_test", {
88
...tourUtils.addToCart({ productName: "Office Chair Black TEST" }),
99
tourUtils.goToCart({ quantity: 1 }),
1010
tourUtils.goToCheckout(),
11-
{
12-
content: "Click Edit button",
13-
trigger: 'a[href="/shop/checkout"].float-end.no-decoration',
14-
run: 'click'
15-
},
1611
{
1712
content: "Click 'Want Tax Credit' checkbox",
1813
trigger: "input#want_tax_credit_checkbox",
@@ -22,5 +17,48 @@ registry.category("web_tour.tours").add("tax_credit_checkbox_test", {
2217
content: "Check VAT and Company fields are visible",
2318
trigger: '#vat_number:visible, #company_name:visible',
2419
},
20+
{
21+
content: "Click Confirm button",
22+
trigger: "#confirm_btn",
23+
run: "click",
24+
},
25+
{
26+
content: "Error should show: please enter correct Vat Number",
27+
trigger: "#errors:contains('Please enter VAT number')",
28+
},
29+
{
30+
content: "Uncheck 'Want Tax Credit' checkbox",
31+
trigger: "input#want_tax_credit_checkbox:checked",
32+
run: "click",
33+
},
34+
{
35+
content: "Click Confirm button",
36+
trigger: "#confirm_btn",
37+
run: "click",
38+
},
39+
{
40+
content: "Check delivery and billing are same",
41+
trigger: "#delivery_and_billing",
42+
run: () => {
43+
const address_card = document.querySelector("#delivery_and_billing");
44+
const address_text = address_card.innerText;
45+
if (!address_text.includes("Delivery & Billing")) {
46+
throw new Error("addresses are not the same");
47+
}
48+
}
49+
},
50+
{
51+
content: "Click Edit button on payment page",
52+
trigger: "#delivery_and_billing a[href='/shop/checkout']",
53+
run: "click"
54+
},
55+
{
56+
content: "Verify Want Tax Credit checkbox is unchecked",
57+
trigger: "#want_tax_credit_checkbox:not(:checked)",
58+
},
59+
{
60+
content: "Verify tax credit container is hidden",
61+
trigger: "#tax_credit_container:not(:visible)",
62+
},
2563
],
2664
});

Diff for: billing_address_in_website_sale/tests/test_tax_credit_checkbox.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import odoo.tests
22

33

4-
@odoo.tests.tagged("post_install", "-at_install")
54
class TestTaxCreditCheckbox(odoo.tests.HttpCase):
65
def test_tax_credit_checkbox_flow(self):
76
self.env["product.product"].create(

Diff for: billing_address_in_website_sale/views/templates.xml

+45-49
Original file line numberDiff line numberDiff line change
@@ -18,73 +18,69 @@
1818

1919
<template id="tax_credit_row">
2020
<div id="tax_credit_row">
21+
<h4 class="fs-6 fw-bold">BILLING ADDRESS</h4>
2122
<t t-set="has_delivery" t-value="order._has_deliverable_products()" />
22-
<div t-if="has_delivery" class="form-check form-switch mt-2 mb-3">
23-
<label id="want_tax_credit_label">
23+
<div t-if="has_delivery">
24+
<label id="want_tax_credit_label" class="form-switch mt-3 mb-3">
2425
<input
2526
type="checkbox"
2627
id="want_tax_credit_checkbox"
2728
class="form-check-input"
2829
name="want_tax_credit"
29-
t-att-checked="want_tax_credit"
30-
/> Want tax-credit </label>
31-
</div>
32-
<div id="tax_credit_container" class="row">
33-
34-
<input type="hidden" id="partner_id" name="partner_id"
35-
t-att-value="partner.id if partner else '' " />
36-
<div id="vat_field" class="col-md-6">
37-
<label id="vat_label" class="form-label"
38-
t-esc="partner.country_id.name if partner else 'Vat Number'">
39-
</label>
40-
<input
41-
type="text"
42-
id="vat_number"
43-
name="vat"
44-
class="form-control"
45-
t-att-value="partner.vat if partner else ''"
46-
/>
30+
t-att-checked="'checked' if not use_delivery_as_billing else None"
31+
/> Want
32+
tax-credit </label>
33+
<div id="tax_credit_container"
34+
t-attf-class="row {{'d-none' if use_delivery_as_billing else ''}}">
35+
<input type="hidden" id="partner_id" name="partner_id"
36+
t-att-value="order.partner_invoice_id.id if not use_delivery_as_billing else '' " />
37+
<input type="hidden" id="address" name="address" />
38+
<div id="vat_field" class="col-md-6">
39+
<label id="vat_label" class="form-label"
40+
t-esc="order.partner_invoice_id.country_id.name if not use_delivery_as_billing else 'Vat Number'">
41+
</label>
42+
<input
43+
type="text"
44+
id="vat_number"
45+
name="vat"
46+
class="form-control"
47+
t-att-value="order.partner_invoice_id.vat if not use_delivery_as_billing else ''"
48+
/>
49+
</div>
50+
<div id="company_name_field" class="col-md-6">
51+
<label class="form-label">Company Name</label>
52+
<input
53+
type="text"
54+
id="company_name"
55+
name="company_name"
56+
class="form-control"
57+
t-att-value="order.partner_invoice_id.name if not use_delivery_as_billing else ''"
58+
/>
59+
</div>
4760
</div>
48-
<div id="company_name_field" class="col-md-6">
49-
<label class="form-label">Company Name</label>
50-
<input
51-
type="text"
52-
id="company_name"
53-
name="company_name"
54-
class="form-control"
55-
t-att-value="partner.name if partner else ''"
56-
/>
57-
</div>
58-
59-
<div id="vat_warning" class="col-md-6 mt-2 text-danger"></div>
6061
</div>
62+
<t t-else="">
63+
<t t-call="website_sale.address_row">
64+
<t t-set="is_invoice" t-value="True"/>
65+
<t t-set="addresses" t-value="billing_addresses"/>
66+
<t t-set="selected_address" t-value="order.partner_invoice_id"/>
67+
</t>
68+
</t>
6169
</div>
6270
</template>
6371

6472
<template id="checkout_inherit_add_tax_credit_row" inherit_id="website_sale.checkout">
73+
<xpath expr="//div[@id='shop_checkout']" position="before">
74+
<div id="errors" />
75+
</xpath>
6576
<xpath expr="//t[@t-call='website_sale.billing_address_row']" position="before">
6677
<t t-call="billing_address_in_website_sale.tax_credit_row" />
6778
</xpath>
6879
</template>
6980

7081
<template id="checkout_confirm_override" inherit_id="website_sale.navigation_buttons">
71-
<xpath expr="//a[@name='website_sale_main_button']" position="replace">
72-
<t t-if="xmlid in ['website_sale.checkout']">
73-
<button type="submit"
74-
name="website_sale_main_button"
75-
id="confirm_btn"
76-
class="btn btn-primary w-100"> Confirm <i
77-
class="fa fa-angle-right ms-2 fw-light" />
78-
</button>
79-
</t>
80-
<t t-else="">
81-
<a role="button" name="website_sale_main_button"
82-
t-attf-class="#{_cta_classes} btn btn-primary #{not website_sale_order._is_cart_ready() and 'disabled'} #{_form_send_navigation and 'order-lg-3 w-100 w-lg-auto ms-lg-auto' or 'w-100'}"
83-
t-att-href="step_specific_values['main_button_href']">
84-
<t t-out="step_specific_values['main_button']" />
85-
<i class="fa fa-angle-right ms-2 fw-light" />
86-
</a>
87-
</t>
82+
<xpath expr="//a[@name='website_sale_main_button']" position="attributes">
83+
<attribute name="t-att-id">"confirm_btn" if xmlid == 'website_sale.checkout' else None</attribute>
8884
</xpath>
8985
</template>
9086

Diff for: distribute_cost_task/model/sale_order.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def _compute_divide_column(self):
2626
order.divide_column = has_zero_divide_cost
2727

2828
def _get_order_lines_to_report(self):
29-
order_lines = super(SaleOrder, self)._get_order_lines_to_report()
29+
order_lines = super()._get_order_lines_to_report()
3030
return order_lines.filtered(
3131
lambda line: not line.divide_from_order_lines or line.divide_cost > 0
3232
)

0 commit comments

Comments
 (0)