From 7a8fd5ab0aad4a41a8898b7084b1bceb9a2a8a51 Mon Sep 17 00:00:00 2001
From: renhao <renhui.hao@capgemini.com>
Date: 星期二, 24 十月 2023 16:07:29 +0800
Subject: [PATCH] Merge branch 'dev'

---
 _Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl                                                  |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Response_pnlActions_btnOk_OnClick.def                            |   11 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl                                                             |   28 +
 _Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl                                |    9 
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl                           |   14 
 _Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl                                                    |    9 
 _Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl                                                            |   17 
 _Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl                                                                  |    5 
 _Main/BL/Type_MacroPlan/StaticMethod_DoASync.qbl                                                                              |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def                                          |   16 
 _Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl |   14 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl                                                                 |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def                                          |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def                                          |   24 +
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def                                          |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def                                          |   16 
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl                           |   23 +
 _Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def                                       |    2 
 _Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl                                        |    9 
 _Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl                                                             |   13 
 _Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl                           |   23 +
 _Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl                                                        |   13 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl                                                           |   33 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl                  |   14 
 _Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl           |   14 
 _Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl                                                        |   17 
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl                           |   23 +
 _Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl                           |   23 +
 _Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Method_DataDistribution.def                                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def                    |   20 +
 _Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl                                    |    9 
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def                                 |   66 +++
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl                           |   23 +
 _Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl                                                        |    7 
 _Main/BL/Type_MacroPlan/StaticMethod_DoASync#253.qbl                                                                          |   46 -
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl                                                                  |    7 
 _Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_DataHolderAllScenario_OnDataChanged.def  |   33 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl                    |   14 
 _Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl                                                                  |   17 
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl                            |   14 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                     |   26 +
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl                           |   23 +
 _Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl                                                          |    7 
 _Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl                           |   23 +
 _Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl                                                            |    7 
 _Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl                           |   23 +
 _Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl                                                               |   13 
 _Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl               |   14 
 /dev/null                                                                                                                     |   23 -
 _Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Component_pnlContent.def                                         |   39 +
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl                                                    |   11 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl                                                            |   11 
 _Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl                           |   23 +
 _Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl                      |   14 
 _Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl                                                          |   18 
 _Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl                                                                 |   18 
 _Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl                           |   23 +
 _Main/UI/MacroPlannerWebApp/Views/接口测试.vw                                                                                     |    4 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl                                                                |    7 
 _Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl                   |   14 
 66 files changed, 1,025 insertions(+), 104 deletions(-)

diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl
new file mode 100644
index 0000000..6828008
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_GlobalOTDTable_GlobalOTDTable_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612437]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.220612439][414702.1.220612438][414702.1.220612440]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612442][414702.1.220612441][414702.1.220612443]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl
new file mode 100644
index 0000000..d5b1a83
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingInventorySupply_Global.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_Global_MappingInventorySupply_Global_MappingInventorySupply_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612411]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingInventorySupply
+  {
+    #keys: '3[414702.1.220612413][414702.1.220612412][414702.1.220612414]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612416][414702.1.220612415][414702.1.220612417]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingInventorySupply
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl
new file mode 100644
index 0000000..76a7147
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_Mapp.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_InventorySupplyCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612424]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.220612426][414702.1.220612425][414702.1.220612427]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_InventorySupplyCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_InventorySupplyCategory
+  {
+    #keys: '3[414702.1.220612429][414702.1.220612428][414702.1.220612430]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl
new file mode 100644
index 0000000..783e09e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISP.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_GlobalOTDTable_GlobalOTDTable_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768030]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.226768032][414702.1.226768031][414702.1.226768033]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768035][414702.1.226768034][414702.1.226768036]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl
new file mode 100644
index 0000000..3952c31
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointI.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_Global_MappingActualProductInStockingPointInPeriod_Global_MappingActualProductInStockingPointInPeriod_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768004]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingActualProductInStockingPointInPeriod
+  {
+    #keys: '3[414702.1.226768006][414702.1.226768005][414702.1.226768007]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768009][414702.1.226768008][414702.1.226768010]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingActualProductInStockingPointInPeriod
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl
new file mode 100644
index 0000000..408356c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProd.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MAPISPIPCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768017]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.226768019][414702.1.226768018][414702.1.226768020]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_MAPISPIPCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MAPISPIPCategory
+  {
+    #keys: '3[414702.1.226768022][414702.1.226768021][414702.1.226768023]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl b/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl
new file mode 100644
index 0000000..b35e9f5
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_Product.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductCategory_GlobalOTDTable_GlobalOTDTable_Global_ProductCategory
+{
+  #keys: '1[414702.1.222746446]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.222746448][414702.1.222746447][414702.1.222746449]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ProductCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductCategory
+  {
+    #keys: '3[414702.1.222746451][414702.1.222746450][414702.1.222746452]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl b/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl
new file mode 100644
index 0000000..0be0b32
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProdu.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_ProductCategory
+{
+  #keys: '1[414702.1.222746433]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.222746435][414702.1.222746434][414702.1.222746436]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductCategory
+  {
+    #keys: '3[414702.1.222746438][414702.1.222746437][414702.1.222746439]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl
new file mode 100644
index 0000000..399cbfd
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_P.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_GlobalOTDTable_GlobalOTDTable_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556276]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.220556278][414702.1.220556277][414702.1.220556279]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556281][414702.1.220556280][414702.1.220556282]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl
new file mode 100644
index 0000000..f827bdb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProductInLane_Global_Map.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_Global_MappingProductInLane_Global_MappingProductInLane_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556250]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProductInLane
+  {
+    #keys: '3[414702.1.220556252][414702.1.220556251][414702.1.220556253]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556255][414702.1.220556254][414702.1.220556256]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProductInLane
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl
new file mode 100644
index 0000000..bff781f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ProductInLineCategory_Global_MappingProduct_MP_Global_Mappin.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ProductInLineCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556263]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.220556265][414702.1.220556264][414702.1.220556266]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ProductInLineCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ProductInLineCategory
+  {
+    #keys: '3[414702.1.220556268][414702.1.220556267][414702.1.220556269]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl
new file mode 100644
index 0000000..5f4ae65
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Glob.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_GlobalOTDTable_GlobalOTDTable_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718240]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.1.224718242][414702.1.224718241][414702.1.224718243]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718245][414702.1.224718244][414702.1.224718246]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl
new file mode 100644
index 0000000..9a77d29
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_Ma.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_Global_MappingProduct_MP_Global_MappingProduct_MP_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718214]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingProduct_MP
+  {
+    #keys: '3[414702.1.224718216][414702.1.224718215][414702.1.224718217]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718219][414702.1.224718218][414702.1.224718220]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingProduct_MP
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl
new file mode 100644
index 0000000..207890c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_StockingPointCostCategory_Global_MappingStockingPointCost_Gl.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_StockingPointCostCategory_Global_MappingStockingPointCost_Global_MappingStockingPointCost_Global_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718227]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_MappingStockingPointCost
+  {
+    #keys: '3[414702.1.224718229][414702.1.224718228][414702.1.224718230]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_StockingPointCostCategory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_StockingPointCostCategory
+  {
+    #keys: '3[414702.1.224718232][414702.1.224718231][414702.1.224718233]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingStockingPointCost
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl
new file mode 100644
index 0000000..0ee01a8
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_IsCommon.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsCommon
+{
+  #keys: '3[414702.1.228025354][414702.1.228025353][414702.1.228025355]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..8ed3bfe
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.220612402][414702.1.220612401][414702.1.220612403]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl
new file mode 100644
index 0000000..3f5b37c
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/Function_CalcIsCommon.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsCommon
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).IsCommon(), false );
+    
+    this.IsCommon( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..da22117
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/StaticMethod_Create.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_InventorySupplyCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingInventorySupply, 
+                                      tempGMIS, true, tempGMIS.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_InventorySupplyCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..9acdd56
--- /dev/null
+++ b/_Main/BL/Type_Global_InventorySupplyCategory/_ROOT_Type_Global_InventorySupplyCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_InventorySupplyCategory
+{
+  #keys: '5[414702.1.220612398][414702.1.220612396][0.0.0][414702.1.220612397][414702.1.220612399]'
+  BaseType: Object
+  StructuredName: 'Global_InventorySupplyCategorys'
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl
new file mode 100644
index 0000000..037726d
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_IsCommon.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsCommon
+{
+  #keys: '3[414702.1.226768068][414702.1.226768067][414702.1.226768069]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl
new file mode 100644
index 0000000..6d30cca
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_KeyProduct.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute KeyProduct
+{
+  #keys: '3[414702.1.226768051][414702.1.226768050][414702.1.226768052]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..694b52b
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.226767995][414702.1.226767994][414702.1.226767996]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl
new file mode 100644
index 0000000..3f5b37c
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcIsCommon.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsCommon
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).IsCommon(), false );
+    
+    this.IsCommon( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl
new file mode 100644
index 0000000..1e84bcc
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcKeyProduct.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcKeyProduct
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).KeyProduct(), false );
+    
+    this.KeyProduct( value );
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..2134324
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/StaticMethod_Create.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MAPISPIPCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingActualProductInStockingPointInPeriod, 
+                                      tempGMAPISPIP, true, tempGMAPISPIP.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_MAPISPIPCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..a8193a5
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/_ROOT_Type_Global_MAPISPIPCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_MAPISPIPCategory
+{
+  #keys: '5[414702.1.226767991][414702.1.226767989][0.0.0][414702.1.226767990][414702.1.226767992]'
+  BaseType: Object
+  StructuredName: 'Global_MAPISPIPCategorys'
+}
diff --git a/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..c5cc65f
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_MAPISPIPCategory
+{
+  #keys: '1[414702.1.226768045]'
+  Expression:
+  [*
+    targetGlobal_MAPISPIPCategory := select( this.GlobalOTDTable(), Global_MAPISPIPCategory, tempGMAPISPIPC,
+                                             tempGMAPISPIPC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_MAPISPIPCategory;
+  *]
+  Relation: Global_MAPISPIPCategory
+}
diff --git a/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..3756789
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingInventorySupply/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612460]'
+  Expression:
+  [*
+    targetGlobal_InventorySupplyCategory := select( this.GlobalOTDTable(), Global_InventorySupplyCategory, tempGISC,
+                                                    tempGISC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_InventorySupplyCategory;
+  *]
+  Relation: Global_InventorySupplyCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl b/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
new file mode 100644
index 0000000..e3c341b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProductInLane/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductInLineCategory
+{
+  #keys: '1[414702.1.224718199]'
+  Expression:
+  [*
+    targeGlobal_ProductInLineCategory := select( this.GlobalOTDTable(), Global_ProductInLineCategory, tempGPILC,
+                                                 tempGPILC.ProductID() = this.ProductID() );
+    
+    return targeGlobal_ProductInLineCategory;
+  *]
+  Relation: Global_ProductInLineCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
new file mode 100644
index 0000000..3abbab2
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_InventorySupplyCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_InventorySupplyCategory
+{
+  #keys: '1[414702.1.220612452]'
+  Expression:
+  [*
+    targetGlobal_InventorySupplyCategory := select( this.GlobalOTDTable(), Global_InventorySupplyCategory, tempGISC,
+                                                   tempGISC.ProductID() = this.ID() );
+    
+    return targetGlobal_InventorySupplyCategory;
+  *]
+  Relation: Global_InventorySupplyCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
new file mode 100644
index 0000000..163005b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_MAPISPIPCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_MAPISPIPCategory
+{
+  #keys: '1[414702.1.220556366]'
+  Expression:
+  [*
+    targetGlobal_MAPISPIPCategory := select( this.GlobalOTDTable(), Global_MAPISPIPCategory, tempGMAPISPIPC,
+                                             tempGMAPISPIPC.ProductID() = this.ID() );
+    
+    return targetGlobal_MAPISPIPCategory;
+  *]
+  Relation: Global_MAPISPIPCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl
new file mode 100644
index 0000000..435f27d
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductCategory
+{
+  #keys: '1[414702.1.223351035]'
+  Expression:
+  [*
+    targetGlobal_ProductCategory := select( this.GlobalOTDTable(), Global_ProductCategory, tempGPC,
+                                            tempGPC.BusinessTypeName() = this.BusinessType() );
+    
+    return targetGlobal_ProductCategory;
+  *]
+  Relation: Global_ProductCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
new file mode 100644
index 0000000..1b1d556
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_ProductInLineCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_ProductInLineCategory
+{
+  #keys: '1[414702.1.220556292]'
+  Expression:
+  [*
+    targetGlobal_ProductInLineCategory := select( this.GlobalOTDTable(), Global_ProductInLineCategory, tempGPILC,
+                                                  tempGPILC.ProductID() = this.ID() );
+    
+    return targetGlobal_ProductInLineCategory;
+  *]
+  Relation: Global_ProductInLineCategory
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..de4cbd5
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718256]'
+  Expression:
+  [*
+    targetGlobal_StockingPointCostCategory := select( this.GlobalOTDTable(), Global_StockingPointCostCategory, tempGSPCC,
+                                                      tempGSPCC.ProductID() = this.ID() );
+    
+    return targetGlobal_StockingPointCostCategory;
+  *]
+  Relation: Global_StockingPointCostCategory
+}
diff --git a/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..09e4ac2
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingStockingPointCost/DeclarativeReferenceRelation_CalcGlobal_StockingPointCostCategory.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcGlobal_StockingPointCostCategory
+{
+  #keys: '1[414702.1.224718261]'
+  Expression:
+  [*
+    targetGlobal_StockingPointCostCategory := select( this.GlobalOTDTable(), Global_StockingPointCostCategory, tempGSPCC,
+                                                      tempGSPCC.ProductID() = this.ProductID() );
+    
+    return targetGlobal_StockingPointCostCategory;
+  *]
+  Relation: Global_StockingPointCostCategory
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl b/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl
new file mode 100644
index 0000000..e7db0cb
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/Attribute_BusinessTypeName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BusinessTypeName
+{
+  #keys: '3[414702.1.223351026][414702.1.223351025][414702.1.223351027]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..22faab2
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_ProductCategory( relflush );
+    
+    businessTypes := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, tempGMPMP, true, tempGMPMP.BusinessType() );
+    
+    traverse ( businessTypes, Elements, bt ) {
+      globalOTDTable.Global_ProductCategory( relnew, BusinessTypeName := bt );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl b/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl
new file mode 100644
index 0000000..1e27352
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductCategory/_ROOT_Type_Global_ProductCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ProductCategory
+{
+  #keys: '5[414702.1.222746430][414702.1.222746428][0.0.0][414702.1.222746429][414702.1.222746431]'
+  BaseType: Object
+  StructuredName: 'Global_ProductCategorys'
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..4611fa8
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.220556241][414702.1.220556240][414702.1.220556242]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..57d8a51
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_ProductInLineCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingProductInLane, tempGMPIL, true, tempGMPIL.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_ProductInLineCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl b/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl
new file mode 100644
index 0000000..0f700ee
--- /dev/null
+++ b/_Main/BL/Type_Global_ProductInLineCategory/_ROOT_Type_Global_ProductInLineCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ProductInLineCategory
+{
+  #keys: '5[414702.1.220556230][414702.1.220556228][0.0.0][414702.1.220556229][414702.1.220556231]'
+  BaseType: Object
+  StructuredName: 'Global_ProductInLineCategorys'
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl
new file mode 100644
index 0000000..27e2084
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.1.224718205][414702.1.224718204][414702.1.224718206]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl
new file mode 100644
index 0000000..5d5ba37
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_StockingPointCostCategory( relflush );
+    
+    productIDs := selectuniquevalues( globalOTDTable, Global_MappingStockingPointCost, tempGMSPC, true, tempGMSPC.ProductID() );
+    
+    traverse ( productIDs, Elements, id ) {
+      globalOTDTable.Global_StockingPointCostCategory( relnew, ProductID := id );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl b/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl
new file mode 100644
index 0000000..eec0dca
--- /dev/null
+++ b/_Main/BL/Type_Global_StockingPointCostCategory/_ROOT_Type_Global_StockingPointCostCategory.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_StockingPointCostCategory
+{
+  #keys: '5[414702.1.220556235][414702.1.220556233][0.0.0][414702.1.220556234][414702.1.220556236]'
+  BaseType: Object
+  StructuredName: 'Global_StockingPointCostCategorys'
+}
diff --git a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
index 076964d..391ecf9 100644
--- a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
+++ b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 StaticMethod DoASync (
   MacroPlan macroPlan,
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   TextBody:
@@ -11,6 +12,6 @@
     //info( "ActualPISPIP Finished, Start InventoryCost Data Broker" );
     //macroPlan.Broker_OTD_InventoryCost().Execute();
     info( "InventoryCost Data Broker Finished, Start InventoryCost Mapping" );
-    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable);
+    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable,businessTypeName);
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
index f9c40e7..d2f5724 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
@@ -10,11 +10,21 @@
   TextBody:
   [*
     // renhao Aug-14-2023 (created)
-    listtodeal := selectset( globalOTDTable,
-                             Global_MappingActualProductInStockingPointInPeriod,
-                             actual,
-                             ( actual.ActualInventoryLevelEnd() > 0 ) and 
-                             ( organcodelist.Find( actual.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    listtodeal := construct( Global_MappingActualProductInStockingPointInPeriods, constcontent );
+    if ( businessTypes.Size() > 0 ) {
+      businessTypeName := businessTypes.Element( 0 );
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_MAPISPIPCategory.Global_MappingActualProductInStockingPointInPeriod, 
+                               tempGMPIL, 
+                               ( tempGMPIL.ActualInventoryLevelEnd() > 0 ) and 
+                               ( organcodelist.Find( tempGMPIL.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    } else {  
+      listtodeal := selectset( globalOTDTable,
+                               Global_MappingActualProductInStockingPointInPeriod,
+                               actual,
+                               ( actual.ActualInventoryLevelEnd() > 0 ) and 
+                               ( organcodelist.Find( actual.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    }
     totalcount := listtodeal.Size();
     info( "ActualPISPIP has " + totalcount.AsQUILL() + " rows in total" );
     
@@ -24,13 +34,13 @@
       if( count - [Number](count/1000) * 1000 = 0 or count = totalcount ){
         info( "Now is dealing with the " + count.AsQUILL() + "ActualPISPIP " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
         }
-      product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
-      if( not isnull( product)){
+      //product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
+      if( /*not isnull( product*/ guard( actual.Global_MAPISPIPCategory().KeyProduct() = nuclear, false ) ){
       if( not isnull(businessTypes)){
       
         for( i :=0 ;i < businessTypes.Size();i++ ){
-          businessType := businessTypes.Element( i );
-          if( product.BusinessType() = businessType and not product.IsCommon()){
+          //businessType := businessTypes.Element( i );
+          if( /*product.BusinessType() = businessType and not product.IsCommon()*/ not actual.Global_MAPISPIPCategory().IsCommon() ){
             ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
                                                                   actual.ProductID(),
                                                                   actual.StockingPointID(),
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
index e8950bc..6596139 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
@@ -12,12 +12,25 @@
     // renhao Aug-14-2023 (created)
     queryStartDate := guard( min( this, Period_MP, item, true, item.StartDate() ) - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
     queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
-    listtodeal := selectset( globalOTDTable,
-                             Global_MappingInventorySupply,
-                             externalSupply, 
-                             ( externalSupply.UserQuantity()>0 ) and 
-                             ( externalSupply.Date() >= queryStartDate ) and 
-                             ( organcodelist.Find( externalSupply.StockingPointID().SubString( 0, 3 ) ) >= 0 )/*and externalSupply.Date() <= queryEndDate*/);
+    
+    listtodeal := construct( Global_MappingInventorySupplys, constcontent );
+    if ( businessTypes.Size() > 0 ) {
+      businessTypeName := businessTypes.Element( 0 );
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_InventorySupplyCategory.Global_MappingInventorySupply, 
+                               tempGMIS, 
+                               ( tempGMIS.UserQuantity()>0 ) and 
+                               ( tempGMIS.Date() >= queryStartDate ) and 
+                               ( organcodelist.Find( tempGMIS.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
+    } else {
+      listtodeal := selectset( globalOTDTable,
+                               Global_MappingInventorySupply,
+                               externalSupply, 
+                               ( externalSupply.UserQuantity()>0 ) and 
+                               ( externalSupply.Date() >= queryStartDate ) and 
+                               ( organcodelist.Find( externalSupply.StockingPointID().SubString( 0, 3 ) ) >= 0 )/*and externalSupply.Date() <= queryEndDate*/);
+    }
+    
     totalcount := listtodeal.Size();
     description := "鍦ㄩ�斿湪鍒�";
     info( "ExternalSupply has " + totalcount.AsQUILL() + " rows in total" );
@@ -28,18 +41,18 @@
       if( count - [Number](count/1000) * 1000 = 0 or count = totalcount ){
         info( "Now is dealing with the " + count.AsQUILL() + "ExternalSupply " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
        }
-      product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = externalSupply.ProductID(),true);
+      //product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = externalSupply.ProductID(),true);
       
       
-      if( not isnull( product)){
+      if( /*not isnull( product)*/ not isnull( externalSupply.Global_InventorySupplyCategory() ) ){
         productMP :=  Product_MP :: FindProductTypeIndex( externalSupply.ProductID());
         stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
         if( not isnull( stockingpoint) and not isnull( productMP)){
         if( not isnull(businessTypes)){
         
           for( i :=0 ;i < businessTypes.Size();i++ ){
-            businessType := businessTypes.Element( i );
-            if( product.BusinessType() = businessType and not product.IsCommon()){
+            //businessType := businessTypes.Element( i );
+            if( /*product.BusinessType() = businessType and not product.IsCommon()*/ not externalSupply.Global_InventorySupplyCategory().IsCommon() ){
               InventorySupply::CreateOrUpdate( externalSupply.ID(),
                                                productMP,
                                                stockingpoint,
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
index b0e0349..78b1f55 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
@@ -1,13 +1,20 @@
 Quintiq file version 2.0
 #parent: #root
 Method DoASyncMappingInventoryValueAndCostData (
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   TextBody:
   [*
     // yypsybs Aug-15-2023 (created)
-    listtodeal := selectset( globalOTDTable,Global_MappingStockingPointCost,item,true );
+    listtodeal := construct( Global_MappingStockingPointCosts, constcontent );
+    if ( businessTypeName = "" ) {
+      listtodeal := selectset( globalOTDTable,Global_MappingStockingPointCost,item,true );
+    } else {
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_StockingPointCostCategory.Global_MappingStockingPointCost, tempGMPIL, true );
+    }
     totalcount := listtodeal.Size();
     
     info( "InventoryCost has " + totalcount.AsQUILL() + " rows in total" );
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
index a0521a8..38a7a8b 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
@@ -1,7 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
 Method DoASyncMappingProductInLaneData (
-  const GlobalOTDTable globalOTDTable
+  const GlobalOTDTable globalOTDTable,
+  String businessTypeName
 )
 {
   Description: 'Get Product In Line data'
@@ -9,7 +10,13 @@
   [*
     // Administrator Aug-17-2023 (created)
     // list to deal
-    listtodeal := selectset( globalOTDTable, Global_MappingProductInLane, item ,true );
+    listtodeal := construct( Global_MappingProductInLanes, constcontent );
+    if ( businessTypeName = "" ) {
+      listtodeal := selectset( globalOTDTable, Global_MappingProductInLane, item ,true );
+    } else {
+      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
+      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_ProductInLineCategory.Global_MappingProductInLane, tempGMPIL, true );
+    }
     totalcount := listtodeal.Size();
     info( "ProductInLane has " + totalcount.AsQUILL() + " rows in total" );
     
diff --git "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl" "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
index 8e5e156..0f6ac65 100644
--- "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
+++ "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
@@ -2,11 +2,11 @@
 #parent: #root
 StaticMethod DoASync (
   MacroPlan macroPlan,
-  Strings businessTypes,
+  const BusinessType businessType,
   Boolean isKeyProduct,
   Boolean createPurchaseSupplyMaterial,
   const GlobalOTDTable globalOTDTable
-)
+) as stream[MacroPlan]
 {
   Description: '鍗曟鍚屾'
   TextBody:
@@ -16,20 +16,8 @@
     //Currency_MP::CreateCurrencyFromJson( macroPlan, jsonDataRow );
     info( "Prepare to do sync" )
     info( "Get organ code list" )
-    organcodelist := selectvalues( globalOTDTable, Global_MappingOperationBOM, bom,true, bom.OrganCode() );
-    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
-        traverse( businessTypes, Elements, item ) {
-            info( "Business type : " + item )  
-        }
-        organcodelist := selectvalues( globalOTDTable, BusinessType.OrganCode, organ, businessTypes.Find( organ.BusinessType().BusinessTypeName() ) <> -1, organ.OrganCodeName() );
-    }
-    else{
-      if( businessTypes.Size() = 0 ){
-        if( not isnull( selectset( globalOTDTable, BusinessType, b, b.BusinessTypeName() = "" ) ) ){
-          organcodelist := selectvalues( globalOTDTable, BusinessType.OrganCode, organ, organ.BusinessType().BusinessTypeName() = "", organ.OrganCodeName() );
-          }
-        }
-      }
+    businessTypeName := businessType.BusinessTypeName().Tokenize( "," );
+    organcodelist := selectvalues( businessType, OrganCode, organ, true, organ.OrganCodeName() );
     
     if( organcodelist.Size() = 0 ){
       organcodelist := selectvalues( globalOTDTable, Global_MappingOperationBOM, bom,true, bom.OrganCode() );
@@ -46,14 +34,14 @@
     UnitOfMeasure_MP::DoASync( globalOTDTable, macroPlan );
     
     // 閿�鍞儴闂�-2
-    SalesSegment_MP::DoASync( macroPlan, businessTypes,globalOTDTable );
+    SalesSegment_MP::DoASync( macroPlan, businessTypeName,globalOTDTable );
     
     // Unit-9 
     // 涓嶰peration涓�鍚屽鐞�
     //info( "BaseConversionFactor Finished, Start Operation Data Broker" );
     //macroPlan.Broker_OTD_Operation().Execute();
     info( "Operation Data Broker Finished, Start Unit Mapping" );
-    macroPlan.DoASyncMappingUnitData( businessTypes ,globalOTDTable, organcodelist);
+    macroPlan.DoASyncMappingUnitData( businessTypeName ,globalOTDTable, organcodelist);
     
     // 搴撳瓨鐐�-3
     info( "Sales Segment Finished, Start Get StockingPoint From Api" )
@@ -90,18 +78,18 @@
     //macroPlan.Broker_OTD_Product().Execute();
     info( "Product Data Broker Finished, Start Product Mapping" );
     //testproduct := construct( Strings );
-    macroPlan.DoASyncMappingProductData( businessTypes, globalOTDTable,isKeyProduct );
+    macroPlan.DoASyncMappingProductData( businessTypeName, globalOTDTable,isKeyProduct );
     
     //鍗曚綅杞崲-7
     BaseConversionFactor::DoASync( macroPlan ,globalOTDTable);
     
     // 宸ヨ壓璺嚎 + BOM-9
     info( "Unit Finished, Start Operation Mapping" );
-    macroPlan.DoASyncMappingOperationData( businessTypes ,globalOTDTable, organcodelist );  
+    macroPlan.DoASyncMappingOperationData( businessTypeName ,globalOTDTable, organcodelist );  
     //info( "Operation Finished, Start BOM Data Broker" );
     //macroPlan.Broker_OTD_BOM().Execute();
     info( "BOM Data Broker Finished, Start BOM Mapping" );
-    macroPlan.DoASyncMappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial,globalOTDTable, organcodelist );
+    macroPlan.DoASyncMappingOperationBOMData( businessTypeName, isKeyProduct, createPurchaseSupplyMaterial,globalOTDTable, organcodelist );
     
     //杞﹂亾淇℃伅-10
     info( "BOM Finished, Start Get Lanes From Api" );
@@ -127,32 +115,32 @@
     //info( "Get Lanelegs From Api Finished, Start ProductInLane Data Broker" );
     //macroPlan.Broker_OTD_ProductInLane().Execute();
     info( "ProductInLane Data Broker Finished, Start ProductInLane Mapping" );
-    macroPlan.DoASyncMappingProductInLaneData(globalOTDTable);
+    macroPlan.DoASyncMappingProductInLaneData(globalOTDTable,guard( businessTypeName.Element( 0 ), "" ));
     
     // 鍦ㄥ簱搴撳瓨鏁版嵁-13
     //info( "ProductInLane Finished, Start ActualPISPIP Data Broker" );
     //macroPlan.Broker_OTD_ActualPISPIP().Execute();
     info( "ActualPISPIP Data Broker Finished, Start ActualPISPIP Mapping" );
-    macroPlan.DoASyncMappingActualPISPIPData( businessTypes, globalOTDTable,isKeyProduct, organcodelist );
+    macroPlan.DoASyncMappingActualPISPIPData( businessTypeName, globalOTDTable,isKeyProduct, organcodelist );
     
     // 鍦ㄩ�斿簱瀛�-14
     //info( "ActualPISPIP Finished, Start ExternalSupply Data Broker" );
     //macroPlan.Broker_OTD_ExternalSupply().Execute();
     info( "ExternalSupply Data Broker Finished, Start ExternalSupply Mapping" );
-    macroPlan.DoASyncMappingExternalSupplyData( businessTypes, isKeyProduct ,globalOTDTable, organcodelist );
+    macroPlan.DoASyncMappingExternalSupplyData( businessTypeName, isKeyProduct ,globalOTDTable, organcodelist );
     
     // 搴撳瓨鎴愭湰-15
-    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable );
+    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable,guard( businessTypeName.Element( 0 ), "" ) );
     
     // todo 鍒堕�犳垚鏈�-16
     info( "InventoryCost Finished, Start OperationCost Mapping" );
-    macroPlan.DoASyncMappingOperationCostData( globalOTDTable, businessTypes, organcodelist );
+    macroPlan.DoASyncMappingOperationCostData( globalOTDTable, businessTypeName, organcodelist );
     
     // 璁㈠崟棰勬祴-17
-    Forecast::DoASync( macroPlan, businessTypes, globalOTDTable, organcodelist );
+    Forecast::DoASync( macroPlan, businessTypeName, globalOTDTable, organcodelist );
     
     // 璁㈠崟闇�姹�-18
-    CustomerOrder::DoASync( macroPlan, businessTypes, globalOTDTable, organcodelist );
+    CustomerOrder::DoASync( macroPlan, businessTypeName, globalOTDTable, organcodelist );
     
     //鍒犻櫎澶氫綑鎶ラ敊鏁版嵁-19
     macroPlan.DeleteSnaityCheck();
@@ -162,5 +150,7 @@
     
     //// todo 渚涘簲鍟嗗洖澶�
     //info( "ProviderReply::DoSync" )
+    
+    return emit( macroPlan );
   *]
 }
diff --git "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043896.qbl" "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043896.qbl"
deleted file mode 100644
index fc549a7..0000000
--- "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043896.qbl"
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoASync (
-  MacroPlan macroPlan,
-  String businessTypeStr,
-  Boolean isKeyProduct,
-  Boolean createPurchaseSupplyMaterial,
-  const GlobalOTDTable globalOTDTable
-) as stream[MacroPlan]
-{
-  Description: '鍗曟鍚屾'
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    businessTypes := construct( Strings );
-    if( businessTypeStr.Length() > 0 ) {
-        businessTypes := businessTypeStr.Tokenize( ',' );
-    }
-    MacroPlan::DoASync( macroPlan, businessTypes, isKeyProduct, createPurchaseSupplyMaterial ,globalOTDTable);
-    
-    return emit( macroPlan );
-  *]
-}
diff --git a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync.qbl b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync.qbl
index 4fb0a6b..d92126d 100644
--- a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync.qbl
+++ b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 StaticMethod DoASync (
   Scenario scenario,
-  String businessTypeStr,
+  const BusinessType businessType,
   Boolean isKeyProduct,
   Boolean createPurchaseSupplyMaterial,
   const GlobalOTDTable globalOTDTable
@@ -10,10 +10,10 @@
 {
   TextBody:
   [*
-    info( scenario.DatasetMDSID(), "    浜嬩笟閮細", businessTypeStr, "    isKeyProduct锛�", isKeyProduct, "    createPurchaseSupplyMaterial锛�", createPurchaseSupplyMaterial );
+    info( scenario.DatasetMDSID(), "    浜嬩笟閮細", businessType.BusinessTypeName(), "    isKeyProduct锛�", isKeyProduct, "    createPurchaseSupplyMaterial锛�", createPurchaseSupplyMaterial );
     
     MDSMacroPlan::Root( scenario.DatasetMDSID() )
-    -> MacroPlan::DoASync( businessTypeStr,
+    -> MacroPlan::DoASync( businessType,
                            isKeyProduct,
                            createPurchaseSupplyMaterial,
                            globalOTDTable
diff --git a/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
index 4209271..1bd2418 100644
--- a/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
+++ b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
@@ -9,7 +9,7 @@
     
     //CapacityAllocationResultsRuleConfiguration::AutomaticallyGenerateCapacityRules( GlobalOTDTable, MacroPlan );
     
-    CapacityAllocationResults::Test( MacroPlan, GlobalOTDTable );
+    //CapacityAllocationResults::Test( MacroPlan, GlobalOTDTable );
   *]
   CanBindMultiple: false
   DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_DataHolderAllScenario_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_DataHolderAllScenario_OnDataChanged.def
new file mode 100644
index 0000000..0470654
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_DataHolderAllScenario_OnDataChanged.def
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: DataHolderAllScenario
+Response OnDataChanged () id:Response_TIANMA_JITUAN_ApplicationMacroPlanner_DataHolderAllScenario_OnDataChanged
+{
+  #keys: '[414702.1.169517835]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      user := QuintiqUser::CurrentUser();
+      scenarionodes := construct( ScenarioNodes );
+      
+      if( user.IsAdministrator()
+          or not exists( ScenarioManager, ScenarioNode.ScenarioAuthorization, sa, true ) )
+      {
+        scenarionodes := selectset( ScenarioManager, ScenarioNode, scenarionode, true );
+      }
+      else
+      {
+        scenarionodes := selectset( ScenarioManager, ScenarioNode, scenarionode,
+                                    guard( scenarionode.astype( ScenarioFolder ).IsRecycleBin(), false )
+                                    or scenarionode.CreatedBy().ToUpper() = user.ShortName().ToUpper()
+                                    or exists( scenarionode, ScenarioAuthorization, sa,
+                                               user.IsMemberOfGroup( sa.Name() ) ) );
+      }
+      
+      DataHolderAvailableScenarios.Data( &scenarionodes );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 49e8c72..219db76 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -80,5 +80,31 @@
     Component DataHolderCurrentUser #extension
     {
     }
+    Component DataHolderAllScenario
+    {
+      #keys: '[414702.1.169450613]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[ScenarioNode]*'
+      Children:
+      [
+        Component DataExtractorAllScenario
+        {
+          #keys: '[414702.1.166961408]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'ScenarioManager'
+            FixedFilter: 'not object.IsDeleted()'
+            Source: 'ScenarioManager'
+            Taborder: 0
+            Transformation: 'ScenarioNode'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 46
+      ]
+    }
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Component_pnlContent.def
index 5c05df7..a5e8867 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Component_pnlContent.def
@@ -5,18 +5,6 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component dropDownStringListGeneral id:dropDownStringListGeneral_549
-    {
-      #keys: '[414702.1.87540205]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        AllowEmpty: true
-        DataBinding: 'DataHolderScenario.Data.ScenarioName'
-        Label: 'Scenario Name'
-        Taborder: 0
-      ]
-    }
     Component checkboxIsKeyProduct id:checkboxIsKeyProduct_593
     {
       #keys: '[414702.1.87540263]'
@@ -49,6 +37,33 @@
         Taborder: 3
       ]
     }
+    Component ddlBusinessType
+    {
+      #keys: '[414702.1.169614090]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'BusinessType'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[414702.1.169614092]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'BusinessType'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'ScenarioName'
+        Label: 'Scenario Name'
+        Taborder: 0
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Method_DataDistribution.def b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Method_DataDistribution.def
index c72dc11..08f0bf0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Method_DataDistribution.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Method_DataDistribution.def
@@ -9,8 +9,6 @@
   [*
     DataHolderScenario.Data( scenario );
     
-    dropDownStringListGeneral.Strings( GlobalOTDTable::GetBusnessStrings( GlobalOTDTable ) );
-    
     ApplicationMacroPlanner.ShowFormModal( this );
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Response_pnlActions_btnOk_OnClick.def
index fcba155..d4696a6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogDataDistribution/Response_pnlActions_btnOk_OnClick.def
@@ -10,8 +10,9 @@
     
     activeScenario := DataHolderActiveScenario.Data();
     currentScenario := DataHolderScenario.Data();
+    businessType := ddlBusinessType.Data();
     
-    if ( activeScenario = currentScenario ) {
+    if ( activeScenario = currentScenario or isnull( businessType ) ) {
       flag := false;
       feedback := "鏃犳硶瀵瑰綋鍓嶉�変腑鍦烘櫙杩涜鍒嗗彂";
     }
@@ -30,15 +31,9 @@
     [*
       Form.ApplyChanges();
       
-      businessType := select( GlobalOTDTable, 
-                              BusinessType, 
-                              b, 
-                              b.ScenarioName() = dropDownStringListGeneral.Text()
-                             );
-      
       DataDistributionLog::Create( GlobalOTDLog, ApplicationMacroPlanner.GetUserName(), DataHolderScenario.Data().DatasetMDSID(), DataHolderScenario.Data().Name() );
       MacroPlan::DoASync( DataHolderScenario.Data(), 
-                          businessType.BusinessTypeName(),
+                          ddlBusinessType.Data(),
                           checkboxIsKeyProduct.Checked(), 
                           checkboxCreatePurchaseSupplyProduct.Checked(),
                           GlobalOTDTable );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def
new file mode 100644
index 0000000..bf4fda9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button1_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button1
+Response OnClick () id:Response_FormInterfaceTest_Button1_OnClick
+{
+  #keys: '[414702.1.224832095]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_ProductInLineCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def
new file mode 100644
index 0000000..4da9e70
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button2_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button2
+Response OnClick () id:Response_FormInterfaceTest_Button2_OnClick
+{
+  #keys: '[414702.1.224832394]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_StockingPointCostCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def
new file mode 100644
index 0000000..43d8ae2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button3_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button3
+Response OnClick () id:Response_FormInterfaceTest_Button3_OnClick
+{
+  #keys: '[414702.1.226882201]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_MAPISPIPCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def
new file mode 100644
index 0000000..43ad89d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button4_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Button4
+Response OnClick () id:Response_FormInterfaceTest_Button4_OnClick
+{
+  #keys: '[414702.1.226892014]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Global_InventorySupplyCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def
new file mode 100644
index 0000000..93cfb84
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_Button5_OnClick.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: Button5
+Response OnClick () id:Response_FormInterfaceTest_Button5_OnClick
+{
+  #keys: '[414702.1.228751233]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      GlobalOTDTable.Global_ProductCategory( relflush );
+      GlobalOTDTable.Global_ProductInLineCategory( relflush );
+      GlobalOTDTable.Global_InventorySupplyCategory( relflush );
+      GlobalOTDTable.Global_StockingPointCostCategory( relflush );
+      GlobalOTDTable.Global_MAPISPIPCategory( relflush );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def
new file mode 100644
index 0000000..6e100b7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ButtonGenerateProductCategory_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ButtonGenerateProductCategory
+Response OnClick () id:Response_FormInterfaceTest_ButtonGenerateProductCategory_OnClick
+{
+  #keys: '[414702.1.220904292]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      Global_ProductCategory::Create( GlobalOTDTable );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
index 91a9af4..16917a6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
@@ -13,6 +13,72 @@
     #child: PanelInterfaceOption3
     #child: PanelInterfaceOption2
     #child: PanelInterfaceOption1
+    Component ButtonGenerateProductCategory
+    {
+      #keys: '[414702.1.220980872]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'TELEPHONE2'
+        Label: '鏍规嵁浜嬩笟閮ㄧ敓鎴愪骇鍝佸垎绫�'
+        Taborder: 6
+      ]
+    }
+    Component Button1
+    {
+      #keys: '[414702.1.225920560]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BRUSH2'
+        Label: '鏍规嵁浜у搧ID鐢熸垚ProductInLine鍒嗙被'
+        Taborder: 7
+      ]
+    }
+    Component Button2
+    {
+      #keys: '[414702.1.225920577]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'INDUSTRIAL_ROBOT'
+        Label: '鏍规嵁浜у搧ID鐢熸垚StockingPoingCost鍒嗙被'
+        Taborder: 8
+      ]
+    }
+    Component Button3
+    {
+      #keys: '[414702.1.226882098]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BANANA'
+        Label: '鏍规嵁浜у搧ID鐢熸垚MAPISPIP鍒嗙被'
+        Taborder: 9
+      ]
+    }
+    Component Button4
+    {
+      #keys: '[414702.1.226891739]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BEER_GLASS'
+        Label: '鏍规嵁浜у搧ID鐢熸垚InventorySupply鍒嗙被'
+        Taborder: 10
+      ]
+    }
+    Component Button5
+    {
+      #keys: '[414702.1.228751221]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BROOM'
+        Label: '娓呯┖鍒嗙被'
+        Taborder: 11
+      ]
+    }
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
index 31929b6..1977281 100644
--- "a/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
@@ -13,7 +13,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 16
+          rowSpan: 23
           columnPosition: 1
           columnSpan: 6
         }
@@ -1184,10 +1184,10 @@
     userconfigurableinformation
     {
     }
+    image: 'SKIN_TIGER'
     page: ''
     group: ''
     index: 0
-    image: 'SKIN_TIGER'
     description: ''
   }
   formatversion: 2

--
Gitblit v1.9.3