Skip to main content

BOM Format

Universal Import BOM format

The Universal Import BOM format is composed of 2 parts:

  • A commercial part, named document (cf.Document)
  • A graphical part, named room3D
{
"version": int,
"externalApplicationID": int,
"document": Document,
"settingID": int,
"room3D": 3DInfo
}
propertytypecardinalitycomment
versionintMShould be the latest version of the format (1)
externalApplicationIDintMYour external application ID
documentDocumentMThe document containing all the commercial information
settingIDintCThe settingID if given in the OpenConfigurator message
room3D3DInfoCThe 3D positionning information of the object in the scene.
Used for EDI
cardinality
  • M: Mandatory value
  • C: Conditional value. If you do not want to provide a value, just don't send the parameter.

Commercial document

Document

The Document structure contains all the relevant commercial information that may be imported.

document: 
{
"currencyCode": string,
"catalogs": Catalog[],
"styles": Style[],
"lines": Line[]
}
propertytypecardinalitycomment
currencyCodestringMISO 4217 code for the currency used by all monetary amounts in this import.
See: Company Currency
catalogsCatalog[]MArray of unique catalogs referenced by the document lines
stylesStyle[]MArray of unique styles referenced by the document lines
linesLine[]MArray of lines for the document to be imported

Line

A Line represent a commercial item.

All dimensions (Width, Height, Depth) are to be supplied in mm for Metric catalogs and inch for Imperial catalogs.
Weight: KiloGrammes
Volume: CubicMeter m3
VolumetricMass: kg/m3 KiloGrammes per CubicMeter

line:
{
"parentLineIndex": int, // (parentID), ref: document.lines[{parentLineIndex}]
"description": string,
"notes": string,
"styleIndex": int, // ref: document.styles[{styleIndex}]

"quantity": decimal,
"quantityUnit": string, // (ENUM: [PCE]: PieCE / unit, [LM]: LinearMeter, [LDM]: LinearDeciMeter, [SQM]: SQuareMeter) Default [PCE]
"unitCostPrice": decimal, // (Default 0)
"unitSalesPrice": decimal,
"tax1Rate": decimal, // in %, 20 = 20%
"tax2Rate": decimal,
"tax3Rate": decimal,
"discountPercentage": decimal, // in %, 20 = 20% discount

"blockLineType": string, // (ENUM: [OOB]: OutOfBlock, [B]: Block, [BO]: BlockOverage, [BI]: BlockItem) default to [OOB]
"countermark": string,
"plannerUniqueID": int,
"plannerLineNumber": string,

"hinging": string, // (ENUM: [L]eft, [R]ight, [B]ottom, [T]op, [N]one)
"plinthHeight": decimal,
"overrideWidth": decimal,
"overrideHeight": decimal,
"overrideDepth": decimal,
"overrideWeight": decimal,
"overrideVolume": decimal,

"specificBehavior": {
"noPrintOnSalesDocument": bool,
"noPrintOnPurchaseDocument": bool,
},

"product": Product
}

Line properties

propertytypecardinalitydefaultcomment
parentLineIndexintCnullThe index of the parent line
ref: document.lines[{parentLineIndex}]
descriptionstringC""The short description of the line
notesstringC""The long notes of the line
styleIndexintCnullThe style index of this line
ref: document.styles[{styleIndex}]
quantitydecimalMThe quantity of the line
quantityUnitstringMPCEThe Unit of quantity:
PCE: PieCE / unit
LM: LinearMeter
LDM: LinearDeciMeter
SQM: S QuareMeter
unitCostPricedecimalMThe unitary cost price of the line without taxes
unitSalesPricedecimalMThe unitary sales price of the line without taxes
tax1RatedecimalCnullThe tax1 rate for this line in %
ex: 20 = 20% tax rate
tax2RatedecimalCnullThe tax2 rate for this line in %
ex: 20 = 20% tax rate
tax3RatedecimalCnullThe tax3 rate for this line in %
ex: 20 = 20% tax rate
discountPercentagedecimalMThe discount percentage in %
ex: for a 20% discount, discountPercentage = 20
blockLineTypestringCOOBIf this line is a block line, the type of block:
OOB: OutOfBlock
BI: BlockItem
B: Block
BO: BlockOverage
countermarkstringC""The countermark of the line
plannerUniqueIDintMThe unique id of this line given by the configurator, used to follow and recognize lines between imports
plannerLineNumberstringCnullThe configurator line number for this line
hingingstringCnullThe hinging orientation, when applicable:
L: Left
R: Right
M: Both
B: Bottom
T: Top
N: None
plinthHeightdecimalCnullThe height in millimeters of the product plinth
overrideWidthdecimalCnullMust be filled if you have a custom Width compared to the original catalog product Width
overrideHeightdecimalCnullMust be filled if you have a custom Height compared to the original catalog product Height
overrideDepthdecimalCnullMust be filled if you have a custom Depth compared to the original catalog product Depth
overrideWeightdecimalCnullMust be filled if you have a custom Weight compared to the original catalog product Weight
overrideVolumedecimalCnullMust be filled if you have a custom Volume compared to the original catalog product Volume
specificBehaviorSpecificBehaviorCnullContains specific behaviors that can be applied to the line
productProductMThe product detail of the line
SpecificBehavior
propertytypecardinalitydefaultcomment
noPrintOnSalesDocumentboolCfalseThis line will be omitted on sales reports
noPrintOnPurchaseDocumentboolCfalseThis line will be omitted on purchase reports

Taxes

See Company taxes

Blocks

Block are a type of pricing method used by the furniture market:

  • OOB / OutOfBlock: are document lines that are not part of the block.
  • BI / BlockItem: are document lines that are part of the block.
  • B / Block: is the ligne that represents the chosen block and owns the block price.
  • BO / BlockOverage: are the sublines of the blocks that represent the reduction that this block offers on the document.

Product properties

{
"code": string,
"finish": string,
"category": string,
"ediLongArticleType": int, // ENUM
"primaryType": string,
"secondaryType": string,
"eanCode": string,
"manufacturerCode": string,
"description": string,
"notes": string,

"ecoTax": { // DEEE, WEEE
"organizationCode": string, // from a supportedList
"code": string,
"unitAmount": decimal,
},

"ecoPart": { // DEA
"organizationCode": string, // from a supportedList
"productCode": string,
"isAFixAmount": bool,
"unitAmount": decimal,
"unitCount": decimal,
},

"catalogIndex": int,

"width": decimal,
"height": decimal,
"depth": decimal,

"weight": decimal,
"volume": decimal,
"volumetricMass": decimal,

"specificBehavior": {
"externalPricing": bool | null,
},

"pictureUrl": string // http(s) url of the image
}
propertytypecardinalitydefaultcomment
codestringMProduct code
finishstringMProduct finish
categorystringMMain category of the product.
Should correspond with the Retail Ops category mapping.
ediLongArticleTypeintCnullThe EDILongArticle type if this is a long article (linears).
See ediLongArticleType
primaryTypestringC""The primary type (primary and secondary types are used for exemple in the Installation and services)
secondaryTypestringC""Secondary type
eanCodestringCnullThe EAN code of the product
manufacturerCodestringC""The Manufacturer code of the product
descriptionstringC""Short description
notesstringC""Long notes on the product
ecoTaxEcoTaxCIf applicable, the WEEE tax information
ecoPartEcoPartCIf applicable, the Appliance recycling tax information EcoParticipation / French EcoMobilier / DEA
catalogIndexintMThe index of the catalog ref: document.catalogs[{catalogIndex}] of this product
widthdecimalM
heightdecimalM
depthdecimalM
weightdecimalC0
volumedecimalC0
volumetricMassdecimalC0
specificBehaviorSpecificBehaviorC0
pictureUrlstringMhttp(s) url of the image
ediLongArticleType
IDName
1Plinth
2Worktop
3Wall seal profile
4Light pelmet
5Cornice
6Projecting cornice panel
7Railing
8Ceiling infill panel
99Obstacle
SpecificBehavior
propertytypecardinalitydefaultcomment
externalPricingboolCfalsetrue if this product is used to call the External pricing feature
EcoTax
propertytypecardinalitydefaultcomment
organizationCodestringMThe code of the organization.
See Supported EcoTax organizations
codestringMThe tax code used
unitAmountdecimalMThe unitary price of the tax
Supported EcoTax organizations
NameCode
Eco-systèmeECOSYSTEM
EcologicECOLOGIC
EcoPart
propertytypecardinalitydefaultcomment
organizationCodestringMThe code of the organization.
See Supported EcoPart organizations
codestringMThe used tax code
isAFixAmountboolMtrue if the tax is a fix value that do not depends on the quantity of the line
unitAmountdecimalMThe unitary price of the tax
unitCountdecimalMThe quantity of tax present in 1 quantity of the line
Supported EcoPart organizations
NameCode
Eco-maisonECOMAISON
ValdeliaVALDELIA
ValobatVALOBAT
Valobat PMCBVALOBAT_PMCB

Catalog

The different catalogs that will be used by the document.

catalog: 
{
"code": string,
"externalCode": string,
"measurementUnit": string //(ENUM: [M]etric, [I]mperial)
}
propertytypecardinalitycomment
codestringMThe code of the catalog, used to identify it. This code is used in order to match existing catalogs (and then refer them), or else create a new one
externalCodestringMYour code for this catalog
measurementUnitstringMThe typeof measurement used in this catalog:
M: Metric
I: Imperial

Style

The different styles that are used by the document lines.
They are declared here so that if several lines have the same style, they can reference the same styleIndex instead of repeating all the styles information.

style:
{
"code": string,
"orderCode": string,
"catalogIndex": int,
"description": string,
"notes": string,
"features": [
{
"code": string,
"orderCode": string,
"description": string,
"notes": string,
"option": {
"code": string,
"orderCode": string,
"description": string,
"notes": string
}
}
]
}

Style information are organized in 3 concepts:

Style

Corresponds to the main style of an item, and contains the list of customizable Features (e.g. properties) of this Style, with their selected Option (e.g. value).
Ex: A cabinet can be assigned the "Industrial" Style/Range from its related catalog.

Feature

Then the Style can propose variations of certain Features of the cabinet, with their selected Option.
Ex: The "Industrial" Style can propose multiple properties (e.g. "Front", "Handle", etc.), which are the Features of this Style.

Option

And finally you have the Option that is the value you have chosen for a Feature. Ex: For the "Handle" feature, you may want the "Vertical anodized black" handle on your cabinet.


The Style, Feature and Option have the same set of parameters:

propertytypecardinalitycomment
codestringMThe seller code for this (Style/Feature/Option)
orderCodestringMThe manufacturer code for this (Style/Feature/Option)
catalogIndexintMThe catalog in which this (Style/Feature/Option) is present
descriptionstringCThe short commercial name of this (Style/Feature/Option)
notesstringCThe long notes of this (Style/Feature/Option)
style.featuresFeature[]MThe Feature list of this Style
feature.optionOptionMThe selected Option for this Feature

3D positioning information

In case you want to be able to send your imported data to a manufacturer with the positioning of the objects in the scene, then you need to fill in the 3DInfo section of the import format.

These data are required in order to generate the EDI file owning the positioning information.

You should only include the articles present in the import and which are needed for the manufacturing / order.
Do not include decorative items.

3D Coordinates System

  • Cartesian Coordinates System (right-handed system).
  • The X/Y axis is the floor plane.
  • The Z axis specifies the height.
  • Both positive and negative coordinates are permitted.

  • Each object has a reference point, spatial orientation, maximum extension and any additional special characteristics. The object's position is determined by the absolute coordinates of the reference point.
  • An object's alignment is determined by a rotation around the Z axis. The angle results from the X axis as well as the object's reference axis. Rotation is in degree using the trigonometric rotation (anti-clockwise).

Units

  • position / distance / dimensions are defined as float in millimeters
  • angles are float in degree, using the trigonometric rotation (anti-clockwise)

Cardinality

Field can be M for Mandatory of C for conditional.
Some conditional fields can become Mandatory if you filled other conditional fields.

All mandatory fields are in bold.

3DInfo object structure

3DInfo:
{
"roomHeight": float,
"roomConstruction": {
"walls": Wall[],
"doors": Door[],
"windows": Window[],
"recesses": Recess[],
"hindrances": Hindrance[],
"radiators": Radiator[],
"roofSlopes": RoofSlope[],
},
"articles": Article[]
}

Position

In this format, all Position objects are an array of 3 float values representing the x, y & z coordinates.
ex:
=> absolutePos: Position
=> absolutePos: [x, y, z]
=> absolutePos: [float, float, float]
=> absolutePos: [14.5, 56.1, 2.4]

Wall

Since the decisive information for planning is usually placed inside walls, walls are used to describe a room.
Walls are specified as an area (width x height); it is not required to specify its depth.
In order to describe walls more precisely, especially with inside walls, the surface between two wall ends can be optionally specified:

  • Intersections of several walls are permitted.
  • The reference point is located at the bottom left of the inside wall.
  • The walls of a plan can have different heights.
  • Depth is optional (default value = 0) and is cleared to the back.
  • The walls of a plan can have different depths.
{
"position": Position,
"width": float,
"height": float,
"depth": float,
"angle": float,
"type": string
}
propertytypecardinalitycomment
positionPositionMAbsolute position coordinates of the reference point
widthfloatM
heightfloatM
depthfloatCDefault to 0
anglefloatMRotation around Z
typestringCThe wall type can be:
O: Outside (by default)
S: Separation

Door

Doors are rectangular:

  • The measure specifies the door leaf including the door frame, not the required wall opening.
  • Width and height include the door frame.
  • Depth (optional) specifies the depth of the door leaf (default value = 0).
  • The reference point is located left/bottom/rear.
  • Can optionally identify on which wall it's positioned
{
"position": Position,
"width": float,
"height": float,
"depth": float,
"angle": float,
"hinge": string,
"opening": string,
"wallIndex": int,
}
propertytypecardinalitycomment
positionPositionMAbsolute position coordinates of the reference point
widthfloatM
heightfloatM
depthfloatCDefault to 0
anglefloatMRotation around Z
hingestringMDoor hinge:
N: None
L: Left
R: Right
openingstringMDoor opening direction:
N: None
I: Inside
O: Outside
S: Slide
wallIndexintCIndex of the wall it's attached to

Window

A Window item is very similar to a Door object:

  • Windows are rectangular
  • The measure specifies the window as well as the required wall opening.
  • Depth specifies the window frame depth (default value = 0).
  • The reference point is located left/bottom/rear.
{
"position": Position,
"width": float,
"height": float,
"depth": float,
"angle": float,
"hinge": string,
"opening": string,
"wallIndex": int,
}
propertytypecardinalitycomment
positionPositionMAbsolute position coordinates of the reference point
widthfloatM
heightfloatM
depthfloatCDefault to 0
anglefloatMRotation around Z
hingestringMWindow hinge:
N: None
L: Left
R: Right
T: Top
B: Bottom
openingstringMWindow opening direction:
N: None
I: Inside
O: Outside
S: Slide
wallIndexintCIndex of the wall it's attached to

Recess, Hindrance, Radiator

All of those 3 objects have the exact same structure:

  • Recesses specify cut-outs located within a wall.
  • Hindrances are usually located in front of a wall (e.g. fireplaces, wall projections), but can also be located in open floor space.
  • Radiators are also located in front of a wall, but they can also be located in recesses or open floor space.

They all:

  • Are rectangular parallelepipeds.
  • All measures should be specified. There are no optional measures.
  • The reference point is located left/bottom/rear.

{
"position": Position,
"width": float,
"height": float,
"depth": float,
"angle": float,
"wallIndex": int,
}
propertytypecardinalitycomment
positionPositionMAbsolute position coordinates of the reference point
widthfloatM
heightfloatM
depthfloatM
anglefloatMRotation around Z
wallIndexintCIndex of the wall it's attached to

RoofSlope

A roof slope is specified according to the sketch below:

  • The reference point is located left/bottom/rear.
  • All measures should be specified. There are no optional measures.
  • The roof slope is described by a prism. In this context, the Z coordinate specifies the flap tile height. The slope angle is defined by the height and depth.

Same object as Recess

Article

Manufacturing / order relevant articles are specified in this segment. On one hand, these are "conventional" cabinets, but also parts to be generated, such as work tops, light pelmets, cornices, etc.

  • All these articles must reference an existing document line.
  • The Z position represents the height from the floor level (ex: a base cabinet with a base height of 100 mm has a "Z" value of "100").
  • In order to better describe the shape of some articles (worktop, plinth, cornice, ...), they can be transmitted as polylines.
{
"documentLineIndex": int,
"position": Position,
"angle": float,
"shape": int,
"constructionType": string,
"polyline": Polyline,
}
propertytypecardinalitycomment
documentLineIndexintMIndex of the document line that corresponds to this article (document.lines[{documentLineIndex}])
positionPositionMAbsolute position coordinates of the reference point
anglefloatMRotation around Z
shapeintCBasic shape number for linears, according the IDM format
constructionTypestringCLinear construction type, according the IDM format:
N: None
L: Left
R: Right
polylinePolylineCPolyline representing the linear shape

For the Shape id and corresponding construction type, see the IDM Specification, chapter "Basic shapes".

Polyline

Polylines are used to better describe placement and shape of certain articles like worktops, plinths, cornices, ...

A Polyline:

  • Has a type
  • Is composed of points where the z coordinate origin depends on the Type
  • Is a list of points, passed as the counter-clockwise order around the shape.
  • Can be open of closed depending on the type:
    • In the case of a closed polyline, do not add the endpoint. It is assumed the endpoint is the start point, so for n object edges, only n points are transmitted.
    • For open polyline, transmit the endpoint. So for n object edges, n+1 points are transmitted.
  • Edge is represented by its start point and its end point, which is the start of the next edge.
  • Points can have a height component to represent a curved edge:
    • The height of a point specifies the Height of the edge from point i to i+1
    • The height specifies the perpendicular distance between the centre of the edge and the circle segment.
    • If the height is 0 (or not specified), it is a straight line.
    • As the Polygon alignment is pre-defined as counter-clockwise, the following rules apply:
      • Positive height describes a convex curve.
      • Negative height describes a concave curve.

Polyline:

{
"type": int,
"points": PolyPoint[],
}
propertytypecardinalitycomment
typeintMType of the Polyline (cf. Polyline Types)
pointsPolyPoint[]MArray of points for this Polyline
PolyPoint
  • A PolyPoint is an Array of floats like a Position [x, y, z], but with an optional 4th value : the height
  • PolyPoint coordinates are absolute like for the Position

PolyPoint => [x, y, z] | [x, y, z, height]
PolyPoint => [float, float, float] | [float, float, float, float]
PolyPoint => [58.4, 158, 75] | [58.4, 158, 75, 12]

Polyline Types
TypeMeaningZ CoordinatePolyline
1PlinthTop EdgeOpen
2Work TopBottom EdgeClosed
4Light PelmetTop EdgeOpen
5CorniceBottom EdgeOpen