Open core: don’t reinvent the wheel — build your fenestration software on ours.

Skip to main content

Everything a window or door is made of is a part: one row in the parts table, created
and changed in OJ Setup → Product Setup → Parts. Every BOM line, cut-list row and price on an
order points back to one of these rows. This chapter says what a part holds field by field, why each field
exists, when to set it, and the units rules that trip up even careful setups — written so a person
or an AI assistant doing tenant setup can follow it end to end.

What, where, who, when, why

What A part is one catalogue row: an extruded profile, a sealed unit, a screen, a
hardware item, packaging — anything the BOM can consume — with its identity, its dimensions in metric
and imperial, and its cost and price rules.
Where OJ Setup → Product Setup → Parts. The same screen carries the
bulk tools: import new parts from a spreadsheet,
update costs and prices from a spreadsheet,
bulk CAD import and assembly pairs.
Who The person (or AI) setting up the tenant. Shop-floor users never open this
screen; they meet parts through the item designer, the stock screens, cut lists and reports.
When When a series or a supplier catalogue is added; when a cost, a dimension or a
saw code changes; when configured (wildcard) colour parts are created; after a CAD import, to fill in the
dimensions the imported drawings carry.
Why it matters Manufacturing rules select parts by id or through a matrix; the
costing engine multiplies the part’s cost by a measure (length, area, face, weight…) built from
these fields; the drawing engine derives the glass line from Dim B and Dim A. A wrong unit here is a wrong
price and a wrong cut on every order that uses the part.

Working with the screen

  1. The list on the left shows every part’s ID / Stock Code / Description. The five search
    checkboxes — All, Family, Type, Stock Code, Description — behave like radio buttons (checking one
    unchecks the rest). All reloads the full list at once; the others wait for Search.
  2. New starts a blank part, Edit changes the selected one, Copy starts a new part
    from the selected one (next id, stock code with " copy" appended), Delete removes it.
    While editing, only Save and Cancel are active and the list is locked.
  3. The details sit in four panes that fold like an accordion — Header Details, Dimensions
    & Limits
    , Costing & Pricing, Additional Fields — one open at a time.
  4. Categorize (top-left) manages part families; the other top buttons open the bulk tools listed
    under Where above.
  5. Upload image attaches a part picture; the server keeps it as a 300×300 thumbnail.
  6. The Dimensions pane also draws the part’s linked CAD cross-section with its A/B/C dimension
    lines; typing a new A, B or C moves the lines on the drawing as you type.

Header Details — identity and behaviour

Field What it does, and when to set it
ID The part’s number. The screen suggests the next free id on New, but the
server assigns the final id when saving — treat it as read-only. Rules and imports refer to a part by this
id or by its stock code.
Stock Code Required. The code rules, imports and wildcard matching work with.
Stock codes are not checked for uniqueness on this screen (duplicates are legal but confusing —
imports that match more than one part skip the row). Typing a wildcard character (see
Configured below) auto-ticks Configured.
Description Required. Shown on the BOM, documents and searches.
Type What kind of thing the part is (profile, glass, hardware…). The list is
tenant-defined (type_part); the type also decides whether the Stk→Use conversion
is stored scaled or raw (see Dimensions).
Family A grouping used by the search and by categorization; managed with the
Categorize button.
Stocked On (the default for new parts): the part is kept in stock and gets a stock
record. Forced off for Configured parts — a template is never stocked.
Made In The part is produced in-house rather than purchased.
Sell The part can be sold on its own (appears as a sellable line).
Kit The part is a kit. Kit parts are excluded from the parts import.
Tracking The part is individually tracked/serialized.
Add As Line When a rule picks this part it is added as its own order line, not
only into the BOM.
Add to Design The part can be placed on the drawing in the item designer (not just
a BOM entry).
Configured Marks a master/template part whose stock code contains a wildcard —
see the callout below. Only Configured parts show (and save) Series and Master Stock.
Series The series a Configured part belongs to.
Master Stock For a Configured part: the real stocked part the wildcard code
resolves to.
Shipping / Installation Two independent radio pairs marking the part as a shipping
or an installation charge.
Add Specified QTY / Multiply Item QTY How a rule’s quantity is applied: a fixed
quantity per item, or the rule’s quantity multiplied by the item quantity.
Waste Waste factor as a plain decimal (5 = 5%), added on top of consumption when
the part’s waste is used.
Print On A.List Include the part on assembly-list prints.
Costing Method Which cost figure costing starts from: 1 LIFO,
2 FIFO, 3 Average, 4 Standard, 5 Most Recent.
Stock UOM / Usage UOM The unit the part is stocked in vs the unit it is consumed
in (a bar vs a foot, a sheet vs a square foot). Stk→Use (Dimensions pane) converts between
them.
Configured (wildcard) parts — one row for a family
A stock code containing a wildcard character stands for a family of parts, e.g.
VP-4020@C = “profile VP-4020 in any colour”. The Configured part is the master definition: it
points at a Master Stock (the plain stocked part) and a Series, it is never stocked itself,
and paint costing finds it through the wildcard — the colour option’s answer rate is multiplied by the
part’s Face In / Face Out / Perimeter (see Dimensions). The screen accepts the wildcards
@ # ^ * & $; the costing engine matches @ * ^ ~ ! # — use one of the
characters both know, @ # ^ *, to be safe.

Dimensions & Limits — and the units rules

Units — read before typing anything
Every dimension is a metric / imperial pair, and each column is stored its own way:

  • Metric column = the number you type × 100, stored as a whole number (hundredths of a
    millimetre): typing 31.75 stores 3175.
  • Imperial column = the number you type × 64, stored as a whole number (64ths of an inch):
    typing 1.25 stores 80.
  • Except Face In, Face Out, Perimeter: stored exactly as typed in both columns —
    they are paint-rate multipliers, not dimensions. In the Additional Fields pane, Weight, Trimcut, Min
    Size Offcut, Width, Height
    are also raw, and Waste (Header) is a raw decimal.
  • Stk→Use follows the ×100/×64 rule only when the part’s Type is flagged
    metric/imperial; for other types it is stored exactly as typed.

An AI writing parts through the REST API must apply these scalings itself — the screen does it for a human,
the API does not.

Field (each has mm and in columns) What it is for
Profile Shape The cross-section shape (tenant list), used by CAD drawings and
geometry.
Dim A, Dim B, Dim C, Dim D The profile’s cross-section dimensions. The drawing
engine derives the glass/DLO line (BA) and the opening line (A) from Dim B and Dim A; C and D are carried
to cross-section drawings and reports. Dim B-to-C and Dim M extend the set for profiles that need them.
Face In / Face Out The painted face widths (inside / outside). Raw values; see the
paint costing under Additional Fields → Add Paint Cost.
Perimeter The cross-section perimeter, also a raw paint multiplier.
Min Bend Radius Smallest radius the profile can be bent to (curved/bent parts).
Max Mitre Length Longest piece that can be mitre-cut on the available equipment.
Weld Burn – 45 / Weld Burn – Other Weld allowance (burn-off) read by cut
calculations for welded corners — 45° joints vs others.
Stk→Use How many usage units one stock unit yields (20 ft bar → 20 ft).
Scaling is conditional — see the units callout.

Costing & Pricing

Field What it does
Matrix Cost (+ combo) When checked, the part’s cost comes from a
cost matrix and the manual Cost field is locked at 0. When
unchecked, Cost is used.
Cost Group The cost group: length/area rounding and
minimum area applied to this part’s costs (how groups round).
Cost The unit cost, in the part’s cost measure — per foot, per each, per sq ft…
Matrix Price (+ combo) Same as Matrix Cost, for price; locks Price and
Min Price at 0.
Price Group The price group: rounding and minimum
area for the price side.
Price / Min Price The unit price and the smallest price charged.

The Cost Measure and Price Measure fields live in the Additional Fields pane but belong
here logically — they say what the cost/price is per:

Measure The cost/price is multiplied by
1 Each Nothing — one charge per piece.
2 Length The cut length (ft / m).
3 Area The area (sq ft / m²) — glass, screens.
4 / 5 / 6 Face In / Face Out / Perimeter That raw dimension × the cut length
(paint-style pricing per exposed face).
7 Weight The part’s weight (cost by weight).
8 Volume The volume.
9–11 Per-each variants used by specific pricing flows.

Additional Fields

Text and number fields first (Stock W / Stock H are the stocked width and height; Std Size ID, Buffer ID,
Attribute ID, Prodline, Station, Report and Label Pos point at their respective setup rows; Cost / Price
Markup are raw decimals; Inertia is the section’s moment of inertia; Min Cost is a cost floor):

Field Set it when…
Notes Free text for setup/purchasing staff; nothing else reads it.
Reference / Reference 2 / Reference 3 Free-form codes whose meaning depends on
the part family
: on standard-glass parts they become the thickness/type columns of the glass cut
list, on spacer and gas parts they are the codes exported to the IG line, elsewhere they are whatever
the tenant wants (mill stock number, model name). See
Die No, Saw Code & the reference fields below.
Color The part has a fixed colour (not a wildcard family).
Die No Extruded profile — the die number from the mill. Flows into saw download
files and cut sheets, and links CAD cross-sections. Details below.
Saw Code / Saw Process / Machine Type The cut should go to a specific
saw / profile position or machine. Details below.

The checkboxes, each a one-line “when”:

Checkbox Turn it on when…
Discountable Line discounts may apply to the part.
Taxable The part is taxed when the order taxes products.
Std. Sizes The part is offered in standard sizes (set Std Size ID).
Show In Cut Sheet The part must appear on cut sheets.
Show As C/M / Show As Profile The part should appear in the designer’s
coupler/mullion or profile picks.
Ships The part ships with the order (as opposed to being consumed in
production).
Is Packaging The part is packaging material.
Allow BO The part may be back-ordered.
Change Price Its price may be edited on the order line.
Add Paint Cost / Add Paint Labour Paint costing: the chosen colour answer’s rate
(and labour rate) is multiplied by the part’s Face In / Face Out / Perimeter and added to the cost.
Set As Item Description The part’s description should label the order line.
Ask For Confirmation The configurator must ask before adding the part.
Track IG Units Sealed units — serial tracking of IG units.
Use Price For Sellable / Use Waste For Sellable When selling the part
standalone should use this price / add this waste.
Use Bom Cost For Purchasing Purchasing should use the BOM cost.
Highlight Production The part is highlighted on production documents.
Auto Update Actual Cost Actual cost is refreshed automatically from
receipts.

Die No, Saw Code & the reference fields — how OJ talks to saws and IG lines

These fields do nothing while a part sits in the catalogue. They matter the moment cut data
leaves OJ — saw download files, cut sheets, welding BOMs and IG-line exports all read them — and
they are the fields tenants disagree about most, so this section says what each one means to the code,
how companies use it, and the sentinels you will meet in imported data.

Field What the code does with it
Die No The extrusion die number from the profile mill. Saw download files write it
into their profile/die positions (the Sturtz-style exports format it as a fixed-width “DIE NO.” /
profile-code field), and the cut-sheet queries pull parts.die_no for every cut row. Two
special behaviours: the value REBAR makes welding-BOM reports print the row under a
separate Reinforcement grouping and changes its label type, and the CAD cross-section importer
links a drawing block to the part by die number — every colour variant of one extrusion shares
the die, so they share the picture.
Saw Code The program/profile code the saw should run. Machine exports write it as
the “Profile Code”; the welding-BOM report groups cut pieces by saw code (falling back to
Reference when saw code is empty) — two profiles with one saw code cut as one program. BOM cut-list
queries join parts.saw_code onto every cut piece.
Saw Process Groups cuts into processes at the saw/weld stations; carried on every
BOM cut row (parts.saw_process). Most tenants leave it at 0.
Machine Type Carried on the part but not read by the machine-data builders
today — which saw format is written comes from the report’s machine setting, not from this field.
Treat it as reserved.
Reference / Reference 2 Family-dependent. On standard-glass parts they are
the thickness and glass type columns of the glass cut-list export (exterior, middle and
interior leaves each contribute their own pair). On spacer parts, Reference is exported as the
“Spacer Stock ID” field of the IG-line record; on gas parts, as the “Gas Stock ID” field — those
are the codes the IG line’s controller recognises. On profiles and everything else they are free text:
tenants store the mill’s stock number, a model name, or a supplier code.
Reference 3 Spare. No code path reads it, and in a 2026-10 survey of every live
tenant database it was empty everywhere.
Examples from real setups

  • A vinyl manufacturer: profile 4207-WH (6000 interlock sash) carries
    Die No = Saw Code = 6SI, Reference = 6SI and Reference 2 =
    VNYL60006SIWH — the mill’s full stock number (plant + series + die + colour).
    All colour variants (-PBK-WH, wildcard -*@) repeat the same die.
  • Condado (aluminium): all colour variants of the picture frame share Die No
    CDW-20; the wall-top header uses CDW-16. One die per extrusion, referenced
    across variants — the pattern the CAD importer expects.
  • DW: every Super Spacer part carries Reference = SS — the code sent to the IG
    line as the spacer stock id.
  • A third manufacturer: spacer Reference holds the mill order code (010003,
    1532RT) exported the same way.
  • Another manufacturer: on profiles, Reference holds the window model (3750 SASH) — free text,
    nothing machine-facing. Same field, different meaning: always check the family before copying a
    convention.
Sentinels you will meet in imported data
The columns are NOT NULL defaulting to "0", so most parts show
0 (or the padded 00000) — that means unset, not a code. Some imports
(Acadian, Aurora, Jetalum, GlassOps) write -1 on every part that never goes to a saw — an
import-time marker, not something the code checks. Saw Process N similarly means “none”.
When you take over such a tenant, keep the sentinels or clean them, but never copy them as real
codes.

Who and when. The setup person (or AI) fills these when a tenant first connects a saw or an IG
line, when a profile catalogue is imported, and whenever a die or program changes at the mill. The safe
order: set Die No and Saw Code on the master (wildcard) part of each extrusion, then copy them to
every colour variant — the saw needs one code per extrusion, not per colour. The line-station setup can
also maintain a per-station list of allowed saw codes (production_stations_profile_saw_code),
which the machine-file generator reads — as of the 2026-10 survey no live system had rows in it, so treat
it as available-but-unused rather than a working default.

Three worked examples

1 — an extruded frame profile, stocked and costed by length. The commonest kind of part:

Field Value Why
Stock Code / Description VP-4020 / Frame profile 3-1/4 Plain code — no wildcard, so it is a normal stocked part.
Type / Family Profile / Frames Profile types carry the metric/imperial flag that scales Stk→Use.
Stocked / Made In / Sell On / On / Off Extruded in house, kept in stock, not sold on its own.
Stock UOM / Usage UOM / Stk→Use (in) Bar (20 ft) / ft / 20 One 20 ft bar yields 20 ft; consumption forecasting uses this.
Dim A / Dim B (in) 1.25 / 0.75 Feeds the drawing engine’s A and BA lines — wrong here misplaces the glass line on every drawing.
Cost Measure / Cost 2 (Length) / 2.85 $2.85 per foot of cut length.
Cost Group “Profiles — round length up to 2 in” Buys the whole last 2-in step per cut.
Saw Code / Show In Cut Sheet / Show As Profile SAW1 / On / On Cuts route to saw 1 and appear on the cut sheet.
Weight (per length, raw) 1.08 Cost-by-weight and freight flows read it raw.

2 — a sealed unit (glass), priced by area with a minimum. Made to order, never stocked:

Field Value Why
Stock Code / Description SU-2P-LOE / Sealed unit, 2 panes, Low-E One row per glass build; thickness comes from the series’ glazing setup.
Type / Family Glass / Sealed Units Drives the glass pickers and SU rules.
Stocked Off Every unit is cut to the opening — no stock record.
Cost / Price Measure 3 (Area) Charged per sq ft of glass.
Price Group “Glass — min 6 sq ft” The group’s minimum-area rule stops tiny panes being undercharged.
Track IG Units / Show In Cut Sheet On / On IG serial tracking; the glass cut list.

3 — a configured (wildcard) colour family. One row standing for “this profile in any colour”:

Field Value Why
Stock Code VP-4020@C The @ makes it a wildcard family; the screen auto-ticks Configured.
Configured / Series / Master Stock On / the series / VP-4020 The template belongs to its series and resolves to the plain stocked profile.
Stocked Off (forced) A template is never stocked.
Face In / Face Out / Perimeter 2.1 / 3.4 / 5.5 (raw) Paint multipliers — the colour answer’s rate × these values is added to the cost.
Add Paint Cost / Add Paint Labour On / On Turns on that paint calculation.

How a part reaches an order

  • Rules select parts: a part rule (rule type 6) carries the part’s
    id as its value; part-matrix and profile-matrix rules (types 7 and 8) and grid rules (28/29) select parts
    through a matrix instead.
  • Costing: for every BOM line the costing engine resolves the part’s costing method, multiplies
    the cost by the measure (× length/area/face/weight), applies the cost group’s rounding and minimums,
    swaps in a matrix cost when told to, and adds paint when the flags say so.
  • Stock: stocked parts get stock records and are consumed by orders; forecasting uses
    Waste and Stk→Use.
  • Odoo: creating, changing or cost-updating a part queues it to the Odoo product sync.

Gotchas (read this if you are an AI)

  • Apply the units rules yourself when writing through the API: metric ×100 int, imperial
    ×64 int — except Face In / Face Out / Perimeter, Weight / Trimcut / Offcut / Width / Height and
    Waste (raw), and the type-conditional Stk→Use. A cost off by exactly 64× or 100× means
    someone skipped this list.
  • The ID you send on create is ignored — the server assigns max(id)+1.
  • Delete is unguarded: no reference checks stop you from deleting a part that rules, BOMs or
    stock records still use, and the parts table has no foreign keys to catch it. Check usage before
    deleting.
  • Stock codes are not unique — a second part with the same code is accepted here, while the
    imports will report “more than one part has this stock code” and skip.
  • Ticking a matrix checkbox zeroes the manual field — Cost, Price and Min Price are forced to 0
    and locked while Matrix Cost / Matrix Price is checked.
  • After a bulk import, refresh the list: the left table carries only id / stock code /
    description and may be stale until reloaded.