Skip to content

18.0 final task update mpkh #701

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 8 commits into
base: 18.0
Choose a base branch
from
1 change: 1 addition & 0 deletions appointment_filter/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import controllers
9 changes: 9 additions & 0 deletions appointment_filter/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "Appointment Filter",
"depends": ["website_appointment", "appointment_account_payment"],
"data": [
"views/website_appointment_filter_template.xml",
],
"installable": True,
"license": "LGPL-3",
}
1 change: 1 addition & 0 deletions appointment_filter/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import appointment_filter
48 changes: 48 additions & 0 deletions appointment_filter/controllers/appointment_filter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from odoo.addons.website_appointment.controllers.appointment import WebsiteAppointment
from odoo.http import request


class AppointmentFilterController(WebsiteAppointment):
def _appointments_base_domain(
cls,
filter_appointment_type_ids,
search=False,
invite_token=False,
additional_domain=None,
):
domain = super()._appointments_base_domain(
filter_appointment_type_ids, search, invite_token, additional_domain
)

filter_location = request.params.get("filter_location")
if filter_location == "Online":
domain.append(("location_id", "=", False))
elif filter_location == "Offline":
domain.append(("location_id", "!=", False))

filter_based_on = request.params.get("filter_based_on")
if filter_based_on == "Users":
domain.append(("schedule_based_on", "=", "users"))
elif filter_based_on == "Resources":
domain.append(("schedule_based_on", "=", "resources"))

filter_payment = request.params.get("filter_payment")
if filter_payment == "Required":
domain.append(("has_payment_step", "=", True))
elif filter_payment == "No Required":
domain.append(("has_payment_step", "=", False))

return domain

def _prepare_appointments_cards_data(self, page, appointment_types, **kwargs):
context = super()._prepare_appointments_cards_data(
page, appointment_types, **kwargs
)

context["filters"] = {
"filter_location": kwargs.get("filter_location"),
"filter_based_on": kwargs.get("filter_based_on"),
"filter_payment": kwargs.get("filter_payment"),
}

return context
67 changes: 67 additions & 0 deletions appointment_filter/views/website_appointment_filter_template.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="website_calendar_index_topbar_inherit" name="Appointment Filter"
inherit_id="website_appointment.website_calendar_index_topbar">
<xpath expr="//t[@t-call='website.website_search_box_input']" position="before">
<div class="d-flex gap-2 me-2">
<div class="dropdown">
<a role="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown">
<t t-if="filters.get('filter_location')">
<t t-out="filters.get('filter_location')" />
</t>
<t t-else="">Location</t>
</a>
<div class="dropdown-menu">
<t t-set="locations"
t-value="{'All': '', 'Online': 'Online', 'Offline': 'Offline'}" />
<t t-foreach="locations.items()" t-as="location">
<a
t-attf-href="?{{ keep_query('*', filter_location=location[1]) }}"
t-attf-class="dropdown-item">
<t t-out="location[0]" />
</a>
</t>
</div>
</div>

<div class="dropdown">
<a role="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown">
<t t-if="filters.get('filter_based_on')">
<t t-out="filters.get('filter_based_on')" />
</t>
<t t-else="">Schedule Based On</t>
</a>
<div class="dropdown-menu">
<t t-set="based_on"
t-value="{'All': '', 'Users': 'Users', 'Resources': 'Rsources'}" />
<t t-foreach="based_on.items()" t-as="based">
<a t-attf-href="?{{ keep_query('*', filter_based_on=based[1]) }}"
t-attf-class="dropdown-item">
<t t-out="based[0]" />
</a>
</t>
</div>
</div>

<div class="dropdown">
<a role="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown">
<t t-if="filters.get('filter_payment')">
<t t-out="filters.get('filter_payment')" />
</t>
<t t-else="">Payment Required</t>
</a>
<div class="dropdown-menu">
<t t-set="payment_options"
t-value="{'All': '', 'Required': 'Required', 'No Required': 'No Required'}" />
<t t-foreach="payment_options.items()" t-as="payment">
<a t-attf-href="?{{ keep_query('*', filter_payment=payment[1]) }}"
t-attf-class="dropdown-item">
<t t-out="payment[0]" />
</a>
</t>
</div>
</div>
</div>
</xpath>
</template>
</odoo>
1 change: 1 addition & 0 deletions billing_address_in_website_sale/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import controllers
19 changes: 19 additions & 0 deletions billing_address_in_website_sale/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "Billing Address In Website",
"depends": [
"website_sale",
],
"data": [
"views/templates.xml",
],
"assets": {
"web.assets_frontend": [
"billing_address_in_website_sale/static/src/**/*",
],
"web.assets_tests": [
"billing_address_in_website_sale/static/tests/**/*",
],
},
"installable": True,
"license": "LGPL-3",
}
1 change: 1 addition & 0 deletions billing_address_in_website_sale/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import main
43 changes: 43 additions & 0 deletions billing_address_in_website_sale/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.http import request, route


class WebsiteSaleInherit(WebsiteSale):
@route("/shop/vat/address", type="json", auth="public", website=True)
def get_address(self, vat=None):
if not vat:
return {"error": "Please enter VAT number"}
address_values = request.env["res.partner"].sudo().enrich_by_gst(vat)
if not address_values:
return {"error": "Please enter valid VAT number"}
return address_values

@route(
"/shop/billing_address/submit",
type="json",
auth="public",
website=True,
)
def shop_billing_address_submit(self, address=None, name=None, partner_id=None):
order_sudo = request.website.sale_get_order()
if partner_id:
partner_sudo = request.env["res.partner"].browse(int(partner_id))
partner_sudo.write({"name": name})
return True
partner_sudo = request.env["res.partner"].sudo().create({
'name': name,
'company_type': 'company',
'parent_id': False,
'street': address.get('street'),
'street2': address.get('street2'),
'city': address.get('city'),
'state_id': address.get('state_id', {}).get('id', False),
'country_id': address.get('country_id', {}).get('id', False),
'zip': address.get('zip'),
'vat': address.get('vat'),
'email': address.get("email") or order_sudo.partner_id.email,
'phone': address.get("phone") or order_sudo.partner_id.phone,
})
order_sudo._update_address(partner_sudo.id, {"partner_invoice_id"})
order_sudo.partner_id.write({"type": "delivery", "parent_id": partner_sudo})
return True
38 changes: 38 additions & 0 deletions billing_address_in_website_sale/static/src/checkout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import WebsiteSaleCheckout from '@website_sale/js/checkout';
import { rpc } from '@web/core/network/rpc';

WebsiteSaleCheckout.include({

events: Object.assign({
'change #want_tax_credit_checkbox': '_onTaxCreditToggle',
'change #vat_number': '_onChangeVat',
}, WebsiteSaleCheckout.prototype.events),

async start() {
this.vatLable = this.el.querySelector('#vat_label');
this.companyName = this.el.querySelector('#company_name');
this.address = this.el.querySelector('#address');
this.partnerId = this.el.querySelector('#partner_id');
return this._super(...arguments);
},

async _onTaxCreditToggle(ev) {
const checkbox = ev.currentTarget;
const taxContainer = this.el.querySelector('#tax_credit_container');
taxContainer.classList.toggle('d-none', !checkbox.checked);
if (!checkbox.checked) {
const selectedDeliveryAddress = this._getSelectedAddress('delivery');
await this._selectMatchingBillingAddress(selectedDeliveryAddress.dataset.partnerId);
}
},

async _onChangeVat(ev) {
const vat = ev.currentTarget.value.trim();
const addressValues = await rpc('/shop/vat/address', { vat });
this.vatLable.textContent = addressValues.country_id ? addressValues.country_id.display_name : "Vat Number";
this.companyName.value = addressValues.name || "";
this.address.value = JSON.stringify(addressValues);
this.partnerId.value = "";
},

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import websiteSaleTracking from '@website_sale/js/website_sale_tracking'
import { rpc } from "@web/core/network/rpc";

websiteSaleTracking.include({

events: Object.assign({
'click #confirm_btn': '_onConfirmClick',
}, websiteSaleTracking.prototype.events),

async _onConfirmClick(ev) {
ev.preventDefault();
const checkbox = this.el.querySelector("#want_tax_credit_checkbox");
if (checkbox && checkbox.checked) {
const name = this.el.querySelector("#company_name").value.trim();
const partner_id = this.el.querySelector('input[name="partner_id"]').value;
const address = JSON.parse(this.el.querySelector("#address").value || '{"error": "Please enter VAT number"}');
if (address.error) {
this._displayError(address.error);
return;
}
if (!name) {
this._displayError("Company name is required.");
return;
}
await rpc('/shop/billing_address/submit', { name, partner_id, address, });
}
window.location.href = "/shop/confirm_order";
},

_displayError(msg) {
const errorsDiv = this.el.querySelector("#errors");
const errorHeader = document.createElement('h5');
errorHeader.classList.add('text-danger', 'alert', 'alert-danger');
errorHeader.textContent = msg;
errorsDiv.replaceChildren(errorHeader);
},
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { registry } from "@web/core/registry";
import * as tourUtils from "@website_sale/js/tours/tour_utils";

registry.category("web_tour.tours").add("tax_credit_checkbox_test", {
test: true,
url: "/shop",
steps: () => [
...tourUtils.addToCart({ productName: "Office Chair Black TEST" }),
tourUtils.goToCart({ quantity: 1 }),
tourUtils.goToCheckout(),
{
content: "Click 'Want Tax Credit' checkbox",
trigger: "input#want_tax_credit_checkbox",
run: "click",
},
{
content: "Check VAT and Company fields are visible",
trigger: '#vat_number:visible, #company_name:visible',
},
{
content: "Click Confirm button",
trigger: "#confirm_btn",
run: "click",
},
{
content: "Error should show: please enter correct Vat Number",
trigger: "#errors:contains('Please enter VAT number')",
},
{
content: "Uncheck 'Want Tax Credit' checkbox",
trigger: "input#want_tax_credit_checkbox:checked",
run: "click",
},
{
content: "Click Confirm button",
trigger: "#confirm_btn",
run: "click",
},
{
content: "Check delivery and billing are same",
trigger: "#delivery_and_billing",
run: () => {
const address_card = document.querySelector("#delivery_and_billing");
const address_text = address_card.innerText;
if (!address_text.includes("Delivery & Billing")) {
throw new Error("addresses are not the same");
}
}
},
{
content: "Click Edit button on payment page",
trigger: "#delivery_and_billing a[href='/shop/checkout']",
run: "click"
},
{
content: "Verify Want Tax Credit checkbox is unchecked",
trigger: "#want_tax_credit_checkbox:not(:checked)",
},
{
content: "Verify tax credit container is hidden",
trigger: "#tax_credit_container:not(:visible)",
},
],
});
1 change: 1 addition & 0 deletions billing_address_in_website_sale/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import test_tax_credit_checkbox
13 changes: 13 additions & 0 deletions billing_address_in_website_sale/tests/test_tax_credit_checkbox.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import odoo.tests


class TestTaxCreditCheckbox(odoo.tests.HttpCase):
def test_tax_credit_checkbox_flow(self):
self.env["product.product"].create(
{
"name": "Office Chair Black TEST",
"list_price": 12.50,
}
)

self.start_tour("/", "tax_credit_checkbox_test", login="admin")
Loading