Production Reference Public

Bill of Materials

Base Production 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…

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 15 min 1 views
Base Production

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.

ℹ️
Where it lives. Bill of Materials is a Base Production feature at 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:

Header

Which finished good this recipe produces, its output quantity and unit, a version / reference label, a status (Active / Inactive), and free-text notes.

Components

The raw-material lines consumed to build the output — each with an item, a quantity, a unit, and optional notes.

Operations (Routing)

The ordered routing steps — each with a sequence, a name, an optional work center, and an estimated duration in minutes.

????
Think of it as a cooking recipe: the header is the dish and how many it serves, the components are the ingredients, and the operations are the numbered method steps — performed at a work center (your oven, mixer, or packing bench).

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

ColumnMeaningNotes
Bill of MaterialsThe BOM title.Links to the BOM's single-record view page.
ReferenceThe version / reference label.Free text; blank if none was entered.
Finished GoodThe product this BOM produces.Item title, resolved from the item's default variant.
Output QuantityYield of one run (quantity + unit).Right-aligned; shows the unit next to the number.
ComponentsCount of non-deleted component lines.Centered numeric column.
OperationsCount of non-deleted routing operations.Centered numeric column.
StatusActive or Inactive.Centered badge — green for Active, grey for Inactive.
OptionsPer-row action buttons.View, Edit, and Delete (see below); each gated by permission.

Per-row actions

EyeView — opens the BOM's single-record page. Needs module access.
PencilEdit — opens the BOM modal pre-filled. Needs production_bom_update.
Times (×)Delete — opens a confirmation. Needs 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.

FieldMeaningRequiredNotes
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.
⚠️
Only active products appear. The Finished Good picker lists items whose status is active and whose type is product. Draft, inactive, or non-product items are hidden — create/activate the item in Inventory first. If an item has no default variant, its title may show as - 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 header shows the BOM title with a status badge (Active green / Inactive grey) and a summary block: Finished Good, Output Quantity (qty + unit), Version / Reference, Created By, and Notes (shown only when notes exist). The Components tab is auto-opened about 210 ms after the page loads.
⚠️
Accessing a BOM that does not exist or has been deleted returns HTTP 404. On a slow connection the auto-opened Components tab may briefly appear empty until its AJAX call returns.

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 fieldShowsNotes
Finished GoodThe product this BOM produces.Item title from the default variant.
Output QuantityQuantity + unit of one run.e.g. 1 pc.
Version / ReferenceThe reference label.Blank if none.
Created ByThe user who created the BOM.Resolved to the user's legal name.
NotesFree-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

ColumnMeaningNotes
ComponentThe raw-material item.Item title from the default variant.
QuantityAmount needed per output batch.Right-aligned.
UnitUnit of measure.Shows - if empty.
NotesFree-text line note.Shows - if empty.
OptionsEdit 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

ColumnMeaningNotes
SequenceOrder of the step in the routing.Centered; lower runs first.
OperationName of the routing step.e.g. Mixing, Baking, Packing.
Work CenterWhere the step is performed.Shows - if none. See Work Centers.
Duration (minutes)Estimated time for the step.Right-aligned; an estimate only.
NotesFree-text step note.Shows - if empty.
OptionsEdit 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.

FieldMeaningRequiredNotes
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.

FieldMeaningRequiredNotes
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.
????
The Work Center on an operation is optional, but linking one lets you tie routing steps to real capacity and cost. Set up your stations first in Work Centers.

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.

Active
usable & offered in pickers
Inactive
hidden from pickers, still viewable

A BOM starts Active by default; edit the header to move it either way at any time.

ActiveUsable and available for selection — e.g. when building a Manufacturing Order. Only active BOMs are offered in pickers.
InactiveHidden from BOM pickers but still fully viewable and editable. Use it to retire a recipe without losing its history.
ℹ️
There is no uniqueness rule — multiple BOMs can exist for the same finished good. Use the Version / Reference label and the Status field to distinguish and control which recipe is the current one.

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).

ActionEffectConfirmationPermission
Add Bill of MaterialsOpens the empty BOM header modal.Noneproduction_bom_create
Save BOMCreates 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 BOMOpens the single-record view with header summary and the two tabs. 404 if missing/deleted.Noneproduction_bom (module access)
Edit BOMOpens the header modal pre-filled (from list row or view-page Edit).Noneproduction_bom_update
Delete BOMSoft-deletes the BOM and cascade soft-deletes all its components and operations.Standard delete-confirmation dialogproduction_bom_delete
Add ComponentOpens the component modal with the BOM pre-set.Noneproduction_bom_create
Save ComponentCreates or updates a component line (requires item + quantity). Refreshes the row.Noneproduction_bom_create / production_bom_update
Edit ComponentOpens the component modal pre-filled.Noneproduction_bom_update
Delete ComponentSoft-deletes that single component line.Standard delete-confirmation dialogproduction_bom_delete
Add OperationOpens the operation modal with the BOM pre-set.Noneproduction_bom_create
Save OperationCreates or updates an operation (requires title; sequence defaults 1, duration 0, work center optional). Refreshes the row.Noneproduction_bom_create / production_bom_update
Edit OperationOpens the operation modal pre-filled.Noneproduction_bom_update
Delete OperationSoft-deletes that single operation.Standard delete-confirmation dialogproduction_bom_delete
BackReturns from the view page to the BOM list.Noneproduction_bom (module access)

Permission keys at a glance

production_bom production_bom_create production_bom_update production_bom_delete
production_bom
Module-level gate — required to reach any BOM / Component / Operation screen. Missing it redirects you away; also requires the production module 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

????
Before you start. The Production module is enabled and you hold 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.
  1. 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.

  2. Open the BOM

    Click the BOM's title (or the eye icon) to open its view page. The Components tab opens automatically.

  3. 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.

  4. 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.

  5. 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

????
Before you start. You hold production_bom_update (and production_bom_delete to remove lines).
  1. 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.

  2. Adjust the lines

    Add, edit, or delete Components and Operations on their tabs as needed.

  3. Retire, don't delete

    To retire the recipe while keeping its history, set Status = Inactive. It stays viewable but disappears from BOM pickers.

  4. Or remove entirely

    To delete the BOM outright, use Delete on the list — which also removes all of its components and operations.

Delete is a cascade. Deleting a BOM soft-deletes all of its components and operations too. Deletes are soft (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:

⚠️
BOM header requires Title and Finished Good (numeric). Component requires the component item and a Quantity. Operation requires the operation Title. Missing a required field shows “This field is required.” beneath it.
SituationMessage 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 failsRecord-cannot-be-deleted message.
A finished good is missing (elsewhere in the module)“A finished good is required.”
Opening a non-existent / deleted BOM viewHTTP 404 (page not found).

Good to know

Delete cascades: the BOM and all of its components and operations are soft-deleted together. Deletes are soft (deleted = 1) and excluded from every query, but there is no in-UI undo.
The Finished Good and Component pickers list only items with status active and type product. Draft, inactive, or non-product items won't appear — create/activate the item in Inventory first.
Titles are resolved from 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.
Only Active BOMs are offered in the selectors used by other Production features. Setting a BOM Inactive hides it from being chosen while keeping it viewable and editable.
Output Quantity and operation Sequence both default to 1 when left blank; Duration defaults to 0. Component quantities are not auto-scaled — enter them for the chosen output batch size.
Component and Operation Notes are limited to 500 characters (VARCHAR(500)); the BOM header Notes is a long TEXT column.
There is no uniqueness enforcement — several BOMs can target the same finished good. Use the Version / Reference and Status fields to distinguish and control which is current.

Snapshotted onto Manufacturing Orders

????
The BOM is a template, not a live link. When you confirm a Manufacturing Order built from a BOM, ERPat takes a snapshot of that BOM's components and routing onto the order at confirm time. Later edits to the BOM do not retro-change orders already confirmed — the order keeps the recipe it was confirmed with, which is exactly what you want for traceability. Only Active BOMs are offered when building an order.

Where to go next

Was this guide helpful?

Report a content problem