Skip to content

Commit 2411d53

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

File tree

11 files changed

+119
-114
lines changed

11 files changed

+119
-114
lines changed

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",

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

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
});

billing_address_in_website_sale/static/src/website_sale_tracking.js

+20-13
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");
1113
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.";
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 (!partner_id && !address.vat) {
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
})

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
});

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(

billing_address_in_website_sale/views/templates.xml

+12-26
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,23 @@
2626
id="want_tax_credit_checkbox"
2727
class="form-check-input"
2828
name="want_tax_credit"
29-
t-att-checked="want_tax_credit"
29+
t-att-checked="'checked' if not use_delivery_as_billing else None"
3030
/> Want tax-credit </label>
3131
</div>
32-
<div id="tax_credit_container" class="row">
33-
32+
<div id="tax_credit_container" t-attf-class="row {{'d-none' if use_delivery_as_billing else ''}}">
3433
<input type="hidden" id="partner_id" name="partner_id"
35-
t-att-value="partner.id if partner else '' " />
34+
t-att-value="order.partner_invoice_id.id if not use_delivery_as_billing else '' " />
35+
<input type="hidden" id="address" name="address" />
3636
<div id="vat_field" class="col-md-6">
3737
<label id="vat_label" class="form-label"
38-
t-esc="partner.country_id.name if partner else 'Vat Number'">
38+
t-esc="order.partner_invoice_id.country_id.name if not use_delivery_as_billing else 'Vat Number'">
3939
</label>
4040
<input
4141
type="text"
4242
id="vat_number"
4343
name="vat"
4444
class="form-control"
45-
t-att-value="partner.vat if partner else ''"
45+
t-att-value="order.partner_invoice_id.vat if not use_delivery_as_billing else ''"
4646
/>
4747
</div>
4848
<div id="company_name_field" class="col-md-6">
@@ -52,39 +52,25 @@
5252
id="company_name"
5353
name="company_name"
5454
class="form-control"
55-
t-att-value="partner.name if partner else ''"
55+
t-att-value="order.partner_invoice_id.name if not use_delivery_as_billing else ''"
5656
/>
5757
</div>
58-
59-
<div id="vat_warning" class="col-md-6 mt-2 text-danger"></div>
6058
</div>
6159
</div>
6260
</template>
6361

6462
<template id="checkout_inherit_add_tax_credit_row" inherit_id="website_sale.checkout">
63+
<xpath expr="//div[@id='shop_checkout']" position="before">
64+
<div id="errors" />
65+
</xpath>
6566
<xpath expr="//t[@t-call='website_sale.billing_address_row']" position="before">
6667
<t t-call="billing_address_in_website_sale.tax_credit_row" />
6768
</xpath>
6869
</template>
6970

7071
<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>
72+
<xpath expr="//a[@name='website_sale_main_button']" position="attributes">
73+
<attribute name="t-att-id">"confirm_btn" if xmlid == 'website_sale.checkout' else None</attribute>
8874
</xpath>
8975
</template>
9076

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
)

distribute_cost_task/model/sale_order_line.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@ class SaleOrderLine(models.Model):
55
_inherit = "sale.order.line"
66

77
divide_cost = fields.Float("Devision")
8-
divide_to_order_lines = fields.One2many("order.line.cost.divide", "divide_to_order_line", string="Divided to order line")
9-
divide_from_order_lines = fields.One2many("order.line.cost.divide", "divide_from_order_line", string="Divided from order line")
8+
divide_to_order_lines = fields.One2many(
9+
"order.line.cost.divide", "divide_to_order_line", string="Divided to order line"
10+
)
11+
divide_from_order_lines = fields.One2many(
12+
"order.line.cost.divide",
13+
"divide_from_order_line",
14+
string="Divided from order line",
15+
)
1016

1117
def action_open_order_line_wizard(self):
1218
return {
@@ -27,12 +33,12 @@ def _unlink_order_line(self):
2733
line.divide_from_order_line.divide_cost += line.cost
2834
line.cost = 0.0
2935
for line in record.divide_from_order_lines:
30-
line.divide_to_order_line.divide_cost -= line.cost
31-
line.cost = 0.0
36+
line.divide_to_order_line.divide_cost -= line.cost
37+
line.cost = 0.0
3238

33-
@api.depends('product_uom_qty', 'discount', 'price_unit', 'tax_id', 'divide_cost')
39+
@api.depends("product_uom_qty", "discount", "price_unit", "tax_id", "divide_cost")
3440
def _compute_amount(self):
35-
super(SaleOrderLine, self)._compute_amount()
41+
super()._compute_amount()
3642
for record in self:
3743
if record.divide_from_order_lines:
3844
record.price_subtotal -= record.price_unit

distribute_cost_task/wizard/order_wizard.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class OrderLineWizard(models.TransientModel):
1313

1414
@api.model
1515
def default_get(self, fields_list):
16-
res = super(OrderLineWizard, self).default_get(fields_list)
16+
res = super().default_get(fields_list)
1717
exclude_line_id = self.env["sale.order.line"].browse(
1818
self.env.context.get("active_id")
1919
)

product_warranty/wizard/order_wizard.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class OrderWizard(models.TransientModel):
1212

1313
@api.model
1414
def default_get(self, fields_list):
15-
res = super(OrderWizard, self).default_get(fields_list)
15+
res = super().default_get(fields_list)
1616
order_lines = self.env["sale.order"].browse(self.env.context.get("active_id"))
1717
filter_oder_lines = order_lines.order_line.filtered(
1818
lambda l: l.product_template_id.is_warranty_available

0 commit comments

Comments
 (0)