6th August 2007
Amended 30th March 2024
Products are defined as goods or services that were, are, or will be sold by the enterprise. Goods are products that are more tangible in nature and generally created in advance for sale. Services are products that involve the use of parties' time and are less tangible in nature. Every organisation needs to know a great deal of product information on a regular basis, such as the following:
Just as the PARTY model stores common information about parties independent of their roles, the product model stores common product information regardless of whose products they are. This product model is therefore more flexible, stable and understandable because product information is modeled only once, regardless of whether it is the enterprise's products, competitor's products, or supplier's products. This document models information on the following product areas:
Product inventory is described in a separate document.
Products include both tangible offerings, which are called GOODs, and non-tangible offerings, which are called SERVICEs. GOODs are physical objects which can be stored, packed and shipped, such as pens, furniture and equipment, whereas SERVICEs are for the sale of people's time or expertise, such as consulting services, management or legal services.
Figure 1 - Products
Table 1 - Relationships with other database tables
This holds the details of every product, good or service, which is available in the system.
When a product is first created it will have its CATEGORY CLASS set to 'NOTFORSALE'. This entry should not be removed until all data, such as applicable features and price components, have been established so that new products are not offered for sale prematurely.
Field | Type | Description |
---|---|---|
product_id | string | Identity string which is defined manually. |
product_name | string | Short Name |
product_desc | string | Optional. Long Description |
date_intro | date | Identifies when this product was first available for sale. |
end_date_sales | date | Optional. Identifies when this product is no longer available for sale. Blank signifies an unspecified date in the future. |
end_date_support | date | Optional. Identifies when this product will no longer be supported by the manufacturer. |
prod_comment | string | Optional. A comment associated with this product. |
product_subtype | string | Either GOOD, SERVICE or PHANTOM. Goods are physical objects which can be stored, packed and shipped. Services are for the sale of people's time or expertise. A Phantom product never actually exists but may represent a group of products for planning purposes, or a modular bill of material for product lifecycle management purposes (see Phantom Products for further details). |
inventory_type | string | This identifies if instances of this product will need to be tracked in any way. Allowable values are:
For serialised products there will be a separate INVENTORY_ITEM with a quantity of 1 for each serial_no. For non-serialised products the quantity can be greater than 1. For Lot Tracking there will be an entry on the LOT_PRODUCT table to provide the details for each product in a particular LOT. |
is_revision_controlled | boolean | If set to 'Yes' then entries must exist on the PRODUCT_REVISION table. |
uom_id | string | Optional. Links to the UNIT_OF_MEASURE table. |
manufacturer_id | number | Optional. Links to the PARTY table. It identifies the manufacturer of this product. |
lead_time | number | Optional. This is the lead time required for manufacturing or assembly. It is added to the order date to give an estimated delivery date. |
shelf_life_days | number | Optional. This is used in conjunction with lot tracking. When a LOT is produced this value is added to the lot's manuf_date in order to calculate the expiry_date for this LOT_PRODUCT. If this value is zero then there will be no expiry_date. |
product_image | string | Optional. The name of a file on disk which contains a picture of this product. |
fuel_type | string | Optional. Signifies that this PRODUCT is a fuel if not NULL, in which case the allowable values are:
|
emission_factor_id | number | Optional. The emission factors associated with this PRODUCT. Links to an entry on the EMISSION_FACTOR table. |
heating_value_basis | string | Optional. The basis for measurement of fuel consumption data denominated in energy units. Allowable values are:
|
This holds SEO (Search Engine Optimisation) data for each product which may be used in a public-facing front-end website.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
product_id_url | string | Optional. An alternative unique identity that can be used in URL strings. |
seo_title | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_heading | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_desc | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_keywords | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_image_alt | string | Optional. May be used for search engine optimisation with front-end web sites. |
The classification of products is a key aspect of maintaining product information. Products are often classified in many ways - by product line, by model, by product grade, by industry segments, or by various other product categories.
Figure 2 - Product Categories
This can be used to organise product categories into groups or levels, so that all those which belong in a particular group or level can be easily identified. This may be used, for example, when products displayed in a web front-end (which is separate from the Radicore back-end) need to be arranged into sections, sub-sections, et cetera.
Field | Type | Description |
---|---|---|
cat_level_id | string | Identity |
cat_level_desc | string | Description |
Here are some examples:
The PROD_CAT_ROLLUP table should be used to identify category hierarchies, such as which "categories" belong in which "section", and which "sub-categories" belong in which "category".
This holds all the possible classifications or categories which may be applied to any product.
Field | Type | Description |
---|---|---|
prod_cat_id | string | Identity |
prod_cat_name | string | Category Name |
prod_cat_desc | string | Optional. Long Description. |
cat_level_id | string | Optional. Links to an entry on the PROD_CAT_LEVEL table. |
sort_seq | numeric | Optional. Used with cat_level_id to provide a sort sequence. |
product_usage | string | Optional. |
product_industry | string | Optional. |
product_materials | string | Optional. |
category_image | string | Optional. The path to an image file. |
Here are some examples:
Category Id | Name |
---|---|
COMPUTER | Computer supplies |
OFFICE | Office supplies |
PENS | Pens |
PAPER | Paper |
FORMS | Forms |
CONSULTANCY | Consultancy services |
VAT-E | VAT Exempt |
VAT-R | Reduced Rate VAT |
VAT-S | Standard Rate VAT |
VAT-Z | Zero Rated VAT |
NOTFORSALE | This product is not for sale. Products with this entry on the PROD_CAT_CLASS table should therefore be excluded from any list of sellable products. This is automatically added to new products and should only be removed when all the product's data has been finalised.
NOTE: If there are several different reasons why a product is not for sale then additional categories can be created as 'NOTFORSALE<suffix>' where |
This holds SEO (Search Engine Optimisation) data for each product category which may be used in a public-facing front-end website.
Field | Type | Description |
---|---|---|
prod_cat_id | string | Links to an entry on the PRODUCT_CATEGORY table. |
prod_cat_id_url | string | Optional. An alternative unique identity that can be used in URL strings. |
filter_image | string | Optional. The path to an image file. |
promo_image | string | Optional. The path to an image file. |
product_example_image | string | Optional. The path to an image file. |
banner_title | string | Optional. This text may be used with front-end web sites. |
banner_text | string | Optional. This text may be used with front-end web sites. |
banner_text_upper | string | Optional. This text may be used with front-end web sites. |
seo_title | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_heading | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_desc | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_keywords | string | Optional. May be used for search engine optimisation with front-end web sites. |
seo_image_alt | string | Optional. Alternative text for the category image. |
This table allows product categories to be linked with parties. It can be used, for example, to identify which suppliers can provide products in a certain category.
Field | Type | Description |
---|---|---|
prod_cat_id | string | Links to an entry on the PRODUCT_CATEGORY table. |
party_id | number | Links to an entry on the PARTY table. |
This is the PRODUCT CATEGORY CLASSIFICATION table. It identifies which product categories apply to which products. A product can have any number of these classification entries. Each entry is only valid for a particular time period, so it is possible to have different entries for different dates.
Note that it is possible to categorise a product under multiple categories, but this could produce misleading results when performing certain queries. For example, if there were a sales analysis report by category, the total sales amount would be overstated as some product sales would be counted numerous times for each of their categories. The primary_flag can be used to ensure that a product's details are included for one and only one category.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
prod_cat_id | string | Links to an entry on the PRODUCT_CATEGORY table. |
seq_no | number | A unique number assigned by the system. |
primary_flag | boolean | A YES/NO flag which indicates if this is the primary classification for this product. Note that only one classification per product should be marked as primary. |
second_flag | boolean | Optional. A YES/NO flag which indicates if this is the secondary classification for this product. Note that only one classification per product should be marked as secondary. |
third_flag | boolean | Optional. A YES/NO flag which indicates if this is the tertiary classification for this product. Note that only one classification per product should be marked as tertiary. |
pcc_comment | string | Optional. A comment on this entry. |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
Here are some examples:
Product Id | Product Description | Product Category | Primary? |
---|---|---|---|
PAP192 | Johnson fine grade 8½ by 11 bond paper | Office supplies | Yes |
Paper | No | ||
PEN202 | Goldstein Elite Pen | Office supplies | Yes |
Pens | No | ||
DSK401 | Jerry's box of 3½ inch diskettes | Office supplies | No |
Computer supplies | Yes | ||
FRMCHFA1500 | Preprinted forms for insurance claims | Forms | Yes |
Insurance | No |
This is the PRODUCT CATEGORY ROLLUP table. It is a recursive entity which allows a parent/senior category to be linked with, or divided into, any number of child/junior categories, and each of those child categories can have children of their own. This produces a hierarchy of parent-to-child/senior-to-junior categories which may go down to any number of levels. While it is possible for a parent/senior category to have any number of child/junior categories, it is not possible for a child/junior category to be linked to more than one parent/senior within the same hierarchy. If it is necessary for a child/junior category to be linked to more than one parent/senior category then you must specify a different value for hierarchy_id. This will enable multiple hierarchies to be defined, and to be able to differentiate between one hierarchy and another.
Field | Type | Description |
---|---|---|
prod_cat_id_snr | string | Links to the senior/parent entry on the PRODUCT_CATEGORY table. |
prod_cat_id_jnr | string | Links to the junior/child entry on the PRODUCT_CATEGORY table. |
hierarchy_id | string | Default value is 'default'. This allows a junior category to be linked to more than one senior category, thus producing a different hierarchy. |
Here are some examples:
Senior Category | Junior Category |
---|---|
Office supplies | Pens |
Office supplies | Paper |
Computer supplies | Computer hardware |
Computer supplies | Computer software |
This information allows the product search screen to be given a broad category, such as "office supplies", which will automatically include all those products which belong to a child category, or a child category's children down to any number of levels.
This identifies the names of extra fields which can be held for each product category.
Field | Type | Description |
---|---|---|
extra_id | string | Identity |
extra_name | string | Short Name |
extra_desc | string | Optional. Long Description |
extra_type | string | Validation type. Allowable values are:
|
This holds the values for any extra fields for each product category.
Field | Type | Description |
---|---|---|
prod_cat_id | string | Links to an entry on the PRODUCT_CATEGORY table. |
extra_id | string | Links to an entry on the PROD_CAT_EXTRA_NAMES table. |
extra_value | string | This holds the value for this Extra Name with this Product Category. |
Goods may have various ids that are used as a standard means of identification. A single code may uniquely identify goods and/or services, however, some goods may have more than one means of identification. As well as the internal value, a product acquired from outside may also have a manufacturer's id and/or a universal product code (UPC).
Global Trade Item Numbers (GTINs) are another way of identifying products and their manufacturer using identities which are assigned by a central body. These are commonly used on barcodes.
Figure 3 - Product Identification
This holds the various types of identity that can be applied to products.
Field | Type | Description |
---|---|---|
identity_type_id | string | Identity |
identity_type_desc | string | Description |
Here are some examples:
Type | Description |
---|---|
ISBN | International Standard Book Number |
MANUF | Manufacturer's Id |
SKU | Stock Keeping Unit |
UPCA | Universal Product Code - America |
UPCE | Universal Product Code - Europe |
For each product this holds all the alternative identification values.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
identity_type_id | string | Links to an entry on the PRODUCT_IDENTITY_TYPE table. |
id_value | string | Holds the identity value, which must be unique for this identity type. |
Here are some examples:
Product Id | Id Type | Id Value |
---|---|---|
PRODUCT_1234 | ISBN | 1234-4321-12-34 |
PRODUCT_1234 | MANUF | 12345678 |
PRODUCT_1234 | SKU | 12-A-34 |
PRODUCT_1234 | UPCA | 12-UPCA-34 |
PRODUCT_1234 | UPCE | 43-UPCE-21 |
This holds all the GTINs (Global Trade Item Numbers) used within the application. GTIN values are assigned by a central body and are recognised in all countries. They are normally attached to products as barcodes. They are 14 digit numbers which identify an organisation and a product, which combine to form a 13 digit number, with the last digit being a check digit. This table allows a GTIN to be translated into an internal product code and, for those products which are produced by other organisations, the identity of that organisation.
Field | Type | Description |
---|---|---|
gtin_id | numeric | A unique 14 digit GTIN number. |
product_id | string | Links to an entry on the PRODUCT table. |
party_id | numeric | Optional. Links to an entry on the PARTY table. Entries without a party_id are deemed to belong to the internal organisation. |
Products may have features that could be called characteristics, options, variations, or modifiers, allowing either customisation of a product or describing the characteristics of a product. By having all this information on a single table instead of a separate table per type it then becomes possible to deal with the situation where something which is a standard feature on one product may be an optional feature on another product.
Not all features are relevant for all products, so the PROD_FEATURE_APPLICABILITY table is used to identify which features apply to which products. If all the features within a category are valid then the PROD_FEATURE_CAT_APPLIC table can be used instead.
Note that features can only be defined for those products with a product_subtype of 'G' (Goods) and not those with a product_subtype of 'S' (Service).
Product features are split into a number of different categories. Features within some categories may require additional measurement information which may be used in the pricing algorithm. For example, in a jewellery application wedding rings have a size which is expressed in millimeters, and diamonds have a size which is expressed in carats. In these cases the label and unit of measure are identified on the PRODUCT_FEATURE_CATEGORY_UOM table while the actual measurement or each feature is held on the PRODUCT_FEATURE_UOM table.
Features within some categories may have customisation options. For example, in a jewellery application a wedding ring may have an engraving option, and when that option is added to a sales order the text which needs to be engraved must also be supplied. In these cases the label and data type are identified on the PRODUCT_FEATURE_CATEGORY_CUSTOMISATION table while the PRODUCT_FEATURE_CUSTOMISATION table is used to identify whether a particular option is required or not. When a sales order is created the relevant customisation text is stored in the ORDER_ITEM_FEATURE_CUSTOMISATION table.
Figure 4 - Product Features
This identifies all the different categories of product feature which may be used in the system. Every feature must belong to one category.
Field | Type | Description |
---|---|---|
prod_feature_cat_id | string | Identity |
prod_feature_cat_name | string | Short Name |
prod_feature_cat_desc | string | Optional. Long Description |
Here are some examples:
Category |
---|
Billing Feature |
Brand |
Colour |
Dimension |
Hardware Feature (optional) |
Hardware Feature (standard) |
Packaging |
Quality |
Size |
Software Feature (optional) |
Software Feature (standard) |
Style |
Note that there are multiple entries for Software Feature and Hardware Feature, each having a different feature_type as described in PROD_FEATURE_APPLICABILITY. This is because every feature within that category must be displayed with the same HTML control within the feature selection screen, as shown in Figure 4a.
This identifies where the features within a category have one or more associated measurements. These measurements may be required in the price calculation algorithm.
Note that the actual measurements for individual features are defined on the PROD_FEATURE_UOM table.
Field | Type | Description |
---|---|---|
prod_feature_cat_id | string | Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
seq_no | number | A sequence number which is automatically assigned by the system. |
uom_id | string | Links to an entry on the UNIT_OF_MEASURE table. |
measurement_label | string | A label which describes the measurement being recorded. This label will appear in the relevant maintenance screens for the value. |
Here are some examples:
Category | Seq | UOM | Label |
---|---|---|---|
ALLOY | 1 | Kilogram per cubic meter | Density |
STONE_SIZE | 1 | Millimeter | Width |
STONE_SIZE | 2 | Millimeter | Length |
ENGRAVE | 1 | Days | Add to Lead Time |
This identifies where a feature within a category which can be added to a product requires some customisation when it is added to a sales order. For example, an engraving service will require the text which is to be engraved.
Note that the actual customised values for individual features are defined on the PROD_FEATURE_CUSTOMISATION table.
Field | Type | Description |
---|---|---|
prod_feature_cat_id | string | Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
seq_no | number | A sequence number which is automatically assigned by the system. |
customisation_type | string | Identifies how the customisation value should be validated. Allowable values are:
|
customisation_label | string | A label which describes the purpose of this customisation. |
Here are some examples:
Category | Seq | Type | Label |
---|---|---|---|
ENGRAVE | 1 | String | Inside text |
ENGRAVE | 2 | String | Outside text |
ALLOY | 1 | number(6,2) | Alloy Weight |
This identifies all the various features, options, and variations that may be applied to any product in the system.
Note also that is possible to define a PRICE_COMPONENT for each product feature, which can be either a surcharge or a discount.
Field | Type | Description |
---|---|---|
prod_feature_id | number | A value that is generated automatically by the system. |
prod_feature_name | string | Short Name |
prod_feature_desc | string | Optional. Long Description |
prod_feature_id_url | string | Optional. An alternative unique identity that can be used in URL strings. |
prod_feature_code | string | Optional. A user-defined unique key. |
prod_feature_cat_id | string | Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
If you change the start_date and/or end_date on a PRODUCT_FEATURE record you may also affect other tables:
Here are some examples:
Id | Description | Category | UOM | Measurement |
---|---|---|---|---|
10 | Grey | Colour | ||
11 | Cream | Colour | ||
12 | White | Colour | ||
4 | 8½ inches wide | Dimension | Inches | 8.5 |
5 | 11 inches long | Dimension | Inches | 11 |
6 | 3½ inches diameter | Dimension | Inches | 3.5 |
35 | Coarse Grade | Quality | ||
36 | Medium Grade | Quality | ||
37 | Fine Grade | Quality |
Although it is possible to have a single product with a number of different features, such as:
it is also possible to have a separate product with each feature built in, such as:
It is up to the enterprise to decide which level of specificity is required - multiple features or multiple products.
This identifies where a feature has one or more measurements associated with it. These measurements may be required in the price calculations. A measurement value can only be added to a feature if its category has an entry defined on the PRODUCT_FEATURE_CATEGORY_UOM table.
Field | Type | Description |
---|---|---|
product_feature_id | number | Links to an entry on the PRODUCT_FEATURE table. |
seq_no | number | Links to an entry on the PRODUCT_FEATURE_CATEGORY_UOM table. |
measurement | number | A value expressed in the units defined on the associated PRODUCT_FEATURE_CATEGORY_UOM table. |
For each entry on the PROD_FEAT_CAT_CUSTOMISATION table this identifies if a customisation value for this label is required or not for a particular feature.
When a sales order which includes an item with this feature is created the actual customisation values will be written to the ORDER_ITEM_FEATURE_CUSTOMISATION table.
Field | Type | Description |
---|---|---|
product_feature_id | number | Links to an entry on the PRODUCT_FEATURE table. |
seq_no | number | Links to an entry on the PRODUCT_FEATURE_CATEGORY_CUSTOMISATION table. |
customisation_allowed | string | Allowable values are:
|
This identifies all the default features which apply to a product.
A product may have a several applicable features within a category, and one of them may be indicated as the default, in which case it will be added automatically to the relevant ORDER_ITEM_FEATURE or INVOICE_ITEM_FEATURE table.
Note that in a category only one feature is allowed to be defined as the default.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
prod_feature_cat_id | string | Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
prod_feature_id | number | Links to an entry on the PRODUCT_FEATURE table. |
This identifies which particular features apply to which particular products, and whether the feature is standard, optional or required. Each entry is only valid for a particular time period, so it is possible to have different entries for different dates.
Note that features can only be defined for those products with a product_subtype of 'G' (Goods) and not those with a product_subtype of 'S' (Service).
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
prod_feature_id | number | Links to an entry on the PRODUCT_FEATURE table. |
seq_no | number | A unique number assigned by the system. |
feature_type | string | Must be one of the following:
Note: within any category all the applicable features must have the same feature_type. If a category contains several features it is possible to identify one as being the default (refer to the DEFAULT_FEATURE table). |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
Here are some examples:
Product | Category | Feature | Type |
---|---|---|---|
Jerry's box of 3.5-inch diskettes | Brand | Jerry's | Standard |
Dimension | 3½ inch diameter | Standard | |
Colour | Red | Required | |
Colour | Blue | Required | |
Colour | Green | Required | |
Colour | Black | Required | |
Goldstein Elite Pen | Brand | Goldstein | Standard |
Quality | Fine Point | Standard | |
Colour | Blue | Required | |
Colour | Black | Required | |
Packaging | Brown Paper Bag | Optional | |
Packaging | Cardboard Box | Optional | |
Packaging | Wooden Box | Optional | |
Packaging | Presentation Case | Optional |
Please note that for a product every feature within the same CATEGORY must have the same feature_type. This is because every feature within that category must be displayed in the same way in the product feature selection screen, and it is the feature_type which identifies which HTML control is to be used as follows:
Type | Control |
---|---|
Standard | Non-editable text. This option is fixed and cannot be turned off. |
Optional (One) | Dropdown List - allowing either zero or one option to be selected. |
Optional (Many) | Checkboxes - allowing either zero or more options to be selected. |
Required (one) | Radio Buttons (or Dropdown List) - one of these options must be selected. |
An example of how each of these types is displayed is shown in Figure 4a below:
Figure 4a - Choosing Product Features
The applicability of certain product features may depend on other features which may have been selected. A pair of features may be dependent on each other, or they may be incompatible with each other.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
prod_feature_id_snr | numeric | Links to an entry on the PRODUCT_FEATURE table. Identifies the first feature in this pair |
prod_feature_id_jnr | numeric | Links to an entry on the PRODUCT_FEATURE table. Identifies the second feature in this pair. |
feature_interaction | string | Must be one of the following:
|
Here are some examples:
Product | Feature 1 | Interaction | Feature 2 |
---|---|---|---|
Johnson 8.5 by 11 inch bond paper | Green | Incompatible with | Extra Glossy Finish |
Johnson 8.5 by 11 inch bond paper | White | Dependent upon | Extra Fine Grade |
For this product it means that the Extra Glossy Finish is available with any colour except Green, and Extra Fine Grade is only available if the colour is White.
In some cases it may be that a feature category contains a large number of features, and that all these features apply to a product. Instead of having to allocate the features one by one it is possible to use this table to allocate an entire category. At runtime all the available features within the category will be treated as if they were on the PROD_FEATURE_APPLICABILITY table.
Note that features can only be defined for those products with a product_subtype of 'G' (Goods) and not those with a product_subtype of 'S' (Service).
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
prod_feature_cat_id | number | Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
seq_no | number | A unique number assigned by the system. |
feature_type | string | Must be one of the following:
|
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
This identifies which particular product features apply to which particular product categories. Each entry is only valid for a particular time period, so it is possible to have different entries for different dates. This is used when the front-end website wants a mechanism to show a list of product features for each product category.
Field | Type | Description |
---|---|---|
prod_cat_id | string | Links to an entry on the PRODUCT_CATEGORY table. |
prod_feature_id | number | Links to an entry on the PRODUCT_FEATURE table. |
seq_no | number | A unique number assigned by the system. |
is_default | boolean | Set to TRUE for the entry which is to be shown as the default in any dropdown list. |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
This identifies where one feature is comprised of a collection of other features. For example, some features may be single metals such as yellow gold, white gold and rose gold, while another feature is comprised of a combination of all three.
Field | Type | Description |
---|---|---|
prod_feature_id_snr | numeric | Links to an entry on the PRODUCT_FEATURE table. Identifies the feature which has components. |
prod_feature_id_jnr | numeric | Links to an entry on the PRODUCT_FEATURE table. Identifies the feature which is a component. |
percent | numeric | Optional. The percentage of which this component forms part of the whole. |
Different products may come in different units, such as 'each', 'litres', 'gallons', 'reams' or whatever, and some people may regard this as just another feature. Most organisations will conclude that if the same type of product is sold in different units of measure then it really is a different product. For instance, a ream of paper is different from a sheet of paper or a box of 5 reams, and each would be regarded as a separate product. It is therefore important for enterprises to be able to determine inventory for products that are identical except for the unit of measure.
Figure 5 - Units of Measure
The various units of measurement can be broken down into specific categories such as weight, length or volume, etc.
Field | Type | Description |
---|---|---|
uom_cat_id | string | Identity |
uom_cat_desc | string | Description |
Here are some examples:
This also serves as the CURRENCY_CODE table where uom_cat_id = 'CURR'
Each unit of measure has a description and an abbreviation.
Field | Type | Description |
---|---|---|
uom_id | string | Identity. |
uom_cat_id | string | Links to an entry on the UOM_CATEGORY table. |
uom_desc | string | Description |
uom_abbrev | string | Abbreviation |
uom_symbol | string | Currency symbol, as in '£', '¥', '$' and '€'. |
scale | numeric | Identifies how many decimal places are used when expressing quantities in this unit of measure.
Positive numbers indicate the number of places to the right of the decimal point. For example, +3 = 0.001 Negative numbers indicate the number of decimal places to the left of the decimal point. For example, -2 = 100.00 For example, units such as EACH will be expressed as whole numbers without any decimal places. Currencies will usually have two decimal places to cater for dollars and cents, but some low value currencies may be expressed to the nearest 100 or 1,000. |
decimal_point | string | Optional. Only relevant for currencies. This identifies the character to be displayed as the decimal point. Default is '.' (period). |
thousands_separator | string | Optional. Only relevant for currencies. This identifies the character to be displayed as the thousands separator. Default is ',' (comma). To specify a space please use 'nbsp' as this is the code for a non-breaking space. |
Here are some examples:
Category | Description | Abbreviation |
---|---|---|
Area | Square Centimeter | Sq. Cm. |
Square Foot | Sq. Ft. | |
Square Inch | Sq. In. | |
Square Meter | Sq. M. | |
Square Yard | Sq. Yd. | |
Length | Centimeter | cm |
Decimeter | dm | |
Foot | Ft | |
Inch | in | |
Meter | m | |
Millimeter | mm | |
Yard | yd | |
Weight | Gram | gm |
Hundredweight (UK) | cwt | |
Hundredweight (US) | cwt | |
Kilogram | Kg | |
Milligram | mg | |
Ounce Avoirdupois | oz | |
Pound Avoirdupois | lb | |
Stone | st | |
Short Ton (UK) | ton | |
Long Ton (US) | ton | |
Metric Tonne | tonne | |
Misc | Each | ea |
Volume | Box of 6 | small |
Box of 12 | medium | |
Box of 24 | large | |
Currency | UK Pounds | GBP |
US Dollar | USD | |
Euro | EUR | |
Utlisation | per Kilogram | pkg |
per Kilometer | pkm | |
per Mile | pm | |
per Page Hit | hit |
This provides the means to convert a quantity in one unit of measure to the equivalent quantity in a different unit of measure. For example, there may be several products of "Henry #2 pencils" that have different units of measure such as "each", "small box" and "large box". In many cases organisations need to show total inventories, costs and sales for all of a product regardless of its unit of measure. By defining a common unit of measure, such as "each", and including a conversion factor (e.g. 6 for "small box" and 24 for "large box"), it is possible to determine the total amount of "Henry #2 pencils" there are in inventory and how many have been sold.
The ability to specify a different conversion factor for a different set of dates is intended for use with currencies as the exchange rates will fluctuate over time. For all other units of measure a single factor without an end date will suffice.
Field | Type | Description |
---|---|---|
uom_id_from | string | Links to an entry on the UNIT_OF_MEASURE table. |
uom_id_to | string | Links to an entry on the UNIT_OF_MEASURE table. |
seq_no | number | A unique number assigned by the system. |
conversion_factor | number | When multiplied by the number of FROM units it will provide the equivalent number in the TO units. |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
Here are some examples:
FROM UOM | Factor | TO UOM |
---|---|---|
Centimeter | 0.1 | Millimeter |
10 | Decimeter | |
100 | Meter | |
Meter | 0.001 | Millimeter |
0.01 | Centimeter | |
0.1 | Decimeter | |
Millimeter | 10 | Centimeter |
100 | Decimeter | |
1000 | Meter | |
Foot | 0.333333 | Yard |
12 | Inch | |
Inch | 0.027778 | Yard |
0.083333 | Foot | |
Yard | 3 | Foot |
36 | Inch | |
Box of 6 | 6 | Each |
Box of 12 | 12 | Each |
Box of 24 | 24 | Each |
UK Pounds | 1.9733 | US Dollar |
UK Pounds | 1.28025 | Euro |
UK Pounds | 207.976 | Japanese Yen |
Here are some examples of currency conversions:
FROM UOM | TO UOM | Factor | Start date | End date |
---|---|---|---|---|
UK Pounds | Euro | 1.2714 | 2008-04-01 | 2008-05-18 |
1.2580 | 2008-05-19 | 2008-05-26 | ||
1.2556 | 2008-05-27 | |||
UK Pounds | US Dollar | 1.9828 | 2008-04-01 | 2008-05-18 |
1.9488 | 2008-05-19 | 2008-05-26 | ||
1.9677 | 2008-05-27 |
Every organisation seems to have different mechanisms for pricing its products, and it is a challenge to produce a single data model which can cater for all the possible variations.
For most organisations there are several aspects to pricing a product:
The entity is named PRICE_COMPONENT and not PRODUCT_PRICE as it is also used for other circumstances, such as agreement or contract pricing, and for discounts and surcharges (such as government taxes) which are applied at the order level instead of the product/item level.
Figure 6 - Price Components
This holds all the price components (product prices, discounts and surcharges) which are used in the compilation of sales orders. Each entry is only valid for a particular time period, so it is possible to have different entries for different dates.
Note that this table does not specify any currency codes for monetary values as every price is deemed to be in the currency of the Functional Unit which created it. If a document requires values to be expressed in a foreign currency this is handled differently depending on the subsystem:
Price components can be divided into the following categories:
Field | Type | Description |
---|---|---|
price_component_id | number | Unique identity which is assigned by the system. |
price_component_desc | string | Description |
start_date | date | The start date for this entry. |
end_date | date | Optional. The end date for this entry. Blank signifies an unspecified date in the future. |
value | numeric | Required for a base price, but other components can be specified as either a value or a percentage. |
percent | numeric | Optional. For some price components such a order adjustments or item adjustments this can be used instead of a value. |
rounding_method | string | Required. This is the method used when rounding numbers to the specified number of decimal places. Allowed values are:
The default value is 'S' (Standard). This is designed to be used primarily for tax calculations where the tax authority allows a choice, although it can be used in other circumstances where appropriate. |
price_type | string | Must be one of the following:
|
price_frequency | string | Must be one of the following:
|
order_adjustment_type_id | string | Optional. Links to an entry on the ORDER_ADJUSTMENT_TYPE table. |
item_adjustment_type_id | string | Optional. Links to an entry on the ITEM_ADJUSTMENT_TYPE table. |
quantity_break_id | string | Optional. Links to an entry on the QUANTITY_BREAK table. |
value_break_id | string | Optional. Links to an entry on the VALUE_BREAK table. |
free_units | numeric | This can be used with quantity breaks such as "buy 10 of these and get n free" where 'n' can be any number not greater than the lower limit of the range. |
product_id_free | string | Optional. Links to an entry on the PRODUCT table. This can be used with quantity breaks to specify one free unit of a different product instead of 'n' free units of the same product. |
uom_id | string | Optional. Links to an entry on the UNIT_OF_MEASURE table. This is only used if the price_frequency indicates a recurring charge or a utilisation charge. |
prod_cat_id | string | Optional. Links to an entry on the PRODUCT_CATEGORY table. |
product_id | string | Optional. Links to an entry on the PRODUCT table. |
prod_feature_cat_id | string | Optional. Links to an entry on the PRODUCT_FEATURE_CATEGORY table. |
prod_feature_id | numeric | Optional. Links to an entry on the PRODUCT_FEATURE table. |
supplier_id | numeric | Optional. Links to an entry on the PARTY table. This identifies the supplier to which the entry belongs. |
customer_id | numeric | Optional. Links to an entry on the PARTY table. This identifies the customer to which the entry belongs. |
party_id_functional | numeric | Not used at present. |
party_class_id | string | Optional. Links to an entry on the PARTY_SUBCLASS table. |
party_subclass_id | string | Optional. Links to an entry on the PARTY_SUBCLASS table. |
area_id | numeric | Optional. Links to an entry on the GEOGRAPHIC_AREA table. |
sale_type_id | string | Optional. Links to an entry on the SALE_TYPE table. |
price_notes | string | Optional notes concerning this entry. |
Although it is possible to have many combinations of identifiers on each price component record it should be noted that the following validation rules apply:
These identify the starting price for a product before the addition of any Feature Prices or Item Adjustments. Several variations are possible.
The default price for a product
field | value |
---|---|
price_type | Set to "Base Price". |
price_frequency | Set to "One Time Charge". |
product_id | The product identity |
value | The base price, in home currency (or the currency of the Functional Unit). |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this price comes into effect. |
The default price for a product for a customer (agreement pricing or contract pricing)
field | value |
---|---|
price_type | Set to "Base Price". |
price_frequency | Set to "One Time Charge". |
product_id | The product identity |
value | The agreed price for this customer, in home currency (or the currency of the Functional Unit). |
customer_id | The customer (party) identity. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this price comes into effect. |
The default price for a product for a customer class
field | value |
---|---|
price_type | Set to "Base Price". |
price_frequency | Set to "One Time Charge". |
product_id | The product identity |
value | The base price, in home currency (or the currency of the Functional Unit). |
party_subclass_id | The party classification. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this price comes into effect. |
It is therefore possible to set up different base prices for the following:
When a product is added to a sales order a search is made for the base price which applies on the current date in the following sequence, with the search terminating at the first successful lookup:
These are discounts or surcharges which are applied to the total net value of a sales order, and not just an individual item within that order. A discount or surcharge may be defined either as a fixed amount or a percentage. A discount may also be be defined as one or more value breaks where each entry should be for a different and non-overlapping range of values. Discounts and surcharges will be applied unconditionally, whereas a value break will only be applied when the total value for that order falls within the range on that entry.
For discounts and surcharges one of the following must be specified:
For value breaks one of the following must be specified:
These adjustments will be applied in the following order:
Note that the following rules apply to entries where order_adjustment_type_id begins with 'TAX':
Note that the following rules apply to entries where order_adjustment_type_id begins with 'DELIVERY':
Note that entries with the following price_types will be handled separately:
For the UK there are currently four tax categories - Standard rate, Reduced rate, Zero rated and Exempt - and the tax amount for each category will be calculated on the net total for products within that category. All products will default to the Standard rate (VAT-S) unless they have been assigned to a different category.
A discount to be applied to the total value of a order
field | value |
---|---|
order_adjustment_type_id | Required. Select one that has discount_or_surcharge set to "Discount". |
price_type | Set to "Discount". |
price_frequency | Set to "One Time Charge". |
prod_cat_id | Must be empty. |
value_break_id | Optional. This identifies the range of values for which this discount applies. |
value | Optional. Either value or percent must be supplied. |
percent | Optional. Either value or percent must be supplied. |
area_id | Optional. Cannot be used with customer_id or party_subclass_id. |
customer_id | Optional. Cannot be used with area_id or party_subclass_id. |
party_subclass_id | Optional. Cannot be used with area_id or customer_id. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this discount comes into effect. |
There is another type of order discount known as a Discount Code (or Voucher). This is only added to an order upon the input of a valid Discount Code. These codes are only valid for a particular time period or up to a particular quantity, and may be published in various promotional materials.
A surcharge to be applied to the total value of a order.
field | value |
---|---|
order_adjustment_type_id | Required. Select one that has discount_or_surcharge set to "Surcharge". |
price_type | Set to "Surcharge". |
price_frequency | Set to "One Time Charge". |
prod_cat_id | Must be empty. |
value_break_id | Must be empty. |
value | Optional. Either value or percent must be supplied. |
percent | Optional. Either value or percent must be supplied. |
area_id | Optional. Cannot be used with customer_id or party_subclass_id. |
customer_id | Optional. Cannot be used with area_id or party_subclass_id. |
party_subclass_id | Optional. Cannot be used with area_id or customer_id. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this surcharge comes into effect. |
A Sales Tax to be applied to the total value of a order (may have a different entry for each tax category)
field | value |
---|---|
order_adjustment_type_id | Required. Select "Sales Tax". |
price_type | Set to "Surcharge". |
price_frequency | Set to "One Time Charge". |
prod_cat_id | Required. Select one of the product categories which has been set up for Sales Tax. Please refer to FAQ #1 for details. |
value_break_id | Must be empty. |
value | Optional. Either value or percent must be supplied. |
percent | Optional. Either value or percent must be supplied. |
area_id | Required. |
customer_id | Must be empty. |
party_subclass_id | Must be empty |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this surcharge comes into effect. |
When a sales order is created a search is made for any order adjustments which are applicable on the current date. This search has to take into account a combination of the following:
Each combination of these values will involve a separate database lookup which will be given a priority number with the narrowest of selections having lower numbers than the broadest. Thus a value for a particular product and particular customer will have a higher priority than a value for all products and all customers. This priority number will be allocated as follows:
Each of these lookups will be performed twice - once with a sale_type_id and once without.
If multiple entries for the same order_adjustment_type_id are found with different priorities then only those entries with the lowest priority will be added to the ORDER_ADJUSTMENT table.
Note also that if any price component record has related entries on the PARTY_PRICE_EXCLUSION table then any customer who has any of the same party_subclass_id entries will be excluded from that adjustment.
These are discounts or surcharges which apply to a particular product (item) within a sales order. If the discount/surcharge is a value or a percentage it will be applied to the unit price (which may also include any feature prices) before being multiplied by the order quantity to give the extended price (item value). A discount may also be be defined as one or more quantity breaks where each entry should be for a different and non-overlapping range of quantities. Discounts and surcharges will be applied unconditionally, whereas a quantity break will only be applied when the total quantity for that product_id falls within the range on that entry.
For discounts and surcharges one of the following must be specified:
For quantity breaks one of the following must be specified:
A surcharge to be applied to an order item
field | value |
---|---|
item_adjustment_type_id | Required. Select one that has discount_or_surcharge set to "Surcharge". |
price_type | Set to "Surcharge". |
price_frequency | Set to "One Time Charge". |
EITHER: product_id | A single product identity or '*' to signify ALL products. |
OR: prod_cat_id | To signify ALL products which have this prod_cat_id on the PROD_CAT_CLASS table. |
quantity_break_id | Must be empty. |
value | Optional. Either value or percent must be supplied. |
percent | Optional. Either value or percent must be supplied. |
area_id | Optional. |
customer_id | Optional. Cannot be used with area_id or party_subclass_id. |
party_subclass_id | Optional. Cannot be used with area_id or customer_id. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this surcharge comes into effect. |
A discount to be applied to an order item
field | value |
---|---|
item_adjustment_type_id | Required. Select one that has discount_or_surcharge set to "Discount". |
price_type | Set to "Discount". |
price_frequency | Set to "One Time Charge". |
EITHER: product_id | A single product identity or '*' to signify ALL products. |
OR: prod_cat_id | To signify ALL products which have this prod_cat_id on the PROD_CAT_CLASS table. |
quantity_break_id | Must be empty. |
value | Optional. Either value or percent must be supplied. |
percent | Optional. Either value or percent must be supplied. |
area_id | Optional. |
customer_id | Optional. Cannot be used with area_id or party_subclass_id. |
party_subclass_id | Optional. Cannot be used with area_id or customer_id. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this discount comes into effect. |
A quantity break to be applied to an order item
field | value |
---|---|
item_adjustment_type_id | Required. Select one that has discount_or_surcharge set to "Discount". |
price_type | Set to "Discount". |
price_frequency | Set to "One Time Charge". |
EITHER: product_id | A single product identity or '*' to signify ALL products. |
OR: prod_cat_id | To signify ALL products which have this prod_cat_id on the PROD_CAT_CLASS table. |
quantity_break_id | Required. This identifies the range of quantities for which this discount applies. |
value | Optional. Either value, percent, free_units or product_id_free must be supplied. |
percent | Optional. Either value, percent, free_units or product_id_free must be supplied. |
free_units | Optional. Either value, percent, free_units or product_id_free must be supplied. |
product_id_free | Optional. Either value, percent, free_units or product_id_free must be supplied. |
area_id | Optional. |
customer_id | Optional. Cannot be used with area_id or party_subclass_id. |
party_subclass_id | Optional. Cannot be used with area_id or customer_id. |
sale_type_id | Optional. See SALE_TYPE for a possible range of values. |
start_date | The date on which this discount comes into effect. |
When a product is added to a sales order a search is made for any item adjustments which are applicable on the current date. This search has to take into account a combination of the following:
Each combination of these values will involve a separate database lookup which will be given a priority number with the narrowest of selections having lower numbers than the broadest. Thus a value for a particular product and particular customer will have a higher priority than a value for all products and all customers. This priority number will be allocated as follows:
Each of these lookups will be performed twice - once with a sale_type_id and once without.
Note also that if any price component record has related entries on the PARTY_PRICE_EXCLUSION table then any customer who has any of the same party_subclass_id entries will be excluded from that adjustment.
If multiple entries for the same item_adjustment_type_id are found with different priorities then only those entries with the lowest priority will be added to the ORDER_ITEM_ADJUSTMENT table.
A product may come with a number of features which may be selected in a sales order, and these will be treated as free unless a feature price has been defined. A feature price may be either a discount or a surcharge, and will be added to the unit price for that product before the effects of any Item adjustments are calculated. Several variations are possible.
The price for a feature with a particular product
field | value |
---|---|
item_adjustment_type_id | Set to "Feature Charge". |
price_type | Set to discount_or_surcharge value on associated ITEM_ADJUSTMENT_TYPE table for this item_adjustment_type_id. |
price_frequency | Set to "One Time Charge". |
product_id | The product identity. Must not be '*'. |
prod_feature_id | The feature identity. |
value | The feature price, in home currency (or the currency of the Functional Unit). |
start_date | The date on which this price comes into effect. |
The price for a feature regardless of product
field | value |
---|---|
item_adjustment_type_id | Set to "Feature Charge". |
price_type | Set to discount_or_surcharge value on associated ITEM_ADJUSTMENT_TYPE table for this item_adjustment_type_id. |
price_frequency | Set to "One Time Charge". |
product_id | Set to '*' to mean "all products". |
prod_feature_id | The feature identity. |
value | The feature price, in home currency (or the currency of the Functional Unit). |
start_date | The date on which this price comes into effect. |
When a feature is added to a product in a sales order a search is made for any price adjustment which applies on the current date in the following sequence, with the search terminating at the first successful lookup:
This identifies all those classes of party who are excluded from particular price components (order adjustments or item adjustments) when a sales order is being compiled. Each entry is only valid for a particular time period, so it is possible to have different entries for different dates.
Field | Type | Description |
---|---|---|
price_component_id | numeric | Links to an entry on the PRICE_COMPONENT table. |
party_class_id | string | Links to an entry on the PARTY_SUBCLASS table. |
party_subclass_id | string | Links to an entry on the PARTY_SUBCLASS table. |
start_date | date | The start date for this entry. |
end_date | date | Optional. The end date for this entry. Blank signifies an unspecified date in the future. |
A customer (party) can be classified with any number of different PARTY_SUBCLASS_LINK entries. When order adjustments or item adjustments are defined on the PRICE_COMPONENT table they automatically apply to every customer. However, it may be required to exclude particular parties from certain price adjustments. This can be done as follows:
When looking for either order adjustments or item adjustments during the compilation of sales orders, these will automatically apply to every customer except those who share a party classification which has been defined on the exclusion table.
This shows which suppliers are identified with which product, with their lead times. A product may be available from more than one supplier, so entries can be sorted by preference.
Figure 7 - Product Supplier
This identifies a preference type or priority that may be linked with product replenishment details.
Field | Type | Description |
---|---|---|
preference_type_id | string | Identity |
preference_type_desc | string | Description |
Here are some examples:
This is used to rate the overall performance of a product which is obtained from a particular supplier.
Field | Type | Description |
---|---|---|
rating_type_id | string | Identity |
rating_type_desc | string | Description |
Here are some examples:
This identifies which products are available from which suppliers.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
party_id | numeric | Links to an entry on the PARTY table. |
preference_type_id | string | Links to an entry on the PREFERENCE_TYPE table. |
rating_type_id | string | Links to an entry on the RATING_TYPE table. |
supplier_part_no | string | Optional. When ordering this product from this supplier it may be necessary to use the supplier's own part number instead of the organisation's internal part number. |
available_from_date | date | Indicates the date from which this product is available from this supplier. |
available_to_date | date | Indicates the after which this product is no longer available from this supplier. |
standard_lead_time | numeric | The lead time, or number of days required between placing the order and having it delivered. |
product_notes | string | Optional text. |
This database may be used by other systems, such as a web front end, which may have a requirement for extra fields to be held for each product. There is a NAMES table which holds the names of any such extra fields, with their validation types, and a VALUES table which holds a corresponding value for each product.
Although these values can be held in the database they cannot be considered when processing any business rules as their names and meanings are not part of the standard software.
Figure 8 - Product Extra Values
This identifies the names of extra fields which can be held for each product.
Field | Type | Description |
---|---|---|
extra_id | string | Identity |
extra_name | string | Short Name |
extra_desc | string | Optional. Long Description |
extra_type | string | Validation type. Allowable values are:
|
sort_seq | numeric | Optional. Specifies the sequence in which the items will be arranged on the 'Maintain Product Extra Values' screen. |
This holds the values for any extra fields for each product.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
extra_id | string | Links to an entry on the PRODUCT_EXTRA_NAMES table. |
extra_value | string | This holds the value for this Extra Name with this Product. |
There may be circumstances where you wish to identify where one product is compatible with another. This will enable you, for example, to suggest one or more compatible products whenever a customer makes a purchase.
When two products are associated in this way the association need only be made once, yet it will be available whichever of the two records is selected. Thus if you link 'product-A' with 'product-B' it will also serve as a link between 'product-B' and 'product-A'.
Figure 9 - Compatible Products
This identifies where one product is compatible with another.
Field | Type | Description |
---|---|---|
product_id_1 | string | Links to an entry on the PRODUCT table. |
product_id_2 | string | Links to an entry on the PRODUCT table. |
As well as selling individual products, an organisation may sell products which are collections of or assembled from other products. This may be something as simple as a gift box which contains a mixture of items, or it may be used in a manufacturing environment to indicate which items are needed in order to assemble a finished product. These are sometimes known as Bill of Materials or BOM.
It is possible for a product to have different types of BOM for different purposes.
Certain products may also be the subject of various revisions during their lifetime, in which case a history of the various revision numbers and their effective dates will need to be maintained.
Figure 10 - Product Components and Revisions
This identifies the different Bill Of Material (BOM) types which are available. At least one entry must exist in this table otherwise the system will not allow PRODUCT_COMPONENT entries to be created. If only one entry exists then the system will automatically treat it as the default, whether or not it is so marked.
Note that it is possible for a single PRODUCT to have multiple BILL OF MATERIAL TYPEs, depending upon business requirements. For example a single PRODUCT could have an engineering bill of material as well as a manufacturing bill of material. If that PRODUCT is revision controlled then multiple versions of either its engineering bill or material or its manufacturing bill of material could exist.
Field | Type | Description |
---|---|---|
bom_type_id | string | Identity. |
bom_type_name | string | Short Name. |
bom_type_desc | string | Optional. Long description. |
is_revision_controlled | boolean | A YES/NO flag which indicates that if new PRODUCTs are created during an automated process which uses this BOM_TYPE then that PRODUCT will require entries on the PRODUCT_REVISION table. |
is_default | boolean | A YES/NO flag which indicates if this is the default bom_type_id when adding new PRODUCT_COMPONENTs. Note that only one BOM_TYPE can be marked as the default. |
Here are some examples:
BOM Type Id | Description | Revision Controlled? | Default? |
---|---|---|---|
ASSY | Assembly or sub-assembly bill of materials | Yes | No |
ENGR | Engineering bill of materials | Yes | Yes |
KIT | Kitting bill of materials | No | No |
MFG | Manufacturing bill of materials | No | No |
PLNG | Planning bill of materials | No | No |
RECIPE | Recipe or formulation | Yes | No |
SALES | Assortment bill of materials for sale | Yes | No |
SERVICE | Bill of materials for maintenance, repairs or overhauls | Yes | No |
CBOM | Configurable bill of materials | No | No |
This identifies which BILL OF MATERIAL TYPEs are allowed for each PRODUCT.
When new PRODUCT COMPONENTs are added for a product, only the PRODUCT BILL OF MATERIAL TYPEs for the senior product can be selected. If one of the available BILL OF MATERIAL TYPEs is marked as the default, it will be pre-selected. The user may select a different BILL OF MATERIAL TYPE before the PRODUCT COMPONENT is added. Otherwise the system will add the default BILL OF MATERIAL TYPE to the PRODUCT BILL OF MATERIAL TYPE table if it does not already exist.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
bom_type_id | string | Links to an entry on the BOM_TYPE table. |
yield | number | Optional. This is used in the product conversion process. |
This identifies where one product is comprised of other components.
Field | Type | Description |
---|---|---|
product_id_snr | string | This identifies the product (senior) which is comprised of a number of components. Links to an entry on the PRODUCT table. |
bom_type_id_snr | string | Links to an entry on the PRODUCT_BOM_TYPE table for product_id_snr. |
product_id_jnr | string | This identifies the component product (junior) which is contained within the senior product. Links to an entry on the PRODUCT table. |
seq_no | number | A unique number assigned by the system. |
bom_type_id_jnr | string | Optional. Links to an entry on the PRODUCT_BOM_TYPE table for product_id_jnr. This is used in the Tree View to signify that there are no components below this one - in other words that it is a "leaf" and not a "branch". |
revision_id_snr | string | Optional. Points to an entry on the PRODUCT_REVISION table for product_id_snr. Required if is_revision_controlled is set to 'Yes' for product_id_snr |
revision_id_jnr | string | Optional. Points to an entry on the PRODUCT_REVISION table for product_id_jnr. Required if is_revision_controlled is set to 'Yes' for product_id_jnr. |
quantity | number | The count of this junior product which is contained within this senior product. |
scrap | number | Optional. This is the standard scrap or yield loss for this component product, expressed as a percentage. The minimum allowable value is zero and the maximum allowable value is 99.999. Scrap is assumed to be 0% if zero, blank or NULL. This is used in the product conversion process. |
cmp_comment | string | Optional. A comment on this entry. |
start_date | date | The start date for this entry. |
end_date | date | Optional. Indicates the end date for this entry. Blank signifies an unspecified date in the future. |
condition_type_id | string | Optional. Links to an entry on the CONFIG_CONDITION_TYPE table. |
condition_subype_id | string | Optional. Links to an entry on the CONFIG_CONDITION_SUBTYPE table. |
config_condition | string | Optional. Free format text. |
config_remarks | string | Optional. Free format text. |
bom_type_condition | string | Optional. Free format text. |
This identifies the different product configuration condition types which may exist.
Field | Type | Description |
---|---|---|
condition_type_id | string | Identification. |
condition_type_desc | string | Description. |
Here are some examples:
This identifies the different product configuration condition subtypes which may exist.
Field | Type | Description |
---|---|---|
condition_type_id | string | Links to an entry on the CONFIG_CONDITION_TYPE table. |
condition_subtype_id | string | Identification. |
condition_subtype_desc | string | Description. |
This identifies the different revisions or versions through which a product may progress during its lifetime. Entries on this table are only valid if the is_revision_controlled flag on the PRODUCT table is set to 'Yes'. Note that more than one revision can be valid at any one time, thus allowing a period of overlap between one revision and another. However, each revision must have a different effective_date otherwise it will not be possible to identify which one is the latest.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
revision_id | string | This identifies the revision or version number for this product. |
revision_desc | string | Optional. A description or name for this revision. |
effective_date | date | The date from which this revision becomes effective. |
discontinue_date | date | Optional. Indicates the date beyond which this entry is no longer valid. Blank signifies an unspecified date in the future. |
prod_rev_status_id | string | Optional. Links to an entry on the PROD_REV_STATUS table. |
This identifies the different revision status values that may exist.
Field | Type | Description |
---|---|---|
prod_rev_status_id | string | Identification. |
prod_rev_status_desc | string | Description. |
processing_seq | number | Optional. Allows the entries to be sorted into a particular order before being displayed in a dropdown list. |
Here are some examples:
This identifies the history of status changes for each product revision.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT_REVISION table. |
revision_id | string | Links to an entry on the PRODUCT_REVISION table. |
seq_no | number | A unique number assigned by the system. |
prod_rev_status_id | string | Links to an entry on the PROD_REV_STATUS table. |
status_date | date | The date on which this change was made. |
status_comment | string | Optional. The reason why this change was made. |
According to APICS The Association for Operations Management (section 5.5.7.1), Phantom bills are a coding and structuring technique used primarily for transient sub assemblies. The phantom bill represents an item that may not exist physically but is treated as an accounting unit.
A phantom bill of materials is a logical BOM representing:
As such, phantom items never actually exist.
The GM-X ERP application uses the following rules for phantom products:
These rules are enforced for phantom products; and also whenever at attempt is made to change the product_subtype from 'G' (Good) or 'S' (Service) to 'P' (Phantom), except that changes from 'G' (Good) or 'S' (Service) to 'P' (Phantom) are allowed even if price component records exist for the affected product but in this case those price component records will not be utilised for any subsequent orders or invoices.
Otherwise, the GM-X ERP application allows phantom products to be used in the same way as any other product:
A product costing system (also called a cost accounting system or costing system) is a framework used by firms to estimate the cost of their products for profitability analysis, inventory valuation and cost control.
Estimating the accurate cost of products is critical for profitable operations. A firm must know which products are profitable and which ones are not, and this can be ascertained only when the costs of each product are estimated correctly. Further, a product costing system helps in estimating the closing value of materials inventory, work-in-progress and finished goods inventory for the purpose of financial statement preparation.
Many firms select "standard cost" as the valuation type for product costing. A standard cost system determines cost per unit based on some reasonable historical or expected cost. Studies of past and estimated future cost data can then provide the basis for standard costs. Because the results of such studies will fluctuate over time, many firms also differentiate between:
The "actual cost" is a valuation type which reflects the actual out-of-pocket expense per unit incurred for procuring or making a batch or lot of a product (such as the average cost per unit of a purchase or production run), or an individual product unit. The actual cost to produce a product may differ from the estimated standard cost. For management control, the actual cost is compared to the standard cost for a specific item and differences, or "variances", are identified and analysed.
Product costs are better understood and controlled when they are broken down according to "cost elements" which are the factors of production or activities that are the fundamental drivers of cost performance. In their most basic form, these are:
In the GM-X ERP application, these basic elements are known as "cost element types" and are system-defined. Users may identify any number of cost elements reflecting material consumption, yield losses, material overhead consumption, labour expenditure, machinery and equipment utilisation and labour overhead consumption which can be defined as production factors or as activity cost pools for activity-based costing. Each such cost element is linked to a cost element type.
Manufacturers, and firms which perform kitting of purchased products or engage contract manufacturers to make semi-finished and finished products, will utilise bills of material (BOMs) which allow costs to be further broken down by level:
When rolling up costs through a BOM structure, some firms find it useful to combine labour and overhead with material costs at prior levels, whilst others do not. An indicator for this purpose is defined in the Product Controls task. Note that in this context "prior" level means a "lower" level in the BOM hierarchy.
The PARTY and ORGANISATION tables contain entries for every organisation which is required to be known to the GM-X application.
At least one of these parties is an organisation which is the "client" and it is the one for which the application is being run. This organisation is known as the "functional unit" and can be identified by adding it to the PARTY and ORGANISATION tables using a single party_id. This data provides the identity of the internal party in various transactions, such as sales orders and invoices.
It is also possible for a GM-X installation to handle the business for a group of organisations which do business under separate names, possibly using different functional currencies. Those organisations can be added as functional units to the PARTY and ORGANISATION tables. Each of them is identified in those tables by its own party_id. However, because all these organisations share the same product data, they will also share the same standard costs which, in turn, must be denominated in a common currency. The currency in which GM-X product costs are denominated is defined in the Product Controls task.
The GM-X application allows revision control to be enforced for specific products. Total cost per unit could vary for each revision of the same product due to BOM differences, as well as process differences that affect resource utilisation, yields or scrap.
The GM-X application also allows alternate BOM types to be defined for each product, or product revision. Total cost per unit could vary for each BOM type due to BOM differences, and those BOM differences might in turn introduce process differences.
Figure 11 - Product Costing
This identifies cost elements reflecting material consumption, yield or scrap losses, material overhead consumption, labour expenditure, machinery and equipment utilisation and labour overhead consumption which can be defined as production factors or as activity cost pools for activity-based costing.
Field | Type | Description |
---|---|---|
cost_element_id | string | Unique identity. |
cost_element_name | string | Short name. |
cost_element_name | string | Optional. Long description. |
cost_element_type | string | Must be one of the following:
|
This identifies the history of status changes for each product revision.
Field | Type | Description |
---|---|---|
product_id | string | Links to an entry on the PRODUCT table. |
valuation_type | string | Must be one of the following:
|
cost_element_id | string | Links to an entry on the COST_ELEMENT table. |
seq_no | number | A number assigned by the system so that variations with the optional bom_type_id and revision_id components can be kept unique. |
bom_type_id | string | Optional. Links to an entry on the PRODUCT_BOM_TYPE table. |
revision_id | string | Optional. Links to an entry on the PRODUCT_REVISION table. |
value_this_level | number | Display only. The cost per unit at this level. |
value_prior_levels | number | Display only. The cost per unit at prior level. |
status_comment | number | Display only. The cost per unit at all previous BOM levels. |
The PRODUCT_COST table also an alternate unique index comprising the product_id, bom_type_id, revision_id, valuation_type and cost_element_id to include the optional bom_type_id and revision_id elements.
This table identifies the emission factors for carbon dioxide (CO2), methane (CH4), and nitrous oxide (N2O) greenhouse gases (GHG) associated with a particular PRODUCT (for fuels), VEHICLE (for transport vehicles), or FACILITY (for energy consuming facilities).
An emission factor (EF) is a representative value that relates the quantity of a pollutant released to the atmosphere with an activity associated with the release of that pollutant. For GHG, EFs are typically expressed as the mass of a gas per unit of the emissions-producing activity or material input, such as kilograms of carbon dioxide (CO2) emitted per tonne of bituminous coal combusted.
To estimate emissions, an EF is multiplied by the corresponding activity data such as the energy contained in a mass of fuel combusted, or the amount of electricity consumed. Activity data need to be converted to match the units used by the EF to calculate GHG emissions. The basic formula is:
Activity data x Emission factor = GHG emissions
Field | Type | Description |
---|---|---|
emission_factor_id | number | Identity number which is generated automatically by the system. |
emission_factor_desc | string | Description |
start_year | number | The first year for which these emission factors apply. Zero by default. |
end_year | number | The last year for which these emission factors apply. 9999 by default. |
fossil_co2_emission_factor | number | Carbon dioxide (CO2) emission factor for fossil fuel. |
uom_numerator_fossil_co2 | string | The unit of measure in which the numerator of fossil_co2_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
uom_denominator_fossil_co2 | string | The unit of measure in which the denominator of fossil_co2_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
ch4_emission_factor | number | Methane (CH4) emission factor. |
uom_numerator_ch4 | string | The unit of measure in which the numerator of ch4_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
uom_denominator_ch4 | string | The unit of measure in which the denominator of ch4_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
n2o_emission_factor | number | Nitrous oxide (N2O) emission factor. |
uom_numerator_n2o | string | The unit of measure in which the numerator of n2o_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
uom_denominator_n2o | string | The unit of measure in which the denominator of n2o_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
biofuel_co2_emission_factor | number | Optional. Carbon dioxide (CO2) emission factor for biofuel. |
uom_numerator_biofuel_co2 | string | The unit of measure in which the numerator of biofuel_co2_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
uom_denominator_bilfuel_co2 | string | The unit of measure in which the denominator of biofuel_co2_emission_factor is denominated (Kilograms by default). Links to an entry on the UNIT_OF_MEASURE table. |
fuel_notes | string | Optional notes. |
source | string | Optional source of information. |
Various configuration options may sometimes be required for which there is no suitable place to hold them. In this case they are held within the MNU_CONTROL table in the MENU database which acts a as KEY-VALUE store.
This holds various configuration settings.
Field | Type | Description |
---|---|---|
record_id | string | "PRODUCT" |
currency_code_costing | string | Links to an entry on the CURRENCY_CODE table. This identifies the currency to be used on the PRODUCT_COST table. |
roll_prior_level_to_material | boolean | "YES" or "NO". Indicates if prior-level Labour and Overhead costs should be rolled up into the Material costs at the current level. Default is "NO". |
roll_to_material_cost_element | string | If roll_prior_level_to_material is "YES" then this must link to an entry on the COST_ELEMENT table which has a cost_element_type of "M" (Material). This is because there could be several of such entries. |
valuation_type | string | Product Cost Valuation Type Used in General Ledger. |
cost_element_id | string | Product Cost Element Id Used in General Ledger. |
product_bom_type | string | Product BOM Type Used in General Ledger. |
Date created: 6th August 2007
30 Mar 2024 | Updated the PRODUCT table to include the fuel_type, emission_factor_id, and heating_value_basis columns.
Added the EMISSION_FACTOR table. |
01 Sep 2022 | Updated the PRICE_COMPONENT table to include the rounding_method column. |
01 Aug 2022 | Updated Order Adjustments and Item Adjustments to expand the list of pricing options. |
20 Feb 2022 | Updated the Product Controls to add VALUATION_TYPE, COST_ELEMENT_ID and PRODUCT_BOM_TYPE which have been moved from Accounts Payable Control data. |
22 Feb 2021 | Moved SEO columns from the PRODUCT table to the PRODUCT_SEO table.
Moved SEO columns from the PRODUCT_CATEGORY table to the PRODUCT_CATEGORY_SEO table. |
08 Feb 2019 | Updated the PRODUCT_COMPONENT table to include the scrap column.
Updated the PRODUCT_BOM_TYPE table to include the yield column. |
05 Feb 2019 | Added the COST_ELEMENT table.
Added the PRODUCT_COST table. |
28 Jun 2018 | Updated the PRODUCT table to include the shelf_life_days column and change the options for the inventory_type column. |
01 May 2018 | Updated the UNIT_OF_MEASURE table to include the decimal_point and thousands_separator columns. |
04 Oct 2017 | Updated the PRICE_COMPONENT table to include the prod_feature_cat_id column. |
03 Apr 2017 | Added the PROD_FEAT_CAT_UOM table.
Added the PROD_FEAT_CAT_CUSTOMISATION table. Updated the PRODUCT_FEATURE_CATEGORY table to remove the uom_id, uom_id_2, uom_id_3, measurement_label, measurement_label_2, measurement_label_3, customisation_allowed, customisation2_allowed, customisation_label and customisation_label_2 columns. Added the PROD_FEATURE_UOM table. Updated the PRODUCT_FEATURE table to remove the measurement, measurement_2, measurement_3, customisation_allowed and customisation2_allowed columns. Added the PROD_FEATURE_CUSTOMISATION table. |
11 Dec 2016 | Added the PROD_REV_STATUS, PROD_REV_STATUS_HIST, CONFIG_CONDITION_TYPE and CONFIG_CONDITION_SUBTYPE tables.
Updated the PRODUCT_COMPONENT table to include the condition_type_id, condition_subtype_id, config_condition, config_remarks and bom_type_condition columns. Updated the PRODUCT_REVISION table to include the prod_rev_status_id column. |
03 Nov 2016 | Added the BOM_TYPE and PRODUCT_BOM_TYPE tables.
Added the bom_type_id_snr and bom_type_id_jnr columns to the PRODUCT_COMPONENT table |
21 Sep 2016 | Renamed the GOOD_IDENTITY_TYPE table to PRODUCT_IDENTITY_TYPE.
Renamed the GOOD_IDENTIFICATION table to PRODUCT_IDENTIFICATION. |
21 Apr 2016 | Added the GTIN table. |
10 Feb 2016 | Removed the PRODUCT_URL table.
Removed the PRODUCT_URL_CANONICAL table. |
20 Aug 2015 | Amended the PRODUCT_FEATURE_CATEGORY table to include the customisation_label and customisation_label_2 columns. |
17 May 2015 | Amended the PRODUCT_EXTRA_NAMES table to include the sort_seq column. |
21 Mar 2015 | Added the PRODUCT_CATEGORY_PARTY table. |
08 Aug 2014 | Amended the PRODUCT_FEATURE_CATEGORY table to include the uom_id_2, uom_id_3, measurement_label, measurement_label_2 and measurement_label_3 columns. |
24 Jul 2014 | Added the PRODUCT_REVISION table.
Added the PRODUCT_URL_CANONICAL table. Amended the PRODUCT table to include the is_revision_controlled column. Amended the PRODUCT_COMPONENT table to include the revision_id_snr and revision_id_jnr columns. |
18 Jun 2014 | Amended the UNIT_OF_MEASURE table to include the scale column.
Amended the PRICE_COMPONENT table to include the party_id_functional column. |
04 Jul 2013 | Amended the PRODUCT_CATEGORY table to remove price_calculation_id.
Amended the PROD_CAT_CLASS table to add second_flag and third_flag. |
21 May 2014 | Added the DEFAULT_FEATURE table. |
17 Mar 2014 | Amended the PRODUCT_CATEGORY table to include banner_text_upper. |
12 Feb 2014 | Added the PRODUCT_URL table. |
21 Oct 2013 | Added the PROD_FEATURE_COMPONENT table. |
05 Oct 2013 | Added the PROD_CAT_EXTRA_NAMES and PROD_CAT_EXTRA_VALUES tables. |
08 Aug 2013 | Amended the PRODUCT_FEATURE table to add prod_feature_id_url. |
06 Aug 2013 | Amended the PROD_CAT_ROLLUP table to add hierarchy_id. |
10 Jul 2013 | Amended the PRODUCT_FEATURE table to add measurement_3. |
08 Jul 2013 | Amended the PROD_CAT_FEATURE_APPLICABILITY table to include is_default. |
05 Jul 2013 | Added the PROD_CAT_FEATURE_APPLICABILITY table.
Amended the PRODUCT_FEATURE_CATEGORY table to remove measurement_reqd and replace it with uom_id. Amended the PRODUCT_FEATURE table to remove uom_id and add measurement_2. |
04 Jul 2013 | Amended the PRODUCT_CATEGORY table to include price_calculation_id. |
30 May 2013 | Amended the PRODUCT_CATEGORY table to include short_name, filter_image, promo_image and product_example_image. |
18 Dec 2012 | Amended the PRODUCT_CATEGORY table to include seo_heading.
Amended the PRODUCT table to include seo_heading. |
17 Nov 2012 | Amended the PRODUCT_CATEGORY table to include banner_title. |
04 July 2012 | Amended the PRODUCT table to include product_id_url. |
24 May 2012 | Amended the PRODUCT table to include lead_time. |
03 May 2012 | Amended the PRODUCT_CATEGORY table to include banner_text. |
29 Nov 2011 | Added the PRODUCT_COMPONENT table. |
08 Dec 2010 | Amended the PRODUCT_CATEGORY table to include sort_seq. |
09 Jul 2010 | Amended the PRODUCT_FEATURE table to include start_date and end_date. |
21 Jun 2010 | Added the COMPATIBLE_PRODUCT table. |
07 Jul 2008 | Amended the PRODUCT table to include seo_image_alt. |
20 May 2008 | Amended the PRICE_COMPONENT table to add 'Hire Charge' to price_type. |
03 May 2008 | Amended the UOM_CONVERSION table to include seq_no, start_date and end_date.
Amended the UNIT_OF_MEASURE table to include uom_symbol. |
04 Mar 2008 | Amended the PRODUCT table to include seo_title, seo_desc and seo_keywords.
Amended the PRODUCT_CATEGORY table to include seo_title, seo_desc and seo_keywords. |
09 Dec 2007 | Amended the PRODUCT_FEATURE_CATEGORY table to include customisation_allowed. |
11 Nov 2007 | Added the PROD_FEATURE_CAT_APPLIC table. |
27 Oct 2007 | Added the PRODUCT_EXTRA_NAMES and PRODUCT_EXTRA_VALUES tables. |
13 Oct 2007 | Moved the PREFERENCE_TYPE, RATING_TYPE and PRODUCT_SUPPLIER tables from the INVENTORY database.
Added column supplier_part_no to the PRODUCT_SUPPLIER table. |
10 Oct 2007 | Added the PROD_CAT_LEVEL table.
Updated PRODUCT_CATEGORY to include a foreign key to PROD_CAT_LEVEL. Also added the prod_cat_name column. Updated PRODUCT_FEATURE_CATEGORY to include the prod_feature_cat_name column. Updated PRODUCT_FEATURE to include the prod_feature_name column, and the prod_feature_code column as an optional unique key. Updated PRODUCT to include the product_desc column. |
Copyright © 1999-2024 by Geoprise Technologies Licensing, All Rights Reserved.