From e7bcb8e403034ed444517b1f7479ac5f32d8644f Mon Sep 17 00:00:00 2001
From: rislai <risheng.lai@capgemini.com>
Date: 星期五, 16 八月 2024 15:51:35 +0800
Subject: [PATCH] 添加全年计划报表,外加修复一些bug

---
 _Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_CreateFullTable.qbl                                                      |   75 +++
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison234#1.def      |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnCreated.def        |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhTimeUnit_OnCreated.def                  |   16 
 _Main/BL/Type_LocalRow/DefaultValue_StockingPointID.qbl                                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bDownload_OnClick.def                            |   30 +
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnDataChanged.def    |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bExport_OnClick.def                              |   19 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GetColumnXML.qbl                                                                |   35 +
 _Main/BL/Type_LocalCell_Default/StaticMethod_AsyncExport.qbl                                                                 |   29 +
 _Main/BL/Type_MP_Cell_AnnualPlanReport/_ROOT_Type_MP_Cell_AnnualPlanReport.qbl                                               |    9 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bExport_OnClick.def                           |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelAnnualPlan.def                                     |  105 ++++
 _Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl                                                       |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelStockingPoint_OnCreated.def       |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon#805.def                                     |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor510#127.def                                 |  102 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsEndDate_OnChanged.def                   |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedProduct_OnDataChanged.def       |   20 
 _Main/BL/Type_LocalColumn/Attribute_TimeUnit.qbl                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor.def                                        |  103 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedStockingPoint_OnDataChanged.def |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhStartDate_OnCreated.def                 |   16 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhFinelEntity_OnCreated.def                      |   16 
 _Main/BL/Type_LocalRow/Attribute_ProductID.qbl                                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bDownload_OnClick.def                         |   32 +
 _Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhCheckedEntity_OnDataChanged.def                |   20 
 _Main/BL/Type_ExportXMLData/Method_CalculatePriority.qbl                                                                     |   52 ++
 _Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_Create.qbl                                                               |   51 ++
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def                                             |   35 +
 _Main/BL/Type_MP_Row/Attribute_ProductID.qbl                                                                                 |    7 
 _Main/BL/Type_MP_Cell_AnnualPlanReport/Attribute_NewSupply.qbl                                                               |    7 
 _Main/BL/Type_LocalColumn/Function_CalcIndex.qbl                                                                             |    4 
 _Main/BL/Type_LocalRow/Attribute_StockingPointID.qbl                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison.def             |   10 
 _Main/BL/Type_LocalRow/DefaultValue_ProductID.qbl                                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction#633.def                                      |   47 ++
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon682_OnClick.def               |   17 
 _Main/UI/MacroPlannerWebApp/Component_DialogBESIWarning/Response_pnlActions_btnOk_OnClick.def                                |    8 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def                                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison.def           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_rbgTimeUnit_OnUserChanged.def             |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_pExport.def                                             |   60 ++
 _Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_GetTableName.qbl                                                         |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon322.def                                      |  102 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison527#1.def        |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelProduct_OnCreated.def             |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/_ROOT_Component_FormAnnualPlanReport.def                          |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData_OnCreated.def           |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsStartDate_OnChanged.def                 |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhEndDate_OnCreated.def                   |   16 
 _Main/BL/Type_MP_Row/Attribute_StockingPointID.qbl                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon_OnClick.def                  |   18 
 54 files changed, 1,343 insertions(+), 21 deletions(-)

diff --git a/_Main/BL/Type_ExportXMLData/Method_CalculatePriority.qbl b/_Main/BL/Type_ExportXMLData/Method_CalculatePriority.qbl
new file mode 100644
index 0000000..c01e5fa
--- /dev/null
+++ b/_Main/BL/Type_ExportXMLData/Method_CalculatePriority.qbl
@@ -0,0 +1,52 @@
+Quintiq file version 2.0
+#parent: #root
+Method CalculatePriority () as Number
+{
+  TextBody:
+  [*
+    // rislai Aug-13-2024 (created)
+    priority := 0;
+    element := this.XML();
+    if( element.LikeUserLocale( "<name>Product ID</name>" )){
+      priority := 1 ;
+    }else if( element.LikeUserLocale( "<name>浜х嚎</name>" )){
+      priority := 2 ;
+    }else if( element.LikeUserLocale( "<name>Attribute</name>" )){
+      priority := 3 ;
+    }else if( element.LikeUserLocale( "<name>浜у湴</name>" )){
+      priority := 4 ;
+    }else if( element.LikeUserLocale( "<name>杞﹀瀷</name>" )){
+      priority := 5 ;
+    }else if( element.LikeUserLocale( "<name>鍙戝姩鏈洪浂浠跺彿</name>" )){
+      priority := 6 ;
+    }else if( element.LikeUserLocale( "<name>鍙戝姩鏈哄洓浣嶇爜</name>" )){
+      priority := 7 ;
+    }else if( element.LikeUserLocale( "<name>鐢熶骇澶╂暟</name>" )){
+      priority := 8 ;
+    }else if( element.LikeUserLocale( "<name>鍔犵彮/娆犲伐鏃堕暱</name>" )){
+      priority := 9 ;
+    }else if( element.LikeUserLocale( "<name>骞虫棩鍔犵彮鏃堕暱</name>" )){
+      priority := 10 ;
+    }else if( element.LikeUserLocale( "<name>浼戞伅鏃ュ姞鐝椂闀�</name>" )){
+      priority := 11 ;
+    }else if( element.LikeUserLocale( "<name>鑺傚亣鏃ュ姞鐝椂闀�</name>" )){
+      priority := 12 ;
+    }else if( element.LikeUserLocale( "<name>娆犲伐鏃堕暱</name>" )){
+      priority := 13 ;
+    }else if( element.LikeUserLocale( "<name>鍔犵彮/娆犲伐璐�</name>" )){
+      priority := 14 ;
+    }else if( element.LikeUserLocale( "<name>骞虫棩鍔犵彮璐�</name>" )){
+      priority := 15 ;
+    }else if( element.LikeUserLocale( "<name>浼戞伅鏃ュ姞鐝垂</name>" )){
+      priority := 16 ;
+    }else if( element.LikeUserLocale( "<name>鑺傚亣鏃ュ姞鐝垂</name>" )){
+      priority := 17 ;
+    }else if( element.LikeUserLocale( "<name>娆犲伐璐�</name>" )){
+      priority := 18 ;
+    }else{
+      //  <column><name>2020/04/01</name>
+      priority := [Number]element.SubString( 14,10 ).ReplaceAll( "/","") ;
+    }
+    return priority;
+  *]
+}
diff --git a/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl
index fd9deec..d30416e 100644
--- a/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl
+++ b/_Main/BL/Type_ExportXMLManager/StaticMethod_AwaitLocalTableXMLData.qbl
@@ -17,25 +17,7 @@
     }
     traverse( columnXMLData,Elements,element,element.TrimBoth() <> "" ){
        data := manager.ExportXMLData( relnew, XML := element);
-       if( element.LikeUserLocale( "Product ID" )){
-         data.Priority( 1 );
-       }else if( element.LikeUserLocale( "浜х嚎" )){
-         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{
-         info( element );
-         //  <column><name>2020/04/01</name>
-         data.Priority( [Number]element.SubString( 14,10 ).ReplaceAll( "/","") );
-       }
+       data.Priority( data.CalculatePriority( ));
     }
   *]
 }
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_AsyncExport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_AsyncExport.qbl
new file mode 100644
index 0000000..1c4c1eb
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_AsyncExport.qbl
@@ -0,0 +1,29 @@
+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());
+    
+    columnstring := emit( "" );
+    flag := true;
+    traverse( sortColumns,Elements,sortColumn ){
+      if( flag ){
+        flag := false;
+        attributeXML := rows -> LocalCell_Default::GetColumnXML( sortColumn,"attribute" );
+        columnstring := columnstring.Merge( attributeXML )
+      }
+      
+      cellxml := rows -> LocalCell_Default::GetColumnXML( sortColumn ,"data" );
+      columnstring := columnstring.Merge( cellxml);
+    }
+    
+    columnstring -> GroupAll() -> ExportXMLManager::AwaitLocalTableXMLData( recycleBin,guard( rows.Element(0).LocalTable().Name(),MP_Cell_AnnualPlanReport::GetTableName()) );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GetColumnXML.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetColumnXML.qbl
new file mode 100644
index 0000000..e9956a5
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetColumnXML.qbl
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetColumnXML (
+  const constcontent LocalRows rows,
+  const LocalColumn column,
+  String type
+) const as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    
+    columnXML := "";
+    cells := selectsortedset( column, LocalCell.astype( LocalCell_Default ), cell,
+                                  exists( rows,Elements,element,element = cell.LocalRow()), cell.LocalRow().Index());
+    if( type = "data" ){
+      columnXML := "<column><name>" + column.Name() + "</name><type>String</type>"; 
+      traverse ( cells, Elements, cell ) {
+        cellXML := '<cell value="' + cell.RealValue().Format( "N(Dec)" ) + '"/>'
+        columnXML := columnXML + cellXML;
+      }
+      columnXML := columnXML + "</column>";
+    }
+    if( type = "attribute" ){
+      columnXML1 := "<column><name>浜х嚎</name><type>String</type>";
+      traverse ( cells, Elements, cell ) {
+        cellXML := '<cell value="' + cell.LocalRow().Name() + '"/>'
+        columnXML1 := columnXML1 + cellXML;
+      }
+      columnXML := columnXML1 + "</column>";
+    }
+    
+    return columnXML;
+  *]
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_TimeUnit.qbl b/_Main/BL/Type_LocalColumn/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..1ebbe55
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_TimeUnit.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[412672.1.108145936][412672.1.108145935][412672.1.108145937]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
index a8ef9c9..59886e3 100644
--- a/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
+++ b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
@@ -13,9 +13,13 @@
       index := [String]year;
       if( month < 10 ){
         index := index + "0" + [String]month; 
+      }else{
+        index := index + [String]month;
       }
       if( day < 10 ){
         index := index + "0" + [String]day; 
+      }else{
+        index := index + [String]day; 
       }
       value := [Number]index;
     }else{
diff --git a/_Main/BL/Type_LocalRow/Attribute_ProductID.qbl b/_Main/BL/Type_LocalRow/Attribute_ProductID.qbl
new file mode 100644
index 0000000..cc3a825
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[412672.1.107689520][412672.1.107689519][412672.1.107689521]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalRow/Attribute_StockingPointID.qbl b/_Main/BL/Type_LocalRow/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..7d6d3b9
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/Attribute_StockingPointID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[412672.1.107689523][412672.1.107689522][412672.1.107689524]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalRow/DefaultValue_ProductID.qbl b/_Main/BL/Type_LocalRow/DefaultValue_ProductID.qbl
new file mode 100644
index 0000000..98649b2
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/DefaultValue_ProductID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductID
+}
diff --git a/_Main/BL/Type_LocalRow/DefaultValue_StockingPointID.qbl b/_Main/BL/Type_LocalRow/DefaultValue_StockingPointID.qbl
new file mode 100644
index 0000000..fbb83fc
--- /dev/null
+++ b/_Main/BL/Type_LocalRow/DefaultValue_StockingPointID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: StockingPointID
+}
diff --git a/_Main/BL/Type_MP_Cell_AnnualPlanReport/Attribute_NewSupply.qbl b/_Main/BL/Type_MP_Cell_AnnualPlanReport/Attribute_NewSupply.qbl
new file mode 100644
index 0000000..9a529ee
--- /dev/null
+++ b/_Main/BL/Type_MP_Cell_AnnualPlanReport/Attribute_NewSupply.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute NewSupply
+{
+  #keys: '3[412672.1.107664674][412672.1.107664673][412672.1.107664675]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_Create.qbl b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_Create.qbl
new file mode 100644
index 0000000..10e8056
--- /dev/null
+++ b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_Create.qbl
@@ -0,0 +1,51 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  MacroPlan owner
+) as MP_Table
+{
+  TextBody:
+  [*
+    // rislai Aug-6-2024 (created)
+    table := select( owner,MP_Table,table,table.Name() = MP_Cell_AnnualPlanReport::GetTableName() );
+    if( not isnull( table )){
+      table.Delete(); 
+    }
+    
+    table := owner.MP_Table( relnew,Name := MP_Cell_AnnualPlanReport::GetTableName());
+    
+    startDate := owner.StartOfPlanning().Date();
+    endDate := startDate + 7;
+    
+    columns := construct( MP_Columns );
+    columnIndexTree := NamedValueTree::Create();
+    for( i := startDate;i < endDate; i := i + 1){
+      column := table.MP_Column( relnew,CustomDate := i );
+      columnHandle := columnIndexTree.GetHandle( i.AsQUILL() );
+      columns.Add( column );
+      columnIndexTree.Root().AddChild( columnHandle,columns.Size() - 1 );
+    }
+    
+    traverse( owner,Product_MP.ProductInStockingPoint_MP,pisp_mp ){
+      // unit.AsEntity().DisplayNameForSelection()
+      pispippls := selectset( pisp_mp,ProductInStockingPointInPeriod.astype( ProductInStockingPointInPeriodPlanningLeaf ),pispippl,
+                                        pispippl.Period_MP().StartDate() >= startDate 
+                                    and pispippl.Period_MP().EndDate() <= endDate 
+                                    and pispippl.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day());
+      if( pispippls.Size() <> 0 ){
+        row := table.MP_Row( relnew,ProductID := pisp_mp.ProductID(),StockingPointID := pisp_mp.StockingPointID(), CustomName := pisp_mp.Name() ,Index := table.GetRowIndexCache() ); 
+        traverse( pispippls,Elements,pispippl ){
+          columnHandle := columnIndexTree.GetHandle( pispippl.Period_MP().StartDate().AsQUILL() );
+          columnIndex := guard( columnIndexTree.Root().Child( columnHandle ),null( NamedValue ));
+          if( not isnull( columnIndex )){
+            column := columns.Element( columnIndex.GetValueAsNumber() );
+            
+            row.MP_Cell( relnew,MP_Cell_AnnualPlanReport,MP_Column := column ,NewSupply := pispippl.NewSupplyQuantity());
+          }
+        }
+      }
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_CreateFullTable.qbl b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_CreateFullTable.qbl
new file mode 100644
index 0000000..3a8b313
--- /dev/null
+++ b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_CreateFullTable.qbl
@@ -0,0 +1,75 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateFullTable (
+  const MacroPlans owners,
+  RecycleBin recycleBin
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Aug-7-2024 (created)
+    tables := construct( MP_Tables );
+    traverse( owners,Elements,owner ){
+      table := select( owner,MP_Table,table,table.Name() = MP_Cell_AnnualPlanReport::GetTableName() ); 
+      if( isnull( table )){
+        table :=  MP_Cell_AnnualPlanReport::Create( owner );
+      }
+      tables.Add( table );
+    }
+    
+    localTable := recycleBin.LocalTable( relnew,Name := MP_Cell_AnnualPlanReport::GetTableName() );
+    startDate := minselect( tables,Elements.MP_Column,column,column.CustomDate() ).CustomDate();
+    endDate := maxselect( tables,Elements.MP_Column,column,column.CustomDate() ).CustomDate();
+    
+    localColumns := construct( LocalColumns );
+    localColumnIndexTree := NamedValueTree::Create();
+    for( i := startDate; i <= endDate; i := i + 1 ){
+       localColumn := localTable.LocalColumn( relnew,CustomDate := i ,TimeUnit := "Day");
+       localColumnHandle := localColumnIndexTree.GetHandle( i.AsQUILL());
+       localColumns.Add( localColumn );
+       localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 );
+    }
+    for( i := startDate.StartOfWeek(); i <= endDate.StartOfNextWeek(); i := i.StartOfNextWeek() ){
+       localColumn := localTable.LocalColumn( relnew,CustomDate := i ,TimeUnit := "Week");
+       localColumnHandle := localColumnIndexTree.GetHandle( i.AsQUILL() + "Week" );
+       localColumns.Add( localColumn );
+       localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 );
+    }
+    for( i := startDate.StartOfMonth(); i <= endDate.StartOfNextMonth(); i := i.StartOfNextMonth() ){
+       localColumn := localTable.LocalColumn( relnew,CustomDate := i ,TimeUnit := "Month");
+       localColumnHandle := localColumnIndexTree.GetHandle( i.AsQUILL() + "Month" );
+       localColumns.Add( localColumn );
+       localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 );
+    }
+    traverse( tables,Elements.MP_Row,row ){
+       localRow := localTable.LocalRow( relnew,CustomName := row.Name(),ProductID := row.ProductID(),StockingPointID := row.StockingPointID(),Index := localTable.GetRowIndexCache() );
+       traverse( row,MP_Cell.astype( MP_Cell_AnnualPlanReport ),cell ){
+         localColumnHandle := localColumnIndexTree.GetHandle( cell.MP_Column().Date().AsQUILL() );
+         localColumnIndex := guard( localColumnIndexTree.Root().Child( localColumnHandle ),null( NamedValue ));
+         if( not isnull( localColumnIndex )){
+           localColumn := localColumns.Element( localColumnIndex.GetValueAsNumber() );
+           localCell := localRow.LocalCell( relnew,LocalCell_Default,LocalColumn := localColumn );
+           localCell.RealValue( cell.NewSupply() );
+         }
+       }
+    }
+    traverse( localTable,LocalRow,row ){
+      traverse( localTable,LocalColumn,column,column.TimeUnit() = "Week" ){
+        value := sum( row,LocalCell.astype( LocalCell_Default ),cell,
+                      cell.LocalColumn().TimeUnit() = "Day" and 
+                      cell.LocalColumn().CustomDate() >= column.CustomDate() and 
+                      cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextWeek(),cell.RealValue());
+        row.LocalCell( relnew,LocalCell_Default,LocalColumn := column,RealValue := value );
+      }
+      traverse( localTable,LocalColumn,column,column.TimeUnit() = "Month" ){
+        value := sum( row,LocalCell.astype( LocalCell_Default ),cell,
+                      cell.LocalColumn().TimeUnit() = "Day" and 
+                      cell.LocalColumn().CustomDate() >= column.CustomDate() and 
+                      cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextMonth(),cell.RealValue());
+        row.LocalCell( relnew,LocalCell_Default,LocalColumn := column,RealValue := value );
+      }
+    }
+    
+    return localTable;
+  *]
+}
diff --git a/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_GetTableName.qbl b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_GetTableName.qbl
new file mode 100644
index 0000000..fdd18d6
--- /dev/null
+++ b/_Main/BL/Type_MP_Cell_AnnualPlanReport/StaticMethod_GetTableName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetTableName () const declarative remote as owning String
+{
+  TextBody:
+  [*
+    // rislai Aug-7-2024 (created)
+    return "鍏ㄥ勾璁″垝鎶ヨ〃";
+  *]
+}
diff --git a/_Main/BL/Type_MP_Cell_AnnualPlanReport/_ROOT_Type_MP_Cell_AnnualPlanReport.qbl b/_Main/BL/Type_MP_Cell_AnnualPlanReport/_ROOT_Type_MP_Cell_AnnualPlanReport.qbl
new file mode 100644
index 0000000..8f10ada
--- /dev/null
+++ b/_Main/BL/Type_MP_Cell_AnnualPlanReport/_ROOT_Type_MP_Cell_AnnualPlanReport.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization MP_Cell_AnnualPlanReport
+{
+  #keys: '2[412672.1.107700065][412672.1.107700060]'
+  Parent: MP_Cell
+  StructuredName: 'MP_Cell_AnnualPlanReports'
+}
diff --git a/_Main/BL/Type_MP_Row/Attribute_ProductID.qbl b/_Main/BL/Type_MP_Row/Attribute_ProductID.qbl
new file mode 100644
index 0000000..1aec101
--- /dev/null
+++ b/_Main/BL/Type_MP_Row/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[412672.1.107684682][412672.1.107684681][412672.1.107684683]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MP_Row/Attribute_StockingPointID.qbl b/_Main/BL/Type_MP_Row/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..d274c47
--- /dev/null
+++ b/_Main/BL/Type_MP_Row/Attribute_StockingPointID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[412672.1.107684692][412672.1.107684691][412672.1.107684693]'
+  ValueType: String
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogBESIWarning/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogBESIWarning/Response_pnlActions_btnOk_OnClick.def
index a70e1aa..9f327be 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogBESIWarning/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogBESIWarning/Response_pnlActions_btnOk_OnClick.def
@@ -4,6 +4,14 @@
 {
   #keys: '[414996.0.415672898]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := efBESI.Text().ToUpper() ~ "BESI";
+    if( not flag ){
+      feedback := "鏂囦欢鍚嶄腑闇�瑕佸寘鍚獴ESI"; 
+    }
+    return flag;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def b/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def
index 20b8c8e..6d90515 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def
@@ -45,7 +45,7 @@
           Properties:
           [
             DataType: 'LocalTable'
-            FilterArguments: 'checkedProduct:QMacroPlanner::FormOfflinePlanComparison701.dhFinelProduct'
+            FilterArguments: 'checkedProduct:QMacroPlanner::FormOfflinePlanChanges.dhFinelProduct'
             FixedFilter: 'exists( checkedProduct,Elements,product,product.ID() = object.Name() )'
             Source: 'dhComparisonData'
             Taborder: 0
@@ -73,7 +73,7 @@
           Properties:
           [
             DataType: 'LocalTable'
-            FilterArguments: 'startDate:QMacroPlanner::FormOfflinePlanComparison701.dhStartDate;endDate:QMacroPlanner::FormOfflinePlanComparison701.dhEndDate'
+            FilterArguments: 'startDate:QMacroPlanner::FormOfflinePlanChanges.dhStartDate;endDate:QMacroPlanner::FormOfflinePlanChanges.dhEndDate'
             FixedFilter: 'not object.IsAttrbuteColumn() and startDate <= object.Date() and endDate > object.Date() '
             Source: 'dhComparisonData'
             Taborder: 0
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor.def
new file mode 100644
index 0000000..aea0bf8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor.def
@@ -0,0 +1,103 @@
+Quintiq file version 2.0
+Component MatrixEditor
+{
+  #keys: '[412672.1.106503687]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell
+    {
+      #keys: '[412672.1.106503688]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCells
+        {
+          #keys: '[412672.1.106503689]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MP_Table'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'MP_Row.MP_Cell.astype(MP_Cell_AnnualPlanReport)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'NewSupply'
+        Column: 'MP_Column'
+        Row: 'MP_Row'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows
+    {
+      #keys: '[412672.1.106503690]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRows
+        {
+          #keys: '[412672.1.106503691]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MP_Table'
+            FilterArguments: 'checkedProduct:QMacroPlanner::FormAnnualPlanReport.dhFinelProduct;checkedStockingPoint:QMacroPlanner::FormAnnualPlanReport.dhFinelStockingPoint'
+            FixedFilter: 'exists( checkedProduct,Elements,entity,entity.ID() = object.ProductID()) and exists( checkedStockingPoint,Elements,entity,entity.DisplayName() = object.StockingPointID())'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'MP_Row'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns
+    {
+      #keys: '[412672.1.106503692]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumns
+        {
+          #keys: '[412672.1.106503693]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MP_Table'
+            FilterArguments: 'startDate:QMacroPlanner::FormAnnualPlanReport.dhStartDate;endDate:QMacroPlanner::FormAnnualPlanReport.dhEndDate'
+            FixedFilter: 'not object.IsAttrbuteColumn() and startDate <= object.Date() and endDate > object.Date() '
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'MP_Column'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Date'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageDemandComparison
+    #child: matrixeditorContextMenuDemandComparison
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumns'
+    ContextMenu: 'matrixeditorContextMenuDemandComparison'
+    Rows: 'MatrixEditorRows'
+    Taborder: 0
+    Visible: false
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor510\043127.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor510\043127.def"
new file mode 100644
index 0000000..e0b9cd6
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_MatrixEditor510\043127.def"
@@ -0,0 +1,102 @@
+Quintiq file version 2.0
+Component MatrixEditor510 id:MatrixEditor510_127
+{
+  #keys: '[412672.1.106503696]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell294
+    {
+      #keys: '[412672.1.106503697]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCells611
+        {
+          #keys: '[412672.1.106503698]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData854'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_Default)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'RealValue'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows221
+    {
+      #keys: '[412672.1.106503699]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRows116
+        {
+          #keys: '[412672.1.106503700]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'checkedProduct:QMacroPlanner::FormAnnualPlanReport.dhFinelProduct;checkedStockingPoint:QMacroPlanner::FormAnnualPlanReport.dhFinelStockingPoint'
+            FixedFilter: 'exists( checkedProduct,Elements,entity,entity.ID() = object.ProductID()) and exists( checkedStockingPoint,Elements,entity,entity.DisplayName() = object.StockingPointID())'
+            Source: 'dhComparisonData854'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns391
+    {
+      #keys: '[412672.1.106503701]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumns655
+        {
+          #keys: '[412672.1.106503702]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'startDate:QMacroPlanner::FormAnnualPlanReport.dhStartDate;endDate:QMacroPlanner::FormAnnualPlanReport.dhEndDate;timeUnit:QMacroPlanner::FormAnnualPlanReport.dhTimeUnit'
+            FixedFilter: 'not object.IsAttrbuteColumn() and startDate <= object.Date() and endDate > object.Date() and object.TimeUnit() = timeUnit'
+            Source: 'dhComparisonData854'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Date'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageDemandComparison234_1
+    #child: matrixeditorContextMenuDemandComparison527_1
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumns391'
+    ContextMenu: 'matrixeditorContextMenuDemandComparison527'
+    Rows: 'MatrixEditorRows221'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelAnnualPlan.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelAnnualPlan.def
new file mode 100644
index 0000000..d4eb82e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelAnnualPlan.def
@@ -0,0 +1,105 @@
+Quintiq file version 2.0
+Component PanelAnnualPlan
+{
+  #keys: '[412672.1.106503682]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component dhComparisonData
+    {
+      #keys: '[412672.1.106503683]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'MP_Table'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component dhCheckedProduct
+    {
+      #keys: '[412672.1.106503684]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Children:
+      [
+        Component deCheckedProduct
+        {
+          #keys: '[412672.1.106503685]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Product_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedProduct'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 5
+      ]
+    }
+    Component dhFinelProduct
+    {
+      #keys: '[412672.1.106503686]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+    Component dhComparisonData854
+    {
+      #keys: '[412672.1.106503705]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    #child: MatrixEditor
+    #child: MatrixEditor510_127
+    Component dhCheckedStockingPoint
+    {
+      #keys: '[412672.1.107978890]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Entity]*'
+      Children:
+      [
+        Component deCheckedStockingPoint
+        {
+          #keys: '[412672.1.107978891]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Entity]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedEntities'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 7
+      ]
+    }
+    Component dhFinelStockingPoint
+    {
+      #keys: '[412672.1.107978915]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Entity]*'
+      Properties:
+      [
+        Taborder: 6
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon\043805.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon\043805.def"
new file mode 100644
index 0000000..ea992df
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon\043805.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelRibbon id:PanelRibbon_805
+{
+  #keys: '[412672.1.106503600]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelRibbon322
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon322.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon322.def
new file mode 100644
index 0000000..1da6c09
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_PanelRibbon322.def
@@ -0,0 +1,102 @@
+Quintiq file version 2.0
+Component PanelRibbon322
+{
+  #keys: '[412672.1.106503607]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component dsStartDate
+    {
+      #keys: '[412672.1.106503612]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start Date'
+        Taborder: 4
+      ]
+    }
+    Component dhStartDate
+    {
+      #keys: '[412672.1.106503613]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 5
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.1.106503614]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End Date'
+        Taborder: 6
+      ]
+    }
+    Component dhEndDate
+    {
+      #keys: '[412672.1.106503615]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 7
+      ]
+    }
+    Component ButtonRibbon
+    {
+      #keys: '[412672.1.106504238]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'C_CLAMP'
+        Label: 'Create'
+        Taborder: 0
+        Visible: false
+      ]
+    }
+    Component ButtonRibbon682
+    {
+      #keys: '[412672.1.108512062]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'C_CLAMP'
+        Label: 'Create full table'
+        Taborder: 1
+      ]
+    }
+    Component rbgTimeUnit
+    {
+      #keys: '[412672.1.108680900]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        BoundValue: 'Day'
+        ButtonLabels: 'Day;Week;Month'
+        ButtonValues: 'Day;Week;Month'
+        Taborder: 2
+      ]
+    }
+    Component dhTimeUnit
+    {
+      #keys: '[412672.1.111067302]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'String*'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    #child: pExport
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison.def
new file mode 100644
index 0000000..34e0ac5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageDemandComparison
+{
+  #keys: '[412672.1.106503694]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison234\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison234\0431.def"
new file mode 100644
index 0000000..76c954d
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixEditorActionBarPageDemandComparison234\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageDemandComparison234 id:matrixEditorActionBarPageDemandComparison234_1
+{
+  #keys: '[412672.1.106503703]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison.def
new file mode 100644
index 0000000..a04c4b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuDemandComparison
+{
+  #keys: '[412672.1.106503695]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison527\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison527\0431.def"
new file mode 100644
index 0000000..b2e5697
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_matrixeditorContextMenuDemandComparison527\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuDemandComparison527 id:matrixeditorContextMenuDemandComparison527_1
+{
+  #keys: '[412672.1.106503704]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_pExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_pExport.def
new file mode 100644
index 0000000..35cd231
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Component_pExport.def
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+Component pExport
+{
+  #keys: '[412672.1.111157999]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bExport id:bExport_474
+    {
+      #keys: '[412672.1.111158037]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 0
+      ]
+    }
+    Component dhXMLDataListener id:dhXMLDataListener_801
+    {
+      #keys: '[412672.1.111158064]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ExportXMLManager'
+      Children:
+      [
+        Component DataExtractorRibbon id:DataExtractorRibbon_462
+        {
+          #keys: '[412672.1.111158065]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            FixedFilter: 'object.Name() = MP_Cell_ScheduleSummary::GetTableName()'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'ExportXMLManager'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component bDownload id:bDownload_520
+    {
+      #keys: '[412672.1.111158091]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOWNLOAD'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 8
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedProduct_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedProduct_OnDataChanged.def
new file mode 100644
index 0000000..348b3a1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedProduct_OnDataChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhCheckedProduct
+Response OnDataChanged () id:Response_PanelAnnualPlan_dhCheckedProduct_OnDataChanged
+{
+  #keys: '[412672.1.106503680]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        dhFinelProduct.Data( this.Data().Copy() );
+      }else{
+        dhFinelProduct.Data( DataHolderProduct.Data().Copy() );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedStockingPoint_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedStockingPoint_OnDataChanged.def
new file mode 100644
index 0000000..e3d55cb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhCheckedStockingPoint_OnDataChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhCheckedStockingPoint
+Response OnDataChanged () id:Response_PanelAnnualPlan_dhCheckedStockingPoint_OnDataChanged
+{
+  #keys: '[412672.1.107978888]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        dhFinelStockingPoint.Data( this.Data().Copy() );
+      }else{
+        dhFinelStockingPoint.Data( DataHolderEntities.Data().Copy() );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnCreated.def
new file mode 100644
index 0000000..97b60d1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnCreated.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhComparisonData854
+Response OnCreated () id:Response_PanelAnnualPlan_dhComparisonData854_OnCreated
+{
+  #keys: '[412672.1.106503674]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnDataChanged.def
new file mode 100644
index 0000000..3ea00c6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData854_OnDataChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhComparisonData854
+Response OnDataChanged () id:Response_PanelAnnualPlan_dhComparisonData854_OnDataChanged
+{
+  #keys: '[412672.1.106503673]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      PanelAnnualPlan.Title( this.Data().Name() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData_OnCreated.def
new file mode 100644
index 0000000..df2f792
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhComparisonData_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhComparisonData
+Response OnCreated () id:Response_PanelAnnualPlan_dhComparisonData_OnCreated
+{
+  #keys: '[412672.1.106503681]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      table := select( MacroPlan,MP_Table,table,table.Name() = MP_Cell_AnnualPlanReport::GetTableName() );
+      
+      dhComparisonData.Data( table );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelProduct_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelProduct_OnCreated.def
new file mode 100644
index 0000000..864b3b0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelProduct_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhFinelProduct
+Response OnCreated () id:Response_PanelAnnualPlan_dhFinelProduct_OnCreated
+{
+  #keys: '[412672.1.106503679]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( DataHolderProduct.Data().Copy() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelStockingPoint_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelStockingPoint_OnCreated.def
new file mode 100644
index 0000000..a5b1001
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelAnnualPlan_dhFinelStockingPoint_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelAnnualPlan/dhFinelStockingPoint
+Response OnCreated () id:Response_PanelAnnualPlan_dhFinelStockingPoint_OnCreated
+{
+  #keys: '[412672.1.107978913]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( DataHolderEntities.Data().Copy() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon682_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon682_OnClick.def
new file mode 100644
index 0000000..e1c1b14
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon682_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/ButtonRibbon682
+Response OnClick () id:Response_PanelRibbon322_ButtonRibbon682_OnClick
+{
+  #keys: '[412672.1.108512122]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      table := MP_Cell_AnnualPlanReport::CreateFullTable( ApplicationMacroPlanner.GetMacroPlans(),RecycleBin );
+      dhComparisonData854.Data( table );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon_OnClick.def
new file mode 100644
index 0000000..c7711e6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_ButtonRibbon_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/ButtonRibbon
+Response OnClick () id:Response_PanelRibbon322_ButtonRibbon_OnClick
+{
+  #keys: '[412672.1.106504261]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      table := MP_Cell_AnnualPlanReport::Create( MacroPlan );
+      
+      dhComparisonData.Data( table );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhEndDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhEndDate_OnCreated.def
new file mode 100644
index 0000000..9975661
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhEndDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/dhEndDate
+Response OnCreated () id:Response_PanelRibbon322_dhEndDate_OnCreated
+{
+  #keys: '[412672.1.106503587]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MaxDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhStartDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhStartDate_OnCreated.def
new file mode 100644
index 0000000..f2e53ed
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhStartDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/dhStartDate
+Response OnCreated () id:Response_PanelRibbon322_dhStartDate_OnCreated
+{
+  #keys: '[412672.1.106503589]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MinDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhTimeUnit_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhTimeUnit_OnCreated.def
new file mode 100644
index 0000000..d90dcb3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dhTimeUnit_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/dhTimeUnit
+Response OnCreated () id:Response_PanelRibbon322_dhTimeUnit_OnCreated
+{
+  #keys: '[412672.1.111098277]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( "Day" );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsEndDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsEndDate_OnChanged.def
new file mode 100644
index 0000000..edb6111
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsEndDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/dsEndDate
+Response OnChanged () id:Response_PanelRibbon322_dsEndDate_OnChanged
+{
+  #keys: '[412672.1.106503588]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhEndDate.Data( this.Date() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsStartDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsStartDate_OnChanged.def
new file mode 100644
index 0000000..d9d9e73
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_dsStartDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/dsStartDate
+Response OnChanged () id:Response_PanelRibbon322_dsStartDate_OnChanged
+{
+  #keys: '[412672.1.106503590]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhStartDate.Data( this.Date() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_rbgTimeUnit_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_rbgTimeUnit_OnUserChanged.def
new file mode 100644
index 0000000..f56289a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_PanelRibbon322_rbgTimeUnit_OnUserChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon322/rbgTimeUnit
+Response OnUserChanged () id:Response_PanelRibbon322_rbgTimeUnit_OnUserChanged
+{
+  #keys: '[412672.1.111001324]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnUserChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhTimeUnit.Data( this.BoundValue() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bDownload_OnClick.def
new file mode 100644
index 0000000..213451f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bDownload_OnClick.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: pExport/bDownload_520
+Response OnClick () id:Response_pExport_bDownload_OnClick
+{
+  #keys: '[412672.1.111158090]'
+  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( MP_Cell_ScheduleSummary::GetTableName() + "_" + DateTime::Now().Format( "YM2D2H2mmss" ) + ".xlsx", binaryValue.AsBinaryData() );
+      
+      dhXMLDataListener.Data( ).Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bExport_OnClick.def
new file mode 100644
index 0000000..0f71325
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/Response_pExport_bExport_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: pExport/bExport_474
+Response OnClick () id:Response_pExport_bExport_OnClick
+{
+  #keys: '[412672.1.111158036]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      rows := selectset( dhComparisonData854.Data(),LocalRow,row,exists( dhFinelProduct.Data(),Elements,entity,entity.ID() = row.ProductID()) and exists( dhFinelStockingPoint.Data(),Elements,entity,entity.DisplayName() = row.StockingPointID())); 
+      columns := selectset( dhComparisonData854.Data(),LocalColumn,column,dhStartDate.Data() <= column.Date() and dhEndDate.Data() > column.Date() );
+      LocalCell_ScheduleSummary::AsyncExport( RecycleBin,rows,columns );
+      //Application.Download( "浜у嚭瀵煎叆妯℃澘.xlsx",data.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/_ROOT_Component_FormAnnualPlanReport.def b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/_ROOT_Component_FormAnnualPlanReport.def
new file mode 100644
index 0000000..d525bba
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAnnualPlanReport/_ROOT_Component_FormAnnualPlanReport.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormAnnualPlanReport
+{
+  #keys: '[412672.1.106503510]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelRibbon_805
+    #child: PanelAnnualPlan
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_HEART'
+    Title: '鍏ㄥ勾璁″垝鎶ヨ〃'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
index 915e9ca..64ff7df 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
@@ -45,6 +45,8 @@
           Properties:
           [
             DataType: 'LocalTable'
+            FilterArguments: 'checkedEntity:QMacroPlanner::FormComprehensiveStandardHoursReport.dhFinelEntity'
+            FixedFilter: 'exists( checkedEntity,Elements,entity,entity.DisplayName() = object.Name())'
             Source: 'dhTable'
             Taborder: 0
             Transformation: 'LocalRow'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
index 8755839..48edb9f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
@@ -16,6 +16,41 @@
         Taborder: 1
       ]
     }
+    Component dhFinelEntity
+    {
+      #keys: '[412672.1.111002548]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Entity]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhCheckedEntity
+    {
+      #keys: '[412672.1.111002571]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Entity]*'
+      Children:
+      [
+        Component deCheckedStockingPoint id:deCheckedStockingPoint_217
+        {
+          #keys: '[412672.1.111002572]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Entity]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedEntities'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def" "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
index 8be63c5..2162fa1 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
@@ -52,10 +52,57 @@
       BaseType: 'WebButton'
       Properties:
       [
+        Image: 'CALCULATOR'
         Label: 'Calculating'
         Taborder: 4
       ]
     }
+    Component bExport
+    {
+      #keys: '[412672.1.106501907]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 5
+      ]
+    }
+    Component bDownload
+    {
+      #keys: '[412672.1.106502003]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOWNLOAD'
+        Taborder: 6
+      ]
+    }
+    Component dhXMLDataListener
+    {
+      #keys: '[412672.1.106502023]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[ExportXMLManager]*'
+      Children:
+      [
+        Component DataExtractor510
+        {
+          #keys: '[412672.1.106502024]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            FixedFilter: 'object.Name() = "缁煎悎宸ユ椂鍒舵姤琛�" or object.Name() = "鏍囧噯宸ユ椂鍒舵姤琛�"'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'ExportXMLManager'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 7
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhCheckedEntity_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhCheckedEntity_OnDataChanged.def
new file mode 100644
index 0000000..e3b873c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhCheckedEntity_OnDataChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: Panel743/dhCheckedEntity
+Response OnDataChanged () id:Response_Panel743_dhCheckedEntity_OnDataChanged
+{
+  #keys: '[412672.1.111002569]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        dhFinelEntity.Data( this.Data().Copy() );
+      }else{
+        dhFinelEntity.Data( DataHolderEntities.Data().Copy() );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhFinelEntity_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhFinelEntity_OnCreated.def
new file mode 100644
index 0000000..fb690d3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_Panel743_dhFinelEntity_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Panel743/dhFinelEntity
+Response OnCreated () id:Response_Panel743_dhFinelEntity_OnCreated
+{
+  #keys: '[412672.1.111002546]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( DataHolderEntities.Data().Copy() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bDownload_OnClick.def
new file mode 100644
index 0000000..a657040
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bDownload_OnClick.def
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: pOperaction/bDownload
+Response OnClick () id:Response_PanelOperation_568_bDownload_OnClick
+{
+  #keys: '[412672.1.106502002]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := true;
+    feedback := ""; 
+    if( dhXMLDataListener.Data().Size() = 0 ){
+      flag := false;
+      feedback := "褰撳墠鏃犱笅杞芥暟鎹紝鐐瑰嚮瀵煎嚭鍒涘缓涓嬭浇鏁版嵁銆�"
+    }
+    return flag;
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      traverse( dhXMLDataListener.Data(),Elements,element ){
+        binaryValue := element.Export();
+      
+        Application.Download( element.Name() + "_" + DateTime::Now().Format( "YM2D2H2mmss" ) + ".xlsx", binaryValue.AsBinaryData() );
+      
+        element.Delete();
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bExport_OnClick.def
new file mode 100644
index 0000000..2fee64b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bExport_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pOperaction/bExport
+Response OnClick () id:Response_pOperaction_bExport_OnClick
+{
+  #keys: '[412672.1.106502326]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      rows := selectset( dhTable.Data(),LocalRow,row,true );
+      columns := selectset( dhTable.Data( ),LocalColumn,column,true );
+      LocalCell_Default::AsyncExport( RecycleBin, rows, columns );
+    *]
+  }
+}

--
Gitblit v1.9.3