Select Shop
Select a ShopPlease select the shop nearest to your location.
< /code>
И это мой код JavaScript, где я определил OnChange < /p>
import { _t } from "@web/core/l10n/translation";
export class ShopSelection extends Component {
setup() {
this.rpc = useService("rpc");
}
async onShopChange(ev) {
const shopId = ev.target.value;
if (!shopId) return;
try {
const result = await this.rpc("/select/shop", {
shop_id: parseInt(shopId)
});
if (result.success) {
console.log("Shop changed successfully");
window.location.reload(); // Refresh to apply company changes
} else {
this.showStockErrors(result);
}
} catch (error) {
console.error("Error:", error);
alert(_t("Operation failed"));
}
}
showStockErrors(result) {
// Clear previous errors
document.querySelectorAll("[class^='shop-selection-errors-']").forEach(el => el.innerHTML = "");
// Display new errors
result.products?.forEach(p => {
const errorDiv = document.querySelector(`.shop-selection-errors-${p.id}`);
if (errorDiv) {
errorDiv.innerHTML = `
${_t("Available")}: ${p.available} (${_t("Required")}: ${p.required})
`;
}
});
alert(result.message || _t("Insufficient stock"));
}
}
< /code>
Кроме того, это мой контроллер, в котором я определил маршрут и логику, которую я хочу реализован, то есть проверить, доступен ли заказ (продукт) в корзине в выбранном магазине (компания). Эта часть настройки, которую я делаю на модуле электронной коммерции Odoo. < /p>
@http.route(['/select/shop'], type='json', auth="public", website=True)
def stock_check(self, shop_id, **kwargs):
order = request.website.sale_get_order(force_create=True)
if not order or not shop_id:
return {'success': False}
try:
shop = request.env['res.company'].sudo().browse(int(shop_id))
if not shop.exists() or not shop.is_shop:
return {'success': False, 'message': _("Invalid shop")}
# Get ALL internal locations for the shop's company
locations = request.env['stock.location'].sudo().search([
('company_id', '=', shop.id),
('usage', '=', 'internal') # Stock locations only
])
if not locations:
return {'success': False, 'message': _("No stock locations found for this shop")}
out_of_stock = []
for line in order.order_line:
# Only check storable products
if line.product_id.detailed_type != 'product':
continue
# Sum on-hand quantity across all shop's locations
total_available = sum(
line.product_id.with_context(location=loc.id).qty_available
for loc in locations
)
if total_available < line.product_uom_qty:
out_of_stock.append({
'id': line.product_id.id,
'name': line.product_id.name,
'available': total_available,
'required': line.product_uom_qty
})
if out_of_stock:
return {
'success': False,
'message': _("Insufficient stock for %d products", len(out_of_stock)),
'products': out_of_stock
}
# Update order's company
order.sudo().write({
'company_id': shop.id,
'shop_company_id': shop.id
})
return {'success': True}
except Exception as e:
_logger.error("Shop Selection Error: %s", str(e))
return {'success': False, 'message': _("Technical error")}
< /code>
Но проблема, с которой я сталкиваюсь, заключается в том, что метод OnChange не запускается, поэтому проверка акций не выполняется. Я не уверен, в чем проблема, это я впервые работаю над Odoo 18. Любая помощь будет искренне оценена. заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/794 ... wl-odoo-18
Мобильная версия