How Can We Help?
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
- 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. - 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. - The details sit in four panes that fold like an accordion — Header Details, Dimensions
& Limits, Costing & Pricing, Additional Fields — one open at a time. - Categorize (top-left) manages part families; the other top buttons open the bulk tools listed
under Where above. - Upload image attaches a part picture; the server keeps it as a 300×300 thumbnail.
- 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 conversionis 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. |
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: itpoints 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 thecharacters both know,
@ # ^ *, to be safe.Dimensions & Limits — and the units rules
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): typing31.75stores3175. - Imperial column = the number you type × 64, stored as a whole number (64ths of an inch):
typing1.25stores80. - 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. Twospecial behaviours: the value REBAR makes welding-BOM reports print the row under aseparate 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. |
- A vinyl manufacturer: profile
4207-WH(6000 interlock sash) carries
Die No = Saw Code =6SI, Reference =6SIand 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 usesCDW-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.
The columns are
NOT NULL defaulting to "0", so most parts show0 (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 — animport-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.