From be10d38e5c56c0070d6acfd344ebfae30ee5b0ac Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期五, 16 八月 2024 17:56:36 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg

---
 _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_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonAnnualPlanReport_OnClick.def |   17 
 _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_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                            |   11 
 _Main/UI/MacroPlannerWebApp/Component_Form701/Component_MatrixEditor.def                                                                    |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormMachineLogisticsCostReport/Component_pHeader.def                                                  |    2 
 _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/Views/AnnualPlanReport.vw                                                                                       |  255 +++++++++
 _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 
 58 files changed, 1,628 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_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index 25803c6..be2f284 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -172,6 +172,17 @@
         Taborder: 12
       ]
     }
+    Component ButtonAnnualPlanReport
+    {
+      #keys: '[412672.1.111811769]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_HEART'
+        Label: '鍏ㄥ勾璁″垝鎶ヨ〃'
+        Taborder: 13
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonAnnualPlanReport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonAnnualPlanReport_OnClick.def
new file mode 100644
index 0000000..30862a0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonAnnualPlanReport_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonAnnualPlanReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonAnnualPlanReport_OnClick
+{
+  #keys: '[412672.1.111811838]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'AnnualPlanReport', this );
+    *]
+    GroupServerCalls: false
+  }
+}
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_FormMachineLogisticsCostReport/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachineLogisticsCostReport/Component_pHeader.def
index 1a7eefd..088afc8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMachineLogisticsCostReport/Component_pHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachineLogisticsCostReport/Component_pHeader.def
@@ -32,6 +32,8 @@
       BaseType: 'WebButton'
       Properties:
       [
+        Image: 'PIG'
+        Label: 'Button655'
         Taborder: 2
       ]
     }
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 );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/AnnualPlanReport.vw b/_Main/UI/MacroPlannerWebApp/Views/AnnualPlanReport.vw
new file mode 100644
index 0000000..6e4c2ef
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/AnnualPlanReport.vw
@@ -0,0 +1,255 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormAnnualPlanReport
+      {
+        title: 'QMacroPlanner::FormAnnualPlanReport'
+        shown: true
+        componentID: 'QMacroPlanner::FormAnnualPlanReport'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 20
+          columnPosition: 1
+          columnSpan: 9
+        }
+        components
+        {
+          FormAnnualPlanReport_PanelRibbon
+          {
+            sizeRatio: 1
+          }
+          FormAnnualPlanReport_PanelRibbon322
+          {
+            sizeRatio: 1
+          }
+          FormAnnualPlanReport_pExport
+          {
+            sizeRatio: 1
+          }
+          FormAnnualPlanReport_PanelAnnualPlan
+          {
+            sizeRatio: 1
+          }
+          FormAnnualPlanReport_MatrixEditor
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 341
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormAnnualPlanReport.MatrixEditor'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_NewSupply
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'NewSupply'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+              }
+            }
+          }
+          FormAnnualPlanReport_MatrixEditor510
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormAnnualPlanReport.MatrixEditor510'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_RealValue
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'RealValue'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+              CarCo_KPISetting: 'Blending'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 26
+    image: 'DOCUMENT_HEART'
+    description: ''
+  }
+  formatversion: 2
+  id: 'AnnualPlanReport'
+  name: 'AnnualPlanReport'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3