From 135b749777d8b87f0f670794ab408d0f9bf61028 Mon Sep 17 00:00:00 2001
From: chaiyunying <chaiyunying>
Date: 星期二, 31 十月 2023 11:07:55 +0800
Subject: [PATCH] Merge branch 'dev' into dev_cyy20231026

---
 _Main/BL/Type_Global_MappingProduct_MP/Function_CalcCritical.qbl                                                                                                              |   12 
 _Main/BL/Type_GlobalParameters/Attribute_Address.qbl                                                                                                                          |    8 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl                                                                                            |    6 
 _Main/BL/Type_Global_MappingProduct_MP/Attribute_KeyProduct.qbl                                                                                                               |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick#603.def                              |    8 
 .gitattributes                                                                                                                                                                |    1 
 _Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged.def                                                                                |    3 
 _Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl                                                                                                              |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def                                                                                                |    2 
 test.pdm                                                                                                                                                                      |    3 
 _Main/UI/MacroPlannerWebApp/Views/全局参数.vw                                                                                                                                     |  351 ++++++
 _Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged#613.def                                                                            |    3 
 _Main/BL/Relations/Relation_GlobalParameters_GlobalOTDTable_GlobalOTDTable_GlobalParameters.qbl                                                                               |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/_ROOT_Component_DialogGlobalParameters.def                                                                       |   31 
 _Main/BL/Type_GlobalParameters/_ROOT_Type_GlobalParameters.qbl                                                                                                                |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_listContextMenuGlobalParameters_MenuInitial_OnClick.def                                                   |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def                                                                  |   41 
 _Main/BL/Type_Global_MAPISPIPCategory/Attribute_Critical.qbl                                                                                                                  |    8 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl                                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_New.def                                                                                                   |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlActions.def                                                                                         |   40 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def                                                                   |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick#325.def                                                    |    6 
 _Main/BL/Type_GlobalParameters/Attribute_AttributeName.qbl                                                                                                                    |    8 
 _Main/UI/MacroPlannerWebApp/Component_Form633/Component_PanelPRDataButton.def                                                                                                 |    2 
 _Main/BL/Type_GlobalParameters/Attribute_AttributeValue.qbl                                                                                                                   |    8 
 _var/_Main/ModelSettings/Common/Dev-25/_ROOT_Role_Dev-25.properties                                                                                                           |   46 
 _Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl                                                                                         |   18 
 _Main/UI/MacroPlannerWebApp/Views/年度产销复盘.vw                                                                                                                                   |  562 +--------
 _Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp                                                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnCancel_OnClick.def                                                                        |   15 
 _Main/UI/MacroPlannerWebApp/Component_Form633/Response_PanelPRDataButton_ButtonExportPR_OnClick.def                                                                           |    2 
 _Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl                                                                                                                    |   49 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_PanelGlobalParameters.def                                                                                |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Response_TIANMA_JITUAN_PanelGeneral_549_dsPlanningStart_OnCreated.def                                          |   16 
 _Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl                                                                             |   18 
 _Main/BL/Type_PRData/StaticMethod_GeneratesTheSpecifiedXMLColumn#56.qbl                                                                                                       |    0 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlContent_IsApi_OnChanged.def                                                                          |   18 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def                                                                                                |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def                                                     |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuDelete_OnClick.def                                                               |   19 
 _Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl                                                                                                             |  247 ++-
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick#19.def                                                         |   26 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def                                |   20 
 _var/_Main/ModelSettings/Common/Dev-27/_ROOT_Role_Dev-27.properties                                                                                                           |   46 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def                                                                   |    8 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl                                                                                                            |   12 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl                                                                                         |    8 
 _Main/BL/Type_GlobalParameters/Attribute_Port.qbl                                                                                                                             |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh#171.def |    4 
 _Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl                                                                                                               |   93 -
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl                                                                                                             |   14 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def                                                                             |   19 
 _Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl                                                                                                                  |    4 
 _Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl                                                                                                                 |   10 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def                                                                                                    |   29 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                                                           |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/_ROOT_Component_FormGlobalParameters.def                                                                           |   18 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl                                                                                                 |   15 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingOperationBOMDataRouting.qbl                                                                                                      |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def                                                                             |   60 +
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_ListGlobalParameters.def                                                                                 |   59 +
 _Main/BL/Type_GlobalParameters/StaticMethod_TestForApiRequest.qbl                                                                                                             |  172 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_ClickBtnOk.def                                                                                            |   19 
 _Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl                                                                                                      |   10 
 _Main/BL/Type_Global_MappingProduct_MP/Attribute_Critical.qbl                                                                                                                 |    8 
 _Main/BL/Type_GlobalParameters/Attribute_PostRequestBody.qbl                                                                                                                  |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def                                                              |    2 
 _Main/UI/MacroPlannerWebApp/Views/PR_DATA.vw                                                                                                                                  |  204 +++
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def                                                                                   |   37 
 _Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl                                                                                                |   16 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def                                                                                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuEdit_OnClick.def                                                                 |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick#971.def                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def                                                                                          |   48 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral#549.def                                                                                 |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listActionBarPageGlobalParameters.def                                                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick#231.def                                      |   12 
 _Main/BL/Type_MacroPlan/StaticMethod_DoASync#253.qbl                                                                                                                          |   54 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlContent.def                                                                                         |   83 +
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnOk_OnClick.def                                                                            |   15 
 _Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl                                                                                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def                                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNew_OnClick.def                                                                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                                                                     |    1 
 _Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl                                                                                                          |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def                                                                         |    5 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews#859.def                                                         |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def                                                         |   53 
 _Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl                                                                                                 |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listContextMenuGlobalParameters.def                                                                      |   57 
 _var/_Main/ModelSettings/Common/Dev-23/_ROOT_Role_Dev-23.properties                                                                                                           |   46 
 _Main/BL/Type_Global_MAPISPIPCategory/Function_CalcCritical.qbl                                                                                                               |   13 
 /dev/null                                                                                                                                                                     |  205 ---
 _Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuNew_OnClick.def                                                                  |   18 
 _Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan#127.qbl                                                                                                        |    8 
 _Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl                                                                                                    |   12 
 _Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_Edit.def                                                                                                  |   17 
 _Main/BL/Type_PRData/StaticMethod_ExportTheFileStream.qbl                                                                                                                     |   53 
 100 files changed, 2,403 insertions(+), 1,077 deletions(-)

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..3d3820c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.pdm filter=lfs diff=lfs merge=lfs -text
diff --git a/_Main/BL/Relations/Relation_GlobalParameters_GlobalOTDTable_GlobalOTDTable_GlobalParameters.qbl b/_Main/BL/Relations/Relation_GlobalParameters_GlobalOTDTable_GlobalOTDTable_GlobalParameters.qbl
new file mode 100644
index 0000000..05afed6
--- /dev/null
+++ b/_Main/BL/Relations/Relation_GlobalParameters_GlobalOTDTable_GlobalOTDTable_GlobalParameters.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation GlobalParameters_GlobalOTDTable_GlobalOTDTable_GlobalParameters
+{
+  #keys: '1[412960.0.369930029]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[412960.0.369930031][412960.0.369930030][412960.0.369930032]'
+    Cardinality: '0to1'
+    ObjectDefinition: GlobalParameters
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide GlobalParameters
+  {
+    #keys: '3[412960.0.369930034][412960.0.369930033][412960.0.369930035]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl
new file mode 100644
index 0000000..c116037
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TotalIdentification
+{
+  #keys: '3[414702.1.286051925][414702.1.286051924][414702.1.286051926]'
+  Description: '鏍囪瘑浣嶏紙鍒ゆ柇鏄惁鍔犲拰锛�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
index 230f93e..3b19661 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
@@ -10,9 +10,11 @@
   [*
     // yypsybs Sep-18-2023 (created)
     value := select( parent, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
-    if( isnull( value ) ) {
+    
+    if ( isnull( value ) ) {
       value := parent.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
-    } 
+    }
+    
     return value;
   *]
 }
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..a41d703
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP,
+  const GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relflush );
+    
+    businessTypes := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, tempGMPMP, true, tempGMPMP.BusinessType() );
+    
+    traverse ( businessTypes, Elements, bt ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relnew, BusinessType := bt );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
deleted file mode 100644
index 3601509..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,14 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧姣旈」'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    CapacityAndSaleBudgeFilterItem::CreateIfNotExist( parent, "闈㈡澘鍒嗛厤閲�" );
-    CapacityAndSaleBudgeFilterItem::CreateIfNotExist( parent, "閿�鍞" );
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..c9a019d
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧姣旈」'
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relflush );
+    
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relnew, ItemName := "闈㈡澘鍒嗛厤閲�" );
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relnew, ItemName := "閿�鍞" );
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
deleted file mode 100644
index 8159900..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧勾浠�'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    existList := selectuniquevalues( parent, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
-    for( i := 1; i <= 12; i++ ) {
-      if( existList.Find( i ) = -1 ) {
-        parent.CapacityAndSaleBudgeFilterMonth( relnew, 
-                                                MonthNo := i );
-      }  
-    }
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..b85464a
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧勾浠�'
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterMonth( relflush );
+    
+    for( i := 1; i <= 12; i++ ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterMonth( relnew, MonthNo := i );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..3c65d07
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP,
+  const GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );
+    
+    organCodes := selectuniquevalues( globalOTDTable, Global_MappingOperation, tempGMO, true, tempGMO.OrganCode() );
+    
+    traverse ( organCodes, Elements, oc ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relnew, PlaceOfProductionOfArray := oc );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
deleted file mode 100644
index 72badb3..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧勾浠�'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    existList := selectuniquevalues( parent, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
-    nowYear := Date::Today().Year();
-    for( i := nowYear - 10; i <= nowYear + 5; i++ ) {
-      if( existList.Find( i ) = -1 ) {
-        parent.CapacityAndSaleBudgeFilterYear( relnew, 
-                                               YearNo := i );
-      }  
-    }
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..a76216a
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧勾浠�'
+  TextBody:
+  [*
+    // yypsybs Sep-15-2023 (created)
+    globalOTDSOP.CapacityAndSaleBudgeFilterYear( relflush );
+    
+    nowYear := Date::Today().Year();
+    
+    for( i := nowYear - 10; i <= nowYear + 5; i++ ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterYear( relnew, YearNo := i );  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl b/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
index c84f323..98dddf0 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
@@ -2,28 +2,45 @@
 #parent: #root
 Method InitTestDataByYear (
   MacroPlan macroPlan,
-  CapacityAndSaleBudgeFilterYears years
+  GlobalOTDSOP globalOTDSOP,
+  CapacityAndSaleBudgeFilterYears years,
+  CapacityAndSaleBudgeFilterBusinessTypes businessTypes,
+  CapacityAndSaleBudgeFilterPlaceOfProductionOfArrays placeOfProductionOfArrays,
+  Product_MPs product_MPs
 )
 {
   TextBody:
   [*
-    // yypsybs Oct-7-2023 (created)
-    productCodeList := selectuniquevalues( macroPlan, Product_MP, item, item.ID() );
-    debuginfo( "productCodeList : " + [String]productCodeList.Size() );
+    product_MPs := selectset( product_MPs, Elements, tempPMP, tempPMP.IsLeaf() and not tempPMP.IsSystem() );
     
     this.Global_MappingAnnualBudgetData( relflush );
-    debuginfo( "create Global_MappingAnnualBudgetData test data" );
-    id := 1;
-    traverse( years, Elements, year ) {
-      for( i := 1; i <= productCodeList.Size(); i := i + 1 ) {
-        productCode := productCodeList.Element( i - 1 );
+    
+    if ( years.Size() = 0 ) {
+      years := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterYear, tempCASBFY, 
+                          tempCASBFY.YearNo() = Date::ActualDate().Year()     or
+                          tempCASBFY.YearNo() = Date::ActualDate().Year() - 1 or
+                          tempCASBFY.YearNo() = Date::ActualDate().Year() + 1
+                         );
+    }
+    if ( businessTypes.Size() = 0 ) {
+      businessTypes := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterBusinessType, tempCASBFBT, true );
+    }
+    if ( placeOfProductionOfArrays.Size() = 0 ) {
+      placeOfProductionOfArrays := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterPlaceOfProductionOfArray, tempCASBFPOPOA, true );
+    }
+    
+    traverse ( years, Elements, year ) {
+      traverse ( product_MPs, Elements, pmp ) {
+        businessType             := businessTypes.Element( Number::Random( 0, businessTypes.Size() - 1 ) ).BusinessType();
+        placeOfProductionOfArray := placeOfProductionOfArrays.Element( Number::Random( 0, placeOfProductionOfArrays.Size() - 1 ) ).PlaceOfProductionOfArray();
         mappingAnnualBudget := this.Global_MappingAnnualBudgetData( relnew, 
-                                                                    ID := [String]id,
-                                                                    YearNo := [String]year.YearNo(),
-                                                                    BusinessType := "浜嬩笟閮�" + [String](productCode.Length() mod 3),
-                                                                    OrganCode := "I13",
-                                                                    ProductID := productCode);
-        id := id + 1;
+                                                                    ID           := OS::GenerateGUIDAsString(),
+                                                                    YearNo       := [String]year.YearNo(),
+                                                                    BusinessType := businessType,
+                                                                    OrganCode    := placeOfProductionOfArray,
+                                                                    ProductID    := pmp.ID()
+                                                                   );
+                                                                   
         mappingAnnualBudget.MonthlyModCapacity1( [String]Real::Random( 20000.0, 30000.0 ) );
         mappingAnnualBudget.MonthlyModCapacity2( [String]Real::Random( 20000.0, 30000.0 ) );
         mappingAnnualBudget.MonthlyModCapacity3( [String]Real::Random( 20000.0, 30000.0 ) );
@@ -62,7 +79,5 @@
         mappingAnnualBudget.MonthlySales12(  [String]Real::Random( 20000.0, 30000.0 ) );
       }
     }
-    result2 := selectset( this, Global_MappingAnnualBudgetData, item, true );
-    debuginfo( "test MappingAnnualBudget size : " + [String]result2.Size() );
   *]
 }
diff --git "a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl" "b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl"
index 12a5633..66ff081 100644
--- "a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl"
+++ "b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl"
@@ -101,14 +101,6 @@
       Global_MappingOperationCost::SynchronizeMacroPlanData( this, macroPlan, executionUser, businessTypes, organcodelist );
     }
     
-    //if ( isDOI_DSI ) {
-    //  Global_MappingDOI_DSI::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_DOI_DSI" );
-    //}
-    //
-    //if ( isCustomerGrade ) {
-    //  Global_MappingCustomerGrade::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_CustomerGrade" );
-    //}
-    
     if ( isStockingPoint_MP ) {
       Global_MappingStockingPoint_MP::SynchronizeMacroPlanData( this, macroPlan, executionUser );
     }
diff --git a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
index f860d1f..b96a8a8 100644
--- a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
+++ b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
@@ -15,73 +15,47 @@
   Description: '鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement'
   TextBody:
   [*
-    // yypsybs Sep-19-2023 (created)
-    // true, false
-    //info( saleOrCapacity );
-    // 鏈�;瀛e害;鍗婂勾;骞�
-    //info( groupBy );
-    // 闈㈡澘鍩哄湴;浜嬩笟閮�
-    //info( byBusinessTypeOrByOrgCode );
-    //traverse( businessTypes, Elements, businessType ) {
-    //  info( "businessType : " + businessType.BusinessType() );
-    //}
-    //traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-    //  info( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
-    //}
-    //traverse( macroPlans, Elements, macroPlan ) {
-    //  info( "macroPlan : " + macroPlan.ScenarioName() );  
-    //}
+    info( "浜ц兘/閿�鍞锛�", saleOrCapacity, "    鏃堕棿鍒嗙粍锛�", groupBy, "    鍩哄湴/浜嬩笟閮細", byBusinessTypeOrByOrgCode );
     // 骞翠唤涓嶉�夋椂鍏ㄩ��
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
+    if ( years.Size() = 0 ) {
+      years := selectset( this, CapacityAndSaleBudgeFilterYear, tempCASBFY, tempCASBFY.YearNo() = Date::ActualDate().Year() );
     }
-    //traverse( years, Elements, year ) {
-    //  debuginfo( "yearNo : " + [String]year.YearNo() );
-    //}
     // 鏈堜唤涓嶉�夋椂鍏ㄩ��
-    if( months.Size() = 0 ) {
+    if ( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, true, item.MonthNo() );
     }
-    //traverse( months, Elements, month ) {
-    //  debuginfo( "monthNo : " + [String]month.MonthNo() );
-    //}
     
     // ====娓呯悊鏃ф暟鎹�====
     this.CapacityAndSaleBudgeChartRow( relflush );
     this.CapacityAndSaleBudgeChartElement( relflush );
     
     // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
-    historyData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
-    if( businessTypes.Size() > 0 ) {
+    targeGlobal_MappingAnnualBudgetDatas := selectset( otdTable, Global_MappingAnnualBudgetData, tempGMABD, true );
+    if ( businessTypes.Size() > 0 ) {
       businessTypeStrings := selectuniquevalues( businessTypes, Elements, item, true, item.BusinessType() );
-      historyData := selectset( historyData, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
+      targeGlobal_MappingAnnualBudgetDatas := selectset( targeGlobal_MappingAnnualBudgetDatas, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
     }
-    if( placeOfProductionOfArrays.Size() > 0 ) {
+    if ( placeOfProductionOfArrays.Size() > 0 ) {
       placeOfProductionOfArrayStrings := selectuniquevalues( placeOfProductionOfArrays, Elements, item, true, item.PlaceOfProductionOfArray() );
-      historyData := selectset( historyData, Elements, item, placeOfProductionOfArrayStrings.Find( item.OrgCodeFromBom() ) > -1 );
+      targeGlobal_MappingAnnualBudgetDatas := selectset( targeGlobal_MappingAnnualBudgetDatas, Elements, item, placeOfProductionOfArrayStrings.Find( item.OrganCode() ) > -1 );
     }
-    //info( "historyData : " + [String]historyData.Size() );
-    traverse( historyData, Elements, item ) {
-      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.OrgCodeFromBom() );
+    info( "閫変腑鐨勪釜鏁�:", targeGlobal_MappingAnnualBudgetDatas.Size() );
+    
+    traverse ( targeGlobal_MappingAnnualBudgetDatas, Elements, gmabd ) {
+      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, gmabd.BusinessType(), gmabd.OrganCode() );
       // 璁板綍姣忚鍖呭惈鍝簺product
-      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductID() );
+      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, gmabd.ProductID() );
     }
+    
     rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
-    //info( "rows : " + [String]rows.Size() );
-    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.OrgCodeFromBom() );
-    //traverse( placeOfProductionOfArrayList, Elements, item ) {
-    //  info( "placeOfProduction : " + item );  
-    //}
-    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
-    //traverse( businessTypeList, Elements, item ) {
-    //  info( "businessType : " + item );  
-    //}
+    placeOfProductionOfArrayList := selectuniquevalues( targeGlobal_MappingAnnualBudgetDatas, Elements, tempGMABD, tempGMABD.OrganCode() );
+    businessTypeList := selectuniquevalues( targeGlobal_MappingAnnualBudgetDatas, Elements, tempGMABD, tempGMABD.BusinessType() );
+    
     // 鐢熸垚鍥捐〃鍏冪礌
-    traverse( years, Elements, year ) {
-    //  debuginfo( "process year start : " + [String]year.YearNo() );
-      if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
+    traverse ( years, Elements, year ) {
+      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
         // 鐩爣
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+        traverse ( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
           productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
           this.CapacityAndSaleBudgeChartElement( relnew, 
                                                  TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
@@ -89,9 +63,9 @@
                                                  Quantity := ifexpr( saleOrCapacity = "閿�鍞",
                                                                      Global_MappingAnnualBudgetData::GetSaleByYear( productCodeList, otdTable, year.YearNo() ),
                                                                      Global_MappingForecast::GetQuantityByYear( productCodeList, otdTable, year.YearNo() ) )
-                                                 );  
+                                                );
           // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
+          traverse ( macroPlans, Elements, macroPlan ) {
             this.CapacityAndSaleBudgeChartElement( relnew, 
                                                    TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
                                                    BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
@@ -286,17 +260,16 @@
     //      debuginfo( "process month end : " + [String]month.MonthNo() );
         }
       }
-    //  debuginfo( "process year end : " + [String]year.YearNo() )
     }
-    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
-    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
-    //  info( "==鈫�==" );
-    //  info( row.BusinessType() );
-    //  info( row.PlaceOfProductionOfArray() );
-    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
-    //  info( elements.Size() );
-    //  info( row.GetProductCodes().Concatenate( " | " ) );
-    //  info( "==鈫�==" );
-    //}
+    ////info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
+    ////traverse( this, CapacityAndSaleBudgeChartRow, row ) {
+    ////  info( "==鈫�==" );
+    ////  info( row.BusinessType() );
+    ////  info( row.PlaceOfProductionOfArray() );
+    ////  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
+    ////  info( elements.Size() );
+    ////  info( row.GetProductCodes().Concatenate( " | " ) );
+    ////  info( "==鈫�==" );
+    ////}
   *]
 }
diff --git a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
index 64a208a..0ba67ec 100644
--- a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
+++ b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
@@ -11,35 +11,22 @@
   Description: 'todo : mappingParent鏀逛负mpSync, random鍒犱簡'
   TextBody:
   [*
-    // yypsybs Sep-18-2023 (created)
     // ====涓嶉�夋椂榛樿鍏ㄩ��====
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
+    if ( years.Size() = 0 ) {
+      years := selectset( this, CapacityAndSaleBudgeFilterYear, tempCASBFY, tempCASBFY.YearNo() = Date::ActualDate().Year() );
     }
-    if( months.Size() = 0 ) {
+    if ( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
     }
-    traverse( macroPlans, Elements, item ) {
-      debuginfo( "scenario : " + item.ScenarioName() );
-    }
-    traverse( items, Elements, item ) {
-      debuginfo( "item : " + item.ItemName() );
-    }
-    traverse( years, Elements, item ) {
-      debuginfo( "year : " + [String]item.YearNo() );
-    }
-    traverse( months, Elements, item ) {
-      debuginfo( "month : " + [String]item.MonthNo() );
-    }
-    // ====娓呯悊鏃ф暟鎹�====
+    
     this.CapacityAndSaleBudgeCompareItemRow( relflush );
     this.CapacityAndSaleBudgeCompareItemColumn( relflush );
-    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
-    historyData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
-    debuginfo( "historyData : " + [String]historyData.Size() );
     
-    traverse( historyData, Elements, one ) {
-      productCode := one.ProductID();
+    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
+    targetglobal_MappingAnnualBudgetData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
+    
+    traverse ( targetglobal_MappingAnnualBudgetData, Elements, gmabd ) {
+      productCode := gmabd.ProductID();
     //  Global_MappingOperationBOM::CreateTestData( otdTable, "浜嬩笟閮�" + [String](productCode.Length() mod 3), "闈㈡澘鍩哄湴" + [String](productCode.Length() mod 4), productCode );
     //  boms := selectset( otdTable, Global_MappingOperationBOM, bom, bom.ProductCode() = productCode );
     //  if( boms.Size() > 0 ) {
@@ -47,17 +34,16 @@
     //    businessType := bom.BusinessType();
     //    placeOfProductionOfArray := bom.OrganCode();
         // 鐩稿悓闈㈡澘鍩哄湴鍜屼簨涓氶儴鐨勬斁涓�琛�
-        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, one.BusinessType(), one.OrgCodeFromBom() );
+        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, gmabd.BusinessType(), gmabd.OrganCode() );
         // 璁板綍姣忚鍖呭惈鍝簺product
         CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
     //  } else {
     //    debuginfo( "no boms for product : " + productCode );
     //  }
     }
-    debuginfo( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
+    
     // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
     // 浜嬩笟閮紝闈㈡澘鍩哄湴
-    debuginfo( "dealing businessType and placeOfProductionOfArray" )
     columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
     columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
     traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -66,100 +52,159 @@
       cell := columnPlaceOfProductionOfArray.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.PlaceOfProductionOfArray() );
       cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
     }
+    
     // 闈㈡澘鍒嗛厤閲� - 骞村害棰勭畻 (sheets)
     // 鏍煎紡锛� 闈㈡澘鍒嗛厤閲� - 骞� - 鏈堬紙1-12 & total锛� - 骞村害棰勭畻/scenarioName
-    debuginfo( "dealing 闈㈡澘鍒嗛厤閲�" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
-      traverse( years, Elements, year ) {
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
+    if ( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
+      traverse ( years, Elements, year ) {
         // 鍘嗗彶鏁版嵁
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Global_MappingForecast::GetQuantityByMonth( row.GetProductCodes(), otdTable, DateTime::Now().Year(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( months, Elements, month ) {
+    //      columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Global_MappingForecast::GetQuantityByMonth( row.GetProductCodes(), otdTable, DateTime::Now().Year(), month.MonthNo() );
+    //        cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+    //    columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+    //    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //      cellReal := Global_MappingForecast::GetQuantityByYear( row.GetProductCodes(), otdTable, year.YearNo() );
+    //      cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    }
+        
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+          total := 0.0;
+          traverse ( months, Elements, m ) {
+            columnName  := "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-骞村害棰勭畻";
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+            cellReal    := Global_MappingForecast::GetQuantityByMonth( casbcir.GetProductCodes(), otdTable, DateTime::Now().Year(), m.MonthNo() );
+            cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            total       := total + cellReal;
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+          cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+          columnYear.TotalIdentification( year.YearNo() );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
         }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := Global_MappingForecast::GetQuantityByYear( row.GetProductCodes(), otdTable, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
+        
         // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                    "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( macroPlans, Elements, macroPlan ) {
+    //      traverse ( months, Elements, month ) {
+    //        columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+    //                                                                                "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+    //        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //          cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
+    //          cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //        }
+    //      }
+    //      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+    //                                                                             "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
+    //        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+        traverse ( macroPlans, Elements, mp ) {
+          traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+            total := 0.0;
+            traverse ( months, Elements, m ) {
+              columnName  := "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-" + mp.ScenarioName();
+              columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+              cellReal    := Product_MP::GetNewSupplyByMonth( casbcir.GetProductCodes(), mp, year.YearNo(), m.MonthNo() );
+              cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              total       := total + cellReal;
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
             }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                 "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + mp.ScenarioName() );
+            cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+            columnYear.TotalIdentification( year.YearNo() );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
         }
       }
     }
+    
     // 骞村害閿�鍞
-    debuginfo( "dealing 閿�鍞" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
-      traverse( years, Elements, year ) {
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞�" );
+    if ( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
+      traverse ( years, Elements, year ) {
         // 鍘嗗彶鏁版嵁
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Global_MappingAnnualBudgetData::GetSaleByMonth( row.GetProductCodes(), otdTable, year.YearNo(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( months, Elements, month ) {
+    //      columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Global_MappingAnnualBudgetData::GetSaleByMonth( row.GetProductCodes(), otdTable, year.YearNo(), month.MonthNo() );
+    //        cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+    //    columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
+    //    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //      cellReal := Global_MappingAnnualBudgetData::GetSaleByYear( row.GetProductCodes(), otdTable, year.YearNo() );
+    //      cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    }
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+          total := 0.0;
+          traverse ( months, Elements, m ) {
+            columnName  := "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-骞村害棰勭畻";
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+            cellReal    := Global_MappingAnnualBudgetData::GetSaleByMonth( casbcir.GetProductCodes(), otdTable, year.YearNo(), m.MonthNo() );
+            cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            total       := total + cellReal;
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+          cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+          columnYear.TotalIdentification( year.YearNo() );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
         }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := Global_MappingAnnualBudgetData::GetSaleByYear( row.GetProductCodes(), otdTable, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
+        
         // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := Forecast::GetFulfilledBalanceByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( macroPlans, Elements, macroPlan ) {
+    //      traverse ( months, Elements, month ) {
+    //        columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+    //        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //          cellReal := Forecast::GetFulfilledBalanceByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
+    //          cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //        }
+    //      }
+    //      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+    //      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        // QID 23
+    //        cellReal := Forecast::GetFulfilledBalanceByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
+    //        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+        traverse ( macroPlans, Elements, mp ) {
+          traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+            total := 0.0;
+            traverse ( months, Elements, m ) {
+              columnName  := "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-" + mp.ScenarioName();
+              columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+              cellReal    := Forecast::GetFulfilledBalanceByMonth( casbcir.GetProductCodes(), mp, year.YearNo(), m.MonthNo() );
+              cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              total       := total + cellReal;
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
             }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            // QID 23
-            cellReal := Forecast::GetFulfilledBalanceByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + mp.ScenarioName() );
+            cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+            columnYear.TotalIdentification( year.YearNo() );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
         }
       }
     }
+    
     // 澶у紶鐩堝埄棰�
-    debuginfo( "dealing 澶у紶鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
+    traverse ( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo 
-        // QID 23
+      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
         cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
         cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
       }
@@ -173,19 +218,17 @@
       }
     }
     // 浜у搧鐩堝埄棰�
-    debuginfo( "dealing 浜у搧鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
+    traverse ( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo
+      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
         cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
         cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
       }
       // S&OP鏁版嵁
-      traverse( macroPlans, Elements, macroPlan ) {
+      traverse ( macroPlans, Elements, macroPlan ) {
         columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName() );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
           // todo
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
@@ -194,7 +237,6 @@
     }
     
     // 璁剧疆rowNo鍜宑olumnNo
-    debuginfo( "set rowNo and columnNo" );
     rowNo := 1;
     rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
     traverse( rowSorted, Elements, item ) {
@@ -206,6 +248,5 @@
       item.ColumnNo( columnNo );
       columnNo := columnNo + 1;
     }
-    debuginfo( "done" );
   *]
 }
diff --git a/_Main/BL/Type_GlobalParameters/Attribute_Address.qbl b/_Main/BL/Type_GlobalParameters/Attribute_Address.qbl
new file mode 100644
index 0000000..f2e1fe6
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/Attribute_Address.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Address
+{
+  #keys: '3[412960.0.369930086][412960.0.369930085][412960.0.369930087]'
+  Description: 'Api浣跨敤鐨勫湴鍧�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_GlobalParameters/Attribute_AttributeName.qbl b/_Main/BL/Type_GlobalParameters/Attribute_AttributeName.qbl
new file mode 100644
index 0000000..85f6698
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/Attribute_AttributeName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute AttributeName
+{
+  #keys: '3[412960.0.369930046][412960.0.369930045][412960.0.369930047]'
+  Description: '鍙橀噺鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_GlobalParameters/Attribute_AttributeValue.qbl b/_Main/BL/Type_GlobalParameters/Attribute_AttributeValue.qbl
new file mode 100644
index 0000000..378b5e3
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/Attribute_AttributeValue.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute AttributeValue
+{
+  #keys: '3[412960.0.369930056][412960.0.369930055][412960.0.369930057]'
+  Description: '鍙橀噺鍊�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_GlobalParameters/Attribute_Port.qbl b/_Main/BL/Type_GlobalParameters/Attribute_Port.qbl
new file mode 100644
index 0000000..29658ab
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/Attribute_Port.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Port
+{
+  #keys: '3[412960.0.369930066][412960.0.369930065][412960.0.369930067]'
+  Description: 'Api浣跨敤鐨勭鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_GlobalParameters/Attribute_PostRequestBody.qbl b/_Main/BL/Type_GlobalParameters/Attribute_PostRequestBody.qbl
new file mode 100644
index 0000000..c1fe72b
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/Attribute_PostRequestBody.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute PostRequestBody
+{
+  #keys: '3[412960.0.369930076][412960.0.369930075][412960.0.369930077]'
+  Description: 'Api浣跨敤鐨刾ost body'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_GlobalParameters/StaticMethod_TestForApiRequest.qbl b/_Main/BL/Type_GlobalParameters/StaticMethod_TestForApiRequest.qbl
new file mode 100644
index 0000000..c10cd30
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/StaticMethod_TestForApiRequest.qbl
@@ -0,0 +1,172 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod TestForApiRequest (
+  GlobalOTDTable owner
+)
+{
+  TextBody:
+  [*
+    // Administrator Oct-26-2023 (created)
+    //info( "Sales Segment Finished, Start Get StockingPoint From Api" )
+    //bodynumber := "2";
+    //postrequestbody := JSON::Object()
+    //                    .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+    //                    .Add( "fromSystemCode", "OTDH000" + bodynumber )
+    //                    .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+    //                    .Add( "ouZone", "OU_TMSH" )
+    //                    .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+    //                    .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+    //                    .Add( "dataType", "JSON" )
+    //                    .Add( "data", JSON::Object()
+    //                                  .Add( "pageIndex", "1" ) ).Build();
+    //
+    //info( DateTime::Now().Format( "Y-M2-D2 H:m:s" ) );
+    //postrequestbodystring := postrequestbody.AsString();
+    //info( postrequestbodystring );
+    //
+    //parameter := select( owner, GlobalParameters, param, param.AttributeName() = "test" );
+    //body := parameter.PostRequestBody();
+    //address := parameter.Address();
+    //url := parameter.AttributeValue();
+    //port := [Number]parameter.Port();
+    //
+    //// for HTTPS requests:
+    //i := HTTPInterface::Create( address, port);
+    ////i := HTTPInterface::Create( address ,443);
+    //info( address, url, port, body );
+    //
+    //i.URL(url);
+    //i.SSL(false);
+    ////i.SSL(true);
+    ////i.SSLKeystore('MyKeystore'); // created in the Config Utility
+    //
+    //i.PostMethod(true); //it's a POST method
+    //
+    //i.Call(body); // Call's argument is for POST method's content.
+    //htmlresult := i.Result();
+    //info( htmlresult );
+    //
+    //htmlresponse := JSON::Parse( htmlresult );
+    //info( htmlresponse );
+    
+    info( "Init StockingPoint For Api" )
+    existparameter := select( owner, GlobalParameters, param, param.AttributeName() = "StockingPoint" );
+    if( not isnull( existparameter ) ){
+      existparameter.Delete();
+      }
+    spparameter := owner.GlobalParameters( relnew );
+    spparameter.AttributeName( "StockingPoint" );
+    spparameter.AttributeValue( "/otdService/https/GetStockingPointsInfo" );
+    spparameter.Address( "api-uat-sgc.tianma.cn" );
+    spparameter.Port( "443" );
+    bodynumber := "2";
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    postrequestbodystring := postrequestbody.AsString();
+    spparameter.PostRequestBody( postrequestbodystring );
+    
+    info( "Init CurrencyInfo For Api" )
+    existparameter := select( owner, GlobalParameters, param, param.AttributeName() = "CurrencyInfo" );
+    if( not isnull( existparameter ) ){
+      existparameter.Delete();
+      }
+    ciparameter := owner.GlobalParameters( relnew );
+    ciparameter.AttributeName( "CurrencyInfo" );
+    ciparameter.AttributeValue( "/otdService/https/GetCurrenciesInfo" );
+    ciparameter.Address( "api-uat-sgc.tianma.cn" );
+    ciparameter.Port( "443" );
+    bodynumber := "1";
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    postrequestbodystring := postrequestbody.AsString();
+    ciparameter.PostRequestBody( postrequestbodystring );
+    
+    info( "Init CurrencyRates For Api" )
+    existparameter := select( owner, GlobalParameters, param, param.AttributeName() = "CurrencyRates" );
+    if( not isnull( existparameter ) ){
+      existparameter.Delete();
+      }
+    crparameter := owner.GlobalParameters( relnew );
+    crparameter.AttributeName( "CurrencyRates" );
+    crparameter.AttributeValue( "/otdService/https/GetCurrencyRatesInfo" );
+    crparameter.Address( "api-uat-sgc.tianma.cn" );
+    crparameter.Port( "443" );
+    bodynumber := "5";
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    postrequestbodystring := postrequestbody.AsString();
+    crparameter.PostRequestBody( postrequestbodystring );
+    
+    info( "Init Lanes For Api" )
+    existparameter := select( owner, GlobalParameters, param, param.AttributeName() = "Lanes" );
+    if( not isnull( existparameter ) ){
+      existparameter.Delete();
+      }
+    lparameter := owner.GlobalParameters( relnew );
+    lparameter.AttributeName( "Lanes" );
+    lparameter.AttributeValue( "/otdService/https/GetLanesInfo" );
+    lparameter.Address( "api-uat-sgc.tianma.cn" );
+    lparameter.Port( "443" );
+    bodynumber := "3";
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    postrequestbodystring := postrequestbody.AsString();
+    lparameter.PostRequestBody( postrequestbodystring );
+    
+    info( "Init LaneLegs For Api" )
+    existparameter := select( owner, GlobalParameters, param, param.AttributeName() = "LaneLegs" );
+    if( not isnull( existparameter ) ){
+      existparameter.Delete();
+      }
+    llparameter := owner.GlobalParameters( relnew );
+    llparameter.AttributeName( "LaneLegs" );
+    llparameter.AttributeValue( "/otdService/https/GetLaneLegsInfo" );
+    llparameter.Address( "api-uat-sgc.tianma.cn" );
+    llparameter.Port( "443" );
+    bodynumber := "4";
+    postrequestbody := JSON::Object()
+                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
+                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
+                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
+                        .Add( "ouZone", "OU_TMSH" )
+                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
+                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
+                        .Add( "dataType", "JSON" )
+                        .Add( "data", JSON::Object()
+                                      .Add( "pageIndex", "1" ) ).Build();
+    postrequestbodystring := postrequestbody.AsString();
+    llparameter.PostRequestBody( postrequestbodystring );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalParameters/_ROOT_Type_GlobalParameters.qbl b/_Main/BL/Type_GlobalParameters/_ROOT_Type_GlobalParameters.qbl
new file mode 100644
index 0000000..7496bd1
--- /dev/null
+++ b/_Main/BL/Type_GlobalParameters/_ROOT_Type_GlobalParameters.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type GlobalParameters
+{
+  #keys: '5[412960.0.369930026][412960.0.369930024][0.0.0][412960.0.369930025][412960.0.369930027]'
+  BaseType: Object
+  Description: '鍏ㄥ眬鍙傛暟'
+  StructuredName: 'GlobalParameterss'
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_Critical.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_Critical.qbl
new file mode 100644
index 0000000..d8e681a
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Attribute_Critical.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Critical
+{
+  #keys: '3[414882.0.72610025][414882.0.72610024][414882.0.72610026]'
+  Description: '鍏抽敭鐗╂枡'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcCritical.qbl b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcCritical.qbl
new file mode 100644
index 0000000..a6a025e
--- /dev/null
+++ b/_Main/BL/Type_Global_MAPISPIPCategory/Function_CalcCritical.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcCritical
+{
+  TextBody:
+  [*
+    // hongjli Oct-24-2023 (created)
+    
+    value := guard( select( this, Global_MappingProduct_MP, tempGMPMP, true ).Critical(), false );
+    
+    this.Critical(value);
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
index e3b0e63..c8828b9 100644
--- a/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
@@ -8,11 +8,11 @@
   [*
     globalOTDTable.Global_MappingCurrencyRate_MP( relflush );
     
-    bodynumber := "5";
-    postrequestbody := globalOTDTable.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrencyRatesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "CurrencyRates" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     i := HTTPInterface::Create( address, port);
     i.URL( url );
     i.SSL( true );
diff --git a/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
index 2480088..cf9ba2f 100644
--- a/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
@@ -8,11 +8,11 @@
   [*
     globalOTDTable.Global_MappingCurrency_MP( relflush );
     
-    bodynumber := "1";
-    postrequestbody := globalOTDTable.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrenciesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "CurrencyInfo" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     i := HTTPInterface::Create( address, port);
     i.URL( url );
     i.SSL( true );
diff --git a/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
index e46efd6..d1f365c 100644
--- a/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
@@ -8,11 +8,11 @@
   [*
     globalOTDTable.Global_MappingLane( relflush );
     
-    bodynumber := "3";
-    postrequestbody := globalOTDTable.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLanesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "Lanes" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     i := HTTPInterface::Create( address, port);
     i.URL( url );
     i.SSL( true );
diff --git a/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
index 7899f6e..ad5182b 100644
--- a/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
@@ -8,11 +8,11 @@
   [*
     globalOTDTable.Global_MappingLaneLeg( relflush );
     
-    bodynumber := "4";
-    postrequestbody := globalOTDTable.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLaneLegsInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "LaneLegs" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     i := HTTPInterface::Create( address, port);
     i.URL( url );
     i.SSL( true );
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_Critical.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_Critical.qbl
new file mode 100644
index 0000000..bdc96fd
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_Critical.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Critical
+{
+  #keys: '3[414882.0.72574612][414882.0.72574611][414882.0.72574613]'
+  Description: '鍏抽敭鐗╂枡'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_KeyProduct.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_KeyProduct.qbl
index 431f730..3824133 100644
--- a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_KeyProduct.qbl
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_KeyProduct.qbl
@@ -3,5 +3,10 @@
 Attribute KeyProduct
 {
   #keys: '3[414702.0.247711010][414702.0.247711009][414702.0.247711011]'
+  Description:
+  [*
+    宸插純鐢�
+    鍏抽敭鐗╂枡娌℃湁鏁版嵁鏉ユ簮锛屼互鍚庝粠鍏朵粬灞炴�ц绠楀緱鍒帮紝鏀逛负Critical
+  *]
   ValueType: Boolean
 }
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Function_CalcCritical.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Function_CalcCritical.qbl
new file mode 100644
index 0000000..be05486
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Function_CalcCritical.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcCritical
+{
+  TextBody:
+  [*
+    // renhao Oct-30-2023 (created)
+    value := this.ProductMajorType()="鎴愬搧" or this.ProductMajorType()="鍗婃垚鍝�";
+    
+    this.Critical(value);
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
index 4901d0a..749075f 100644
--- a/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
@@ -8,11 +8,11 @@
   [*
     globalOTDTable.Global_MappingStockingPoint_MP( relflush );
     
-    bodynumber := "2";
-    postrequestbody := globalOTDTable.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetStockingPointsInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "StockingPoint" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     i := HTTPInterface::Create( address, port);
     i.URL( url );
     i.SSL( true );
diff --git a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
index 391ecf9..0b2323a 100644
--- a/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
+++ b/_Main/BL/Type_InventoryValueAndCost/StaticMethod_DoASync.qbl
@@ -3,7 +3,7 @@
 StaticMethod DoASync (
   MacroPlan macroPlan,
   const GlobalOTDTable globalOTDTable,
-  String businessTypeName
+  Strings businessTypeNames
 )
 {
   TextBody:
@@ -12,6 +12,6 @@
     //info( "ActualPISPIP Finished, Start InventoryCost Data Broker" );
     //macroPlan.Broker_OTD_InventoryCost().Execute();
     info( "InventoryCost Data Broker Finished, Start InventoryCost Mapping" );
-    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable,businessTypeName);
+    macroPlan.DoASyncMappingInventoryValueAndCostData(globalOTDTable,businessTypeNames);
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
index d2f5724..7140c64 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingActualPISPIPData.qbl
@@ -12,9 +12,10 @@
     // renhao Aug-14-2023 (created)
     listtodeal := construct( Global_MappingActualProductInStockingPointInPeriods, constcontent );
     if ( businessTypes.Size() > 0 ) {
-      businessTypeName := businessTypes.Element( 0 );
-      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
-      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_MAPISPIPCategory.Global_MappingActualProductInStockingPointInPeriod, 
+      targetGlobal_ProductCategory := selectset( globalOTDTable, Global_ProductCategory, tempGPC, 
+                                                 exists( businessTypes, Elements, tempBTN, tempBTN = tempGPC.BusinessTypeName() ) );
+      listtodeal := selectset( targetGlobal_ProductCategory, 
+                               Elements.Global_MappingProduct_MP.Global_MAPISPIPCategory.Global_MappingActualProductInStockingPointInPeriod, 
                                tempGMPIL, 
                                ( tempGMPIL.ActualInventoryLevelEnd() > 0 ) and 
                                ( organcodelist.Find( tempGMPIL.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
@@ -35,10 +36,11 @@
         info( "Now is dealing with the " + count.AsQUILL() + "ActualPISPIP " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
         }
       //product := select( globalOTDTable,Global_MappingProduct_MP,product,product.ID() = actual.ProductID() and product.KeyProduct() = nuclear,true);
-      if( /*not isnull( product*/ guard( actual.Global_MAPISPIPCategory().KeyProduct() = nuclear, false ) ){
+      //if( guard( actual.Global_MAPISPIPCategory().KeyProduct() = nuclear, false ) ){
+      if( not nuclear or (nuclear and actual.Global_MAPISPIPCategory().Critical() = nuclear) ){
       if( not isnull(businessTypes)){
       
-        for( i :=0 ;i < businessTypes.Size();i++ ){
+        
           //businessType := businessTypes.Element( i );
           if( /*product.BusinessType() = businessType and not product.IsCommon()*/ not actual.Global_MAPISPIPCategory().IsCommon() ){
             ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
@@ -48,7 +50,7 @@
                                                                   actual.ActualInventoryLevelEnd(),
                                                                   actual.ManufacturedDate());
           }
-        }
+        
         
       }else{
         ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
index 6596139..ad47aed 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingExternalSupplyData.qbl
@@ -15,9 +15,10 @@
     
     listtodeal := construct( Global_MappingInventorySupplys, constcontent );
     if ( businessTypes.Size() > 0 ) {
-      businessTypeName := businessTypes.Element( 0 );
-      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
-      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_InventorySupplyCategory.Global_MappingInventorySupply, 
+      targetGlobal_ProductCategory := selectset( globalOTDTable, Global_ProductCategory, tempGPC, 
+                                                 exists( businessTypes, Elements, tempBTN, tempBTN = tempGPC.BusinessTypeName() ) );
+      listtodeal := selectset( targetGlobal_ProductCategory, 
+                               Elements.Global_MappingProduct_MP.Global_InventorySupplyCategory.Global_MappingInventorySupply, 
                                tempGMIS, 
                                ( tempGMIS.UserQuantity()>0 ) and 
                                ( tempGMIS.Date() >= queryStartDate ) and 
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
index 78b1f55..b000fe9 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingInventoryValueAndCostData.qbl
@@ -2,18 +2,22 @@
 #parent: #root
 Method DoASyncMappingInventoryValueAndCostData (
   const GlobalOTDTable globalOTDTable,
-  String businessTypeName
+  Strings businessTypeNames
 )
 {
   TextBody:
   [*
     // yypsybs Aug-15-2023 (created)
     listtodeal := construct( Global_MappingStockingPointCosts, constcontent );
-    if ( businessTypeName = "" ) {
+    if ( businessTypeNames.Size() = 0 ) {
       listtodeal := selectset( globalOTDTable,Global_MappingStockingPointCost,item,true );
     } else {
-      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
-      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_StockingPointCostCategory.Global_MappingStockingPointCost, tempGMPIL, true );
+      targetGlobal_ProductCategory := selectset( globalOTDTable, Global_ProductCategory, tempGPC, 
+                                                 exists( businessTypeNames, Elements, tempBTN, tempBTN = tempGPC.BusinessTypeName() ) );
+      listtodeal := selectset( targetGlobal_ProductCategory, 
+                               Elements.Global_MappingProduct_MP.Global_StockingPointCostCategory.Global_MappingStockingPointCost, 
+                               tempGMPIL, 
+                               true );
     }
     totalcount := listtodeal.Size();
     
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingOperationBOMDataRouting.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingOperationBOMDataRouting.qbl
index 43f35a0..b575592 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingOperationBOMDataRouting.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingOperationBOMDataRouting.qbl
@@ -65,8 +65,11 @@
                                                         true, trash );
                     mainBOM.Quantity( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
                     mainBOM.MaxQuantityInGroup( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
+                    mainBOM.MinQuantityInGroup(0);
                     mainQty := mainBOM.Quantity();
                     Transaction::Transaction().Propagate();
+                    
+                    altersize := alterRows.Size();
                     // 娣诲姞杈呮枡
                     traverse( alterRows, Elements, alterRow ) {
                         alterProd := Product_MP::FindById( this, alterRow.AlternativeMaterialCode() );
@@ -84,14 +87,23 @@
                           trash := construct( OperationBOMs );
                           if( not isnull( mainInput ) ) {
                               alterBom := mainInput.Operation().LinkPISP( pispAlter, true, mainInput.OperationLinkGroupID(), trash );
-                              alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
+                              //alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
+                              //alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
+                              alterBom.Quantity( mainBOM.MaxQuantityInGroup() / altersize );
                               alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
+                              alterBom.MinQuantityInGroup(0);
     //                          info( "Quantity" + [String]alterBom.Quantity() )
     //                          info( "MaxQuantityInGroup" + [String]alterBom.MaxQuantityInGroup() )
                               mainQty := mainQty - alterBom.Quantity();
                           }
                       }
-                      mainBOM.Quantity( mainQty );
+                      
+                      Transaction::Transaction().Propagate( relation( OperationBOM, OperationInputGroup));
+                      if( not isnull( mainBOM.OperationInputGroup())){
+                        mainBOM.OperationInputGroup().InputGroupQuantity(mainBOM.MaxQuantityInGroup());
+                        mainBOM.Quantity( mainBOM.MaxQuantityInGroup() / altersize );
+                      }
+                      
                    }
                 }
               }
diff --git a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
index 38a7a8b..b1434d1 100644
--- a/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_DoASyncMappingProductInLaneData.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 Method DoASyncMappingProductInLaneData (
   const GlobalOTDTable globalOTDTable,
-  String businessTypeName
+  Strings businessTypeNames
 )
 {
   Description: 'Get Product In Line data'
@@ -11,11 +11,15 @@
     // Administrator Aug-17-2023 (created)
     // list to deal
     listtodeal := construct( Global_MappingProductInLanes, constcontent );
-    if ( businessTypeName = "" ) {
+    if ( businessTypeNames.Size() = 0 ) {
       listtodeal := selectset( globalOTDTable, Global_MappingProductInLane, item ,true );
     } else {
-      targetGlobal_ProductCategory := select( globalOTDTable, Global_ProductCategory, tempGPC, tempGPC.BusinessTypeName() = businessTypeName );
-      listtodeal := selectset( targetGlobal_ProductCategory, Global_MappingProduct_MP.Global_ProductInLineCategory.Global_MappingProductInLane, tempGMPIL, true );
+      targetGlobal_ProductCategory := selectset( globalOTDTable, Global_ProductCategory, tempGPC, 
+                                                 exists( businessTypeNames, Elements, tempBTN, tempBTN = tempGPC.BusinessTypeName() ) );
+      listtodeal := selectset( targetGlobal_ProductCategory, 
+                               Elements.Global_MappingProduct_MP.Global_ProductInLineCategory.Global_MappingProductInLane, 
+                               tempGMPIL, 
+                               true );
     }
     totalcount := listtodeal.Size();
     info( "ProductInLane has " + totalcount.AsQUILL() + " rows in total" );
diff --git "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl" "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
index 0f6ac65..0c397f4 100644
--- "a/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
+++ "b/_Main/BL/Type_MacroPlan/StaticMethod_DoASync\043253.qbl"
@@ -45,31 +45,31 @@
     
     // 搴撳瓨鐐�-3
     info( "Sales Segment Finished, Start Get StockingPoint From Api" )
-    bodynumber := "2";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetStockingPointsInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "StockingPoint" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
     macroPlan.ApiStockingPointData( data );
     
     // 璐у竵淇℃伅-4
     info( "Get StockingPoint From Api Finished, Start Get CurrencyInfo From Api" )
-    bodynumber := "1";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrenciesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "CurrencyInfo" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
     macroPlan.ApiCurenciesData( data );
     
     //璐у竵姹囩巼淇℃伅-5
     info( "Get CurrencyInfo From Api Finished, Start Get CurrencyRates From Api" )
-    bodynumber := "5";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetCurrencyRatesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "CurrencyRates" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
     macroPlan.ApiCurencyRatesData( data );
     
@@ -93,21 +93,21 @@
     
     //杞﹂亾淇℃伅-10
     info( "BOM Finished, Start Get Lanes From Api" );
-    bodynumber := "3";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLanesInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "Lanes" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
     macroPlan.ApiLanesData( data );
     
     //杞﹂亾杩愯緭娈�-11
     info( "Get Lanes From Api Finished, Start Get LaneLegs From Api" );
-    bodynumber := "4";
-    postrequestbody := macroPlan.ApiBuildPostRequestBody( bodynumber );
-    address := "api-uat-sgc.tianma.cn";
-    url := "/otdService/https/GetLaneLegsInfo";
-    port := 443;
+    parameter := select( globalOTDTable, GlobalParameters, param, param.AttributeName() = "LaneLegs" );
+    postrequestbody := parameter.PostRequestBody();
+    address := parameter.Address();
+    url := parameter.AttributeValue();
+    port := [Number]parameter.Port();
     data := macroPlan.ApiResponesCheck( address, url, port, postrequestbody );
     macroPlan.ApiLaneLegsData( data );
     
@@ -115,7 +115,7 @@
     //info( "Get Lanelegs From Api Finished, Start ProductInLane Data Broker" );
     //macroPlan.Broker_OTD_ProductInLane().Execute();
     info( "ProductInLane Data Broker Finished, Start ProductInLane Mapping" );
-    macroPlan.DoASyncMappingProductInLaneData(globalOTDTable,guard( businessTypeName.Element( 0 ), "" ));
+    macroPlan.DoASyncMappingProductInLaneData( globalOTDTable,businessTypeName );
     
     // 鍦ㄥ簱搴撳瓨鏁版嵁-13
     //info( "ProductInLane Finished, Start ActualPISPIP Data Broker" );
@@ -130,7 +130,7 @@
     macroPlan.DoASyncMappingExternalSupplyData( businessTypeName, isKeyProduct ,globalOTDTable, organcodelist );
     
     // 搴撳瓨鎴愭湰-15
-    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable,guard( businessTypeName.Element( 0 ), "" ) );
+    InventoryValueAndCost::DoASync( macroPlan,globalOTDTable,businessTypeName );
     
     // todo 鍒堕�犳垚鏈�-16
     info( "InventoryCost Finished, Start OperationCost Mapping" );
diff --git a/_Main/BL/Type_PRData/StaticMethod_ExportTheFileStream.qbl b/_Main/BL/Type_PRData/StaticMethod_ExportTheFileStream.qbl
new file mode 100644
index 0000000..4f4edbb
--- /dev/null
+++ b/_Main/BL/Type_PRData/StaticMethod_ExportTheFileStream.qbl
@@ -0,0 +1,53 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportTheFileStream (
+  PRDatas toExportList
+) as BinaryValue
+{
+  TextBody:
+  [*
+    text:= '<?xml version="1.0" encoding="utf-8" standalone="yes"?><table><name>PR</name><column><name>鐗╂枡缂栫爜</name><type>String</type></column><column><name>鐗╂枡鍚嶇О</name><type>String</type></column><column><name>闈㈡澘鐗╂枡鏍囪瘑</name><type>String</type></column><column><name>浜よ揣鏃ユ湡</name><type>String</type></column><column><name>PR寤鸿鏃ユ湡</name><type>String</type></column><column><name>浜よ揣鏁伴噺</name><type>Number</type></column><column><name>MRP璁$畻鐗堟湰鍙�</name><type>String</type></column><column><name>涓氬姟绫诲瀷</name><type>String</type></column><column><name>缁勭粐缂栫爜</name><type>String</type></column><column><name>鏄惁闀垮懆鏈�</name><type>String</type></column><column><name>鏄惁涓撶敤鏂�</name><type>String</type></column><column><name>鐗╂枡璁″垝绛栫暐</name><type>String</type></column><column><name>鎻愬墠鏈�</name><type>Number</type></column><column><name>渚涘簲鍟嗕唬鐮�</name><type>String</type></column><column><name>渚涘簲鍟嗗悕绉�</name><type>String</type></column><column><name>鏀惰揣搴撳瓨鐐�</name><type>String</type></column><column><name>璁¢噺鍗曚綅</name><type>String</type></column><column><name>PR鏁版嵁鍙戦�佺姸鎬�</name><type>String</type></column><column><name>鍙戦�佹椂闂�</name><type>String</type></column><column><name>鍙戦�佷汉</name><type>String</type></column></table>';
+    
+    sc := DateToString::StandardConverter();
+    sc.SetCustomConversion();
+    sc.CustomFormatString( 'yyyy-MM-dd' );
+    
+    xmlDOMImplementation := XMLDOMImplementation::Create();
+    xmlDOMDocument := xmlDOMImplementation.CreateDocumentFromString( text );
+    
+    tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
+    
+    traverse ( toExportList, Elements, prd ) {
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.ProductID(), "鐗╂枡缂栫爜" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.ProductName(), "鐗╂枡鍚嶇О" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.IsPanelMaterial(), "闈㈡澘鐗╂枡鏍囪瘑" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, sc.Convert( prd.DeliveryDate() ), "浜よ揣鏃ユ湡" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, sc.Convert( prd.PRSuggestionDate() ), "PR寤鸿鏃ユ湡" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]( prd.Quantity().Round( 0 ) ), "浜よ揣鏁伴噺" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.MRPCalverNo(), "MRP璁$畻鐗堟湰鍙�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.BusinessType(), "涓氬姟绫诲瀷" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.OrganCode(), "缁勭粐缂栫爜" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.IsLongLeadItem(), "鏄惁闀垮懆鏈�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.IsGenericMaterial(), "鏄惁涓撶敤鏂�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.MaterialMRPType(), "鐗╂枡璁″垝绛栫暐" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]prd.LeadTime(), "鎻愬墠鏈�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.ProviderCode(), "渚涘簲鍟嗕唬鐮�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.ProviderName(), "渚涘簲鍟嗗悕绉�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.StockingPointID(), "鏀惰揣搴撳瓨鐐�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.UnitOfMeasure(), "璁¢噺鍗曚綅" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.PRReleaseStatus(), "PR鏁版嵁鍙戦�佺姸鎬�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.CreateTimeString(), "鍙戦�佹椂闂�" );
+      PRData::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, prd.CreateBy(), "鍙戦�佷汉" );
+    }
+    
+    xmlDOMSerializer := xmlDOMImplementation.CreateSerializer();
+    xmlTableString := xmlDOMSerializer.WriteToString( xmlDOMDocument );
+    
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTableString ) );
+    tableGroupHandle := TableGroupHandle::Create( "PR" );
+    tableGroupHandle.Add( tableHandle );
+    tableBinaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return tableBinaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_PRData/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl "b/_Main/BL/Type_PRData/StaticMethod_GeneratesTheSpecifiedXMLColumn\04356.qbl"
similarity index 100%
rename from _Main/BL/Type_PRData/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl
rename to "_Main/BL/Type_PRData/StaticMethod_GeneratesTheSpecifiedXMLColumn\04356.qbl"
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 4ad9e84..2cd8ea3 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -85,6 +85,7 @@
         Component MenuDoSync { #keys: '[414384.0.605664172]' BaseType: 'Menu' Properties: [ Image: 'CLOUD_DOWNLOAD' Text: 'DoSync' ] }
         Component menuSeparator506 { #keys: '[414702.0.137524309]' BaseType: 'Menu' Properties: [ Separator: true ] }
         Component ComponentMenuAnalysisGlobalOTDTable { #keys: '[414702.0.137524953]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysisGlobalOTDTable' Text: '' ] }
+        Component ComponentMenu749 { #keys: '[414702.1.273394009]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis633' Text: '' ] }
       ]
       Properties:
       [
@@ -103,6 +104,7 @@
           c: MenuDoSync
           c: menuSeparator506
           c: ComponentMenuAnalysisGlobalOTDTable
+          c: ComponentMenu749
         }
       ]
     }
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def
new file mode 100644
index 0000000..297a438
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component swTop
+{
+  #keys: '[530.0.3531806]'
+  BaseType: 'swTop'
+  IsDerived: true
+  Children:
+  [
+    Component spTopLeft
+    {
+      #keys: '[530.0.3531807]'
+      BaseType: 'spTopLeft'
+      IsDerived: true
+      Children:
+      [
+        Component Analysis
+        {
+          #keys: '[530.0.3532065]'
+          BaseType: 'Analysis'
+          IsDerived: true
+          Properties:
+          [
+            GlobalInstance: 'GlobalOTDSOP'
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def
new file mode 100644
index 0000000..8a8fcd7
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component swTopMost
+{
+  #keys: '[530.0.3531801]'
+  BaseType: 'swTopMost'
+  IsDerived: true
+  Children:
+  [
+    Component SplitterPane1
+    {
+      #keys: '[530.0.3531802]'
+      BaseType: 'SplitterPane1'
+      IsDerived: true
+      Children:
+      [
+        #child: swTop
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def
new file mode 100644
index 0000000..a7fd526
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlanner
+OrphanComponent frmStandardAnalysis633
+{
+  #keys: '[414702.1.273394023]'
+  BaseType: 'frmStandardAnalysis'
+  Children:
+  [
+    #child: swTopMost
+  ]
+  Properties:
+  [
+    Height: 740
+    Image: 'BEER_GLASS'
+    Title: 'Analysis GlobalOTDSOP'
+    Width: 1300
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def"
new file mode 100644
index 0000000..2f902b8
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component ActionBarGroupScenarioComparisonViews #extension
+{
+  Children:
+  [
+    Component ButtonAnnualProductionAndSalesReview
+    {
+      #keys: '[414702.1.286513416]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COCKTAIL'
+        Label: '骞村害浜ч攢澶嶇洏'
+        Taborder: 8
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def
new file mode 100644
index 0000000..fb3b421
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component ActionBarPageScenarioComparison #extension
+{
+  Children:
+  [
+    #child: ActionBarGroupScenarioComparisonViews
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
index 05a14f4..3103966 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
@@ -22,7 +22,7 @@
       BaseType: 'WebMenu'
       Properties:
       [
-        Image: 'PIG'
+        Image: 'LEMONADE_GLASS'
         Taborder: 6
         Title: '骞村害浜ч攢澶嶇洏'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def
new file mode 100644
index 0000000..52c5931
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupScenarioComparisonViews/ButtonAnnualProductionAndSalesReview
+Response OnClick () id:Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualProductionAndSalesReview_OnClick
+{
+  #keys: '[414702.1.288075432]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  Precondition:
+  [*
+    
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "骞村害浜ч攢澶嶇洏", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def
deleted file mode 100644
index d927b55..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def
+++ /dev/null
@@ -1,21 +0,0 @@
-Quintiq file version 2.0
-#parent: LibSOPImpExp_ContextMenuImport/MenuImportFromCommonInformationModel
-Response OnClick () id:Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonInformationModel_OnClick
-{
-  #keys: '[146140.2.683371355]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebMenu_OnClick'
-  Precondition:
-  [*
-    return MacroPlan::HasMacroPlan( MacroPlan, feedback );
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      dlg := construct( DialogImportCIM );
-      dlg.New();
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 219db76..c307f2a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -15,6 +15,7 @@
         #child: ActionBarPagePlan
         #child: ActionBarPageInventory
         #child: ActionBarPageScenarioSelection
+        #child: ActionBarPageScenarioComparison
       ]
     }
     Component DataHolderCapacityAndSaleBudgeFilterItem
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
index 687eea6..cfe3fcb 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
@@ -79,5 +79,15 @@
         Taborder: 4
       ]
     }
+    Component dsPlanningStart
+    {
+      #keys: '[414702.1.259278858]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: '璁″垝寮�濮嬫椂闂�'
+        Taborder: 8
+      ]
+    }
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
index d2aa450..fe1ca3b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
@@ -123,6 +123,8 @@
     macroPlanNew.IsKeyProduct( data.IsKeyProduct() );
     macroPlanNew.CreatePurchaseSupplyMaterial( data.CreatePurchaseSupplyMaterial() );
     
+    MacroPlan.UpdateStartOfPlanning( dsPlanningStart.Date().DateTime() );
+    
     this.Close();
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Response_TIANMA_JITUAN_PanelGeneral_549_dsPlanningStart_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Response_TIANMA_JITUAN_PanelGeneral_549_dsPlanningStart_OnCreated.def
new file mode 100644
index 0000000..bb9a6b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Response_TIANMA_JITUAN_PanelGeneral_549_dsPlanningStart_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelGeneral_549/dsPlanningStart
+Response OnCreated () id:Response_TIANMA_JITUAN_PanelGeneral_549_dsPlanningStart_OnCreated
+{
+  #keys: '[414702.1.259420402]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      this.Date( Date::ActualDate() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlActions.def
new file mode 100644
index 0000000..aa8f552
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[412960.0.370310585]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[412960.0.370310589]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[412960.0.370310591]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlContent.def
new file mode 100644
index 0000000..8474857
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Component_pnlContent.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412960.0.370310583]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component editAttributeName
+    {
+      #keys: '[412960.0.370311392]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderGlobalParameters.Data.AttributeName'
+        Label: '鍙傛暟鍚嶇О'
+        Taborder: 1
+      ]
+    }
+    Component editAttributeValue
+    {
+      #keys: '[412960.0.370311429]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderGlobalParameters.Data.AttributeValue'
+        Label: '鍙傛暟鍊�'
+        Taborder: 2
+      ]
+    }
+    Component editAddress
+    {
+      #keys: '[412960.0.370311489]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderGlobalParameters.Data.Address'
+        Label: 'Api鍦板潃'
+        Taborder: 3
+        Visible: false
+      ]
+    }
+    Component editPort
+    {
+      #keys: '[412960.0.370311527]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderGlobalParameters.Data.Port'
+        Label: 'Api绔彛鍙�'
+        Taborder: 4
+        Visible: false
+      ]
+    }
+    Component editPostRequestBody
+    {
+      #keys: '[412960.0.370311577]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderGlobalParameters.Data.PostRequestBody'
+        Label: 'Api璇锋眰涓讳綋'
+        Taborder: 5
+        Visible: false
+      ]
+    }
+    Component IsApi
+    {
+      #keys: '[412960.0.370311617]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Description: '鏄惁涓篈PI鐩稿叧鍙傛暟'
+        Label: 'API閰嶇疆'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_ClickBtnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_ClickBtnOk.def
new file mode 100644
index 0000000..afdf6c4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_ClickBtnOk.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method ClickBtnOk () id:Method_DialogGlobalParameters_ClickBtnOk
+{
+  #keys: '[412960.0.370310978]'
+  Body:
+  [*
+    // Disabled button to prevent the possibility of multiple firing
+    
+    btnOk.Enabled(false,'');
+    
+    // OnOk
+    this.ApplyChanges();
+    
+    DataHolderGlobalParameters.Data().Commit();
+    
+    this.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_Edit.def
new file mode 100644
index 0000000..338ca9c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_Edit.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  GlobalParameters selection
+) id:Method_DialogGlobalParameters_Edit
+{
+  #keys: '[412960.0.370310979]'
+  Body:
+  [*
+    // Edits assumption
+    data := shadow( selection );
+    
+    DataHolderGlobalParameters.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_New.def
new file mode 100644
index 0000000..047b889
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Method_New.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method New (
+  GlobalOTDTable owner
+) id:Method_DialogGlobalParameters_New
+{
+  #keys: '[412960.0.370310981]'
+  Body:
+  [*
+    data := owner.GlobalParameters(relshadow);
+    DataHolderGlobalParameters.Data( &data);
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..ee5b753
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[412960.0.370310595]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..235dbb5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[412960.0.370310594]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ClickBtnOk()
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlContent_IsApi_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlContent_IsApi_OnChanged.def
new file mode 100644
index 0000000..20929e5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/Response_pnlContent_IsApi_OnChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/IsApi
+Response OnChanged () id:Response_pnlContent_IsApi_OnChanged
+{
+  #keys: '[412960.0.370311653]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      editAddress.Visible( this.Checked() );
+      editPort.Visible( this.Checked() );
+      editPostRequestBody.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/_ROOT_Component_DialogGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/_ROOT_Component_DialogGlobalParameters.def
new file mode 100644
index 0000000..a898ae5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogGlobalParameters/_ROOT_Component_DialogGlobalParameters.def
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogGlobalParameters
+{
+  #keys: '[412960.0.370310581]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderGlobalParameters
+    {
+      #keys: '[412960.0.370311111]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[GlobalParameters]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNew_OnClick.def
index f81f38b..7c48b5a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNew_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNew_OnClick.def
@@ -2,7 +2,7 @@
 #parent: ListBusinessType
 Response OnClick () id:Response_ListBusinessType_MenuNew_OnClick
 {
-  #keys: '[414382.0.377975353]'
+  #keys: '[412960.0.373110863]'
   CanBindMultiple: false
   DefinitionID => /ListBusinessType/Responsedef_ListBusinessType_WebMenu_OnClick
   GroupServerCalls: true
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form633/Component_PanelPRDataButton.def b/_Main/UI/MacroPlannerWebApp/Component_Form633/Component_PanelPRDataButton.def
index e0f9eb6..e5b380b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form633/Component_PanelPRDataButton.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form633/Component_PanelPRDataButton.def
@@ -41,6 +41,8 @@
   ]
   Properties:
   [
+    FixedSize: true
+    Orientation: 'horizontal'
     Taborder: 0
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_DataHolderChecked_OnDataChanged\043774.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_DataHolderChecked_OnDataChanged\043774.def"
deleted file mode 100644
index 2e992ec..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_DataHolderChecked_OnDataChanged\043774.def"
+++ /dev/null
@@ -1,18 +0,0 @@
-Quintiq file version 2.0
-#parent: DataHolderChecked_187
-Response OnDataChanged () id:Response_ListPRData_844_DataHolderChecked_OnDataChanged_774
-{
-  #keys: '[414384.0.799231412]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
-  QuillAction
-  {
-    Body:
-    [*
-      //traverse ( this.Data(), Elements, e ) {
-      //  info( "閫変腑鐨勭墿鏂欏彿锛�", e.MatCode() );
-      //}
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged\043613.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged\043613.def"
index 20e3571..b844e5a 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged\043613.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged\043613.def"
@@ -5,13 +5,12 @@
   #keys: '[414384.0.798051611]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      info( "checked 0 PRs" );
       DataHolderChecked.Data().Flush();
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged.def b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged.def
index 5783a47..4988e05 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_ListPRData_844_OnUserCheckedChanged.def
@@ -7,13 +7,12 @@
   #keys: '[414384.0.798051163]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      info( "checked " + [String]checkeditems.Size() + " PRs" );
       DataHolderChecked.Data( checkeditems.Copy() );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_PanelPRDataButton_ButtonExportPR_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_PanelPRDataButton_ButtonExportPR_OnClick.def
index b9d8b6e..d189e36 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_PanelPRDataButton_ButtonExportPR_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form633/Response_PanelPRDataButton_ButtonExportPR_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      Application.Download( "PRData.xlsx", PRData::Export( MacroPlan ) );
+      Application.Download( "PRData.xlsx", PRData::ExportTheFileStream( DataHolderChecked.Data() ).AsBinaryData() );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
index 4af954a..1cb79bb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
@@ -12,7 +12,6 @@
       Properties:
       [
         DataType: 'GlobalOTDTable'
-        FixedFilter: '[Number]object.YearNo() = Date::ActualDate().Year()'
         Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'Global_MappingAnnualBudgetData'
@@ -29,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"YearNo","title":"YearNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"YearNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessType","title":"BusinessType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayTechSort","title":"DisplayTechSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DisplayTechSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessSort","title":"BusinessSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductLineAndSpecification","title":"ProductLineAndSpecification","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductLineAndSpecification"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCodeFromBom","title":"OrgCodeFromBom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCodeFromBom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ResolutionRatio","title":"ResolutionRatio","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ResolutionRatio"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShippingForm","title":"ShippingForm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ShippingForm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CutsNumber","title":"CutsNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CutsNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CapacityEquivalent","title":"CapacityEquivalent","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CapacityEquivalent"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaskNumber","title":"MaskNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaskNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity1","title":"MonthlyModCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity2","title":"MonthlyModCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity3","title":"MonthlyModCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity4","title":"MonthlyModCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity5","title":"MonthlyModCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity6","title":"MonthlyModCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity7","title":"MonthlyModCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity8","title":"MonthlyModCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity9","title":"MonthlyModCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity10","title":"MonthlyModCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity11","title":"MonthlyModCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity12","title":"MonthlyModCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity1","title":"MonthlySheetCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity2","title":"MonthlySheetCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity3","title":"MonthlySheetCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity4","title":"MonthlySheetCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity5","title":"MonthlySheetCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity6","title":"MonthlySheetCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity7","title":"MonthlySheetCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity8","title":"MonthlySheetCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity9","title":"MonthlySheetCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity10","title":"MonthlySheetCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity11","title":"MonthlySheetCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity12","title":"MonthlySheetCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales1","title":"MonthlySales1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales2","title":"MonthlySales2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales3","title":"MonthlySales3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales4","title":"MonthlySales4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales5","title":"MonthlySales5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales6","title":"MonthlySales6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales7","title":"MonthlySales7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales8","title":"MonthlySales8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales9","title":"MonthlySales9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales10","title":"MonthlySales10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales11","title":"MonthlySales11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales12","title":"MonthlySales12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales12"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"YearNo","title":"YearNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"YearNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessType","title":"BusinessType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayTechSort","title":"DisplayTechSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DisplayTechSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessSort","title":"BusinessSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductLineAndSpecification","title":"ProductLineAndSpecification","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductLineAndSpecification"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCodeFromBom","title":"OrgCodeFromBom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCodeFromBom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ResolutionRatio","title":"ResolutionRatio","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ResolutionRatio"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShippingForm","title":"ShippingForm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ShippingForm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CutsNumber","title":"CutsNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CutsNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CapacityEquivalent","title":"CapacityEquivalent","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CapacityEquivalent"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaskNumber","title":"MaskNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaskNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity1","title":"MonthlyModCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity2","title":"MonthlyModCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity3","title":"MonthlyModCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity4","title":"MonthlyModCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity5","title":"MonthlyModCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity6","title":"MonthlyModCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity7","title":"MonthlyModCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity8","title":"MonthlyModCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity9","title":"MonthlyModCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity10","title":"MonthlyModCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity11","title":"MonthlyModCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity12","title":"MonthlyModCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity1","title":"MonthlySheetCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity2","title":"MonthlySheetCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity3","title":"MonthlySheetCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity4","title":"MonthlySheetCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity5","title":"MonthlySheetCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity6","title":"MonthlySheetCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity7","title":"MonthlySheetCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity8","title":"MonthlySheetCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity9","title":"MonthlySheetCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity10","title":"MonthlySheetCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity11","title":"MonthlySheetCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity12","title":"MonthlySheetCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales1","title":"MonthlySales1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales2","title":"MonthlySales2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales3","title":"MonthlySales3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales4","title":"MonthlySales4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales5","title":"MonthlySales5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales6","title":"MonthlySales6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales7","title":"MonthlySales7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales8","title":"MonthlySales8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales9","title":"MonthlySales9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales10","title":"MonthlySales10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales11","title":"MonthlySales11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales12","title":"MonthlySales12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrganCode","title":"OrganCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrganCode"}}]'
         ContextMenu: 'listContextMenuCapacityAndSaleBudge'
         SortCriteria: 'BusinessSort;OrganCode;ProductID'
         Taborder: 2
@@ -38,6 +37,6 @@
   ]
   Properties:
   [
-    Taborder: 2
+    Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def
new file mode 100644
index 0000000..427fcd9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+Component pButton
+{
+  #keys: '[414702.1.268476564]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonGenerateTestData id:ButtonGenerateTestData_136
+    {
+      #keys: '[414702.1.266041306]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ARROW_CIRCLE2'
+        Label: '鍒锋柊绛涢�夋暟鎹�'
+        Taborder: 0
+      ]
+    }
+    Component ButtonExportDetail id:ButtonExportDetail_97
+    {
+      #keys: '[414702.1.266041310]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 2
+      ]
+    }
+    Component ButtonCreateData
+    {
+      #keys: '[414702.1.266042204]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ICE_CREAM'
+        Label: '鐢熸垚鏁版嵁'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def
deleted file mode 100644
index 7b8522f..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def
+++ /dev/null
@@ -1,25 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonGenerateTestData
-Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonGenerateTestData_OnClick
-{
-  #keys: '[414384.0.971540692]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan );
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      GlobalOTDTable.InitTestDataByYear( MacroPlan, DataHolderCapacityAndSaleBudgeFilterYear.Data() );
-      Global_MappingAnnualBudgetData::SetOrgCodeFromForecast( GlobalOTDTable );
-      GlobalOTDSOP::RefreshCapacityAndSaleBudgeFilter( true, GlobalOTDTable, GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterItem::Initial( GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterYear::Initial( GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterMonth::Initial( GlobalOTDSOP );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def
new file mode 100644
index 0000000..55bdd70
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def
@@ -0,0 +1,41 @@
+Quintiq file version 2.0
+#parent: pButton/ButtonCreateData
+Response OnClick () id:Response_pButton_ButtonCreateData_OnClick
+{
+  #keys: '[414702.1.266042218]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := true;
+    
+    flag := GlobalOTDSOP.CapacityAndSaleBudgeFilterYear( relsize ) > 0                     and
+            GlobalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relsize ) > 0             and
+            GlobalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relsize ) > 0;
+    
+    return flag;
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      option := WebMessageBox::Question( "璇烽�夋嫨鏁版嵁婧�", "鏁版嵁婀東娴嬭瘯鏁版嵁|鍙栨秷" );
+      
+      if ( option = 0 ) {
+        WebMessageBox::Error( "鏁版嵁婀栨殏鏃犳暟鎹�", true );
+      } else if ( option = 1 ) {
+        if ( DataHolderCheckedProduct.Data().Size() = 0 ) {
+          WebMessageBox::Error( "璇峰厛鍦ㄥ乏渚у鑸爮閫夋嫨瑕佺敓鎴愭祴璇曟暟鎹殑浜у搧锛�", true );
+        } else {
+          GlobalOTDTable.InitTestDataByYear( MacroPlan, 
+                                             GlobalOTDSOP,
+                                             DataHolderCapacityAndSaleBudgeFilterYear.Data(),
+                                             DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
+                                             DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
+                                             DataHolderCheckedProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
similarity index 85%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
index e09f8c8..faf0bf7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: ButtonExportDetail
-Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportDetail_OnClick
+#parent: pButton/ButtonExportDetail_97
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportDetail_OnClick_971
 {
-  #keys: '[414384.0.887310502]'
+  #keys: '[414702.1.266041309]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def"
new file mode 100644
index 0000000..6af89c3
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def"
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: pButton/ButtonGenerateTestData_136
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonGenerateTestData_OnClick_19
+{
+  #keys: '[414702.1.266041305]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and not isnull( GlobalOTDSOP ) and not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      CapacityAndSaleBudgeFilterItem::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterYear::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterMonth::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterBusinessType::InitializedData( GlobalOTDSOP, GlobalOTDTable );
+      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::InitializedData( GlobalOTDSOP, GlobalOTDTable );
+      
+      GlobalOTDTable.Global_MappingAnnualBudgetData( relflush );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
index 7c799db..95e899e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
@@ -8,28 +8,7 @@
   Children:
   [
     #child: ListCapacityAndSaleBudge
-    Component ButtonExportDetail
-    {
-      #keys: '[414384.0.887310503]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: '瀵煎嚭'
-        Taborder: 1
-      ]
-    }
-    Component ButtonGenerateTestData
-    {
-      #keys: '[414384.0.971540693]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'IMPORT1'
-        Label: '鏍规嵁绛涢�夊勾浠界敓鎴愭祴璇曟暟鎹�'
-        Taborder: 0
-      ]
-    }
+    #child: pButton
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
index 8c71c5c..f3f605d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
@@ -80,6 +80,6 @@
   Properties:
   [
     ContextMenu: 'chartContextMenuCapacityAndSaleBudge'
-    Taborder: 7
+    Taborder: 4
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def
new file mode 100644
index 0000000..4ab0d20
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+Component pFilterCriteria
+{
+  #keys: '[414702.1.277336951]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownByBusinessTypeOrByOrgCode id:DropDownByBusinessTypeOrByOrgCode_549
+    {
+      #keys: '[414702.1.277808126]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鏍规嵁闈㈡澘鍩哄湴/浜嬩笟閮ㄥ垎缁�'
+        Strings: '闈㈡澘鍩哄湴;浜嬩笟閮�'
+        Taborder: 1
+      ]
+    }
+    Component DropDownTimeGroup id:DropDownTimeGroup_593
+    {
+      #keys: '[414702.1.277808195]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鏃堕棿鍒嗙粍'
+        Strings: '鏈�;瀛e害;鍗婂勾;骞�'
+        Taborder: 2
+      ]
+    }
+    Component DropDownSaleOrCapacity id:DropDownSaleOrCapacity_715
+    {
+      #keys: '[414702.1.277808264]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '浜ц兘/閿�鍞'
+        Strings: '浜ц兘;閿�鍞'
+        Taborder: 3
+      ]
+    }
+    Component ButtonCapacityAndSaleBudgeChartTest id:ButtonCapacityAndSaleBudgeChartTest_844
+    {
+      #keys: '[414702.1.277808330]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'PRESENTATION_CHART'
+        Label: '鐢熸垚鍥捐〃'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
similarity index 86%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
index cbd7ff2..761a489 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
@@ -1,11 +1,10 @@
 Quintiq file version 2.0
-#parent: ButtonCapacityAndSaleBudgeChartTest
-Response OnClick () id:Response_FormCapacityAndSaleBudgeChart_ButtonCapacityAndSaleBudgeChartTest_OnClick
+#parent: pFilterCriteria/ButtonCapacityAndSaleBudgeChartTest_844
+Response OnClick () id:Response_FormCapacityAndSaleBudgeChart_ButtonCapacityAndSaleBudgeChartTest_OnClick_603
 {
-  #keys: '[414384.0.857443403]'
+  #keys: '[414702.1.277808329]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
@@ -22,5 +21,6 @@
                                               DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
                                               GlobalOTDTable );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
index 237e0c6..56d70aa 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
@@ -8,16 +8,6 @@
   Children:
   [
     #child: ChartCapacityAndSaleBudgeChart
-    Component ButtonCapacityAndSaleBudgeChartTest
-    {
-      #keys: '[414384.0.857443217]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '鐢熸垚'
-        Taborder: 6
-      ]
-    }
     Component DropDownYears
     {
       #keys: '[414384.0.857740648]'
@@ -25,7 +15,7 @@
       Properties:
       [
         Label: '骞翠唤'
-        Taborder: 2
+        Taborder: 0
         Visible: false
       ]
     }
@@ -37,7 +27,7 @@
       [
         AllowEmpty: true
         Label: '浜嬩笟閮�'
-        Taborder: 3
+        Taborder: 1
         Visible: false
       ]
     }
@@ -49,46 +39,11 @@
       [
         AllowEmpty: true
         Label: '闈㈡澘鍩哄湴'
-        Taborder: 4
+        Taborder: 2
         Visible: false
       ]
     }
-    Component DropDownTimeGroup
-    {
-      #keys: '[414384.0.857771238]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '鏈�'
-        Label: '鏃堕棿鍒嗙粍'
-        Strings: '鏈�;瀛e害;鍗婂勾;骞�'
-        Taborder: 1
-      ]
-    }
-    Component DropDownByBusinessTypeOrByOrgCode
-    {
-      #keys: '[414384.0.857702904]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '浜嬩笟閮�'
-        Label: '鏍规嵁闈㈡澘鍩哄湴/浜嬩笟閮ㄥ垎缁�'
-        Strings: '闈㈡澘鍩哄湴;浜嬩笟閮�'
-        Taborder: 0
-      ]
-    }
-    Component DropDownSaleOrCapacity
-    {
-      #keys: '[414384.0.886240556]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '閿�鍞'
-        Label: '閿�鍞/浜ц兘'
-        Strings: '閿�鍞;浜ц兘'
-        Taborder: 5
-      ]
-    }
+    #child: pFilterCriteria
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
index d59a144..2666de7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
@@ -93,6 +93,6 @@
     ContextMenu: 'matrixeditorContextMenuCapacityAndSaleBudgeCompare'
     Editable: false
     Rows: 'MatrixEditorRowsCapacityAndSaleBudgeCompare'
-    Taborder: 2
+    Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def
new file mode 100644
index 0000000..52b3f21
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component pButton
+{
+  #keys: '[414702.1.272379026]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonCapacityAndSaleBudgeCompare id:ButtonCapacityAndSaleBudgeCompare_956
+    {
+      #keys: '[414702.1.272313474]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COCKTAIL'
+        Label: '鍒锋柊'
+        Taborder: 0
+      ]
+    }
+    Component ButtonExportCompare id:ButtonExportCompare_364
+    {
+      #keys: '[414702.1.269961255]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
similarity index 61%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
index 7f559d2..a683e63 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
@@ -1,24 +1,20 @@
 Quintiq file version 2.0
-#parent: ButtonCapacityAndSaleBudgeCompare
-Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonCapacityAndSaleBudgeCompare_OnClick
+#parent: pButton/ButtonCapacityAndSaleBudgeCompare_956
+Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonCapacityAndSaleBudgeCompare_OnClick_231
 {
-  #keys: '[414384.0.818241703]'
+  #keys: '[414702.1.272313473]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      info( DataHolderMacroPlansForScenarioComparison.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterItem.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterYear.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterMonth.Data().Size() );
       GlobalOTDSOP.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
                                                 GlobalOTDTable );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
similarity index 80%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
index f98be27..1dbc159 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: ButtonExportCompare
-Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonExportCompare_OnClick
+#parent: pButton/ButtonExportCompare_364
+Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonExportCompare_OnClick_325
 {
-  #keys: '[414384.0.881345276]'
+  #keys: '[414702.1.269961254]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
index d44643f..d5e9525 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
@@ -8,27 +8,7 @@
   Children:
   [
     #child: MatrixEditorCapacityAndSaleBudgeCompare
-    Component ButtonCapacityAndSaleBudgeCompare
-    {
-      #keys: '[414384.0.818241675]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '鍒锋柊'
-        Taborder: 0
-      ]
-    }
-    Component ButtonExportCompare
-    {
-      #keys: '[414384.0.881345277]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: '瀵煎嚭'
-        Taborder: 1
-      ]
-    }
+    #child: pButton
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
index f254f69..9e21db8 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
@@ -5,12 +5,12 @@
   #keys: '[414384.0.875704514]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      DataHolderCapacityAndSaleBudgeFilterYear.Data().Flush();
+      DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data().Flush();
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
index 5d9bdf7..86b3523 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
@@ -1,18 +1,18 @@
 Quintiq file version 2.0
 #parent: ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray
 Response OnUserCheckedChanged (
-  structured[CapacityAndSaleBudgeFilterYear] checkeditems
+  structured[CapacityAndSaleBudgeFilterPlaceOfProductionOfArray] checkeditems
 ) id:Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCheckedChanged
 {
   #keys: '[414384.0.875704513]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      DataHolderCapacityAndSaleBudgeFilterYear.Data( checkeditems.Copy() );
+      DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data( checkeditems.Copy() );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_ListGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_ListGlobalParameters.def
new file mode 100644
index 0000000..18364b4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_ListGlobalParameters.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component ListGlobalParameters
+{
+  #keys: '[412960.0.370311764]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorGlobalParameters
+    {
+      #keys: '[412960.0.370311765]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
+        Taborder: 0
+        Transformation: 'GlobalParameters'
+      ]
+    }
+    #child: listActionBarPageGlobalParameters
+    Component DataSetLevelGlobalParameters
+    {
+      #keys: '[412960.0.370311770]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuGlobalParameters
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AttributeName","title":"AttributeName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AttributeName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AttributeValue","title":"AttributeValue","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AttributeValue"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Address","title":"Address","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Address"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Port","title":"Port","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Port"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PostRequestBody","title":"PostRequestBody","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PostRequestBody"}}]'
+        ContextMenu: 'listContextMenuGlobalParameters'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListGlobalParameters_WebMenu_OnClick
+    {
+      #keys: '[412960.0.373111120]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[693.0.13162755]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_PanelGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_PanelGlobalParameters.def
new file mode 100644
index 0000000..dd6186c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_PanelGlobalParameters.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelGlobalParameters
+{
+  #keys: '[412960.0.370311750]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListGlobalParameters
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listActionBarPageGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listActionBarPageGlobalParameters.def
new file mode 100644
index 0000000..5d480f6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listActionBarPageGlobalParameters.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageGlobalParameters
+{
+  #keys: '[412960.0.370311767]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listContextMenuGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listContextMenuGlobalParameters.def
new file mode 100644
index 0000000..e031569
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Component_listContextMenuGlobalParameters.def
@@ -0,0 +1,57 @@
+Quintiq file version 2.0
+Component listContextMenuGlobalParameters
+{
+  #keys: '[412960.0.370311772]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuNew id:MenuNew_21
+    {
+      #keys: '[412960.0.370312224]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 3
+        Title: 'New'
+      ]
+    }
+    Component MenuEdit id:MenuEdit_368
+    {
+      #keys: '[412960.0.370312277]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'PENCIL'
+        Taborder: 4
+        Title: 'Edit'
+      ]
+    }
+    Component MenuDelete id:MenuDelete_832
+    {
+      #keys: '[412960.0.370312355]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 5
+        Title: 'Delete'
+      ]
+    }
+    Component MenuInitial
+    {
+      #keys: '[412960.0.376011203]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ARROW_LOOP3'
+        Taborder: 6
+        Title: 'Init Api'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuDelete_OnClick.def
new file mode 100644
index 0000000..f68b43c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListGlobalParameters
+Response OnClick (
+  GlobalParameters selection
+) id:Response_ListGlobalParameters_MenuDelete_OnClick
+{
+  #keys: '[412960.0.373113087]'
+  CanBindMultiple: false
+  DefinitionID => /ListGlobalParameters/Responsedef_ListGlobalParameters_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuEdit_OnClick.def
new file mode 100644
index 0000000..6094065
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuEdit_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListGlobalParameters
+Response OnClick (
+  GlobalParameters selection
+) id:Response_ListGlobalParameters_MenuEdit_OnClick
+{
+  #keys: '[412960.0.373112994]'
+  CanBindMultiple: false
+  DefinitionID => /ListGlobalParameters/Responsedef_ListGlobalParameters_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogGlobalParameters );
+      dlg.Edit( selection );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuNew_OnClick.def
new file mode 100644
index 0000000..a222fe1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_ListGlobalParameters_MenuNew_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListGlobalParameters
+Response OnClick () id:Response_ListGlobalParameters_MenuNew_OnClick
+{
+  #keys: '[412960.0.373111139]'
+  CanBindMultiple: false
+  DefinitionID => /ListGlobalParameters/Responsedef_ListGlobalParameters_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuNew'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogGlobalParameters );
+      dlg.New( GlobalOTDTable );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_listContextMenuGlobalParameters_MenuInitial_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_listContextMenuGlobalParameters_MenuInitial_OnClick.def
new file mode 100644
index 0000000..c2c4dd2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/Response_listContextMenuGlobalParameters_MenuInitial_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: listContextMenuGlobalParameters/MenuInitial
+Response OnClick () id:Response_listContextMenuGlobalParameters_MenuInitial_OnClick
+{
+  #keys: '[412960.0.376011242]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      GlobalParameters::TestForApiRequest( GlobalOTDTable );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/_ROOT_Component_FormGlobalParameters.def b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/_ROOT_Component_FormGlobalParameters.def
new file mode 100644
index 0000000..a193e5c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormGlobalParameters/_ROOT_Component_FormGlobalParameters.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormGlobalParameters
+{
+  #keys: '[412960.0.367611841]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelGlobalParameters
+  ]
+  Properties:
+  [
+    Description: '瀛樻斁鍚勭被鍏ㄥ眬鍙傛暟锛岀洰鍓嶄粎鍖呭惈API鐩稿叧'
+    Image: 'EARTH2'
+    Title: 'Global Parameters'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw b/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
deleted file mode 100644
index 901e27f..0000000
--- a/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-{
-  viewcontents
-  {
-    image: 'CHART_HI_LO'
-    page: 'ActionBarPageScenarioComparison'
-    group: ''
-    index: 0
-    description: ''
-  }
-  formatversion: 2
-  id: 'Capacity___sale_budge'
-  name: 'Capacity & sale budge'
-  isglobal: false
-  isroot: true
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/PR_DATA.vw b/_Main/UI/MacroPlannerWebApp/Views/PR_DATA.vw
new file mode 100644
index 0000000..8a1455b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/PR_DATA.vw
@@ -0,0 +1,204 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormPRHistoryData
+      {
+        title: 'QTIANMA_JITUAN::FormPRHistoryData'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPRHistoryData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 5
+          columnSpan: 8
+        }
+        components
+        {
+          FormPRHistoryData_PanelPRHistoryButton
+          {
+            sizeRatio: 1
+          }
+          FormPRHistoryData_ListPRHistoryData
+          {
+          }
+          FormPRHistoryData_DataSetLevelPRHistoryData
+          {
+            groupDepth: -1
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_MRPCalverNo
+            {
+              columnId: 'MRPCalverNo'
+              dataPath: 'MRPCalverNo'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_OrganCode
+            {
+              columnId: 'OrganCode'
+              dataPath: 'OrganCode'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_SendStatus
+            {
+              columnId: 'SendStatus'
+              dataPath: 'SendStatus'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_ReleaseBy
+            {
+              columnId: 'ReleaseBy'
+              dataPath: 'ReleaseBy'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_ReceiveStatus
+            {
+              columnId: 'ReceiveStatus'
+              dataPath: 'ReceiveStatus'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_ReceiveError
+            {
+              columnId: 'ReceiveError'
+              dataPath: 'ReceiveError'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPRData
+      {
+        title: 'QTIANMA_JITUAN::FormPRData'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPRData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormPRData_PanelPRDataButton
+          {
+            sizeRatio: 1
+          }
+          FormPRData_ListPRData
+          {
+          }
+          FormPRData_DataSetLevelPRData
+          {
+            groupDepth: -1
+            column_MRPCalverNo
+            {
+              columnId: 'MRPCalverNo'
+              dataPath: 'MRPCalverNo'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: 'ActionBarPageData'
+    group: ''
+    index: 0
+    image: 'BEAR'
+    description: 'PR鐢宠'
+  }
+  formatversion: 2
+  id: 'PR_DATA'
+  name: 'PR_DATA'
+  isglobal: false
+  isroot: true
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\345\205\250\345\261\200\345\217\202\346\225\260.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\345\205\250\345\261\200\345\217\202\346\225\260.vw"
new file mode 100644
index 0000000..3e9b9c2
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\345\205\250\345\261\200\345\217\202\346\225\260.vw"
@@ -0,0 +1,351 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_legacy_1
+      {
+        title: 'Scenario manager'
+        shown: true
+        componentID: 'FormScenarioManager'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 5
+        }
+        components
+        {
+          FormScenarioManager_ListScenario
+          {
+          }
+          FormScenarioManager_DataSetLevelScenario
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 90
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 277
+            }
+            column_ChangedBy
+            {
+              columnId: 'ChangedBy'
+              dataPath: 'ChangedBy'
+              dataType: 'string'
+              title: 'Changed by'
+              index: 2
+              subtotals: ''
+              width: 106
+            }
+            column_ChangedOn
+            {
+              columnId: 'ChangedOn'
+              dataPath: 'ChangedOn'
+              dataType: 'datetime'
+              title: 'Changed on'
+              index: 3
+              subtotals: ''
+              width: 99
+            }
+            column_StorageMode
+            {
+              columnId: 'StorageMode'
+              dataPath: 'StorageMode'
+              dataType: 'string'
+              title: 'StorageMode'
+              index: 4
+              subtotals: ''
+              width: 40
+            }
+          }
+        }
+      }
+      form_legacy_2
+      {
+        title: 'Assumptions'
+        shown: true
+        componentID: 'FormAssumptions'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 9
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 5
+        }
+        components
+        {
+          FormAssumptions_ListAssumptions
+          {
+          }
+          FormAssumptions_DataSetLevelAssumptions
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              title: '绫诲埆'
+              index: 1
+              subtotals: ''
+              width: 108
+            }
+            column_Importance
+            {
+              columnId: 'Importance'
+              dataPath: 'Importance'
+              dataType: 'string'
+              title: '閲嶈鎬�'
+              index: 2
+              subtotals: ''
+              width: 110
+            }
+            column_Title
+            {
+              columnId: 'Title'
+              dataPath: 'Title'
+              dataType: 'string'
+              title: '鏍囬'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_ChangedBy
+            {
+              columnId: 'ChangedBy'
+              dataPath: 'ChangedBy'
+              dataType: 'string'
+              title: 'Changed by'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_CreatedOn
+            {
+              columnId: 'CreatedOn'
+              dataPath: 'CreatedOn'
+              dataType: 'datetime'
+              title: 'Created on'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormScenariosKPIsComparison
+      {
+        title: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        shown: true
+        componentID: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 16
+          columnPosition: 6
+          columnSpan: 7
+        }
+        components
+        {
+          FormScenariosKPIsComparison_MatrixEditorFinancialKPIs
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison.MatrixEditorFinancialKPIs'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_DisplayValue
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DisplayValue'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: ''
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'KPISetting.DisplayIndex'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: 'applicationDevelopmentActionBarPageDef'
+    group: ''
+    index: 4
+    image: 'EARTH2'
+    description: ''
+  }
+  formatversion: 2
+  id: '鍏ㄥ眬鍙傛暟'
+  name: '鍏ㄥ眬鍙傛暟'
+  isglobal: false
+  isroot: true
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
index 64db9ed..0516c1b 100644
--- "a/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
@@ -12,495 +12,59 @@
         layout
         {
           mode: 'open'
-          rowPosition: 1
-          rowSpan: 4
+          rowPosition: 6
+          rowSpan: 8
           columnPosition: 1
-          columnSpan: 2
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudge_pButton
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudge_ListCapacityAndSaleBudge
           {
           }
           FormCapacityAndSaleBudge_DataSetLevelCapacityAndSaleBudge
           {
             groupDepth: -1
-            column_Deleted
-            {
-              columnId: 'Deleted'
-              dataPath: 'Deleted'
-              dataType: 'boolean'
-              index: 0
-              subtotals: ''
-              width: 150
-            }
-            column_YearNo
-            {
-              columnId: 'YearNo'
-              dataPath: 'YearNo'
-              dataType: 'number'
-              index: 1
-              subtotals: ''
-              width: 150
-            }
-            column_OrgCode
-            {
-              columnId: 'OrgCode'
-              dataPath: 'OrgCode'
-              dataType: 'string'
-              index: 2
-              subtotals: ''
-              width: 150
-            }
-            column_DisplayTechnology
-            {
-              columnId: 'DisplayTechnology'
-              dataPath: 'DisplayTechnology'
-              dataType: 'string'
-              index: 3
-              subtotals: ''
-              width: 150
-            }
+            sort: 'YearNo,ProductID'
             column_BusinessType
             {
               columnId: 'BusinessType'
               dataPath: 'BusinessType'
               dataType: 'string'
-              index: 4
+              index: 0
               subtotals: ''
-              width: 150
+              width: 107
             }
-            column_LineAndSpecification
+            column_ProductID
             {
-              columnId: 'LineAndSpecification'
-              dataPath: 'LineAndSpecification'
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
               dataType: 'string'
-              index: 5
+              index: 1
               subtotals: ''
-              width: 150
+              width: 178
             }
-            column_ProductCode
+            column_OrganCode
             {
-              columnId: 'ProductCode'
-              dataPath: 'ProductCode'
+              columnId: 'OrganCode'
+              dataPath: 'OrganCode'
               dataType: 'string'
-              index: 6
+              index: 2
               subtotals: ''
-              width: 150
+              width: 98
             }
-            column_PlaceOfProductionOfArray
+            column_YearNo
             {
-              columnId: 'PlaceOfProductionOfArray'
-              dataPath: 'PlaceOfProductionOfArray'
+              columnId: 'YearNo'
+              dataPath: 'YearNo'
               dataType: 'string'
-              index: 7
+              index: 3
               subtotals: ''
-              width: 150
-            }
-            column_PlaceOfProductionOfEvaporation
-            {
-              columnId: 'PlaceOfProductionOfEvaporation'
-              dataPath: 'PlaceOfProductionOfEvaporation'
-              dataType: 'string'
-              index: 8
-              subtotals: ''
-              width: 150
-            }
-            column_Resolution
-            {
-              columnId: 'Resolution'
-              dataPath: 'Resolution'
-              dataType: 'string'
-              index: 9
-              subtotals: ''
-              width: 150
-            }
-            column_ShippingForm
-            {
-              columnId: 'ShippingForm'
-              dataPath: 'ShippingForm'
-              dataType: 'string'
-              index: 10
-              subtotals: ''
-              width: 150
-            }
-            column_NumberOfCut
-            {
-              columnId: 'NumberOfCut'
-              dataPath: 'NumberOfCut'
-              dataType: 'string'
-              index: 11
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityEquivalent
-            {
-              columnId: 'CapacityEquivalent'
-              dataPath: 'CapacityEquivalent'
-              dataType: 'string'
-              index: 12
-              subtotals: ''
-              width: 150
-            }
-            column_NumberOfMask
-            {
-              columnId: 'NumberOfMask'
-              dataPath: 'NumberOfMask'
-              dataType: 'string'
-              index: 13
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth1
-            {
-              columnId: 'CapacityInPCSInMonth1'
-              dataPath: 'CapacityInPCSInMonth1'
-              dataType: 'real'
-              index: 14
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth2
-            {
-              columnId: 'CapacityInPCSInMonth2'
-              dataPath: 'CapacityInPCSInMonth2'
-              dataType: 'real'
-              index: 15
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth3
-            {
-              columnId: 'CapacityInPCSInMonth3'
-              dataPath: 'CapacityInPCSInMonth3'
-              dataType: 'real'
-              index: 16
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth4
-            {
-              columnId: 'CapacityInPCSInMonth4'
-              dataPath: 'CapacityInPCSInMonth4'
-              dataType: 'real'
-              index: 17
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth5
-            {
-              columnId: 'CapacityInPCSInMonth5'
-              dataPath: 'CapacityInPCSInMonth5'
-              dataType: 'real'
-              index: 18
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth6
-            {
-              columnId: 'CapacityInPCSInMonth6'
-              dataPath: 'CapacityInPCSInMonth6'
-              dataType: 'real'
-              index: 19
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth7
-            {
-              columnId: 'CapacityInPCSInMonth7'
-              dataPath: 'CapacityInPCSInMonth7'
-              dataType: 'real'
-              index: 20
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth8
-            {
-              columnId: 'CapacityInPCSInMonth8'
-              dataPath: 'CapacityInPCSInMonth8'
-              dataType: 'real'
-              index: 21
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth9
-            {
-              columnId: 'CapacityInPCSInMonth9'
-              dataPath: 'CapacityInPCSInMonth9'
-              dataType: 'real'
-              index: 22
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth10
-            {
-              columnId: 'CapacityInPCSInMonth10'
-              dataPath: 'CapacityInPCSInMonth10'
-              dataType: 'real'
-              index: 23
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth11
-            {
-              columnId: 'CapacityInPCSInMonth11'
-              dataPath: 'CapacityInPCSInMonth11'
-              dataType: 'real'
-              index: 24
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth12
-            {
-              columnId: 'CapacityInPCSInMonth12'
-              dataPath: 'CapacityInPCSInMonth12'
-              dataType: 'real'
-              index: 25
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSTotal
-            {
-              columnId: 'CapacityInPCSTotal'
-              dataPath: 'CapacityInPCSTotal'
-              dataType: 'real'
-              index: 26
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth1
-            {
-              columnId: 'CapacityInSheetInMonth1'
-              dataPath: 'CapacityInSheetInMonth1'
-              dataType: 'real'
-              index: 27
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth2
-            {
-              columnId: 'CapacityInSheetInMonth2'
-              dataPath: 'CapacityInSheetInMonth2'
-              dataType: 'real'
-              index: 28
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth3
-            {
-              columnId: 'CapacityInSheetInMonth3'
-              dataPath: 'CapacityInSheetInMonth3'
-              dataType: 'real'
-              index: 29
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth4
-            {
-              columnId: 'CapacityInSheetInMonth4'
-              dataPath: 'CapacityInSheetInMonth4'
-              dataType: 'real'
-              index: 30
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth5
-            {
-              columnId: 'CapacityInSheetInMonth5'
-              dataPath: 'CapacityInSheetInMonth5'
-              dataType: 'real'
-              index: 31
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth6
-            {
-              columnId: 'CapacityInSheetInMonth6'
-              dataPath: 'CapacityInSheetInMonth6'
-              dataType: 'real'
-              index: 32
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth7
-            {
-              columnId: 'CapacityInSheetInMonth7'
-              dataPath: 'CapacityInSheetInMonth7'
-              dataType: 'real'
-              index: 33
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth8
-            {
-              columnId: 'CapacityInSheetInMonth8'
-              dataPath: 'CapacityInSheetInMonth8'
-              dataType: 'real'
-              index: 34
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth9
-            {
-              columnId: 'CapacityInSheetInMonth9'
-              dataPath: 'CapacityInSheetInMonth9'
-              dataType: 'real'
-              index: 35
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth10
-            {
-              columnId: 'CapacityInSheetInMonth10'
-              dataPath: 'CapacityInSheetInMonth10'
-              dataType: 'real'
-              index: 36
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth11
-            {
-              columnId: 'CapacityInSheetInMonth11'
-              dataPath: 'CapacityInSheetInMonth11'
-              dataType: 'real'
-              index: 37
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth12
-            {
-              columnId: 'CapacityInSheetInMonth12'
-              dataPath: 'CapacityInSheetInMonth12'
-              dataType: 'real'
-              index: 38
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetTotal
-            {
-              columnId: 'CapacityInSheetTotal'
-              dataPath: 'CapacityInSheetTotal'
-              dataType: 'real'
-              index: 39
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth1
-            {
-              columnId: 'SaleAmountInMonth1'
-              dataPath: 'SaleAmountInMonth1'
-              dataType: 'real'
-              index: 40
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth2
-            {
-              columnId: 'SaleAmountInMonth2'
-              dataPath: 'SaleAmountInMonth2'
-              dataType: 'real'
-              index: 41
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth3
-            {
-              columnId: 'SaleAmountInMonth3'
-              dataPath: 'SaleAmountInMonth3'
-              dataType: 'real'
-              index: 42
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth5
-            {
-              columnId: 'SaleAmountInMonth5'
-              dataPath: 'SaleAmountInMonth5'
-              dataType: 'real'
-              index: 43
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth4
-            {
-              columnId: 'SaleAmountInMonth4'
-              dataPath: 'SaleAmountInMonth4'
-              dataType: 'real'
-              index: 44
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth6
-            {
-              columnId: 'SaleAmountInMonth6'
-              dataPath: 'SaleAmountInMonth6'
-              dataType: 'real'
-              index: 45
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth7
-            {
-              columnId: 'SaleAmountInMonth7'
-              dataPath: 'SaleAmountInMonth7'
-              dataType: 'real'
-              index: 46
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth8
-            {
-              columnId: 'SaleAmountInMonth8'
-              dataPath: 'SaleAmountInMonth8'
-              dataType: 'real'
-              index: 47
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth9
-            {
-              columnId: 'SaleAmountInMonth9'
-              dataPath: 'SaleAmountInMonth9'
-              dataType: 'real'
-              index: 48
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth10
-            {
-              columnId: 'SaleAmountInMonth10'
-              dataPath: 'SaleAmountInMonth10'
-              dataType: 'real'
-              index: 49
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth11
-            {
-              columnId: 'SaleAmountInMonth11'
-              dataPath: 'SaleAmountInMonth11'
-              dataType: 'real'
-              index: 50
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth12
-            {
-              columnId: 'SaleAmountInMonth12'
-              dataPath: 'SaleAmountInMonth12'
-              dataType: 'real'
-              index: 51
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountTotal
-            {
-              columnId: 'SaleAmountTotal'
-              dataPath: 'SaleAmountTotal'
-              dataType: 'real'
-              index: 52
-              subtotals: ''
-              width: 150
+              width: 84
             }
           }
         }
@@ -513,20 +77,24 @@
         layout
         {
           mode: 'open'
-          rowPosition: 5
-          rowSpan: 10
-          columnPosition: 5
-          columnSpan: 8
+          rowPosition: 14
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudgeCompare_pButton
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudgeCompare_MatrixEditorCapacityAndSaleBudgeCompare
           {
             gridColor: '#c4c4c4'
-            totalHeaderWidth: 200
+            totalHeaderWidth: 67
             attributeHeaderWidthRatio: 0.6
             nameHeaderWidthRatio: 0.4
-            columnWidth: 100
+            columnWidth: 264
             horizontalGrid: true
             verticalGrid: true
             backendState
@@ -576,7 +144,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
+          rowSpan: 5
           columnPosition: 3
           columnSpan: 2
         }
@@ -588,6 +156,7 @@
           FormCapacityAndSaleBudgeFilterItem_DataSetLevelCapacityAndSaleBudgeFilterItem
           {
             groupDepth: -1
+            sort: 'ItemName'
             column_ItemName
             {
               columnId: 'ItemName'
@@ -608,13 +177,17 @@
         layout
         {
           mode: 'open'
-          rowPosition: 5
-          rowSpan: 11
+          rowPosition: 22
+          rowSpan: 13
           columnPosition: 1
-          columnSpan: 4
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudgeChart_pFilterCriteria
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudgeChart_ChartCapacityAndSaleBudgeChart
           {
             SynchronizationGroup: ''
@@ -636,7 +209,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
+          rowSpan: 5
           columnPosition: 5
           columnSpan: 2
         }
@@ -669,8 +242,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 7
+          rowSpan: 5
+          columnPosition: 9
           columnSpan: 2
         }
         components
@@ -702,8 +275,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 11
+          rowSpan: 5
+          columnPosition: 7
           columnSpan: 2
         }
         components
@@ -735,8 +308,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 9
+          rowSpan: 5
+          columnPosition: 11
           columnSpan: 2
         }
         components
@@ -759,6 +332,39 @@
           }
         }
       }
+      form_FormScenarioManager
+      {
+        title: 'QLibMacroPlannerWebUI::FormScenarioManager'
+        shown: true
+        componentID: 'QLibMacroPlannerWebUI::FormScenarioManager'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 5
+          columnPosition: 1
+          columnSpan: 2
+        }
+        components
+        {
+          FormScenarioManager_ListScenario
+          {
+          }
+          FormScenarioManager_DataSetLevelScenario
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 240
+            }
+          }
+        }
+      }
     }
     userconfigurableinformation
     {
diff --git a/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp b/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
index cb94597..b4cfb85 100644
--- a/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
+++ b/_Main/UI/MacroPlannerWebApp/_ROOT_Project_MacroPlannerWebApp.qp
@@ -5,7 +5,7 @@
   ProjectProperties
   {
     ApplicationComponentName: 'ApplicationMacroPlanner'
-    BuildVersion: '2022.3.0.32'
+    BuildVersion: '2022.3.0.34'
     Description: 'Quintiq Macro Planner'
     ProjectKind: 'WebClient'
   }
diff --git a/_var/_Main/ModelSettings/Common/Dev-23/_ROOT_Role_Dev-23.properties b/_var/_Main/ModelSettings/Common/Dev-23/_ROOT_Role_Dev-23.properties
index fff5930..67e69c8 100644
--- a/_var/_Main/ModelSettings/Common/Dev-23/_ROOT_Role_Dev-23.properties
+++ b/_var/_Main/ModelSettings/Common/Dev-23/_ROOT_Role_Dev-23.properties
@@ -6,6 +6,10 @@
 _self.configsettype=Role
 _self.description=OTD涓撴樉 闈炴樉 鐗规樉
 _self.name=Dev-23
+arg=template:serverargs
+arg.architectdependencies=
+arg.custom=""
+arg.versioncontrolmode=true
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination=template:domainmodel.ediremotedatasourcedefinition
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.connection=
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.parameters=
@@ -451,16 +455,56 @@
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sendingcontentcharset=UTF-8
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sockettimeout=0
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.trustmanagername=Q3DSpace
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.outboundrequesttimeout=60
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.connectiongroupname=SERVER
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.integratorid=Q3DSpace
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.enablehttpmessagelogging=true
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.maxconnections=10
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.portnumber=8080
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sockettimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.enablehttpmessagelogging=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.maxconnections=10
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.portnumber=8080
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sockettimeout=0
 domainmodel.mdsstoragedefinitionmanager=template:domainmodel.mdsstoragedefinitionmanager
 domainmodel.mdsstoragedefinitionmanager.audittrailenabled=false
 domainmodel.mdsstoragedefinitionmanager.audittraillocation=
 domainmodel.mdsstoragedefinitionmanager.databaseenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoredatasource=MacroPlanner
-domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=true
+domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoreislocal=false
 domainmodel.mdsstoragedefinitionmanager.dbformat=Legacy
 domainmodel.mdsstoragedefinitionmanager.defaultencryptioncertificate=
diff --git a/_var/_Main/ModelSettings/Common/Dev-25/_ROOT_Role_Dev-25.properties b/_var/_Main/ModelSettings/Common/Dev-25/_ROOT_Role_Dev-25.properties
index f3a0cf5..1dfd972 100644
--- a/_var/_Main/ModelSettings/Common/Dev-25/_ROOT_Role_Dev-25.properties
+++ b/_var/_Main/ModelSettings/Common/Dev-25/_ROOT_Role_Dev-25.properties
@@ -6,6 +6,10 @@
 _self.configsettype=Role
 _self.description=OTD姹借溅鐢靛瓙 澶╁崕
 _self.name=Dev-25
+arg=template:serverargs
+arg.architectdependencies=
+arg.custom=""
+arg.versioncontrolmode=true
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination=template:domainmodel.ediremotedatasourcedefinition
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.connection=
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.parameters=
@@ -451,16 +455,56 @@
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sendingcontentcharset=UTF-8
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sockettimeout=0
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.trustmanagername=Q3DSpace
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.outboundrequesttimeout=60
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.connectiongroupname=SERVER
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.integratorid=Q3DSpace
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.enablehttpmessagelogging=true
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.maxconnections=10
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.portnumber=8080
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sockettimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.enablehttpmessagelogging=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.maxconnections=10
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.portnumber=8080
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sockettimeout=0
 domainmodel.mdsstoragedefinitionmanager=template:domainmodel.mdsstoragedefinitionmanager
 domainmodel.mdsstoragedefinitionmanager.audittrailenabled=false
 domainmodel.mdsstoragedefinitionmanager.audittraillocation=
 domainmodel.mdsstoragedefinitionmanager.databaseenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoredatasource=MacroPlanner
-domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=true
+domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoreislocal=false
 domainmodel.mdsstoragedefinitionmanager.dbformat=Legacy
 domainmodel.mdsstoragedefinitionmanager.defaultencryptioncertificate=
diff --git a/_var/_Main/ModelSettings/Common/Dev-27/_ROOT_Role_Dev-27.properties b/_var/_Main/ModelSettings/Common/Dev-27/_ROOT_Role_Dev-27.properties
index 3153388..74586c3 100644
--- a/_var/_Main/ModelSettings/Common/Dev-27/_ROOT_Role_Dev-27.properties
+++ b/_var/_Main/ModelSettings/Common/Dev-27/_ROOT_Role_Dev-27.properties
@@ -6,6 +6,10 @@
 _self.configsettype=Role
 _self.description=OTD杞﹁浇浜嬩笟
 _self.name=Dev-27
+arg=template:serverargs
+arg.architectdependencies=
+arg.custom=""
+arg.versioncontrolmode=true
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination=template:domainmodel.ediremotedatasourcedefinition
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.connection=
 domainmodel.ediremotedatasourcedefinition.remotestorage.destination.parameters=
@@ -451,16 +455,56 @@
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sendingcontentcharset=UTF-8
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.sockettimeout=0
 domainmodel.integratorconfig.dsendpoint.q3dspace_3dsendpoint.trustmanagername=Q3DSpace
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.jtmbrestserver_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.connectiongroupname=SERVER
+domainmodel.integratorconfig.quintiqendpoint.panelmaterialrestserver_quintiqendpoint.outboundrequesttimeout=60
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint=template:domainmodel.integratorconfig.quintiqendpoint
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.connectiongroupname=SERVER
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.integratorid=Q3DSpace
 domainmodel.integratorconfig.quintiqendpoint.q3dspace_quintiqendpoint.outboundrequesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.enablehttpmessagelogging=true
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.maxconnections=10
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.portnumber=8080
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.jtmbrestserver_restserver.sockettimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial=template:domainmodel.integratorconfig.restendpoint
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam1=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationparam2=
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.authenticationtype=None
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.connectiontimeout=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.contenttype=JSON
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.enablehttpmessagelogging=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.includerawcontent=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.maxconnections=10
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.passonvalidationerrors=false
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.portnumber=8080
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.proxyportnumber=0
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.receivecontentcharset=ASCII
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.requesttimeout=60
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.restschemaurl="C:\\Users\\hongjli\\Desktop\\integratorrestexample\\openapi.yaml"
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sendingcontentcharset=utf-8
+domainmodel.integratorconfig.restendpoint.panelmaterialrestserver_restendpointpanelmaterial.sockettimeout=0
 domainmodel.mdsstoragedefinitionmanager=template:domainmodel.mdsstoragedefinitionmanager
 domainmodel.mdsstoragedefinitionmanager.audittrailenabled=false
 domainmodel.mdsstoragedefinitionmanager.audittraillocation=
 domainmodel.mdsstoragedefinitionmanager.databaseenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoredatasource=MacroPlanner
-domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=true
+domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoreislocal=false
 domainmodel.mdsstoragedefinitionmanager.dbformat=Legacy
 domainmodel.mdsstoragedefinitionmanager.defaultencryptioncertificate=
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
deleted file mode 100644
index 780f9e5..0000000
--- a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
+++ /dev/null
@@ -1,205 +0,0 @@
-Quintiq file version 2.0
-{
-  viewcontents
-  {
-    forms
-    {
-      form_legacy_1
-      {
-        title: 'Scenario manager'
-        shown: true
-        componentID: 'FormScenarioManager'
-        layout
-        {
-          mode: 'open'
-          rowPosition: 1
-          rowSpan: 8
-          columnPosition: 1
-          columnSpan: 5
-        }
-        components
-        {
-          FormScenarioManager_ListScenario
-          {
-          }
-          FormScenarioManager_DataSetLevelScenario
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 90
-            }
-            column_Name
-            {
-              columnId: 'Name'
-              dataPath: 'Name'
-              dataType: 'string'
-              title: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 197
-            }
-            column_ChangedBy
-            {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
-              dataType: 'string'
-              title: 'Changed by'
-              index: 2
-              subtotals: ''
-              width: 91
-            }
-            column_ChangedOn
-            {
-              columnId: 'ChangedOn'
-              dataPath: 'ChangedOn'
-              dataType: 'datetime'
-              title: 'Changed on'
-              index: 3
-              subtotals: ''
-              width: 99
-            }
-            column_StorageMode
-            {
-              columnId: 'StorageMode'
-              dataPath: 'StorageMode'
-              dataType: 'string'
-              title: 'StorageMode'
-              index: 4
-              subtotals: ''
-              width: 40
-            }
-          }
-        }
-      }
-      form_FormOptimizerPuzzles
-      {
-        title: 'Optimizer Puzzles'
-        shown: false
-        componentID: 'FormOptimizerPuzzles'
-        layout
-        {
-          mode: 'dockright'
-          index: 0
-        }
-        components
-        {
-          FormOptimizerPuzzles_ListOptimizerPuzzles
-          {
-          }
-          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 32
-            }
-            column_Name
-            {
-              columnId: 'Name'
-              dataPath: 'Name'
-              dataType: 'string'
-              title: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 109
-            }
-            column_Description
-            {
-              columnId: 'Description'
-              dataPath: 'Description'
-              dataType: 'string'
-              title: '鎻忚堪'
-              index: 2
-              subtotals: ''
-              width: 207
-            }
-          }
-        }
-      }
-      form_FormKPI
-      {
-        title: 'KPI Dashboard'
-        shown: true
-        componentID: 'FormKPI'
-        layout
-        {
-          mode: 'dockright'
-          index: 1
-        }
-        components
-        {
-          FormKPI_PanelKPI
-          {
-            sizeRatio: 1
-            activeChild: 'PanelKPISelection'
-          }
-          FormKPI_PanelKPIDashboard
-          {
-            sizeRatio: 1
-          }
-          FormKPI_PanelKPISelection
-          {
-            sizeRatio: 1
-          }
-          FormKPI_ListKPISelection
-          {
-            QuillViewData
-            {
-              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
-            }
-          }
-          FormKPI_DataSetLevelKPISelection
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 32
-            }
-            column_Name
-            {
-              columnId: 'Name'
-              dataPath: 'Name'
-              dataType: 'string'
-              title: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 200
-            }
-          }
-        }
-      }
-    }
-    userconfigurableinformation
-    {
-    }
-    index: 0
-    image: 'CHART_HI_LO'
-    page: 'ActionBarPageScenarioComparison'
-    group: ''
-    description: ''
-  }
-  formatversion: 2
-  id: 'Capacity___sale_budge'
-  name: 'Capacity & sale budge'
-  isglobal: false
-  isroot: true
-}
diff --git a/test.pdm b/test.pdm
new file mode 100644
index 0000000..97086a6
--- /dev/null
+++ b/test.pdm
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:235868634af40fbdee26a59c415745645a4cc6a0e4c25f6f023fa46526cadb9b
+size 14

--
Gitblit v1.9.3