From 3cb5a54def670d97301f07170fcaad213bfc54f2 Mon Sep 17 00:00:00 2001
From: yypsybs <yypsybs@foxmail.com>
Date: 星期六, 09 九月 2023 15:30:46 +0800
Subject: [PATCH] 同步逻辑由MacroPlan移到MPSync

---
 _Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl                                                        |   96 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def                                      |    8 
 _Main/BL/Type_MPSync/Method_MappingOperationData.qbl                                                                |  102 +
 _Main/BL/Type_MappingOperation/StaticMethod_FindMinSeq.qbl                                                          |    4 
 _Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl                                                                  |   91 +
 _Main/BL/EDI/Broker_Broker_OTD_ActualPISPIP.qbl                                                                     |    2 
 _Main/BL/EDI/Broker_Broker_OTD_Product.qbl                                                                          |    3 
 _Main/BL/Type_MPSync/Method_MappingLaneData.qbl                                                                     |   16 
 _Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl                                                             |  181 +++
 _Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl                                                      |   18 
 _Main/BL/Type_MPSync/Method_MappingCurrencyData#670.qbl                                                             |   23 
 _Main/BL/Type_MPSync/Method_MappingUnitData.qbl                                                                     |   52 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_PriorityName.qbl                                                |    1 
 _Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl                                         |   23 
 LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderID.qbl                                                       |    1 
 _Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl                                                                 |   16 
 _Main/BL/Type_MPSync/Method_MappingForecastData.qbl                                                                 |   40 
 _Main/BL/EDI/Broker_Broker_OTD_Unit.qbl                                                                             |    4 
 _Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl                                                          |   78 
 _Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl                                                          |   86 
 _Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#821.qbl                                                              |    5 
 _Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl                                                             |   30 
 _Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl                                                                          |    6 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_CurrencyID.qbl                                                  |    1 
 _Main/BL/Type_MacroPlan/Method_MappingUnitOfMeasureData.qbl                                                         |   28 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_SalesSegmentName.qbl                                            |    1 
 _Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl                                                                 |   17 
 _Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl                                                              |   54 +
 _Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl                           |   23 
 _Main/BL/EDI/Broker_Broker_OTD_CustomerOrder.qbl                                                                    |    2 
 _Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl                 |   23 
 _Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl                               |   23 
 LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderLineID.qbl                                                   |    1 
 _Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl                                                             |   17 
 _Main/BL/Type_MacroPlan/Method_MappingBaseConversionFactorData.qbl                                                  |   22 
 _Main/BL/Type_MacroPlan/Method_MappingInventoryValueAndCostData.qbl                                                 |   38 
 _Main/BL/Type_IOUnit/StaticMethod_FindById.qbl                                                                      |   14 
 _Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl                                                         |   66 
 _Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl                             |   23 
 _Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl                                                                  |  178 +-
 LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerID.qbl                                                    |    1 
 _Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl                                                           |   17 
 _Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl                                                     |   17 
 _Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl                                                    |   19 
 _Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl                                          |    6 
 _Main/BL/Type_MacroPlan/Method_MappingProductInLaneData.qbl                                                         |   30 
 _Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl                                                                |    6 
 LibMacroPlanner/BL/Type_IOProduct_MP/StaticMethod_Create.qbl                                                        |    1 
 _Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl                                                            |   16 
 _Main/BL/EDI/Broker_Broker_OTD_Operation.qbl                                                                        |    2 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuDoSync_OnClick.def |    4 
 _Main/BL/EDI/Broker_Broker_OTD_BOM.qbl                                                                              |   15 
 _Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl                                                            |    6 
 _Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl                                                                  |   16 
 _Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl                                                             |  168 +-
 _Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl                             |   23 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_DemandUncertaintyPercentage.qbl                                 |    2 
 _Main/BL/Type_MPSync/Method_MappingStockingPointData#321.qbl                                                        |   29 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_UnitOfMeasureName.qbl                                           |    1 
 _Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl                                                            |   55 +
 _Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl                                                         |   18 
 _Main/BL/Type_MPSync/Method_MappingProductData.qbl                                                                  |   47 
 _Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl                 |   23 
 _Main/BL/EDI/Broker_Broker_OTD_UnitOfMeasure.qbl                                                                    |    2 
 _Main/BL/Type_MacroPlan/Method_MappingProductData.qbl                                                               |  160 +-
 _Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl                                                       |   25 
 _Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl                               |   23 
 _Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl                                                         |  104 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StockingPointID.qbl                                             |    1 
 _Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl                             |   23 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ProductID.qbl                                                   |    1 
 _Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl                                                           |   34 
 _Main/BL/Type_MPSync/Method_MappingLaneData#474.qbl                                                                 |   23 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ID.qbl                                                          |    1 
 LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerName.qbl                                                  |    1 
 _Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#331.qbl                                                              |    5 
 _Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl                                                                          |    6 
 _Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl                                                                          |    6 
 _Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl                                                            |   44 
 _Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl                                                        |   23 
 _Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl                                                 |   19 
 _Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl                                                             |   22 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StartDate.qbl                                                   |    1 
 _Main/BL/EDI/Broker_Broker_OTD_ProductInLane.qbl                                                                    |    2 
 _Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl                                                             |   28 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Price.qbl                                                       |    1 
 _Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl                                                        |   32 
 _Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl                                                                  |   17 
 _Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl                                                            |    6 
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting#576.qbl                                               |  162 +-
 _Main/BL/EDI/Broker_Broker_OTD_ExternalSupply.qbl                                                                   |    2 
 _Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl                                                                |   14 
 _Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl                                               |   23 
 _Main/BL/EDI/Broker_Broker_OTD_SalesSegment.qbl                                                                     |    2 
 _Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl                                                 |   23 
 _Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl                                                              |   60 
 _Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl                                                            |   15 
 _Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl                                                            |   14 
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl                                                          |  124 +-
 _Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl                             |   23 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_EndDate.qbl                                                     |    1 
 _Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl                                       |   23 
 _Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl                                                              |    6 
 _Main/BL/EDI/Broker_Broker_OTD_Forecast.qbl                                                                         |    2 
 _Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl                                                     |   19 
 _Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl                                                          |   16 
 _Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl                                                       |   22 
 /dev/null                                                                                                           |   16 
 _Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl                                                    |    6 
 _Main/BL/EDI/Broker_Broker_OTD_BaseConversionFactor.qbl                                                             |    2 
 _Main/BL/EDI/Broker_Broker_OTD_OperationCost.qbl                                                                    |    2 
 LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Quantity.qbl                                                    |    1 
 _Main/BL/Type_MPSync/Method_MappingLaneLegData#257.qbl                                                              |   30 
 _Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl                                     |   23 
 _Main/BL/EDI/Broker_Broker_OTD_InventoryCost.qbl                                                                    |    2 
 _Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl                                                               |   18 
 116 files changed, 2,432 insertions(+), 768 deletions(-)

diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerID.qbl
index 6feec50..fe2b3d6 100644
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerID.qbl
+++ b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerID.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341081382][138186.0.341081381][138186.0.341081383]'
   Description: 'Customer unique ID'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerName.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerName.qbl
index ec7fd33..48c1336 100644
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerName.qbl
+++ b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_CustomerName.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341081370][138186.0.341081369][138186.0.341081371]'
   Description: 'Name of the customer'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderID.qbl
index 1579ef7..01c1c5a 100644
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderID.qbl
+++ b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderID.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341081379][138186.0.341081378][138186.0.341081380]'
   Description: 'Unique order ID'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderLineID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderLineID.qbl
index f96ec64..8f2f3df 100644
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderLineID.qbl
+++ b/LibMacroPlanner/BL/Type_IOCustomerOrder/Attribute_OrderLineID.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341081373][138186.0.341081372][138186.0.341081374]'
   Description: 'Unique ID of the order line'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerID.qbl
deleted file mode 100644
index 66ae438..0000000
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: CustomerID
-}
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerName.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerName.qbl
deleted file mode 100644
index bc2d538..0000000
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_CustomerName.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: CustomerName
-}
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderID.qbl
deleted file mode 100644
index 05c5cf1..0000000
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: OrderID
-}
diff --git a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderLineID.qbl b/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderLineID.qbl
deleted file mode 100644
index 01ff2bf..0000000
--- a/LibMacroPlanner/BL/Type_IOCustomerOrder/DefaultValue_OrderLineID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: OrderLineID
-}
diff --git a/LibMacroPlanner/BL/Type_IOProduct_MP/StaticMethod_Create.qbl b/LibMacroPlanner/BL/Type_IOProduct_MP/StaticMethod_Create.qbl
index a199c11..c52c2da 100644
--- a/LibMacroPlanner/BL/Type_IOProduct_MP/StaticMethod_Create.qbl
+++ b/LibMacroPlanner/BL/Type_IOProduct_MP/StaticMethod_Create.qbl
@@ -18,5 +18,4 @@
     
     return ioproduct;
   *]
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_CurrencyID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_CurrencyID.qbl
index 9b05252..d48a9fe 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_CurrencyID.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_CurrencyID.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341091998][138186.0.341091997][138186.0.341091999]'
   Description: 'Foreign key'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_DemandUncertaintyPercentage.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_DemandUncertaintyPercentage.qbl
index cd61eb4..9429a07 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_DemandUncertaintyPercentage.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_DemandUncertaintyPercentage.qbl
@@ -9,5 +9,5 @@
     This percentage is used to calculate StandardDeviationDemand on PISPIP.
   *]
   ValueType: Real
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Module' Visibility: 'BusinessModel' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_EndDate.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_EndDate.qbl
index d0778bf..668fbb5 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_EndDate.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_EndDate.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341091995][138186.0.341091994][138186.0.341091996]'
   ValueType: Date
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ID.qbl
index daba47a..8b1363c 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ID.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ID.qbl
@@ -6,5 +6,4 @@
   Description: 'Sales Demand ID'
   IsReadOnly: true
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Price.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Price.qbl
index 892021f..16335d7 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Price.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Price.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061308][138186.0.341061307][138186.0.341061309]'
   ValueType: Real
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_PriorityName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_PriorityName.qbl
index c128a96..5f978d9 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_PriorityName.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_PriorityName.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061314][138186.0.341061313][138186.0.341061315]'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ProductID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ProductID.qbl
index e20f379..188f50c 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ProductID.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_ProductID.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061311][138186.0.341061310][138186.0.341061312]'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Quantity.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Quantity.qbl
index 40204d6..3986b31 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Quantity.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_Quantity.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061305][138186.0.341061304][138186.0.341061306]'
   ValueType: Real
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_SalesSegmentName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_SalesSegmentName.qbl
index 8e03418..70f0ec9 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_SalesSegmentName.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_SalesSegmentName.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061299][138186.0.341061298][138186.0.341061300]'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StartDate.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StartDate.qbl
index eb15fd6..b4cf11d 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StartDate.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StartDate.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061302][138186.0.341061301][138186.0.341061303]'
   ValueType: Date
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StockingPointID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StockingPointID.qbl
index ef9bec6..c582cfd 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StockingPointID.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_StockingPointID.qbl
@@ -4,5 +4,4 @@
 {
   #keys: '3[138186.0.341061317][138186.0.341061316][138186.0.341061318]'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_UnitOfMeasureName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_UnitOfMeasureName.qbl
index f35e733..a084c7e 100644
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_UnitOfMeasureName.qbl
+++ b/LibMacroPlanner/BL/Type_IOSalesDemandBase/Attribute_UnitOfMeasureName.qbl
@@ -5,5 +5,4 @@
   #keys: '3[138186.0.341061321][138186.0.341061320][138186.0.341061322]'
   Description: 'Unit of measure for sales demand'
   ValueType: String
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_CurrencyID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_CurrencyID.qbl
deleted file mode 100644
index cae9679..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_CurrencyID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: CurrencyID
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ID.qbl
deleted file mode 100644
index 049abc0..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: ID
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_PriorityName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_PriorityName.qbl
deleted file mode 100644
index 59ad087..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_PriorityName.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: PriorityName
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ProductID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ProductID.qbl
deleted file mode 100644
index 98649b2..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_ProductID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: ProductID
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_SalesSegmentName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_SalesSegmentName.qbl
deleted file mode 100644
index 521966d..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_SalesSegmentName.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: SalesSegmentName
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_StockingPointID.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_StockingPointID.qbl
deleted file mode 100644
index fbb83fc..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_StockingPointID.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: StockingPointID
-}
diff --git a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_UnitOfMeasureName.qbl b/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_UnitOfMeasureName.qbl
deleted file mode 100644
index b2012de..0000000
--- a/LibMacroPlanner/BL/Type_IOSalesDemandBase/DefaultValue_UnitOfMeasureName.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: UnitOfMeasureName
-}
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_ActualPISPIP.qbl b/_Main/BL/EDI/Broker_Broker_OTD_ActualPISPIP.qbl
index bc7c6a3..6f554c1 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_ActualPISPIP.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_ActualPISPIP.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_ActualPISPIP
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_ActualPISPIP
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_BOM.qbl b/_Main/BL/EDI/Broker_Broker_OTD_BOM.qbl
index 965dd1b..07c4d2f 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_BOM.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_BOM.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_BOM
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_MappingBOM
@@ -10,7 +10,6 @@
     EDIMLTable MappingBOM
     {
       PrimaryKeyColumns: AlternativeMaterialCode
-      PrimaryKeyColumns: BusinessType
       PrimaryKeyColumns: ComponentCode
       PrimaryKeyColumns: OrganCode
       PrimaryKeyColumns: ProcessSection
@@ -28,8 +27,8 @@
       EDIMLColumn ComponentType { Attribute: ComponentType ValueType: String }
       EDIMLColumn ComponentUnit { Attribute: ComponentUnit ValueType: String }
       EDIMLColumn ComponentUnitDescription { Attribute: ComponentUnitDescription ValueType: String }
-      EDIMLColumn DescriptionOfAlternativeMaterial { Attribute: DescriptionOfAlternativeMaterial ValueType: String }
       EDIMLColumn DescriptionOfAlternativeMaterialUnits { Attribute: DescriptionOfAlternativeMaterialUnits ValueType: String }
+      EDIMLColumn DescriptionOfAlternativeMaterials { Attribute: DescriptionOfAlternativeMaterials ValueType: String }
       EDIMLColumn MaterialSystem { Attribute: MaterialSystem ValueType: String }
       EDIMLColumn OrganCode { Attribute: OrganCode ValueType: String }
       EDIMLColumn ProcessSection { Attribute: ProcessSection ValueType: String }
@@ -53,7 +52,7 @@
       OthersMayDropTable: true
       OthersMayFlushTable: true
       OthersMayInsertRow: true
-      Parameters: '/owner="TIANMA"'
+      Parameters: '/owner="YUXTEST"'
       RecordModificationHintStrategy: 'None'
       EDIODBCLinkColumn ALTERNATIVEMATERIALCODE
       {
@@ -110,12 +109,12 @@
         OthersMayUpdateColumn: true
         ValueType: String
       }
-      EDIODBCLinkColumn DESCRIPTIONOFALTERNATIVEMATERIAL
+      EDIODBCLinkColumn DESCRIPTIONOFALTERNATIVEMATERIALS
       {
         OthersMayUpdateColumn: true
         ValueType: String
       }
-      EDIODBCLinkColumn DESCRIPTIONOFALTERNATIVEMATERIALUNIT
+      EDIODBCLinkColumn DESCRIPTIONOFALTERNATIVEMATERIALUNITS
       {
         OthersMayUpdateColumn: true
         ValueType: String
@@ -189,8 +188,8 @@
       EDIColumnMatch { InputColumn: COMPONENTTYPE OutputColumn: ComponentType }
       EDIColumnMatch { InputColumn: COMPONENTUNIT OutputColumn: ComponentUnit }
       EDIColumnMatch { InputColumn: COMPONENTUNITDESCRIPTION OutputColumn: ComponentUnitDescription }
-      EDIColumnMatch { InputColumn: DESCRIPTIONOFALTERNATIVEMATERIAL OutputColumn: DescriptionOfAlternativeMaterial }
-      EDIColumnMatch { InputColumn: DESCRIPTIONOFALTERNATIVEMATERIALUNIT OutputColumn: DescriptionOfAlternativeMaterialUnits }
+      EDIColumnMatch { InputColumn: DESCRIPTIONOFALTERNATIVEMATERIALS OutputColumn: DescriptionOfAlternativeMaterials }
+      EDIColumnMatch { InputColumn: DESCRIPTIONOFALTERNATIVEMATERIALUNITS OutputColumn: DescriptionOfAlternativeMaterialUnits }
       EDIColumnMatch { InputColumn: MATERIALSYSTEM OutputColumn: MaterialSystem }
       EDIColumnMatch { InputColumn: ORGANCODE OutputColumn: OrganCode }
       EDIColumnMatch { InputColumn: PROCESSSECTION OutputColumn: ProcessSection }
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_BaseConversionFactor.qbl b/_Main/BL/EDI/Broker_Broker_OTD_BaseConversionFactor.qbl
index 7f8c525..4780330 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_BaseConversionFactor.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_BaseConversionFactor.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_BaseConversionFactor
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_BaseConversionFactor
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_CustomerOrder.qbl b/_Main/BL/EDI/Broker_Broker_OTD_CustomerOrder.qbl
index 362c208..8048dab 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_CustomerOrder.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_CustomerOrder.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_CustomerOrder
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_CustomerOrder
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_ExternalSupply.qbl b/_Main/BL/EDI/Broker_Broker_OTD_ExternalSupply.qbl
index 90a3bea..14c1481 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_ExternalSupply.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_ExternalSupply.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_ExternalSupply
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_ExternalSupply
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_Forecast.qbl b/_Main/BL/EDI/Broker_Broker_OTD_Forecast.qbl
index 6b4a67f..cde7da9 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_Forecast.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_Forecast.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_Forecast
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_Forecast
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_InventoryCost.qbl b/_Main/BL/EDI/Broker_Broker_OTD_InventoryCost.qbl
index b332e9d..d02ca22 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_InventoryCost.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_InventoryCost.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_InventoryCost
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_InventoryCost
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_Operation.qbl b/_Main/BL/EDI/Broker_Broker_OTD_Operation.qbl
index 64aa83d..045c8b9 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_Operation.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_Operation.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_Operation
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_Operation
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_OperationCost.qbl b/_Main/BL/EDI/Broker_Broker_OTD_OperationCost.qbl
index e60201f..0498242 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_OperationCost.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_OperationCost.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_OperationCost
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_MappingOperationCost
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_Product.qbl b/_Main/BL/EDI/Broker_Broker_OTD_Product.qbl
index 3da4e20..c42cadb 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_Product.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_Product.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_Product
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_MappingProduct
@@ -38,7 +38,6 @@
       OthersMayFlushTable: true
       OthersMayInsertRow: true
       Parameters: '/owner="TIANMA"'
-      PrimaryKeyColumns: ID
       RecordModificationHintStrategy: 'None'
       EDIODBCLinkColumn BUSINESSTYPE
       {
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_ProductInLane.qbl b/_Main/BL/EDI/Broker_Broker_OTD_ProductInLane.qbl
index b523027..a3196d2 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_ProductInLane.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_ProductInLane.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_ProductInLane
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_MappingProductInLane
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_SalesSegment.qbl b/_Main/BL/EDI/Broker_Broker_OTD_SalesSegment.qbl
index 6176047..8c26a57 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_SalesSegment.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_SalesSegment.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_SalesSegment
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_SalesSegment
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_Unit.qbl b/_Main/BL/EDI/Broker_Broker_OTD_Unit.qbl
index 80cde4f..3c7beb3 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_Unit.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_Unit.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_Unit
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_Unit
@@ -34,7 +34,7 @@
       OthersMayDropTable: true
       OthersMayFlushTable: true
       OthersMayInsertRow: true
-      Parameters: '/owner="OTD"'
+      Parameters: '/owner="TIANMA"'
       RecordModificationHintStrategy: 'None'
       EDIODBCLinkColumn EQUIPMENT
       {
diff --git a/_Main/BL/EDI/Broker_Broker_OTD_UnitOfMeasure.qbl b/_Main/BL/EDI/Broker_Broker_OTD_UnitOfMeasure.qbl
index 0ece78e..3c68061 100644
--- a/_Main/BL/EDI/Broker_Broker_OTD_UnitOfMeasure.qbl
+++ b/_Main/BL/EDI/Broker_Broker_OTD_UnitOfMeasure.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 EDIBroker Broker_OTD_UnitOfMeasure
 {
-  MDSDefinition: MacroPlan
+  MDSDefinition: MPSync
   TimeZone: 'ACT'
   UseOSTimeZone: false
   EDIModelLink.Destination Des_UnitOfMeasure
diff --git a/_Main/BL/Relations/Relation_MacroPlan_MappingActualPISPIP_MappingActualPISPIP_MacroPlan.qbl b/_Main/BL/Relations/Relation_MacroPlan_MappingActualPISPIP_MappingActualPISPIP_MacroPlan.qbl
deleted file mode 100644
index 8f7d3ba..0000000
--- a/_Main/BL/Relations/Relation_MacroPlan_MappingActualPISPIP_MappingActualPISPIP_MacroPlan.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MacroPlan_MappingActualPISPIP_MappingActualPISPIP_MacroPlan
-{
-  #keys: '1[414480.0.61560199]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MappingActualPISPIP
-  {
-    #keys: '3[414480.0.61560201][414480.0.61560200][414480.0.61560202]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-  RelationSide.RightSide MacroPlan
-  {
-    #keys: '3[414480.0.61560204][414480.0.61560203][414480.0.61560205]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingActualPISPIP
-    OwningSide: 'Reference'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MacroPlan_MappingExternalSupply_MappingExternalSupply_MacroPlan.qbl b/_Main/BL/Relations/Relation_MacroPlan_MappingExternalSupply_MappingExternalSupply_MacroPlan.qbl
deleted file mode 100644
index 606070c..0000000
--- a/_Main/BL/Relations/Relation_MacroPlan_MappingExternalSupply_MappingExternalSupply_MacroPlan.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MacroPlan_MappingExternalSupply_MappingExternalSupply_MacroPlan
-{
-  #keys: '1[414480.0.61581395]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MappingExternalSupply
-  {
-    #keys: '3[414480.0.61581397][414480.0.61581396][414480.0.61581398]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-  RelationSide.RightSide MacroPlan
-  {
-    #keys: '3[414480.0.61581400][414480.0.61581399][414480.0.61581401]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingExternalSupply
-    OwningSide: 'Reference'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MacroPlan_MappingProduct_MappingProduct_MacroPlan.qbl b/_Main/BL/Relations/Relation_MacroPlan_MappingProduct_MappingProduct_MacroPlan.qbl
deleted file mode 100644
index f0b9f15..0000000
--- a/_Main/BL/Relations/Relation_MacroPlan_MappingProduct_MappingProduct_MacroPlan.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MacroPlan_MappingProduct_MappingProduct_MacroPlan
-{
-  #keys: '1[414480.0.61560241]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MappingProduct
-  {
-    #keys: '3[414480.0.61560243][414480.0.61560242][414480.0.61560244]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-  RelationSide.RightSide MacroPlan
-  {
-    #keys: '3[414480.0.61560246][414480.0.61560245][414480.0.61560247]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingProduct
-    OwningSide: 'Reference'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl b/_Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl
new file mode 100644
index 0000000..0f7a1ec
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP
+{
+  #keys: '1[414384.0.737300004]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300006][414384.0.737300005][414384.0.737300007]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingActualPISPIP
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingActualPISPIP
+  {
+    #keys: '3[414384.0.737300009][414384.0.737300008][414384.0.737300010]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl b/_Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl
new file mode 100644
index 0000000..0af0e9d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingBOM_MPSync_MPSync_MappingBOM
+{
+  #keys: '1[414384.0.737300037]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300039][414384.0.737300038][414384.0.737300040]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingBOM
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingBOM
+  {
+    #keys: '3[414384.0.737300042][414384.0.737300041][414384.0.737300043]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingBOM_MacroPlan_MacroPlan_MappingBOM.qbl b/_Main/BL/Relations/Relation_MappingBOM_MacroPlan_MacroPlan_MappingBOM.qbl
deleted file mode 100644
index 902d4e9..0000000
--- a/_Main/BL/Relations/Relation_MappingBOM_MacroPlan_MacroPlan_MappingBOM.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingBOM_MacroPlan_MacroPlan_MappingBOM
-{
-  #keys: '1[412960.0.86935179]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[412960.0.86935181][412960.0.86935180][412960.0.86935182]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingBOM
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingBOM
-  {
-    #keys: '3[412960.0.86935184][412960.0.86935183][412960.0.86935185]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl b/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl
new file mode 100644
index 0000000..d038edc
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFactor
+{
+  #keys: '1[414384.0.737300021]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300023][414384.0.737300022][414384.0.737300024]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingBaseConversionFactor
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingBaseConversionFactor
+  {
+    #keys: '3[414384.0.737300026][414384.0.737300025][414384.0.737300027]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MacroPlan_MacroPlan_MappingBaseConversi.qbl b/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MacroPlan_MacroPlan_MappingBaseConversi.qbl
deleted file mode 100644
index a3c06fc..0000000
--- a/_Main/BL/Relations/Relation_MappingBaseConversionFactor_MacroPlan_MacroPlan_MappingBaseConversi.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingBaseConversionFactor_MacroPlan_MacroPlan_MappingBaseConversionFactor
-{
-  #keys: '1[414384.0.583154683]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.583154685][414384.0.583154684][414384.0.583154686]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingBaseConversionFactor
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingBaseConversionFactor
-  {
-    #keys: '3[414384.0.583154688][414384.0.583154687][414384.0.583154689]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl b/_Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl
new file mode 100644
index 0000000..0b61f30
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder
+{
+  #keys: '1[414384.0.737300053]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300055][414384.0.737300054][414384.0.737300056]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingCustomerOrder
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingCustomerOrder
+  {
+    #keys: '3[414384.0.737300058][414384.0.737300057][414384.0.737300059]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingCustomerOrder_MacroPlan_MacroPlan_MappingCustomerOrder.qbl b/_Main/BL/Relations/Relation_MappingCustomerOrder_MacroPlan_MacroPlan_MappingCustomerOrder.qbl
deleted file mode 100644
index 203709b..0000000
--- a/_Main/BL/Relations/Relation_MappingCustomerOrder_MacroPlan_MacroPlan_MappingCustomerOrder.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingCustomerOrder_MacroPlan_MacroPlan_MappingCustomerOrder
-{
-  #keys: '1[414384.0.583154766]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.583154768][414384.0.583154767][414384.0.583154769]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingCustomerOrder
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingCustomerOrder
-  {
-    #keys: '3[414384.0.583154771][414384.0.583154770][414384.0.583154772]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl b/_Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl
new file mode 100644
index 0000000..a4fbde1
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingExternalSupply_MPSync_MPSync_MappingExternalSupply
+{
+  #keys: '1[414384.0.737300069]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300071][414384.0.737300070][414384.0.737300072]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingExternalSupply
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingExternalSupply
+  {
+    #keys: '3[414384.0.737300074][414384.0.737300073][414384.0.737300075]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl b/_Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl
new file mode 100644
index 0000000..d90edf7
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingForecast_MPSync_MPSync_MappingForecast
+{
+  #keys: '1[414384.0.737300085]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300087][414384.0.737300086][414384.0.737300088]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingForecast
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingForecast
+  {
+    #keys: '3[414384.0.737300090][414384.0.737300089][414384.0.737300091]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingForecast_MacroPlan_MacroPlan_MappingForecast.qbl b/_Main/BL/Relations/Relation_MappingForecast_MacroPlan_MacroPlan_MappingForecast.qbl
deleted file mode 100644
index e3bd43d..0000000
--- a/_Main/BL/Relations/Relation_MappingForecast_MacroPlan_MacroPlan_MappingForecast.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingForecast_MacroPlan_MacroPlan_MappingForecast
-{
-  #keys: '1[414384.0.583160291]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.583160293][414384.0.583160292][414384.0.583160294]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingForecast
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingForecast
-  {
-    #keys: '3[414384.0.583160296][414384.0.583160295][414384.0.583160297]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl b/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl
new file mode 100644
index 0000000..9f91cf9
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAndCost
+{
+  #keys: '1[414384.0.737300101]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300103][414384.0.737300102][414384.0.737300104]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingInventoryValueAndCost
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingInventoryValueAndCost
+  {
+    #keys: '3[414384.0.737300106][414384.0.737300105][414384.0.737300107]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MacroPlan_MacroPlan_MappingInventoryVa.qbl b/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MacroPlan_MacroPlan_MappingInventoryVa.qbl
deleted file mode 100644
index f282c80..0000000
--- a/_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MacroPlan_MacroPlan_MappingInventoryVa.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingInventoryValueAndCost_MacroPlan_MacroPlan_MappingInventoryValueAndCost
-{
-  #keys: '1[414384.0.601560025]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.601560027][414384.0.601560026][414384.0.601560028]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingInventoryValueAndCost
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingInventoryValueAndCost
-  {
-    #keys: '3[414384.0.601560030][414384.0.601560029][414384.0.601560031]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl b/_Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl
new file mode 100644
index 0000000..67b9f81
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingOperationCost_MPSync_MPSync_MappingOperationCost
+{
+  #keys: '1[414384.0.736080617]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080619][414384.0.736080618][414384.0.736080620]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingOperationCost
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingOperationCost
+  {
+    #keys: '3[414384.0.736080622][414384.0.736080621][414384.0.736080623]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingOperationCost_MacroPlan_MacroPlan_MappingOperationCost.qbl b/_Main/BL/Relations/Relation_MappingOperationCost_MacroPlan_MacroPlan_MappingOperationCost.qbl
deleted file mode 100644
index 28c2cbe..0000000
--- a/_Main/BL/Relations/Relation_MappingOperationCost_MacroPlan_MacroPlan_MappingOperationCost.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingOperationCost_MacroPlan_MacroPlan_MappingOperationCost
-{
-  #keys: '1[412960.0.95000601]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[412960.0.95000603][412960.0.95000602][412960.0.95000604]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingOperationCost
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingOperationCost
-  {
-    #keys: '3[412960.0.95000606][412960.0.95000605][412960.0.95000607]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl b/_Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl
new file mode 100644
index 0000000..bb6553e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingOperation_MPSync_MPSync_MappingOperation
+{
+  #keys: '1[414384.0.737300117]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.737300119][414384.0.737300118][414384.0.737300120]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingOperation
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingOperation
+  {
+    #keys: '3[414384.0.737300122][414384.0.737300121][414384.0.737300123]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingOperation_MacroPlan_MacroPlan_MappingOperation.qbl b/_Main/BL/Relations/Relation_MappingOperation_MacroPlan_MacroPlan_MappingOperation.qbl
deleted file mode 100644
index 4e7f7bc..0000000
--- a/_Main/BL/Relations/Relation_MappingOperation_MacroPlan_MacroPlan_MappingOperation.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingOperation_MacroPlan_MacroPlan_MappingOperation
-{
-  #keys: '1[412960.0.86990893]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[412960.0.86990895][412960.0.86990894][412960.0.86990896]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingOperation
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingOperation
-  {
-    #keys: '3[412960.0.86990898][412960.0.86990897][412960.0.86990899]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl b/_Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl
new file mode 100644
index 0000000..a8def35
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingProductInLane_MPSync_MPSync_MappingProductInLane
+{
+  #keys: '1[414384.0.736080646]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080648][414384.0.736080647][414384.0.736080649]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingProductInLane
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingProductInLane
+  {
+    #keys: '3[414384.0.736080651][414384.0.736080650][414384.0.736080652]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingProductInLane_MacroPlan_MacroPlan_MappingProductInLane.qbl b/_Main/BL/Relations/Relation_MappingProductInLane_MacroPlan_MacroPlan_MappingProductInLane.qbl
deleted file mode 100644
index 22712fa..0000000
--- a/_Main/BL/Relations/Relation_MappingProductInLane_MacroPlan_MacroPlan_MappingProductInLane.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingProductInLane_MacroPlan_MacroPlan_MappingProductInLane
-{
-  #keys: '1[412960.0.86844662]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[412960.0.86844664][412960.0.86844663][412960.0.86844665]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingProductInLane
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingProductInLane
-  {
-    #keys: '3[412960.0.86844667][412960.0.86844666][412960.0.86844668]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl b/_Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl
new file mode 100644
index 0000000..64c3aef
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingProduct_MPSync_MPSync_MappingProduct
+{
+  #keys: '1[414384.0.736080633]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080635][414384.0.736080634][414384.0.736080636]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingProduct
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingProduct
+  {
+    #keys: '3[414384.0.736080638][414384.0.736080637][414384.0.736080639]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl b/_Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl
new file mode 100644
index 0000000..7af3e26
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingSalesSegment_MPSync_MPSync_MappingSalesSegment
+{
+  #keys: '1[414384.0.736080662]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080664][414384.0.736080663][414384.0.736080665]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingSalesSegment
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingSalesSegment
+  {
+    #keys: '3[414384.0.736080667][414384.0.736080666][414384.0.736080668]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingSalesSegment_MacroPlan_MacroPlan_MappingSalesSegment.qbl b/_Main/BL/Relations/Relation_MappingSalesSegment_MacroPlan_MacroPlan_MappingSalesSegment.qbl
deleted file mode 100644
index 691032b..0000000
--- a/_Main/BL/Relations/Relation_MappingSalesSegment_MacroPlan_MacroPlan_MappingSalesSegment.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingSalesSegment_MacroPlan_MacroPlan_MappingSalesSegment
-{
-  #keys: '1[414384.0.583160113]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.583160115][414384.0.583160114][414384.0.583160116]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingSalesSegment
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingSalesSegment
-  {
-    #keys: '3[414384.0.583160118][414384.0.583160117][414384.0.583160119]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl b/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl
new file mode 100644
index 0000000..f1c43b5
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure
+{
+  #keys: '1[414384.0.736080697]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080699][414384.0.736080698][414384.0.736080700]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingUnitOfMeasure
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingUnitOfMeasure
+  {
+    #keys: '3[414384.0.736080702][414384.0.736080701][414384.0.736080703]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MacroPlan_MacroPlan_MappingUnitOfMeasure.qbl b/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MacroPlan_MacroPlan_MappingUnitOfMeasure.qbl
deleted file mode 100644
index e01a2f2..0000000
--- a/_Main/BL/Relations/Relation_MappingUnitOfMeasure_MacroPlan_MacroPlan_MappingUnitOfMeasure.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingUnitOfMeasure_MacroPlan_MacroPlan_MappingUnitOfMeasure
-{
-  #keys: '1[414384.0.583160058]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[414384.0.583160060][414384.0.583160059][414384.0.583160061]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingUnitOfMeasure
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingUnitOfMeasure
-  {
-    #keys: '3[414384.0.583160063][414384.0.583160062][414384.0.583160064]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl b/_Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl
new file mode 100644
index 0000000..96a13c9
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MappingUnit_MPSync_MPSync_MappingUnit
+{
+  #keys: '1[414384.0.736080678]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.736080680][414384.0.736080679][414384.0.736080681]'
+    Cardinality: '0to1'
+    ObjectDefinition: MappingUnit
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MappingUnit
+  {
+    #keys: '3[414384.0.736080683][414384.0.736080682][414384.0.736080684]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MappingUnit_MacroPlan_MacroPlan_MappingUnit.qbl b/_Main/BL/Relations/Relation_MappingUnit_MacroPlan_MacroPlan_MappingUnit.qbl
deleted file mode 100644
index e226c90..0000000
--- a/_Main/BL/Relations/Relation_MappingUnit_MacroPlan_MacroPlan_MappingUnit.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation MappingUnit_MacroPlan_MacroPlan_MappingUnit
-{
-  #keys: '1[412960.0.96453721]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MacroPlan
-  {
-    #keys: '3[412960.0.96453723][412960.0.96453722][412960.0.96453724]'
-    Cardinality: '0to1'
-    ObjectDefinition: MappingUnit
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide MappingUnit
-  {
-    #keys: '3[412960.0.96453726][412960.0.96453725][412960.0.96453727]'
-    Cardinality: '1toN'
-    ObjectDefinition: MacroPlan
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Type_BaseConversionFactor/StaticMethod_DoSync.qbl b/_Main/BL/Type_BaseConversionFactor/StaticMethod_DoSync.qbl
deleted file mode 100644
index 0ee5894..0000000
--- a/_Main/BL/Type_BaseConversionFactor/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan
-)
-{
-  Description: '鍗曟鍚屾'
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "Product Finished, Start BaseConversionFactor Data Broker" )
-    macroPlan.Broker_OTD_BaseConversionFactor().Execute();
-    info( "BaseConversionFactor Data Broker Finished, Start BaseConversionFactor Mapping" )
-    macroPlan.MappingBaseConversionFactorData();
-  *]
-}
diff --git a/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl
deleted file mode 100644
index ece7264..0000000
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan,
-  Strings businessTypes
-)
-{
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "Forecast Finished, Start CustomerOrder Data Broker" );
-    macroPlan.Broker_OTD_CustomerOrder().Execute();
-    info( "CustomerOrder Data Broker Finished, Start CustomerOrder Mapping" );
-    macroPlan.MappingCustomerOrderData( businessTypes );
-  *]
-}
diff --git a/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl b/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl
deleted file mode 100644
index 401e158..0000000
--- a/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan,
-  Strings businessTypes
-)
-{
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "OperationCost Finished, Start Forecast Data Broker" );
-    macroPlan.Broker_OTD_Forecast().Execute();
-    info( "Forecast Data Broker Finished, Start Forecast Mapping" );
-    macroPlan.MappingForecastData( businessTypes );
-  *]
-}
diff --git a/_Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl b/_Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl
new file mode 100644
index 0000000..9802666
--- /dev/null
+++ b/_Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteIfExist (
+  MPSync mpSync,
+  String from,
+  String to,
+  String productId
+)
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    toDel := select( mpSync, IOBaseConversionFactor, item, 
+                     item.SourceUnitOfMeasureName() = from and item.TargetUnitOfMeasureName() = to and item.ProductID() = productId );
+    if( not isnull( toDel ) ) {
+      toDel.Delete();  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl b/_Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl
new file mode 100644
index 0000000..6636e3d
--- /dev/null
+++ b/_Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOBaseConversionFactor #extension
+{
+}
diff --git a/_Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl b/_Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl
new file mode 100644
index 0000000..474e3f5
--- /dev/null
+++ b/_Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteIfExist (
+  MPSync mpSync,
+  String currencyId,
+  Date start
+)
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    toDel := select( mpSync, IOCurrencyRate_MP, item, 
+                     item.CurrencyID() = currencyId and item.Start() = start );
+    if( not isnull( toDel ) ) {
+      toDel.Delete();  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl b/_Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl
new file mode 100644
index 0000000..21d526b
--- /dev/null
+++ b/_Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOCurrencyRate_MP #extension
+{
+}
diff --git a/_Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl b/_Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl
new file mode 100644
index 0000000..b476627
--- /dev/null
+++ b/_Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteIfExist (
+  MPSync mpSync,
+  String id
+)
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    toDel := select( mpSync, IOCurrency_MP, item, item.ID() = id );
+    if( not isnull( toDel ) ) {
+      toDel.Delete();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl b/_Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl
new file mode 100644
index 0000000..36fb030
--- /dev/null
+++ b/_Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOCurrency_MP #extension
+{
+}
diff --git a/_Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl b/_Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl
new file mode 100644
index 0000000..cfd3b35
--- /dev/null
+++ b/_Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteIfExist (
+  MPSync mpSync,
+  String id
+)
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    toDel := select( mpSync, IOLane, item, item.ID() = id );
+    if( not isnull( toDel ) ) {
+      toDel.Delete();  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl b/_Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl
new file mode 100644
index 0000000..66ac220
--- /dev/null
+++ b/_Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOLane #extension
+{
+}
diff --git a/_Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl
new file mode 100644
index 0000000..c6d4e89
--- /dev/null
+++ b/_Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateIfNotExist (
+  MPSync mpSync,
+  String id
+) as IOOperation
+{
+  TextBody:
+  [*
+    // yypsybs Sep-5-2023 (created)
+    result := select( mpSync, IOOperation, op, op.ID() = id );
+    if( isnull( result ) ) {
+      result := mpSync.IOOperation( relnew, 
+                          ID := id );
+    }
+    return result;
+  *]
+}
diff --git a/_Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl b/_Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl
new file mode 100644
index 0000000..3bb29a6
--- /dev/null
+++ b/_Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOOperation #extension
+{
+}
diff --git a/_Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl
new file mode 100644
index 0000000..3a636ab
--- /dev/null
+++ b/_Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateIfNotExist (
+  MPSync mpSync,
+  String id,
+  String name,
+  String parentId,
+  String uom
+) as IOProduct_MP
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    value := IOProduct_MP::FindById( mpSync, id );
+    if( isnull( value ) ) {
+      value := IOProduct_MP::Create( mpSync, id, name, "", uom );
+      if( parentId <> "" ) {
+        value.ParentID( parentId );
+      }
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl b/_Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl
new file mode 100644
index 0000000..b080495
--- /dev/null
+++ b/_Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FindById (
+  MPSync mpSync,
+  String id
+) as IOProduct_MP
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    result := select( mpSync, IOProduct_MP, item, item.ID() = id );
+    return result;
+  *]
+}
diff --git a/_Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl b/_Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl
new file mode 100644
index 0000000..e99d7ea
--- /dev/null
+++ b/_Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOProduct_MP #extension
+{
+}
diff --git a/_Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl
new file mode 100644
index 0000000..e5e10b1
--- /dev/null
+++ b/_Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateIfNotExist (
+  MPSync mpSync,
+  String routingId,
+  String name,
+  Number seq
+) as IORoutingStep
+{
+  TextBody:
+  [*
+    // yypsybs Sep-5-2023 (created)
+    value := select( mpSync, IORoutingStep, item, item.RoutingID() = routingId and item.Name() = name and item.SequenceNumberForExcel() = seq );
+    if( isnull( value ) ) {
+      mpSync.IORoutingStep( relnew, 
+                            RoutingID := routingId, 
+                            Name := name, 
+                            SequenceNumberForExcel := seq  );
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl b/_Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl
new file mode 100644
index 0000000..966b160
--- /dev/null
+++ b/_Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IORoutingStep #extension
+{
+}
diff --git a/_Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl b/_Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl
new file mode 100644
index 0000000..61c9d6b
--- /dev/null
+++ b/_Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateIfNotExistByTree (
+  MPSync mpSync,
+  String id,
+  String name,
+  String parentId,
+  String UOMName,
+  String currencyId,
+  Date startDate,
+  Date endDate,
+  String capacityType
+) as IOUnit
+{
+  TextBody:
+  [*
+    // yypsybs Sep-6-2023 (created)
+    value := IOUnit::FindById( mpSync, id );
+    if( isnull( value ) ) {
+      value := mpSync.IOUnit( relnew, 
+                     ID := id,
+                     Name := name, 
+                     ParentUnitID := parentId, 
+                     UnitOfMeasureName := UOMName, 
+                     CurrencyID := currencyId, 
+                     StartDate := startDate, 
+                     EndDate := endDate, 
+                     CapacityType := capacityType );
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_IOUnit/StaticMethod_FindById.qbl b/_Main/BL/Type_IOUnit/StaticMethod_FindById.qbl
new file mode 100644
index 0000000..8d1460c
--- /dev/null
+++ b/_Main/BL/Type_IOUnit/StaticMethod_FindById.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FindById (
+  MPSync mpSync,
+  String id
+) as IOUnit
+{
+  TextBody:
+  [*
+    // yypsybs Sep-6-2023 (created)
+    value := select( mpSync, IOUnit, item, item.ID() = id );
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl b/_Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl
new file mode 100644
index 0000000..4056a12
--- /dev/null
+++ b/_Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization IOUnit #extension
+{
+}
diff --git a/_Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl b/_Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl
new file mode 100644
index 0000000..43a9efe
--- /dev/null
+++ b/_Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteIfExist (
+  MPSync mpSync,
+  String name
+)
+{
+  TextBody:
+  [*
+    // yypsybs Sep-1-2023 (created)
+    toDel := select( mpSync, IOUnitOfMeasure_MP, item, 
+                     item.Name() = name );
+    if( not isnull( toDel ) ) {
+      toDel.Delete();  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoSync.qbl b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoSync.qbl
deleted file mode 100644
index 574ecd5..0000000
--- a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,15 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan
-)
-{
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "ActualPISPIP Finished, Start InventoryCost Data Broker" );
-    macroPlan.Broker_OTD_InventoryCost().Execute();
-    info( "InventoryCost Data Broker Finished, Start InventoryCost Mapping" );
-    macroPlan.MappingInventoryValueAndCostData();
-  *]
-}
diff --git a/_Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl b/_Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl
new file mode 100644
index 0000000..7e4e927
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetProductTypeByProductId (
+  String productId
+) as String
+{
+  TextBody:
+  [*
+    // yypsybs Sep-5-2023 (created)
+    values := selectvalues( this, MappingBOM, item, item.ProductCode() = productId, item.ProductType() );
+    value := "";
+    if( values.Size() > 0 ) {
+      value := values.Element( 0 );  
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl b/_Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl
new file mode 100644
index 0000000..0646b5f
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl
@@ -0,0 +1,91 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportDBDataCustom (
+  MacroPlan macroPlan,
+  Strings businessTypes,
+  Boolean isKeyProduct,
+  Boolean createPurchaseSupplyMaterial
+)
+{
+  Description: '灏嗚〃鐨勬暟鎹浆涓篒Oxxxx鐨勬暟鎹�'
+  TextBody:
+  [*
+    // Import data from DB
+    
+    // 鏁版嵁澶勭悊
+    
+    // 閿�鍞骇鍒強閿�鍞儴闂�
+    this.MappingSalesLevelData();
+    this.Broker_OTD_SalesSegment().Execute();
+    this.MappingSalesSegmentData( businessTypes );
+    
+    // 鍗曚綅鍙婂崟浣嶆崲绠�
+    this.Broker_OTD_UnitOfMeasure().Execute();
+    this.MappingUnitOfMeasureData();
+    this.Broker_OTD_BaseConversionFactor().Execute();
+    this.MappingBaseConversionFactorData();
+    
+    // 璐у竵鍙婅揣甯佹眹鐜�
+    this.MappingCurrencyData();
+    this.MappingCurrencyRateData();
+    
+    // 搴撳瓨鐐�
+    this.MappingStockingPointData();
+    
+    // 浜у搧
+    this.Broker_OTD_Product().Execute();
+    this.MappingProductData( businessTypes, isKeyProduct );
+    
+    // 璁㈠崟棰勬祴
+    this.Broker_OTD_Forecast().Execute();
+    this.MappingForecastData( businessTypes );
+    
+    // 璁㈠崟闇�姹�
+    this.Broker_OTD_CustomerOrder().Execute();
+    this.MappingCustomerOrderData( businessTypes );
+    
+    // 杞﹂亾
+    this.MappingLaneData();
+    // 杞﹂亾杩愯緭娈�
+    this.MappingLaneLegData();
+    // 渚涘簲缃戠粶锛堣溅閬擄級
+    this.Broker_OTD_ProductInLane().Execute();
+    this.MappingProductInLaneData();
+    
+    // routing routingStep unit operation operationLink operationInputGroup operationBOM
+    this.Broker_OTD_Operation().Execute();
+    this.Broker_OTD_BOM().Execute();
+    // 娓呯悊鏃ф暟鎹�
+    this.IOUnit( relflush );
+    this.IOOperation( relflush );
+    this.IOOperationLink( relflush );
+    this.IOOperationInputGroup( relflush );
+    // 澶勭悊鏁版嵁
+    this.MappingUnitData( businessTypes );
+    this.MappingOperationData( businessTypes );
+    // 娓呯悊鏃ф暟鎹�
+    this.IOOperationBOM( relflush );
+    // 澶勭悊鏁版嵁
+    this.MappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
+    
+    // 搴撳瓨鎴愭湰
+    this.Broker_OTD_InventoryCost().Execute();
+    this.MappingInventoryValueAndCostData();
+    
+    // 搴撳瓨鏁版嵁
+    this.Broker_OTD_ActualPISPIP().Execute();
+    this.MappingActualPISPIPData( businessTypes, isKeyProduct )
+    
+    // Update the LastImportFromDatabase time
+    this.LastImportTime( DateTime::ActualTime() );
+    // sync to mp
+    if( not isnull( macroPlan ) ) {
+      macroPlan.SynchronizeFromMPSync( this, false, 
+                                       true, true, true, true, true,
+                                       true, true, true, true, true,
+                                       true, true, true, true, true,
+                                       true, true, true, true, true,
+                                       true, true, true, true );  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl b/_Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl
new file mode 100644
index 0000000..afc3888
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingActualPISPIPData (
+  Strings businessTypes,
+  Boolean nuclear
+)
+{
+  TextBody:
+  [*
+    this.IOActualProductInStockingPointInPeriod( relflush );
+    // 鍏堟寜鍏抽敭鐗╂枡锛屽啀鎸塨usinessType绛涢�変骇鍝�
+    productList := selectset( this, MappingProduct, item, item.KeyProduct() = nuclear );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+      productList := selectset( productList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
+    }
+    productIdList := selectvalues( productList, Elements, item, item.ID() );
+    // 鏍规嵁浜у搧绛涢�夊簱瀛樻暟鎹�
+    traverse( this, MappingActualPISPIP, item, productIdList.Find( item.ProductID() ) >= 0 ) {
+      this.IOActualProductInStockingPointInPeriod( relnew, 
+                                                   ActualInventoryLevelEnd := item.ActualInventoryLevelEnd(), 
+                                                   // todo 纭浣跨敤褰撳墠鏃ユ湡杩樻槸鏁版嵁搴撴棩鏈�
+                                                   Date := item.Date(), 
+                                                   Description := item.Description(), 
+                                                   ManufacturedDate := item.ManufacturedDate(), 
+                                                   ProductID := item.ProductID(), 
+                                                   StockingPointID := item.StockingPointID() );
+                                                   
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl b/_Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl
new file mode 100644
index 0000000..78cf5e9
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingBaseConversionFactorData
+{
+  Description: 'ETL鏁版嵁杞ā鍨嬫暟鎹�'
+  TextBody:
+  [*
+    this.IOBaseConversionFactor( relflush );
+    traverse( this, MappingBaseConversionFactor, item ) {
+    //  IOBaseConversionFactor::DeleteIfExist( this, item.SourceUnitOfMeasureName(), item.TargetUnitOfMeasureName(), item.ProductId() );
+      this.IOBaseConversionFactor( relnew, 
+                                   SourceUnitOfMeasureName := item.SourceUnitOfMeasureName(),
+                                   TargetUnitOfMeasureName := item.TargetUnitOfMeasureName(),
+                                   ProductID := item.ProductId(),
+                                   UserFactor := item.Factor(), 
+                                   IsEnabled := item.IsEnabled() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl b/_Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl
new file mode 100644
index 0000000..b941727
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingCurencyRatesData (
+  JSON data
+)
+{
+  TextBody:
+  [*
+    data_length := data.Size();
+    for( i := 0; i < data_length; i++ )
+    {
+      datarow := data.Get( i );
+      currencyId := datarow.Get( "currencyid" ).GetString();
+      rate := [Real]datarow.Get( "rate" ).GetString();
+      startString := datarow.Get( "start" ).GetString();
+      years := [Number]startString.SubString( 0, 4 );
+      month := [Number]startString.SubString( 5, 2 );
+      day := [Number]startString.SubString( 8, 2 );
+      start := Date::Construct( years, month, day );
+      // 鍒犻櫎宸叉湁鐨�
+    //  IOCurrencyRate_MP::DeleteIfExist( this, currencyId, start );
+      this.IOCurrencyRate_MP( relnew, 
+                              CurrencyID := currencyId,
+                              Rate := rate,
+                              Start := start );
+    }
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_MappingCurrencyData\043670.qbl" "b/_Main/BL/Type_MPSync/Method_MappingCurrencyData\043670.qbl"
new file mode 100644
index 0000000..b5acd8e
--- /dev/null
+++ "b/_Main/BL/Type_MPSync/Method_MappingCurrencyData\043670.qbl"
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingCurrencyData (
+  JSON data
+)
+{
+  TextBody:
+  [*
+    data_length := data.Size();
+    for( i := 0; i < data_length; i++ )
+    {
+      datarow := data.Get( i );
+      id := datarow.Get( "id" ).GetString();
+      isBase := [Boolean]datarow.Get( "isbase" ).GetString();
+      name := datarow.Get( "name" ).GetString();
+      symbol := " ";
+      // 鍒犻櫎宸叉湁鐨�
+    //  IOCurrency_MP::DeleteIfExist( this, id );
+      this.IOCurrency_MP( relnew, 
+                          ID := id, IsBase := isBase, Name := name, Symbol := symbol );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl b/_Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl
new file mode 100644
index 0000000..8dae5ee
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingCurrencyData
+{
+  TextBody:
+  [*
+    this.IOCurrency_MP( relflush );
+    // 璐у竵淇℃伅
+    bodyNumber := "1";
+    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
+    address := "api-uat-sgc.tianma.cn";
+    url := "/otdService/https/GetCurrenciesInfo";
+    port := 443;
+    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
+    this.MappingCurrencyData( data );
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl b/_Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl
new file mode 100644
index 0000000..4335dd8
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingCurrencyRateData
+{
+  TextBody:
+  [*
+    this.IOCurrencyRate_MP( relflush );
+    // 璐у竵姹囩巼淇℃伅
+    bodynumber := "5";
+    postrequestbody := MPSync::ApiBuildPostRequestBody( bodynumber );
+    address := "api-uat-sgc.tianma.cn";
+    url := "/otdService/https/GetCurrencyRatesInfo";
+    port := 443;
+    data := MPSync::ApiResponesCheck( address, port, url, postrequestbody );
+    this.MappingCurencyRatesData( data );
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl b/_Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl
new file mode 100644
index 0000000..c15e946
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingCustomerOrderData (
+  Strings businessTypes
+)
+{
+  Description: 'ETL璁㈠崟棰勬祴'
+  TextBody:
+  [*
+    toDels := selectset( this, IOSalesDemandBase, item, item.istype( IOCustomerOrder ) );
+    traverse( toDels, Elements, toDel ) {
+      toDel.Delete();  
+    }
+    // 寰呭鐞嗘暟鎹�
+    toDealList := selectset( this, MappingCustomerOrder, item, true );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+        toDealList := selectset( toDealList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
+    }
+    // todo 娌acroPlan鎬庝箞鎼�
+    //queryStartDate := guard( DateTime::Now() - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
+    //queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
+    //listToDeal := selectset( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate );
+    // 澶勭悊
+    traverse( toDealList, Elements, item ) {
+      this.IOSalesDemandBase( relnew, 
+                              IOCustomerOrder, 
+                              ID := item.ID(), 
+                              CurrencyID := item.CurrencyID(), 
+                              PriorityName := item.PriorityName(),
+                              ProductID := item.ProductID(),
+                              SalesSegmentName := item.SalesSegmentName(), 
+                              StockingPointID := item.StockPointID(), 
+                              UnitOfMeasureName := item.UnitOfMeasureName(),
+                              CustomerID := item.CustomerID(),
+                              CustomerName := item.Customer(),
+                              OrderID := item.OrderID(), 
+                              OrderLineID := item.OrderLineID(),
+                              Price := item.Price(), 
+                              Quantity := item.Quantity(), 
+                              StartDate := item.OrderDate() );
+                              
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl b/_Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl
new file mode 100644
index 0000000..f077a13
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingExternalSupplyData (
+  Strings businessTypes,
+  Boolean nuclear
+)
+{
+  TextBody:
+  [*
+    //// renhao Aug-14-2023 (created)
+    //
+    //traverse( this,MappingExternalSupply,externalSupply){
+    //  product := select( this,MappingProduct,product,product.ID() = externalSupply.ProductID() and product.KeyProduct() = nuclear,true);
+    //  
+    //  if( not isnull( product)){
+    //    productMP :=  select( this,Product_MP,productMP,productMP.ID() = externalSupply.ProductID() ,true);
+    //    stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
+    //    if( not isnull(businessTypes)){
+    //    
+    //      for( i :=0 ;i < businessTypes.Size();i++ ){
+    //        businessType := businessTypes.Element( i);
+    //        if( product.BusinessType() = businessType and not product.IsCommon()){
+    //          InventorySupply::Create(externalSupply.ID(),productMP,stockingpoint,externalSupply.Date(),externalSupply.ManufacturedDate(),externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�",true);
+    //        }
+    //      }
+    //      
+    //    }else{
+    //      InventorySupply::Create(externalSupply.ID(),productMP,stockingpoint,externalSupply.Date(),externalSupply.ManufacturedDate(),externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�",true);
+    //    }
+    //    
+    //  }
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingForecastData.qbl b/_Main/BL/Type_MPSync/Method_MappingForecastData.qbl
new file mode 100644
index 0000000..bfc14c3
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingForecastData.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingForecastData (
+  Strings businessTypes
+)
+{
+  Description: 'ETL璁㈠崟棰勬祴'
+  TextBody:
+  [*
+    toDels := selectset( this, IOSalesDemandBase, item, item.istype( IOForecast ) );
+    traverse( toDels, Elements, toDel ) {
+      toDel.Delete();  
+    }
+    // 寰呭鐞嗘暟鎹�
+    listToDeal := selectset( this, MappingForecast, item, true );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+        listToDeal := selectset( listToDeal, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
+    }
+    // todo 娌acroPlan鎬庝箞鎼�
+    //queryStartDate := guard( DateTime::Now() - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
+    //queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
+    //listToDeal := selectset( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate );
+    // 澶勭悊
+    traverse( listToDeal, Elements, item ) {
+      this.IOSalesDemandBase( relnew, 
+                              IOForecast, 
+                              ID := item.ID(), 
+                              CurrencyID := item.CurrencyID(), 
+                              PriorityName := item.PriorityName(),
+                              SalesSegmentName := item.SalesSegmentName(),
+                              StockingPointID := item.StockingPointID(),
+                              UnitOfMeasureName := item.UnitOfMeasureName(),
+                              ProductID := item.ProductID(),
+                              StartDate := item.StartDate(), 
+                              EndDate := item.EndDate(), 
+                              Quantity := item.Quantity(),
+                              Price := item.Price());
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl b/_Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl
new file mode 100644
index 0000000..3a8d758
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingInventoryValueAndCostData
+{
+  TextBody:
+  [*
+    this.IOInventoryValueAndCost( relflush );
+    traverse( this, MappingInventoryValueAndCost, item ) {
+      this.IOInventoryValueAndCost( relnew, 
+                                    ID := item.ID(), 
+                                    AccountName := item.AccountName(), 
+                                    Cost := item.Cost(), 
+                                    CostDriver := item.CostDriver(), 
+                                    ProductID := item.ProductID(), 
+                                    Start := item.Start(), 
+                                    StockingPointID := item.StockingPointID() );     
+    }
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_MappingLaneData\043474.qbl" "b/_Main/BL/Type_MPSync/Method_MappingLaneData\043474.qbl"
new file mode 100644
index 0000000..5757549
--- /dev/null
+++ "b/_Main/BL/Type_MPSync/Method_MappingLaneData\043474.qbl"
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingLaneData (
+  JSON data
+)
+{
+  TextBody:
+  [*
+    dataLength := data.Size();
+    for( i := 0; i < dataLength; i++ ) {
+      dataRow := data.Get( i );
+      id := dataRow.Get( "id" ).GetString();
+      unitId := dataRow.Get( "unitid" ).GetString();
+      name := dataRow.Get( "name" ).GetString();
+      userLeadTimeHours := [Number]dataRow.Get( "userleadtime" ).GetString();
+      this.IOLane( relnew, 
+                   ID := id, 
+                   Name := name, 
+                   UnitID := unitId,
+                   UserLeadTime := Duration::Hours( userLeadTimeHours ) );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingLaneData.qbl b/_Main/BL/Type_MPSync/Method_MappingLaneData.qbl
new file mode 100644
index 0000000..8e84a76
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingLaneData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingLaneData
+{
+  TextBody:
+  [*
+    this.IOLane( relflush );
+    bodyNumber := "3";
+    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
+    address := "api-uat-sgc.tianma.cn";
+    url := "/otdService/https/GetLanesInfo";
+    port := 443;
+    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
+    this.MappingLaneData( data );
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_MappingLaneLegData\043257.qbl" "b/_Main/BL/Type_MPSync/Method_MappingLaneLegData\043257.qbl"
new file mode 100644
index 0000000..0b5adf8
--- /dev/null
+++ "b/_Main/BL/Type_MPSync/Method_MappingLaneLegData\043257.qbl"
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingLaneLegData (
+  JSON data
+)
+{
+  TextBody:
+  [*
+    dataLength := data.Size();
+    for( i := 0; i < dataLength; i++ ) {
+      dataRow := data.Get( i );
+      laneId := dataRow.Get( "laneid" ).GetString();
+      originStockingPointId := dataRow.Get( "originstockingpointid" ).GetString();
+      destinationStockingPointId := dataRow.Get( "destinationstockingpointid" ).GetString();
+      name := dataRow.Get( "name" ).GetString();
+      userLeadTimeHours := [Number]dataRow.Get( "userleadtime" ).GetString();
+      this.IOLaneLeg( relnew, 
+                      LaneID := laneId, 
+                      OriginStockingPointID := originStockingPointId, 
+                      DestinationStockingPointID := destinationStockingPointId,
+                      Name := name, 
+                      HasUserLeadTime := true,
+                      UserLeadTime := Duration::Hours( userLeadTimeHours ), 
+                      Start := Date::MinDate(), 
+                      End := Date::MaxDate(), 
+                      PreferenceBonus := 0.0,
+                      CO2Emission := 0.0 );           
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl b/_Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl
new file mode 100644
index 0000000..edd9206
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingLaneLegData
+{
+  TextBody:
+  [*
+    this.IOLaneLeg( relflush );
+    bodynumber := "4";
+    postRequestBody := MPSync::ApiBuildPostRequestBody( bodynumber );
+    address := "api-uat-sgc.tianma.cn";
+    url := "/otdService/https/GetLaneLegsInfo";
+    port := 443;
+    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
+    this.MappingLaneLegData( data );
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl
new file mode 100644
index 0000000..9e0eec0
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl
@@ -0,0 +1,181 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingOperationBOMData (
+  Strings businessTypes,
+  Boolean isKeyProduct,
+  Boolean createPurchaseSupplyMaterial
+)
+{
+  TextBody:
+  [*
+    // keyProduct
+    keyProductIds := selectuniquevalues( this, MappingProduct, prod, prod.KeyProduct() = true, prod.ID() );
+    // 鑾峰彇鏈夊簭鐨勫緟澶勭悊璁板綍
+    toDealOps := construct( MappingOperations );
+    toDealBoms := construct( MappingBOMs );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+        toDealOps := selectsortedset( this, MappingOperation, item, 
+                                      businessTypes.Find( item.BusinessType() ) >= 0 
+                                      and ( not isKeyProduct or keyProductIds.Find( item.ProductID() ) >= 0 ), 
+                                      item.SequenceNumber() );
+        toDealBoms := selectset( this, MappingBOM, item, 
+                                 businessTypes.Find( item.BusinessType() ) >= 0 
+                                 and ( not isKeyProduct or keyProductIds.Find( item.ComponentCode() ) >= 0 ) );
+    } else {
+        toDealOps := selectsortedset( this, MappingOperation, item, 
+                                      not isKeyProduct or keyProductIds.Find( item.ProductID() ) >= 0 , 
+                                      item.SequenceNumber() );
+        toDealBoms := selectset( this, MappingBOM, item, 
+                                 businessTypes.Find( item.BusinessType() ) >= 0
+                                 and ( not isKeyProduct or keyProductIds.Find( item.ComponentCode() ) >= 0 ) );
+    }
+    // 瀵规瘡涓猺outing璁$畻inputGroupId
+    inputGroupId := 1
+    // 瀵规瘡涓猂outing杩涜鎶曞叆浜у嚭澶勭悊
+    routingKeys := selectuniquevalues( toDealOps, Elements, item, item.OrganCode() + "_" + item.ProductID() );
+    traverse( routingKeys, Elements, routingKey ) {
+      // ==== 浜у嚭 ====
+      // 鎵炬渶澶eq
+      maxSeq := max( toDealOps, Elements, item, item.OrganCode() + "_" + item.ProductID() = routingKey, item.SequenceNumber() );
+      maxSeqElements := selectset( toDealOps, Elements, item, 
+                                   item.OrganCode() + "_" + item.ProductID() = routingKey and item.SequenceNumber() = maxSeq );
+      traverse( maxSeqElements, Elements, maxSeqELement ) {
+        operationId := maxSeqELement.OrganCode() + "_" + maxSeqELement.ProductID() + "_" + maxSeqELement.ProcessSection();
+        if( maxSeqELement.Line() <> "" ) {
+          operationId := operationId + "_" + maxSeqELement.Line();
+        }
+        this.IOOperationBOM( relnew, 
+                             OperationID := operationId, 
+                             ProductID := maxSeqELement.ProductID(), 
+                             StockingPointID := maxSeqELement.OrganCode() + "_" + this.GetProductTypeByProductId( maxSeqELement.ProductID() ) + "_STOCK", 
+                             Quantity := 1, 
+                             IsInput := false );
+      }
+      // ==== 鎶曞叆 ====
+      // 瀵筄peration涓殑姣忎釜ProcessSection锛� 鎵緎eq鏈�灏忕殑list锛屾瘡鏉om瀵硅list鐢熸垚operationBOM
+      processSectionList := selectuniquevalues( toDealOps, Elements, toDeal, 
+                                                toDeal.OrganCode() + "_" + toDeal.ProductID() = routingKey,
+                                                toDeal.ProcessSection() );
+      traverse( processSectionList, Elements, processSection ) {
+        minSeq := min( toDealOps, Elements, item, 
+                       item.OrganCode() + "_" + item.ProductID() = routingKey 
+                       and item.ProcessSection() = processSection,
+                       item.SequenceNumber() );
+        operationRecordsWithMinSeq := selectset( toDealOps, Elements, minSeqWithProcessSectionElement, 
+                                                 minSeqWithProcessSectionElement.OrganCode() + "_" + minSeqWithProcessSectionElement.ProductID() = routingKey 
+                                                 and minSeqWithProcessSectionElement.ProcessSection() = processSection
+                                                 and minSeqWithProcessSectionElement.SequenceNumber() = minSeq );
+        bomRecords := selectset( toDealBoms, Elements, bom, 
+                                 bom.OrganCode() + "_" + bom.ProductCode() = routingKey 
+                                 and bom.ProcessSection() = processSection );
+        // 鎸夋槸鍚︽湁鏇挎崲鏂欏垎缁�
+        bomWithoutAlters := selectset( bomRecords, Elements, bomRecord, bomRecord.AlternativeMaterialCode() = "" );
+        bomWithAlters := selectset( bomRecords, Elements, bomRecord, bomRecord.AlternativeMaterialCode() <> "" );
+        // 澶勭悊涓嶅甫鏇挎崲鏂欑殑input
+        traverse( operationRecordsWithMinSeq, Elements, op ) {
+          traverse( bomWithoutAlters, Elements, bom ) {
+            operationId := op.OrganCode() + "_" + op.ProductID() + "_" + op.ProcessSection();
+            if( op.Line() <> "" ) {
+              operationId := operationId + "_" + op.Line();
+            }
+            this.IOOperationBOM( relnew, 
+                                 OperationID := operationId, 
+                                 ProductID := op.ProductID(),
+                                 StockingPointID := op.OrganCode() + "_" + bom.ComponentType() + "_STOCK", 
+                                 IsInput := true, 
+                                 Quantity := bom.UnitUsageOfComponents() / bom.ComponentOutputRate() );           
+          }
+        }
+        // 澶勭悊甯︽浛鎹㈡枡鐨勶紝鎸塴ine鍜屼富鏂欏垎缁�
+        lineList := selectuniquevalues( operationRecordsWithMinSeq, Elements, item, item.Line() );
+        mainProdList := selectuniquevalues( bomWithAlters, Elements, item, item.ComponentCode() );
+        traverse( lineList, Elements, line ) {
+          opWithLine := select( operationRecordsWithMinSeq, Elements, item, item.Line() = line );
+          opId := opWithLine.OrganCode() + "_" + opWithLine.ProductID() + "_" + opWithLine.ProcessSection();
+          if( opWithLine.Line() <> "" ) {
+            opId := opId + "_" + opWithLine.Line();
+          }
+          traverse( mainProdList, Elements, mainProd ) {
+            // 姣忕涓绘枡涓�涓猤roup
+            inputGroupId := inputGroupId + 1;
+            bomWithMainProdList := selectset( bomWithAlters, Elements, item, item.ComponentCode() = mainProd );
+            bomRandom := bomWithMainProdList.First();
+            // 鎬绘暟閲�
+            maxQuantityInGroup := bomRandom.UnitUsageOfComponents() / bomRandom.ComponentOutputRate();
+            // 鏇夸唬鏂欐�绘瘮渚�
+            alterRateTotal := sum( bomWithMainProdList, Elements, item, item.AlternativeRate() );
+            // 鍒涘缓inputGroup
+            this.IOOperationInputGroup( relnew, InputGroupID := inputGroupId, OperationID := opId, InputGroupQuantity := maxQuantityInGroup );
+            // 鍒涘缓涓绘枡鐨刬nput bom
+            this.IOOperationBOM( relnew, 
+                                 OperationID := opId, 
+                                 InputGroupID := inputGroupId,
+                                 ProductID := bomRandom.ComponentCode(),
+                                 StockingPointID := bomRandom.OrganCode() + "_" + bomRandom.ComponentType() + "_STOCK", 
+                                 IsInput := true, 
+                                 Quantity := maxQuantityInGroup * ( 1 - alterRateTotal ), 
+                                 MinQuantityInGroup := 0.0, 
+                                 MaxQuantityInGroup := maxQuantityInGroup );  
+            // 鏇夸唬鏂檌nput bom
+            traverse( bomWithMainProdList, Elements, bom ) {
+              this.IOOperationBOM( relnew, 
+                         OperationID := opId, 
+                         InputGroupID := inputGroupId,
+                         ProductID := bom.AlternativeMaterialCode(),
+                         StockingPointID := bom.OrganCode() + "_" + bom.ComponentType() + "_STOCK", 
+                         IsInput := true, 
+                         Quantity := maxQuantityInGroup * bom.AlternativeRate(), 
+                         MinQuantityInGroup := 0.0, 
+                         MaxQuantityInGroup := maxQuantityInGroup );  
+            }
+          }
+        }
+      }
+      // 閽堝姣忎釜routing 閲嶇疆 inputGroupId
+      inputGroupId := 1;
+    }
+    // 瀵规瘡涓狾rgCode_ComponentCode缁勫悎锛屽垱寤洪噰璐璻outing
+    if( createPurchaseSupplyMaterial ) {
+      toCreateKeys := selectuniquevalues( toDealBoms, Elements, bom,
+                                          bom.ComponentType() = "P", 
+                                          bom.OrganCode() + "_" + bom.ComponentCode() );
+      traverse( toCreateKeys, Elements, toCreateKey ) {
+        bomRandom := selectset( toDealBoms, Elements, bom, bom.ComponentType() = "P" and bom.OrganCode() + "_" + bom.ComponentCode() = toCreateKey ).First();
+        routingId := bomRandom.OrganCode() + "_" + bomRandom.ComponentCode();
+        routingName := routingId;
+        routingStepName := "閲囪喘";
+        routingStepSeq := 1;
+        operationId := "PR_" + bomRandom.OrganCode() + bomRandom.ComponentCode();
+        operationName := operationId;
+        unitId := "渚涘簲鍟�";
+        // ==== 鍒涘缓 ====
+        // 鍒涘缓routing
+        this.IORouting( relnew, 
+                        ID := routingId, Name := routingName, IsEnabled := true, Start := Date::MinDate(), End := Date::MaxDate() );
+        // 鍒涘缓routingStep
+        IORoutingStep::CreateIfNotExist( this, 
+                                     routingId,
+                                     routingStepName,
+                                     routingStepSeq );
+        // 鍒涘缓op
+        ioOp := IOOperation::CreateIfNotExist( this, operationId );
+        ioOp.UnitID( unitId );
+        ioOp.RoutingID( routingId );
+        ioOp.RoutingStepName( routingStepName );
+        ioOp.Name( operationName );
+        ioOp.UserLeadTime( Duration::Zero() );
+        ioOp.Throughput( 1.0 );
+        ioOp.HasUserMaximumQuantity( false );
+        ioOp.UserMinimumQuantity( Real::MinReal() );
+        ioOp.UserMaximumQuantity( Real::MaxReal() );
+        // 鍒涘缓opBOM
+        this.IOOperationBOM( relnew, 
+                   OperationID := operationId, 
+                   ProductID := bomRandom.ComponentCode(),
+                   StockingPointID := bomRandom.OrganCode() + "_" + bomRandom.ProductType() + "_STOCK", 
+                   IsInput := true, 
+                   Quantity := 1 );  
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl b/_Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl
new file mode 100644
index 0000000..30509c6
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl
@@ -0,0 +1,55 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingOperationCostData (
+  Strings businesstypes
+)
+{
+  Description: 'Get operation cost data from operation mapping'
+  TextBody:
+  [*
+    //// Administrator Aug-21-2023 (created)
+    //// list to deal
+    //listtodeal := construct( structured[MappingOperation] );
+    //
+    //if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
+    //    listtodeal := selectset( this, MappingOperation, item, true );
+    //} else {
+    //    listtodeal := selectset( this, MappingOperation, item, businesstypes.Find( item.BusinessType() ) <> -1 );
+    //}
+    //
+    //// Get the list to deal with max sequence number
+    //listtodealwithmaxsn := construct( structured[MappingOperation] );
+    //traverse( listtodeal, Elements, item ){
+    //  maxsn := maxselect( this, 
+    //                      MappingOperation, 
+    //                      moperation, 
+    //                      moperation.OrganCode() = item.OrganCode(), 
+    //                      moperation.ProductID() = item.ProductID(), 
+    //                      moperation.SequenceNumber() ).SequenceNumber()
+    //  if( item.SequenceNumber() = maxsn ){
+    //    listtodealwithmaxsn.Add( item );
+    //    }
+    //  }
+    //
+    //// Get the operation cost data
+    //traverse( listtodealwithmaxsn, Elements, item ){
+    //  id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection() + "_" + item.Line();
+    //  operation := Operation::FindOperationTypeIndex( id );
+    //  account := Account_MP::FindByName( this, "Operation cost" );
+    //  isfromdb := false;
+    //  existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
+    //  if( isnull( existoperationcost ) ){
+    //    connecteditem := select( this, 
+    //                             MappingOperationCost, 
+    //                             moperationcost, 
+    //                             moperationcost.OrgCode() = item.OrganCode(), 
+    //                             moperationcost.ProductID() = item.ProductID() );
+    //    cost := connecteditem.Cost();
+    //    lengthoftime := connecteditem.LengthOfTime();
+    //    start := connecteditem.Start();
+    //    timeunit := connecteditem.TimeUnit();
+    //    OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
+    //    }
+    //  }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingOperationData.qbl b/_Main/BL/Type_MPSync/Method_MappingOperationData.qbl
new file mode 100644
index 0000000..556db60
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingOperationData.qbl
@@ -0,0 +1,102 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingOperationData (
+  Strings businessTypes
+)
+{
+  TextBody:
+  [*
+    // 鑾峰彇鏈夊簭鐨勫緟澶勭悊璁板綍
+    toDealList := construct( MappingOperations );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+        toDealList := selectsortedset( this, MappingOperation, item, 
+                                       businessTypes.Find( item.BusinessType() ) >= 0, 
+                                       item.SequenceNumber() );
+    } else {
+        toDealList := selectsortedset( this, MappingOperation, item, 
+                                       true, 
+                                       item.SequenceNumber() );
+    }
+    // 鍒犻櫎鍘熸湁routing
+    this.IORouting( relflush );
+    // 鏂皉outing
+    routingIdList := selectuniquevalues( toDealList, Elements, item, item.OrganCode() + "_" + item.ProductID() );
+    traverse( routingIdList, Elements, routingId ) {
+      this.IORouting( relnew, 
+                      ID := routingId, Name := routingId, IsEnabled := true );
+    }
+    // 鍒犻櫎鍘熸湁routingStep
+    this.IORoutingStep( relflush );
+    // 鏂皉outingStep
+    traverse( toDealList, Elements, op ) {
+      routingId := op.OrganCode() + "_" + op.ProductID();
+      routingStepName := op.ProcessSection() + "_" + [String]op.SequenceNumber();
+      IORoutingStep::CreateIfNotExist( this, 
+                                       routingId,
+                                       routingStepName,
+                                       op.SequenceNumber() );
+    }
+    // 鏂皁peration
+    traverse( toDealList, Elements, op ) {
+      // 姹囨�绘暟鎹�
+      routingId := op.OrganCode() + "_" + op.ProductID();
+      routingStepName := op.ProcessSection() + "_" + [String]op.SequenceNumber();
+      opId := op.OrganCode() + "_" + op.ProductID() + "_" + op.ProcessSection();
+      unitId := op.OrganCode() + "_" + op.PlantName() + "_" + op.ProcessSection();
+      if( op.Line() <> "" ) {
+        opId := opId + "_" + op.Line();
+        unitId := unitId + "_" + op.Line();
+      }
+      opName := opId;
+      // 鏂板缓
+      ioOp := IOOperation::CreateIfNotExist( this, opId );
+      ioOp.UnitID( unitId );
+      ioOp.RoutingID( routingId );
+      ioOp.RoutingStepName( routingStepName );
+      ioOp.Name( opName );
+      ioOp.UserLeadTime( Duration::Hours( op.UserLeadTime() ) );
+      ioOp.Throughput( op.ActualCapacity() );
+      ioOp.UserMinimumQuantity( op.MinimumQuantity() );
+      ioOp.UserMaximumQuantity( op.MaximumQuantity() );
+      ioOp.HasUserMaximumQuantity( op.MaximumQuantity() <> 0.0 );
+    }
+    // 鎸� OrganCode + ProductID 鍒嗙粍 + 鎺掑簭
+    keyList := selectuniquevalues( toDealList, Elements, op, 
+                                   op.OrganCode() + "_" + op.ProductID() );
+    keyList := selectsortedset( keyList, Elements, str, str );
+    traverse( keyList, Elements, key ) {
+      previousList := construct( MappingOperations );
+      // 鎸� SequenceNumber 鍒嗙粍 + 鎺掑簭
+      subKeyList := selectuniquevalues( toDealList, Elements, op, 
+                                        key = op.OrganCode() + "_" + op.ProductID(),
+                                        op.SequenceNumber() );
+      subKeyList := selectsortedset( subKeyList, Elements, seq, seq );
+      // 閬嶅巻姣忎釜Seq锛屼笌鍓嶄竴涓猯ist杩涜杩炴帴锛屽悓鏃跺垱寤篻roup
+      traverse( subKeyList, Elements, seq ) {
+        elementList := selectset( this, MappingOperation, op, 
+                                  op.OrganCode() + "_" + op.ProductID() = key and op.SequenceNumber() = seq );
+        if( not isnull( previousList ) and previousList.Size() > 0 ) {
+          // 瀵规瘡涓洰鏍囧垱寤篿nputGroup
+          if( previousList.Size() > 1 ) {
+            traverse( elementList, Elements, targetOp ) {
+              targetOpId := targetOp.OrganCode() + "_" + targetOp.ProductID() + "_" + targetOp.ProcessSection();
+              this.IOOperationInputGroup( relnew, InputGroupID := 1, OperationID := targetOpId, InputGroupQuantity := 1 );
+            }
+          }
+          // 婧愪笌鐩爣涓や袱鍒涘缓operationLink
+          traverse( elementList, Elements, targetOp ) {
+            traverse( previousList, Elements, sourceOp ) {
+              sourceOpId := sourceOp.OrganCode() + "_" + sourceOp.ProductID() + "_" + sourceOp.ProcessSection();
+              targetOpId := targetOp.OrganCode() + "_" + targetOp.ProductID() + "_" + targetOp.ProcessSection();
+              this.IOOperationLink( relnew, 
+                                    SourceOperationID := sourceOpId, DestOperationID := targetOpId, 
+                                    SourceGroupID := 1, DestGroupID := 1, SourceQuantity := 1, DestQuantity := 1 / previousList.Size(), 
+                                    DestHasUserQuantity := false, DestMinQuantity := 0, DestMaxQuantity := 1 );
+            }  
+          }
+        }
+        previousList := elementList;
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingProductData.qbl b/_Main/BL/Type_MPSync/Method_MappingProductData.qbl
new file mode 100644
index 0000000..4a5f907
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingProductData.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingProductData (
+  Strings businesstypes,
+  Boolean iskeyproduct
+)
+{
+  Description: 'Method to get needed data from mapping product data'
+  TextBody:
+  [*
+    // 娓呴櫎鏃ф暟鎹�
+    this.IOProduct_MP( relflush );
+    // list to deal
+    listToDeal := construct( structured[MappingProduct] );
+    if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
+      if( iskeyproduct = true ){
+        listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true );
+      } else {
+        listToDeal := selectset( this, MappingProduct, item, true );
+      }
+    } else {
+      if( iskeyproduct = true ){
+        listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true, businesstypes.Find( item.BusinessType() ) <> -1 or businesstypes.Find( item.CommonBusiness() ) <> -1 );
+      } else {
+        listToDeal := selectset( this, MappingProduct, item, businesstypes.Find( item.BusinessType() ) <> -1 or businesstypes.Find( item.CommonBusiness() ) <> -1 );
+      }
+    }
+    // 鍒涘缓鏍逛骇鍝�
+    IOProduct_MP::CreateIfNotExist( this, "鍏ㄩ儴鐗╂枡浜у搧", "鍏ㄩ儴鐗╂枡浜у搧", "", "PCS" );
+    // 澶勭悊鏂颁俊鎭�
+    traverse( listToDeal, Elements, item ) {
+      // 鍒涘缓鐖朵骇鍝�
+      IOProduct_MP::CreateIfNotExist( this, item.ProductMajorType(), item.ProductMajorType(), "鍏ㄩ儴鐗╂枡", "PCS" );
+      IOProduct_MP::CreateIfNotExist( this, item.ProductSubclassType(), item.ProductSubclassType(), item.ProductMajorType(), "PCS" );
+      // 鍒涘缓浜у搧
+      this.IOProduct_MP( relnew, 
+                         ID := item.ID(), 
+                         Name := item.Name(), 
+                         ParentID := item.ProductSubclassType(), 
+                         UOMName := item.UnitOfMeasureName(),
+                         // todo ?
+                         HasShelfLife := true, 
+                         ShelfLife := item.ShelfLife(),
+                         Notes := item.Notes() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl b/_Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl
new file mode 100644
index 0000000..4b1a242
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingProductInLaneData
+{
+  Description: 'Get Product In Line data'
+  TextBody:
+  [*
+    this.IOProductInLane( relflush );
+    traverse( this, MappingProductInLane, item ){
+      this.IOProductInLane( relnew, 
+                            LaneID := item.LineID(),
+                            ProductID := item.ProductID() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl b/_Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl
new file mode 100644
index 0000000..0baf2aa
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingSalesLevelData
+{
+  TextBody:
+  [*
+    this.IOSalesLevel_MP( relflush );
+    this.IOSalesLevel_MP( relnew, 
+                          Level := 0,
+                          Name := "钀ラ攢涓績" );
+    this.IOSalesLevel_MP( relnew, 
+                          Level := 1,
+                          Name := "閿�鍞" );
+    this.IOSalesLevel_MP( relnew, 
+                          Level := 2,
+                          Name := "瀹㈡埛" );
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl b/_Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl
new file mode 100644
index 0000000..8313619
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingSalesSegmentData (
+  Strings businessTypes
+)
+{
+  Description: 'ETL閿�鍞儴闂�'
+  TextBody:
+  [*
+    this.IOSalesSegment_MP( relflush );
+    toDealList := selectset( this, MappingSalesSegment, item, true );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+        toDealList := selectset( toDealList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
+    }
+    traverse( toDealList, Elements, item ) {
+        this.IOSalesSegment_MP( relnew, 
+                                Name := item.Name(), 
+                                ParentName := item.ParentName(),
+                                DisplayIndex := item.DisplayIndex() );
+    }
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_MappingStockingPointData\043321.qbl" "b/_Main/BL/Type_MPSync/Method_MappingStockingPointData\043321.qbl"
new file mode 100644
index 0000000..cfe65b5
--- /dev/null
+++ "b/_Main/BL/Type_MPSync/Method_MappingStockingPointData\043321.qbl"
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingStockingPointData (
+  JSON data
+)
+{
+  TextBody:
+  [*
+    dataLength := data.Size();
+    for( i:=0; i < dataLength; i++ )
+    {
+      dataRow := data.Get( i );
+      id := dataRow.Get( "id" ).GetString();
+      unitId := dataRow.Get( "unitid" ).GetString();
+      name := dataRow.Get( "name" ).GetString();
+      this.IOStockingPoint_MP( relnew, 
+                               ID := id, 
+                               Name := name, 
+                               UnitID := unitId, 
+                               CurrencyID := "CNY", 
+                               UnitOfMeasureName := "PCS",
+                               IsPlannedInfinite := false,
+                               GroupName := " ",
+                               Notes := " ", 
+                               Start := Date::MinDate(), 
+                               End := Date::MaxDate() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl b/_Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl
new file mode 100644
index 0000000..b09b6be
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingStockingPointData
+{
+  TextBody:
+  [*
+    this.IOStockingPoint_MP( relflush );
+    bodyNumber := "2";
+    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
+    address := "api-uat-sgc.tianma.cn";
+    port := 443;
+    url := "/otdService/https/GetStockingPointsInfo";
+    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
+    this.MappingStockingPointData( data );
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingUnitData.qbl b/_Main/BL/Type_MPSync/Method_MappingUnitData.qbl
new file mode 100644
index 0000000..eaec58b
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingUnitData.qbl
@@ -0,0 +1,52 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingUnitData (
+  Strings businessTypes
+)
+{
+  Description: 'Get unit data from operation mapping'
+  TextBody:
+  [*
+    listToDeal := selectset( this, MappingOperation, item, true );
+    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+      listToDeal := selectset( this, MappingOperation, item, businessTypes.Find( item.BusinessType() ) >= 0 );
+    }
+    // 甯搁噺
+    unitOfMeasureName := "PCS";
+    currencyId := "CNY";
+    startDate := Date::Date( 1900, 1, 1 );
+    endDate := Date::Date( 9999, 12, 31 );
+    capacityType := "Infinite";
+    // 閫愮骇鍒涘缓
+    IOUnit::CreateIfNotExistByTree( this, "澶╅┈闆嗗洟", "澶╅┈闆嗗洟", "", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+    IOUnit::CreateIfNotExistByTree( this, "鐢熶骇", "鐢熶骇", "澶╅┈闆嗗洟", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+    IOUnit::CreateIfNotExistByTree( this, "渚涘簲鍟�", "渚涘簲鍟�", "澶╅┈闆嗗洟", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+    IOUnit::CreateIfNotExistByTree( this, "鏁磋溅杩愯緭", "鏁磋溅杩愯緭", "澶╅┈闆嗗洟", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+    // 鏍规嵁operation鍒涘缓
+    traverse( listToDeal, Elements, op ) {
+      // 涓�绾� orgCode
+      levelOne := op.OrganCode();
+      IOUnit::CreateIfNotExistByTree( this, 
+                                      levelOne, op.OrganName(), "鐢熶骇", 
+                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+      // 浜岀骇 orgCode + plantName
+      levelTwo := op.OrganCode() + "_" + op.PlantName();
+      IOUnit::CreateIfNotExistByTree( this, 
+                                      levelTwo, levelTwo, levelOne, 
+                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+      // 涓夌骇 浜岀骇 + processSection
+      levelThree := levelTwo + "_" + op.ProcessSection();
+      IOUnit::CreateIfNotExistByTree( this, 
+                                      levelThree, levelThree, levelTwo, 
+                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+      // 鍥涚骇 涓夌骇 + line
+      if( op.Line() <> "" ) {
+        levelFour := levelThree + "_" + op.Line();
+        IOUnit::CreateIfNotExistByTree( this, 
+                                        levelFour, levelFour, levelThree, 
+                                        unitOfMeasureName, currencyId, startDate, endDate, capacityType );
+      }
+      
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl b/_Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl
new file mode 100644
index 0000000..066fe15
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method MappingUnitOfMeasureData
+{
+  Description: 'ETL鏁版嵁杞ā鍨嬫暟鎹�'
+  TextBody:
+  [*
+    this.IOUnitOfMeasure_MP( relflush );
+    traverse( this, MappingUnitOfMeasure, item ) {
+    //  IOUnitOfMeasure_MP::DeleteIfExist( this, item.Name() );
+      this.IOUnitOfMeasure_MP( relnew, IsDefault := item.IsDefault(), Name :=  item.Name() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl b/_Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl
new file mode 100644
index 0000000..d7495b1
--- /dev/null
+++ b/_Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ApiBuildPostRequestBody (
+  String bodynumber
+) as String
+{
+  TextBody:
+  [*
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    
+    info( DateTime::Now().Format( "Y-M2-D2 H:m:s" ) );
+    postrequestbodystring := postrequestbody.AsString();
+    
+    return postrequestbodystring;
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl b/_Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl
new file mode 100644
index 0000000..ac1f3c0
--- /dev/null
+++ b/_Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl
@@ -0,0 +1,54 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ApiResponesCheck (
+  String address,
+  Number port,
+  String path,
+  String postrequestbody
+) as owning JSON
+{
+  TextBody:
+  [*
+    // for HTTPS requests:
+    i := HTTPInterface::Create( address, port );
+    //i := HTTPInterface::Create( address ,443);
+    info( address, port, path, postrequestbody );
+    
+    i.URL(path);
+    //i.SSL(false);
+    i.SSL(true);
+    i.SSLKeystore('MyKeystore'); // created in the Config Utility
+    
+    i.PostMethod(true); //it's a POST method
+    
+    i.Call(postrequestbody); // Call's argument is for POST method's content.
+    htmlresult := i.Result();
+    
+    htmlresponse := JSON::Parse( htmlresult );
+    
+    code := htmlresponse.Get( "resultCode" ).GetString();
+    message := htmlresponse.Get( "resultMsg" );
+    data := htmlresponse.Get( "responseData" );
+    datalist := data.Get( "dataList" );
+    
+    if( code = "1" )
+    {
+      info( "Data have been written into table" );
+      }
+    else
+    {
+      messagestring := " ";
+      if ( message.IsNull() )
+      {
+        messagestring := "No message returns!";
+        }
+      else
+      {
+        messagestring := message.GetString();
+        }
+      info( "Error! error code: " + code + ", error message: " + messagestring );
+      }
+    
+    return &datalist;
+  *]
+}
diff --git a/_Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl b/_Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl
new file mode 100644
index 0000000..2e63828
--- /dev/null
+++ b/_Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MPSync #extension
+{
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
index 87cbdf3..2b6b764 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
@@ -7,44 +7,44 @@
 {
   TextBody:
   [*
-    // renhao Aug-14-2023 (created)
-    date := Date :: Today();
-    listtodeal := selectset( this,MappingActualPISPIP,actual,not isnull( Product_MP::FindById( this, actual.ProductID() ) ) );
-    totalcount := listtodeal.Size();
-    info( "ActualPISPIP has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    traverse( listtodeal,Elements,actual){
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 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( this,MappingProduct,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
-      if( not isnull( product)){
-      if( not isnull(businessTypes)){
-      
-        for( i :=0 ;i < businessTypes.Size();i++ ){
-          businessType := businessTypes.Element( i);
-          if( product.BusinessType() = businessType and not product.IsCommon()){
-            ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
-                                                                  actual.ProductID(),
-                                                                  actual.StockingPointID(),
-                                                                  actual.Description(),
-                                                                  actual.ActualInventoryLevelEnd(),
-                                                                  actual.ManufacturedDate());
-          }
-        }
-        
-      }else{
-        ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
-                                                              actual.ProductID(),
-                                                              actual.StockingPointID(),
-                                                              actual.Description(),
-                                                              actual.ActualInventoryLevelEnd(),
-                                                              actual.ManufacturedDate());
-      }
-        
-      }
-    }
+    //// renhao Aug-14-2023 (created)
+    //date := Date :: Today();
+    //listtodeal := selectset( this,MappingActualPISPIP,actual,not isnull( Product_MP::FindById( this, actual.ProductID() ) ) );
+    //totalcount := listtodeal.Size();
+    //info( "ActualPISPIP has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //traverse( listtodeal,Elements,actual){
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 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( this,MappingProduct,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
+    //  if( not isnull( product)){
+    //  if( not isnull(businessTypes)){
+    //  
+    //    for( i :=0 ;i < businessTypes.Size();i++ ){
+    //      businessType := businessTypes.Element( i);
+    //      if( product.BusinessType() = businessType and not product.IsCommon()){
+    //        ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
+    //                                                              actual.ProductID(),
+    //                                                              actual.StockingPointID(),
+    //                                                              actual.Description(),
+    //                                                              actual.ActualInventoryLevelEnd(),
+    //                                                              actual.ManufacturedDate());
+    //      }
+    //    }
+    //    
+    //  }else{
+    //    ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
+    //                                                          actual.ProductID(),
+    //                                                          actual.StockingPointID(),
+    //                                                          actual.Description(),
+    //                                                          actual.ActualInventoryLevelEnd(),
+    //                                                          actual.ManufacturedDate());
+    //  }
+    //    
+    //  }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingBaseConversionFactorData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingBaseConversionFactorData.qbl
index f0a87c2..eb0cfc7 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingBaseConversionFactorData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingBaseConversionFactorData.qbl
@@ -5,16 +5,16 @@
   Description: 'ETL鏁版嵁杞ā鍨嬫暟鎹�'
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    traverse( this, MappingBaseConversionFactor, item ) {
-      //濡傛灉ProductID涓嶄负绌猴紝涓斿尮閰嶄笉鍒癙roduct锛屽垯涓嶅垱寤猴紝杩斿洖涓虹┖
-    //    info( item.ProductId().AsQUILL() );
-        BaseConversionFactor::CreateOrUpdate( this, 
-                                              item.SourceUnitOfMeasureName(), 
-                                              item.TargetUnitOfMeasureName(), 
-                                              item.IsEnabled(), 
-                                              item.ProductId(), 
-                                              item.Factor() );
-    }
+    //// yypsybs Aug-15-2023 (created)
+    //traverse( this, MappingBaseConversionFactor, item ) {
+    //  //濡傛灉ProductID涓嶄负绌猴紝涓斿尮閰嶄笉鍒癙roduct锛屽垯涓嶅垱寤猴紝杩斿洖涓虹┖
+    ////    info( item.ProductId().AsQUILL() );
+    //    BaseConversionFactor::CreateOrUpdate( this, 
+    //                                          item.SourceUnitOfMeasureName(), 
+    //                                          item.TargetUnitOfMeasureName(), 
+    //                                          item.IsEnabled(), 
+    //                                          item.ProductId(), 
+    //                                          item.Factor() );
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
index 873ed35..c1421d2 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
@@ -7,39 +7,39 @@
   Description: 'ETL璁㈠崟棰勬祴'
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    // 寰呭鐞嗘暟鎹�
-    listToDeal := construct( structured[MappingCustomerOrder] );
-    if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
-        listToDeal := selectset( this, MappingCustomerOrder, item, true );
-    } else {
-        listToDeal := selectset( this, MappingCustomerOrder, item, businessTypes.Find( item.BusinessType() ) <> -1 );
-    }
-    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( listToDeal, Elements, item, item.OrderDate() >= queryStartDate and item.OrderDate() <= queryEndDate, not isnull( Product_MP::FindById( this, item.ProductID() ) ) and not isnull( StockingPoint_MP::FindById( this, item.StockPointID() ) ) and not isnull( SalesSegment_MP::FindByName( this, item.SalesSegmentName() ) ) );
-    
-    totalcount := listToDeal.Size();
-    info( "CustomerOrder has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    // 澶勭悊
-    traverse( listToDeal, Elements, item ) {
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "CustomerOrder " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-    //  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
-    //    info( item.ProductID().AsQUILL() );
-      CustomerOrder::CreateOrUpdate( this, item.CurrencyID(), item.Customer(), item.CustomerID(), item.ID(), 
-                                     item.OrderDate(), item.OrderID(), item.OrderLineID(), item.Price(), 
-                                     item.PriorityName(), item.ProductID(), 
-                                     item.StockPointID(), 
-                                     item.SalesSegmentName(), 
-                                     item.Quantity(), item.UnitOfMeasureName(), item.OrderType(), item.IsAvailable());
-    //  }else{
-    //    info( "invaild product: " + item.ProductID().AsQUILL() );
+    //// yypsybs Aug-15-2023 (created)
+    //// 寰呭鐞嗘暟鎹�
+    //listToDeal := construct( structured[MappingCustomerOrder] );
+    //if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
+    //    listToDeal := selectset( this, MappingCustomerOrder, item, true );
+    //} else {
+    //    listToDeal := selectset( this, MappingCustomerOrder, item, businessTypes.Find( item.BusinessType() ) <> -1 );
+    //}
+    //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( listToDeal, Elements, item, item.OrderDate() >= queryStartDate and item.OrderDate() <= queryEndDate, not isnull( Product_MP::FindById( this, item.ProductID() ) ) and not isnull( StockingPoint_MP::FindById( this, item.StockPointID() ) ) and not isnull( SalesSegment_MP::FindByName( this, item.SalesSegmentName() ) ) );
+    //
+    //totalcount := listToDeal.Size();
+    //info( "CustomerOrder has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //// 澶勭悊
+    //traverse( listToDeal, Elements, item ) {
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "CustomerOrder " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
     //    }
-    }
+    ////  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
+    ////    info( item.ProductID().AsQUILL() );
+    //  CustomerOrder::CreateOrUpdate( this, item.CurrencyID(), item.Customer(), item.CustomerID(), item.ID(), 
+    //                                 item.OrderDate(), item.OrderID(), item.OrderLineID(), item.Price(), 
+    //                                 item.PriorityName(), item.ProductID(), 
+    //                                 item.StockPointID(), 
+    //                                 item.SalesSegmentName(), 
+    //                                 item.Quantity(), item.UnitOfMeasureName(), item.OrderType(), item.IsAvailable());
+    ////  }else{
+    ////    info( "invaild product: " + item.ProductID().AsQUILL() );
+    ////    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
index 7295bad..7792802 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
@@ -7,53 +7,53 @@
 {
   TextBody:
   [*
-    // renhao Aug-14-2023 (created)
-    
-    listtodeal := selectset( this,MappingExternalSupply,externalSupply, 
-                             not isnull( StockingPoint_MP::FindById( this, externalSupply.StockingPointID() ) ) and not isnull( Product_MP::FindById( this, externalSupply.ProductID() ) ) );
-    totalcount := listtodeal.Size();
-    info( "ExternalSupply has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    traverse( listtodeal,Elements,externalSupply){
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 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( this,MappingProduct,product,product.ID() = externalSupply.ProductID() and product.KeyProduct() = nuclear,true);
-      
-      if( not isnull( product)){
-        productMP :=  select( this,Product_MP,productMP,productMP.ID() = externalSupply.ProductID() ,true);
-        stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
-        if( not isnull(businessTypes)){
-        
-          for( i :=0 ;i < businessTypes.Size();i++ ){
-            businessType := businessTypes.Element( i);
-            if( product.BusinessType() = businessType and not product.IsCommon()){
-              InventorySupply::CreateOrUpdate( externalSupply.ID(),
-                                               productMP,
-                                               stockingpoint,
-                                               externalSupply.Date(),
-                                               externalSupply.ManufacturedDate(),
-                                               externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�");
-            }
-          }
-          
-        }else{
-        if( not isnull( stockingpoint) and not isnull( productMP)){
-          InventorySupply::CreateOrUpdate( externalSupply.ID(),
-                                           productMP,
-                                           stockingpoint,
-                                           externalSupply.Date(),
-                                           externalSupply.ManufacturedDate(),
-                                           externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�");
-        }
-      
-        }
-        
-      }else{
-        info( "Invaild product" );
-        }
-    }
+    //// renhao Aug-14-2023 (created)
+    //
+    //listtodeal := selectset( this,MappingExternalSupply,externalSupply, 
+    //                         not isnull( StockingPoint_MP::FindById( this, externalSupply.StockingPointID() ) ) and not isnull( Product_MP::FindById( this, externalSupply.ProductID() ) ) );
+    //totalcount := listtodeal.Size();
+    //info( "ExternalSupply has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //traverse( listtodeal,Elements,externalSupply){
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 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( this,MappingProduct,product,product.ID() = externalSupply.ProductID() and product.KeyProduct() = nuclear,true);
+    //  
+    //  if( not isnull( product)){
+    //    productMP :=  select( this,Product_MP,productMP,productMP.ID() = externalSupply.ProductID() ,true);
+    //    stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
+    //    if( not isnull(businessTypes)){
+    //    
+    //      for( i :=0 ;i < businessTypes.Size();i++ ){
+    //        businessType := businessTypes.Element( i);
+    //        if( product.BusinessType() = businessType and not product.IsCommon()){
+    //          InventorySupply::CreateOrUpdate( externalSupply.ID(),
+    //                                           productMP,
+    //                                           stockingpoint,
+    //                                           externalSupply.Date(),
+    //                                           externalSupply.ManufacturedDate(),
+    //                                           externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�");
+    //        }
+    //      }
+    //      
+    //    }else{
+    //    if( not isnull( stockingpoint) and not isnull( productMP)){
+    //      InventorySupply::CreateOrUpdate( externalSupply.ID(),
+    //                                       productMP,
+    //                                       stockingpoint,
+    //                                       externalSupply.Date(),
+    //                                       externalSupply.ManufacturedDate(),
+    //                                       externalSupply.UserQuantity(),"鍦ㄩ�斿湪鍒�");
+    //    }
+    //  
+    //    }
+    //    
+    //  }else{
+    //    info( "Invaild product" );
+    //    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
index 903aea0..933c3fc 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
@@ -7,36 +7,36 @@
   Description: 'ETL璁㈠崟棰勬祴'
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    // 寰呭鐞嗘暟鎹�
-    listToDeal := construct( structured[MappingForecast] );
-    if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
-        listToDeal := selectset( this, MappingForecast, item, true );
-    } else {
-        listToDeal := selectset( this, MappingForecast, item, businessTypes.Find( item.BusinessType() ) <> -1 );
-    }
-    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( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate, not isnull( Product_MP::FindById( this, item.ProductID() ) ) and not isnull( StockingPoint_MP::FindById( this, item.StockingPointID() ) ) and not isnull( SalesSegment_MP::FindByName( this, item.SalesSegmentName() ) ) );
-    
-    totalcount := listToDeal.Size();
-    info( "Forecast has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    // 澶勭悊
-    traverse( listToDeal, Elements, item ) {
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "Forecast " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-    //  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
-      Forecast::CreateOrUpdate( this, 
-                                item.ProductID(), item.SalesSegmentName(), item.StockingPointID(), item.PriorityName(),
-                                item.CurrencyID(), item.UnitOfMeasureName(),
-                                item.ID(), item.StartDate(), item.EndDate(), item.Quantity(), item.Price());
-    //  }else{
-    //    info( "invaild product" + item.ProductID().AsQUILL() );
+    //// yypsybs Aug-15-2023 (created)
+    //// 寰呭鐞嗘暟鎹�
+    //listToDeal := construct( structured[MappingForecast] );
+    //if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
+    //    listToDeal := selectset( this, MappingForecast, item, true );
+    //} else {
+    //    listToDeal := selectset( this, MappingForecast, item, businessTypes.Find( item.BusinessType() ) <> -1 );
+    //}
+    //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( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate, not isnull( Product_MP::FindById( this, item.ProductID() ) ) and not isnull( StockingPoint_MP::FindById( this, item.StockingPointID() ) ) and not isnull( SalesSegment_MP::FindByName( this, item.SalesSegmentName() ) ) );
+    //
+    //totalcount := listToDeal.Size();
+    //info( "Forecast has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //// 澶勭悊
+    //traverse( listToDeal, Elements, item ) {
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "Forecast " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
     //    }
-    }
+    ////  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
+    //  Forecast::CreateOrUpdate( this, 
+    //                            item.ProductID(), item.SalesSegmentName(), item.StockingPointID(), item.PriorityName(),
+    //                            item.CurrencyID(), item.UnitOfMeasureName(),
+    //                            item.ID(), item.StartDate(), item.EndDate(), item.Quantity(), item.Price());
+    ////  }else{
+    ////    info( "invaild product" + item.ProductID().AsQUILL() );
+    ////    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingInventoryValueAndCostData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingInventoryValueAndCostData.qbl
index 2138aae..f73b9e0 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingInventoryValueAndCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingInventoryValueAndCostData.qbl
@@ -4,24 +4,24 @@
 {
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    listtodeal := selectset( this,MappingInventoryValueAndCost,item,not isnull( Product_MP::FindById( this, item.ProductID() ) ), not isnull( StockingPoint_MP::FindById( this, item.StockingPointID() ) ) );
-    totalcount := listtodeal.Size();
-    info( "InventoryCost has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    traverse( listtodeal, Elements, item ) {
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "InventoryCost " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-      if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
-          InventoryValueAndCost::CreateOrUpdate( this, item.ID(), item.ProductID(), 
-                                                 item.StockingPointID(), 
-                                                 item.AccountName(), item.CostDriver(), item.Start(), item.Cost() );
-      }else{
-        info( "invaild product: " + item.ProductID().AsQUILL() );
-        }
-    }
+    //// yypsybs Aug-15-2023 (created)
+    //listtodeal := selectset( this,MappingInventoryValueAndCost,item,not isnull( Product_MP::FindById( this, item.ProductID() ) ), not isnull( StockingPoint_MP::FindById( this, item.StockingPointID() ) ) );
+    //totalcount := listtodeal.Size();
+    //info( "InventoryCost has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //traverse( listtodeal, Elements, item ) {
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "InventoryCost " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
+    //    }
+    //  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
+    //      InventoryValueAndCost::CreateOrUpdate( this, item.ID(), item.ProductID(), 
+    //                                             item.StockingPointID(), 
+    //                                             item.AccountName(), item.CostDriver(), item.Start(), item.Cost() );
+    //  }else{
+    //    info( "invaild product: " + item.ProductID().AsQUILL() );
+    //    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
index 93b5707..16d4ed2 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
@@ -8,67 +8,67 @@
 {
   TextBody:
   [*
-    // yypsybs Aug-21-2023 (created)
-    
-    keyProductList := construct( Strings );
-    if( isKeyProduct ) {
-        keyProductList := selectuniquevalues( this, MappingProduct, item, item.KeyProduct(), item.ID() );
-    }
-    bomList := selectsortedset(  this, MappingBOM, item,
-                                 ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
-                                         true, 
-                                         businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
-                                 and ifexpr( isKeyProduct, 
-                                             keyProductList.Size() > 0 and keyProductList.Find( item.ComponentCode() ) >= 0,
-                                             true ),
-                                 item.OrganCode() + "_" + item.ProductCode() + "_" + item.ProcessSection() );
-    // 鎸塺outing鍙妑outingStep鍒嗙粍
-    routingIds := selectuniquevalues( bomList, Elements, item, true, item.OrganCode() + "_" + item.ProductCode() );
-    traverse( routingIds, Elements, routingId ) {
-        routingRows := selectset( bomList, Elements, item, true, routingId = item.OrganCode() + "_" + item.ProductCode() );
-        if( routingRows.Size() > 0 ) {
-            firstRow := routingRows.Element( 0 );
-            stockingPointId := firstRow.OrganCode()  + "_" + firstRow.ProductType() + "_STOCK";
-            inputStockingPointId := firstRow.OrganCode()  + "_" + firstRow.ComponentType() + "_STOCK";
-            // ========妫�鏌�========
-            product := Product_MP::FindById( this, firstRow.ProductCode() );
-            if( not isnull( product ) ) {
-    //              error( "product : " + firstRow.ProductCode() + " not found" );
-              stockingPoint := StockingPoint_MP::FindById( this, stockingPointId );
-              inputStockingPoint := StockingPoint_MP::FindById( this, inputStockingPointId );
-    //          info( stockingPointId.AsQUILL() );
-      //        if( isnull( stockingPoint ) ) {
-      //            error( "stockingPoint : " + stockingPointId + " not found" );
-      //        }
-              routing := Routing::FindById( this, routingId );
-              if( not isnull( routing ) ) {
-    //              error( "routing : " + routingId + " not found" );
-                // ========澶勭悊杈撳嚭========
-                if( not isnull( stockingPoint ) ) {
-    //              info( 1 );
-                  operationsInLastSteps := Operation::FindFinalOperationsByRoutingId( this, routingId );
-                  traverse( operationsInLastSteps, Elements, operationsInLastStep ) {
-                      operationsInLastStep.CreateOperationBOM( product, stockingPoint, false, true );
-                      operationsInLastStep.GetOperationBOM( product.ID(), stockingPoint.ID(), false ).Quantity( 1 );
-                  }
-                  // ========鍒嗙粍澶勭悊杈撳叆========
-                  
-                }
-                if( not isnull( inputStockingPoint)){
-                  this.MappingOperationBOMDataRouting( routing,routingRows,inputStockingPoint,keyProductList);
-                }
-              }
-           }
-        }
-    }
-    if( createPurchaseSupplyMaterial ) {
-        toCreateBomList := selectuniquevalues( bomList, Elements, item, 
-                                               item.ProductType() = "P", item.OrganCode() + item.ComponentCode());
-        traverse( toCreateBomList, Elements, key ) {
-            boms := selectset( bomList, Elements, item, item.ProductType() = "P" and item.OrganCode() + item.ComponentCode() = key );
-            bom := boms.First();
-            this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
-        }
-    }
+    //// yypsybs Aug-21-2023 (created)
+    //
+    //keyProductList := construct( Strings );
+    //if( isKeyProduct ) {
+    //    keyProductList := selectuniquevalues( this, MappingProduct, item, item.KeyProduct(), item.ID() );
+    //}
+    //bomList := selectsortedset(  this, MappingBOM, item,
+    //                             ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
+    //                                     true, 
+    //                                     businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
+    //                             and ifexpr( isKeyProduct, 
+    //                                         keyProductList.Size() > 0 and keyProductList.Find( item.ComponentCode() ) >= 0,
+    //                                         true ),
+    //                             item.OrganCode() + "_" + item.ProductCode() + "_" + item.ProcessSection() );
+    //// 鎸塺outing鍙妑outingStep鍒嗙粍
+    //routingIds := selectuniquevalues( bomList, Elements, item, true, item.OrganCode() + "_" + item.ProductCode() );
+    //traverse( routingIds, Elements, routingId ) {
+    //    routingRows := selectset( bomList, Elements, item, true, routingId = item.OrganCode() + "_" + item.ProductCode() );
+    //    if( routingRows.Size() > 0 ) {
+    //        firstRow := routingRows.Element( 0 );
+    //        stockingPointId := firstRow.OrganCode()  + "_" + firstRow.ProductType() + "_STOCK";
+    //        inputStockingPointId := firstRow.OrganCode()  + "_" + firstRow.ComponentType() + "_STOCK";
+    //        // ========妫�鏌�========
+    //        product := Product_MP::FindById( this, firstRow.ProductCode() );
+    //        if( not isnull( product ) ) {
+    ////              error( "product : " + firstRow.ProductCode() + " not found" );
+    //          stockingPoint := StockingPoint_MP::FindById( this, stockingPointId );
+    //          inputStockingPoint := StockingPoint_MP::FindById( this, inputStockingPointId );
+    ////          info( stockingPointId.AsQUILL() );
+    //  //        if( isnull( stockingPoint ) ) {
+    //  //            error( "stockingPoint : " + stockingPointId + " not found" );
+    //  //        }
+    //          routing := Routing::FindById( this, routingId );
+    //          if( not isnull( routing ) ) {
+    ////              error( "routing : " + routingId + " not found" );
+    //            // ========澶勭悊杈撳嚭========
+    //            if( not isnull( stockingPoint ) ) {
+    ////              info( 1 );
+    //              operationsInLastSteps := Operation::FindFinalOperationsByRoutingId( this, routingId );
+    //              traverse( operationsInLastSteps, Elements, operationsInLastStep ) {
+    //                  operationsInLastStep.CreateOperationBOM( product, stockingPoint, false, true );
+    //                  operationsInLastStep.GetOperationBOM( product.ID(), stockingPoint.ID(), false ).Quantity( 1 );
+    //              }
+    //              // ========鍒嗙粍澶勭悊杈撳叆========
+    //              
+    //            }
+    //            if( not isnull( inputStockingPoint)){
+    //              this.MappingOperationBOMDataRouting( routing,routingRows,inputStockingPoint,keyProductList);
+    //            }
+    //          }
+    //       }
+    //    }
+    //}
+    //if( createPurchaseSupplyMaterial ) {
+    //    toCreateBomList := selectuniquevalues( bomList, Elements, item, 
+    //                                           item.ProductType() = "P", item.OrganCode() + item.ComponentCode());
+    //    traverse( toCreateBomList, Elements, key ) {
+    //        boms := selectset( bomList, Elements, item, item.ProductType() = "P" and item.OrganCode() + item.ComponentCode() = key );
+    //        bom := boms.First();
+    //        this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
+    //    }
+    //}
   *]
 }
diff --git "a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting\043576.qbl" "b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting\043576.qbl"
index 03a3858..3eb9f87 100644
--- "a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting\043576.qbl"
+++ "b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting\043576.qbl"
@@ -9,87 +9,87 @@
 {
   TextBody:
   [*
-    // yypsybs Aug-21-2023 (created)
-    
-    // 鏍规嵁宸ヨ壓娈垫眹鎬诲鐞�
-    processSections := selectuniquevalues( routingRows, Elements, row, true, row.ProcessSection() );
-    traverse( processSections, Elements, processSection ) {
-        rows := selectset( routingRows, Elements, row, row.ProcessSection() = processSection );
-        firstRow := rows.Element( 0 );
-        // 鎵緊rgCode/productId/processSection鍖归厤涓攕equence鏈�灏忕殑涓�缁勬暟鎹�
-        minSeq := MappingOperation::FindMinSeq( this, firstRow.OrganCode(), firstRow.ProductCode(), processSection );
-        routingStepId := processSection + "_" + [String]minSeq;
-        // 鎵惧搴攔outingStep
-        routingStep := RoutingStep::FindByName( routing, routingStepId );
-        if( not isnull( routingStep ) ) {
-    //        error( "routing step : " + routing.ID() + "|" + routingStepId + " not found" );  
-        // 浠呬富鏂欙紝缁熶竴澶勭悊
-          noAlterRows := selectset( rows, Elements, noAlterRow, noAlterRow.AlternativeMaterialCode() = "" );
-          traverse( noAlterRows, Elements, noAlterRow ) {
-              traverse( routingStep, Operation, toLink ) {
-                  // 妫�鏌ヤ富鏂�
-                  component := Product_MP::FindById( this, noAlterRow.ComponentCode() );
-                  if( not isnull( component ) ) {
-    //                  error( "component : " + noAlterRow.ComponentCode() + " not found" );
-                  // 杩炴帴浜у搧涓巓peration
-                  pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
-                  trash := construct( OperationBOMs );
-                  operationBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp, 
-                                                      true, trash );
-                  operationBOM.MinQuantityInGroup( 0 );
-                  operationBOM.Quantity( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
-                  operationBOM.MaxQuantityInGroup( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
-                  }
-              }
-          }
-          // 鏇挎崲鏂欙紝鎸変富鏂欏垎缁勫鐞�
-          alterComponentIds := selectuniquevalues( rows, Elements, row, row.AlternativeMaterialCode() <> "", row.ComponentCode() );
-          traverse( alterComponentIds, Elements, alterComponentId ) {
-              alterRows := selectset( rows, Elements, row, row.ComponentCode() = alterComponentId );
-              firstAlterRow := alterRows.Element( 0 );
-              // 妫�鏌ヤ富鏂�
-              component := Product_MP::FindById( this, firstAlterRow.ComponentCode() );
-              if( not isnull( component ) ) {
-    //              error( "component : " + firstAlterRow.ComponentCode() + " not found" );
+    //// yypsybs Aug-21-2023 (created)
+    //
+    //// 鏍规嵁宸ヨ壓娈垫眹鎬诲鐞�
+    //processSections := selectuniquevalues( routingRows, Elements, row, true, row.ProcessSection() );
+    //traverse( processSections, Elements, processSection ) {
+    //    rows := selectset( routingRows, Elements, row, row.ProcessSection() = processSection );
+    //    firstRow := rows.Element( 0 );
+    //    // 鎵緊rgCode/productId/processSection鍖归厤涓攕equence鏈�灏忕殑涓�缁勬暟鎹�
+    //    minSeq := MappingOperation::FindMinSeq( this, firstRow.OrganCode(), firstRow.ProductCode(), processSection );
+    //    routingStepId := processSection + "_" + [String]minSeq;
+    //    // 鎵惧搴攔outingStep
+    //    routingStep := RoutingStep::FindByName( routing, routingStepId );
+    //    if( not isnull( routingStep ) ) {
+    ////        error( "routing step : " + routing.ID() + "|" + routingStepId + " not found" );  
+    //    // 浠呬富鏂欙紝缁熶竴澶勭悊
+    //      noAlterRows := selectset( rows, Elements, noAlterRow, noAlterRow.AlternativeMaterialCode() = "" );
+    //      traverse( noAlterRows, Elements, noAlterRow ) {
+    //          traverse( routingStep, Operation, toLink ) {
+    //              // 妫�鏌ヤ富鏂�
+    //              component := Product_MP::FindById( this, noAlterRow.ComponentCode() );
+    //              if( not isnull( component ) ) {
+    ////                  error( "component : " + noAlterRow.ComponentCode() + " not found" );
+    //              // 杩炴帴浜у搧涓巓peration
+    //              pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
+    //              trash := construct( OperationBOMs );
+    //              operationBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp, 
+    //                                                  true, trash );
+    //              operationBOM.MinQuantityInGroup( 0 );
+    //              operationBOM.Quantity( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
+    //              operationBOM.MaxQuantityInGroup( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
+    //              }
     //          }
-                traverse( routingStep, Operation, toLink ) {
-                    // 杩炴帴浜у搧涓巓peration
-                    pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
-                    trash := construct( OperationBOMs );
-                    mainBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp, 
-                                                        true, trash );
-                    mainBOM.Quantity( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
-                    mainBOM.MaxQuantityInGroup( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
-                    mainQty := mainBOM.Quantity();
-                    Transaction::Transaction().Propagate();
-                    // 娣诲姞杈呮枡
-                    traverse( alterRows, Elements, alterRow ) {
-                        alterProd := Product_MP::FindById( this, alterRow.AlternativeMaterialCode() );
-                        if( not isnull( alterProd ) ) {
-        //                    error( "alterProd : " + alterRow.AlternativeMaterialCode() + " not found" );
-                          stockingPointIdAlter := alterRow.OrganCode()  + "_" + alterRow.ProductType() + "_STOCK";
-                          stockingPointAlter := StockingPoint_MP::FindById( this, stockingPointIdAlter );
-                          if( isnull( stockingPointAlter ) ) {
-                              error( "stockingPoint : " + stockingPointIdAlter + " not found" );
-                          }
-                          pispAlter := ProductInStockingPoint_MP::CreateIfNotFound( alterProd, stockingPointAlter );
-                          mainInput := toLink.LastOperationInput();
-                          trash := construct( OperationBOMs );
-                          if( not isnull( mainInput ) ) {
-                              alterBom := mainInput.Operation().LinkPISP( pispAlter, true, mainInput.OperationLinkGroupID(), trash );
-                              alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
-                              alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
-    //                          info( "Quantity" + [String]alterBom.Quantity() )
-    //                          info( "MaxQuantityInGroup" + [String]alterBom.MaxQuantityInGroup() )
-                              mainQty := mainQty - alterBom.Quantity();
-                          }
-                      }
-                      mainBOM.Quantity( mainQty );
-                   }
-                }
-              }
-          }
-       }
-    }
+    //      }
+    //      // 鏇挎崲鏂欙紝鎸変富鏂欏垎缁勫鐞�
+    //      alterComponentIds := selectuniquevalues( rows, Elements, row, row.AlternativeMaterialCode() <> "", row.ComponentCode() );
+    //      traverse( alterComponentIds, Elements, alterComponentId ) {
+    //          alterRows := selectset( rows, Elements, row, row.ComponentCode() = alterComponentId );
+    //          firstAlterRow := alterRows.Element( 0 );
+    //          // 妫�鏌ヤ富鏂�
+    //          component := Product_MP::FindById( this, firstAlterRow.ComponentCode() );
+    //          if( not isnull( component ) ) {
+    ////              error( "component : " + firstAlterRow.ComponentCode() + " not found" );
+    ////          }
+    //            traverse( routingStep, Operation, toLink ) {
+    //                // 杩炴帴浜у搧涓巓peration
+    //                pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
+    //                trash := construct( OperationBOMs );
+    //                mainBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp, 
+    //                                                    true, trash );
+    //                mainBOM.Quantity( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
+    //                mainBOM.MaxQuantityInGroup( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
+    //                mainQty := mainBOM.Quantity();
+    //                Transaction::Transaction().Propagate();
+    //                // 娣诲姞杈呮枡
+    //                traverse( alterRows, Elements, alterRow ) {
+    //                    alterProd := Product_MP::FindById( this, alterRow.AlternativeMaterialCode() );
+    //                    if( not isnull( alterProd ) ) {
+    //    //                    error( "alterProd : " + alterRow.AlternativeMaterialCode() + " not found" );
+    //                      stockingPointIdAlter := alterRow.OrganCode()  + "_" + alterRow.ProductType() + "_STOCK";
+    //                      stockingPointAlter := StockingPoint_MP::FindById( this, stockingPointIdAlter );
+    //                      if( isnull( stockingPointAlter ) ) {
+    //                          error( "stockingPoint : " + stockingPointIdAlter + " not found" );
+    //                      }
+    //                      pispAlter := ProductInStockingPoint_MP::CreateIfNotFound( alterProd, stockingPointAlter );
+    //                      mainInput := toLink.LastOperationInput();
+    //                      trash := construct( OperationBOMs );
+    //                      if( not isnull( mainInput ) ) {
+    //                          alterBom := mainInput.Operation().LinkPISP( pispAlter, true, mainInput.OperationLinkGroupID(), trash );
+    //                          alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
+    //                          alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
+    ////                          info( "Quantity" + [String]alterBom.Quantity() )
+    ////                          info( "MaxQuantityInGroup" + [String]alterBom.MaxQuantityInGroup() )
+    //                          mainQty := mainQty - alterBom.Quantity();
+    //                      }
+    //                  }
+    //                  mainBOM.Quantity( mainQty );
+    //               }
+    //            }
+    //          }
+    //      }
+    //   }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
index 3a315d0..061336f 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
@@ -7,57 +7,57 @@
   Description: 'Get operation cost data from operation mapping'
   TextBody:
   [*
-    // Administrator Aug-21-2023 (created)
-    // list to deal
-    listtodeal := construct( structured[MappingOperation] );
-    
-    if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
-        listtodeal := selectset( this, MappingOperation, item, true );
-    } else {
-        listtodeal := selectset( this, MappingOperation, item, businesstypes.Find( item.BusinessType() ) <> -1 );
-    }
-    
-    // Get the list to deal with max sequence number
-    listtodealwithmaxsn := construct( structured[MappingOperation] );
-    traverse( listtodeal, Elements, item ){
-      maxsn := maxselect( this, 
-                          MappingOperation, 
-                          moperation, 
-                          moperation.OrganCode() = item.OrganCode(), 
-                          moperation.ProductID() = item.ProductID(), 
-                          moperation.SequenceNumber() ).SequenceNumber()
-      if( item.SequenceNumber() = maxsn ){
-        listtodealwithmaxsn.Add( item );
-        }
-      }
-    
-    totalcount := listtodealwithmaxsn.Size();
-    info( "OperationCost has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    // Get the operation cost data
-    traverse( listtodealwithmaxsn, Elements, item ){
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "OperationCost " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-      id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection() + "_" + item.Line();
-      operation := Operation::FindOperationTypeIndex( id );
-      account := Account_MP::FindByName( this, "Operation cost" );
-      isfromdb := false;
-      existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
-      if( isnull( existoperationcost ) ){
-        connecteditem := select( this, 
-                                 MappingOperationCost, 
-                                 moperationcost, 
-                                 moperationcost.OrgCode() = item.OrganCode(), 
-                                 moperationcost.ProductID() = item.ProductID() );
-        cost := connecteditem.Cost();
-        lengthoftime := connecteditem.LengthOfTime();
-        start := connecteditem.Start();
-        timeunit := connecteditem.TimeUnit();
-        OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
-        }
-      }
+    //// Administrator Aug-21-2023 (created)
+    //// list to deal
+    //listtodeal := construct( structured[MappingOperation] );
+    //
+    //if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
+    //    listtodeal := selectset( this, MappingOperation, item, true );
+    //} else {
+    //    listtodeal := selectset( this, MappingOperation, item, businesstypes.Find( item.BusinessType() ) <> -1 );
+    //}
+    //
+    //// Get the list to deal with max sequence number
+    //listtodealwithmaxsn := construct( structured[MappingOperation] );
+    //traverse( listtodeal, Elements, item ){
+    //  maxsn := maxselect( this, 
+    //                      MappingOperation, 
+    //                      moperation, 
+    //                      moperation.OrganCode() = item.OrganCode(), 
+    //                      moperation.ProductID() = item.ProductID(), 
+    //                      moperation.SequenceNumber() ).SequenceNumber()
+    //  if( item.SequenceNumber() = maxsn ){
+    //    listtodealwithmaxsn.Add( item );
+    //    }
+    //  }
+    //
+    //totalcount := listtodealwithmaxsn.Size();
+    //info( "OperationCost has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //// Get the operation cost data
+    //traverse( listtodealwithmaxsn, Elements, item ){
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "OperationCost " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
+    //    }
+    //  id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection() + "_" + item.Line();
+    //  operation := Operation::FindOperationTypeIndex( id );
+    //  account := Account_MP::FindByName( this, "Operation cost" );
+    //  isfromdb := false;
+    //  existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
+    //  if( isnull( existoperationcost ) ){
+    //    connecteditem := select( this, 
+    //                             MappingOperationCost, 
+    //                             moperationcost, 
+    //                             moperationcost.OrgCode() = item.OrganCode(), 
+    //                             moperationcost.ProductID() = item.ProductID() );
+    //    cost := connecteditem.Cost();
+    //    lengthoftime := connecteditem.LengthOfTime();
+    //    start := connecteditem.Start();
+    //    timeunit := connecteditem.TimeUnit();
+    //    OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
+    //    }
+    //  }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
index a3a19ed..47487bf 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
@@ -6,89 +6,89 @@
 {
   TextBody:
   [*
-    // yypsybs Aug-18-2023 (created)
-    // 鑾峰彇鏈夊簭鐨勫緟澶勭悊璁板綍
-    toDealList := construct( MappingOperations );
-    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
-        toDealList := selectsortedset( this, MappingOperation, item, 
-    //                                   businessTypes.Find( item.BusinessType() ) >= 0, 
-                                       businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0, 
-                                       item.SequenceNumber() );
-    } else {
-        toDealList := selectsortedset( this, MappingOperation, item, 
-                                       true, 
-                                       item.SequenceNumber() );
-    }
-    // 閫愭潯澶勭悊锛岄娆″鐞嗘椂鍒犻櫎steps
-    dealtRoutingIds := construct( Strings );
-    routingList := construct( Routings );
-    traverse( toDealList, Elements, item ) {
-        routingId := item.OrganCode() + "_" + item.ProductID();
-        unitId := item.OrganCode() + "_" + item.PlantName() + "_" + item.ProcessSection();
-        routingStepName := item.ProcessSection() + "_" + [String]item.SequenceNumber();
-        operationId := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection();
-    //    info( "========" )
-    //    info( "routingId:" + routingId );
-    //    info( "unitId:" + unitId );
-    //    info( "routingStepName:" + routingStepName );
-    //    info( "operationId:" + operationId );
-        if( guard( item.Line(), "" ).Length() > 0 ) {
-            unitId := unitId + "_" + item.Line();
-            operationId := operationId + "_" + item.Line()
-        }
-        routing := Routing::CreateOrUpdate( this, routingId );
-        if( routingList.Find( routing ) < 0 ) {
-            routingList.Add( routing );  
-        }
-        // 鍒犻櫎steps(units鍏崇郴銆乷perations涔熶細鍒犻櫎)
-        if( dealtRoutingIds.Find( routingId ) < 0 ) {
-            toDeleteSteps := selectset( routing, RoutingStep, routingStep, true );
-            RoutingStep::Delete( toDeleteSteps );
-            dealtRoutingIds.Add( routingId );
-        }
-        // RoutingStep
-        routingStep := RoutingStep::FindByName( routing, routingStepName );
-        if( isnull( routingStep ) ) {
-            routingStep := RoutingStep::Create( routing, routingStepName, "", true );
-        }
-        // UnitOfMeasure
-        unitOfMeasure := UnitOfMeasure_MP::FindByName( this, item.UnitOfMeasureName() );
-        if( isnull( unitOfMeasure ) ) {
-            error( "unit of measure [" + item.UnitOfMeasureName() + "] not found for routing [" + routingId + "]" );
-        }
-        // Unit
-        unit := Unit::FindById( this, unitId );
-        if( isnull( unit ) ) {
-            unit := this.Unit( relnew, 
-                              ID := unitId, Name := unitId, CapacityType := "Infinite",
-                              DefaultGridX := 0, DefaultGridY := 0,
-                              IsManuallyConfigured := false,
-                              Currency_MP := this.BaseCurrency(), UnitOfMeasure_MP := unitOfMeasure );
-        }
-        // Operation
-        haveMaxQty := item.MaximumQuantity() <> 0.0;
-        op := Operation::FindOperationTypeIndex( operationId );
-        if( isnull( op)){
-          op := Operation::Create( operationId, unit, operationId, routingStep, 
-                                        Duration::Hours( item.UserLeadTime() ), Duration::Zero(), item.ActualCapacity(), false, 
-                                        [Real]item.MinimumQuantity(), haveMaxQty, guard( [Real]item.MaximumQuantity(), Real::MaxReal() ), 
-                                        0.0, 0.0, false, true );
-        }
-        
-        ManufactureLTProcessSection::CreateOrUpdate( op );
-    }
-    info( "========" )
-    // 閬嶅巻routing锛岃繘琛宭ink
-    lastStep := null( RoutingStep );
-    traverse( routingList, Elements.RoutingStep, step ) {
-        // 鍚屽伐鑹鸿矾绾挎椂杩炴帴
-        if( not isnull( lastStep ) and lastStep.Routing() = step.Routing() ) {
-            toLink := construct( RoutingSteps );
-            toLink.Add( lastStep );
-            // todo 瀛樼枒
-            step.LinkOperations( toLink );
-        }
-        lastStep := step;
-    }
+    //// yypsybs Aug-18-2023 (created)
+    //// 鑾峰彇鏈夊簭鐨勫緟澶勭悊璁板綍
+    //toDealList := construct( MappingOperations );
+    //if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
+    //    toDealList := selectsortedset( this, MappingOperation, item, 
+    ////                                   businessTypes.Find( item.BusinessType() ) >= 0, 
+    //                                   businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0, 
+    //                                   item.SequenceNumber() );
+    //} else {
+    //    toDealList := selectsortedset( this, MappingOperation, item, 
+    //                                   true, 
+    //                                   item.SequenceNumber() );
+    //}
+    //// 閫愭潯澶勭悊锛岄娆″鐞嗘椂鍒犻櫎steps
+    //dealtRoutingIds := construct( Strings );
+    //routingList := construct( Routings );
+    //traverse( toDealList, Elements, item ) {
+    //    routingId := item.OrganCode() + "_" + item.ProductID();
+    //    unitId := item.OrganCode() + "_" + item.PlantName() + "_" + item.ProcessSection();
+    //    routingStepName := item.ProcessSection() + "_" + [String]item.SequenceNumber();
+    //    operationId := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection();
+    ////    info( "========" )
+    ////    info( "routingId:" + routingId );
+    ////    info( "unitId:" + unitId );
+    ////    info( "routingStepName:" + routingStepName );
+    ////    info( "operationId:" + operationId );
+    //    if( guard( item.Line(), "" ).Length() > 0 ) {
+    //        unitId := unitId + "_" + item.Line();
+    //        operationId := operationId + "_" + item.Line()
+    //    }
+    //    routing := Routing::CreateOrUpdate( this, routingId );
+    //    if( routingList.Find( routing ) < 0 ) {
+    //        routingList.Add( routing );  
+    //    }
+    //    // 鍒犻櫎steps(units鍏崇郴銆乷perations涔熶細鍒犻櫎)
+    //    if( dealtRoutingIds.Find( routingId ) < 0 ) {
+    //        toDeleteSteps := selectset( routing, RoutingStep, routingStep, true );
+    //        RoutingStep::Delete( toDeleteSteps );
+    //        dealtRoutingIds.Add( routingId );
+    //    }
+    //    // RoutingStep
+    //    routingStep := RoutingStep::FindByName( routing, routingStepName );
+    //    if( isnull( routingStep ) ) {
+    //        routingStep := RoutingStep::Create( routing, routingStepName, "", true );
+    //    }
+    //    // UnitOfMeasure
+    //    unitOfMeasure := UnitOfMeasure_MP::FindByName( this, item.UnitOfMeasureName() );
+    //    if( isnull( unitOfMeasure ) ) {
+    //        error( "unit of measure [" + item.UnitOfMeasureName() + "] not found for routing [" + routingId + "]" );
+    //    }
+    //    // Unit
+    //    unit := Unit::FindById( this, unitId );
+    //    if( isnull( unit ) ) {
+    //        unit := this.Unit( relnew, 
+    //                          ID := unitId, Name := unitId, CapacityType := "Infinite",
+    //                          DefaultGridX := 0, DefaultGridY := 0,
+    //                          IsManuallyConfigured := false,
+    //                          Currency_MP := this.BaseCurrency(), UnitOfMeasure_MP := unitOfMeasure );
+    //    }
+    //    // Operation
+    //    haveMaxQty := item.MaximumQuantity() <> 0.0;
+    //    op := Operation::FindOperationTypeIndex( operationId );
+    //    if( isnull( op)){
+    //      op := Operation::Create( operationId, unit, operationId, routingStep, 
+    //                                    Duration::Hours( item.UserLeadTime() ), Duration::Zero(), item.ActualCapacity(), false, 
+    //                                    [Real]item.MinimumQuantity(), haveMaxQty, guard( [Real]item.MaximumQuantity(), Real::MaxReal() ), 
+    //                                    0.0, 0.0, false, true );
+    //    }
+    //    
+    //    ManufactureLTProcessSection::CreateOrUpdate( op );
+    //}
+    //info( "========" )
+    //// 閬嶅巻routing锛岃繘琛宭ink
+    //lastStep := null( RoutingStep );
+    //traverse( routingList, Elements.RoutingStep, step ) {
+    //    // 鍚屽伐鑹鸿矾绾挎椂杩炴帴
+    //    if( not isnull( lastStep ) and lastStep.Routing() = step.Routing() ) {
+    //        toLink := construct( RoutingSteps );
+    //        toLink.Add( lastStep );
+    //        // todo 瀛樼枒
+    //        step.LinkOperations( toLink );
+    //    }
+    //    lastStep := step;
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
index cb6a99d..8e19ed7 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
@@ -8,85 +8,85 @@
   Description: 'Method to get needed data from mapping product data'
   TextBody:
   [*
-    // Administrator Aug-16-2023 (created)
-    // list to deal
-    //info( "Get list to deal of product" );
-    listToDeal := construct( structured[MappingProduct] );
-    
-    if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
-        if( iskeyproduct = true ){
-          listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true );
-          }
-        else{
-          listToDeal := selectset( this, MappingProduct, item, true );
-          }
-    } else {
-        if( iskeyproduct = true ){
-          listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true, businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 );
-          }
-        else{
-        listToDeal := selectset( this, MappingProduct, item, businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 );
-        }
-    }
-    totalcount := listToDeal.Size();
-    info( "Product has " + totalcount.AsQUILL() + " rows in total" );
-    
-    // Get the root data
-    Product_MP::CreateOrUpdate( this, 
-                                "鍏ㄩ儴鐗╂枡浜у搧", 
-                                "", 
-                                "鍏ㄩ儴鐗╂枡浜у搧", 
-                                "PCS", 
-                                "鍏ㄩ儴鐗╂枡浜у搧",
-                                0.0
-                                );
-    count := 0;
-    // Get the ProductMajorType list & ProductSubclassType list
-    traverse( listToDeal, Elements, item ){
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "Product " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-      if( not item.ProductMajorType() = "" ){
-        Product_MP::CreateOrUpdate( this, 
-                                    item.ProductMajorType(), 
-                                    "鍏ㄩ儴鐗╂枡浜у搧", 
-                                    item.ProductMajorType(), 
-                                    "PCS", 
-                                    item.ProductMajorType(),
-                                    0.0
-                                    );
-      }
-      productmajortype := item.ProductMajorType();
-      if( productmajortype="" ){
-        productmajortype := "鍏ㄩ儴鐗╂枡浜у搧";
-        }
-       
-      if( not item.ProductSubclassType() = "" ){
-        Product_MP::CreateOrUpdate( this, 
-                                    item.ProductSubclassType(), 
-                                    productmajortype, 
-                                    item.ProductSubclassType(), 
-                                    "PCS", 
-                                    item.ProductSubclassType(),
-                                    0.0
-                                    );
-        }
-      productsubclasstype := item.ProductSubclassType();
-      if( productsubclasstype="" ){
-        productsubclasstype := productmajortype;
-        }
-      
-      if( not item.ID() = "" ){
-          Product_MP::CreateOrUpdate( this, 
-                                      item.ID(), 
-                                      productsubclasstype, 
-                                      item.ID(), 
-                                      item.UnitOfMeasureName(), 
-                                      item.Name(),
-                                      item.ShelfLife()
-                                      );
-        }
-      }
+    //// Administrator Aug-16-2023 (created)
+    //// list to deal
+    ////info( "Get list to deal of product" );
+    //listToDeal := construct( structured[MappingProduct] );
+    //
+    //if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
+    //    if( iskeyproduct = true ){
+    //      listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true );
+    //      }
+    //    else{
+    //      listToDeal := selectset( this, MappingProduct, item, true );
+    //      }
+    //} else {
+    //    if( iskeyproduct = true ){
+    //      listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true, businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 );
+    //      }
+    //    else{
+    //    listToDeal := selectset( this, MappingProduct, item, businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 );
+    //    }
+    //}
+    //totalcount := listToDeal.Size();
+    //info( "Product has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //// Get the root data
+    //Product_MP::CreateOrUpdate( this, 
+    //                            "鍏ㄩ儴鐗╂枡浜у搧", 
+    //                            "", 
+    //                            "鍏ㄩ儴鐗╂枡浜у搧", 
+    //                            "PCS", 
+    //                            "鍏ㄩ儴鐗╂枡浜у搧",
+    //                            0.0
+    //                            );
+    //count := 0;
+    //// Get the ProductMajorType list & ProductSubclassType list
+    //traverse( listToDeal, Elements, item ){
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "Product " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
+    //    }
+    //  if( not item.ProductMajorType() = "" ){
+    //    Product_MP::CreateOrUpdate( this, 
+    //                                item.ProductMajorType(), 
+    //                                "鍏ㄩ儴鐗╂枡浜у搧", 
+    //                                item.ProductMajorType(), 
+    //                                "PCS", 
+    //                                item.ProductMajorType(),
+    //                                0.0
+    //                                );
+    //  }
+    //  productmajortype := item.ProductMajorType();
+    //  if( productmajortype="" ){
+    //    productmajortype := "鍏ㄩ儴鐗╂枡浜у搧";
+    //    }
+    //   
+    //  if( not item.ProductSubclassType() = "" ){
+    //    Product_MP::CreateOrUpdate( this, 
+    //                                item.ProductSubclassType(), 
+    //                                productmajortype, 
+    //                                item.ProductSubclassType(), 
+    //                                "PCS", 
+    //                                item.ProductSubclassType(),
+    //                                0.0
+    //                                );
+    //    }
+    //  productsubclasstype := item.ProductSubclassType();
+    //  if( productsubclasstype="" ){
+    //    productsubclasstype := productmajortype;
+    //    }
+    //  
+    //  if( not item.ID() = "" ){
+    //      Product_MP::CreateOrUpdate( this, 
+    //                                  item.ID(), 
+    //                                  productsubclasstype, 
+    //                                  item.ID(), 
+    //                                  item.UnitOfMeasureName(), 
+    //                                  item.Name(),
+    //                                  item.ShelfLife()
+    //                                  );
+    //    }
+    //  }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingProductInLaneData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingProductInLaneData.qbl
index 2bd20a4..b0de01f 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingProductInLaneData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingProductInLaneData.qbl
@@ -5,20 +5,20 @@
   Description: 'Get Product In Line data'
   TextBody:
   [*
-    // Administrator Aug-17-2023 (created)
-    // list to deal
-    listtodeal := selectset( this, MappingProductInLane, item, not isnull( Product_MP::FindById( this, item.ProductID() ) ), not isnull( Lane::FindLaneTypeIndex( item.LineID() ) ) );
-    totalcount := listtodeal.Size();
-    info( "ProductInLane has " + totalcount.AsQUILL() + " rows in total" );
-    
-    count := 0;
-    // Create ProductInLane
-    traverse( listtodeal, Elements, item ){
-      count := count + 1;
-      if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
-        info( "Now is dealing with the " + count.AsQUILL() + "ProductInLane " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
-        }
-      ProductInLane::CreateOrUpdate( this, item.ProductID(), item.LineID() );
-      }
+    //// Administrator Aug-17-2023 (created)
+    //// list to deal
+    //listtodeal := selectset( this, MappingProductInLane, item, not isnull( Product_MP::FindById( this, item.ProductID() ) ), not isnull( Lane::FindLaneTypeIndex( item.LineID() ) ) );
+    //totalcount := listtodeal.Size();
+    //info( "ProductInLane has " + totalcount.AsQUILL() + " rows in total" );
+    //
+    //count := 0;
+    //// Create ProductInLane
+    //traverse( listtodeal, Elements, item ){
+    //  count := count + 1;
+    //  if( count - [Number](count/100) * 100 = 0 or count = totalcount ){
+    //    info( "Now is dealing with the " + count.AsQUILL() + "ProductInLane " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
+    //    }
+    //  ProductInLane::CreateOrUpdate( this, item.ProductID(), item.LineID() );
+    //  }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
index 5f5e1aa..a1b9585 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
@@ -7,50 +7,50 @@
   Description: 'ETL閿�鍞儴闂�'
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    // 寰呭鐞嗘暟鎹�
-    listToDeal := construct( structured[MappingSalesSegment] );
-    if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
-        listToDeal := selectset( this, MappingSalesSegment, item, true );
-    } else {
-        listToDeal := selectset( this, MappingSalesSegment, item, businessTypes.Find( item.BusinessType() ) <> -1 );
-    }
-    //nameList := construct( structured[String] );
-    //nameList := selectvalues( listToDeal, Elements, item, true, item.Name() );
-    //// 妫�鏌arent
-    //traverse( listToDeal, Elements, item, item.ParentName() <> "" ) {
-    //    if( nameList.Find( item.ParentName() ) = -1 ) {
-    //        error( "sales segment parent not found: " + item.Name().AsQUILL() );
-    //    }
+    //// yypsybs Aug-15-2023 (created)
+    //// 寰呭鐞嗘暟鎹�
+    //listToDeal := construct( structured[MappingSalesSegment] );
+    //if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
+    //    listToDeal := selectset( this, MappingSalesSegment, item, true );
+    //} else {
+    //    listToDeal := selectset( this, MappingSalesSegment, item, businessTypes.Find( item.BusinessType() ) <> -1 );
     //}
-    //// 閫愬眰閬嶅巻锛岀洿鑷冲鐞嗗畬鎴�
-    //dealtNameList := construct( structured[String] );
-    //while( listToDeal.Size() <> dealtNameList.Size() ) {
-    //    traverse( listToDeal, Elements, item ) {
-    //        // 鏈鐞嗚繃
-    //        if( dealtNameList.Find( item.Name() ) < 0 ){
-    //            // 鏃犵埗閮ㄩ棬锛岀洿鎺ュ鐞�
-    //            if( item.ParentName() = "" ) {
-    //                SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
-    //                dealtNameList.Add( item.Name() );
-    //            } 
-    //            // 鏈夌埗閮ㄩ棬涓旂埗閮ㄩ棬宸插鐞�
-    //            else if( item.ParentName() <> "" and dealtNameList.Find(item.ParentName()) >= 0 ) {
-    //                SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
-    //                dealtNameList.Add( item.Name() );
-    //            }
-    //            // 鏈夌埗閮ㄩ棬涓旂埗閮ㄩ棬鏈鐞嗭紝涓嬩竴杞鐞�
-    //        }
+    ////nameList := construct( structured[String] );
+    ////nameList := selectvalues( listToDeal, Elements, item, true, item.Name() );
+    ////// 妫�鏌arent
+    ////traverse( listToDeal, Elements, item, item.ParentName() <> "" ) {
+    ////    if( nameList.Find( item.ParentName() ) = -1 ) {
+    ////        error( "sales segment parent not found: " + item.Name().AsQUILL() );
+    ////    }
+    ////}
+    ////// 閫愬眰閬嶅巻锛岀洿鑷冲鐞嗗畬鎴�
+    ////dealtNameList := construct( structured[String] );
+    ////while( listToDeal.Size() <> dealtNameList.Size() ) {
+    ////    traverse( listToDeal, Elements, item ) {
+    ////        // 鏈鐞嗚繃
+    ////        if( dealtNameList.Find( item.Name() ) < 0 ){
+    ////            // 鏃犵埗閮ㄩ棬锛岀洿鎺ュ鐞�
+    ////            if( item.ParentName() = "" ) {
+    ////                SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
+    ////                dealtNameList.Add( item.Name() );
+    ////            } 
+    ////            // 鏈夌埗閮ㄩ棬涓旂埗閮ㄩ棬宸插鐞�
+    ////            else if( item.ParentName() <> "" and dealtNameList.Find(item.ParentName()) >= 0 ) {
+    ////                SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
+    ////                dealtNameList.Add( item.Name() );
+    ////            }
+    ////            // 鏈夌埗閮ㄩ棬涓旂埗閮ㄩ棬鏈鐞嗭紝涓嬩竴杞鐞�
+    ////        }
+    ////    }
+    ////}
+    //traverse( listToDeal,Elements,item ){
+    //  if( item.ParentName() <> "" and isnull( SalesSegment_MP::FindByName( this, item.ParentName() ) ) ){
+    //    SalesSegment_MP::CreateOrUpdate( this, item.ParentName(), item.DisplayIndex(), "" );
     //    }
-    //}
-    traverse( listToDeal,Elements,item ){
-      if( item.ParentName() <> "" and isnull( SalesSegment_MP::FindByName( this, item.ParentName() ) ) ){
-        SalesSegment_MP::CreateOrUpdate( this, item.ParentName(), item.DisplayIndex(), "" );
-        }
-      }
-    
-    traverse( listToDeal,Elements,item ){
-        SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
-      }
+    //  }
+    //
+    //traverse( listToDeal,Elements,item ){
+    //    SalesSegment_MP::CreateOrUpdate( this, item.Name(), item.DisplayIndex(), item.ParentName() );
+    //  }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
index fa613b6..59960f6 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
@@ -7,94 +7,94 @@
   Description: 'Get unit data from operation mapping'
   TextBody:
   [*
-    // Administrator Aug-21-2023 (created)
-    // list to deal
-    listtodeal := construct( structured[MappingOperation] );
-    
-    if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
-        listtodeal := selectset( this, MappingOperation, item, true );
-    } else {
-        listtodeal := selectset( this, MappingOperation, item, 
-                                 businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0
-                                  );
-    }
-    
-    //Set the Default values
-    unitofmeasurename := "PCS";
-    capacitytype := "Infinite";
-    
-    // Get the root data
-    Unit::CreateOrUpdate( this, 
-                          "澶╅┈闆嗗洟", 
-                          "澶╅┈闆嗗洟", 
-                          "", 
-                          capacitytype, 
-                          unitofmeasurename );
-    
-    // Get the sub root data
-    Unit::CreateOrUpdate( this, 
-                          "鐢熶骇", 
-                          "鐢熶骇", 
-                          "澶╅┈闆嗗洟", 
-                          capacitytype, 
-                          unitofmeasurename );
-    
-    Unit::CreateOrUpdate( this, 
-                          "渚涘簲鍟�", 
-                          "渚涘簲鍟�", 
-                          "澶╅┈闆嗗洟", 
-                          capacitytype, 
-                          unitofmeasurename );
-    
-    Unit::CreateOrUpdate( this, 
-                          "鏁磋溅杩愯緭", 
-                          "鏁磋溅杩愯緭", 
-                          "澶╅┈闆嗗洟", 
-                          capacitytype, 
-                          unitofmeasurename );
-    
-    // Get the unit list
-    traverse( listtodeal, Elements, item){
-      OrgName := item.OrganName();
-      if( OrgName = ''){
-        OrgName := item.OrganCode();
-      }
-      //Get the first level unit
-      Unit::CreateOrUpdate( this, 
-                            item.OrganCode(), 
-                            OrgName, 
-                            "鐢熶骇", 
-                            capacitytype, 
-                            unitofmeasurename );
-                           
-      //Get the second level unit
-      secondlevelid := item.OrganCode() + "_" + item.PlantName();
-      Unit::CreateOrUpdate( this, 
-                            secondlevelid, 
-                            secondlevelid, 
-                            item.OrganCode(), 
-                            capacitytype, 
-                            unitofmeasurename );
-        
-      //Get the third level unit
-      thirdlevelid := secondlevelid + "_" + item.ProcessSection();
-      Unit::CreateOrUpdate( this, 
-                            thirdlevelid, 
-                            thirdlevelid, 
-                            secondlevelid, 
-                            "Time", 
-                            item.UnitOfMeasureName() );
-                   
-      //Get the last level unit
-      if( item.Line()<>"" ){
-        lastlevelid := thirdlevelid + "_" + item.Line();
-        Unit::CreateOrUpdate( this, 
-                              lastlevelid, 
-                              lastlevelid, 
-                              thirdlevelid, 
-                              "Time", 
-                              item.UnitOfMeasureName() );
-      }
-      }
+    //// Administrator Aug-21-2023 (created)
+    //// list to deal
+    //listtodeal := construct( structured[MappingOperation] );
+    //
+    //if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
+    //    listtodeal := selectset( this, MappingOperation, item, true );
+    //} else {
+    //    listtodeal := selectset( this, MappingOperation, item, 
+    //                             businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0
+    //                              );
+    //}
+    //
+    ////Set the Default values
+    //unitofmeasurename := "PCS";
+    //capacitytype := "Infinite";
+    //
+    //// Get the root data
+    //Unit::CreateOrUpdate( this, 
+    //                      "澶╅┈闆嗗洟", 
+    //                      "澶╅┈闆嗗洟", 
+    //                      "", 
+    //                      capacitytype, 
+    //                      unitofmeasurename );
+    //
+    //// Get the sub root data
+    //Unit::CreateOrUpdate( this, 
+    //                      "鐢熶骇", 
+    //                      "鐢熶骇", 
+    //                      "澶╅┈闆嗗洟", 
+    //                      capacitytype, 
+    //                      unitofmeasurename );
+    //
+    //Unit::CreateOrUpdate( this, 
+    //                      "渚涘簲鍟�", 
+    //                      "渚涘簲鍟�", 
+    //                      "澶╅┈闆嗗洟", 
+    //                      capacitytype, 
+    //                      unitofmeasurename );
+    //
+    //Unit::CreateOrUpdate( this, 
+    //                      "鏁磋溅杩愯緭", 
+    //                      "鏁磋溅杩愯緭", 
+    //                      "澶╅┈闆嗗洟", 
+    //                      capacitytype, 
+    //                      unitofmeasurename );
+    //
+    //// Get the unit list
+    //traverse( listtodeal, Elements, item){
+    //  OrgName := item.OrganName();
+    //  if( OrgName = ''){
+    //    OrgName := item.OrganCode();
+    //  }
+    //  //Get the first level unit
+    //  Unit::CreateOrUpdate( this, 
+    //                        item.OrganCode(), 
+    //                        OrgName, 
+    //                        "鐢熶骇", 
+    //                        capacitytype, 
+    //                        unitofmeasurename );
+    //                       
+    //  //Get the second level unit
+    //  secondlevelid := item.OrganCode() + "_" + item.PlantName();
+    //  Unit::CreateOrUpdate( this, 
+    //                        secondlevelid, 
+    //                        secondlevelid, 
+    //                        item.OrganCode(), 
+    //                        capacitytype, 
+    //                        unitofmeasurename );
+    //    
+    //  //Get the third level unit
+    //  thirdlevelid := secondlevelid + "_" + item.ProcessSection();
+    //  Unit::CreateOrUpdate( this, 
+    //                        thirdlevelid, 
+    //                        thirdlevelid, 
+    //                        secondlevelid, 
+    //                        "Time", 
+    //                        item.UnitOfMeasureName() );
+    //               
+    //  //Get the last level unit
+    //  if( item.Line()<>"" ){
+    //    lastlevelid := thirdlevelid + "_" + item.Line();
+    //    Unit::CreateOrUpdate( this, 
+    //                          lastlevelid, 
+    //                          lastlevelid, 
+    //                          thirdlevelid, 
+    //                          "Time", 
+    //                          item.UnitOfMeasureName() );
+    //  }
+    //  }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingUnitOfMeasureData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingUnitOfMeasureData.qbl
index 2c4ce55..c4a9894 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingUnitOfMeasureData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingUnitOfMeasureData.qbl
@@ -5,19 +5,19 @@
   Description: 'ETL鏁版嵁杞ā鍨嬫暟鎹�'
   TextBody:
   [*
-    // yypsybs Aug-15-2023 (created)
-    
-    defaultOld := UnitOfMeasure_MP::FindDefault( this );
-    defaultNew := select( this, MappingUnitOfMeasure, item, true, item.IsDefault() );
-    
-    if( not isnull( defaultOld ) and not isnull( defaultNew )
-        and defaultOld.Name() <> defaultNew.Name() ) {
-        defaultOld.IsDefault(false);
-        //error( "multi default unit of measure" )
-    }
-    
-    traverse( this, MappingUnitOfMeasure, item ) {
-        UnitOfMeasure_MP::CreateOrUpdate( this, item.Name(), item.IsDefault() );
-    }
+    //// yypsybs Aug-15-2023 (created)
+    //
+    //defaultOld := UnitOfMeasure_MP::FindDefault( this );
+    //defaultNew := select( this, MappingUnitOfMeasure, item, true, item.IsDefault() );
+    //
+    //if( not isnull( defaultOld ) and not isnull( defaultNew )
+    //    and defaultOld.Name() <> defaultNew.Name() ) {
+    //    defaultOld.IsDefault(false);
+    //    //error( "multi default unit of measure" )
+    //}
+    //
+    //traverse( this, MappingUnitOfMeasure, item ) {
+    //    UnitOfMeasure_MP::CreateOrUpdate( this, item.Name(), item.IsDefault() );
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl b/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl
deleted file mode 100644
index dc5d8d6..0000000
--- a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl
+++ /dev/null
@@ -1,149 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan,
-  Strings businessTypes,
-  Boolean isKeyProduct,
-  Boolean createPurchaseSupplyMaterial
-)
-{
-  Description: '鍗曟鍚屾'
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    // 甯佺鍜屽竵绉嶆眹鐜�
-    //Currency_MP::CreateCurrencyFromJson( macroPlan, jsonDataRow );
-    info( "Prepare to do sync" )
-    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
-        traverse( businessTypes, Elements, item ) {
-            info( "Business type : " + item )  
-        }
-    }
-    info( "KeyProduct : " + [String]isKeyProduct )
-    info( "Create purchase supply material : " + [String]createPurchaseSupplyMaterial )
-    
-    // 鍒濆鎹�-0
-    info( "Start Initial" );
-    macroPlan.InitialUnitAndStockingPoint();
-    
-    // 鍗曚綅-1
-    UnitOfMeasure_MP::DoSync( macroPlan );
-    
-    // 閿�鍞儴闂�-2
-    SalesSegment_MP::DoSync( macroPlan, businessTypes );
-    
-    // 搴撳瓨鐐�-3
-    info( "Sales Segment Finished, Start Get StockingPoint From Api" )
-    bodynumber := "2";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetStockingPointsInfo";
-    port := 443;
-    data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
-    macroPlan.ApiStockingPointData( data );
-    
-    // 璐у竵淇℃伅-4
-    info( "Get StockingPoint From Api Finished, Start Get CurrencyInfo From Api" )
-    bodynumber := "1";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrenciesInfo";
-    port := 443;
-    data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
-    macroPlan.ApiCurenciesData( data );
-    
-    //璐у竵姹囩巼淇℃伅-5
-    info( "Get CurrencyInfo From Api Finished, Start Get CurrencyRates From Api" )
-    bodynumber := "5";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrencyRatesInfo";
-    port := 443;
-    data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
-    macroPlan.ApiCurencyRatesData( data );
-    
-    // 浜у搧鐗╂枡-6
-    info( "Get CurrencyRates From Api Finished, Start Product Data Broker" )
-    macroPlan.Broker_OTD_Product().Execute();
-    info( "Product Data Broker Finished, Start Product Mapping" );
-    //testproduct := construct( Strings );
-    macroPlan.MappingProductData( businessTypes, false );
-    
-    //鍗曚綅杞崲-7
-    BaseConversionFactor::DoSync( macroPlan );
-    
-    // Unit-9 
-    // 涓嶰peration涓�鍚屽鐞�
-    info( "BaseConversionFactor Finished, Start Operation Data Broker" );
-    macroPlan.Broker_OTD_Operation().Execute();
-    info( "Operation Data Broker Finished, Start Unit Mapping" );
-    macroPlan.MappingUnitData( businessTypes );
-    
-    // 宸ヨ壓璺嚎 + BOM-9
-    info( "Unit Finished, Start Operation Mapping" );
-    macroPlan.MappingOperationData( businessTypes );  
-    info( "Operation Finished, Start BOM Data Broker" );
-    macroPlan.Broker_OTD_BOM().Execute();
-    info( "BOM Data Broker Finished, Start BOM Mapping" );
-    macroPlan.MappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
-    
-    //杞﹂亾淇℃伅-10
-    info( "BOM Finished, Start Get Lanes From Api" );
-    bodynumber := "3";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLanesInfo";
-    port := 443;
-    data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
-    macroPlan.ApiLanesData( data );
-    
-    //杞﹂亾杩愯緭娈�-11
-    info( "Get Lanes From Api Finished, Start Get LaneLegs From Api" );
-    bodynumber := "4";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLaneLegsInfo";
-    port := 443;
-    data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
-    macroPlan.ApiLaneLegsData( data );
-    
-    //// 渚涘簲缃戠粶锛堣溅閬擄級-12
-    //info( "Get Lanelegs From Api Finished, Start ProductInLane Data Broker" );
-    //macroPlan.Broker_OTD_ProductInLane().Execute();
-    //info( "ProductInLane Data Broker Finished, Start ProductInLane Mapping" );
-    //macroPlan.MappingProductInLaneData();
-    
-    // 鍦ㄥ簱搴撳瓨鏁版嵁-13
-    info( "ProductInLane Finished, Start ActualPISPIP Data Broker" );
-    macroPlan.Broker_OTD_ActualPISPIP().Execute();
-    info( "ActualPISPIP Data Broker Finished, Start ActualPISPIP Mapping" );
-    //macroPlan.MappingActualPISPIPData( businessTypes, true );
-    macroPlan.MappingActualPISPIPData( businessTypes, false );
-    
-    // 鍦ㄩ�斿簱瀛�-14
-    info( "ActualPISPIP Finished, Start ExternalSupply Data Broker" );
-    macroPlan.Broker_OTD_ExternalSupply().Execute();
-    //macroPlan.MappingExternalSupplyData( businessTypes, true );
-    info( "ExternalSupply Data Broker Finished, Start ExternalSupply Mapping" );
-    macroPlan.MappingExternalSupplyData( businessTypes, false );
-    
-    // 搴撳瓨鎴愭湰-15
-    InventoryValueAndCost::DoSync( macroPlan );
-    
-    //// todo 鍒堕�犳垚鏈�-16
-    //info( "InventoryCost Finished, Start OperationCost Mapping" );
-    //macroPlan.MappingOperationCostData( businessTypes );
-    
-    // 璁㈠崟棰勬祴-17
-    Forecast::DoSync( macroPlan, businessTypes );
-    
-    // 璁㈠崟闇�姹�-18
-    CustomerOrder::DoSync( macroPlan, businessTypes );
-    
-    //// todo 渚涘簲鍟嗚兘鍔�
-    //info( "ProviderCapacity::DoSync" )
-    
-    //// todo 渚涘簲鍟嗗洖澶�
-    //info( "ProviderReply::DoSync" )
-  *]
-}
diff --git "a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync\043618.qbl" "b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043331.qbl"
similarity index 72%
rename from "_Main/BL/Type_MacroPlan/StaticMethod_DoSync\043618.qbl"
rename to "_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043331.qbl"
index c3d0398..dc03063 100644
--- "a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync\043618.qbl"
+++ "b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043331.qbl"
@@ -1,7 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-StaticMethod DoSync (
+StaticMethod DoSyncNew (
   MacroPlan macroPlan,
+  MPSync mpSync,
   String businessTypeStr,
   Boolean isKeyProduct,
   Boolean createPurchaseSupplyMaterial
@@ -15,6 +16,6 @@
     if( businessTypeStr.Length() > 0 ) {
         businessTypes := businessTypeStr.Tokenize( ',' );
     }
-    MacroPlan::DoSync( macroPlan, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
+    MacroPlan::DoSyncNew( macroPlan, mpSync, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync.qbl "b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043821.qbl"
similarity index 63%
rename from _Main/BL/Type_MacroPlan/StaticMethod_DoSync.qbl
rename to "_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043821.qbl"
index 4609620..c7824af 100644
--- a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync.qbl
+++ "b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew\043821.qbl"
@@ -1,7 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-StaticMethod DoSync (
+StaticMethod DoSyncNew (
   MacroPlan macroPlan,
+  MPSync mpSync,
   Boolean isKeyProduct,
   Boolean createPurchaseSupplyMaterial
 )
@@ -11,6 +12,6 @@
   [*
     // yypsybs Aug-17-2023 (created)
     businessTypes := construct( Strings );
-    MacroPlan::DoSync( macroPlan, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
+    MacroPlan::DoSyncNew( macroPlan, mpSync, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl
new file mode 100644
index 0000000..a66613b
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DoSyncNew (
+  MacroPlan macroPlan,
+  MPSync mpSync,
+  Strings businessTypes,
+  Boolean isKeyProduct,
+  Boolean createPurchaseSupplyMaterial
+)
+{
+  Description: '鍗曟鍚屾'
+  TextBody:
+  [*
+    // yypsybs Aug-31-2023 (created)
+    mpSync.ImportDBDataCustom( macroPlan, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
+  *]
+}
diff --git a/_Main/BL/Type_MappingBOM/Attribute_DescriptionOfAlternativeMaterial.qbl b/_Main/BL/Type_MappingBOM/Attribute_DescriptionOfAlternativeMaterial.qbl
deleted file mode 100644
index d0064b7..0000000
--- a/_Main/BL/Type_MappingBOM/Attribute_DescriptionOfAlternativeMaterial.qbl
+++ /dev/null
@@ -1,7 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute DescriptionOfAlternativeMaterial
-{
-  #keys: '3[412960.0.86934734][412960.0.86934733][412960.0.86934735]'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_MappingOperation/StaticMethod_FindMinSeq.qbl b/_Main/BL/Type_MappingOperation/StaticMethod_FindMinSeq.qbl
index 74aadb6..4b74ebe 100644
--- a/_Main/BL/Type_MappingOperation/StaticMethod_FindMinSeq.qbl
+++ b/_Main/BL/Type_MappingOperation/StaticMethod_FindMinSeq.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod FindMinSeq (
-  MacroPlan macroPlan,
+  MPSync mpSync,
   String orgCode,
   String productId,
   String processSection
@@ -10,7 +10,7 @@
   TextBody:
   [*
     // yypsybs Aug-22-2023 (created)
-    return guard (min( macroPlan, MappingOperation, item, 
+    return guard (min( mpSync, MappingOperation, item, 
                 item.OrganCode() = orgCode and item.ProductID() = productId and item.ProcessSection() = processSection,
                 item.SequenceNumber() ), Number::MinNumber() );
   *]
diff --git a/_Main/BL/Type_SalesSegment_MP/StaticMethod_DoSync.qbl b/_Main/BL/Type_SalesSegment_MP/StaticMethod_DoSync.qbl
deleted file mode 100644
index ef1ffae..0000000
--- a/_Main/BL/Type_SalesSegment_MP/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan,
-  Strings businessTypes
-)
-{
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "UnitOfMeasure_MP Finished, Start Sales Segment Data Broker" )
-    macroPlan.Broker_OTD_SalesSegment().Execute();
-    info( "Sales Segment Data Broker Finished, Start Sales Segment Mapping" )
-    macroPlan.MappingSalesSegmentData( businessTypes );
-  *]
-}
diff --git a/_Main/BL/Type_Unit/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_Unit/StaticMethod_NewStaticMethod.qbl
deleted file mode 100644
index 341c388..0000000
--- a/_Main/BL/Type_Unit/StaticMethod_NewStaticMethod.qbl
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod NewStaticMethod (
-  MacroPlan macroPlan,
-  String unitid,
-  String unitname,
-  String parentid,
-  String capacitytype,
-  String unitofmeasurename,
-  String currencyid,
-  Date startdate,
-  Date enddate
-)
-{
-  TextBody:
-  [*
-    // Administrator Sep-1-2023 (created)
-  *]
-}
diff --git a/_Main/BL/Type_UnitOfMeasure_MP/StaticMethod_DoSync.qbl b/_Main/BL/Type_UnitOfMeasure_MP/StaticMethod_DoSync.qbl
deleted file mode 100644
index f5ea0a0..0000000
--- a/_Main/BL/Type_UnitOfMeasure_MP/StaticMethod_DoSync.qbl
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod DoSync (
-  MacroPlan macroPlan
-)
-{
-  Description: '鍗曟鍚屾'
-  TextBody:
-  [*
-    // yypsybs Aug-17-2023 (created)
-    info( "Inital Finished, Start UnitOfMeasure_MP Data Broker" )
-    macroPlan.Broker_OTD_UnitOfMeasure().Execute();
-    info( "UnitOfMeasure_MP Data Broker Finished, Start UnitOfMeasure_MP Mapping" )
-    macroPlan.MappingUnitOfMeasureData();
-  *]
-}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuDoSync_OnClick.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuDoSync_OnClick.def
index 6253182..907d127 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuDoSync_OnClick.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuDoSync_OnClick.def
@@ -5,11 +5,11 @@
   #keys: '[414384.0.605664178]'
   Body:
   [*
-    MacroPlan::DoSync( MacroPlan,false,false);
+    MacroPlan::DoSyncNew( MacroPlan, MPSync, false,false );
   *]
   DefinitionID: 'Responsedef_Menu_OnClick'
   Precondition:
   [*
-    return not isnull( MacroPlan );
+    return not isnull( MacroPlan ) and not isnull( MPSync );
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
index e97d405..1bbb117 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
@@ -87,15 +87,15 @@
       }  
     }
     
-    macroPlanNew := MacroPlan;
-    ManufactureLTImputation::Transfer( macroPlanOld, macroPlanNew );
-    
     // sync data
     if( data.EnableSync() ) {
-        MacroPlan::DoSync( macroPlanNew, 
+        MacroPlan::DoSyncNew( DataHolderMacroPlanner.Data(), MPSync, 
                            data.BusinessType(), data.IsKeyProduct(), data.CreatePurchaseSupplyMaterial() );
     }
     
+    macroPlanNew := MacroPlan;
+    ManufactureLTImputation::Transfer( macroPlanOld, macroPlanNew );
+    
     this.Close();
   *]
 }

--
Gitblit v1.9.3