[ 
https://issues.apache.org/jira/browse/OFBIZ-7356?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Swapnil Shah updated OFBIZ-7356:
--------------------------------
    Description: 
Here are high level design notes to based on the requirement specified under 
OFBIZ-7355 to support the product level replenishment from any inter-company 
facility before raising the ordering from an outside vendor.

* We could extend the MRP logic (MrpEvent,Requirenent) to honor these new types 
and create corresponding event & requirement for Stock transfer between 
facilities.
* Introduce two new entities ProductFacilityAssoc & FacilityAssocType and use 
them in conjunction with MrpEventType and corresponding RequirementType to 
serve the requirement for replenishing the store's via Inter-facility transfers 
mode.  The data model & UI could be extended as follows:

{code}
<!-- New Entity ProductFacilityAssoc (Product-wise associations between 
facilities to define from what all facilities a given product can be 
replenished)-->
<entity entity-name="ProductFacilityAssoc"
title="Define associations between Product facilities">
<field name="productId" type="id-ne"/>
<field name="facilityId" type="id-ne"/>
<field name="facilityIdTo" type="id-ne"/>
<field name="facilityAssocTypeId" type="id-ne"/>
<field name="fromDate" type="date-time"/>
<field name="thruDate" type="date-time"/>
<field name="sequenceNum" type="numeric"/> 
<prim-key field="productId"/>
<prim-key field="facilityId"/>
<prim-key field="facilityIdTo"/>
<prim-key field="facilityAssocTypeId"/>
<prim-key field="fromDate"/>

<relation type="one" fk-name="PRFACASSOC_PRO" rel-entity-name="Product">
<key-map field-name="productId"/>
</relation>
<relation type="one" fk-name="PRFACASSOC_FAC" title="From" 
rel-entity-name="Facility">
<key-map field-name="facilityId"/>
</relation>
<relation type="one" fk-name="PRFACASSOC_FACTO" title="To" 
rel-entity-name="Facility">
<key-map field-name="facilityIdTo" rel-field-name="facilityId"/>
</relation>
<relation type="one" fk-name="PRFACASSOC_TYPE" 
rel-entity-name="FacilityAssocType">
<key-map field-name="facilityAssocTypeId"/>
</relation>
</entity>

<!-- New Entity FacilityAssocType (type of associations between facilities)-->
<entity entity-name="FacilityAssocType"
title="Define associations between facilities">
<field name="FacilityAssocType" type="id-ne"/>
<field name="description" type="description"/>
<prim-key field="facilityAssocTypeId"/> 
</entity>

<!-- Extend Entity MrpEvent (for destination facility)-->
<entity entity-name="MrpEvent"
<field name="facilityIdTo" type="id-ne"/>
</entity>

<!-- Extend Entity Requirement (for destination facility)-->
<entity entity-name="Requirement"
<field name="facilityIdTo" type="id-ne"/>
</entity>

<!-- New FacilityAssocType (type of association between facilities)-->
<ProductFacilityAssocType productFacilityAssocTypeId="BACKUP_WAREHOUSE" 
description="Facility that serves another facility in terms of inventory"/>

<!-- New ProductFacilityAssoc (Association between facilities)-->
<ProductFacilityAssoc productId="GZ-8544" facilityId ="RegionalWarehouse_01" 
facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
sequenceNum="01" fromDate="2001-01-01 12:00:00"/>
<ProductFacilityAssoc productId="GZ-8544" facilityId ="RegionalWarehouse_02" 
facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
sequenceNum="02" fromDate="2001-01-01 12:00:00"/>
<ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
sequenceNum="03" fromDate="2001-01-01 12:00:00"/>
<ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
facilityIdTo="RegionalWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
sequenceNum="01" fromDate="2001-01-01 12:00:00"/>
<ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
facilityIdTo="RegionalWarehouse_02" facilityAssocTypeId="BACKUP_WAREHOUSE" 
sequenceNum="01" fromDate="2001-01-01 12:00:00"/>

<!-- New MRPEventType (apart from existing ones in Ofbiz)-->
<MrpEventType description="Initial ATP" mrpEventTypeId="INITIAL_ATP"/>
<MrpEventType description="Proposed stock transfer if ATP is less than minimum 
quantity" mrpEventTypeId="PROP_ATP_STOCK_TRANSFER"/>

<!-- New RequirementType (apart from existing ones in Ofbiz)-->
<RequirementType description="Inter-facility Transfer Requirement" 
requirementTypeId="TRANSFER_REQUIREMENT"/>

<!-- New Enumeration for Product Store Facility's requirementhMethodEnumId to 
be used to trigger inter-facility transfer -->
<Enumeration description="When ATP Reaches Minimum Stock for 
Product-Store-Facility" enumCode="XFER_STOCK_ATP" enumId="XFERRQM_STOCK_ATP" 
enumTypeId="PROD_REQ_METHOD"/>

<!-- Existing ProductStore for setting primary facility for each store -->
<ProductStore productStoreId="9100" inventoryFacilityId="StoreWarehouse_01" 
checkInventory="N" oneInventoryFacility="N" requireInventory="N" 
reserveInventory="Y" reserveOrderEnumId="INVRO_FIFO_REC" /> 

<!-- Extended ProductStoreFacility for setting RMEI)-->
<ProductStoreFacility productStoreId="9100" facilityId=="StoreWarehouse_01" 
requirementMethodEnumId="XFERRQM_STOCK_ATP" fromDate="2001-04-13 12:00:00"/>

<!-- Existing ProductFacility (with Minimum Stock and ATP) -->
<ProductFacility facilityId="StoreWarehouse_01" lastInventoryCount="20.000000" 
minimumStock="100.000000" productId="GZ-8544"/>
<ProductFacility facilityId="RegionalWarehouse_01" 
lastInventoryCount="40.000000" minimumStock="200.000000" productId="GZ-8544"/>
<ProductFacility facilityId="RegionalWarehouse_02" 
lastInventoryCount="60.000000" minimumStock="200.000000" productId="GZ-8544"/>
<ProductFacility facilityId="CentralWarehouse" lastInventoryCount="200.000000" 
minimumStock="300.000000" productId="GZ-8544"/>
{code}

MRP engine would start creating event beginning with store's primary facility 
based on set RMEI under ProductStoreFacility e.g, XFERRQM_STOCK_ATP for 
StoreWarehouse_01, In other words if MinStock < ATP , then MRP algorithm would: 
# Look up and consume the respective ATP from all the eligible "facilityIdTo" 
(based on ProductFacilityAssoc), from where given product is transferable. 
Based on their priorities start allocating ATP unless it meet the 
(MinStock-ATP) requirement for a given store e.g., 'StoreWarehouse_01' .
# Create new MRP Event with Event type "PROP_ATP_STOCK_TRANSFER" with Proposed 
Quantity = MINIMUM STOCK - ATP from the facility (with highest priority 
i.e.,RegionalWarehouse_01) to the destination facility.
## If demand for (MinStock-ATP) is still not fully met by any facility with 
higher priority then repeat step#1 for all the associated facilities in 
descending order of priority unless ATP from all eligible facilities is 
exhausted.
# Based on above MRP Event Type and proposed quantity, In turn create the new 
Requirement with type TRANSFER_REQUIREMENT between originating and destination 
facility.
# Over Requirement screen (UI) we can provide the "Transfer" button against all 
the requirement with type TRANSFER_REQUIREMENT
# On hitting the "Transfer" button, The new 'Stock Transfer' requests could be 
created for a product between eligible facilities based on above step. 
# The created Stock Transfer request can be completed by shipping and receiving 
given product from originating facility and destination facility respectively.


  was:Let's use this ticket to post the concluded design notes to support the 
product level replenishment from any inter-company facility before raising the 
ordering from an outside vendor.


> OFBIZ-6964: Document finalized design to support replenishment planning 
> through any inter-company facility
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: OFBIZ-7356
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-7356
>             Project: OFBiz
>          Issue Type: Sub-task
>          Components: manufacturing, order, product
>            Reporter: Swapnil Shah
>            Assignee: Swapnil Shah
>             Fix For: 15.12.01
>
>
> Here are high level design notes to based on the requirement specified under 
> OFBIZ-7355 to support the product level replenishment from any inter-company 
> facility before raising the ordering from an outside vendor.
> * We could extend the MRP logic (MrpEvent,Requirenent) to honor these new 
> types and create corresponding event & requirement for Stock transfer between 
> facilities.
> * Introduce two new entities ProductFacilityAssoc & FacilityAssocType and use 
> them in conjunction with MrpEventType and corresponding RequirementType to 
> serve the requirement for replenishing the store's via Inter-facility 
> transfers mode.  The data model & UI could be extended as follows:
> {code}
> <!-- New Entity ProductFacilityAssoc (Product-wise associations between 
> facilities to define from what all facilities a given product can be 
> replenished)-->
> <entity entity-name="ProductFacilityAssoc"
> title="Define associations between Product facilities">
> <field name="productId" type="id-ne"/>
> <field name="facilityId" type="id-ne"/>
> <field name="facilityIdTo" type="id-ne"/>
> <field name="facilityAssocTypeId" type="id-ne"/>
> <field name="fromDate" type="date-time"/>
> <field name="thruDate" type="date-time"/>
> <field name="sequenceNum" type="numeric"/> 
> <prim-key field="productId"/>
> <prim-key field="facilityId"/>
> <prim-key field="facilityIdTo"/>
> <prim-key field="facilityAssocTypeId"/>
> <prim-key field="fromDate"/>
> <relation type="one" fk-name="PRFACASSOC_PRO" rel-entity-name="Product">
> <key-map field-name="productId"/>
> </relation>
> <relation type="one" fk-name="PRFACASSOC_FAC" title="From" 
> rel-entity-name="Facility">
> <key-map field-name="facilityId"/>
> </relation>
> <relation type="one" fk-name="PRFACASSOC_FACTO" title="To" 
> rel-entity-name="Facility">
> <key-map field-name="facilityIdTo" rel-field-name="facilityId"/>
> </relation>
> <relation type="one" fk-name="PRFACASSOC_TYPE" 
> rel-entity-name="FacilityAssocType">
> <key-map field-name="facilityAssocTypeId"/>
> </relation>
> </entity>
> <!-- New Entity FacilityAssocType (type of associations between facilities)-->
> <entity entity-name="FacilityAssocType"
> title="Define associations between facilities">
> <field name="FacilityAssocType" type="id-ne"/>
> <field name="description" type="description"/>
> <prim-key field="facilityAssocTypeId"/> 
> </entity>
> <!-- Extend Entity MrpEvent (for destination facility)-->
> <entity entity-name="MrpEvent"
> <field name="facilityIdTo" type="id-ne"/>
> </entity>
> <!-- Extend Entity Requirement (for destination facility)-->
> <entity entity-name="Requirement"
> <field name="facilityIdTo" type="id-ne"/>
> </entity>
> <!-- New FacilityAssocType (type of association between facilities)-->
> <ProductFacilityAssocType productFacilityAssocTypeId="BACKUP_WAREHOUSE" 
> description="Facility that serves another facility in terms of inventory"/>
> <!-- New ProductFacilityAssoc (Association between facilities)-->
> <ProductFacilityAssoc productId="GZ-8544" facilityId ="RegionalWarehouse_01" 
> facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
> sequenceNum="01" fromDate="2001-01-01 12:00:00"/>
> <ProductFacilityAssoc productId="GZ-8544" facilityId ="RegionalWarehouse_02" 
> facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
> sequenceNum="02" fromDate="2001-01-01 12:00:00"/>
> <ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
> facilityIdTo="StoreWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
> sequenceNum="03" fromDate="2001-01-01 12:00:00"/>
> <ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
> facilityIdTo="RegionalWarehouse_01" facilityAssocTypeId="BACKUP_WAREHOUSE" 
> sequenceNum="01" fromDate="2001-01-01 12:00:00"/>
> <ProductFacilityAssoc productId="GZ-8544" facilityId ="CentralWarehouse" 
> facilityIdTo="RegionalWarehouse_02" facilityAssocTypeId="BACKUP_WAREHOUSE" 
> sequenceNum="01" fromDate="2001-01-01 12:00:00"/>
> <!-- New MRPEventType (apart from existing ones in Ofbiz)-->
> <MrpEventType description="Initial ATP" mrpEventTypeId="INITIAL_ATP"/>
> <MrpEventType description="Proposed stock transfer if ATP is less than 
> minimum quantity" mrpEventTypeId="PROP_ATP_STOCK_TRANSFER"/>
> <!-- New RequirementType (apart from existing ones in Ofbiz)-->
> <RequirementType description="Inter-facility Transfer Requirement" 
> requirementTypeId="TRANSFER_REQUIREMENT"/>
> <!-- New Enumeration for Product Store Facility's requirementhMethodEnumId to 
> be used to trigger inter-facility transfer -->
> <Enumeration description="When ATP Reaches Minimum Stock for 
> Product-Store-Facility" enumCode="XFER_STOCK_ATP" enumId="XFERRQM_STOCK_ATP" 
> enumTypeId="PROD_REQ_METHOD"/>
> <!-- Existing ProductStore for setting primary facility for each store -->
> <ProductStore productStoreId="9100" inventoryFacilityId="StoreWarehouse_01" 
> checkInventory="N" oneInventoryFacility="N" requireInventory="N" 
> reserveInventory="Y" reserveOrderEnumId="INVRO_FIFO_REC" /> 
> <!-- Extended ProductStoreFacility for setting RMEI)-->
> <ProductStoreFacility productStoreId="9100" facilityId=="StoreWarehouse_01" 
> requirementMethodEnumId="XFERRQM_STOCK_ATP" fromDate="2001-04-13 12:00:00"/>
> <!-- Existing ProductFacility (with Minimum Stock and ATP) -->
> <ProductFacility facilityId="StoreWarehouse_01" 
> lastInventoryCount="20.000000" minimumStock="100.000000" productId="GZ-8544"/>
> <ProductFacility facilityId="RegionalWarehouse_01" 
> lastInventoryCount="40.000000" minimumStock="200.000000" productId="GZ-8544"/>
> <ProductFacility facilityId="RegionalWarehouse_02" 
> lastInventoryCount="60.000000" minimumStock="200.000000" productId="GZ-8544"/>
> <ProductFacility facilityId="CentralWarehouse" 
> lastInventoryCount="200.000000" minimumStock="300.000000" 
> productId="GZ-8544"/>
> {code}
> MRP engine would start creating event beginning with store's primary facility 
> based on set RMEI under ProductStoreFacility e.g, XFERRQM_STOCK_ATP for 
> StoreWarehouse_01, In other words if MinStock < ATP , then MRP algorithm 
> would: 
> # Look up and consume the respective ATP from all the eligible "facilityIdTo" 
> (based on ProductFacilityAssoc), from where given product is transferable. 
> Based on their priorities start allocating ATP unless it meet the 
> (MinStock-ATP) requirement for a given store e.g., 'StoreWarehouse_01' .
> # Create new MRP Event with Event type "PROP_ATP_STOCK_TRANSFER" with 
> Proposed Quantity = MINIMUM STOCK - ATP from the facility (with highest 
> priority i.e.,RegionalWarehouse_01) to the destination facility.
> ## If demand for (MinStock-ATP) is still not fully met by any facility with 
> higher priority then repeat step#1 for all the associated facilities in 
> descending order of priority unless ATP from all eligible facilities is 
> exhausted.
> # Based on above MRP Event Type and proposed quantity, In turn create the new 
> Requirement with type TRANSFER_REQUIREMENT between originating and 
> destination facility.
> # Over Requirement screen (UI) we can provide the "Transfer" button against 
> all the requirement with type TRANSFER_REQUIREMENT
> # On hitting the "Transfer" button, The new 'Stock Transfer' requests could 
> be created for a product between eligible facilities based on above step. 
> # The created Stock Transfer request can be completed by shipping and 
> receiving given product from originating facility and destination facility 
> respectively.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to