Hi,
The error you're encountering, Cannot read properties of
undefined (reading 'extend'), occurs because Registries.Component.extend
is being applied improperly before the component (ProductScreen) is
fully defined. To fix this, ensure that the ProductScreen component is
extended only after it is properly initialized. In the code, the
component should be extended after defining the ExpiredProductScreen
class.
odoo.define('expired_product.ProductScreen', function (require) {
"use strict";
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { _t } = require('web.core');
const { DateTime } = luxon;
const ExpiredProductScreen = ProductScreen =>
class extends ProductScreen {
async _clickProduct(event) {
const product = event.detail.product || event.detail;
console.log('Product clicked:', product);
// Display expiration_time and expiry_date
console.log('Expiration Time (Days):', product.expiration_time);
console.log('Expiry Date:', product.expiry_date);
// Check if product has expired
if (this._isProductExpired(product)) {
await this._showExpiredProductModal(product);
return;
}
// If not expired, proceed with normal product selection
super._clickProduct(event);
}
_isProductExpired(product) {
// Check product expiration
if (product.expiry_date) {
const expirationDate = DateTime.fromISO(product.expiry_date);
const today = DateTime.local();
return expirationDate < today;
}
return false;
}
async _showExpiredProductModal(product) {
const { confirmed } = await this.showPopup('ConfirmPopup', {
title: _t('Product Expired'),
body: _t(
The product "${product.display_name}" has expired on ${DateTime.fromISO(product.expiry_date).toLocaleString(DateTime.DATE_FULL)}. Do you want to continue?
),
confirmText: _t('Continue'),
cancelText: _t('Cancel'),
});
// If user confirms, allow product selection
if (confirmed) {
this.env.pos.get_order().add_product(product);
}
}
};
// Correctly extend the ProductScreen using Registries
Registries.Component.extend(ProductScreen, ExpiredProductScreen);
return ExpiredProductScreen;
});
Additionally,
you need to check whether the product has a lot or serial number
tracking (via product.tracking) before performing the expiration check,
as expiration is only relevant for such products. Also, ensure that
product.expiry_date exists before checking for expiration to avoid
errors when this field is missing.
Hope it helps