There are a couple of use cases for developing your own integration with the Quotation Factory platform. Some of those use cases are:
integrate with your ERP system: various 3rd parties have already developed integrations with various ERP systems. But if no integration for your ERP system has been built yet, you can develop it on your own. It's no rocket science! Existing ERP system integrations are:
Ridder iQ
Bemet
MKG
ISAH
Lantek Integra
integrate with your CAM system(s): various 3rd parties have already developed integrations with CAM systems. But if no integration for your CAM system has been built yet, you can develop it on your own. It's no rocket science! Existing CAM system integrations are:
LVD CADMAN-B
LVD CADMAN SDI
Trumpf TruTop Boost
Trumpf TruTop Fab
Bystronic Bysoft CAM
Autopol
Lantek
estimate specific working steps: using your own logic in code that runs in your own on-premise data center.
Are there any examples of pre-build integrations?
You'll find examples of how to develop your own integration on GitHub.
The URL of our GitHub repository is: https://github.com/QuotationFactory
Note:
On github, in the code examples, and in NuGet, you might find references to Rhodium24 and MetalHeaven. Those names come from the initial phase of the startup. Rhodium24 was the name of the platform and MetalHeaven the name of the company. In 2022, we rebranded both the platform and the company to Quotation Factory.
NuGet package for .NET development
All the information in a quotation project is available in .json format and is based on versioned data contracts to make sure that changes won't break any existing integrations.
To make development as easy as possible, you can use an open-source Nuget package to deserialize the .json file into a tree structure of POCOs (Plain Old C# Objects).
The Nuget package can be found at: https://www.nuget.org/packages/MetalHeaven.ExternalDataContracts/
Understanding the structure of the Bill of Materials (BoM)
The first step in working with the project data is understanding the structure of the BoM (Bill of Materials).
BoM Items
The Bill of Materials consists of objects of the generic type BoMItem. Every BoMItem has a unique ID of the data type GUID.
A BoMItem can represent:
the project
an assembly
a subassembly
a part type
a part instance
Note that
- the BoM always has exactly one BoMItem of type Project which is the root of the tree-structure
- the project can include more than one assembly, which will be BoM Items of type assembly and are direct children of the BoM Item of type Project.
- if individual parts (mono parts) are uploaded, those parts will be grouped as children of one and the same assembly (placeholder) names "individual parts". The ID of this assembly is a constant value GUID. Meaning, every project that has individual parts will have an assembly (placeholder) with the same constant value GUID.
Part Types versus Part Instances
The easiest way to understand the difference between part types and part instances is by using the example of a table. Imagine a table with four legs. Let's suppose that the four legs are geometrically identical. In the CAD model, the engineer modeled the leg only once and made 3 additional (logical) copies. Then the designer positioned every one of the legs accordingly in the 3-dimensional space to finish up the design of the table. The designer was clever enough to make logical copies of the legs. Meaning that if he changes one of the legs, he actually changes the design of the other 3 legs too. The copies are linked to each other.
In this example, the leg of the table is a BoMItem and will show up as one line in the BoM with a quantity set to 4. The quantity of 4 indicates that in the product, 4 instances exist of the PartType. The 4 instances are also explicitly part of the BoM structure and are BoMItems of the type PartInstance.
Another example could be an assembly made out of sheet metal with many inserts. Imagine the inserts being of one model/type only. The assembly can have 50 inserts of the same type meaning that the insert in a BoM Item, occurs only once as a PartType with a quantity of 50. Also, somewhere in the BoM structure, there exist 50 PartInstances referring to the same PartType.
The PartList collection
The PartList is a collection of BoMItems of the type PartType. The collection contains all PartTypes in the project, independent of the (sub)assembly they are part of.
Every PartType has a reference (assemblyId) to the assembly of which it is a member.
Every PartType has a collection of PartInstances, referencing the individual instances of this part somewhere within the structure of the assembly.
The Assemblies collection
The Assemblies collection contains children of BoMItems of type Assembly.
Every assembly can have a collection of BoMItems of type SubAssembly and SubAssembly items can have children of type SubAssembly too. As such, a tree structure of subassemblies is modeled.
Every BoMItem of type Assembly and of type SubAssembly also has a collection of PartInstance. This way, a relation exists between the PartTypes in the PartList collection, through the PartInstances with the same IDs (or object instances in case of a POCO structure) that are both children of PartTypes as well as of (Sub)Assemblies.
Understanding Money and Units Of Measure based properties
The Quotation Factory platform under the hood is always explicit in the case of money-based properties and properties that can have a unit of measure. Two specific different .NET libraries are used:
NodaMoney: for money-based properties, the Noda Money library is used that can be found at https://github.com/AutomateValue/NodaMoney
UnitsNet: for the unit-of-measure-based properties, the UnitsNet library is used which can be found at https://github.com/angularsen/UnitsNet
Note:
The Noda Money library makes sure that that both the currency and the currency value are first class citizens. The UnitsNet library makes sure that both the unit type (e.g. Length), the unit itself (e.g. mm) as well as the value are first class citizens. The Quotation Factory Nuget Package with external data contracts to de-serialize the .json into a POCO object hierarchy, includes the appropriate de-serializers for the Noda Money as well as the UnitsNet datatypes.
The Financial object
The Financial object is a property that every BoM item has. As such, the Financial can be found at all levels in the BoM structure:
the project
an assembly
a subassembly
a part type
a part instance
The Financial object has the following structure:
Quantity: Quantity is found in the CAD model
TotalProjectQuantity: Quantity * batch size at assembly level * batch size at the project level
CostPricePerItem: CostPrice of 1 item (money value)
CostPriceOfItems: CostPrice * TotalProjectQuantity (money value)
SurchargeRatio: ratio, based on scaled ratios configured for this type of item
SurchargeValuePerItem: surcharge as money value based on CostPricePerItem
SurchargeValueOfItems: surcharge as money value based on CostPriceOfItems
DiscountRatio: ratio, based on the scaled ratios configured for this type of item
DiscountValuePerItem: discount as money value based on CostPricePerItem + SurchargePerItem
DiscountValueOfItems: discount as money value based on CostPriceOfItems + SurchargeOfItems
SalesPricePerItem: CostPricePerItem + SurchargeValuePerItem - DiscountValuePerItem
SalesPriceOfItems: CostPriceOfItems + SurchargeValueOfItems - DiscountValueOfItems
DiscountOrSurchargeRatio: deprecated
DiscountOrSurchargePerItem: deprecated
DiscountOrSurchargeOfItems: deprecated
Working step types
WorkingStepType enumerator:
NotInitialized (0)
SheetCutting (1)
Sawing (2)
SheetBending (3)
CounterSinking (4)
Milling (5)
TubeOrProfileCutting (6)
Turning (7)
Purchasing (8)
Engraving (9)
ThreadTapping (10)
Anodising (12)
Assembling (13)
BoltPressing (14)
Deburring (15)
Drilling (16)
EdgeMilling (17)
EdgeTrimming (18)
LevelTensioning (19)
NutPressing (20)
PicklingPassivating (21)
Polishing (23)
PowderCoating (24)
Punching (25)
Rolling (26)
StudWelding (27)
TubeProfileOrBarBending (28)
Welding (29)
ZincPlating (30)
Designing (31)
Loading (32)
Unloading (33)
SheetShearing (34)
Setup (37) (preparing)
Certifying (38)
Shipping (39)
Programming (40)
OrderPicking (41)
Packaging (42)
BeadBlasting (43) (pearl blasting, glass pearl blasting)
SandBlasting (44)
SteelGridBlasting (45)
WetBlasting (46)
VacuumBlasting (47)
CentrifugalBlasting (48)
SodaBlasting (49)
BristleBlasting (50)
DryIceBlasting (51)
PencilBlasting (52)
WeldGrinding (53)
RobotWelding (54)
RobotStudWelding (55)
Nitriding (56)
DieSinking (57) (NL: Zinkvonken)
WireErosion (58) (NL: Draadvonken)
Hemming (59)
VibratoryDeburring (60) (NL: trommelen)
Foiling (61)
Cleaning (62)
QualityControlling (63)
ElectrolyticPolishing (64)
CathodicDipCoating (65) (NL: KTL lakken)
ElectrophoreticDipCoating (66) (NL: EDP)
FlowDrilling (67)
HoleProtectioning (68)
Operating (69)
Researching (70)
Project state enum
NotInitialized: 0
Defining: 1 (action state)
Requested: 2 (waiting state)
Quoting: 3 (action state)
Quoted: 4 (waiting state)
Negotiating: 5 (action state)
Ordered: 6 (waiting state)
Producing: 7 (action state)
Produced: 8 (waiting state)
Packaging: 10 (action state)
Packaged: 11 (waiting state)
Delivering: 12 (action state)
Delivered: 13
Canceled: 14
Quotation Factory Agent commands
RequestedIntegrationSettings
RequestedAddressbookSync
RequestedArticlesSync
EstimateProductionTime
EstimateAdditionalCosts
EstimateManufacturability