Bill of Materials
A Bill of Materials (BOM) is the recipe for a finished good — it tells ERPat exactly what to build, from which raw materials, and through which routing steps, so a Manufacturing Order can later be produced from it consistently.
Production › Bill of Materials (route production/Boms). It reads
finished goods, components, and units directly from the shared Inventory (items, variants,
units) and reads stations from Work Centers — but a BOM by itself
never moves stock. Stock only moves when you run a Manufacturing
Order built from the BOM.
Anatomy of a BOM
Every BOM record is made of one header and two child sets, all managed from a single tabbed view page:
Which finished good this recipe produces, its output quantity and unit, a version / reference label, a status (Active / Inactive), and free-text notes.
The raw-material lines consumed to build the output — each with an item, a quantity, a unit, and optional notes.
The ordered routing steps — each with a sequence, a name, an optional work center, and an estimated duration in minutes.
The Bill of Materials list
The list at Production › Bill of Materials is the master index of every BOM and
your entry point for creating, viewing, editing, and deleting them. It is a searchable, sortable
DataTable (boms-table) with a refresh button, sorted ascending by the first column by
default. An Add Bill of Materials button sits at the top-right (visible only if you hold the
create permission) and opens the BOM modal form.
List columns
| Column | Meaning | Notes |
|---|---|---|
| Bill of Materials | The BOM title. | Links to the BOM's single-record view page. |
| Reference | The version / reference label. | Free text; blank if none was entered. |
| Finished Good | The product this BOM produces. | Item title, resolved from the item's default variant. |
| Output Quantity | Yield of one run (quantity + unit). | Right-aligned; shows the unit next to the number. |
| Components | Count of non-deleted component lines. | Centered numeric column. |
| Operations | Count of non-deleted routing operations. | Centered numeric column. |
| Status | Active or Inactive. | Centered badge — green for Active, grey for Inactive. |
| Options | Per-row action buttons. | View, Edit, and Delete (see below); each gated by permission. |
Per-row actions
production_bom_update.production_bom_delete.The BOM header form
Adding or editing a BOM opens the modal form (production/Boms/modal_form). A hidden
id field distinguishes create (blank) from edit (present). The Save button
(blue, check-circle icon) sits in the footer; on success the affected list row refreshes in place —
no full page reload.
| Field | Meaning | Required | Notes |
|---|---|---|---|
title — Title |
Name of the BOM, e.g. “Chocolate Cake — Standard”. Used as the list link and the view-page header. | Required | Text input, autofocus. Server-side required. |
item_id — Finished Good |
The product this BOM produces. | Required | Select2. Lists only active items of type product. Placeholder “- Select finished good -”. Numeric server-side. |
quantity — Output Quantity |
How many units of the finished good one run yields; the batch the components/operations are scaled to. | Optional | Number input, step any. Defaults to 1 if left blank. Stored as DECIMAL(15,2). |
unit_id — Unit |
Unit of measure for the output quantity (pcs, kg, …). | Optional | Select2 on the same row as Output Quantity. Compound units show as “Title - value childTitle”. Placeholder “- Select unit -”. Stored NULL if blank. |
reference — Version / Reference |
Free-text version or reference code, e.g. v2, Rev-A. | Optional | Text input, VARCHAR(100). Stored as empty string if blank. Appears in the Reference column and view summary. |
notes — Notes |
Free-text notes about the BOM. | Optional | Textarea, TEXT column (long). Stored as empty string if blank. Shown on the view page with line breaks only if present. |
status — Status |
Whether the BOM is Active (usable) or Inactive. | Optional | Select2 with options Active / Inactive. Defaults to active. Only Active BOMs appear in BOM pickers elsewhere. |
- even though the item exists.
The BOM view page (tabbed)
Clicking a BOM title (or the eye icon) opens its single-record view at
production/Boms/view/{id}. This page is a read-only header summary plus two tabs that
load their content over AJAX. A Back arrow returns you to the list; an Edit button
(top-right, visible with production_bom_update) reopens the same header modal pre-filled.
The two child sets live under a tabbed layout on this page. Below is the same structure you'll see — a Header summary, the Components tab, and the Operations tab, each with its own fields:
The header summary is read-only on the view page. To change any of these values, use the Edit button, which reopens the header form above.
| Summary field | Shows | Notes |
|---|---|---|
| Finished Good | The product this BOM produces. | Item title from the default variant. |
| Output Quantity | Quantity + unit of one run. | e.g. 1 pc. |
| Version / Reference | The reference label. | Blank if none. |
| Created By | The user who created the BOM. | Resolved to the user's legal name. |
| Notes | Free-text header notes. | Rendered with line breaks; shown only if present. |
The Components tab (cubes icon) loads
production/Bom_components/index/{bom_id} and lists the raw-material lines in a
DataTable (bom-components-table, no refresh button). An Add Component button
(small; visible with the create permission) opens the component modal.
Component list columns
| Column | Meaning | Notes |
|---|---|---|
| Component | The raw-material item. | Item title from the default variant. |
| Quantity | Amount needed per output batch. | Right-aligned. |
| Unit | Unit of measure. | Shows - if empty. |
| Notes | Free-text line note. | Shows - if empty. |
| Options | Edit and Delete buttons. | Gated by update / delete permission. |
The Operations tab (list-ol icon) loads
production/Bom_operations/index/{bom_id} and lists the routing steps in a DataTable
(bom-operations-table, no refresh button), sorted ascending by the Sequence column.
An Add Operation button (small; create permission) opens the operation modal.
Operation list columns
| Column | Meaning | Notes |
|---|---|---|
| Sequence | Order of the step in the routing. | Centered; lower runs first. |
| Operation | Name of the routing step. | e.g. Mixing, Baking, Packing. |
| Work Center | Where the step is performed. | Shows - if none. See Work Centers. |
| Duration (minutes) | Estimated time for the step. | Right-aligned; an estimate only. |
| Notes | Free-text step note. | Shows - if empty. |
| Options | Edit and Delete buttons. | Gated by update / delete permission. |
The Component form
Adding or editing a component opens the modal at production/Bom_components/modal_form.
Hidden id and bom_id fields tie the line to its parent BOM. On success the
components table row refreshes in place.
| Field | Meaning | Required | Notes |
|---|---|---|---|
item_id — Component |
The raw-material item consumed by this line. | Required | Select2 populated inline from active product items. Placeholder “- Select item -”. Numeric server-side. |
quantity — Quantity |
How much of the component is needed for the BOM's output batch. | Required | Number input, step any. Stored as DECIMAL(15,2). |
unit_id — Unit |
Unit of measure for the component quantity. | Optional | Select2 (units), on the same row as Quantity. Stored NULL if blank; shows - in the table. |
notes — Notes |
Free-text note for this line. | Optional | Textarea, VARCHAR(500). Stored as empty string if blank; shows - in the table. |
The Operation form
Adding or editing a routing step opens the modal at
production/Bom_operations/modal_form. Hidden id and bom_id
fields tie the operation to its BOM. On success the operations table row refreshes in place.
| Field | Meaning | Required | Notes |
|---|---|---|---|
title — Operation |
Name of the routing step, e.g. Mixing, Baking, Packing. | Required | Text input, autofocus. Server-side required. |
work_center_id — Work Center |
Where / how the operation is performed (the machine, station, or resource). | Optional | Select2. Lists active work centers; label shows “code - title” when a code exists. Placeholder “- Select work center -”. Stored NULL if blank; shows - in the table. |
sequence — Sequence |
Order/position of this step in the routing (lower runs first). | Optional | Integer input, step 1. Defaults to 1 if blank. Operations list by sequence ascending, then id. |
duration_mins — Duration (minutes) |
Estimated time to perform the operation, in minutes. | Optional | Number input, step any. Stored as DECIMAL(15,2); empty is stored as 0. An estimate — it does not schedule anything by itself. |
notes — Notes |
Free-text note for this operation. | Optional | Textarea, VARCHAR(500). Stored as empty string if blank; shows - in the table. |
Status lifecycle
A BOM has a simple two-state status. It has no draft/confirm workflow of its own — you toggle it between Active and Inactive by editing the header. Status controls one thing: whether the BOM is offered in BOM pickers used elsewhere in Production.
A BOM starts Active by default; edit the header to move it either way at any time.
Actions & permissions
Every action on the BOM, Component, and Operation screens is gated by one of four permission keys.
Access to any of these screens first requires the module-level production_bom
permission (and the production module must be enabled).
| Action | Effect | Confirmation | Permission |
|---|---|---|---|
| Add Bill of Materials | Opens the empty BOM header modal. | None | production_bom_create |
| Save BOM | Creates a new BOM (sets created_by / created_at; quantity defaults 1, status active, reference/notes empty, unit NULL) or updates the existing one. Refreshes the list row. | None (direct submit) | production_bom_create / production_bom_update |
| View BOM | Opens the single-record view with header summary and the two tabs. 404 if missing/deleted. | None | production_bom (module access) |
| Edit BOM | Opens the header modal pre-filled (from list row or view-page Edit). | None | production_bom_update |
| Delete BOM | Soft-deletes the BOM and cascade soft-deletes all its components and operations. | Standard delete-confirmation dialog | production_bom_delete |
| Add Component | Opens the component modal with the BOM pre-set. | None | production_bom_create |
| Save Component | Creates or updates a component line (requires item + quantity). Refreshes the row. | None | production_bom_create / production_bom_update |
| Edit Component | Opens the component modal pre-filled. | None | production_bom_update |
| Delete Component | Soft-deletes that single component line. | Standard delete-confirmation dialog | production_bom_delete |
| Add Operation | Opens the operation modal with the BOM pre-set. | None | production_bom_create |
| Save Operation | Creates or updates an operation (requires title; sequence defaults 1, duration 0, work center optional). Refreshes the row. | None | production_bom_create / production_bom_update |
| Edit Operation | Opens the operation modal pre-filled. | None | production_bom_update |
| Delete Operation | Soft-deletes that single operation. | Standard delete-confirmation dialog | production_bom_delete |
| Back | Returns from the view page to the BOM list. | None | production_bom (module access) |
Permission keys at a glance
- production_bom
- Module-level gate — required to reach any BOM / Component / Operation screen. Missing it redirects you away; also requires the
productionmodule to be enabled. - production_bom_create
- Add a BOM, and add/save Components and Operations.
- production_bom_update
- Edit/save a BOM, Component, or Operation; controls whether Edit buttons appear.
- production_bom_delete
- Delete a BOM (cascades to its components and operations), or delete an individual Component or Operation.
SOP — Build a complete, production-ready BOM
production_bom_create. The finished good and every component item exist as
active products in Inventory, the units you need exist, and your
Work Centers are set up.
-
Create the header
Go to Production › Bill of Materials and click Add Bill of Materials. Fill in the Title, pick the Finished Good, and set the Output Quantity and Unit (e.g. 1 pc). Optionally add a Version / Reference and Notes; keep Status = Active. Click Save. The new BOM appears in the list.
-
Open the BOM
Click the BOM's title (or the eye icon) to open its view page. The Components tab opens automatically.
-
Add the components
For each raw material, click Add Component, select the item, enter the Quantity and Unit, add a note if needed, and Save. Enter quantities for the BOM's chosen Output Quantity batch — component quantities are not auto-scaled.
-
Add the routing operations
Switch to the Operations tab. For each step, click Add Operation, enter the Operation name, choose a Work Center, set the Sequence (order) and Duration (minutes), and Save. Operations always list in ascending sequence order.
-
Review & activate
Confirm the header badge reads Active, the list shows the correct component and operation counts, and the operations appear in the intended sequence. The BOM is now available (as Active) to build a Manufacturing Order.
SOP — Revise or retire a BOM
production_bom_update (and
production_bom_delete to remove lines).
Edit the header
Open the BOM's view page and click Edit to change header fields — e.g. bump the Version / Reference or adjust the Output Quantity.
Adjust the lines
Add, edit, or delete Components and Operations on their tabs as needed.
Retire, don't delete
To retire the recipe while keeping its history, set Status = Inactive. It stays viewable but disappears from BOM pickers.
Or remove entirely
To delete the BOM outright, use Delete on the list — which also removes all of its components and operations.
deleted = 1) so rows remain in the database, but there is
no per-record undo in the UI. To hide a recipe rather than destroy it, set it
Inactive instead.
Validation & system messages
The forms validate required fields server-side and surface these exact messages:
| Situation | Message shown |
|---|---|
| Required field left blank (Title, Finished Good, Component, Quantity, Operation) | “This field is required.” |
| Any save succeeds (BOM / Component / Operation) | “The record has been saved successfully.” |
| Any delete succeeds | “The record deleted successfully.” |
| A save fails | “An error occurred while processing the request.” |
| A delete fails | Record-cannot-be-deleted message. |
| A finished good is missing (elsewhere in the module) | “A finished good is required.” |
| Opening a non-existent / deleted BOM view | HTTP 404 (page not found). |
Good to know
deleted = 1) and excluded from every query, but there is no in-UI undo.item_variants.title via the item's default_variant_id. An item with no default variant may show its title as - even though it exists.