From d59d62798bf558ba526350d81333d538aa0af812 Mon Sep 17 00:00:00 2001
From: rislai <risheng.lai@capgemini.com>
Date: 星期五, 21 六月 2024 16:10:24 +0800
Subject: [PATCH] 添加需求版本对比功能

---
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def                                     |   18 
 _Main/BL/Type_ShiftPlan/Attribute_Color.qbl                                                                                             |    7 
 _Main/BL/Relations/Relation_LocalColumn_LocalTable_LocalTable_LocalColumn.qbl                                                           |   23 
 _Main/Sys/Repr/Global/ShiftPlan.qrp                                                                                                     |   45 +
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bExport_OnClick.def                                                   |   18 
 _Main/BL/Relations/Relation_ExportXMLManager_RecycleBin_RecycleBin_ExportXMLManager.qbl                                                 |   23 
 _Main/BL/Type_ExportXMLData/_ROOT_Type_ExportXMLData.qbl                                                                                |    9 
 _Main/BL/Type_ExportXMLManager/_ROOT_Type_ExportXMLManager.qbl                                                                          |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def                                                 |   26 
 _Main/BL/Relations/Relation_LocalRow_LocalCell_LocalCell_LocalRow.qbl                                                                   |   23 
 _Main/BL/Type_ShiftPlan/StaticMethod_Export.qbl                                                                                         |   18 
 _Main/BL/Relations/Relation_LocalTable_RecycleBin_RecycleBin_LocalTable.qbl                                                             |   23 
 _Main/BL/Type_ShiftPlan/Method_CalculateEventType.qbl                                                                                   |   39 +
 _Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl                                                                   |   29 +
 _Main/BL/Type_LocalCell/Attribute_Value.qbl                                                                                             |    7 
 _Main/BL/Type_Period_MP/_ROOT_Type_Period_MP.qbl                                                                                        |    6 
 _Main/BL/Relations/Relation_ShiftPlan_UnitPeriodTime_UnitPeriodTime_ShiftPlan.qbl                                                       |   23 
 _Main/BL/Type_ShiftPlan/StaticMethod_GetShiftPlanColumnXML.qbl                                                                          |   50 +
 LibMacroPlanner/BL/Type_UnitPeriodTime/Method_OnCreate.qbl                                                                              |   10 
 _Main/BL/Type_LocalRow/_ROOT_Type_LocalRow.qbl                                                                                          |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonOperation_OnClick.def                          |   17 
 _Main/BL/Relations/Relation_LocalColumn_LocalCell_LocalCell_LocalColumn.qbl                                                             |   23 
 _Main/BL/Type_LocalTable/_ROOT_Type_LocalTable.qbl                                                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPlanViews.def                                     |   18 
 LibMacroPlanner/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl                                                                    |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison.def                                          |   24 
 _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/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged#168.def |   18 
 _Main/BL/Type_ShiftPlan/Method_GetAttributeByName.qbl                                                                                   |   19 
 _Main/BL/Type_ExportXMLManager/Attribute_FinalXML.qbl                                                                                   |    7 
 _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/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixeditorContextMenuDemandComparison.def                        |   10 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_pOperation_bDownload_OnClick.def                                                 |   30 +
 _Main/UI/MacroPlannerWebApp/Component_Form568/_ROOT_Component_FormShihtPlan#568.def                                                     |   17 
 _Main/BL/Type_ShiftPlan/Function_CalcColor.qbl                                                                                          |   27 
 _Main/BL/Type_ShiftPlan/Function_CalcRemark.qbl                                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def                                           |    8 
 _Main/BL/Type_ShiftPlan/Method_CalculateRemark#503.qbl                                                                                  |   30 +
 _Main/BL/Type_LocalCell/_ROOT_Type_LocalCell.qbl                                                                                        |    9 
 _Main/BL/Type_ShiftPlan/Attribute_EventType.qbl                                                                                         |    7 
 _Main/BL/Type_ShiftPlan/_ROOT_Type_ShiftPlan.qbl                                                                                        |    9 
 _Main/BL/Type_ShiftPlan/Attribute_Remark.qbl                                                                                            |    7 
 _Main/Sys/Repr/Global/DateTime.qrp                                                                                                      |    2 
 _Main/BL/Type_ExportXMLManager/Attribute_Name.qbl                                                                                       |    7 
 _Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl                                                             |    2 
 _Main/BL/Type_ExportXMLData/Attribute_Priority.qbl                                                                                      |    7 
 _Main/BL/Type_RecycleBin/StaticMethod_OnLogin.qbl                                                                                       |   28 
 _Main/BL/Type_ExportXMLManager/Function_CalcFinalXML.qbl                                                                                |   20 
 _Main/BL/Type_LocalTable/Attribute_RowIndexCache.qbl                                                                                    |    7 
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                                |    5 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                               |    1 
 _Main/BL/Type_LocalColumn/Attribute_Name.qbl                                                                                            |    7 
 _Main/BL/Type_LocalRow/Attribute_Index.qbl                                                                                              |    7 
 _Main/BL/Type_ShiftPlan/Method_SetRemark.qbl                                                                                            |   12 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_OnCreated.def                                                      |   44 +
 _Main/BL/Relations/Relation_LocalRow_LocalTable_LocalTable_LocalRow.qbl                                                                 |   23 
 _Main/BL/Dataset_RecycleBin/_ROOT_Dataset_RecycleBin.qbl                                                                                |   10 
 _Main/BL/Type_ShiftPlan/Function_CalcEventType.qbl                                                                                      |   12 
 _Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl                                                                                       |   21 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixeditorContextMenuTime#1.def                                               |   33 +
 _Main/BL/Type_ShiftPlan/Function_CalcOutcome.qbl                                                                                        |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def                                               |   77 ++
 _Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl                                                                         |   15 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_MatrixEditorTimeCapacities#656.def                                              |  119 ++++
 _Main/UI/MacroPlannerWebApp/Component_Form568/Response_MatrixEditorTimeCapacities_656_OnUpdateValue#317.def                             |   20 
 _Main/BL/Type_ArchivePR/Method_Load.qbl                                                                                                 |   71 ++
 /dev/null                                                                                                                               |   18 
 _Main/BL/Type_ShiftPlan/Attribute_CustomRemark.qbl                                                                                      |    7 
 _Main/BL/Type_RecycleBin/_ROOT_Type_RecycleBin.qbl                                                                                      |    9 
 _Main/BL/Type_ShiftPlan/StaticMethod_AsyncExport.qbl                                                                                    |   31 +
 _Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw                                                                                          |   16 
 _Main/BL/Type_LocalTable/Method_GetRowIndexCache.qbl                                                                                    |   12 
 _Main/BL/Type_ShiftPlan/StaticMethod_Create.qbl                                                                                         |   12 
 _Main/Sys/Repr/Global/Date.qrp                                                                                                          |    2 
 _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/BL/Type_UnitPeriodTime/_ROOT_Type_UnitPeriodTime.qbl                                                                              |    6 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPlanViews_ButtonShiftPlan_OnClick.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_Form568/Component_matrixEditorActionBarPageTime#1.def                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def                                                   |   97 +++
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_matrixEditorActionBarPageDemandComparison.def                      |   10 
 86 files changed, 1,660 insertions(+), 24 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_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/Type_ArchivePR/Method_Load.qbl b/_Main/BL/Type_ArchivePR/Method_Load.qbl
new file mode 100644
index 0000000..551358d
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/Method_Load.qbl
@@ -0,0 +1,71 @@
+Quintiq file version 2.0
+#parent: #root
+Method Load (
+  Archive archive,
+  LocalTable localTable
+) const
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    file := OSFile::Construct();
+    //originRow := localTable.LocalRow( relnew ,Index := localTable.GetRowIndexCache());
+    //carTypeRow := localTable.LocalRow( relnew ,Index := localTable.GetRowIndexCache());
+    //productRow := localTable.LocalRow( relnew ,Index := localTable.GetRowIndexCache());
+    //fourDigitRow := localTable.LocalRow( relnew,Index := localTable.GetRowIndexCache());
+    
+    columns := selectset( localTable,LocalColumn,column,true );
+    columnTree := NamedValueTree::Create();
+    for( i := 0 ; i < columns.Size(); i++ ){
+      column := columns.Element( i );
+      tempHandle := columnTree.GetHandle( column.Name() );
+      columnTree.Root().AddChild( tempHandle,i );
+    }
+    
+    try {
+      file.Open( this.FilePath(), "Read", false );
+      webFileBinaryData := file.ReadBinary();
+        
+      generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( archive, webFileBinaryData, this.Name() );
+      generalExcelImportAndExportDataSource.ReadStructure();
+      selections := selectset( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      if( selections.Size() <> 0 ){
+        table := selections.Element( 0 );
+        generalColumns := selectset( table,GeneralExcelImportAndExportDataColumn,column,true );
+        
+        // 鐢熸垚鍒楁暟鎹�
+        for( i := 0; i< generalColumns.Size(); i++ ){
+          generalColumn := generalColumns.Element( i );
+          column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),Index := generalColumn.ColumnIndex() );
+          columns.Add( column );
+          tempHandle := columnTree.GetHandle( column.Name() );
+          columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
+        }
+        
+        // 鐢熸垚鏁版嵁
+        rowSize := table.GeneralExcelImportAndExportDataRow( relsize );
+        for ( rowIndex := 0; rowIndex < rowSize; rowIndex++ ) {
+          generalRow := select( table, GeneralExcelImportAndExportDataRow, tempGEIAEDR, tempGEIAEDR.RowNr() = rowIndex );
+          row := localTable.LocalRow( relnew,Index := rowIndex );
+          generalCells := selectsortedset( generalRow,GeneralExcelImportAndExportDataCell,cell,true,cell.GeneralExcelImportAndExportDataColumn().ColumnIndex() );
+          
+          traverse( generalCells,Elements,generalCell ){
+            columnName := generalCell.GeneralExcelImportAndExportDataColumn().Name();
+            columnHandle := columnTree.GetHandle( columnName );
+            columnIndex := columnTree.Root().Child( columnHandle ).GetValueAsNumber();
+            column := columns.Element( columnIndex );
+            row.LocalCell( relnew,Value := generalCell.Value() ,LocalColumn := column );
+          }
+        }
+      }
+      // 鍚庣画鍒犻櫎
+      generalExcelImportAndExportDataSource.Delete();
+      file.Close();
+    } onerror {
+      if( not isnull( file )){
+        file.Close(); 
+      }
+      error( e );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl b/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
new file mode 100644
index 0000000..9f8f987
--- /dev/null
+++ b/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Compared (
+  RecycleBin recycleBin,
+  ArchivePR baseVersion,
+  ArchivePR compareVersion
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    archive := baseVersion.Archive(); // archive涓嶅彲璁剧疆涓哄彧璇�
+    
+    table := recycleBin.LocalTable( relnew );
+    
+    baseVersion.Load( archive,table ); 
+    compareVersion.Load( archive,table ); 
+    
+    return table;
+  *]
+}
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/StaticMethod_AwaitShiftPlanXMLData.qbl b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl
new file mode 100644
index 0000000..7f10e9c
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitShiftPlanXMLData.qbl
@@ -0,0 +1,29 @@
+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..be13358 100644
--- a/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl
+++ b/_Main/BL/Type_GeneralExcelImportAndExportDataSource/StaticMethod_Upload.qbl
@@ -4,7 +4,7 @@
   Archive archive,
   BinaryValue binaryValue,
   String filePath
-) as GeneralExcelImportAndExportDataSource
+) const as GeneralExcelImportAndExportDataSource
 {
   TextBody:
   [*
diff --git a/_Main/BL/Type_LocalCell/Attribute_Value.qbl b/_Main/BL/Type_LocalCell/Attribute_Value.qbl
new file mode 100644
index 0000000..572510e
--- /dev/null
+++ b/_Main/BL/Type_LocalCell/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[412672.0.1086954759][412672.0.1086954758][412672.0.1086954760]'
+  ValueType: String
+}
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_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_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_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/_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_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_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_Export.qbl b/_Main/BL/Type_ShiftPlan/StaticMethod_Export.qbl
new file mode 100644
index 0000000..6883630
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/StaticMethod_Export.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  const ExportXMLManager manager
+) as BinaryValue
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+     
+    tableGroupHandle := TableGroupHandle::Create( "tableGroupHandle" );
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( manager.FinalXML() ) );
+    tableGroupHandle.Add( tableHandle );
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+     
+    return binaryData.AsBinaryValue();
+  *]
+}
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..df1ebb1 100644
--- a/_Main/BL/Type_Test/StaticMethod_Test.qbl
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -9,9 +9,8 @@
   TextBody:
   [*
     // rislai Jun-9-2024 (created)
+    element := "<column><name>Att</name><type>String</type>";
     
-    traverse( macroPlan,Routing,rt ){
-      rt.UphillRouting( relflush ); 
-    }
+    error( element.LikeUserLocale( "Unit" ) );
   *]
 }
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_ActionBarPagePlan.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def
new file mode 100644
index 0000000..cde4c13
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPagePlan.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component ActionBarPagePlan #extension
+{
+  Children:
+  [
+    #child: ActionBarGroupPlanViews
+  ]
+}
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_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/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 576fb69..77bc80f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -18,6 +18,7 @@
         #child: applicationFixedPageActionBarPageDef
         #child: applicationDevelopmentActionBarPageDef_1
         #child: abpAlgorithmPostProcessing
+        #child: ActionBarPagePlan
       ]
     }
     Component dhBinaryDataPR id:dhBinaryDataPR_688
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..24c257f
--- /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 := ShiftPlan::Export( dhXMLDataListener.Data( ));
+      
+      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_FormDemandComparison/Component_MatrixEditor.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def
new file mode 100644
index 0000000..dd916e8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_MatrixEditor.def
@@ -0,0 +1,97 @@
+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'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        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: 'Index'
+        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:
+  [
+    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..c43c66e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelOperation
+{
+  #keys: '[412672.0.1085881251]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelOperation11
+    Component ButtonOperation
+    {
+      #keys: '[412672.0.1085802121]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 1
+      ]
+    }
+  ]
+  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..0252f41
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def
@@ -0,0 +1,77 @@
+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:
+      [
+        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:
+      [
+        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/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
new file mode 100644
index 0000000..b082604
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
@@ -0,0 +1,18 @@
+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 );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonOperation_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonOperation_OnClick.def
new file mode 100644
index 0000000..e397283
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonOperation_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelOperation/ButtonOperation
+Response OnClick () id:Response_PanelOperation_ButtonOperation_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/_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_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/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
+}

--
Gitblit v1.9.3