From ee6759c54c0ec9ffe92de80268cf3a1d6ecb05a6 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期三, 27 九月 2023 18:14:49 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/TIANMA_JITUAN into dev_lhj

---
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl                                                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def                                                                              |    2 
 _Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl                                                                                                         |    2 
 _Main/BL/Type_YuxTest/Attribute_TestString.qbl                                                                                                                                |    7 
 _Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl                                                                                                        |    2 
 _Main/BL/Type_YuxTest/Attribute_TestReal.qbl                                                                                                                                  |    7 
 _Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl                                                                                                                          |    6 
 _Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl                                                                                                                               |    7 
 _Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl                                                                                                                        |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl                                                                           |   23 +
 _Main/BL/Type_ImportExcel/Method_Execute.qbl                                                                                                                                  |   43 ++
 _Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl                                                                                                                 |   62 ++
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def                                                   |    4 
 _Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl                                                                                        |    2 
 _Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl                                                                                                                        |   47 ++
 _Main/BL/Type_YuxTest/Attribute_TestDate.qbl                                                                                                                                  |    7 
 LibSOPImportExport/metadata.properties                                                                                                                                        |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 +
 _Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl                                                                                                  |    6 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport#522.qbl                                                                                |    5 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl                                                                           |   23 +
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 +
 _Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl                                                                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def                                                     |    4 
 _Main/BL/Type_YuxTest/StaticMethod_Export.qbl                                                                                                                                 |   85 ++++
 _Main/BL/Type_YuxTest/StaticMethod_ExportTest#887.qbl                                                                                                                         |   26 +
 LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport#382.qbl                                                                                                  |    4 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl                                                                           |   23 +
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl                                                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def                                                                   |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def                                                              |    4 
 _Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl                                                                                                                  |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def                                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def                                                     |    4 
 _Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl                                                                                                                |   10 
 _Main/BL/Type_YuxTest/Attribute_TestNumber.qbl                                                                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def                                                                               |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl                                                                           |   23 +
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl                                                                                                           |   38 +-
 _Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl                                                                                                |    6 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl                                                                                                |    2 
 _Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl                                                                                                         |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def                                                                          |   21 +
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl                                                                                                            |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def                                                                           |   12 
 _Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl                                                                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def                                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton#713.def                                                                 |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl                                                                           |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def                                                   |   12 
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl                                                                                                             |    8 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart#156.qbl                                                                                                         |   20 
 _Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl                                                                                                                  |   29 +
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl                                                                                         |    6 
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl                                                                                                                    |   75 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def             |    4 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl                                                                                                             |    0 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl                                                                                    |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def                                                  |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def                                                                        |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def                                                  |   14 
 _Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl                                                                                                                                  |    9 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl                                                                           |   24 +
 /dev/null                                                                                                                                                                     |    6 
 _Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl                                                                            |    2 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl                                                                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC#663.def |    2 
 _Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl                                                                                                                 |   45 ++
 _Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl                                                                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def             |    2 
 LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl                                                                                               |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl                                                                           |   23 +
 _Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl                                                                                                                 |   23 +
 _Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl                                                                                                                           |   22 +
 77 files changed, 917 insertions(+), 138 deletions(-)

diff --git a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
index 9f508eb..c429f65 100644
--- a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
+++ b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
@@ -12,7 +12,6 @@
     Cardinality: '1toN'
     ObjectDefinition: MPSync
     OwningSide: 'Owned'
-    InterfaceProperties { Accessibility: 'Module' }
   }
   RelationSide.RightSide MPSync
   {
@@ -20,6 +19,5 @@
     Cardinality: '0to1'
     ObjectDefinition: ImportExcel
     OwningSide: 'Reference'
-    InterfaceProperties { Accessibility: 'Module' }
   }
 }
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
index 4ea6109..af8fd45 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
@@ -1,6 +1,9 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o, Boolean needUserUploadAllFiles) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o,
+  Boolean needUserUploadAllFiles
+) remote as Boolean
 {
   TextBody:
   [*
diff --git a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
index b8c6585..a6720f7 100644
--- a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
+++ b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   TextBody:
   [*
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
index 590b315..d9785ad 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method CanImport (output Strings missingFiles_o) as Boolean
+Method CanImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   Description: 'Checks if necessary files are sufficent before starting import.'
   TextBody:
diff --git a/LibSOPImportExport/metadata.properties b/LibSOPImportExport/metadata.properties
index c38fbdb..6d65136 100644
--- a/LibSOPImportExport/metadata.properties
+++ b/LibSOPImportExport/metadata.properties
@@ -5,4 +5,4 @@
 system=false
 version.component=2022.3.0.0
 version.fileformat=2
-version.quintiq=6.3.3.0 NightlyBuild 247983, build 247983
+version.quintiq=6.3.3.0 , build 248673
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl
new file mode 100644
index 0000000..2d5380f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeChartElement
+{
+  #keys: '1[414384.0.921264786]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264788][414384.0.921264787][414384.0.921264789]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeChartElement
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeChartElement
+  {
+    #keys: '3[414384.0.921264791][414384.0.921264790][414384.0.921264792]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl
deleted file mode 100644
index fcd971b..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeChartElement
-{
-  #keys: '1[414384.0.852466576]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.852466578][414384.0.852466577][414384.0.852466579]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeChartElement
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeChartElement
-  {
-    #keys: '3[414384.0.852466581][414384.0.852466580][414384.0.852466582]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl
new file mode 100644
index 0000000..a5fe974
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeChartRow
+{
+  #keys: '1[414384.0.921264769]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264771][414384.0.921264770][414384.0.921264772]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeChartRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeChartRow
+  {
+    #keys: '3[414384.0.921264774][414384.0.921264773][414384.0.921264775]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl
deleted file mode 100644
index 13e8d6d..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeChartRow
-{
-  #keys: '1[414384.0.852471828]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.852471830][414384.0.852471829][414384.0.852471831]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeChartRow
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeChartRow
-  {
-    #keys: '3[414384.0.852471833][414384.0.852471832][414384.0.852471834]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl
new file mode 100644
index 0000000..132284d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeCompareItemColumn
+{
+  #keys: '1[414384.0.921264730]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][414384.0.921264749][414384.0.921264743][414384.0.921264750][414384.0.921264744][414384.0.921264751][414384.0.921264745][414384.0.921264752][414384.0.921264746][414384.0.921264753][414384.0.921264747][414384.0.921264754][414384.0.921264748]'
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264732][414384.0.921264731][414384.0.921264733]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeCompareItemColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeCompareItemColumn
+  {
+    #keys: '3[414384.0.921264735][414384.0.921264734][414384.0.921264736]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl
deleted file mode 100644
index 07afbdf..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl
+++ /dev/null
@@ -1,26 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeCompareItemColumn
-{
-  #keys: '1[414384.0.816631032]'
-  ProceduralSequenceRelationStrategy
-  {
-    #keys: '13[0.0.0][414384.0.827659683][414384.0.827659677][414384.0.827659684][414384.0.827659678][414384.0.827659685][414384.0.827659679][414384.0.827659686][414384.0.827659680][414384.0.827659687][414384.0.827659681][414384.0.827659688][414384.0.827659682]'
-    SequenceElementSuffix: 'ColumnInManager'
-    SequenceSuffix: 'ColumnInManager'
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631034][414384.0.816631033][414384.0.816631035]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeCompareItemColumn
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeCompareItemColumn
-  {
-    #keys: '3[414384.0.816631037][414384.0.816631036][414384.0.816631038]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl
new file mode 100644
index 0000000..d33c56f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeCompareItemRow
+{
+  #keys: '1[414384.0.921264713]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264715][414384.0.921264714][414384.0.921264716]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeCompareItemRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeCompareItemRow
+  {
+    #keys: '3[414384.0.921264718][414384.0.921264717][414384.0.921264719]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl
deleted file mode 100644
index 59829f6..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeCompareItemRow
-{
-  #keys: '1[414384.0.816631016]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631018][414384.0.816631017][414384.0.816631019]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeCompareItemRow
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeCompareItemRow
-  {
-    #keys: '3[414384.0.816631021][414384.0.816631020][414384.0.816631022]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl
new file mode 100644
index 0000000..f0b0349
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterBusinessType
+{
+  #keys: '1[414384.0.921264696]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264698][414384.0.921264697][414384.0.921264699]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterBusinessType
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterBusinessType
+  {
+    #keys: '3[414384.0.921264701][414384.0.921264700][414384.0.921264702]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl
deleted file mode 100644
index fe18a82..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSaleBudgeFilterBusinessType
-{
-  #keys: '1[414384.0.873958122]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MPSync
-  {
-    #keys: '3[414384.0.873958124][414384.0.873958123][414384.0.873958125]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterBusinessType
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterBusinessType
-  {
-    #keys: '3[414384.0.873958127][414384.0.873958126][414384.0.873958128]'
-    Cardinality: '1toN'
-    ObjectDefinition: MPSync
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
new file mode 100644
index 0000000..7933192
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterItem
+{
+  #keys: '1[414384.0.921264679]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264681][414384.0.921264680][414384.0.921264682]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterItem
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterItem
+  {
+    #keys: '3[414384.0.921264684][414384.0.921264683][414384.0.921264685]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl
deleted file mode 100644
index 041c7c2..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterItem
-{
-  #keys: '1[414384.0.816665103]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816665105][414384.0.816665104][414384.0.816665106]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterItem
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterItem
-  {
-    #keys: '3[414384.0.816665108][414384.0.816665107][414384.0.816665109]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl
new file mode 100644
index 0000000..d8b447f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterMonth
+{
+  #keys: '1[414384.0.921264662]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264664][414384.0.921264663][414384.0.921264665]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterMonth
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterMonth
+  {
+    #keys: '3[414384.0.921264667][414384.0.921264666][414384.0.921264668]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl
deleted file mode 100644
index cc133c7..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterMonth
-{
-  #keys: '1[414384.0.816631074]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631076][414384.0.816631075][414384.0.816631077]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterMonth
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterMonth
-  {
-    #keys: '3[414384.0.816631079][414384.0.816631078][414384.0.816631080]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl
new file mode 100644
index 0000000..e10c202
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+{
+  #keys: '1[414384.0.921264645]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264647][414384.0.921264646][414384.0.921264648]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+  {
+    #keys: '3[414384.0.921264650][414384.0.921264649][414384.0.921264651]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl
deleted file mode 100644
index ef6b268..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-{
-  #keys: '1[414384.0.873958138]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MPSync
-  {
-    #keys: '3[414384.0.873958140][414384.0.873958139][414384.0.873958141]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-  {
-    #keys: '3[414384.0.873958143][414384.0.873958142][414384.0.873958144]'
-    Cardinality: '1toN'
-    ObjectDefinition: MPSync
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
new file mode 100644
index 0000000..8df8fb7
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterYear
+{
+  #keys: '1[414384.0.921264628]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264630][414384.0.921264629][414384.0.921264631]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterYear
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterYear
+  {
+    #keys: '3[414384.0.921264633][414384.0.921264632][414384.0.921264634]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl
deleted file mode 100644
index 5fb08a4..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterYear
-{
-  #keys: '1[414384.0.816631057]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631059][414384.0.816631058][414384.0.816631060]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterYear
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterYear
-  {
-    #keys: '3[414384.0.816631062][414384.0.816631061][414384.0.816631063]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl b/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl
new file mode 100644
index 0000000..743c739
--- /dev/null
+++ b/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation YuxTest_MPSync_MPSync_YuxTest
+{
+  #keys: '1[414384.0.915854641]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.915854643][414384.0.915854642][414384.0.915854644]'
+    Cardinality: '0to1'
+    ObjectDefinition: YuxTest
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide YuxTest
+  {
+    #keys: '3[414384.0.915854646][414384.0.915854645][414384.0.915854647]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
index 39c29d0..3d1269f 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod TestData (
-  ScenarioManager scenarioManager
+  GlobalOTDTable parent
 )
 {
   Description: '鐢熸垚娴嬭瘯鏁版嵁'
@@ -11,7 +11,7 @@
     
     info( "鐢熸垚骞村害浜ч攢棰勭畻鎶ヨ〃娴嬭瘯鏁版嵁" )
     
-    scenarioManager.CapacityAndSaleBudgeChartElement( relflush );
+    parent.CapacityAndSaleBudgeChartElement( relflush );
     
     for( sc := 0; sc < 4; sc := sc + 1 ) {
       scenarioName := "SC" + [String]sc;
@@ -19,7 +19,7 @@
         businessTypeString := "BT" + [String]i;
         for( j := 1; j <= 12; j := j + 1 ) {
           monthString := "MONTH" + ifexpr( j < 10, "0" + [String]j, [String]j );
-          scenarioManager.CapacityAndSaleBudgeChartElement( relnew, 
+          parent.CapacityAndSaleBudgeChartElement( relnew, 
                                                             BusinessTypeOrPlaceOfProductionOfArray := businessTypeString, 
                                                             TimeStringAndScenarioName := monthString + " - " + scenarioName, 
                                                             Quantity := Real::Random( 20.0, 30.0 ) );
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
index cb76a5f..76a61fb 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager scenarioManager,
+  GlobalOTDTable parent,
   String businessType,
   String placeOfProductionOfArray
 ) as CapacityAndSaleBudgeChartRow
@@ -9,9 +9,9 @@
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( scenarioManager, CapacityAndSaleBudgeChartRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
+    value := select( parent, CapacityAndSaleBudgeChartRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
     if( isnull( value ) ) {
-      value := scenarioManager.CapacityAndSaleBudgeChartRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
+      value := parent.CapacityAndSaleBudgeChartRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
     } 
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
index 1e42b21..77bfe99 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
@@ -1,16 +1,16 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager manager,
+  GlobalOTDTable parent,
   String columnName
 ) as CapacityAndSaleBudgeCompareItemColumn
 {
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( manager, CapacityAndSaleBudgeCompareItemColumn, item, item.ColumnName() = columnName );
+    value := select( parent, CapacityAndSaleBudgeCompareItemColumn, item, item.ColumnName() = columnName );
     if( isnull( value ) ) {
-      value := manager.CapacityAndSaleBudgeCompareItemColumn( relnew, ColumnName := columnName );  
+      value := parent.CapacityAndSaleBudgeCompareItemColumn( relnew, ColumnName := columnName );  
     }
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
index e155e81..7a485f5 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager scenarioManager,
+  GlobalOTDTable parent,
   String businessType,
   String placeOfProductionOfArray
 ) as CapacityAndSaleBudgeCompareItemRow
@@ -9,9 +9,9 @@
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( scenarioManager, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
+    value := select( parent, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
     if( isnull( value ) ) {
-      value := scenarioManager.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
+      value := parent.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
     } 
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
index 4e3f888..33a800b 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  MPSync parent,
+  GlobalOTDTable parent,
   String value
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
index 02b6d70..e05188e 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager parent,
+  GlobalOTDTable parent,
   String itemName
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
index 1e15a86..14b634a 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧姣旈」'
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
index ae10a43..f14808d 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧勾浠�'
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
index 6bb6aff..3e96143 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  MPSync parent,
+  GlobalOTDTable parent,
   String value
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
index 7fa388c..dc5898d 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧勾浠�'
diff --git "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl" "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
similarity index 96%
rename from "_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
rename to "_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
index c543694..6afbad7 100644
--- "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
+++ "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
@@ -25,27 +25,27 @@
     // 闈㈡澘鍩哄湴;浜嬩笟閮�
     info( byBusinessTypeOrByOrgCode );
     traverse( businessTypes, Elements, businessType ) {
-      info( "businessType : " + businessType.BusinessType() );
+      debuginfo( "businessType : " + businessType.BusinessType() );
     }
     traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-      info( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
+      debuginfo( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
     }
     traverse( macroPlans, Elements, macroPlan ) {
-      info( "macroPlan : " + macroPlan.ScenarioName() );  
+      debuginfo( "macroPlan : " + macroPlan.ScenarioName() );  
     }
     // 骞翠唤涓嶉�夋椂鍏ㄩ��
     if( years.Size() = 0 ) {
       years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
     }
     traverse( years, Elements, year ) {
-      info( "yearNo : " + [String]year.YearNo() );
+      debuginfo( "yearNo : " + [String]year.YearNo() );
     }
     // 鏈堜唤涓嶉�夋椂鍏ㄩ��
     if( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, true, item.MonthNo() );
     }
     traverse( months, Elements, month ) {
-      info( "monthNo : " + [String]month.MonthNo() );
+      debuginfo( "monthNo : " + [String]month.MonthNo() );
     }
     
     // ====娓呯悊鏃ф暟鎹�====
@@ -74,7 +74,7 @@
     businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
     // 鐢熸垚鍥捐〃鍏冪礌
     traverse( years, Elements, year ) {
-      info( "process year start : " + [String]year.YearNo() );
+      debuginfo( "process year start : " + [String]year.YearNo() );
       if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
         // 鐩爣
         traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
@@ -232,7 +232,7 @@
       }
       if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
         for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-          info( "process season start : " + [String]seasonNo );
+          debuginfo( "process season start : " + [String]seasonNo );
           traverse( businessTypeList, Elements, businessType ) {
             productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
             this.CapacityAndSaleBudgeChartElement( relnew, 
@@ -259,7 +259,7 @@
       }
       if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
         traverse( months, Elements, month ) {
-          info( "process month start : " + [String]month.MonthNo() );
+          debuginfo( "process month start : " + [String]month.MonthNo() );
           monthNoString := ifexpr( month.MonthNo() <= 9, "0" + [String]month.MonthNo(), [String]month.MonthNo() );
           traverse( businessTypeList, Elements, businessType ) {
             productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
@@ -282,10 +282,10 @@
                                                      ); 
             }            
           }
-          info( "process month end : " + [String]month.MonthNo() );
+          debuginfo( "process month end : " + [String]month.MonthNo() );
         }
       }
-      info( "process year end : " + [String]year.YearNo() )
+      debuginfo( "process year end : " + [String]year.YearNo() )
     }
     //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
     //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
similarity index 100%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
similarity index 89%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
index d5d4352..90a0bff 100644
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
@@ -22,23 +22,23 @@
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
     }
     traverse( macroPlans, Elements, item ) {
-      info( "scenario : " + item.ScenarioName() );
+      debuginfo( "scenario : " + item.ScenarioName() );
     }
     traverse( items, Elements, item ) {
-      info( "item : " + item.ItemName() );
+      debuginfo( "item : " + item.ItemName() );
     }
     traverse( years, Elements, item ) {
-      info( "year : " + [String]item.YearNo() );
+      debuginfo( "year : " + [String]item.YearNo() );
     }
     traverse( months, Elements, item ) {
-      info( "month : " + [String]item.MonthNo() );
+      debuginfo( "month : " + [String]item.MonthNo() );
     }
     // ====娓呯悊鏃ф暟鎹�====
     this.CapacityAndSaleBudgeCompareItemRow( relflush );
     this.CapacityAndSaleBudgeCompareItemColumn( relflush );
     // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
     historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
-    info( "historyData : " + [String]historyData.Size() )
+    debuginfo( "historyData : " + [String]historyData.Size() )
     traverse( historyData, Elements, one ) {
       productCode := one.ProductCode();
       MappingBOM::CreateTestData( mappingParent, "浜嬩笟閮�" + [String](productCode.Length() mod 3), [String](productCode.Length() mod 4), productCode );
@@ -52,13 +52,13 @@
         // 璁板綍姣忚鍖呭惈鍝簺product
         CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
       } else {
-        info( "no boms for product : " + productCode );
+        debuginfo( "no boms for product : " + productCode );
       }
     }
-    info( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
+    debuginfo( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
     // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
     // 浜嬩笟閮紝缁勭粐
-    info( "dealing businessType and placeOfProductionOfArray" )
+    debuginfo( "dealing businessType and placeOfProductionOfArray" )
     columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
     columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
     traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -72,9 +72,9 @@
     info( "dealing 闈㈡澘鍒嗛厤閲�" )
     if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
       traverse( years, Elements, year ) {
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
         // 鍘嗗彶鏁版嵁
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
         traverse( months, Elements, month ) {
           columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
           traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -89,7 +89,7 @@
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
         }
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
         // S&OP鏁版嵁
         traverse( macroPlans, Elements, macroPlan ) {
           traverse( months, Elements, month ) {
@@ -112,12 +112,12 @@
       }
     }
     // 骞村害閿�鍞
-    info( "dealing 閿�鍞" )
+    debuginfo( "dealing 閿�鍞" )
     if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
       traverse( years, Elements, year ) {
-        info( "閿�鍞" + [String]year.YearNo() + "骞�" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞�" );
         // 鍘嗗彶鏁版嵁
-        info( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
         traverse( months, Elements, month ) {
           columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
           traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -132,7 +132,7 @@
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
         }
-        info( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
         // S&OP鏁版嵁
         traverse( macroPlans, Elements, macroPlan ) {
           traverse( months, Elements, month ) {
@@ -154,7 +154,7 @@
       }
     }
     // 澶у紶鐩堝埄棰�
-    info( "dealing 澶у紶鐩堝埄棰�" )
+    debuginfo( "dealing 澶у紶鐩堝埄棰�" )
     traverse( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
@@ -174,7 +174,7 @@
       }
     }
     // 浜у搧鐩堝埄棰�
-    info( "dealing 浜у搧鐩堝埄棰�" )
+    debuginfo( "dealing 浜у搧鐩堝埄棰�" )
     traverse( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
@@ -195,7 +195,7 @@
     }
     
     // 璁剧疆rowNo鍜宑olumnNo
-    info( "set rowNo and columnNo" );
+    debuginfo( "set rowNo and columnNo" );
     rowNo := 1;
     rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
     traverse( rowSorted, Elements, item ) {
@@ -207,6 +207,6 @@
       item.ColumnNo( columnNo );
       columnNo := columnNo + 1;
     }
-    info( "done" );
+    debuginfo( "done" );
   *]
 }
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
similarity index 93%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
index 44dab2e..45ee95c 100644
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
@@ -13,7 +13,7 @@
     // 澶勭悊column <column><name>鐗╂枡缂栫爜</name><type>String</type></column>
     columnXml := ""
     traverse( this, CapacityAndSaleBudgeCompareItemColumn, column ) {
-      info( "columnName : " + column.ColumnName() );
+      debuginfo( "columnName : " + column.ColumnName() );
       columnXml := columnXml + "<column><name>" + column.ColumnName() + "</name><type>String</type></column>";
     }
     text := text + columnXml + "</table>"
@@ -24,7 +24,7 @@
     tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
     rows := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, row, row.PlaceOfProductionOfArray() + "_" + row.BusinessType() );
     traverse ( rows, Elements, row ) {
-      info( "rowNo : " + [String]row.RowNo() );
+      debuginfo( "rowNo : " + [String]row.RowNo() );
       traverse( row, CapacityAndSaleBudgeCompareItemCell, cell ) {
         ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, cell.CellContent(), cell.CapacityAndSaleBudgeCompareItemColumn().ColumnName() );  
       }
diff --git a/_Main/BL/Type_ImportExcel/Method_Execute.qbl b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
new file mode 100644
index 0000000..8bad7ba
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#parent: #root
+MethodOverride Execute #extension
+{
+  TextBody:
+  [*
+    opt := DatasetFindOptions::Construct( this.MacroPlanDatasetName() );
+    mp := MDSMacroPlan::Find( opt );
+    
+    opt := DatasetFindOptions::Construct();
+    scenarioManager := MDSScenarioManager::Find( opt );
+    
+    // Only get data source which has all required files uploaded
+    dummyMissingFiles := construct( Strings );
+    needUserUploadAllFiles := true;
+    validUploadedFiles := selectset( this, LibSOPImpExp_DataSourceChildren, ds, 
+                                     ds.HasAllRequiredFilesForImport( dummyMissingFiles, needUserUploadAllFiles ) );
+    
+    traverse( validUploadedFiles, Elements, file )
+    {
+      this.LibSOPImpExp_UserInput( relnew, Value := file.Name() );
+    }
+    
+    binaryValues := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile.LibSOPImpExp_ImportUploadedFile, file, true, file.DataAsBinary() );
+    brokerNames := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile, file, true, file.BrokerName() );
+    userinputvalues := selectuniquevalues( this, LibSOPImpExp_UserInput, userinput,
+                                           true,
+                                           userinput.Value() );
+    mpsync := this.MPSync();
+    
+    // Reactive way to import
+    o := this
+    ->SetStatusInProgress()
+    ->|mp->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|scenarioManager->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|mpsync->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|this->SetStatusDone()
+    ->|mp->SetLastImportTime()
+    ->Exception();
+    
+    this->OnException(o);
+  *]
+}
diff --git a/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
new file mode 100644
index 0000000..cd6e3ac
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization ImportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
new file mode 100644
index 0000000..710f4a0
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IsDataSourceIncluded_Tianma (
+  Strings userinputvalues,
+  String datasource_i
+) remote as Boolean
+{
+  Description: 'If data source selected by user to export'
+  TextBody: 'return exists( userinputvalues, Elements, input, input = datasource_i );'
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
new file mode 100644
index 0000000..9510e76
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LibSOPImpExp_ExportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..01d9ef9
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userInput_i - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ImportProfiles() ),
+                 mpBinaryValues_i, mpBrokers_i, is3DDrive, construct( FileItems), construct( Strings ) );
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl" "b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl"
deleted file mode 100644
index 5f2c716..0000000
--- "a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl"
+++ /dev/null
@@ -1,15 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method RefreshCapacityAndSaleBudgeFilter (
-  Boolean deleteBeforeCreate
-)
-{
-  TextBody:
-  [*
-    if( deleteBeforeCreate ) {
-      this.CapacityAndSaleBudgeFilterBusinessType( relflush );
-      this.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );  
-    }
-    this.RefreshCapacityAndSaleBudgeFilter();
-  *]
-}
diff --git a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
index 6c1f176..496ec45 100644
--- a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
+++ b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method RefreshCapacityAndSaleBudgeFilter
+Method RefreshCapacityAndSaleBudgeFilter (
+  GlobalOTDTable globalOtdTable
+)
 {
   TextBody:
   [*
@@ -9,12 +11,12 @@
     businessTypes := selectuniquevalues( this, MappingCapacityAndSaleBudge, item, item.BusinessType() );
     info( [String]businessTypes.Size() );
     traverse( businessTypes, Elements, businessType ) {
-      CapacityAndSaleBudgeFilterBusinessType::CreateIfNotExist( this, businessType );
+      CapacityAndSaleBudgeFilterBusinessType::CreateIfNotExist( globalOtdTable, businessType );
     }
     placeOfProductionOfArrays := selectuniquevalues( this, MappingCapacityAndSaleBudge, item, item.PlaceOfProductionOfArray() );
     info( [String]placeOfProductionOfArrays.Size() );
     traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::CreateIfNotExist( this, placeOfProductionOfArray );
+      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::CreateIfNotExist( globalOtdTable, placeOfProductionOfArray );
     }
   *]
 }
diff --git a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl
new file mode 100644
index 0000000..c8d1bbb
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method RefreshCapacityAndSaleBudgeFilter (
+  Boolean deleteBeforeCreate,
+  GlobalOTDTable globalOtdTable
+)
+{
+  TextBody:
+  [*
+    if( deleteBeforeCreate ) {
+      globalOtdTable.CapacityAndSaleBudgeFilterBusinessType( relflush );
+      globalOtdTable.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );  
+    }
+    this.RefreshCapacityAndSaleBudgeFilter( globalOtdTable );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..7d409ec
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Synchronize( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_SupplyChainParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_GlobalParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Periods() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySupplies() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Products() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Forecasts() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ServiceLevels() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Campaigns() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Entities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Costs() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Lanes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Routings() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Capacities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_SupplySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Recipes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Designer_Actuals() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_GlobalParameters_KPIFeedbackName() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_OptimizerPuzzles() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_PostponementSpecAndFulfillmentRestriction() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_CustomerOrder() ),
+                      false, /* isImportBinary */
+                      mpBinaryValues_i,
+                      mpBrokers_i,
+                      is3DDrive,
+                      construct( FileItems ), /* 3ddrive, ignore */
+                      construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
index ca35281..b716d4d 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
@@ -10,7 +10,6 @@
   TextBody:
   [*
     // yypsybs Aug-21-2023 (created)
-    
     keyProductList := construct( Strings );
     if( isKeyProduct ) {
         keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
@@ -59,6 +58,7 @@
                   // ========鍒嗙粍澶勭悊杈撳叆========
                   
                 }
+                
                 if( not isnull( stockingPoint)){
                   if( isKeyProduct){
                       keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
@@ -81,5 +81,78 @@
             this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
         }
     }
+    
+    
+    //
+    //keyProductList := construct( Strings );
+    //if( isKeyProduct ) {
+    //    keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
+    //}
+    //bomList := selectsortedset(  globalOTDTable, Global_MappingOperationBOM, item,
+    //                             ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
+    //                                     true, 
+    ////                                     businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
+    //                                     businessTypes.Find( item.BusinessType() ) >= 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";
+    //        stockingPointId := firstRow.OrganCode()  + "_Stock";
+    //
+    //        // ========妫�鏌�========
+    //        product := Product_MP::FindProductTypeIndex( firstRow.ProductCode() );
+    //        if( not isnull( product ) ) {
+    ////              error( "product : " + firstRow.ProductCode() + " not found" );
+    //          stockingPoint := StockingPoint_MP::FindStockingPointTypeIndex( stockingPointId );
+    //
+    ////          info( stockingPointId.AsQUILL() );
+    //  //        if( isnull( stockingPoint ) ) {
+    //  //            error( "stockingPoint : " + stockingPointId + " not found" );
+    //  //        }
+    //          routing := Routing::FindRoutingTypeIndex(  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( stockingPoint)){
+    //              if( isKeyProduct){
+    //                  keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,keyRows);
+    //                }else{
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,routingRows);
+    //                }
+    //                
+    //            }
+    //          }
+    //       }
+    //    }
+    //}
+    //if( createPurchaseSupplyMaterial ) {
+    //    toCreateBomList := selectuniquevalues( bomList, Elements, item, 
+    //                                           item.ComponentType() = "P", item.OrganCode() + item.ComponentCode());
+    //    traverse( toCreateBomList, Elements, key ) {
+    //        boms := selectset( bomList, Elements, item, item.ComponentType() = "P" and item.OrganCode() + item.ComponentCode() = key );
+    //        bom := boms.First();
+    //        this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
+    //    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl b/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl
deleted file mode 100644
index 0c8ee87..0000000
--- a/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: PlaceOfProductionOfEvaporation
-}
diff --git a/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
index c469165..c75f124 100644
--- a/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
+++ b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
@@ -61,7 +61,7 @@
     }
     //---------------------------------------------------------------------------------------------
     xmlTemplate := xmlTemplate + "</table>";
-    info( xmlTemplate );
+    //info( xmlTemplate );
     tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
     XLS::SaveTable( tableHandle, OS::TempPath() + "MappingCapacityAndSaleBudge.xlsx" );
     file := OSFile::Construct();
diff --git a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
index 01917f6..1449c61 100644
--- a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
+++ b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
@@ -17,7 +17,7 @@
     
     if( priorityFactor.Name() = "澶у紶鐩堝埄姘村钩" )
     {
-          priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
                                             IsRange := false,GradingName := "澶х泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
         priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
                                                 IsRange := false,GradingName := "灏忕泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
@@ -31,7 +31,7 @@
     
     if( priorityFactor.Name() = "瀹㈡埛绛栫暐" )
     {
-          priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
                                             IsRange := false,GradingName := "81%鈮鈮�100%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
         priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 4,
                                                 IsRange := false,GradingName := "61%鈮鈮�80%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
@@ -43,18 +43,60 @@
                                                 IsRange := false,GradingName := "1%鈮鈮�20%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
     }
     
+    if( priorityFactor.Name() = "缁嗗垎甯傚満绛夌骇" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鎴樼暐",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "閲嶇偣",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "娼滃姏",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "璁㈠崟涓嬪崟鏃堕棿" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "120",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 4,
+                                                IsRange := false,GradingName := "90",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "60",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 2,
+                                                IsRange := false,GradingName := "30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "0",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "闇�姹傜被鍨�" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鏈夐娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "鏃犻娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "绾娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
     if( priorityFactor.Name() = "瀹㈡埛绛夌骇" )
     {
-          priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
-                                            IsRange := false,GradingName := "81%鈮鈮�100%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 4,
-                                                IsRange := false,GradingName := "61%鈮鈮�80%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鎴樼暐",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
         priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
-                                                IsRange := false,GradingName := "41%鈮鈮�60%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 2,
-                                                IsRange := false,GradingName := "21%鈮鈮�40%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+                                                IsRange := false,GradingName := "閲嶇偣",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
         priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
-                                                IsRange := false,GradingName := "1%鈮鈮�20%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+                                                IsRange := false,GradingName := "娼滃姏",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "DOI" or priorityFactor.Name() = "DSI")
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "<7",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "<15",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "<30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := ">30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());                                                                                     
     }
   *]
 }
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
index decca69..0cc1c80 100644
--- a/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
@@ -76,7 +76,7 @@
             {
                 // 涓嶆槸绗﹀彿 鐩存帴鑾峰彇璁$畻鍚庣殑鏁板��
                 score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
-              
+                info( "123123");
                 // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
                 remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
                 PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl
index f12f852..035c057 100644
--- a/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl
@@ -10,6 +10,7 @@
   TextBody:
   [*
     // NBoTk Sep-26-2023 (created)
+    // 褰撳墠璁$畻浼樺厛绾у洜瀛愮粏鍒� 濡傛灉鑾峰彇涓嶅埌鍏ㄩ儴鍏堥粯璁や负1
     
     value := 0.0;
     
@@ -32,41 +33,71 @@
     if( "澶у紶鐩堝埄姘村钩" =  priorityFactor.Name())
     {
          obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "澶у紶鐩堝埄姘村钩" and  p.GradingName() = customerOrder.SheetProfitability());
-         value := priorityFactor.Coefficient() * obj.GradeTarget();
+         gradeTarget := 1.0;
+         if( not isnull( obj ) )
+         {
+              gradeTarget := obj.GradeTarget();
+         }
+         value := priorityFactor.Coefficient() * gradeTarget;
     }
     
     if( "DOI" =  priorityFactor.Name())
     {
          // DOI鏁版嵁
          obj := selectobject( globalOTDTable,Global_MappingDOI_DSI,doi,doi.ProductID() = customerOrder.ProductID())
-         value := priorityFactor.Coefficient() * [Real]obj.DOI();
+         doi := 1.0;
+         if( not isnull( obj ) )
+         {
+              doi := [Real]obj.DOI();
+         }
+         value := priorityFactor.Coefficient() * doi;
     }
     
     if( "DSI" =  priorityFactor.Name())
     {
          // DOI鏁版嵁
          obj := selectobject( globalOTDTable,Global_MappingDOI_DSI,doi,doi.ProductID() = customerOrder.ProductID())
-         value := priorityFactor.Coefficient() * [Real]obj.DSI();
+         dsi := 1.0;
+         if( not isnull( obj ) )
+         {
+              dsi := [Real]obj.DSI();
+         }
+         value := priorityFactor.Coefficient() * dsi;
     }
     
     if( "缁嗗垎甯傚満绛夌骇" =  priorityFactor.Name())
     {
          obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "缁嗗垎甯傚満绛夌骇" and p.GradingName() = customerOrder.SegmentPriority());
-         value := priorityFactor.Coefficient() * obj.GradeTarget();
+         gradeTarget := 1.0;
+         if( not isnull( obj ) )
+         {
+              gradeTarget := obj.GradeTarget();
+         }
+         value := priorityFactor.Coefficient() * gradeTarget;
     }
     
     if( "闇�姹傜被鍨�" =  priorityFactor.Name())
     {     
         // 鏈夐娴� 鏃犻娴� 绾娴�
          obj := selectobject( priorityFactor,PriorityFactorDetails,p,p.GradingName() = customerOrder.OrderType());
-         value := priorityFactor.Coefficient() * obj.GradeTarget();
+         gradeTarget := 1.0;
+         if( not isnull( obj ) )
+         {
+              gradeTarget := obj.GradeTarget();
+         }
+         value := priorityFactor.Coefficient() * gradeTarget;
     }
     
     if( "瀹㈡埛绛夌骇" =  priorityFactor.Name())
     {
          // 閫氳繃鏁版嵁婀栬绠楀鎴风瓑绾�
-          obj := selectobject( globalOTDTable,Global_MappingCustomerGrade,doi,doi.BusinessType() = customerOrder.BusinessType() and doi.Customer() = customerOrder.CustomerName())
-         value := priorityFactor.Coefficient() * [Real]obj.CustomerGrade();
+         obj := selectobject( globalOTDTable,Global_MappingCustomerGrade,doi,doi.BusinessType() = customerOrder.BusinessType() and doi.Customer() = customerOrder.CustomerName())
+         customerGrade := 1.0;
+         if( not isnull( obj ) )
+         {
+              customerGrade := [Real]obj.CustomerGrade();
+         }
+         value := priorityFactor.Coefficient() * customerGrade;
     }
     
     if( "璁㈠崟涓嬪崟鏃堕棿" =  priorityFactor.Name())
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
index 7c211d6..c931871 100644
--- a/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
@@ -15,7 +15,15 @@
     {  
          if( formula.StartsWith( p.Name()) )
          {
-              str := formula.SubString( 0 + p.Name().Length(),formula.Length());
+              // 鍒ゆ柇鍓╀綑瀛楃闀垮害
+              if( p.Name().Length() = formula.Length() )
+              {
+                 str := ""
+              }
+              else
+              {              
+                str := formula.SubString( 0 + p.Name().Length(),formula.Length());
+              }
          }
     }
     
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
index 1b2da12..7688006 100644
--- a/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
@@ -15,7 +15,8 @@
     traverse( macroPlan,SalesDemand.astype( CustomerOrder ),e)
     {
          // 浜嬩笟閮ㄤ俊鎭�
-         businessType := e.BusinessType();
+         //businessType := e.BusinessType();
+         businessType :=  "鎵嬫満浜嬩笟閮�";
          
          // 鑾峰彇瀵瑰簲浜嬩笟閮ㄨ绠楀叕寮�
          priorityPolicys := selectobject( macroPlan,PriorityPolicy,p,p.BusinessType() = businessType and p.Name() = priorityPolicyName);
@@ -61,11 +62,17 @@
         obj := selectobject( macroPlan,SalesDemand.astype( CustomerOrder ),order, 
                              order.ID() = e.CustomerOrderID()
                              );
-        obj.PriorityName([String]priorityValue);
         
-        // 鍒涘缓浼樺厛绾ф暟鎹�
-        macroPlan.Priority(relnew,Weight := priorityValue,Name := [String]priorityValue);
-        priorityValue := priorityValue + 1;
+        // 璁㈠崟鏁版嵁涓嶄负绌哄啀鍋氬鐞�
+        if( not isnull( obj ) )
+        {
+              obj.PriorityName([String]priorityValue);
+              
+              // 鍒涘缓浼樺厛绾ф暟鎹�
+              macroPlan.Priority(relnew,Weight := priorityValue,Name := obj.OrderID());
+              priorityValue := priorityValue + 1;
+        }
+    
     }
   *]
 }
diff --git a/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..2c38e3e
--- /dev/null
+++ b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Strategies() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Accounts() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Bookmarks() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_KPISetting() ),
+                 mpBinaryValues_i.Copy(), 
+                 mpBrokers_i, 
+                 is3DDrive, 
+                 construct( FileItems ), /* 3ddrive, ignore */ 
+                 construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl b/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl
new file mode 100644
index 0000000..7a1e8b7
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestBoolean
+{
+  #keys: '3[414384.0.915854691][414384.0.915854690][414384.0.915854692]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl b/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl
new file mode 100644
index 0000000..f96d5cd
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestDate
+{
+  #keys: '3[414384.0.915854704][414384.0.915854703][414384.0.915854705]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl b/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl
new file mode 100644
index 0000000..4ebf668
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestDateTime
+{
+  #keys: '3[414384.0.915854714][414384.0.915854713][414384.0.915854715]'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl b/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl
new file mode 100644
index 0000000..95e5da0
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestNumber
+{
+  #keys: '3[414384.0.915854681][414384.0.915854680][414384.0.915854682]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl b/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl
new file mode 100644
index 0000000..1852888
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestReal
+{
+  #keys: '3[414384.0.915854668][414384.0.915854667][414384.0.915854669]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestString.qbl b/_Main/BL/Type_YuxTest/Attribute_TestString.qbl
new file mode 100644
index 0000000..5965156
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestString.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestString
+{
+  #keys: '3[414384.0.915854658][414384.0.915854657][414384.0.915854659]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl b/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl
new file mode 100644
index 0000000..d6f5aaf
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl
@@ -0,0 +1,85 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  YuxTests toExportList
+) as String
+{
+  TextBody:
+  [*
+    // generate by generate_export_method.py
+    xmlTemplate := '<?xml version="1.0" encoding="UTF-16"?>
+    <table>
+      <name>YuxTest</name>
+    ';
+    convDateToString := DateToString::StandardConverter();
+    convDateToString.SetCustomConversion();
+    convDateToString.CustomFormatString( 'yyyy-MM-dd' );
+    convDateTimeToString := DateTimeToString::StandardConverter();
+    convDateTimeToString.SetCustomConversion();
+    convDateTimeToString.CustomFormatString( 'yyyy-MM-dd HH:mm:ss' );
+    info( "export start" );
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏁板瓧</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testNumber := toExportItem.TestNumber();
+      cellStr := '<cell value="' + [String]testNumber + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯灏忔暟</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testReal := toExportItem.TestReal();
+      cellStr := '<cell value="' + [String]testReal + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯瀛楃涓�</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testString := toExportItem.TestString();
+      cellStr := '<cell value="' + testString + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯甯冨皵</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testBoolean := toExportItem.TestBoolean();
+      cellStr := '<cell value="' + [String]testBoolean + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏃ユ湡</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testDate := toExportItem.TestDate();
+      cellStr := '<cell value="' + ifexpr( testDate = Date::MinDate(), "", convDateToString.Convert( testDate )) + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏃ユ湡鏃堕棿</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testDateTime := toExportItem.TestDateTime();
+      cellStr := '<cell value="' + ifexpr( testDateTime = DateTime::MinDateTime(), "", convDateTimeToString.Convert( testDateTime )) + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    xmlTemplate := xmlTemplate + "</table>";
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
+    XLS::SaveTable( tableHandle, OS::TempPath() + "YuxTest.xlsx" );
+    file := OSFile::Construct();
+    file.Open( OS::TempPath() + "YuxTest.xlsx", "Read", true );
+    data := file.ReadBinary()
+    info( "export end" );
+    return data.AsBase64EncodedString();
+  *]
+}
diff --git "a/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl" "b/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl"
new file mode 100644
index 0000000..f77f7ce
--- /dev/null
+++ "b/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl"
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportTest (
+  MPSync parent
+) as String
+{
+  TextBody:
+  [*
+    // yypsybs Sep-25-2023 (created)
+    list := selectset( parent, YuxTest, item, true );
+    if( list.Size() = 0 ) {
+      for( i := 0; i < 100; i := i + 1 ) {
+        parent.YuxTest( relnew, 
+                        TestBoolean := ifexpr( Number::Random( 0, 1 ) = 1, true, false ), 
+                        TestDate :=   ifexpr( Number::Random( 0, 1 ) = 1, Date::MinDate(), Date::ActualDate() ), 
+                        TestDateTime :=   ifexpr( Number::Random( 0, 1 ) = 1,DateTime::MinDateTime(), DateTime::ActualTime() ),
+                        TestNumber :=  Number::Random( 100, 200 ),
+                        TestReal := Real::Random( 10.0, 20.0 ), 
+                        TestString := [String]Number::Random( 1000, 2000 ) 
+                        );
+      }
+    }
+    list := selectset( parent, YuxTest, item, true );
+    return YuxTest::Export( list );
+  *]
+}
diff --git a/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl b/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl
new file mode 100644
index 0000000..13ff536
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type YuxTest
+{
+  #keys: '5[414384.0.915854638][414384.0.915854636][0.0.0][414384.0.915854637][414384.0.915854639]'
+  BaseType: Object
+  StructuredName: 'YuxTests'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def
new file mode 100644
index 0000000..177aa43
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method CalculatePriorityResult () id:Method_DialogChoosePriorityPolicy_CalculatePriorityResult
+{
+  #keys: '[414382.0.577602130]'
+  Body:
+  [*
+    name := PriorityPolicyStringList.Text();
+    PriorityResult::CalculatePriorityResult(name,MacroPlan,GlobalOTDTable);
+    this.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def
index 7750e77..9924430 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def
@@ -8,8 +8,8 @@
   {
     Body:
     [*
-      name := PriorityPolicyStringList.Text();
-      PriorityResult::CalculatePriorityResult(name,MacroPlan,GlobalOTDTable);
+      dlg := construct( DialogChoosePriorityPolicy );
+      dlg.CalculatePriorityResult();
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
index 984c1f6..452f77b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
@@ -38,6 +38,6 @@
   ]
   Properties:
   [
-    Taborder: 1
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def
new file mode 100644
index 0000000..990eb11
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ButtonExportTest
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportTest_OnClick
+{
+  #keys: '[414384.0.914711825]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MPSync );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      base64 := YuxTest::ExportTest( MPSync );
+      Application.Download( "result.xlsx", base64 );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
index d4df714..9458d5d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
@@ -12,7 +12,7 @@
     [*
       MPSync::TestData( MPSync, MacroPlan );
       GlobalOTDTable.InitTestData();
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
index 8758502..c2687d8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
@@ -19,6 +19,18 @@
         Taborder: 0
       ]
     }
+    Component ButtonExportTest
+    {
+      #keys: '[414384.0.914711826]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭娴嬭瘯'
+        Taborder: 1
+        Visible: false
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
index d6e755a..71754e3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
@@ -17,8 +17,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeChartElement'
           ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
index 53e33ba..c481c62 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
@@ -10,19 +10,19 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeChartElement::TestData( ScenarioManager );
+      CapacityAndSaleBudgeChartElement::TestData( GlobalOTDTable );
       
-      ScenarioManager.CapacityAndSaleBudgeChart( DataHolderMacroPlansForScenarioComparison.Data(), 
-                                                 DropDownSaleOrCapacity.Text(),
-                                                 DropDownTimeGroup.Text(),
-                                                 DropDownByBusinessTypeOrByOrgCode.Text(),
-                                                 DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterYear.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
-                                                 MPSync, 
-                                                 GlobalOTDTable, 
-                                                 MacroPlan );
+      GlobalOTDTable.CapacityAndSaleBudgeChart( DataHolderMacroPlansForScenarioComparison.Data(), 
+                                                DropDownSaleOrCapacity.Text(),
+                                                DropDownTimeGroup.Text(),
+                                                DropDownByBusinessTypeOrByOrgCode.Text(),
+                                                DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterYear.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
+                                                MPSync, 
+                                                GlobalOTDTable, 
+                                                MacroPlan );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
index cbfdc2b..5dd68bd 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
@@ -17,8 +17,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemColumn.CapacityAndSaleBudgeCompareItemCell'
           ]
@@ -44,8 +44,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemRow'
           ]
@@ -70,8 +70,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemColumn'
           ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
index 50ded64..6d37df2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
@@ -14,13 +14,13 @@
       info( DataHolderCapacityAndSaleBudgeFilterItem.Data().Size() );
       info( DataHolderCapacityAndSaleBudgeFilterYear.Data().Size() );
       info( DataHolderCapacityAndSaleBudgeFilterMonth.Data().Size() );
-      ScenarioManager.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
-                                                   MPSync, 
-                                                   GlobalOTDTable,
-                                                   MacroPlan );
+      GlobalOTDTable.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
+                                                  MPSync, 
+                                                  GlobalOTDTable,
+                                                  MacroPlan );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
index 97cea9d..a01173d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      tableBinaryData := ScenarioManager.CapacityAndSaleBudgeCompareExport().AsBinaryData();
+      tableBinaryData := GlobalOTDTable.CapacityAndSaleBudgeCompareExport().AsBinaryData();
       Application.Download( "骞村害浜ч攢棰勭畻瀵规瘮.xlsx", tableBinaryData );
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
index 712bf75..cbe6b9e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'MPSync'
-        Source: 'MPSync'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterBusinessType'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
index 682a492..0437f14 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
index 84bcffe..ea63655 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterItem'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
index c5f4133..a9ccb24 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterItem::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterItem::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
index 13a9e02..577ebb4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterMonth'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
index 46cc025..d922a4a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterMonth::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterMonth::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
index 0d881d5..ae0a48a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'MPSync'
-        Source: 'MPSync'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterPlaceOfProductionOfArray'
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
index bda9b55..8b48eac 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
index f51357d..c89499c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterYear'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
index 6c61e95..19ea091 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterYear::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterYear::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
index 014ed5d..571a83c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
@@ -31,7 +31,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: '*'
+        Label: '-'
         Taborder: 3
       ]
     }

--
Gitblit v1.9.3