Hi S Munene,

Thanks for sharing this use case — I’ve not worked on dairy-based
manufacturing specifically, but I’ve handled other types of manufacturing
setups using OFBiz (like assemblies and multi-stage BOMs). I am
sharing the *demo
dataset* based on your milk product example to test routing, task
sequencing, and equipment group behavior.

   1.

   *Product Types Used*:
   I used existing types (RAW_MATERIAL, FINISHED_GOOD).
   -

      For example, I treated both Raw Milk and Pasteurised Milk as
      RAW_MATERIAL.
      2.

   *Equipment Modeling*:
   I defined equipment *groups* like GROUP_PASTEURISER, GROUP_HOMOGENIZER,
   etc., and then added individual machines under them (e.g., PASTEURISER_01,
   PASTEURISER_02) using parentFixedAssetId.
   3.

   *Routing Tasks*:
   Each task is linked to its equipment group using the fixedAssetId field
   directly in the WorkEffort. This prevents irrelevant assets from
   appearing during task scheduling.

Here is the demo data for reference:

<entity-engine-xml>
    <!-- FIXED ASSET GROUPS -->
    <FixedAsset fixedAssetId="GROUP_PASTEURISER"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Pasteuriser Group"/>
    <FixedAsset fixedAssetId="GROUP_HOMOGENIZER"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Homogenizer Group"/>
    <FixedAsset fixedAssetId="GROUP_COOLING_UNIT"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Cooling Unit Group"/>
    <FixedAsset fixedAssetId="GROUP_MIXER"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Mixer Group"/>
    <FixedAsset fixedAssetId="GROUP_INCUBATOR"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Incubator Group"/>
    <FixedAsset fixedAssetId="GROUP_PACKAGING"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Packaging Machine
Group"/>
    <FixedAsset fixedAssetId="GROUP_SHRINKWRAP"
fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Shrink Wrapper Group"/>

    <!-- INDIVIDUAL MACHINES -->
    <FixedAsset fixedAssetId="PASTEURISER_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Pasteuriser 01"
parentFixedAssetId="GROUP_PASTEURISER" purchaseCost="75000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="PASTEURISER_02"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Pasteuriser 02"
parentFixedAssetId="GROUP_PASTEURISER" purchaseCost="75000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="HOMOGENIZER_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Homogenizer 01"
parentFixedAssetId="GROUP_HOMOGENIZER" purchaseCost="60000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="HOMOGENIZER_02"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Homogenizer 02"
parentFixedAssetId="GROUP_HOMOGENIZER" purchaseCost="60000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="PHE_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Plate Heat
Exchanger 01" parentFixedAssetId="GROUP_COOLING_UNIT" purchaseCost="55000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="PHE_02"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Plate Heat
Exchanger 02" parentFixedAssetId="GROUP_COOLING_UNIT" purchaseCost="55000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="MIXER_M1"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Mixer M1"
parentFixedAssetId="GROUP_MIXER" purchaseCost="45000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="INCUBATOR_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Incubator 01"
parentFixedAssetId="GROUP_INCUBATOR" purchaseCost="50000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="INCUBATOR_02"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Incubator 02"
parentFixedAssetId="GROUP_INCUBATOR" purchaseCost="50000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="PM_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Packaging Machine
PM1" parentFixedAssetId="GROUP_PACKAGING" purchaseCost="70000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="SW_01"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Shrink Wrapper SW1"
parentFixedAssetId="GROUP_SHRINKWRAP" purchaseCost="30000"
purchaseCostUomId="USD"/>
    <FixedAsset fixedAssetId="SW_02"
fixedAssetTypeId="PRODUCTION_EQUIPMENT" fixedAssetName="Shrink Wrapper SW2"
parentFixedAssetId="GROUP_SHRINKWRAP" purchaseCost="30000"
purchaseCostUomId="USD"/>

    <!-- PRODUCTS -->
    <Product productId="MILK_RAW" productTypeId="RAW_MATERIAL"
internalName="Raw Milk" productName="Raw Milk" isVirtual="N" isVariant="N"
billOfMaterialLevel="2"/>
    <Product productId="MILK_PAST" productTypeId="RAW_MATERIAL"
internalName="Pasteurised Milk" productName="Pasteurised Milk"
isVirtual="N" isVariant="N" billOfMaterialLevel="1"/>
    <Product productId="YOGHURT_VAN" productTypeId="FINISHED_GOOD"
internalName="Vanilla Yoghurt" productName="Vanilla Yoghurt" isVirtual="N"
isVariant="N" billOfMaterialLevel="0"/>

    <!-- BOM -->
    <ProductAssoc productId="MILK_PAST" productIdTo="MILK_RAW"
productAssocTypeId="MANUF_COMPONENT" fromDate="2025-06-01 00:00:00.000"
sequenceNum="10" quantity="1.000000"/>
    <ProductAssoc productId="YOGHURT_VAN" productIdTo="MILK_PAST"
productAssocTypeId="MANUF_COMPONENT" fromDate="2025-06-01 00:00:00.000"
sequenceNum="10" quantity="1.000000"/>

    <!-- ROUTINGS -->
    <WorkEffort workEffortId="ROUTING_PAST" workEffortTypeId="ROUTING"
currentStatusId="ROU_ACTIVE" workEffortName="Pasteurised Milk Routing"/>
    <WorkEffort workEffortId="ROUTING_YOGHURT" workEffortTypeId="ROUTING"
currentStatusId="ROU_ACTIVE" workEffortName="Yoghurt Routing"/>

    <!-- ROUTING TASKS -->
    <WorkEffort workEffortId="TASK_PASTEURIZE" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING"
fixedAssetId="GROUP_PASTEURISER" currentStatusId="ROU_ACTIVE"
workEffortName="Pasteurisation Task"/>
    <WorkEffort workEffortId="TASK_HOMOGENIZE" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING"
fixedAssetId="GROUP_HOMOGENIZER" currentStatusId="ROU_ACTIVE"
workEffortName="Homogenization Task"/>
    <WorkEffort workEffortId="TASK_COOLING" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING"
fixedAssetId="GROUP_COOLING_UNIT" currentStatusId="ROU_ACTIVE"
workEffortName="Cooling Task"/>
    <WorkEffort workEffortId="TASK_MIXING" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING" fixedAssetId="GROUP_MIXER"
currentStatusId="ROU_ACTIVE" workEffortName="Mixing Task"/>
    <WorkEffort workEffortId="TASK_INCUBATE" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING" fixedAssetId="GROUP_INCUBATOR"
currentStatusId="ROU_ACTIVE" workEffortName="Incubation Task"/>
    <WorkEffort workEffortId="TASK_PACK" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING" fixedAssetId="GROUP_PACKAGING"
currentStatusId="ROU_ACTIVE" workEffortName="Packaging Task"/>
    <WorkEffort workEffortId="TASK_WRAP" workEffortTypeId="ROU_TASK"
workEffortPurposeTypeId="ROU_MANUFACTURING" fixedAssetId="GROUP_SHRINKWRAP"
currentStatusId="ROU_ACTIVE" workEffortName="Shrink Wrapping Task"/>

    <!-- ROUTING ASSOCIATIONS -->
    <WorkEffortAssoc workEffortIdFrom="ROUTING_PAST"
workEffortIdTo="TASK_PASTEURIZE" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="10" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_PAST"
workEffortIdTo="TASK_HOMOGENIZE" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="20" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_PAST"
workEffortIdTo="TASK_COOLING" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="30" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_YOGHURT"
workEffortIdTo="TASK_MIXING" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="10" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_YOGHURT"
workEffortIdTo="TASK_INCUBATE" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="20" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_YOGHURT"
workEffortIdTo="TASK_PACK" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="30" fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortAssoc workEffortIdFrom="ROUTING_YOGHURT"
workEffortIdTo="TASK_WRAP" workEffortAssocTypeId="ROUTING_COMPONENT"
sequenceNum="40" fromDate="2025-06-01 00:00:00.000"/>

    <!-- LINK ROUTING TO PRODUCTS -->
    <WorkEffortGoodStandard workEffortId="ROUTING_PAST"
productId="MILK_PAST" workEffortGoodStdTypeId="ROU_PROD_TEMPLATE"
fromDate="2025-06-01 00:00:00.000"/>
    <WorkEffortGoodStandard workEffortId="ROUTING_YOGHURT"
productId="YOGHURT_VAN" workEffortGoodStdTypeId="ROU_PROD_TEMPLATE"
fromDate="2025-06-01 00:00:00.000"/>
</entity-engine-xml>


On Tue, Jun 24, 2025 at 8:37 AM S Munene <munenekam...@gmail.com> wrote:

> Please excuse my long post. For the sake of clarity i will use a specific
> use case.
> I have manufacturing setup which i have modelled as follows.
>  Primary raw material - Raw milk
> Output products
>         1. Pasteurised milk — sold as a product and also used in the
> manufacture of yoghurt.
>         2.  Yoghurt of various flavours and packing sizes
> Routing and routing tasks
>         PASTEURISED_MILK_ROUTING (raw milk is converted to pasteurised
> milk)
>                 Pasteurisation task — primary fixed asset
> Pasteuriser(PASTEURISER_01,PASTEURISER_02,PASTEURISER_03,PASTEURISER_04)
>                 Homogenization task — primary fixed asset
> Homogeniser(HOMOGENIZER_01,HOMOGENIZER_02,HOMOGENIZER_03)
>                 Cooling task  — primary fixed asset Plate Heat
> Exchanger(PHE1, PHE2)
>       YOGHURT_ROUTING(pasteurised milk is converted to yoghurt)
>                 Mixing task — primary fixed asset Mixer (M1)
>                 Incubation task — primary fixed asset
> Incubator(INCUBATOR01,INCUBATOR_02)
>                 Packaging task —  primary fixed asset Packaging
> Machine(PM1)
>                 Shrink wrapping task  —  primary fixed asset Shrink
> wrapper(SW1, SW2)
> Question
> 1. Does it mean i have to create fixed assets
> PASTEURISER_01,PASTEURISER_02
> ...HOMOGENIZER_01,HOMOGENIZER_02...INCUBATOR01,INCUBATOR_02.. SW1, SW2… and
> give them a fixedAssetTypeId=“GROUP_EQUIPMENT"
> 2. If i do that then when creating a task say SHRINK WRAPPING TASK then a
> totally unrelated fixed asset eg HOMOGENIZER_01 becomes available on the
> fixed asset drop down.
>  I feel that i am missing something fundamental in my modelling and my
> understanding of the manufacturing module.
> Kindly give directions.
>
> Regards
> Munene
>
>
>
>
> > On 23 Jun 2025, at 12:39, Yashwant Dhakad <
> yashwant.dha...@hotwaxsystems.com> wrote:
> >
> > Hi S. Munene,
> >
> > Thank you for your detailed questions and observations.
> >
> > Here’s a consolidated response based on OFBiz’s current data model and
> core
> > functionality:
> >
> > In the routing task screen, the fixedAssetId dropdown is restricted to
> > assets of type GROUP_EQUIPMENT. This design ensures the asset is suitable
> > for *production run scheduling*, where the associated calendar (linked
> via
> > calendarId) helps determine working capacity, holidays, and exception
> days.
> > This directly influences start and end date calculations during
> production
> > planning.
> >
> > When multiple assets of this type exist, the user typically selects a
> > representative or default asset that logically covers the scheduling
> > capacity for the task.
> >
> > OFBiz also supports *hierarchical grouping of fixed assets*, which
> provides
> > flexibility to model real-world equipment structures. For example:
> >
> > <FixedAsset fixedAssetId="DEMO_MACHINE_GROUP"
> > fixedAssetTypeId="GROUP_EQUIPMENT" fixedAssetName="Demo Machine
> > Group"/><FixedAsset fixedAssetId="DEMO_MACHINE" fixedAssetName="Demo
> > Machine" fixedAssetTypeId="PRODUCTION_EQUIPMENT"
> > parentFixedAssetId="DEMO_MACHINE_GROUP" calendarId="DEMO_CALENDAR"
> > purchaseCost="50000" purchaseCostUomId="USD"/>
> >
> > In this setup:
> >
> >   -
> >
> >   DEMO_MACHINE_GROUP is used in the routing task for scheduling and is
> >   tied to the calendar.
> >   -
> >
> >   DEMO_MACHINE is a production asset grouped under it and can include
> >   cost-related attributes such as purchase cost and depreciation.
> >
> > If your goal is to develop a *comprehensive costing model* that includes
> > raw materials, labor, and equipment usage, you may extend existing OFBiz
> > services accordingly.
> > Helpful References in OFBiz:
> >
> >   -
> >
> >   *Calendar and exception day logic* is handled in:
> >   TechDataServices.java
> >   -
> >
> >   *Product-level cost estimation* (including BOM and resources) can be
> >   reviewed via:
> >   CostService.groovy → calculateProductCosts
> >   -
> >
> >   *Task-level cost calculations* during production run creation can be
> >   reviewed in:
> >   ProductionRunServices.java → createProductionRunTaskCosts
> >
> > This data model and service architecture provide a strong foundation for
> > linking scheduling, resource grouping, and cost calculation within
> OFBiz’s
> > manufacturing module.
> >
> >
> > On Mon, Jun 23, 2025 at 1:04 PM S Munene <munenekam...@gmail.com> wrote:
> >
> >> When capturing routing task in the manufacturing module there is a
> >> dropdown for  fixedAssetId (only a single fixedAssetId can be captured).
> >> The contents of that dropdown is restricted to assets of
> fixedAssetTypeId
> >> GROUP_EQUIPMENT.
> >>
> >>
> >> 1. Why is that necessary to restrict to fixedAssetTypeId
> GROUP_EQUIPMENT
> >> and if there is more than one such fixedAsset which one should somebody
> >> pick?
> >> 2. How and where is the information on the fixedAssetId selected used
> >> within ofbiz? I have tried to search without success.
> >>
> >> 3. The same routing task form has a submenu fixed assets that allows
> >> capture of fixedAssetTypes (now without GROUP_EQUIPMENT restriction)
> >> involved in the routing task. Is this a repetition or do they serve
> >> different purposes? Do you still include GROUP_EQUIPMENT
> >>
> >> 4. I am trying to come up with a comprehensive configuration that would
> >> allow me to workout the true cost of producing a manufactured item that
> >> would take into consideration raw materials, fixed assets( depreciation
> and
> >> maintenance) used and labour. could i get a typical ’seed data’ and
> >> relevant ofbiz services.
> >>
> >>
> >> Kindly assist.
> >>
> >> Regards
> >> Kamanu
> >>
> >>
> >>
> >
> > --
> > Kind Regards,
> > Yashwant Dhakad
> >
> > HotWax Systems | www.hotwaxsystems.com
>
>

-- 
Kind Regards,
Yashwant Dhakad

HotWax Systems | www.hotwaxsystems.com

Reply via email to