Tower: upload laundry_management 19.0.19.0.4 (via marketplace)
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
/** @odoo-module
|
||||
*
|
||||
* PosOrder JS-side patch for the laundry order-type / attributes feature.
|
||||
*
|
||||
* Why this patch exists:
|
||||
* The two relational laundry fields on `pos.order`
|
||||
* - laundry_order_type_id (Many2one → laundry.order.type)
|
||||
* - laundry_order_attribute_ids (Many2many → laundry.order.attribute)
|
||||
* are NOT exposed via _load_pos_data_fields anymore. Including them was
|
||||
* breaking the POS relational engine during order initialization
|
||||
* (TypeError: lines is undefined → _computeAllPrices crash).
|
||||
*
|
||||
* So instead of round-tripping them through the relational engine, we:
|
||||
* 1. Store them as plain JS attributes on the order instance
|
||||
* (assigned by runLaundryOrderTypeFlow in pos_store_patch.js).
|
||||
* 2. Inject them into the sync_from_ui payload via serializeForORM
|
||||
* as standard ORM commands (integer id for M2O, [(6,0,ids)] for M2M).
|
||||
* 3. The backend pos.order columns still exist; sync writes the values
|
||||
* normally and _maybe_create_laundry_order propagates them onward.
|
||||
*
|
||||
* The 3 SCALAR laundry fields (laundry_is_delivery, ..._address,
|
||||
* ..._scheduled_at) remain in _load_pos_data_fields and round-trip
|
||||
* normally through the relational engine. We only set safe defaults
|
||||
* for them here so consumers never hit `undefined`.
|
||||
*
|
||||
* Setup runs with (...args) so super gets the exact arguments the
|
||||
* framework passed, and all writes happen AFTER super.setup so we never
|
||||
* interfere with base initialization.
|
||||
*/
|
||||
import { patch } from "@web/core/utils/patch";
|
||||
import { PosOrder } from "@point_of_sale/app/models/pos_order";
|
||||
|
||||
patch(PosOrder.prototype, {
|
||||
setup(...args) {
|
||||
super.setup(...args);
|
||||
|
||||
// Scalar field defaults (these ARE in _load_pos_data_fields).
|
||||
if (this.laundry_is_delivery === undefined) {
|
||||
this.laundry_is_delivery = false;
|
||||
}
|
||||
if (this.laundry_delivery_address === undefined) {
|
||||
this.laundry_delivery_address = false;
|
||||
}
|
||||
if (this.laundry_delivery_scheduled_at === undefined) {
|
||||
this.laundry_delivery_scheduled_at = false;
|
||||
}
|
||||
|
||||
// Relational field shadows (NOT in _load_pos_data_fields — pure JS).
|
||||
// Plain attributes only, never relational records, so the engine
|
||||
// does not see them as relational writes.
|
||||
if (this.laundry_order_type_id === undefined) {
|
||||
this.laundry_order_type_id = false;
|
||||
}
|
||||
if (this.laundry_order_attribute_ids === undefined) {
|
||||
this.laundry_order_attribute_ids = [];
|
||||
}
|
||||
},
|
||||
|
||||
serializeForORM(opts = {}) {
|
||||
const data = super.serializeForORM(opts);
|
||||
|
||||
// Many2one → just the integer id (or false to clear).
|
||||
const typeRec = this.laundry_order_type_id;
|
||||
if (typeRec && typeof typeRec === "object" && typeRec.id) {
|
||||
data.laundry_order_type_id = typeRec.id;
|
||||
} else if (typeof typeRec === "number") {
|
||||
data.laundry_order_type_id = typeRec;
|
||||
} else {
|
||||
data.laundry_order_type_id = false;
|
||||
}
|
||||
|
||||
// Many2many → standard ORM "set" command [(6, 0, [ids])].
|
||||
const attrs = Array.isArray(this.laundry_order_attribute_ids)
|
||||
? this.laundry_order_attribute_ids
|
||||
: [];
|
||||
const attrIds = attrs
|
||||
.map((a) => (a && typeof a === "object" ? a.id : a))
|
||||
.filter((id) => Number.isInteger(id));
|
||||
data.laundry_order_attribute_ids = [[6, 0, attrIds]];
|
||||
|
||||
return data;
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user