Skip to Content

PMIS Quant Measurements

Beta License: LGPL-3 PMISuite/Glass Version: 18.0

Supports simplified order entry for glass cut to size: specify the number of panes and their dimensions, carry those specifications into manufacturing and delivery, and calculate area and perimeter for commercial use. Glassworking is the primary use case; the same rectangular-sheet measurements can also serve other sectors that handle sheet materials.

In the typical glassworking setup, both raw glass and finished panes are stocked and sold in square meters (m²). Pieces are a logistical count alongside that area. Native Odoo quantities remain authoritative for material consumption, stock movements, valuation, and invoicing.

Glassworking terminology

  • Raw glass: the input material consumed by a manufacturing order, such as float glass of a specified thickness. Its consumption is recorded in its own UoM, typically m².

  • Finished pane: a rectangular piece of glass cut to the customer's height and width, entered in millimeters. Its geometric area is height x width / 1,000,000 in m².

  • Pieces (Pcs): the number of physical panes to cut, handle, or deliver. This is a logistical description, similar to counting the contents of a package. It does not create an Odoo package or packaging record and does not change the product's stock UoM.

  • Finished area: the area represented by the ordered panes. For an m²-based finished product, this determines the sales quantity, subject to UoM rounding.

  • Raw-material allowance: additional input area configured in the BoM, for example to allow for cutting loss. It is separate from the finished pane's geometric area.

  • Perimeter: the total length of the four edges, in meters. A configured price per linear meter can represent an edge-processing charge; it does not schedule or perform that operation.

The pieces-to-area relationship belongs to the specified pane dimensions, not to a fixed package size for the product. A 400 x 500 mm pane represents 0.20 m²; a 500 x 1000 mm pane represents 0.50 m². The raw glass used to make either pane has its own consumption quantity and need not have the same piece count or dimensions.

Features

  • Adds pieces, height, width, canonical dimension, area, perimeter, and conversion fields to sales, invoices, BoMs, manufacturing orders, stock moves, move lines, and quants.

  • Supports Surface-category products automatically and explicitly enabled Unit-category product variants, including compatible Unit UoMs such as Units and Dozens.

  • Keeps PMIS geometry informational; native Odoo fields alone define stock and reservations.

  • Propagates measurement metadata through procurement, stock, and manufacturing without changing ordinary component or unsupported-category behavior.

  • Synchronizes sales quantities and physical pieces while keeping invoice, BoM, manufacturing, and stock demand quantities under their native Odoo ownership where required.

  • Supports formula-pricelist and variant-attribute surcharges per linear meter.

  • Keeps native Odoo manufacturing operation duration authoritative for quantity, capacity, efficiency, cycles, setup, cleanup, and alternative work centers, while optionally showing work center names on production labels.

  • Adds pieces and dimensions to sale, invoice, delivery, and manufacturing reports.

Configuration

The module requires sale_management, account, product, purchase, mrp, stock, uom, base, and base_vat. It does not require an external cutting service or supply manufacturing/procurement routes.

Typical glassworking setup

Use separate products for the finished pane and its raw glass input, with square meters as their stock and sales UoM. Configure inventory tracking and the normal Odoo manufacturing and procurement routes for the required workflow. This addon carries measurements through those workflows; it does not configure the routes itself.

Define the BoM output and component quantities explicitly in m². Entering pieces or dimensions on a BoM does not replace its native quantity fields. Leave raw-component geometry empty when only the consumed area is known; do not copy finished-pane dimensions onto the raw glass to express a consumption allowance. See the manufacturing example below.

Product applicability

  • Products whose stock UoM is in Odoo's Surface category are applicable automatically. The product flag does not control Surface applicability.

  • To measure a product whose stock UoM is in Odoo's Unit category, enable Allow PMIS Measurements Outside Surface UoM on the product variant. This is a variant-level, company-independent setting; it is intentionally not defined on the product template.

  • A measured transaction UoM must be in the same category as the product stock UoM. Weight, length, volume, and arbitrary custom categories are not supported by the exception.

  • The Unit-category exception can be enabled or disabled without rewriting or invalidating existing BoMs, manufacturing orders, stock records, sales, or accounting history. Existing measurements remain historical informational snapshots.

Pricing and manufacturing

  • On a formula pricelist rule, set EUR/m (formula) to add a perimeter surcharge.

  • On product attribute values, set Extra price per linear meter to add variant-specific perimeter surcharges. The applied surcharge is the sum of the rule and selected attribute values. Both parts apply only when the selected pricelist rule uses formula pricing, the perimeter is nonzero, and the requested quantity is positive. Fixed-price and percentage-price rules do not receive this surcharge.

  • BoM operations use native quantity-based expected duration. Perimeter and pieces are display and reporting metadata only and never affect scheduling or work-order completion.

  • Enable Show workcenter on production label on work centers that must appear on the production label.

Usage

Entering an order for cut glass

The product onchange and line creation can prefill pieces and dimensions from a matching BoM when cut inputs are not supplied. Review those defaults before entering the customer's requested size.

  1. Add the finished-glass product to a quotation and enter Pieces, Height (mm), and Width (mm) on the order line. Use a separate line for each required size.

  2. Check the calculated area, perimeter, and sales quantity. For an m²-based product, five panes measuring 400 x 500 mm represent 1.00 m², with a perimeter of 1.80 m per pane and 9.00 m in total.

  3. If using a perimeter surcharge, use the order's Update Prices action and review the price before confirming. For example, EUR 2.00 per linear meter adds EUR 18.00 for those five panes, before any applicable discounts or taxes. The charge is incorporated into the unit price.

  4. Confirm the order and process manufacturing and delivery through the configured Odoo routes. Check raw consumption and finished quantities in m²; use pieces and dimensions as handling and cutting information.

Changing a sales quantity back-propagates pieces. On invoices, measurement fields are informational: changing invoice quantity updates pieces, while the accounting quantity remains authoritative. Stock, manufacturing, and invoice piece counts are read-only in the UI; enter the actual operational quantity in the record's UoM.

The quotation list shows pieces, height, and width alongside the native quantity and UoM. Combined dimensions, geometric area, and perimeter are optional hidden columns. The order-line form groups cut inputs and calculated measurements, with an example and a non-blocking hint for incomplete dimensions. Confirmed cut dimensions remain read-only. BoM reference measurements are grouped separately from the native output and component quantities.

Cut inputs appear only for applicable products or lines with existing dimensions. An incomplete-size badge also flags partially entered dimensions in the quotation list. Enter height and width in the required orientation: the combined Dimensions label sorts the smaller dimension first and must not be used as an orientation instruction for directional glass.

Stock moves show planned pieces; detailed operations show pieces derived from their operation quantity, not an independent physical count. Quotation measurement columns appear only when measured lines are printed; ordinary lines on mixed quotations have blank measurement cells.

For Surface products, commercial quantity represents area in the selected Surface UoM. For an enabled Unit-category product it represents the selected Unit UoM: one Unit is one piece and one Dozen is twelve pieces. The typical glassworking workflow above does not require that Unit-category exception.

Example: finished panes and raw glass consumption

Assume finished product A is a 400 x 500 mm pane, and one pane requires 0.23 m² of raw glass B. Both products use m². Configure the BoM to produce 0.20 m² of A from 0.23 m² of B. An equivalent BoM can produce 1.00 m² of A from 1.15 m² of B.

Quantities for the example cutting job

Finished panes (Pcs)

Finished A (m²)

Planned raw B consumption (m²)

1

0.20

0.23

5

1.00

1.15

For five panes, completing manufacturing with the planned quantities consumes 1.15 m² of B and produces 1.00 m² of A. Delivering all five panes then moves 1.00 m² of A to the customer. The five pieces describe the finished panes; they do not mean five raw stock sheets were consumed.

The 0.15 m² difference is the raw-material allowance in this example. The addon does not calculate a cutting layout, create a scrap record, or return reusable offcuts automatically. Record actual consumption, scrap, or by-products through the appropriate Odoo workflow. This BoM expresses a fixed area ratio; it does not calculate size-dependent cutting yield.

Example: partial delivery

If only three of those five panes are dispatched, enter 0.60 m² as the actual delivery quantity and retain 0.40 m² for the remaining two panes through the normal backorder workflow. With complete measurement metadata, the delivered move lines represent three pieces. Do not enter 3 in an m² quantity field: that would mean 3.00 m², equivalent to fifteen panes of this size.

Stock and cutting scope

Dimensions describe the requested cut; they do not select a particular raw stock sheet or prove that a pane fits the available material. Stock availability and reservations remain native Odoo operations. The addon does not provide sheet nesting, cutting optimization, or remnant tracking.

Quant measurement fields are read-only, deprecated informational residue, not a dimensional sheet inventory. They are retained under Legacy measurements and optional hidden columns for developer diagnostics; dimension grouping and measurement pivot extensions are disabled. Stock operations create, gather, reserve, synchronize, clean, and merge quants using native Odoo identity only. Other sheet-material sectors can use the same area, perimeter, and logistical-piece model within the supported UoM categories.

Measurement semantics

The canonical dimension key is the order-invariant, whitespace-free AxB form in millimeters at one-decimal precision. For example, 200 X 100 and 100.0x200.0 both become 100x200. Deliberate commercial sale entry rejects malformed, negative, and one-sided dimensions. Downstream generated records instead retain a complete safe snapshot or omit unsafe metadata. 0x0 is dimensionless and persists as False.

Height and width are authoritative only for informational geometry. Directly writable measured records normalize them to declared precision and reject a contradictory dimension. Unit perimeter and unit area are derived metadata. None of these values changes stock identity or availability.

Commercial sale specifications require complete positive height and width and a canonical matching dimension. Commercial quantities use normal Odoo UoM rounding controlled by product.uom_id.rounding. Whole-piece validation rejects a sale quantity if product-UoM rounding cannot distinguish it from an adjacent piece count. Procurement, stock, manufacturing, and accounting workflows do not fail solely because copied PMIS metadata is absent, stale, incomplete, unsupported, or malformed.

Surface products

For an automatically applicable Surface product, stock quantity is commercial area in the selected Surface UoM. On measured sales lines, pieces is the validated integer count of panes or other sheet pieces. Downstream piece counts are informational quantities derived from the record's area and measurement metadata. The four-decimal geometric area describes the cut piece and can differ from commercial square meters within the product UoM rounding; it does not define stock identity.

Square meter (uom.uom_square_meter) is the geometric reference. Pieces per selected UoM is the Odoo conversion of one selected Surface UoM to m² divided by one sheet's area in m². Compatible Surface UoMs such as square centimeters and square feet therefore use their configured Odoo ratios. Arbitrary explicit overrides are unsupported: a supplied positive factor must equal the deterministic geometry/UoM result and cannot bypass complete geometry or applicability validation.

Unit-category products

For an explicitly enabled Unit-category variant, physical pieces are derived from the standard Odoo Unit-category conversion independently of sheet area. One Unit has a factor of 1 and one Dozen has a factor of 12. Geometry still must be complete and positive and still determines the informational dimension, area totals, and perimeter totals. The exception does not make other UoM categories applicable.

An ordinary Unit-category variant with the exception disabled, or any weight, length, volume, or unsupported custom-category product, remains a standard Odoo record. Zero-valued PMIS fields alone do not classify a record as measured.

Conversion factors are stored and normalized at 12 decimal places without UoM rounding. When a transaction uses another compatible UoM, its quantity is converted without intermediate rounding into the product stock UoM. Whole-piece validation then compares supplied and expected quantities after HALF-UP rounding with the product stock UoM increment. For example, the Surface contract accepts 2.62 m² as the commercial representation of one 2890 x 906 mm sheet whose geometric area is 2.6183 m², while rejecting 2.63 m² for that sheet. A positive factor that rounds to zero at the validation boundary is rejected as unrepresentable rather than treated as unknown. Piece counts use Decimal HALF-UP once at the integer boundary; conversion back to commercial quantity uses the target UoM rounding once. Move splits allocate rounded pieces to the split and assign the original piece remainder to the source move.

Deprecated quant display residue uses signed arithmetic, including negative quants:

  • pieces on hand = quantity * pieces per UoM;

  • area total = pieces on hand * unit area;

  • perimeter total = pieces on hand * unit perimeter.

Zero quantity therefore produces zero compatibility balances. These fields do not define physical stock, availability, reservation, valuation, or quant identity.

All moves use standard Odoo removal and reservation behavior regardless of PMIS measurements. Generated move lines retain the move's measurements for reporting; quant metadata is never copied as reservation authority.

Procurement and manufacturing

Procurement copies a complete safe normalized snapshot when provenance is unambiguous and otherwise omits PMIS metadata. Invalid metadata never aborts procurement. Finished manufacturing moves may inherit a safe manufacturing-order snapshot. Raw component moves remain unmeasured unless their own BoM line defines complete safe geometry; finished-product geometry is never guessed for raw materials.

For enabled Unit-category products, sales pieces control sale quantity. Downstream BoM, manufacturing-order, and stock-move demand quantities retain native Odoo ownership, while validated piece and geometry metadata propagate alongside them. Ordinary components remain ordinary.

Quant merge and reservation cleanup are native Odoo operations. Quants with the same native company, product, location, lot, package, and owner identity can merge even when deprecated PMIS residue differs.

Bug Tracker

Bugs are tracked on PMISuite Repository Issues. Before opening a new issue, check whether it has already been reported. Include the module and Odoo versions, steps to reproduce, and expected and actual results. Use synthetic examples and redact sensitive information.

Credits

Authors

Contributors

  • Matjaž Mozetič

  • Devid Miklus

Maintainers

LUXIM MATMOZ

Current maintainer:

sysadminmatmoz

Luxim is an independent R&D and deployment company focused on solving complex problems in the Odoo ecosystem.

Odoo Community Association

Luxim is an active member of OCA (Odoo Community Association).