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

Skip to main content

Three things decide which opening styles a series offers and what they get: the series’
Openings tab (which opening types it may use), the Open/Shape tab (one record per style the salesperson
can pick — its ID is the “UD Opening” that rule tests use) and the rules that test
Open Class or UD Opening. The tabs are described in Series detail
tabs
.

An example

  • 7100 (230) allows opening types 1, 2, 3, 4, 5, 71, 72, 73, 271, 272, 273 on its Openings tab.
  • Its Open/Shape records include 1 O, 18 COL, 17 COR, 19 TOH, 20 BS, 301 O_CMD, 302 O_AV (door).
  • Rules 1312–1354 test Open Class and call the casement sash sub-routine 138, hardware 273, beads 228
    once per class (2 LH, 3 RH, 4 Top hinged, 5 Fixed sash). Rule 1312 calls 138 at Level Sash for Open Class 4.
  • 3501.FRAME rule 55 puts the frame head on only for a fixed list of UD Openings (1, 23, 24, 26, 27, 39, 41, 46, 47,
    51, 56–59).

Steps

  1. Series → Openings tab: tick the opening type → save.
  2. Series → Open/Shape tab: New → name, opening type, pricing, min/max sizes → Save.
    Note the new record’s ID.
  3. Find every rule that tests Open Class or UD Opening (assistant recipe below). For each one that
    should also apply to the new style, open the rule → Rule Tests → select the test → add the new ID in
    Value(s) with + → Save.
  4. For a new class, copy the block of Rule Segment rules of a similar class (use Insert to keep
    the block in order under its station and assembly rules) and change the Open Class value.
  5. If the style needs other sash parts or hardware, copy the sash sub-routine and point the new calls at the copy.
  6. Build one item with the new style; check sash, hardware, beads, frame profiles, labour and stations on the BOM.
The usual symptomUD Opening tests list exact IDs, so a new
Open/Shape record is in none of them until added. Missing frame profiles or sash assemblies on the new style
are the typical result. The Test On choices depend on the rule’s Level, so Open Class / UD Opening may not be
offered at every level.
For the AI assistant: rules to check

Use read_data on the company database, read-only. Replace :series with the id of the series the user names (find it with SELECT id, description FROM series WHERE description LIKE '%7100%'). One statement only, starting with SELECT or WITH, no semicolon, at most 200 rows. The guard rejects these words anywhere, even inside quoted text or aliases: INSERT, UPDATE, DELETE, REPLACE, MERGE, UPSERT, CALL, DO, SET, CREATE, ALTER, DROP, TRUNCATE, GRANT, REVOKE, RENAME, LOCK, UNLOCK, HANDLER, LOAD, EXECUTE, EXEC — so run the recipes as written, with no extra labels. A product is the series plus every sub-routine it calls; the recipes walk that tree. They return numbers, because the company database has no rule-type name tables: translate them with the list below, and answer in shop words.

R4 — the Open/Shape records (UD Opening IDs) of the series:

SELECT o.id AS ud_opening_id, o.abbreviation, o.opening_id, o.`window`, o.door, o.standard,
o.min_width_imp, o.max_width_imp, o.min_height_imp, o.max_height_imp,
o.stile_b_fixed, o.stile_b_lock, o.stile_b_interlock, o.interlock_overlap, o.glass_clearance_left, o.glass_clearance_right
FROM series_valid_opening_shape o
WHERE o.series_id = :series AND o.deleted = 0
ORDER BY o.sequence, o.id
LIMIT 200

R8 — every rule that depends on the opening style (test type 10 UD Opening, 11 Open Class). On 3501 it
hits the 200-row cap; add AND r.level = ... or keep one test type to narrow it:

WITH RECURSIVE tree(sid) AS (
SELECT :series
UNION
SELECT r.rulevalue FROM tree t
JOIN rules r ON r.series_id = t.sid AND r.ruletype IN (3, 9) AND r.active = 1
)
SELECT r.series_id, r.id AS rule_no, r.ruletype, r.level, LEFT(r.description, 35) AS description,
t.testid, t.type AS test_type, IF(t.isnot = 1, 'NOT', '') AS negated,
GROUP_CONCAT(v.value ORDER BY v.value) AS opening_values
FROM tree
JOIN rules r ON r.series_id = tree.sid AND r.active = 1 AND r.test = 1
JOIN rule_test t ON t.seriesid = r.series_id AND t.ruleno = r.id AND t.type IN (10, 11)
LEFT JOIN rule_test_value v ON v.seriesid = t.seriesid AND v.ruleno = t.ruleno AND v.testid = t.testid
GROUP BY r.series_id, r.id, r.ruletype, r.level, r.description, t.testid, t.type, t.isnot
ORDER BY r.series_id, r.id
LIMIT 200

Numbers to names. Rule type: 1 Option Choice, 2 Option Auto, 3 Option sub-routine, 4 Clearance, 5 Clearance Matrix, 6 Part, 7 Part Matrix, 8 Profile Matrix, 9 Rule sub-routine (Rule Segment), 10 Comment, 14 production line, 15 station, 19 Warning, 20 Error, 21 glass supplier, 24 SU gas, 25 SU spacer, 43/44 SU thickness, 90 assembly, 92 parent assembly. Level: 1 Overall, 2 Facet, 3 Frame, 4 Sash Type, 5 Sash, 6 Glass, 7 Glazing Bead, 8 DLO, 29 Grids, 31 Coupler, 32 Mullion, 40 Opening. Position: 1 Top, 2 Bottom, 3 Left, 4 Right, 5 Top+Bottom, 6 Left+Right, 7 All Sides, 11 WxH/Area, 13 Perimeter, 26 Unit. End cut: 1 Mitered, 2 Straight, 3 Machined. Test type: 8 Global Option, 9 Shape/M Option, 10 UD Opening (Open/Shape id), 11 Open Class (1 Picture, 2 LH, 3 RH, 4 Top hinged, 5 Fixed sash), 15 SU Type, 17 SU Thick. Sizes: metric columns are mm×100, imperial columns (ending in i or _imp) are 64ths of an inch; an imperial company (series_uom 2) uses the imperial ones.