From 43881350a19a4d1f437963875f04f9e0ab42ceb7 Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期二, 25 六月 2024 16:11:14 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg

---
 _Main/BL/Type_TransferPlanRow/_ROOT_Type_TransferPlanRow.qbl                                                                                   |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def                                            |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnOk_OnClick.def                                 |   16 
 _Main/BL/Relations/Relation_LocalColumn_LocalTable_LocalTable_LocalColumn.qbl                                                                  |   23 
 _Main/BL/Type_TransferPlanRow/Attribute_Name.qbl                                                                                               |    7 
 _Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersion.qbl                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bExport_OnClick.def                                                          |   18 
 _Main/BL/Type_LocalColumn/Attribute_IsAttrbuteColumn.qbl                                                                                       |    7 
 _Main/BL/Type_ExportXMLData/_ROOT_Type_ExportXMLData.qbl                                                                                       |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def                                                        |   27 
 _Main/BL/Type_TransferPlanColumn/Attribute_ColumnIndex.qbl                                                                                     |    7 
 _Main/BL/Relations/Relation_LocalTable_RecycleBin_RecycleBin_LocalTable.qbl                                                                    |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def         |   18 
 _Main/BL/Type_ShiftPlan/Method_CalculateEventType.qbl                                                                                          |   39 
 _Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl                                                                          |   28 
 _Main/BL/Relations/Relation_TransferPlanRow_MacroPlan_MacroPlan_TransferPlanRow.qbl                                                            |   23 
 _Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersionValue.qbl                                                                     |    7 
 _Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl                                                                         |   36 
 _Main/UI/MacroPlannerWebApp/Views/DemandComparison.vw                                                                                          |   16 
 _Main/BL/Type_LocalRow/Attribute_Name.qbl                                                                                                      |    7 
 _Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_RecycleBin_RecycleBin_General.qbl                                            |   23 
 _Main/BL/Relations/Relation_TransferPlanColumn_MacroPlan_MacroPlan_TransferPlanColumn.qbl                                                      |   23 
 _Main/BL/Relations/Relation_ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan.qbl                                                              |   23 
 LibMacroPlanner/BL/Type_UnitPeriodTime/Method_OnCreate.qbl                                                                                     |   10 
 _Main/BL/Type_LocalCell_DemandComparison/Attribute_Gap.qbl                                                                                     |    7 
 _Main/BL/Type_LocalTable/_ROOT_Type_LocalTable.qbl                                                                                             |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def                                                                   |   46 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPlanViews.def                                            |   18 
 LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl                                                                           |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlActions.def                                              |   40 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixEditorActionBarPage493.def                                              |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged#168.def        |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelDemandComparison_dhComparisonData_OnDataChanged.def                   |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def                                       |   30 
 _Main/BL/Type_LocalColumn/Attribute_Index.qbl                                                                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_pOperation.def                                                                         |   63 +
 _Main/BL/Type_ExportXMLData/Attribute_XML.qbl                                                                                                  |    7 
 _Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersionValue.qbl                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_Form568/_ROOT_Component_FormShihtPlan#568.def                                                            |   17 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def                                                  |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def                                                    |    2 
 _Main/BL/Type_ShiftPlan/Method_CalculateRemark#503.qbl                                                                                         |   30 
 _Main/BL/Relations/Relation_TransferPlanCell_TransferPlanColumn_TransferPlanColumn_TransferPlan.qbl                                            |   23 
 _Main/BL/Type_LocalRow/Attribute_CustomName.qbl                                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def                                           |   34 
 _Main/BL/Type_ShiftPlan/Attribute_EventType.qbl                                                                                                |    7 
 _Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKG.qbl                                                                          |    7 
 _Main/BL/Type_ShiftPlan/_ROOT_Type_ShiftPlan.qbl                                                                                               |    9 
 _Main/Sys/Repr/Global/DateTime.qrp                                                                                                             |    2 
 _Main/BL/Type_TransferPlanColumn/Attribute_ColumnDate.qbl                                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Views/TransferPlan.vw                                                                                              |  146 ++
 _Main/BL/Type_ExportXMLManager/Method_Export.qbl                                                                                               |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnCancel_OnClick.def                             |   15 
 _Main/BL/Type_ExportXMLManager/Function_CalcFinalXML.qbl                                                                                       |   20 
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                                       |   35 
 _Main/BL/Type_LocalRow/Attribute_Index.qbl                                                                                                     |    7 
 _Main/BL/Type_ShiftPlan/Method_SetRemark.qbl                                                                                                   |   12 
 _Main/BL/Dataset_RecycleBin/_ROOT_Dataset_RecycleBin.qbl                                                                                       |   10 
 _Main/BL/Type_LocalRow/Function_CalcName.qbl                                                                                                   |   13 
 _Main/BL/Type_TransferPlanRow/TypeIndex_TransferPlanRowTypeIndex.qbl                                                                           |   20 
 _Main/BL/Type_ShiftPlan/Function_CalcEventType.qbl                                                                                             |   12 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupScenarioComparisonViews_ButtonScenarioCo.def |   17 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetColumnXML.qbl                                                                         |   56 +
 _Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityPL.qbl                                                                           |    7 
 _Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl                                                                                              |  116 ++
 _Main/BL/Type_TransferPlanCell/Attribute_Value.qbl                                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def                                                      |   81 +
 _Main/BL/Type_TransferPlanCell/_ROOT_Type_TransferPlanCell.qbl                                                                                 |    9 
 _Main/BL/Type_TransferPlanRow/Attribute_SourceStockpoingPointID.qbl                                                                            |    8 
 _Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl                                                                                |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def                                         |   18 
 _Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityAGW.qbl                                                                          |    7 
 _Main/BL/Type_TransferPlanColumn/Attribute_ColumnName.qbl                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def                 |    4 
 _Main/BL/Type_RecycleBin/_ROOT_Type_RecycleBin.qbl                                                                                             |    9 
 _Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl                                                                                   |   39 
 _Main/BL/Type_LocalTable/Method_GetRowIndexCache.qbl                                                                                           |   12 
 _Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlContent.def                                              |   64 +
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_MatrixEditor872.def                                                           |   97 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def                                    |    8 
 _Main/Sys/Repr/Global/Date.qrp                                                                                                                 |    2 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl                                                                    |   18 
 _Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersion.qbl                                                                          |    7 
 _Main/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl                                                                                     |    6 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick.def        |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixEditorActionBarPageDemandComparison.def                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bMaximumDailyTransferCapacity_OnClick.def                              |   12 
 _Main/BL/Type_TransferPlanColumn/_ROOT_Type_TransferPlanColumn.qbl                                                                             |    9 
 _Main/BL/Type_ShiftPlan/Attribute_Color.qbl                                                                                                    |    7 
 _Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKM.qbl                                                                          |    7 
 _Main/BL/Type_TransferPlanCell/StaticMethod_GenerateReport.qbl                                                                                 |   71 +
 _Main/Sys/Repr/Global/ShiftPlan.qrp                                                                                                            |   45 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def                                   |   17 
 _Main/BL/Relations/Relation_ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager.qbl                                                        |   23 
 _Main/BL/Type_ExportXMLManager/_ROOT_Type_ExportXMLManager.qbl                                                                                 |    9 
 _Main/BL/Type_TransferPlanColumn/TypeIndex_TransferPlanColumnTypeIndex.qbl                                                                     |   12 
 _Main/BL/Relations/Relation_LocalRow_LocalCell_LocalCell_LocalRow.qbl                                                                          |   23 
 _Main/BL/Relations/Relation_TransferPlanCell_TransferPlanRow_TransferPlanRow_TransferPlanCell.qbl                                              |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation#715.def                                                        |   63 +
 _Main/BL/Type_TransferPlanRow/Function_CalcName.qbl                                                                                            |   13 
 _Main/BL/Type_Period_MP/_ROOT_Type_Period_MP.qbl                                                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/_ROOT_Component_DialogUpperLimitOfTransferCapacity.def                |   21 
 _Main/BL/Type_ShiftPlan/StaticMethod_GetShiftPlanColumnXML.qbl                                                                                 |   50 
 _Main/BL/Type_LocalRow/_ROOT_Type_LocalRow.qbl                                                                                                 |    9 
 _Main/BL/Relations/Relation_LocalColumn_LocalCell_LocalCell_LocalColumn.qbl                                                                    |   23 
 _Main/BL/Type_LocalTable/Attribute_Name.qbl                                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison.def                                                 |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/_ROOT_Component_FormTransferPlan.def                                                    |   18 
 _Main/BL/Type_ShiftPlan/Attribute_Outcome.qbl                                                                                                  |    7 
 _Main/BL/Type_LocalColumn/_ROOT_Type_LocalColumn.qbl                                                                                           |    9 
 _Main/BL/Type_ShiftPlan/StaticMethod_GetAttributeNames.qbl                                                                                     |   15 
 _Main/BL/Type_ShiftPlan/Method_GetAttributeByName.qbl                                                                                          |   19 
 _Main/BL/Type_ExportXMLManager/Attribute_FinalXML.qbl                                                                                          |    7 
 _Main/BL/Type_TransferPlanRow/Attribute_TargetStockpoingPointID.qbl                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixeditorContextMenuDemandComparison.def                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bDownload_OnClick.def                                                        |   30 
 _Main/BL/Type_ShiftPlan/Function_CalcColor.qbl                                                                                                 |   27 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_AsyncExport.qbl                                                                          |   31 
 _Main/BL/Type_ShiftPlan/Function_CalcRemark.qbl                                                                                                |   13 
 _Main/BL/Type_LocalCell_DemandComparison/Function_CalcGap.qbl                                                                                  |   13 
 _Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityKW.qbl                                                                           |    7 
 _Main/BL/Type_LocalCell/_ROOT_Type_LocalCell.qbl                                                                                               |    9 
 _Main/BL/Type_ShiftPlan/Attribute_Remark.qbl                                                                                                   |    7 
 _Main/BL/Type_ExportXMLManager/Attribute_Name.qbl                                                                                              |    7 
 _Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl                                                                                             |   30 
 _Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl                                                                    |    6 
 _Main/BL/Type_LocalCell_DemandComparison/Method_GetAttributeByName.qbl                                                                         |   44 
 _Main/BL/Type_ExportXMLData/Attribute_Priority.qbl                                                                                             |    7 
 _Main/BL/Type_RecycleBin/StaticMethod_OnLogin.qbl                                                                                              |   28 
 _Main/BL/Type_LocalTable/Attribute_RowIndexCache.qbl                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                                      |    2 
 _Main/BL/Type_LocalColumn/Attribute_Name.qbl                                                                                                   |    7 
 _Main/BL/Type_TransferPlanRow/Attribute_RowNr.qbl                                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_OnCreated.def                                                             |   44 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def                                                  |   12 
 _Main/BL/Relations/Relation_LocalRow_LocalTable_LocalTable_LocalRow.qbl                                                                        |   23 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bTransferPlan_OnClick.def         |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bGenerateReport_OnClick.def                                            |   22 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews#859.def                          |   18 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixeditorContextMenuTime#1.def                                                      |   33 
 _Main/BL/Type_ShiftPlan/Function_CalcOutcome.qbl                                                                                               |   14 
 _Main/BL/Type_TransferPlanRow/Attribute_ProductID.qbl                                                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixeditorContextMenu367.def                                                |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pContent.def                                                                  |   14 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_MatrixEditorTimeCapacities#656.def                                                     |  119 ++
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_MatrixEditorTimeCapacities_656_OnUpdateValue#317.def                                    |   20 
 _Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def                                                             |    2 
 /dev/null                                                                                                                                      |   18 
 _Main/BL/Type_ShiftPlan/Attribute_CustomRemark.qbl                                                                                             |    7 
 _Main/BL/Type_TransferPlanColumn/Function_CalcColumnName.qbl                                                                                   |   13 
 _Main/BL/Type_ShiftPlan/StaticMethod_AsyncExport.qbl                                                                                           |   31 
 _Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw                                                                                                 |   16 
 _Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl                                                                                              |   36 
 _Main/BL/Type_ShiftPlan/StaticMethod_Create.qbl                                                                                                |   12 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_PanelMatrix#675.def                                                                    |   15 
 _Main/BL/Relations/Relation_ExportXMLData_ExportXMLManager_ExportXMLManager_ExportXMLData.qbl                                                  |   23 
 _Main/BL/Type_UnitPeriodTime/Method_OnCreate.qbl                                                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixEditorActionBarPageTime#1.def                                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def                                                          |   98 +
 _Main/BL/Type_LocalCell_DemandComparison/_ROOT_Type_LocalCell_DemandComparison.qbl                                                             |    9 
 161 files changed, 3,277 insertions(+), 31 deletions(-)

diff --git a/LibMacroPlanner/BL/Type_UnitPeriodTime/Method_OnCreate.qbl b/LibMacroPlanner/BL/Type_UnitPeriodTime/Method_OnCreate.qbl
new file mode 100644
index 0000000..37b6a24
--- /dev/null
+++ b/LibMacroPlanner/BL/Type_UnitPeriodTime/Method_OnCreate.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnCreate
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+  *]
+  InterfaceProperties { Accessibility: 'Module' }
+}
diff --git a/LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl b/LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl
index 388e279..77cf5e1 100644
--- a/LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl
+++ b/LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl
@@ -5,6 +5,7 @@
 {
   #keys: '2[110880.4.1188154382][110880.4.1188154375]'
   Description: 'MP'
+  OnCreate: 'this.OnCreate();'
   Parent: UnitPeriodTimeBase
   StructuredName: 'UnitPeriodTimes'
 }
diff --git a/_Main/BL/Dataset_RecycleBin/_ROOT_Dataset_RecycleBin.qbl b/_Main/BL/Dataset_RecycleBin/_ROOT_Dataset_RecycleBin.qbl
new file mode 100644
index 0000000..f555955
--- /dev/null
+++ b/_Main/BL/Dataset_RecycleBin/_ROOT_Dataset_RecycleBin.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Dataset RecycleBin
+{
+  #keys: '2[412672.0.1084213478][412672.0.1084213477]'
+  DefaultMDSName: 'RecycleBin'
+  InstanceType: RecycleBin
+  WithStorage: false
+}
diff --git a/_Main/BL/Relations/Relation_ExportXMLData_ExportXMLManager_ExportXMLManager_ExportXMLData.qbl b/_Main/BL/Relations/Relation_ExportXMLData_ExportXMLManager_ExportXMLManager_ExportXMLData.qbl
new file mode 100644
index 0000000..f14bd82
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ExportXMLData_ExportXMLManager_ExportXMLManager_ExportXMLData.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ExportXMLData_ExportXMLManager_ExportXMLManager_ExportXMLData
+{
+  #keys: '1[412672.0.1084249088]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ExportXMLManager
+  {
+    #keys: '3[412672.0.1084249090][412672.0.1084249089][412672.0.1084249091]'
+    Cardinality: '0to1'
+    ObjectDefinition: ExportXMLData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ExportXMLData
+  {
+    #keys: '3[412672.0.1084249093][412672.0.1084249092][412672.0.1084249094]'
+    Cardinality: '1toN'
+    ObjectDefinition: ExportXMLManager
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager.qbl b/_Main/BL/Relations/Relation_ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager.qbl
new file mode 100644
index 0000000..673d605
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager
+{
+  #keys: '1[412672.0.1084249075]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide RecycleBin
+  {
+    #keys: '3[412672.0.1084249077][412672.0.1084249076][412672.0.1084249078]'
+    Cardinality: '0to1'
+    ObjectDefinition: ExportXMLManager
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ExportXMLManager
+  {
+    #keys: '3[412672.0.1084249080][412672.0.1084249079][412672.0.1084249081]'
+    Cardinality: '1toN'
+    ObjectDefinition: RecycleBin
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_Archive_Archive_GeneralExcelI.qbl b/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_Archive_Archive_GeneralExcelI.qbl
deleted file mode 100644
index 7f5ef9c..0000000
--- a/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_Archive_Archive_GeneralExcelI.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation GeneralExcelImportAndExportDataSource_Archive_Archive_GeneralExcelImportAndExportDataSource
-{
-  #keys: '1[413988.0.1161870117]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide Archive
-  {
-    #keys: '3[413988.0.1161870119][413988.0.1161870118][413988.0.1161870120]'
-    Cardinality: '0to1'
-    ObjectDefinition: GeneralExcelImportAndExportDataSource
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide GeneralExcelImportAndExportDataSource
-  {
-    #keys: '3[413988.0.1161870122][413988.0.1161870121][413988.0.1161870123]'
-    Cardinality: '1toN'
-    ObjectDefinition: Archive
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_RecycleBin_RecycleBin_General.qbl b/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_RecycleBin_RecycleBin_General.qbl
new file mode 100644
index 0000000..d09c664
--- /dev/null
+++ b/_Main/BL/Relations/Relation_GeneralExcelImportAndExportDataSource_RecycleBin_RecycleBin_General.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation GeneralExcelImportAndExportDataSource_RecycleBin_RecycleBin_GeneralExcelImportAndExportDataSource
+{
+  #keys: '1[412672.0.1087854694]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide RecycleBin
+  {
+    #keys: '3[412672.0.1087854696][412672.0.1087854695][412672.0.1087854697]'
+    Cardinality: '0to1'
+    ObjectDefinition: GeneralExcelImportAndExportDataSource
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide GeneralExcelImportAndExportDataSource
+  {
+    #keys: '3[412672.0.1087854699][412672.0.1087854698][412672.0.1087854700]'
+    Cardinality: '1toN'
+    ObjectDefinition: RecycleBin
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LocalColumn_LocalCell_LocalCell_LocalColumn.qbl b/_Main/BL/Relations/Relation_LocalColumn_LocalCell_LocalCell_LocalColumn.qbl
new file mode 100644
index 0000000..068b995
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LocalColumn_LocalCell_LocalCell_LocalColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LocalColumn_LocalCell_LocalCell_LocalColumn
+{
+  #keys: '1[412672.0.1084249675]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LocalCell
+  {
+    #keys: '3[412672.0.1084249677][412672.0.1084249676][412672.0.1084249678]'
+    Cardinality: '1toN'
+    ObjectDefinition: LocalColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LocalColumn
+  {
+    #keys: '3[412672.0.1084249680][412672.0.1084249679][412672.0.1084249681]'
+    Cardinality: '0to1'
+    ObjectDefinition: LocalCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LocalColumn_LocalTable_LocalTable_LocalColumn.qbl b/_Main/BL/Relations/Relation_LocalColumn_LocalTable_LocalTable_LocalColumn.qbl
new file mode 100644
index 0000000..12dd6b0
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LocalColumn_LocalTable_LocalTable_LocalColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LocalColumn_LocalTable_LocalTable_LocalColumn
+{
+  #keys: '1[412672.0.1084249662]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LocalTable
+  {
+    #keys: '3[412672.0.1084249664][412672.0.1084249663][412672.0.1084249665]'
+    Cardinality: '0to1'
+    ObjectDefinition: LocalColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LocalColumn
+  {
+    #keys: '3[412672.0.1084249667][412672.0.1084249666][412672.0.1084249668]'
+    Cardinality: '1toN'
+    ObjectDefinition: LocalTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LocalRow_LocalCell_LocalCell_LocalRow.qbl b/_Main/BL/Relations/Relation_LocalRow_LocalCell_LocalCell_LocalRow.qbl
new file mode 100644
index 0000000..968144e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LocalRow_LocalCell_LocalCell_LocalRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LocalRow_LocalCell_LocalCell_LocalRow
+{
+  #keys: '1[412672.0.1084249636]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LocalCell
+  {
+    #keys: '3[412672.0.1084249638][412672.0.1084249637][412672.0.1084249639]'
+    Cardinality: '1toN'
+    ObjectDefinition: LocalRow
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide LocalRow
+  {
+    #keys: '3[412672.0.1084249641][412672.0.1084249640][412672.0.1084249642]'
+    Cardinality: '0to1'
+    ObjectDefinition: LocalCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LocalRow_LocalTable_LocalTable_LocalRow.qbl b/_Main/BL/Relations/Relation_LocalRow_LocalTable_LocalTable_LocalRow.qbl
new file mode 100644
index 0000000..ca48e34
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LocalRow_LocalTable_LocalTable_LocalRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LocalRow_LocalTable_LocalTable_LocalRow
+{
+  #keys: '1[412672.0.1084249649]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide LocalTable
+  {
+    #keys: '3[412672.0.1084249651][412672.0.1084249650][412672.0.1084249652]'
+    Cardinality: '0to1'
+    ObjectDefinition: LocalRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LocalRow
+  {
+    #keys: '3[412672.0.1084249654][412672.0.1084249653][412672.0.1084249655]'
+    Cardinality: '1toN'
+    ObjectDefinition: LocalTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_LocalTable_RecycleBin_RecycleBin_LocalTable.qbl b/_Main/BL/Relations/Relation_LocalTable_RecycleBin_RecycleBin_LocalTable.qbl
new file mode 100644
index 0000000..ea3e67b
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LocalTable_RecycleBin_RecycleBin_LocalTable.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LocalTable_RecycleBin_RecycleBin_LocalTable
+{
+  #keys: '1[412672.0.1084249623]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide RecycleBin
+  {
+    #keys: '3[412672.0.1084249625][412672.0.1084249624][412672.0.1084249626]'
+    Cardinality: '0to1'
+    ObjectDefinition: LocalTable
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LocalTable
+  {
+    #keys: '3[412672.0.1084249628][412672.0.1084249627][412672.0.1084249629]'
+    Cardinality: '1toN'
+    ObjectDefinition: RecycleBin
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan.qbl b/_Main/BL/Relations/Relation_ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan.qbl
new file mode 100644
index 0000000..00dce9d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan
+{
+  #keys: '1[412672.0.1066680007]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide UnitPeriodTime
+  {
+    #keys: '3[412672.0.1066680009][412672.0.1066680008][412672.0.1066680010]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShiftPlan
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ShiftPlan
+  {
+    #keys: '3[412672.0.1066680012][412672.0.1066680011][412672.0.1066680013]'
+    Cardinality: '0to1'
+    ObjectDefinition: UnitPeriodTime
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanColumn_TransferPlanColumn_TransferPlan.qbl b/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanColumn_TransferPlanColumn_TransferPlan.qbl
new file mode 100644
index 0000000..67fa6b9
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanColumn_TransferPlanColumn_TransferPlan.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TransferPlanCell_TransferPlanColumn_TransferPlanColumn_TransferPlanCell
+{
+  #keys: '1[413988.0.1292031952]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide TransferPlanColumn
+  {
+    #keys: '3[413988.0.1292031954][413988.0.1292031953][413988.0.1292031955]'
+    Cardinality: '0to1'
+    ObjectDefinition: TransferPlanCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TransferPlanCell
+  {
+    #keys: '3[413988.0.1292031957][413988.0.1292031956][413988.0.1292031958]'
+    Cardinality: '1toN'
+    ObjectDefinition: TransferPlanColumn
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanRow_TransferPlanRow_TransferPlanCell.qbl b/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanRow_TransferPlanRow_TransferPlanCell.qbl
new file mode 100644
index 0000000..a49adaa
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TransferPlanCell_TransferPlanRow_TransferPlanRow_TransferPlanCell.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TransferPlanCell_TransferPlanRow_TransferPlanRow_TransferPlanCell
+{
+  #keys: '1[413988.0.1292031965]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide TransferPlanRow
+  {
+    #keys: '3[413988.0.1292031967][413988.0.1292031966][413988.0.1292031968]'
+    Cardinality: '0to1'
+    ObjectDefinition: TransferPlanCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TransferPlanCell
+  {
+    #keys: '3[413988.0.1292031970][413988.0.1292031969][413988.0.1292031971]'
+    Cardinality: '1toN'
+    ObjectDefinition: TransferPlanRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_TransferPlanColumn_MacroPlan_MacroPlan_TransferPlanColumn.qbl b/_Main/BL/Relations/Relation_TransferPlanColumn_MacroPlan_MacroPlan_TransferPlanColumn.qbl
new file mode 100644
index 0000000..7d3b50b
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TransferPlanColumn_MacroPlan_MacroPlan_TransferPlanColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TransferPlanColumn_MacroPlan_MacroPlan_TransferPlanColumn
+{
+  #keys: '1[413988.0.1292031939]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1292031941][413988.0.1292031940][413988.0.1292031942]'
+    Cardinality: '0to1'
+    ObjectDefinition: TransferPlanColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TransferPlanColumn
+  {
+    #keys: '3[413988.0.1292031944][413988.0.1292031943][413988.0.1292031945]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_TransferPlanRow_MacroPlan_MacroPlan_TransferPlanRow.qbl b/_Main/BL/Relations/Relation_TransferPlanRow_MacroPlan_MacroPlan_TransferPlanRow.qbl
new file mode 100644
index 0000000..047b702
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TransferPlanRow_MacroPlan_MacroPlan_TransferPlanRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TransferPlanRow_MacroPlan_MacroPlan_TransferPlanRow
+{
+  #keys: '1[413988.0.1292031926]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1292031928][413988.0.1292031927][413988.0.1292031929]'
+    Cardinality: '0to1'
+    ObjectDefinition: TransferPlanRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TransferPlanRow
+  {
+    #keys: '3[413988.0.1292031931][413988.0.1292031930][413988.0.1292031932]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl b/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
new file mode 100644
index 0000000..75469e5
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
@@ -0,0 +1,116 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Compared (
+  RecycleBin recycleBin,
+  const ArchivePR baseVersion,
+  const ArchivePR compareVersion
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    localTable := recycleBin.LocalTable( relnew,Name := baseVersion.Name() + "__" + compareVersion.Name());
+    
+    baseVersionFile := OSFile::Construct();
+    compareVersionFile := OSFile::Construct();
+    
+    try {
+      baseVersionFile.Open( baseVersion.FilePath(), "Read", false );
+      baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionFile.ReadBinary(), baseVersion.FilePath() );
+      baseVersionDataSource.ReadStructure();
+      
+      compareVersionFile.Open( compareVersion.FilePath(), "Read", false );
+      compareVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, compareVersionFile.ReadBinary(), compareVersion.FilePath() );
+      compareVersionDataSource.ReadStructure();
+      
+      baseVersionTable := select( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      compareVersionTable := select( compareVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      
+      if( not isnull( baseVersionTable ) and not isnull( compareVersionTable )){
+        
+        //鐢熸垚琛屾暟鎹�
+        rowKeys := construct( Strings );
+        baseVersionRowTree := NamedValueTree::Create();
+        baseVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        compareVersionRowTree := NamedValueTree::Create();
+        compareVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        ArchivePR::FillRows( baseVersionTable,rowKeys,baseVersionRowTree,baseVersionRows );
+        ArchivePR::FillRows( compareVersionTable,rowKeys,compareVersionRowTree,compareVersionRows );
+        
+        // 鐢熸垚鍒楁暟鎹�
+        columnTree := NamedValueTree::Create();
+        columns := construct( LocalColumns );
+        ArchivePR::GenerateColumnIndex( baseVersionTable,localTable,columnTree,columns );
+        ArchivePR::GenerateColumnIndex( compareVersionTable,localTable,columnTree,columns );
+        columnNames := selectvalues( columns,Elements,column,true,column.Name() );
+        
+        // 鐢熸垚鏁版嵁
+        
+        for ( rowIndex := 0; rowIndex < rowKeys.Size(); rowIndex++ ) {
+          rowKey := rowKeys.Element( rowIndex );
+          
+          baseVersionCellTree := NamedValueTree::Create();
+          baseVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          compareVersionCellTree := NamedValueTree::Create();
+          compareVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          ArchivePR::FillCells( rowKey,baseVersionRowTree,baseVersionRows,baseVersionCellTree,baseVersionCells );
+          ArchivePR::FillCells( rowKey,compareVersionRowTree,compareVersionRows,compareVersionCellTree,compareVersionCells );
+          
+          row := localTable.LocalRow( relnew,Index := localTable.GetRowIndexCache()  );
+          
+          traverse( columnNames,Elements,columnName ){
+            columnHandle := columnTree.GetHandle( columnName );
+            columnIndex := columnTree.Root().Child( columnHandle ).GetValueAsNumber();
+            column := columns.Element( columnIndex );
+            
+            baseVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            baseVersionCellHandle := baseVersionCellTree.GetHandle( columnName );
+            try{
+              baseVersionCellIndex := baseVersionCellTree.Root().Child( baseVersionCellHandle ).GetValueAsNumber();
+              baseVersionCell := baseVersionCells.Element( baseVersionCellIndex );
+            }onerror{}
+            
+            compareVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            compareVersionCellHandle := compareVersionCellTree.GetHandle( columnName );
+            try{
+              compareVersionCellIndex := compareVersionCellTree.Root().Child( compareVersionCellHandle ).GetValueAsNumber();
+              compareVersionCell := compareVersionCells.Element( compareVersionCellIndex );
+            }onerror{}
+            
+            if( columnName = "浜у湴" or columnName = "杞﹀瀷" or columnName = "鍙戝姩鏈洪浂浠跺彿" or columnName = "鍙戝姩鏈哄洓浣嶇爜" ){
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersionValue := ifexpr( isnull( baseVersionCell ), "绌�", baseVersionCell.Value()),
+                             CompareVersionValue := ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()));
+              column.IsAttrbuteColumn( true );
+              if( columnName = "鍙戝姩鏈洪浂浠跺彿" ){
+                row.CustomName( ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value()) );
+              }
+            }else{
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersion := ifexpr( isnull( baseVersionCell ),0,[Real]baseVersionCell.Value()),
+                             CompareVersion := ifexpr( isnull( compareVersionCell ), 0 ,[Real]compareVersionCell.Value() ));
+            }
+          }
+        }
+      }
+      // 鍚庣画鍒犻櫎
+      baseVersionDataSource.Delete();
+      compareVersionDataSource.Delete();
+      
+      baseVersionFile.Close();
+      compareVersionFile.Close();
+    } onerror {
+      if( not isnull( baseVersionFile )){
+        baseVersionFile.Close(); 
+      }
+      if( not isnull( compareVersionFile )){
+        compareVersionFile.Close(); 
+      }
+      error( e );
+    }
+    
+    return localTable;
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl b/_Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl
new file mode 100644
index 0000000..6aeded1
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillCells (
+  String rowName,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows,
+  NamedValueTree cellTree,
+  constcontent GeneralExcelImportAndExportDataCells cells
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowHandel := rowTree.GetHandle( rowName );
+    try{
+      rowIndex := rowTree.Root().Child( rowHandel ).GetValueAsNumber();
+      row := rows.Element( rowIndex );
+      
+      temp_cells := selectsortedset( row,GeneralExcelImportAndExportDataCell,cell,true,cell.GeneralExcelImportAndExportDataColumn().ColumnIndex() );
+      for( i := 0 ; i<temp_cells.Size();i++ ){
+        cell := temp_cells.Element( i );
+        tempHandle := cellTree.GetHandle( cell.GeneralExcelImportAndExportDataColumn().Name() );
+        
+        cells.Add( cell );
+        cellTree.Root().AddChild( tempHandle,cells.Size() - 1 );
+        
+      }
+    }onerror{}
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl b/_Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl
new file mode 100644
index 0000000..391100a
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillRows (
+  const GeneralExcelImportAndExportDataTable general,
+  Strings rowKeys,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowKeyColumn1 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "浜у湴" );
+    rowKeyColumn2 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "杞﹀瀷" );
+    rowKeyColumn3 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈洪浂浠跺彿" );
+    rowKeyColumn4 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈哄洓浣嶇爜" );
+    tempRowKeyCells1 := selectset( rowKeyColumn1,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells2 := selectset( rowKeyColumn2,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells3 := selectset( rowKeyColumn3,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells4 := selectset( rowKeyColumn4,GeneralExcelImportAndExportDataCell,cell,true );
+    
+    for( i := 0; i< tempRowKeyCells1.Size(); i++ ){
+      tempRowKeyCell1 := tempRowKeyCells1.Element( i );
+      tempRowKeyCell2 := tempRowKeyCells2.Element( i );
+      tempRowKeyCell3 := tempRowKeyCells3.Element( i );
+      tempRowKeyCell4 := tempRowKeyCells4.Element( i );
+      
+      rowKey := tempRowKeyCell1.Value() + tempRowKeyCell2.Value() + tempRowKeyCell3.Value() + tempRowKeyCell4.Value();
+      
+      tempHandle := rowTree.GetHandle( rowKey );
+      rowTree.Root().AddChild( tempHandle ,i);
+      rows.Add( tempRowKeyCell1.GeneralExcelImportAndExportDataRow());
+      rowKeys.Add( rowKey );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl
new file mode 100644
index 0000000..5bdd4f8
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateColumnIndex (
+  const GeneralExcelImportAndExportDataTable table,
+  LocalTable localTable,
+  NamedValueTree columnTree,
+  LocalColumns columns
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    tableColumns := selectset( table,GeneralExcelImportAndExportDataColumn,column,true );
+    for( i := 0; i< tableColumns.Size(); i++ ){
+      generalColumn := tableColumns.Element( i );
+      tempHandle := columnTree.GetHandle( generalColumn.Name() );
+    
+      nameValue := guard( columnTree.Root().Child( tempHandle ),null( NamedValue )); 
+      if( isnull( nameValue )){
+        index := 999;
+        if( generalColumn.Name() = "浜у湴" ){
+          index := 1;
+        }else if( generalColumn.Name() = "杞﹀瀷" ){
+          index := 2;
+        }else if( generalColumn.Name() = "鍙戝姩鏈洪浂浠跺彿" ){
+          index := 3;
+        }else if( generalColumn.Name() = "鍙戝姩鏈哄洓浣嶇爜" ){
+          index := 4;
+        }else{
+          // 2023/01/01
+          index := [Number]generalColumn.Name().ReplaceAll( "/", "" );
+        }
+        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),Index := index );
+        columns.Add( column );
+        columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLData/Attribute_Priority.qbl b/_Main/BL/Type_ExportXMLData/Attribute_Priority.qbl
new file mode 100644
index 0000000..035b1b2
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLData/Attribute_Priority.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Priority
+{
+  #keys: '3[412672.0.1084249112][412672.0.1084249111][412672.0.1084249113]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_ExportXMLData/Attribute_XML.qbl b/_Main/BL/Type_ExportXMLData/Attribute_XML.qbl
new file mode 100644
index 0000000..a86a8ff
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLData/Attribute_XML.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute XML
+{
+  #keys: '3[412672.0.1084249102][412672.0.1084249101][412672.0.1084249103]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ExportXMLData/_ROOT_Type_ExportXMLData.qbl b/_Main/BL/Type_ExportXMLData/_ROOT_Type_ExportXMLData.qbl
new file mode 100644
index 0000000..510e458
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLData/_ROOT_Type_ExportXMLData.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ExportXMLData
+{
+  #keys: '5[412672.0.1084249058][412672.0.1084249056][0.0.0][412672.0.1084249057][412672.0.1084249059]'
+  BaseType: Object
+  StructuredName: 'ExportXMLDatas'
+}
diff --git a/_Main/BL/Type_ExportXMLManager/Attribute_FinalXML.qbl b/_Main/BL/Type_ExportXMLManager/Attribute_FinalXML.qbl
new file mode 100644
index 0000000..2021b91
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/Attribute_FinalXML.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FinalXML
+{
+  #keys: '3[412672.0.1084249132][412672.0.1084249131][412672.0.1084249133]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ExportXMLManager/Attribute_Name.qbl b/_Main/BL/Type_ExportXMLManager/Attribute_Name.qbl
new file mode 100644
index 0000000..60d51c5
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[412672.0.1084249122][412672.0.1084249121][412672.0.1084249123]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ExportXMLManager/Function_CalcFinalXML.qbl b/_Main/BL/Type_ExportXMLManager/Function_CalcFinalXML.qbl
new file mode 100644
index 0000000..3b9cd77
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/Function_CalcFinalXML.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcFinalXML
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    xmlTemplate := '<?xml version="1.0" encoding="UTF-16"?><table><name>'+ this.Name() +'</name>';
+    
+    datas := selectsortedset( this,ExportXMLData,data,true,data.Priority() );
+    
+    traverse( datas,Elements,data ){
+      xmlTemplate := xmlTemplate + data.XML(); 
+    }
+    
+    xmlTemplate := xmlTemplate + "</table>";
+    
+    this.FinalXML( xmlTemplate );
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLManager/Method_Export.qbl b/_Main/BL/Type_ExportXMLManager/Method_Export.qbl
new file mode 100644
index 0000000..76e648d
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/Method_Export.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Export () as BinaryValue
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    tableGroupHandle := TableGroupHandle::Create( "tableGroupHandle" );
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( this.FinalXML() ) );
+    tableGroupHandle.Add( tableHandle );
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+     
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl
new file mode 100644
index 0000000..fdde1b7
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AwaitLocalTableXMLData (
+  const Strings columnXMLData,
+  RecycleBin owner
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    manager := select( owner,ExportXMLManager,manager,manager.Name() = "LocalTableXML" );
+    if( isnull( manager )){
+      manager := owner.ExportXMLManager( relnew,Name := "LocalTableXML" );
+    }else{
+      manager.ExportXMLData( relflush );
+    }
+    traverse( columnXMLData,Elements,element,element.TrimBoth() <> "" ){
+       data := manager.ExportXMLData( relnew, XML := element);
+       if( element.LikeUserLocale( "Product ID" )){
+         data.Priority( 1 );
+       }else if( element.LikeUserLocale( "Attribute" )){
+         data.Priority( 2 );
+       }else if( element.LikeUserLocale( "浜у湴" )){
+         data.Priority( 3 );
+       }else if( element.LikeUserLocale( "杞﹀瀷" )){
+         data.Priority( 4 );
+       }else if( element.LikeUserLocale( "鍙戝姩鏈洪浂浠跺彿" )){
+         data.Priority( 5 );
+       }else if( element.LikeUserLocale( "鍙戝姩鏈哄洓浣嶇爜" )){
+         data.Priority( 6 );
+       }else{
+         data.Priority( [Number]element.SubString( 14,10 ).ReplaceAll( "/","") );
+       }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl
new file mode 100644
index 0000000..fc5bb88
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AwaitShiftPlanXMLData (
+  const Strings columnXMLData,
+  RecycleBin owner
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    manager := select( owner,ExportXMLManager,manager,manager.Name() = "ShiftPlanXML" );
+    if( isnull( manager )){
+      manager := owner.ExportXMLManager( relnew,Name := "ShiftPlanXML" );
+    }else{
+      manager.ExportXMLData( relflush );
+    }
+    traverse( columnXMLData,Elements,element,element.TrimBoth() <> "" ){
+       data := manager.ExportXMLData( relnew, XML := element);
+       if( element.LikeUserLocale( "Unit" )){
+         data.Priority( 1 );
+       }else if( element.LikeUserLocale( "Attribute" )){
+         data.Priority( 2 );
+       }else{
+         data.Priority( [Number]element.SubString( 14,10 ).ReplaceAll( "-","") );
+       }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLManager/_ROOT_Type_ExportXMLManager.qbl b/_Main/BL/Type_ExportXMLManager/_ROOT_Type_ExportXMLManager.qbl
new file mode 100644
index 0000000..f3198ae
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/_ROOT_Type_ExportXMLManager.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ExportXMLManager
+{
+  #keys: '5[412672.0.1084249053][412672.0.1084249051][0.0.0][412672.0.1084249052][412672.0.1084249054]'
+  BaseType: Object
+  StructuredName: 'ExportXMLManagers'
+}
diff --git a/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl b/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl
index 6b96d0f..fed039d 100644
--- a/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl
+++ b/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl
@@ -1,16 +1,16 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Upload (
-  Archive archive,
+  RecycleBin recycleBin,
   BinaryValue binaryValue,
   String filePath
-) as GeneralExcelImportAndExportDataSource
+) const as GeneralExcelImportAndExportDataSource
 {
   TextBody:
   [*
     fileName := filePath.Tokenize( "\" ).Element( filePath.Tokenize( "\" ).Size() - 1 );
     
-    generalExcelImportAndExportDataSource := archive.GeneralExcelImportAndExportDataSource( relnew, 
+    generalExcelImportAndExportDataSource := recycleBin.GeneralExcelImportAndExportDataSource( relnew, 
                                                                                             FileBinaryValue := binaryValue,
                                                                                             Name            := fileName,
                                                                                             IsXLSX          := fileName.EndsWith( "xlsx" ),
diff --git a/_Main/BL/Type_LocalCell/_ROOT_Type_LocalCell.qbl b/_Main/BL/Type_LocalCell/_ROOT_Type_LocalCell.qbl
new file mode 100644
index 0000000..31867a9
--- /dev/null
+++ b/_Main/BL/Type_LocalCell/_ROOT_Type_LocalCell.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LocalCell
+{
+  #keys: '5[412672.0.1084249620][412672.0.1084249618][0.0.0][412672.0.1084249619][412672.0.1084249621]'
+  BaseType: Object
+  StructuredName: 'LocalCells'
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersion.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersion.qbl
new file mode 100644
index 0000000..e4182b7
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersion.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BaseVersion
+{
+  #keys: '3[412672.0.1087844729][412672.0.1087844728][412672.0.1087844730]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersionValue.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersionValue.qbl
new file mode 100644
index 0000000..7084a1a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_BaseVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BaseVersionValue
+{
+  #keys: '3[412672.0.1087874641][412672.0.1087874640][412672.0.1087874642]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersion.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersion.qbl
new file mode 100644
index 0000000..1884719
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersion.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CompareVersion
+{
+  #keys: '3[412672.0.1087844726][412672.0.1087844725][412672.0.1087844727]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersionValue.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersionValue.qbl
new file mode 100644
index 0000000..a1a480c
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_CompareVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CompareVersionValue
+{
+  #keys: '3[412672.0.1087874649][412672.0.1087874648][412672.0.1087874650]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Attribute_Gap.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_Gap.qbl
new file mode 100644
index 0000000..efe049a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Attribute_Gap.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Gap
+{
+  #keys: '3[412672.0.1087844732][412672.0.1087844731][412672.0.1087844733]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Function_CalcGap.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Function_CalcGap.qbl
new file mode 100644
index 0000000..90a8d2f
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Function_CalcGap.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcGap
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    
+    value := this.BaseVersion() - this.CompareVersion();
+    
+    this.Gap( value );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/Method_GetAttributeByName.qbl b/_Main/BL/Type_LocalCell_DemandComparison/Method_GetAttributeByName.qbl
new file mode 100644
index 0000000..f51ae7a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/Method_GetAttributeByName.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetAttributeByName (
+  String attributeName
+) const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    value := "";
+    
+    if( attributeName = "BaseVersion" ){
+       if( not this.LocalColumn().IsAttrbuteColumn() ){
+         value := this.BaseVersion().Format( "N(Dec)" );
+       }
+    }
+    if( attributeName = "CompareVersion" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.CompareVersion().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "Gap" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.Gap().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "BaseVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.BaseVersionValue();
+      }
+    }
+    if( attributeName = "CompareVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.CompareVersionValue();
+      }
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_AsyncExport.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_AsyncExport.qbl
new file mode 100644
index 0000000..4364350
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_AsyncExport.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AsyncExport (
+  RecycleBin recycleBin,
+  const constcontent LocalRows rows,
+  const constcontent LocalColumns columns
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    sortColumns := selectsortedset( columns,Elements,column,true,column.Index());
+    
+    attributeNames := LocalCell_DemandComparison::GetAttributeNames();
+    
+    columnstring := emit( "" );
+    flag := true;
+    traverse( sortColumns,Elements,sortColumn ){
+      if( flag ){
+        attributeXML := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames,"attribute" );
+        columnstring := columnstring.Merge( attributeXML )
+        flag := false;
+      }
+      
+      cellxml := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames ,"data");
+      columnstring := columnstring.Merge( cellxml);
+    }
+     
+    columnstring -> GroupAll() -> ExportXMLManager::AwaitLocalTableXMLData( recycleBin );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl
new file mode 100644
index 0000000..24a6087
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetAttributeNames () const declarative as owning Strings
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    attributeNames := construct( Strings );
+    
+    attributeNames.Add( "BaseVersion" );
+    attributeNames.Add( "CompareVersion" );
+    attributeNames.Add( "BaseVersionValue" );
+    attributeNames.Add( "CompareVersionValue" );
+    attributeNames.Add( "Gap" );
+    
+    return &attributeNames;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetColumnXML.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetColumnXML.qbl
new file mode 100644
index 0000000..308ed41
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetColumnXML.qbl
@@ -0,0 +1,56 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetColumnXML (
+  const constcontent LocalRows rows,
+  const LocalColumn column,
+  const Strings attributeNames,
+  String type
+) const as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    // rislai Jun-20-2024 (created)
+    columnXML := "";
+    cells := selectsortedset( column, LocalCell.astype( LocalCell_DemandComparison ), cell,
+                                  exists( rows,Elements,element,element = cell.LocalRow()), cell.LocalRow().Index());
+    if( type = "data" ){
+      columnXML := "";
+      if( column.IsAttrbuteColumn() ){
+        columnXML := "<column><name>" + column.Name() + "</name><type>String</type>"; 
+      }else{
+        columnXML := "<column><name>" + column.Name() + "</name><type>Number</type>"; 
+      }
+      traverse ( cells, Elements, cell ) {
+        traverse( attributeNames ,Elements,e ){
+          cellXML := '<cell value="' + cell.GetAttributeByName( e ) + '"/>'
+          columnXML := columnXML + cellXML;
+        }
+      }
+      columnXML := columnXML + "</column>";
+    }
+    if( type = "attribute" ){
+      columnXML1 := "<column><name>Product ID</name><type>String</type>";
+      columnXML2 := "<column><name>Attribute</name><type>String</type>";
+      
+      traverse ( cells, Elements, cell ) {
+        flag := true;
+        traverse( attributeNames ,Elements,e ){
+          if( flag ){
+            cellXML := '<cell value="' + cell.LocalRow().Name() + '"/>'
+            columnXML1 := columnXML1 + cellXML;
+            flag := false;
+          }else{
+            cellXML := '<cell value="  "/>'
+            columnXML1 := columnXML1 + cellXML;
+          }
+          cellXML := '<cell value="' + e + '"/>'
+          columnXML2 := columnXML2 + cellXML;
+        }
+      }
+      columnXML := columnXML1 + "</column>" + columnXML2 + "</column>";
+    }
+     
+    return columnXML;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/_ROOT_Type_LocalCell_DemandComparison.qbl b/_Main/BL/Type_LocalCell_DemandComparison/_ROOT_Type_LocalCell_DemandComparison.qbl
new file mode 100644
index 0000000..d141f48
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_DemandComparison/_ROOT_Type_LocalCell_DemandComparison.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LocalCell_DemandComparison
+{
+  #keys: '2[412672.0.1087844722][412672.0.1087844717]'
+  Parent: LocalCell
+  StructuredName: 'LocalCell_DemandComparisons'
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_Index.qbl b/_Main/BL/Type_LocalColumn/Attribute_Index.qbl
new file mode 100644
index 0000000..b7fb3ba
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[412672.0.1086931887][412672.0.1086931886][412672.0.1086931888]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_IsAttrbuteColumn.qbl b/_Main/BL/Type_LocalColumn/Attribute_IsAttrbuteColumn.qbl
new file mode 100644
index 0000000..a41fb0a
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_IsAttrbuteColumn.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsAttrbuteColumn
+{
+  #keys: '3[412672.0.1087874665][412672.0.1087874664][412672.0.1087874666]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_Name.qbl b/_Main/BL/Type_LocalColumn/Attribute_Name.qbl
new file mode 100644
index 0000000..2563e73
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[412672.0.1086931874][412672.0.1086931873][412672.0.1086931875]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalColumn/_ROOT_Type_LocalColumn.qbl b/_Main/BL/Type_LocalColumn/_ROOT_Type_LocalColumn.qbl
new file mode 100644
index 0000000..f15d615
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/_ROOT_Type_LocalColumn.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LocalColumn
+{
+  #keys: '5[412672.0.1084249599][412672.0.1084249597][0.0.0][412672.0.1084249598][412672.0.1084249600]'
+  BaseType: Object
+  StructuredName: 'LocalColumns'
+}
diff --git a/_Main/BL/Type_LocalRow/Attribute_CustomName.qbl b/_Main/BL/Type_LocalRow/Attribute_CustomName.qbl
new file mode 100644
index 0000000..26849a4
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Attribute_CustomName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomName
+{
+  #keys: '3[412672.0.1094515780][412672.0.1094515779][412672.0.1094515781]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalRow/Attribute_Index.qbl b/_Main/BL/Type_LocalRow/Attribute_Index.qbl
new file mode 100644
index 0000000..8aac77b
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[412672.0.1086931843][412672.0.1086931842][412672.0.1086931844]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LocalRow/Attribute_Name.qbl b/_Main/BL/Type_LocalRow/Attribute_Name.qbl
new file mode 100644
index 0000000..f53aa08
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[412672.0.1087844675][412672.0.1087844674][412672.0.1087844676]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalRow/Function_CalcName.qbl b/_Main/BL/Type_LocalRow/Function_CalcName.qbl
new file mode 100644
index 0000000..c3cbb48
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    
+    value := ifexpr( this.CustomName() = "",[String]this.Index(),this.CustomName() );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_LocalRow/_ROOT_Type_LocalRow.qbl b/_Main/BL/Type_LocalRow/_ROOT_Type_LocalRow.qbl
new file mode 100644
index 0000000..9c059f2
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/_ROOT_Type_LocalRow.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LocalRow
+{
+  #keys: '5[412672.0.1084249610][412672.0.1084249608][0.0.0][412672.0.1084249609][412672.0.1084249611]'
+  BaseType: Object
+  StructuredName: 'LocalRows'
+}
diff --git a/_Main/BL/Type_LocalTable/Attribute_Name.qbl b/_Main/BL/Type_LocalTable/Attribute_Name.qbl
new file mode 100644
index 0000000..feeb6a2
--- /dev/null
+++ b/_Main/BL/Type_LocalTable/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[412672.0.1094514009][412672.0.1094514008][412672.0.1094514010]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalTable/Attribute_RowIndexCache.qbl b/_Main/BL/Type_LocalTable/Attribute_RowIndexCache.qbl
new file mode 100644
index 0000000..117f3c1
--- /dev/null
+++ b/_Main/BL/Type_LocalTable/Attribute_RowIndexCache.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowIndexCache
+{
+  #keys: '3[412672.0.1086954704][412672.0.1086954703][412672.0.1086954705]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LocalTable/Method_GetRowIndexCache.qbl b/_Main/BL/Type_LocalTable/Method_GetRowIndexCache.qbl
new file mode 100644
index 0000000..eccdbc7
--- /dev/null
+++ b/_Main/BL/Type_LocalTable/Method_GetRowIndexCache.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetRowIndexCache () declarative as Number
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    this.RowIndexCache( this.RowIndexCache() + 1 );
+    
+    return this.RowIndexCache();
+  *]
+}
diff --git a/_Main/BL/Type_LocalTable/_ROOT_Type_LocalTable.qbl b/_Main/BL/Type_LocalTable/_ROOT_Type_LocalTable.qbl
new file mode 100644
index 0000000..67d59e9
--- /dev/null
+++ b/_Main/BL/Type_LocalTable/_ROOT_Type_LocalTable.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LocalTable
+{
+  #keys: '5[412672.0.1084249615][412672.0.1084249613][0.0.0][412672.0.1084249614][412672.0.1084249616]'
+  BaseType: Object
+  StructuredName: 'LocalTables'
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
new file mode 100644
index 0000000..64f77be
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IsAnyDurationContained (
+  DateTime start1,
+  DateTime end1,
+  DateTime start2,
+  DateTime end2
+) const declarative as Boolean
+{
+  TextBody:
+  [*
+    // rislai Jun-19-2024 (created)
+    return ( start1 <= start2 and end1 >= end2 ) or ( start2 <= start1 and end2 >= end1 );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityAGW.qbl b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityAGW.qbl
new file mode 100644
index 0000000..786db90
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityAGW.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UpperLimitOfTransferCapacityAGW
+{
+  #keys: '3[413988.0.1291510952][413988.0.1291510951][413988.0.1291510953]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityKW.qbl b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityKW.qbl
new file mode 100644
index 0000000..01784de
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityKW.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UpperLimitOfTransferCapacityKW
+{
+  #keys: '3[413988.0.1291510942][413988.0.1291510941][413988.0.1291510943]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityPL.qbl b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityPL.qbl
new file mode 100644
index 0000000..66d7b43
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityPL.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UpperLimitOfTransferCapacityPL
+{
+  #keys: '3[413988.0.1291510932][413988.0.1291510931][413988.0.1291510933]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKG.qbl b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKG.qbl
new file mode 100644
index 0000000..4154a27
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKG.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UpperLimitOfTransferCapacityZKG
+{
+  #keys: '3[413988.0.1291510909][413988.0.1291510908][413988.0.1291510910]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKM.qbl b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKM.qbl
new file mode 100644
index 0000000..1f5e8a7
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_UpperLimitOfTransferCapacityZKM.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UpperLimitOfTransferCapacityZKM
+{
+  #keys: '3[413988.0.1291510922][413988.0.1291510921][413988.0.1291510923]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_Period_MP/_ROOT_Type_Period_MP.qbl b/_Main/BL/Type_Period_MP/_ROOT_Type_Period_MP.qbl
new file mode 100644
index 0000000..414b2c8
--- /dev/null
+++ b/_Main/BL/Type_Period_MP/_ROOT_Type_Period_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Period_MP #extension
+{
+}
diff --git a/_Main/BL/Type_RecycleBin/StaticMethod_OnLogin.qbl b/_Main/BL/Type_RecycleBin/StaticMethod_OnLogin.qbl
new file mode 100644
index 0000000..ef7f037
--- /dev/null
+++ b/_Main/BL/Type_RecycleBin/StaticMethod_OnLogin.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnLogin () as Key
+{
+  TextBody:
+  [*
+    // lihongji May-15-2024 (created)
+    folder := DomainModel::Domain().MDSFolderDefinitions().FindFolder( "/root" );
+    
+    datasetName := typeof( RecycleBin ).Name() + "_" + QuintiqUser::CurrentUser().ShortName();
+    
+    oinfo := MDSEditor::Editor().ObjectInfos( typeof( RecycleBin ).Name(), folder.FolderID(), datasetName );
+    
+    o := select( oinfo, Elements, o, o.IsLoaded() );
+    emptydataset := isnull( o );
+    
+    key := Key::ZeroKey();
+    if ( emptydataset ) {
+      mdsrb := MDSRecycleBin::CreateMDS( datasetName, DMF_Utility::StorageState_MemoryOnly() );
+      key   := mdsrb.MDSID();
+    } else {
+      MDSRecycleBin::LoadMDSAndConvert( o.MDSID(), DMF_Utility::StorageState_MemoryOnly() );
+      key   := o.MDSID().MDSKey();
+    }
+    
+    return key;
+  *]
+}
diff --git a/_Main/BL/Type_RecycleBin/_ROOT_Type_RecycleBin.qbl b/_Main/BL/Type_RecycleBin/_ROOT_Type_RecycleBin.qbl
new file mode 100644
index 0000000..fadca01
--- /dev/null
+++ b/_Main/BL/Type_RecycleBin/_ROOT_Type_RecycleBin.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type RecycleBin
+{
+  #keys: '5[412672.0.1084213474][412672.0.1084213472][0.0.0][412672.0.1084213473][412672.0.1084213475]'
+  BaseType: Object
+  StructuredName: 'RecycleBins'
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_Color.qbl b/_Main/BL/Type_ShiftPlan/Attribute_Color.qbl
new file mode 100644
index 0000000..506c548
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_Color.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Color
+{
+  #keys: '3[412672.0.1082947207][412672.0.1082947206][412672.0.1082947208]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_CustomRemark.qbl b/_Main/BL/Type_ShiftPlan/Attribute_CustomRemark.qbl
new file mode 100644
index 0000000..ad2224c
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_CustomRemark.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomRemark
+{
+  #keys: '3[412672.0.1067124406][412672.0.1067124405][412672.0.1067124407]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_EventType.qbl b/_Main/BL/Type_ShiftPlan/Attribute_EventType.qbl
new file mode 100644
index 0000000..b8f0791
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_EventType.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EventType
+{
+  #keys: '3[412672.0.1082947252][412672.0.1082947251][412672.0.1082947253]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_Outcome.qbl b/_Main/BL/Type_ShiftPlan/Attribute_Outcome.qbl
new file mode 100644
index 0000000..9770e27
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_Outcome.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Outcome
+{
+  #keys: '3[412672.0.1066680021][412672.0.1066680020][412672.0.1066680022]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_Remark.qbl b/_Main/BL/Type_ShiftPlan/Attribute_Remark.qbl
new file mode 100644
index 0000000..7837726
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_Remark.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Remark
+{
+  #keys: '3[412672.0.1066680031][412672.0.1066680030][412672.0.1066680032]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcColor.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcColor.qbl
new file mode 100644
index 0000000..1204e8d
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcColor.qbl
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcColor
+{
+  TextBody:
+  [*
+    // rislai Jun-19-2024 (created)
+    // Red,Cyan,LightBlue,LightOrange
+    // 娉曞畾鑺傚亣鏃ワ紝鏄熸湡鍏紝鏄熸湡鏃ワ紝璋冧紤
+    value := "White"
+    if( this.EventType() = "鍛ㄥ叚"){
+      value := "Cyan";
+    }
+    if( this.EventType() = "鍛ㄦ棩"){
+      value := "LightBlue";
+    }
+    if( this.EventType() = "娉曞畾鑺傚亣鏃�"){
+      value := "Red";
+    }
+    if( this.EventType() = "璋冧紤"){
+      value := "LightOrange";
+    }
+    
+    
+    this.Color( value );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcEventType.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcEventType.qbl
new file mode 100644
index 0000000..b480033
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcEventType.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcEventType
+{
+  TextBody:
+  [*
+    // rislai Jun-19-2024 (created)
+    value := this.CalculateEventType();
+    
+    this.EventType( value );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcOutcome.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcOutcome.qbl
new file mode 100644
index 0000000..ebcf5a3
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcOutcome.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcOutcome
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+    capacity := ifexpr( this.UnitPeriodTime().IsUtilizationInUOM(), [Real]this.UnitPeriodTime().UsedCapacity().HoursAsReal(),  this.UnitPeriodTime().UtilizationPercentage() * this.UnitPeriodTime().MaximumLoadPercentage() / 100 ) 
+    
+    value := ifexpr( capacity = 0,"", this.UnitPeriodTime().ShiftPatternName());
+    
+    this.Outcome( value );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcRemark.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcRemark.qbl
new file mode 100644
index 0000000..a3739d1
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcRemark.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcRemark
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+    
+    value := ifexpr( this.CustomRemark() = "",this.CalculateRemark( ),this.CustomRemark());
+    
+    this.Remark( value );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Method_CalculateEventType.qbl b/_Main/BL/Type_ShiftPlan/Method_CalculateEventType.qbl
new file mode 100644
index 0000000..cc7ee8d
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Method_CalculateEventType.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+Method CalculateEventType () const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-19-2024 (created)
+    values := construct( Strings );
+    
+    traverse( this.UnitPeriodTime().Unit().UnitCalendar(),Participation,participation,participation.Event().Type() = LibCal_Event::TYPE_UNAVAILABLE()){
+        event := participation.Event();
+        
+        if( this.UnitPeriodTime().Start().Date() >= event.EarliestStart() and this.UnitPeriodTime().End().Date() <= event.LatestEnd() ){
+          intervals := selectset( event,LeadingParticipation.ExplicitTimeInterval,interval,LocalTool::IsAnyDurationContained( interval.Start(),interval.End(),this.UnitPeriodTime().Start(),this.UnitPeriodTime().End()));
+        
+          traverse( intervals,Elements,interval){
+            values.Add( ifexpr( isnull( interval.Participation().Event().EventType().Parent()),interval.Participation().Event().EventType().ID(),interval.Participation().Event().EventType().Parent().ID() ));
+          }
+        }
+    }
+    values := selectuniquevalues( values,Elements,value,true,value );
+    
+    result := "";
+    flag := true;
+    traverse( values,Elements,value ,flag){
+      if( value = "璋冧紤" and result <> "璋冧紤"){
+        result := "璋冧紤"; 
+      }else if( value = "娉曞畾鑺傚亣鏃�" and result <> "娉曞畾鑺傚亣鏃�"){
+        result := "娉曞畾鑺傚亣鏃�";
+      }else if( value = "鍛ㄥ叚" and result <> "鍛ㄥ叚"){
+        result := "鍛ㄥ叚";
+      }else if( value = "鍛ㄦ棩" and result <> "鍛ㄦ棩"){
+        result := "鍛ㄦ棩";
+      }
+    }
+    
+    return result;
+  *]
+}
diff --git "a/_Main/BL/Type_ShiftPlan/Method_CalculateRemark\043503.qbl" "b/_Main/BL/Type_ShiftPlan/Method_CalculateRemark\043503.qbl"
new file mode 100644
index 0000000..785167e
--- /dev/null
+++ "b/_Main/BL/Type_ShiftPlan/Method_CalculateRemark\043503.qbl"
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method CalculateRemark () const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+    values := construct( Strings );
+    
+    traverse( this.UnitPeriodTime().Unit().UnitCalendar(),Participation,participation,participation.Event().Type() = LibCal_Event::TYPE_UNAVAILABLE()){
+        event := participation.Event();
+        
+        if( this.UnitPeriodTime().Start().Date() >= event.EarliestStart() and this.UnitPeriodTime().End().Date() <= event.LatestEnd() ){
+          intervals := selectset( event,LeadingParticipation.ExplicitTimeInterval,interval,LocalTool::IsAnyDurationContained( interval.Start(),interval.End(),this.UnitPeriodTime().Start(),this.UnitPeriodTime().End()));
+        
+          traverse( intervals,Elements,interval){
+            values.Add( interval.Participation().Event().Subject() );
+          }
+        }
+    }
+    values := selectuniquevalues( values,Elements,value,true,value );
+    
+    result := "";
+    traverse( values,Elements,value ){
+      result := result + value + ";";
+    }
+    
+    return ifexpr( result = "",result,result.SubString( 0,result.Length() - 1 ) );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Method_GetAttributeByName.qbl b/_Main/BL/Type_ShiftPlan/Method_GetAttributeByName.qbl
new file mode 100644
index 0000000..7499588
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Method_GetAttributeByName.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetAttributeByName (
+  String attributeName
+) const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    value := "";
+    if( attributeName = "Remark" ){
+      value := this.Remark();
+    }
+    if( attributeName = "Outcome" ){
+      value := this.Outcome();
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/Method_SetRemark.qbl b/_Main/BL/Type_ShiftPlan/Method_SetRemark.qbl
new file mode 100644
index 0000000..b053ac7
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Method_SetRemark.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetRemark (
+  String remark
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+    this.CustomRemark( remark );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/StaticMethod_AsyncExport.qbl b/_Main/BL/Type_ShiftPlan/StaticMethod_AsyncExport.qbl
new file mode 100644
index 0000000..512fbb5
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/StaticMethod_AsyncExport.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AsyncExport (
+  RecycleBin recycleBin,
+  const constcontent Units rows,
+  const constcontent Period_MPs columns
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    sortColumns := selectsortedset( columns,Elements,column,true,column.StartDate());
+    
+    attributeNames := ShiftPlan::GetAttributeNames();
+    
+    columnstring := emit( "" );
+    flag := true;
+    traverse( sortColumns,Elements,sortColumn ){
+      if( flag ){
+        attributeXML := rows -> ShiftPlan::GetShiftPlanColumnXML( sortColumn,attributeNames,"attribute" );
+        columnstring := columnstring.Merge( attributeXML )
+        flag := false;
+      }
+      
+      cellxml := rows -> ShiftPlan::GetShiftPlanColumnXML( sortColumn,attributeNames ,"data");
+      columnstring := columnstring.Merge( cellxml);
+    }
+     
+    columnstring -> GroupAll() -> ExportXMLManager::AwaitShiftPlanXMLData( recycleBin );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/StaticMethod_Create.qbl b/_Main/BL/Type_ShiftPlan/StaticMethod_Create.qbl
new file mode 100644
index 0000000..ec16091
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/StaticMethod_Create.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  UnitPeriodTime owner
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-17-2024 (created)
+    owner.ShiftPlan( relnew );
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/StaticMethod_GetAttributeNames.qbl b/_Main/BL/Type_ShiftPlan/StaticMethod_GetAttributeNames.qbl
new file mode 100644
index 0000000..45efe8a
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/StaticMethod_GetAttributeNames.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetAttributeNames () const declarative as owning Strings
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    attributeNames := construct( Strings );
+    
+    attributeNames.Add( "Outcome" );
+    attributeNames.Add( "Remark" );
+    
+    return &attributeNames;
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/StaticMethod_GetShiftPlanColumnXML.qbl b/_Main/BL/Type_ShiftPlan/StaticMethod_GetShiftPlanColumnXML.qbl
new file mode 100644
index 0000000..fe8b685
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/StaticMethod_GetShiftPlanColumnXML.qbl
@@ -0,0 +1,50 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetShiftPlanColumnXML (
+  const constcontent Units rows,
+  const Period_MP column,
+  const Strings attributeNames,
+  String type
+) const as String
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    columnXML := "";
+    cells := selectsortedset( column, UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, cell,
+                                  exists( rows,Elements,element,element = cell.UnitPeriodTime().Unit()), cell.UnitPeriodTime().Unit().ID());
+    if( type = "data" ){
+      columnXML := "<column><name>" + column.StartDate().Format( "Y-M2-D2 ")+ "</name><type>String</type>";
+      traverse ( cells, Elements, cell ) {
+        traverse( attributeNames ,Elements,e ){
+          cellXML := '<cell value="' + cell.GetAttributeByName( e ) + '"/>'
+          columnXML := columnXML + cellXML;
+        }
+      }
+      columnXML := columnXML + "</column>";
+    }
+    if( type = "attribute" ){
+      columnXML1 := "<column><name>Unit</name><type>String</type>";
+      columnXML2 := "<column><name>Attribute</name><type>String</type>";
+      
+      traverse ( cells, Elements, cell ) {
+        flag := true;
+        traverse( attributeNames ,Elements,e ){
+          if( flag ){
+            cellXML := '<cell value="' + cell.UnitPeriodTime().Unit().ID() + '"/>'
+            columnXML1 := columnXML1 + cellXML;
+            flag := false;
+          }else{
+            cellXML := '<cell value="  "/>'
+            columnXML1 := columnXML1 + cellXML;
+          }
+          cellXML := '<cell value="' + e + '"/>'
+          columnXML2 := columnXML2 + cellXML;
+        }
+      }
+      columnXML := columnXML1 + "</column>" + columnXML2 + "</column>";
+    }
+     
+    return columnXML;
+  *]
+}
diff --git a/_Main/BL/Type_ShiftPlan/_ROOT_Type_ShiftPlan.qbl b/_Main/BL/Type_ShiftPlan/_ROOT_Type_ShiftPlan.qbl
new file mode 100644
index 0000000..e553d34
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/_ROOT_Type_ShiftPlan.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShiftPlan
+{
+  #keys: '5[412672.0.1057415075][412672.0.1057415073][0.0.0][412672.0.1057415074][412672.0.1057415076]'
+  BaseType: Object
+  StructuredName: 'ShiftPlans'
+}
diff --git a/_Main/BL/Type_Test/StaticMethod_Test.qbl b/_Main/BL/Type_Test/StaticMethod_Test.qbl
index 5a0ddf8..e2e3fe5 100644
--- a/_Main/BL/Type_Test/StaticMethod_Test.qbl
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -3,15 +3,42 @@
 StaticMethod Test (
   ScenarioManager scenarioManager,
   MacroPlan macroPlan,
-  Archive archive
+  Archive archive,
+  RecycleBin recycleBin
 )
 {
   TextBody:
   [*
     // rislai Jun-9-2024 (created)
+    baseVersion := select( archive,ArchivePR,pr,true );
+    baseVersionFile := OSFile::Construct();
+    baseVersionFile.Open( baseVersion.FilePath(), "Read", false );
+    baseVersionBinaryData := baseVersionFile.ReadBinary();
+    baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionBinaryData, baseVersion.FilePath() );
+    baseVersionDataSource.ReadStructure();
     
-    traverse( macroPlan,Routing,rt ){
-      rt.UphillRouting( relflush ); 
-    }
+    baseVersionTables := selectset( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+    
+    baseVersionTable := baseVersionTables.Element( 0 );
+    
+    baseVersionRow := select( baseVersionTable, GeneralExcelImportAndExportDataRow, tempGEIAEDR, tempGEIAEDR.RowNr() = 999 );
+    
+    info( isnull( baseVersionRow ));
+    
+    
+    //testTree := NamedValueTree::Create();
+    //
+    //testTreeHandel := testTree.GetHandle( "test1" );
+    //testTreeHandel2 := testTree.GetHandle( "test2" );
+    //
+    //testTree.Root().AddChild( testTreeHandel,1 );
+    //
+    //info( testTree.Root().Child( testTreeHandel ).GetValueAsNumber() );
+    //try{
+    //  info( testTree.Root().Child( testTreeHandel2 ).GetValueAsNumber() ); 
+    //}onerror{
+    //  testTree.Root().AddChild( testTreeHandel,2 );
+    //}
+    //info( testTree.Root().Child( testTreeHandel ).GetValueAsNumber() );
   *]
 }
diff --git a/_Main/BL/Type_TransferPlanCell/Attribute_Value.qbl b/_Main/BL/Type_TransferPlanCell/Attribute_Value.qbl
new file mode 100644
index 0000000..d398224
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanCell/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[413988.0.1292032065][413988.0.1292032064][413988.0.1292032066]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanCell/StaticMethod_GenerateReport.qbl b/_Main/BL/Type_TransferPlanCell/StaticMethod_GenerateReport.qbl
new file mode 100644
index 0000000..3fa0a72
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanCell/StaticMethod_GenerateReport.qbl
@@ -0,0 +1,71 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateReport (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    macroPlan.TransferPlanRow( relflush );
+    macroPlan.TransferPlanColumn( relflush );
+    
+    rowNr := 0;
+    
+    // 鐢熸垚璋冩嫧璁″垝
+    traverse ( macroPlan, Unit, u, u.HasCapacityTypeTransportQuantity() ) {
+      traverse ( u, Lane.LaneLeg.Trip, t ) {
+        traverse ( t, ProductInTrip, pit, pit.Quantity() > 0.0 ) {
+          // 鎵捐
+          tpr := TransferPlanRow::FindTransferPlanRowTypeIndex( t.LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().Name(),
+                                                                t.LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().Name(),
+                                                                pit.Product_MP().ID() );
+          if ( isnull( tpr ) ) {
+            tpr := macroPlan.TransferPlanRow( relnew, 
+                                              RowNr                   := rowNr,
+                                              SourceStockpoingPointID := t.LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().Name(),
+                                              TargetStockpoingPointID := t.LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().Name(),
+                                              ProductID               := pit.Product_MP().ID() );     
+          }
+          
+          // 鎵惧垪
+          tpc := TransferPlanColumn::FindTransferPlanColumnTypeIndex( t.Departure().Date() );
+          if ( isnull( tpc ) ) {
+            tpc := macroPlan.TransferPlanColumn( relnew,
+                                                 ColumnDate := t.Departure().Date() );
+          }
+          
+          // 璧嬪�煎崟鍏冩牸
+          cell := select( tpc, TransferPlanCell, tempTPC, tempTPC.TransferPlanRow() = tpr );
+          if ( isnull( cell ) ) {
+            cell := tpc.TransferPlanCell( relnew, Value := [String]pit.Quantity().Round( 0 ) );
+            cell.TransferPlanRow( relset, tpr );
+          } else {
+            cell.Value( [String] ( [Number]cell.Value() + pit.Quantity().Round( 0 ) ) );
+          }
+        }
+      }
+    }
+    
+    // 琛ラ綈绌哄垪
+    indexDate := minselect( macroPlan, TransferPlanColumn, tempTPC, true, tempTPC.ColumnDate() ).ColumnDate();
+    endDate   := maxselect( macroPlan, TransferPlanColumn, tempTPC, true, tempTPC.ColumnDate() ).ColumnDate();
+    while ( indexDate <= endDate ) {
+      if ( isnull( TransferPlanColumn::FindTransferPlanColumnTypeIndex( indexDate ) ) ) {
+        macroPlan.TransferPlanColumn( relnew,
+                                      ColumnDate := indexDate );
+      }
+      indexDate := indexDate + 1;
+    }
+    
+    
+    // 鐢熸垚浜у搧鍒�
+    minDateTPC := macroPlan.TransferPlanColumn( relnew,
+                                                ColumnDate := Date::MinDate() );
+    traverse ( macroPlan, TransferPlanRow, tpr ) {
+      productCell := minDateTPC.TransferPlanCell( relnew, Value := tpr.ProductID() );
+      productCell.TransferPlanRow( relset, tpr );
+    }
+    
+    // 璋冩嫧鏁伴噺璋冩暣
+  *]
+}
diff --git a/_Main/BL/Type_TransferPlanCell/_ROOT_Type_TransferPlanCell.qbl b/_Main/BL/Type_TransferPlanCell/_ROOT_Type_TransferPlanCell.qbl
new file mode 100644
index 0000000..9aff6e7
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanCell/_ROOT_Type_TransferPlanCell.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TransferPlanCell
+{
+  #keys: '5[413988.0.1292031923][413988.0.1292031921][0.0.0][413988.0.1292031922][413988.0.1292031924]'
+  BaseType: Object
+  StructuredName: 'TransferPlanCells'
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnDate.qbl b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnDate.qbl
new file mode 100644
index 0000000..86ce75b
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnDate
+{
+  #keys: '3[413988.0.1292032055][413988.0.1292032054][413988.0.1292032056]'
+  IsReadOnly: true
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnIndex.qbl b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnIndex.qbl
new file mode 100644
index 0000000..7b327f5
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnIndex
+{
+  #keys: '3[413988.0.1292032025][413988.0.1292032024][413988.0.1292032026]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnName.qbl b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnName.qbl
new file mode 100644
index 0000000..a664e11
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/Attribute_ColumnName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnName
+{
+  #keys: '3[413988.0.1292032045][413988.0.1292032044][413988.0.1292032046]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/Function_CalcColumnName.qbl b/_Main/BL/Type_TransferPlanColumn/Function_CalcColumnName.qbl
new file mode 100644
index 0000000..61e2036
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/Function_CalcColumnName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcColumnName
+{
+  TextBody:
+  [*
+    // lihongji Jun-24-2024 (created)
+    
+    value := ifexpr( this.ColumnDate().IsMinInfinity(), "", this.ColumnDate().Format( "Y/M2/D2" ) );
+    
+    this.ColumnName( value );
+  *]
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/TypeIndex_TransferPlanColumnTypeIndex.qbl b/_Main/BL/Type_TransferPlanColumn/TypeIndex_TransferPlanColumnTypeIndex.qbl
new file mode 100644
index 0000000..eb1cf36
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/TypeIndex_TransferPlanColumnTypeIndex.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex TransferPlanColumnTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ColumnDate
+    }
+  ]
+}
diff --git a/_Main/BL/Type_TransferPlanColumn/_ROOT_Type_TransferPlanColumn.qbl b/_Main/BL/Type_TransferPlanColumn/_ROOT_Type_TransferPlanColumn.qbl
new file mode 100644
index 0000000..49de9fe
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanColumn/_ROOT_Type_TransferPlanColumn.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TransferPlanColumn
+{
+  #keys: '5[413988.0.1292031918][413988.0.1292031916][0.0.0][413988.0.1292031917][413988.0.1292031919]'
+  BaseType: Object
+  StructuredName: 'TransferPlanColumns'
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Attribute_Name.qbl b/_Main/BL/Type_TransferPlanRow/Attribute_Name.qbl
new file mode 100644
index 0000000..e0be8b2
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[413988.0.1292032011][413988.0.1292032010][413988.0.1292032012]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Attribute_ProductID.qbl b/_Main/BL/Type_TransferPlanRow/Attribute_ProductID.qbl
new file mode 100644
index 0000000..6135603
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Attribute_ProductID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[413988.0.1292031981][413988.0.1292031980][413988.0.1292031982]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Attribute_RowNr.qbl b/_Main/BL/Type_TransferPlanRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..be1fa8f
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[413988.0.1292032032][413988.0.1292032031][413988.0.1292032033]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Attribute_SourceStockpoingPointID.qbl b/_Main/BL/Type_TransferPlanRow/Attribute_SourceStockpoingPointID.qbl
new file mode 100644
index 0000000..63873ca
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Attribute_SourceStockpoingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SourceStockpoingPointID
+{
+  #keys: '3[413988.0.1292031991][413988.0.1292031990][413988.0.1292031992]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Attribute_TargetStockpoingPointID.qbl b/_Main/BL/Type_TransferPlanRow/Attribute_TargetStockpoingPointID.qbl
new file mode 100644
index 0000000..dfec058
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Attribute_TargetStockpoingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TargetStockpoingPointID
+{
+  #keys: '3[413988.0.1292032001][413988.0.1292032000][413988.0.1292032002]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferPlanRow/Function_CalcName.qbl b/_Main/BL/Type_TransferPlanRow/Function_CalcName.qbl
new file mode 100644
index 0000000..30e44df
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // lihongji Jun-24-2024 (created)
+    
+    value := this.SourceStockpoingPointID() + " to " + this.TargetStockpoingPointID();
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_TransferPlanRow/TypeIndex_TransferPlanRowTypeIndex.qbl b/_Main/BL/Type_TransferPlanRow/TypeIndex_TransferPlanRowTypeIndex.qbl
new file mode 100644
index 0000000..9ac1725
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/TypeIndex_TransferPlanRowTypeIndex.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex TransferPlanRowTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: SourceStockpoingPointID
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: TargetStockpoingPointID
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: ProductID
+    }
+  ]
+}
diff --git a/_Main/BL/Type_TransferPlanRow/_ROOT_Type_TransferPlanRow.qbl b/_Main/BL/Type_TransferPlanRow/_ROOT_Type_TransferPlanRow.qbl
new file mode 100644
index 0000000..68692d7
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanRow/_ROOT_Type_TransferPlanRow.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TransferPlanRow
+{
+  #keys: '5[413988.0.1292031913][413988.0.1292031911][0.0.0][413988.0.1292031912][413988.0.1292031914]'
+  BaseType: Object
+  StructuredName: 'TransferPlanRows'
+}
diff --git a/_Main/BL/Type_UnitPeriodTime/Method_OnCreate.qbl b/_Main/BL/Type_UnitPeriodTime/Method_OnCreate.qbl
new file mode 100644
index 0000000..1300ba6
--- /dev/null
+++ b/_Main/BL/Type_UnitPeriodTime/Method_OnCreate.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnCreate #extension
+{
+  TextBody:
+  [*
+    // rislai Jun-18-2024 (created)
+    ShiftPlan::Create( this );
+  *]
+}
diff --git a/_Main/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl b/_Main/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl
new file mode 100644
index 0000000..ad74069
--- /dev/null
+++ b/_Main/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization UnitPeriodTime #extension
+{
+}
diff --git a/_Main/Sys/Repr/Global/Date.qrp b/_Main/Sys/Repr/Global/Date.qrp
index e6ffd89..5173e05 100644
--- a/_Main/Sys/Repr/Global/Date.qrp
+++ b/_Main/Sys/Repr/Global/Date.qrp
@@ -8,7 +8,7 @@
   ]
   DataRepresentation.Default
   {
-    FormatString: 'D-MM-YOnMax(-)OnMin(-)'
+    FormatString: 'Y-M2-D2OnMax(-)OnMin(-)'
     InheritFormatting: false
   }
 }
diff --git a/_Main/Sys/Repr/Global/DateTime.qrp b/_Main/Sys/Repr/Global/DateTime.qrp
index 354990c..c84be85 100644
--- a/_Main/Sys/Repr/Global/DateTime.qrp
+++ b/_Main/Sys/Repr/Global/DateTime.qrp
@@ -8,7 +8,7 @@
   ]
   DataRepresentation.Default
   {
-    FormatString: 'D-MM-YOnMax(-)OnMin(-)'
+    FormatString: 'Y-M2-D2 H2:m:sOnMax(-)OnMin(-)'
     InheritFormatting: false
   }
 }
diff --git a/_Main/Sys/Repr/Global/ShiftPlan.qrp b/_Main/Sys/Repr/Global/ShiftPlan.qrp
new file mode 100644
index 0000000..661a54a
--- /dev/null
+++ b/_Main/Sys/Repr/Global/ShiftPlan.qrp
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: #root
+TypeRepresentation ShiftPlan
+{
+  AttributeRepresentation Remark
+  {
+    AttributeKey: '[412672.0.1066680030]'
+    Conditional:
+    [
+      DataRepresentation.Conditional
+      {
+        BackgroundColor: '$FFCC99'
+        ConditionBody: 'object.Color() = "LightOrange"'
+        ConversionBody: ''
+        DefaultBackgroundColor: false
+        InheritConversion: false
+      }
+      DataRepresentation.Conditional
+      {
+        BackgroundColor: 'Red'
+        ConditionBody: 'object.Color() = "Red"'
+        ConversionBody: ''
+        DefaultBackgroundColor: false
+        InheritConversion: false
+      }
+      DataRepresentation.Conditional
+      {
+        BackgroundColor: '$33CCCC'
+        ConditionBody: 'object.Color() = "Cyan"'
+        ConversionBody: ''
+        DefaultBackgroundColor: false
+        InheritConversion: false
+      }
+      DataRepresentation.Conditional
+      {
+        BackgroundColor: '$99CCFF'
+        ConditionBody: 'object.Color() = "LightBlue"'
+        ConversionBody: ''
+        DefaultBackgroundColor: false
+        InheritConversion: false
+      }
+    ]
+  }
+  RelationRepresentation UnitPeriodTime { RelationKey: '[412672.0.1066680008]' Visibility: 'Normal' }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPlanViews.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPlanViews.def
new file mode 100644
index 0000000..ad37324
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPlanViews.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component ActionBarGroupPlanViews #extension
+{
+  Children:
+  [
+    Component ButtonShiftPlan
+    {
+      #keys: '[412672.0.1064451018]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COMPASSES'
+        Label: '鐝璁″垝'
+        Taborder: 8
+      ]
+    }
+  ]
+}
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..062b204
--- /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 ButtonScenarioComparisonDemandComparison
+    {
+      #keys: '[412672.0.1090347286]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EQUALS'
+        Label: '闇�姹傚姣�'
+        Taborder: 8
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def
new file mode 100644
index 0000000..456f8a2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+Component ActionBarPagePlan #extension
+{
+  Children:
+  [
+    #child: ActionBarGroupPlanViews
+    #child: abgSecondDevelopmentPlan
+  ]
+}
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_abgSecondDevelopmentPlan.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
new file mode 100644
index 0000000..c40d27d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+Component abgSecondDevelopmentPlan
+{
+  #keys: '[413988.0.1290310419]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component bTransferPlan
+    {
+      #keys: '[413988.0.1290300652]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'HAND_TRUCK_BOX'
+        Label: 'Transfer plan'
+        Taborder: 0
+      ]
+    }
+    Component bBlank
+    {
+      #keys: '[413988.0.1291640400]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Category: 'Actions-2'
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_OnCreated.def
new file mode 100644
index 0000000..f3b6863
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_OnCreated.def
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnCreated () id:Method_ApplicationMacroPlanner_OnCreated #extension
+{
+  Body:
+  [*
+    // On created of Application
+    
+    // Restore active MacroPlan scenario to DataHolderActiveScenario 
+    // and Dropdown
+    if( not isnull( ScenarioManager ) )
+    {
+      if( not isnull( MacroPlan ) )
+      {
+        scenario := select( ScenarioManager, ScenarioMP, sce, 
+                            sce.DatasetMDSID() = MacroPlan.MDSID() )
+        
+        if( not isnull( scenario ) )
+        {
+          DataHolderActiveScenario.Data( scenario );
+          DataHolderMacroPlanner.Data( MacroPlan );
+        }
+      }
+    }
+    // Sync user and roles ( sync during fresh startup without scenario creation )
+    if( not isnull( SWF_WorkflowDataset ) )
+    {
+      SWF_WorkflowDataset.OnUserLogin();
+    }
+    
+    mdsidkey := RecycleBin::OnLogin();
+    
+    componentmds := ApplicationScope.ComponentMDS();
+    mdsinstance := select( componentmds, ComponentMDSKinds.ComponentMDSInstances, m, m.MDSID().MDSKey() = mdsidkey );
+    if ( not isnull( mdsinstance ) and not mdsinstance.IsSelected() ) {
+      mdsinstance.ComponentMDSKind().SelectInstance( mdsinstance );
+      componentmds.Apply();
+    }
+    
+    DataHolderCurrentUser.Data( QuintiqUser::CurrentUser().ShortName() );
+    // Also open a default view
+    ApplicationMacroPlanner.OpenView( 'Scenarios', ButtonScenarios1 );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def
index 563d822..ea79d88 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def
@@ -9,7 +9,9 @@
   {
     Body:
     [*
-      Test::Test( ScenarioManager,MacroPlan,Archive );
+      Test::Test( ScenarioManager,MacroPlan,Archive,RecycleBin );
+      
+      WebMessageBox::Success( "Success");
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick.def
new file mode 100644
index 0000000..d62db6c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupPlanViews/ButtonShiftPlan
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick
+{
+  #keys: '[412672.0.1067373094]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationMacroPlanner.OpenView( 'ShiftPlan', this );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupScenarioComparisonViews_ButtonScenarioCo.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupScenarioComparisonViews_ButtonScenarioCo.def
new file mode 100644
index 0000000..b8c7979
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupScenarioComparisonViews_ButtonScenarioCo.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupScenarioComparisonViews/ButtonScenarioComparisonDemandComparison
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupScenarioComparisonViews_ButtonScenarioComparisonDemandComparison_OnClick
+{
+  #keys: '[412672.0.1090347405]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'DemandComparison', this );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bTransferPlan_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bTransferPlan_OnClick.def
new file mode 100644
index 0000000..af99f70
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bTransferPlan_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: abgSecondDevelopmentPlan/bTransferPlan
+Response OnClick () id:Response_MacroPlanner_abgSecondDevelopmentPlan_bTransferPlan_OnClick
+{
+  #keys: '[413988.0.1290322113]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "TransferPlan", true);
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index d05a449..e01fbb6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -18,7 +18,9 @@
         #child: applicationFixedPageActionBarPageDef
         #child: applicationDevelopmentActionBarPageDef_1
         #child: abpAlgorithmPostProcessing
+        #child: ActionBarPagePlan
         #child: ActionBarPageReport
+        #child: ActionBarPageScenarioComparison
       ]
     }
     Component dhBinaryDataPR id:dhBinaryDataPR_688
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlActions.def
new file mode 100644
index 0000000..7ac917e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1292313213]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1292313217]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1292313219]'
+      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_DialogUpperLimitOfTransferCapacity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlContent.def
new file mode 100644
index 0000000..d0331a8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Component_pnlContent.def
@@ -0,0 +1,64 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1292313211]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component npUpperLimitOfTransferCapacityZKG
+    {
+      #keys: '[413988.0.1292313261]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        Label: 'ZKG(pcs)'
+        Taborder: 0
+      ]
+    }
+    Component npUpperLimitOfTransferCapacityZKM
+    {
+      #keys: '[413988.0.1292313339]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        Label: 'ZKM(pcs)'
+        Taborder: 1
+      ]
+    }
+    Component npUpperLimitOfTransferCapacityPL
+    {
+      #keys: '[413988.0.1292313341]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        Label: 'PL(pcs)'
+        Taborder: 2
+      ]
+    }
+    Component npUpperLimitOfTransferCapacityKW
+    {
+      #keys: '[413988.0.1292313343]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        Label: 'KW(pcs)'
+        Taborder: 3
+      ]
+    }
+    Component npUpperLimitOfTransferCapacityAGW
+    {
+      #keys: '[413988.0.1292313345]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        Label: 'AGW(pcs)'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..2917a99
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/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: '[413988.0.1292313223]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..14ca6da
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1292313222]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ApplyChanges();
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/_ROOT_Component_DialogUpperLimitOfTransferCapacity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/_ROOT_Component_DialogUpperLimitOfTransferCapacity.def
new file mode 100644
index 0000000..338e32f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogUpperLimitOfTransferCapacity/_ROOT_Component_DialogUpperLimitOfTransferCapacity.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogUpperLimitOfTransferCapacity
+{
+  #keys: '[413988.0.1292313209]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_MatrixEditorTimeCapacities\043656.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_MatrixEditorTimeCapacities\043656.def"
new file mode 100644
index 0000000..b5fa1e7
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_MatrixEditorTimeCapacities\043656.def"
@@ -0,0 +1,119 @@
+Quintiq file version 2.0
+Component MatrixEditorTimeCapacities id:MatrixEditorTimeCapacities_656
+{
+  #keys: '[412672.0.1064460829]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellUnitPeriodTime
+    {
+      #keys: '[412672.0.1064460830]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorUnitPeriodTime
+        {
+          #keys: '[412672.0.1064460831]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Unit]'
+            Source: 'ApplicationMacroPlanner.DataHolderUnit'
+            Taborder: 0
+            Transformation: 'Elements.UnitPeriod.astype(UnitPeriodTime).ShiftPlan'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Outcome;Remark'
+        Column: 'UnitPeriodTime.Period_MP'
+        Row: 'UnitPeriodTime.Unit'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsUnit
+    {
+      #keys: '[412672.0.1064460832]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorUnit
+        {
+          #keys: '[412672.0.1064460833]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Unit]'
+            FixedFilter: 'object.HasCapacityTypeTime()'
+            Source: 'ApplicationMacroPlanner.DataHolderUnit'
+            Taborder: 0
+            Transformation: 'Elements.astype(Unit)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'DisplayIndex'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsPeriod
+    {
+      #keys: '[412672.0.1064460834]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorPeriod
+        {
+          #keys: '[412672.0.1064460835]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Period_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderPeriods'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'StartDate'
+        SortCriteria: 'StartDate'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTime_1
+    #child: matrixeditorContextMenuTime_1
+  ]
+  Properties:
+  [
+    AllowAttributeConfiguration: true
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumnsPeriod'
+    ContextMenu: 'matrixeditorContextMenuTime'
+    Rows: 'MatrixEditorRowsUnit'
+    ShowSingleAttribute: true
+    Taborder: 1
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_MatrixEditorTimeCapacities_656_WebMenu_OnClick
+    {
+      #keys: '[412672.0.1064460817]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[4387.0.17266428]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_PanelMatrix\043675.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_PanelMatrix\043675.def"
new file mode 100644
index 0000000..963478f
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_PanelMatrix\043675.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelMatrix id:PanelMatrix_675
+{
+  #keys: '[412672.0.1064460828]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTimeCapacities_656
+    #child: pOperation
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixEditorActionBarPageTime\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixEditorActionBarPageTime\0431.def"
new file mode 100644
index 0000000..e8e5951
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixEditorActionBarPageTime\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTime id:matrixEditorActionBarPageTime_1
+{
+  #keys: '[412672.0.1064460836]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixeditorContextMenuTime\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixeditorContextMenuTime\0431.def"
new file mode 100644
index 0000000..e123bee
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixeditorContextMenuTime\0431.def"
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTime id:matrixeditorContextMenuTime_1
+{
+  #keys: '[412672.0.1064460837]'
+  BaseType: 'matrixeditorContextMenu'
+  Children:
+  [
+    Component MenuCopy
+    {
+      #keys: '[138034.3.1296123318]'
+      BaseType: 'MenuCopy'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component MenuSeparator
+    {
+      #keys: '[412672.0.1064460838]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Separator: true
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_pOperation.def b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_pOperation.def
new file mode 100644
index 0000000..0a1c73c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form568/Component_pOperation.def
@@ -0,0 +1,63 @@
+Quintiq file version 2.0
+Component pOperation
+{
+  #keys: '[412672.0.1084334216]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport id:bExport_187
+    {
+      #keys: '[412672.0.1084305542]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 0
+      ]
+    }
+    Component bDownload id:bDownload_774
+    {
+      #keys: '[412672.0.1084305565]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOWNLOAD'
+        Label: '涓嬭浇'
+        Taborder: 1
+      ]
+    }
+    Component dhXMLDataListener
+    {
+      #keys: '[412672.0.1084305593]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ExportXMLManager'
+      Children:
+      [
+        Component DataExtractor510
+        {
+          #keys: '[412672.0.1084305608]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            FixedFilter: 'object.Name() = "ShiftPlanXML"'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'ExportXMLManager'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_MatrixEditorTimeCapacities_656_OnUpdateValue\043317.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_MatrixEditorTimeCapacities_656_OnUpdateValue\043317.def"
new file mode 100644
index 0000000..a2602da
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_MatrixEditorTimeCapacities_656_OnUpdateValue\043317.def"
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: MatrixEditorTimeCapacities_656
+Response OnUpdateValue (
+  ShiftPlan cell,
+  String value,
+  String oldvalue
+) id:Response_MatrixEditorTimeCapacities_656_OnUpdateValue_317
+{
+  #keys: '[412672.0.1064460818]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMatrixEditor_OnUpdateValue'
+  QuillAction
+  {
+    Body:
+    [*
+      cell.SetRemark( value );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bDownload_OnClick.def
new file mode 100644
index 0000000..a78876c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bDownload_OnClick.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: pOperation/bDownload_774
+Response OnClick () id:Response_pOperation_bDownload_OnClick
+{
+  #keys: '[412672.0.1084305701]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := true;
+    feedback := "";
+    if( isnull( dhXMLDataListener.Data() )){
+      flag := false;
+      feedback := "褰撳墠鏃犱笅杞芥暟鎹紝鐐瑰嚮瀵煎嚭鍒涘缓涓嬭浇鏁版嵁銆�"
+    }
+    return flag;
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := dhXMLDataListener.Data( ).Export();
+      
+      Application.Download( "鐝璁″垝_" + DateTime::Now().Format( "YM2D2H2mmss" ) + ".xlsx", binaryValue.AsBinaryData() );
+      
+      dhXMLDataListener.Data( ).Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bExport_OnClick.def
new file mode 100644
index 0000000..480c4f5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bExport_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pOperation/bExport_187
+Response OnClick () id:Response_pOperation_bExport_OnClick
+{
+  #keys: '[412672.0.1083032516]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      rows := selectset( DataHolderUnit.Data(),Elements,unit,unit.HasCapacityTypeTime() );
+      columns := DataHolderPeriods.Data( );
+      ShiftPlan::AsyncExport( RecycleBin, rows, columns );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form568/_ROOT_Component_FormShihtPlan\043568.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form568/_ROOT_Component_FormShihtPlan\043568.def"
new file mode 100644
index 0000000..91bb4ea
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form568/_ROOT_Component_FormShihtPlan\043568.def"
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormShihtPlan
+{
+  #keys: '[412672.0.1064470671]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelMatrix_675
+  ]
+  Properties:
+  [
+    Image: 'COMPASSES'
+    Title: '鐝璁″垝'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def
index 9f14d31..30c68ea 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form989/Response_pHeader_bImport_OnClick.def
@@ -24,7 +24,7 @@
               
           webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
           
-          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( Archive, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
           generalExcelImportAndExportDataSource.ReadStructure();
           
           selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def
new file mode 100644
index 0000000..e22590b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def
@@ -0,0 +1,98 @@
+Quintiq file version 2.0
+Component MatrixEditor
+{
+  #keys: '[412672.0.1085881196]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell
+    {
+      #keys: '[412672.0.1085881197]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCells
+        {
+          #keys: '[412672.0.1085881198]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_DemandComparison)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'BaseVersionValue;CompareVersionValue;BaseVersion;CompareVersion;Gap'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows
+    {
+      #keys: '[412672.0.1085881201]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRows
+        {
+          #keys: '[412672.0.1085881202]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns
+    {
+      #keys: '[412672.0.1085881205]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumns
+        {
+          #keys: '[412672.0.1085881206]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageDemandComparison
+    #child: matrixeditorContextMenuDemandComparison
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumns'
+    ContextMenu: 'matrixeditorContextMenuDemandComparison'
+    Rows: 'MatrixEditorRows'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison.def
new file mode 100644
index 0000000..c3618ae
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelDemandComparison
+{
+  #keys: '[412672.0.1085881181]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor
+    Component dhComparisonData
+    {
+      #keys: '[412672.0.1085881305]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def
new file mode 100644
index 0000000..eaac96e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+Component PanelOperation
+{
+  #keys: '[412672.0.1085881251]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelOperation11
+    Component ButtonCompare
+    {
+      #keys: '[412672.0.1085802121]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 1
+      ]
+    }
+    #child: pOperation_715
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def
new file mode 100644
index 0000000..828d235
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def
@@ -0,0 +1,81 @@
+Quintiq file version 2.0
+Component PanelOperation11
+{
+  #keys: '[412672.0.1085801711]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListCompareVersion id:DropDownListCompareVersion_85
+    {
+      #keys: '[412672.0.1085801792]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePR'
+      Children:
+      [
+        Component DataExtractorOperation876 id:DataExtractorOperation876_293
+        {
+          #keys: '[412672.0.1085801793]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersion'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePR'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+    Component dhBaseVersion id:dhBaseVersion_357
+    {
+      #keys: '[412672.0.1085801820]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchivePR'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListBaseVersion id:DropDownListBaseVersion_668
+    {
+      #keys: '[412672.0.1085801851]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePR'
+      Children:
+      [
+        Component DataExtractorOperation id:DataExtractorOperation_669
+        {
+          #keys: '[412672.0.1085801852]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePR'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixEditorActionBarPageDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixEditorActionBarPageDemandComparison.def
new file mode 100644
index 0000000..d36c6a6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixEditorActionBarPageDemandComparison.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageDemandComparison
+{
+  #keys: '[412672.0.1085881209]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixeditorContextMenuDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixeditorContextMenuDemandComparison.def
new file mode 100644
index 0000000..1b6282c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixeditorContextMenuDemandComparison.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuDemandComparison
+{
+  #keys: '[412672.0.1085881212]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def"
new file mode 100644
index 0000000..b50844d
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def"
@@ -0,0 +1,63 @@
+Quintiq file version 2.0
+Component pOperation id:pOperation_715
+{
+  #keys: '[412672.0.1092111928]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport
+    {
+      #keys: '[412672.0.1092111929]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 0
+      ]
+    }
+    Component bDownload
+    {
+      #keys: '[412672.0.1092111930]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOWNLOAD'
+        Label: '涓嬭浇'
+        Taborder: 1
+      ]
+    }
+    Component dhXMLDataListener
+    {
+      #keys: '[412672.0.1092111931]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ExportXMLManager'
+      Children:
+      [
+        Component DataExtractor510
+        {
+          #keys: '[412672.0.1092111932]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            FixedFilter: 'object.Name() = "LocalTableXML"'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'ExportXMLManager'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelDemandComparison_dhComparisonData_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelDemandComparison_dhComparisonData_OnDataChanged.def
new file mode 100644
index 0000000..16bd708
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelDemandComparison_dhComparisonData_OnDataChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison/dhComparisonData
+Response OnDataChanged () id:Response_PanelDemandComparison_dhComparisonData_OnDataChanged
+{
+  #keys: '[412672.0.1093351461]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      PanelDemandComparison.Title( this.Data().Name() );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
new file mode 100644
index 0000000..a95fc67
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelOperation11/DropDownListBaseVersion_668
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged_168
+{
+  #keys: '[412672.0.1085801849]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersion.Data( selection );
+      this.Tooltip( selection.Name() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def
new file mode 100644
index 0000000..ba590f9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelOperation11/DropDownListCompareVersion_85
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged
+{
+  #keys: '[412672.0.1093350988]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def
new file mode 100644
index 0000000..a761ea1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelOperation/ButtonCompare
+Response OnClick () id:Response_PanelOperation_ButtonCompare_OnClick
+{
+  #keys: '[412672.0.1085802211]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      table := ArchivePR::Compared( RecycleBin,DropDownListBaseVersion.Data(),DropDownListCompareVersion.Data() );
+      dhComparisonData.Data( table );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def
new file mode 100644
index 0000000..1fd2a91
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: pOperation_715/bDownload
+Response OnClick () id:Response_pOperation_715_bDownload_OnClick
+{
+  #keys: '[412672.0.1092111926]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := true;
+    feedback := "";
+    if( isnull( dhXMLDataListener.Data() )){
+      flag := false;
+      feedback := "褰撳墠鏃犱笅杞芥暟鎹紝鐐瑰嚮瀵煎嚭鍒涘缓涓嬭浇鏁版嵁銆�"
+    }
+    return flag;
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := dhXMLDataListener.Data( ).Export();
+      
+      Application.Download( "闇�姹傜増鏈姣擾" + DateTime::Now().Format( "YM2D2H2mmss" ) + ".xlsx", binaryValue.AsBinaryData() );
+      
+      dhXMLDataListener.Data( ).Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def
new file mode 100644
index 0000000..02b5b31
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pOperation_715/bExport
+Response OnClick () id:Response_pOperation_715_bExport_OnClick
+{
+  #keys: '[412672.0.1092111927]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      rows := selectset( dhComparisonData.Data(),LocalRow,row,true );
+      columns := selectset( dhComparisonData.Data( ),LocalColumn,column,true );
+      LocalCell_DemandComparison::AsyncExport( RecycleBin, rows, columns );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def
new file mode 100644
index 0000000..6d79dcf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormDemandComparison
+{
+  #keys: '[412672.0.1085881113]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelDemandComparison
+    #child: PanelOperation
+  ]
+  Properties:
+  [
+    Image: 'EQUALS'
+    Title: '闇�姹傚姣�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def
index 41b869f..0f2be2a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPR_PP_Budget/Response_pHeader_bImport_OnClick.def
@@ -24,7 +24,7 @@
               
           webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
           
-          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( Archive, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
           generalExcelImportAndExportDataSource.ReadStructure();
           
           selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def
deleted file mode 100644
index 48c0ca9..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def
+++ /dev/null
@@ -1,18 +0,0 @@
-Quintiq file version 2.0
-#parent: ListRoutings
-Response OnClick () id:Response_ListRoutings_MenuSetUnitUphillRouting_OnClick
-{
-  #keys: '[412672.0.1040131205]'
-  CanBindMultiple: false
-  DefinitionID => /ListRoutings/Responsedef_ListRoutings_WebMenu_OnClick
-  GroupServerCalls: true
-  QuillAction
-  {
-    Body:
-    [*
-      dlg := construct( DialogCreateEditUphillRouting );
-      
-      dlg.Create( );
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def
index 785331d..4aa2ab6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSixDigitCode/Response_pHeader_393_bImport_OnClick.def
@@ -24,7 +24,7 @@
               
           webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
           
-          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( Archive, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
           generalExcelImportAndExportDataSource.ReadStructure();
           
           selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_MatrixEditor872.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_MatrixEditor872.def
new file mode 100644
index 0000000..7db9d74
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_MatrixEditor872.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor872
+{
+  #keys: '[413988.0.1290322866]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell590
+    {
+      #keys: '[413988.0.1290322867]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor862
+        {
+          #keys: '[413988.0.1290322868]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'TransferPlanColumn.TransferPlanCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'TransferPlanColumn'
+        Row: 'TransferPlanRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows481
+    {
+      #keys: '[413988.0.1290322871]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor661
+        {
+          #keys: '[413988.0.1290322872]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'TransferPlanRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'SourceStockpoingPointID;TargetStockpoingPointID;ProductID'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns681
+    {
+      #keys: '[413988.0.1290322875]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor445
+        {
+          #keys: '[413988.0.1290322876]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'TransferPlanColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'ColumnName'
+        SortCriteria: 'ColumnDate'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage493
+    #child: matrixeditorContextMenu367
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns681'
+    ContextMenu: 'matrixeditorContextMenu367'
+    Rows: 'MatrixEditorRows481'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixEditorActionBarPage493.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixEditorActionBarPage493.def
new file mode 100644
index 0000000..8117f9f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixEditorActionBarPage493.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage493
+{
+  #keys: '[413988.0.1290322879]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixeditorContextMenu367.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixeditorContextMenu367.def
new file mode 100644
index 0000000..263a486
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_matrixeditorContextMenu367.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu367
+{
+  #keys: '[413988.0.1290322882]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pContent.def
new file mode 100644
index 0000000..957b4ac
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.0.1290370837]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor872
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def
new file mode 100644
index 0000000..74595a4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def
@@ -0,0 +1,46 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.0.1290370823]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bDownload
+    {
+      #keys: '[413988.0.1290361218]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 0
+      ]
+    }
+    Component bMaximumDailyTransferCapacity
+    {
+      #keys: '[413988.0.1290361230]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Maximum daily transfer capacity'
+        Taborder: 1
+      ]
+    }
+    Component bGenerateReport
+    {
+      #keys: '[413988.0.1292223250]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Generate report'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def
new file mode 100644
index 0000000..17323ed
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bDownload_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader/bDownload
+Response OnClick () id:Response_pHeader_bDownload_OnClick
+{
+  #keys: '[413988.0.1292330526]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bGenerateReport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bGenerateReport_OnClick.def
new file mode 100644
index 0000000..2465dff
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bGenerateReport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bGenerateReport
+Response OnClick () id:Response_pHeader_bGenerateReport_OnClick
+{
+  #keys: '[413988.0.1292330696]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      TransferPlanCell::GenerateReport( MacroPlan );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bMaximumDailyTransferCapacity_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bMaximumDailyTransferCapacity_OnClick.def
new file mode 100644
index 0000000..fd89de9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bMaximumDailyTransferCapacity_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: pHeader/bMaximumDailyTransferCapacity
+Response OnClick () id:Response_pHeader_bMaximumDailyTransferCapacity_OnClick
+{
+  #keys: '[413988.0.1292330611]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/_ROOT_Component_FormTransferPlan.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/_ROOT_Component_FormTransferPlan.def
new file mode 100644
index 0000000..dd8a2b6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/_ROOT_Component_FormTransferPlan.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormTransferPlan
+{
+  #keys: '[413988.0.1290321873]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pContent
+    #child: pHeader
+  ]
+  Properties:
+  [
+    Image: 'HAND_TRUCK_BOX'
+    Title: 'Transfer plan'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/DemandComparison.vw b/_Main/UI/MacroPlannerWebApp/Views/DemandComparison.vw
new file mode 100644
index 0000000..3f13663
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/DemandComparison.vw
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    page: ''
+    group: ''
+    index: 0
+    image: 'EQUALS'
+    description: ''
+  }
+  formatversion: 2
+  id: 'DemandComparison'
+  name: 'DemandComparison'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
new file mode 100644
index 0000000..1caecfc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    page: ''
+    group: ''
+    index: 0
+    image: 'COMPASSES'
+    description: ''
+  }
+  formatversion: 2
+  id: 'ShiftPlan'
+  name: 'ShiftPlan'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/TransferPlan.vw b/_Main/UI/MacroPlannerWebApp/Views/TransferPlan.vw
new file mode 100644
index 0000000..0cda1ef
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/TransferPlan.vw
@@ -0,0 +1,146 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormTransferPlan
+      {
+        title: 'QMacroPlanner::FormTransferPlan'
+        shown: true
+        componentID: 'QMacroPlanner::FormTransferPlan'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 14
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components: null
+      }
+      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: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              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: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'WALLET_OPEN'
+    description: ''
+  }
+  formatversion: 2
+  id: 'TransferPlan'
+  name: 'TransferPlan'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3