From 890bde3948fb93abb133993a8e9c70fb452ed23e Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期五, 28 六月 2024 15:58:49 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/_ROOT_Component_FormFinancialProductionReport.def                                |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def                                                  |    2 
 _Main/BL/InfoMessages.qbl                                                                                                                            |   36 +
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bExport_OnClick#723.def                                       |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def                                                           |   25 
 _Main/BL/Type_FinancialProductionSource/Method_Filter.qbl                                                                                            |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPR.def                                                                |   94 +-
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelFinancialProductionReportOperation_ButtonProductionImport_OnCl.def |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListCompareVersionPR_OnSelectionChanged#599.def             |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionCurve.def                                                             |   83 ++
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DropDownListBaseVersionIDS_OnSelectionChanged.def                  |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListBaseVersionPPA_OnSelectionChanged.def                  |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPP.def                                                                |   83 ++
 _Main/BL/Type_FinancialProductionReport/Method_ImportVerification.qbl                                                                                |   57 +
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListBaseVersionPP_OnSelectionChanged.def                    |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportHeader.def                               |    3 
 _Main/BL/Type_FinancialProductionRow/Method_Initialize#110.qbl                                                                                       |   15 
 _Main/Sys/Repr/Global/LocalCell_DemandComparison.qrp                                                                                                 |   51 +
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListBaseVersionBudget_OnSelectionChanged.def            |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DataExtractorOperationIDS_OnSelectionChanged.def                   |   21 
 _Main/BL/Type_FinancialProductionSearch/Attribute_Generation.qbl                                                                                     |    7 
 _Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl                                                                            |   10 
 _Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultName.qbl                                                                              |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionIDS.def                                                               |   83 ++
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def                                     |   18 
 _Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl                                                                            |   10 
 _Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl                                                                                       |   41 +
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillCells.qbl                                                                                  |    0 
 _Main/BL/Type_FinancialProductionSource/Attribute_IsImport.qbl                                                                                       |    7 
 _Main/BL/Type_FinancialProductionSource/Method_ReadStructure.qbl                                                                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListBaseVersionPR_OnSelectionChanged#98.def                 |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison294.def                                                    |   16 
 _Main/BL/Type_FinancialProductionSearch/_ROOT_Type_FinancialProductionSearch.qbl                                                                     |   10 
 _Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl                                                                                           |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_MatrixEditorTable.def                                                  |   97 ++
 _Main/BL/Type_FinancialProductionRow/DefaultValue_DuplicateValueMarker.qbl                                                                           |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPR_OnChanged.def                                    |   16 
 _Main/BL/Type_FinancialProductionReport/Attribute_IsImport.qbl                                                                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxIDS_OnChanged.def                                   |   16 
 _Main/BL/Type_FinancialProductionRow/Attribute_Unit.qbl                                                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def                           |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def                               |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPPA_OnChanged.def                                   |   16 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl                                                                        |    0 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxBudget_OnChanged.def                                |   16 
 _Main/BL/Type_FinancialProductionReport/Attribute_IsShow.qbl                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListCompareVersionPPA_OnSelectionChanged.def               |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bDownload_OnClick#781.def                                     |    6 
 _Main/BL/Type_FinancialProductionReport/Method_IdentifyNullValues.qbl                                                                                |   53 +
 _Main/BL/Type_FinancialProductionReport/Method_GenerateColumn.qbl                                                                                    |   20 
 _Main/BL/Type_FinancialProductionRow/Attribute_DuplicateValueMarker.qbl                                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPPA.def                                                               |   83 ++
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListCompareVersionPP_OnSelectionChanged.def                 |   21 
 _Main/BL/Type_FinancialProductionSearch/Attribute_Unit.qbl                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation#568.def                                                          |  112 +++
 _Main/BL/Type_FinancialProductionReport/Method_Clear.qbl                                                                                             |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelectionChecks.def                                                        |   75 ++
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def                   |   19 
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                                             |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionBudget.def                                                            |   83 ++
 _Main/BL/Type_FinancialProductionSearch/Attribute_MqbMlb.qbl                                                                                         |    7 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl                                                                                    |   41 +
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxCurve_OnChanged.def                                 |   16 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl                                                                                   |   26 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListBaseVersionCurve_OnSelectionChanged.def              |   21 
 _Main/BL/Type_FinancialProductionSearch/Attribute_Power.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListCompareVersionCurve_OnSelectionChanged.def           |   21 
 _Main/BL/Type_FinancialProductionSource/Method_IsExistFutureMonthData.qbl                                                                            |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListCompareVersionBudget_OnSelectionChange.def          |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixEditorActionBarPageTable.def                                     |   10 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl                                                                                  |   85 ++
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnCreated.def                                        |   19 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Upload.qbl                                                                                      |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelTable.def                                                         |   14 
 _Main/BL/Type_FinancialProductionReport/Method_Generate.qbl                                                                                          |   44 +
 /dev/null                                                                                                                                            |   10 
 _Main/BL/Relations/Relation_FinancialProductionSearch_FinancialProductionSource_FinancialProduc.qbl                                                  |   23 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_DownloadTemplate.qbl                                                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPP_OnChanged.def                                    |   16 
 _Main/BL/Type_FinancialProductionRow/Method_Filter.qbl                                                                                               |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelPower_ddslPower_OnSelectionChanged.def                             |   19 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl                                                                          |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelUnit.def                                                          |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelection.def                                                              |   21 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillRows.qbl                                                                                   |    0 
 _Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultAllUnit.qbl                                                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixeditorContextMenuTable.def                                       |   10 
 87 files changed, 2,030 insertions(+), 101 deletions(-)

diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index c2762b7..2e0fc10 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -98,6 +98,42 @@
   {
     DefaultText: 'The two products selected are the same.'
   }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyDuplicateData
+  {
+    DefaultText: 'There is duplicate data present.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyFactoryNoExist
+  {
+    DefaultText: 'Factory does not exist.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyIllegalCharacter
+  {
+    DefaultText: 'The required quantity contains illegal characters.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyIllegalTime
+  {
+    DefaultText: 'The required period contains illegal time.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyNegativeNumber
+  {
+    DefaultText: 'The required quantity includes negative numbers.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyNullStrings
+  {
+    DefaultText: 'Required fields contain empty data.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyOverPeriod
+  {
+    DefaultText: 'The template month is not within the planning cycle.'
+  }
+  InfoMessage MP_FinancialProductionReport_ImportIndetifyProductNoExist
+  {
+    DefaultText: 'Product does not exist.'
+  }
+  InfoMessage MP_FinancialProductionReport_Question
+  {
+    DefaultText: '瀵煎叆妯℃澘鍖呭惈鏈潵鏈堜唤鐨勮储鍔℃暟鎹紝鏄惁瑕嗙洊绯荤粺璁$畻缁撴灉锛�'
+  }
   InfoMessage MP_LibCal_EventType_Exist
   {
     DefaultText: 'The ID or name is the same.'
diff --git a/_Main/BL/Relations/Relation_FinancialProductionSearch_FinancialProductionSource_FinancialProduc.qbl b/_Main/BL/Relations/Relation_FinancialProductionSearch_FinancialProductionSource_FinancialProduc.qbl
new file mode 100644
index 0000000..1fb618d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_FinancialProductionSearch_FinancialProductionSource_FinancialProduc.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation FinancialProductionSearch_FinancialProductionSource_FinancialProductionSource_FinancialProductionSearch
+{
+  #keys: '1[415136.0.854770948]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide FinancialProductionSource
+  {
+    #keys: '3[415136.0.854770950][415136.0.854770949][415136.0.854770951]'
+    Cardinality: '0to1'
+    ObjectDefinition: FinancialProductionSearch
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide FinancialProductionSearch
+  {
+    #keys: '3[415136.0.854770953][415136.0.854770952][415136.0.854770954]'
+    Cardinality: '0to1'
+    ObjectDefinition: FinancialProductionSource
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Attribute_IsImport.qbl b/_Main/BL/Type_FinancialProductionReport/Attribute_IsImport.qbl
index c8eb836..125eb9d 100644
--- a/_Main/BL/Type_FinancialProductionReport/Attribute_IsImport.qbl
+++ b/_Main/BL/Type_FinancialProductionReport/Attribute_IsImport.qbl
@@ -2,6 +2,6 @@
 #parent: #root
 Attribute IsImport
 {
-  #keys: '3[415136.0.834715063][415136.0.834715062][415136.0.834715064]'
+  #keys: '3[415136.0.842718583][415136.0.842718582][415136.0.842718584]'
   ValueType: Boolean
 }
diff --git a/_Main/BL/Type_FinancialProductionReport/Attribute_IsShow.qbl b/_Main/BL/Type_FinancialProductionReport/Attribute_IsShow.qbl
new file mode 100644
index 0000000..7d5bdf3
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Attribute_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsShow
+{
+  #keys: '3[415136.0.853939545][415136.0.853939544][415136.0.853939546]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_Clear.qbl b/_Main/BL/Type_FinancialProductionReport/Method_Clear.qbl
new file mode 100644
index 0000000..a629770
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Method_Clear.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Method Clear
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    this.FinancialProductionColumn( relflush );
+    this.FinancialProductionRow( relflush );
+    
+    this.GenerateColumn( this.FinancialProductionSource().MacroPlan() );
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl b/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl
new file mode 100644
index 0000000..8ed085f
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method Generate (
+  FinancialProductionSearch search,
+  Product_MPs products
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    table      := selectobject( this, FinancialProductionSource.FinancialProductionReport, report, not report.IsShow() );
+    allunit    := '<All>';
+    //娓呯┖涔嬪墠瀛樺偍鐨勬樉绀烘暟鎹�
+    this.Clear();
+    //杩囨护鍚庣殑浜у搧id
+    productids := selectuniquevalues( products, Elements, product, ( search.Generation() = allunit or product.Generation() = search.Generation() )
+                                      and ( search.MqbMlb() = allunit or product.MQBMLB() = search.MqbMlb() )
+                                      and ( search.Power() = allunit or product.Power() = search.Power() ), product.ID() );
+    sumrow     := this.FinancialProductionRow( relnew, Name := 'SUM', Unit := search.Unit(), RowNr := table.FinancialProductionRow( relsize ) );
+    traverse( table, FinancialProductionRow, row, row.Unit() = search.Unit() ){
+      productid  := construct( Strings );
+      productid.Add( row.Name() );
+      
+      if( productids.ContainsAll( productid ) ){
+        showrow := this.FinancialProductionRow( relnew, Name := row.Name(), Unit := row.Unit(), RowNr := row.RowNr() );
+        
+        traverse( row, FinancialProductionCell, cell ){
+          column   := selectobject( this, FinancialProductionColumn, column, column.Name() = cell.FinancialProductionColumn().Name() );
+          
+          sumcell  := selectobject( column, FinancialProductionCell, c, c.FinancialProductionRow() = sumrow );
+          if( isnull( sumcell ) ){
+            sumcell := column.FinancialProductionCell( relnew, Value := '0' );
+            sumrow.FinancialProductionCell( relinsert, sumcell );
+          }
+          
+          showcell := column.FinancialProductionCell( relnew, Value := cell.Value() );
+          showrow.FinancialProductionCell( relinsert, showcell );
+          value := [Real]cell.Value() + [Real]sumcell.Value();
+          sumcell.Value( [String]value );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_GenerateColumn.qbl b/_Main/BL/Type_FinancialProductionReport/Method_GenerateColumn.qbl
new file mode 100644
index 0000000..85b473e
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Method_GenerateColumn.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method GenerateColumn (
+  MacroPlan owner
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    startofplanning           := owner.StartOfPlanning();
+    startofyear               := startofplanning.StartOfYear();
+    startofnextyear           := startofplanning.StartOfNextYear();
+    
+    for( start := startofyear; start < startofnextyear; start := start.StartOfNextMonth() ){
+      periodtime := start.Date();
+      periodname := periodtime.Format( "M2/D2/Y" );
+      this.FinancialProductionColumn( relnew, Name := periodname, Period := periodtime );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_IdentifyNullValues.qbl b/_Main/BL/Type_FinancialProductionReport/Method_IdentifyNullValues.qbl
new file mode 100644
index 0000000..eea236e
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Method_IdentifyNullValues.qbl
@@ -0,0 +1,53 @@
+Quintiq file version 2.0
+#parent: #root
+Method IdentifyNullValues
+{
+  TextBody:
+  [*
+    // 鍒犻櫎绌鸿鏁版嵁
+    productcolumn := selectobject( this, FinancialProductionColumn, column, column.Index() = 0 );
+    unitcolumn    := selectobject( this, FinancialProductionColumn, column, column.Index() = 1 );
+    //鍒犻櫎娌℃湁瀵瑰簲鏃ユ湡鏁版嵁鐨勮
+    traverse ( this, FinancialProductionRow, row ) {
+      if ( forall( row, FinancialProductionCell, cell, true, ( cell.FinancialProductionColumn() <> productcolumn or cell.FinancialProductionColumn() <> unitcolumn ) and cell.Value().TrimBoth() = "" ) ) {
+        row.Delete();
+      }
+    }
+    
+    // 鍒ゆ柇鏄惁瀛樺湪璐熸暟
+    traverse ( this, FinancialProductionRow.FinancialProductionCell, cell ) { 
+      if ( cell.FinancialProductionColumn().Index() <= 1 ) {
+        if ( cell.Value().TrimBoth() = "" ) {
+          error( Translations::MP_FinancialProductionReport_ImportIndetifyNullStrings() );
+        }
+      } else {
+        if ( cell.Value().TrimBoth() = "" ) {
+          cell.Value( '0' );
+    //      error( Translations::AC_SalesForecastInputSource_Error6() );
+        } else {
+          stn := StringToReal::StandardConverter();
+          if ( not stn.CanConvert( cell.Value().TrimBoth() ) ) {
+            error( Translations::MP_FinancialProductionReport_ImportIndetifyIllegalCharacter() );
+          } else {
+            if ( stn.Convert( cell.Value().TrimBoth() ) >= 0 ) {
+              cell.Value( [String]ceil( stn.Convert( cell.Value().TrimBoth() ) ) );
+            } else {
+              error( Translations::MP_FinancialProductionReport_ImportIndetifyNegativeNumber() );
+            }
+          }
+        }
+      }
+      
+      cell.FinancialProductionRow().DuplicateValueMarker( cell.FinancialProductionRow().DuplicateValueMarker()                  + 
+                                                        ifexpr( cell.FinancialProductionColumn().Index() = 0, "", "-" ) +
+                                                        cell.Value()
+                                                       );
+    }
+    
+    // 鍒ゆ柇鏄惁瀛樺湪閲嶅鏁版嵁
+    row := selectduplicates( this, FinancialProductionRow, row, true, row.DuplicateValueMarker() );
+    if ( row.Size() > 1 ) {
+      error( Translations::MP_FinancialProductionReport_ImportIndetifyDuplicateData() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_ImportVerification.qbl b/_Main/BL/Type_FinancialProductionReport/Method_ImportVerification.qbl
new file mode 100644
index 0000000..55ea3ee
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/Method_ImportVerification.qbl
@@ -0,0 +1,57 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportVerification
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-27-2024 (created)
+    owner           := this.FinancialProductionSource().MacroPlan();
+    startofthisyear := owner.StartOfPlanning().StartOfYear().Date();
+    startofnextyear := owner.StartOfPlanning().StartOfNextYear().Date();
+    
+    if ( exists( this, FinancialProductionColumn, column, ( column.Index() = 0 and column.Name() <> "Product" )             or 
+                                                      ( column.Index() = 1 and column.Name() <> "Unit" )  ) ){
+      error( Translations::MP_FinancialProductionReport_ImportIndetifyNullStrings() );
+    }
+    
+    indexcolumn := select( this, FinancialProductionColumn, column, column.Index() = 2 );
+    if ( isnull( indexcolumn ) ) {
+      error( Translations::MP_FinancialProductionReport_ImportIndetifyNullStrings() );
+    } else {
+      cnv2 := StringToDate::StandardConverter();
+      cnv2.SetCustomConversion();
+      cnv2.CustomFormatString( "dd/MM/yyyy" );
+    
+      while ( not isnull( indexcolumn ) ) {
+        if ( not cnv2.CanConvert( indexcolumn.Name() ) ) {
+          error( Translations::MP_FinancialProductionReport_ImportIndetifyIllegalTime() );
+        }
+        period := cnv2.Convert( indexcolumn.Name() );
+      //  info( "寮�濮嬫椂闂达細", this.SalesForecastInputSource().PlanningStartDate().Format( "Y-M2-D2" ),
+      //        "缁撴潫鏃堕棿锛�", this.SalesForecastInputSource().PlanningEndDate().Format( "Y-M2-D2" ),
+      //        "鍒楁椂闂达細", cnv2.Convert( indexColumn.name() ).Format( "Y-M2-D2" ) );
+        // 鍒ゆ柇鏄惁鍦ㄨ鍒掑懆鏈熷唴
+        if ( period <= startofthisyear or period >= startofnextyear ) {
+          error( Translations::MP_FinancialProductionReport_ImportIndetifyOverPeriod() );
+        }
+        indexcolumn := indexcolumn.NextColumn();
+      }
+    }
+    
+    productcolumn := selectobject( this, FinancialProductionColumn, column, column.Index() = 0 );
+    unitcolumn    := selectobject( this, FinancialProductionColumn, column, column.Index() = 1 );
+    
+    units         := selectuniquevalues( unitcolumn, FinancialProductionCell, cell, cell.Value() );
+    if( units.Size() <> 2 or ( units.Find( FinancialProductionReport::GetDefaultCCUnit() ) >= 0 
+                               and units.Find( FinancialProductionReport::GetDefaultDLUnit() ) >= 0 ) ){
+      error( Translations::MP_FinancialProductionReport_ImportIndetifyFactoryNoExist() );
+    }
+    
+    products     := selectuniquevalues( productcolumn, FinancialProductionCell, cell, cell.Value() );
+    productnames := selectuniquevalues( owner, Product_MP, product, product.ID() );
+    
+    if( not productnames.ContainsAll( products ) ){
+      error( Translations::MP_FinancialProductionReport_ImportIndetifyProductNoExist() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultAllUnit.qbl b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultAllUnit.qbl
new file mode 100644
index 0000000..e912c3f
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultAllUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultAllUnit () const declarative as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '<All>';
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl
new file mode 100644
index 0000000..e469589
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬';
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl
new file mode 100644
index 0000000..71132d4
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛';
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultName.qbl b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultName.qbl
new file mode 100644
index 0000000..99eb092
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultName () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return 'Financial productions';
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionRow/Attribute_DuplicateValueMarker.qbl b/_Main/BL/Type_FinancialProductionRow/Attribute_DuplicateValueMarker.qbl
new file mode 100644
index 0000000..4374a63
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/Attribute_DuplicateValueMarker.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DuplicateValueMarker
+{
+  #keys: '3[415136.0.857450433][415136.0.857450432][415136.0.857450434]'
+  Description: '鍒ゆ柇鏄惁瀛樺湪閲嶅鍊�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionRow/Attribute_Unit.qbl b/_Main/BL/Type_FinancialProductionRow/Attribute_Unit.qbl
new file mode 100644
index 0000000..2131a22
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[415136.0.842400951][415136.0.842400950][415136.0.842400952]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionRow/DefaultValue_DuplicateValueMarker.qbl b/_Main/BL/Type_FinancialProductionRow/DefaultValue_DuplicateValueMarker.qbl
new file mode 100644
index 0000000..bbb8a45
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/DefaultValue_DuplicateValueMarker.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: DuplicateValueMarker
+}
diff --git a/_Main/BL/Type_FinancialProductionRow/Method_Filter.qbl b/_Main/BL/Type_FinancialProductionRow/Method_Filter.qbl
new file mode 100644
index 0000000..8c62e9b
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/Method_Filter.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method Filter (
+  FinancialProductionSearch search,
+  Product_MPs products
+) declarative remote as Boolean
+{
+  Description: '杩囨护'
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    allunit    := '<All>';
+    productids := selectuniquevalues( products, Elements, product, ( search.Generation() = allunit or product.Generation() = search.Generation() )
+                                      and ( search.MqbMlb() = allunit or product.MQBMLB() = search.MqbMlb() )
+                                      and ( search.Power() = allunit or product.Power() = search.Power() ), product.ID() );
+    
+    productid  := construct( Strings );
+    productid.Add( this.Name() );
+    
+    return productids.ContainsAll( productid ) and this.Unit() = search.Unit();
+  *]
+}
diff --git "a/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl" "b/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl"
new file mode 100644
index 0000000..ca0352d
--- /dev/null
+++ "b/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  FinancialProductionColumn column,
+  String unit
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := column.FinancialProductionCell( relnew, Value := '' );
+    
+    this.FinancialProductionCell( relinsert, cell );
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl b/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl
new file mode 100644
index 0000000..2bdcc0c
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  FinancialProductionColumn column,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, FinancialProductionCell, cell, cell.FinancialProductionColumn() = column );
+          
+    value := [Real]cell.Value() + quantity;
+    cell.Value( [String]value );
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionSearch/Attribute_Generation.qbl b/_Main/BL/Type_FinancialProductionSearch/Attribute_Generation.qbl
new file mode 100644
index 0000000..1f3448b
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSearch/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[415136.0.854770962][415136.0.854770961][415136.0.854770963]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionSearch/Attribute_MqbMlb.qbl b/_Main/BL/Type_FinancialProductionSearch/Attribute_MqbMlb.qbl
new file mode 100644
index 0000000..f82aef2
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSearch/Attribute_MqbMlb.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MqbMlb
+{
+  #keys: '3[415136.0.854770972][415136.0.854770971][415136.0.854770973]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionSearch/Attribute_Power.qbl b/_Main/BL/Type_FinancialProductionSearch/Attribute_Power.qbl
new file mode 100644
index 0000000..a7abf83
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSearch/Attribute_Power.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Power
+{
+  #keys: '3[415136.0.854770982][415136.0.854770981][415136.0.854770983]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionSearch/Attribute_Unit.qbl b/_Main/BL/Type_FinancialProductionSearch/Attribute_Unit.qbl
new file mode 100644
index 0000000..4005f62
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSearch/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[415136.0.854770939][415136.0.854770938][415136.0.854770940]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionSearch/_ROOT_Type_FinancialProductionSearch.qbl b/_Main/BL/Type_FinancialProductionSearch/_ROOT_Type_FinancialProductionSearch.qbl
new file mode 100644
index 0000000..ed2c807
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSearch/_ROOT_Type_FinancialProductionSearch.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type FinancialProductionSearch
+{
+  #keys: '5[415136.0.854770935][415136.0.854770933][0.0.0][415136.0.854770934][415136.0.854770936]'
+  BaseType: Object
+  Description: '鏌ヨ绫�'
+  StructuredName: 'FinancialProductionSearchs'
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/Attribute_IsImport.qbl b/_Main/BL/Type_FinancialProductionSource/Attribute_IsImport.qbl
new file mode 100644
index 0000000..cc83511
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/Attribute_IsImport.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsImport
+{
+  #keys: '3[415136.0.842718587][415136.0.842718586][415136.0.842718588]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl b/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl
new file mode 100644
index 0000000..3d1ed85
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl
@@ -0,0 +1,41 @@
+Quintiq file version 2.0
+#parent: #root
+Method AfterImport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    allunit := FinancialProductionReport::GetDefaultAllUnit();
+    table   := selectobject( this.MacroPlan(), FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() and not table.IsShow() );
+    //info( '--------------------------', table.Name() );
+    traverse( this, FinancialProductionReport, report ){
+      productcolumn := selectobject( report, FinancialProductionColumn, column, column.Name() = 'Product' );
+      unitcolumn    := selectobject( report, FinancialProductionColumn, column, column.Name() = 'Unit' );
+    //  info( '----------------------1-----------------', productcolumn.Name(), unitcolumn.Name() );
+      
+      traverse( report, FinancialProductionRow, row ){
+        product := selectobject( row, FinancialProductionCell, cell, cell.FinancialProductionColumn() = productcolumn );
+        unit    := selectobject( row, FinancialProductionCell, cell, cell.FinancialProductionColumn() = unitcolumn );
+    //    info( '----------------------2-----------------', product.Value(), unit.Value() );
+        
+        unitrow := selectobject( table, FinancialProductionRow, unitrow, unitrow.Name() = product.Value() and unitrow.Unit() = unit.Value() );
+        allrow  := selectobject( table, FinancialProductionRow, allrow, allrow.Name() = product.Value() and allrow.Unit() = allunit );
+    //    info( '----------------------3-----------------', unitrow.Name(), unitrow.Unit() );
+        // and product.Value() = '120 kW Rotor' and unit.Value() = 'Assembly Plant (Spain)'
+        traverse( row, FinancialProductionCell, cell, cell.FinancialProductionColumn() <> productcolumn and cell.FinancialProductionColumn() <> unitcolumn ){
+          column   := cell.FinancialProductionColumn();
+          unitcell := selectobject( unitrow, FinancialProductionCell, unitcell, unitcell.FinancialProductionColumn().Name() = column.Name() );
+          allcell  := selectobject( allrow, FinancialProductionCell, allcell, allcell.FinancialProductionColumn().Name() = column.Name() );
+    //      info( isnull( unitcell ), isnull( allcell ), cell.Value(), unitcell.Value(), allcell.Value() );
+          if( not isnull( unitcell ) ){
+            unitcell.Value( cell.Value() );
+          }
+          if( not isnull( allcell ) ){
+            value := [Real]cell.Value() + [Real]allcell.Value();
+            allcell.Value( [String]value );
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/Method_Filter.qbl b/_Main/BL/Type_FinancialProductionSource/Method_Filter.qbl
new file mode 100644
index 0000000..fa51b40
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/Method_Filter.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method Filter (
+  String productids,
+  String unit
+) declarative remote
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    info( '------------1-----------', unit, '-', productids );
+    traverse( this, FinancialProductionReport.FinancialProductionRow, row, row.Name() = '92 kW Stator' ){
+      productid := construct( Strings );
+      productid.Add( row.Name() );
+      info( '-----------------------', row.Name(), row.Unit(), productids.FindString( row.Name(), 0 ), row.Unit() = unit );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/Method_IsExistFutureMonthData.qbl b/_Main/BL/Type_FinancialProductionSource/Method_IsExistFutureMonthData.qbl
new file mode 100644
index 0000000..af99ca3
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/Method_IsExistFutureMonthData.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method IsExistFutureMonthData () as Boolean
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-26-2024 (created)
+    startofplanning := this.MacroPlan().StartOfPlanning().Date().Format( 'M2/D2/Y' );
+    columns         := selectset( this, FinancialProductionReport.FinancialProductionColumn, column, column.Name() > startofplanning );
+    return exists( columns, Elements.FinancialProductionCell, cell, cell.Value() <> '' );
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/Method_ReadStructure.qbl b/_Main/BL/Type_FinancialProductionSource/Method_ReadStructure.qbl
index 23e15cb..44f9498 100644
--- a/_Main/BL/Type_FinancialProductionSource/Method_ReadStructure.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/Method_ReadStructure.qbl
@@ -20,7 +20,17 @@
       xlstable.SyncRows();
       
       xlstable.Name( sheetName );
+      xlstable.IsImport( true );
       this.FinancialProductionReport( relinsert, &xlstable ); 
+      
+      Transaction::Transaction().Propagate( attribute( FinancialProductionColumn, Index ) );
+      
+      // 锛堝鍏ュ墠锛夌粰绌哄�艰祴浜堥粯璁ゅ�硷紙N/A锛�,骞朵笖鍒犻櫎绌鸿鏁版嵁鍜屾暟鎹牎楠�
+      xlstable.IdentifyNullValues();
+      
+      xlstable.ImportVerification();
     }
+    //瀵煎叆鍚庡鐞嗘暟鎹�
+    //this.AfterImport();
   *]
 }
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
index 5d56a54..87f56b0 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
@@ -4,15 +4,35 @@
   MacroPlan macroPlan
 ) as BinaryValue
 {
+  Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
   TextBody:
   [*
-    table := selectobject( macroPlan, FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() );
+    
+    table := selectobject( macroPlan, FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() and table.IsShow() );
     
     xmlDOMI := XMLDOMImplementation::Create();
     xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
     
     tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    //Product
+    productcolumnelement := xmlDOM.CreateElement( "column" );
+    productnameelement   := xmlDOM.CreateElement( "name" );
+    producttypeelement   := xmlDOM.CreateElement( "type" );
+    productnameelement.TextContent( 'Product' );
+    producttypeelement.TextContent( "String" );
+    productcolumnelement.AppendChild( productnameelement );
+    productcolumnelement.AppendChild( producttypeelement );
+    //Unit
+    unitcolumnelement := xmlDOM.CreateElement( "column" );
+    unitnameelement   := xmlDOM.CreateElement( "name" );
+    unittypeelement   := xmlDOM.CreateElement( "type" );
+    unitnameelement.TextContent( 'Unit' );
+    unittypeelement.TextContent( "String" );
+    unitcolumnelement.AppendChild( unitnameelement );
+    unitcolumnelement.AppendChild( unittypeelement );
     
+    tableElement.AppendChild( productcolumnelement ); 
+    tableElement.AppendChild( unitcolumnelement ); 
     traverse ( table, FinancialProductionColumn, column ) {
       columnelement := xmlDOM.CreateElement( "column" );
       nameelement   := xmlDOM.CreateElement( "name" );
@@ -22,13 +42,24 @@
       columnelement.AppendChild( nameelement );
       columnelement.AppendChild( typeelement );
       
-      cells := selectsortedset( column, FinancialProductionCell, cell, true, cell.FinancialProductionRow().RowNr() );
+      cells := selectsortedset( column, FinancialProductionCell, cell, cell.FinancialProductionRow().RowNr() );
+    
       traverse ( cells, Elements, c ) {
+        if( column.Index() = 0 ){
+          row := c.FinancialProductionRow();
+          //Product
+          productcellElement := xmlDOM.CreateElement( "cell" );
+          productcellElement.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement );
+          //Unit
+          unitcellElement := xmlDOM.CreateElement( "cell" );
+          unitcellElement.SetAttribute( "value", row.Unit() );
+          unitcolumnelement.AppendChild( unitcellElement );
+        }
         cellElement := xmlDOM.CreateElement( "cell" );
-        cellElement.SetAttribute( "value", c.Value() );
+        cellElement.SetAttribute( "value", c.Value() ); 
         columnelement.AppendChild( cellElement );
       }
-      
       tableElement.AppendChild( columnelement );  
     }
     
@@ -36,7 +67,7 @@
     
     //info( xmlString );
     
-    tableGroupHandle := TableGroupHandle::Create( "Financial productions" );
+    tableGroupHandle := TableGroupHandle::Create( FinancialProductionReport::GetDefaultName() );
     tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
     tableGroupHandle.Add( tableHandle );
     
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_DownloadTemplate.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_DownloadTemplate.qbl
index 4e29ea7..10e878b 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_DownloadTemplate.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_DownloadTemplate.qbl
@@ -29,7 +29,7 @@
     
     //info( xmlString );
     
-    tableGroupHandle := TableGroupHandle::Create( "Financial productions" );
+    tableGroupHandle := TableGroupHandle::Create( FinancialProductionReport::GetDefaultName() );
     tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
     tableGroupHandle.Add( tableHandle );
     
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl
new file mode 100644
index 0000000..7a5ef26
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl
@@ -0,0 +1,85 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Initialize (
+  MacroPlan owner
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    owner.FinancialProductionSource( relflush );
+    ccunit                    := FinancialProductionReport::GetDefaultCCUnit();
+    dlunit                    := FinancialProductionReport::GetDefaultDLUnit();
+    allunit                   := FinancialProductionReport::GetDefaultAllUnit();
+    source                    := owner.FinancialProductionSource( relnew, IsImport := false, Name := FinancialProductionReport::GetDefaultName() );
+    table                     := source.FinancialProductionReport( relnew, ID := source.Name(), Name := source.Name(), IsImport := false );
+    showtable                 := source.FinancialProductionReport( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsImport := false, IsShow := true );
+    startofplanning           := owner.StartOfPlanning();
+    startofnextmonth          := owner.StartOfPlanning().StartOfNextMonth();
+    startofyear               := startofplanning.StartOfYear();
+    startofnextyear           := startofplanning.StartOfNextYear();
+    
+    search                    := source.FinancialProductionSearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    
+    products                  := construct( Product_MPs );
+    
+    table.GenerateColumn( owner );
+    
+    traverse( owner, Product_MP.ProductInStockingPoint_MP, pisp, pisp.Product_MP().IsLeaf() and ( pisp.StockingPoint_MP().UnitID() = ccunit or pisp.StockingPoint_MP().UnitID() = dlunit ) ){
+      unit := pisp.StockingPoint_MP().UnitID();
+      info( unit, pisp.ProductID() );
+      ccrow := null( FinancialProductionRow );
+      dlrow := null( FinancialProductionRow );
+      allrow := selectobject( table, FinancialProductionRow, row, row.Name() = pisp.ProductID() and row.Unit() = allunit );
+      if( unit = ccunit ){
+        ccrow := table.FinancialProductionRow( relnew, Name := pisp.ProductID(), Unit := unit );
+      }else{
+        dlrow := table.FinancialProductionRow( relnew, Name := pisp.ProductID(), Unit := unit );
+      }
+      if( isnull( allrow ) ){
+        products.Add( pisp.Product_MP() );
+        allrow := table.FinancialProductionRow( relnew, Name := pisp.ProductID(), Unit := allunit );
+      }
+      
+      for( start := startofyear; start < startofnextyear; start := start.StartOfNextMonth() ){
+        periodtime := start.Date();
+        periodname := periodtime.Format( "M2/D2/Y" );
+        column := selectobject( table, FinancialProductionColumn, column, column.Name() = periodname and column.Period() = periodtime );
+        
+        if( not isnull( ccrow ) ){
+          ccrow.Initialize( column, ccunit );
+        }
+        if( not isnull( dlrow ) ){
+          dlrow.Initialize( column, dlunit );
+        }
+        if( not exists( allrow, FinancialProductionCell, allcell, allcell.FinancialProductionColumn() = column ) ){
+          allrow.Initialize( column, allunit );
+        }
+      }
+      
+      traverse( pisp, ProductInStockingPointInPeriod, pispip, pispip.Start() >= startofplanning
+                and ( ( pispip.Start() < startofnextmonth and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() ) 
+                      or ( pispip.Start() < startofnextyear and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Month() ) ) ){
+        periodtime := pispip.Start().StartOfMonth().Date();
+        periodname := periodtime.Format( "M2/D2/Y" );
+        
+        column := selectobject( table, FinancialProductionColumn, column, column.Name() = periodname and column.Period() = periodtime );
+        
+        if( not isnull( ccrow ) ){
+          ccrow.Initialize( column, pispip.NewSupplyProductionQuantity() );
+        }
+        if( not isnull( dlrow ) ){
+          dlrow.Initialize( column, pispip.NewSupplyProductionQuantity() );
+        }
+        allrow.Initialize( column, pispip.NewSupplyProductionQuantity() );
+      }
+    }
+    rows := selectsortedset( table, FinancialProductionRow, row, row.Name() );
+    i    := 0;
+    traverse( rows, Elements, e ){
+      e.RowNr( i );
+      i := i + 1;
+    }
+    showtable.Generate( search, products );
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Upload.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Upload.qbl
index 9ffca0d..2e3f777 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Upload.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Upload.qbl
@@ -13,6 +13,7 @@
     source := owner.FinancialProductionSource( relnew, FileBinaryValue := binaryValue,
                                                Name                    := fileName,
                                                IsXLSX                  := fileName.EndsWith( "xlsx" ),
+                                               IsImport                := true,
                                                UploadDateTime          := DateTime::ActualTime().Format( "Y-M2-D2 H:m:s" ),
                                                UploadUser              := guard( QuintiqUser::CurrentUser().Username(), "" ) );
     
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
similarity index 83%
rename from _Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
rename to _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
index 75469e5..d7d8942 100644
--- a/_Main/BL/Type_ArchivePR/StaticMethod_Compared.qbl
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
@@ -2,25 +2,25 @@
 #parent: #root
 StaticMethod Compared (
   RecycleBin recycleBin,
-  const ArchivePR baseVersion,
-  const ArchivePR compareVersion
+  String baseVersionPath,
+  String compareVersionPath
 ) as LocalTable
 {
   TextBody:
   [*
     // rislai Jun-20-2024 (created)
-    localTable := recycleBin.LocalTable( relnew,Name := baseVersion.Name() + "__" + compareVersion.Name());
+    localTable := recycleBin.LocalTable( relnew,Name := baseVersionPath + "__" + compareVersionPath);
     
     baseVersionFile := OSFile::Construct();
     compareVersionFile := OSFile::Construct();
     
     try {
-      baseVersionFile.Open( baseVersion.FilePath(), "Read", false );
-      baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionFile.ReadBinary(), baseVersion.FilePath() );
+      baseVersionFile.Open( baseVersionPath, "Read", false );
+      baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionFile.ReadBinary(), baseVersionPath );
       baseVersionDataSource.ReadStructure();
       
-      compareVersionFile.Open( compareVersion.FilePath(), "Read", false );
-      compareVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, compareVersionFile.ReadBinary(), compareVersion.FilePath() );
+      compareVersionFile.Open( compareVersionPath, "Read", false );
+      compareVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, compareVersionFile.ReadBinary(), compareVersionPath );
       compareVersionDataSource.ReadStructure();
       
       baseVersionTable := select( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
@@ -34,14 +34,14 @@
         baseVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
         compareVersionRowTree := NamedValueTree::Create();
         compareVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
-        ArchivePR::FillRows( baseVersionTable,rowKeys,baseVersionRowTree,baseVersionRows );
-        ArchivePR::FillRows( compareVersionTable,rowKeys,compareVersionRowTree,compareVersionRows );
+        LocalCell_DemandComparison::FillRows( baseVersionTable,rowKeys,baseVersionRowTree,baseVersionRows );
+        LocalCell_DemandComparison::FillRows( compareVersionTable,rowKeys,compareVersionRowTree,compareVersionRows );
         
         // 鐢熸垚鍒楁暟鎹�
         columnTree := NamedValueTree::Create();
         columns := construct( LocalColumns );
-        ArchivePR::GenerateColumnIndex( baseVersionTable,localTable,columnTree,columns );
-        ArchivePR::GenerateColumnIndex( compareVersionTable,localTable,columnTree,columns );
+        LocalCell_DemandComparison::GenerateColumnIndex( baseVersionTable,localTable,columnTree,columns );
+        LocalCell_DemandComparison::GenerateColumnIndex( compareVersionTable,localTable,columnTree,columns );
         columnNames := selectvalues( columns,Elements,column,true,column.Name() );
         
         // 鐢熸垚鏁版嵁
@@ -55,8 +55,8 @@
           compareVersionCellTree := NamedValueTree::Create();
           compareVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
           
-          ArchivePR::FillCells( rowKey,baseVersionRowTree,baseVersionRows,baseVersionCellTree,baseVersionCells );
-          ArchivePR::FillCells( rowKey,compareVersionRowTree,compareVersionRows,compareVersionCellTree,compareVersionCells );
+          LocalCell_DemandComparison::FillCells( rowKey,baseVersionRowTree,baseVersionRows,baseVersionCellTree,baseVersionCells );
+          LocalCell_DemandComparison::FillCells( rowKey,compareVersionRowTree,compareVersionRows,compareVersionCellTree,compareVersionCells );
           
           row := localTable.LocalRow( relnew,Index := localTable.GetRowIndexCache()  );
           
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillCells.qbl
similarity index 100%
rename from _Main/BL/Type_ArchivePR/StaticMethod_FillCells.qbl
rename to _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillCells.qbl
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillRows.qbl
similarity index 100%
rename from _Main/BL/Type_ArchivePR/StaticMethod_FillRows.qbl
rename to _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_FillRows.qbl
diff --git a/_Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
similarity index 100%
rename from _Main/BL/Type_ArchivePR/StaticMethod_GenerateColumnIndex.qbl
rename to _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl
index 24a6087..c766db0 100644
--- a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GetAttributeNames.qbl
@@ -7,10 +7,10 @@
     // rislai Jun-21-2024 (created)
     attributeNames := construct( Strings );
     
-    attributeNames.Add( "BaseVersion" );
-    attributeNames.Add( "CompareVersion" );
     attributeNames.Add( "BaseVersionValue" );
     attributeNames.Add( "CompareVersionValue" );
+    attributeNames.Add( "BaseVersion" );
+    attributeNames.Add( "CompareVersion" );
     attributeNames.Add( "Gap" );
     
     return &attributeNames;
diff --git a/_Main/BL/Type_Test/StaticMethod_Test.qbl b/_Main/BL/Type_Test/StaticMethod_Test.qbl
index e2e3fe5..9d0c69d 100644
--- a/_Main/BL/Type_Test/StaticMethod_Test.qbl
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -10,20 +10,9 @@
   TextBody:
   [*
     // rislai Jun-9-2024 (created)
-    baseVersion := select( archive,ArchivePR,pr,true );
-    baseVersionFile := OSFile::Construct();
-    baseVersionFile.Open( baseVersion.FilePath(), "Read", false );
-    baseVersionBinaryData := baseVersionFile.ReadBinary();
-    baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionBinaryData, baseVersion.FilePath() );
-    baseVersionDataSource.ReadStructure();
+    archive.ArchivePR( relnew,Name := "PR72.SP_20240604_VWED.xlsx",FilePath := "C:\Excel\PR72.SP_20240604_VWED.xlsx");
     
-    baseVersionTables := selectset( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
-    
-    baseVersionTable := baseVersionTables.Element( 0 );
-    
-    baseVersionRow := select( baseVersionTable, GeneralExcelImportAndExportDataRow, tempGEIAEDR, tempGEIAEDR.RowNr() = 999 );
-    
-    info( isnull( baseVersionRow ));
+    archive.ArchivePR( relnew,Name := "PR72.SP_20240605_VWED.xlsx",FilePath := "C:\Excel\PR72.SP_20240605_VWED.xlsx");
     
     
     //testTree := NamedValueTree::Create();
diff --git a/_Main/Sys/Repr/Global/LocalCell_DemandComparison.qrp b/_Main/Sys/Repr/Global/LocalCell_DemandComparison.qrp
new file mode 100644
index 0000000..3706317
--- /dev/null
+++ b/_Main/Sys/Repr/Global/LocalCell_DemandComparison.qrp
@@ -0,0 +1,51 @@
+Quintiq file version 2.0
+#parent: #root
+TypeRepresentation LocalCell_DemandComparison
+{
+  AttributeRepresentation BaseVersion
+  {
+    AttributeKey: '[412672.0.1087844728]'
+    Conditional:
+    [
+      DataRepresentation.Conditional
+      {
+        ConditionBody: 'object.LocalColumn().IsAttrbuteColumn()'
+        ConversionBody: ''
+        DefaultTextColor: false
+        InheritConversion: false
+        TextColor: 'White'
+      }
+    ]
+  }
+  AttributeRepresentation CompareVersion
+  {
+    AttributeKey: '[412672.0.1087844725]'
+    Conditional:
+    [
+      DataRepresentation.Conditional
+      {
+        ConditionBody: 'object.LocalColumn().IsAttrbuteColumn()'
+        ConversionBody: ''
+        DefaultTextColor: false
+        InheritConversion: false
+        TextColor: 'White'
+      }
+    ]
+  }
+  AttributeRepresentation Gap
+  {
+    AttributeKey: '[412672.0.1087844731]'
+    Conditional:
+    [
+      DataRepresentation.Conditional
+      {
+        ConditionBody: 'object.LocalColumn().IsAttrbuteColumn()'
+        ConversionBody: ''
+        DefaultTextColor: false
+        InheritConversion: false
+        TextColor: 'White'
+      }
+    ]
+  }
+  RelationRepresentation LocalColumn { RelationKey: '[412672.0.1084249679]' Visibility: 'Normal' }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison294.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison294.def
new file mode 100644
index 0000000..b962093
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelDemandComparison294.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component PanelDemandComparison294
+{
+  #keys: '[412672.0.1111643045]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelSelection
+    #child: PanelOperation_568
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation\043568.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation\043568.def"
new file mode 100644
index 0000000..cfb9153
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation\043568.def"
@@ -0,0 +1,112 @@
+Quintiq file version 2.0
+Component PanelOperation id:PanelOperation_568
+{
+  #keys: '[412672.0.1111643154]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonCompare
+    {
+      #keys: '[412672.0.1111643161]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 4
+      ]
+    }
+    Component efBaseVersion
+    {
+      #keys: '[412672.0.1111643258]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component efCompareVersion
+    {
+      #keys: '[412672.0.1111643271]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+    Component dhCompareVersionPath
+    {
+      #keys: '[412672.0.1111643374]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'String*'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component dhBaseVersionPath
+    {
+      #keys: '[412672.0.1111643396]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'String*'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component dhXMLDataListener id:dhXMLDataListener_906
+    {
+      #keys: '[412672.0.1109203483]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ExportXMLManager'
+      Children:
+      [
+        Component DataExtractor510 id:DataExtractor510_532
+        {
+          #keys: '[412672.0.1109203484]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            FixedFilter: 'object.Name() = "LocalTableXML"'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'ExportXMLManager'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 7
+      ]
+    }
+    Component bExport id:bExport_98
+    {
+      #keys: '[412672.0.1109203510]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 5
+      ]
+    }
+    Component bDownload id:bDownload_352
+    {
+      #keys: '[412672.0.1109203542]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOWNLOAD'
+        Label: '涓嬭浇'
+        Taborder: 6
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def
deleted file mode 100644
index eaac96e..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation.def
+++ /dev/null
@@ -1,27 +0,0 @@
-Quintiq file version 2.0
-Component PanelOperation
-{
-  #keys: '[412672.0.1085881251]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    #child: PanelOperation11
-    Component ButtonCompare
-    {
-      #keys: '[412672.0.1085802121]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '寮�濮嬪姣�'
-        Taborder: 1
-      ]
-    }
-    #child: pOperation_715
-  ]
-  Properties:
-  [
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelection.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelection.def
new file mode 100644
index 0000000..51b4cfe
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelection.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+Component PanelSelection
+{
+  #keys: '[412672.0.1111643222]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: pSelectionPR
+    #child: pSelectionBudget
+    #child: pSelectionPPA
+    #child: pSelectionIDS
+    #child: pSelectionCurve
+    #child: pSelectionPP
+    #child: PanelSelectionChecks
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelectionChecks.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelectionChecks.def
new file mode 100644
index 0000000..6ad0414
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelSelectionChecks.def
@@ -0,0 +1,75 @@
+Quintiq file version 2.0
+Component PanelSelectionChecks
+{
+  #keys: '[412672.0.1111602504]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component CheckboxPR
+    {
+      #keys: '[412672.0.1112207508]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'PR'
+        Taborder: 0
+      ]
+    }
+    Component CheckboxPP
+    {
+      #keys: '[412672.0.1112392614]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'PP'
+        Taborder: 1
+      ]
+    }
+    Component CheckboxBudget
+    {
+      #keys: '[412672.0.1112392620]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Budget'
+        Taborder: 2
+      ]
+    }
+    Component CheckboxPPA
+    {
+      #keys: '[412672.0.1112392625]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'PPA'
+        Taborder: 3
+      ]
+    }
+    Component CheckboxIDS
+    {
+      #keys: '[412672.0.1109206606]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'IDS'
+        Taborder: 4
+      ]
+    }
+    Component CheckboxCurve
+    {
+      #keys: '[412672.0.1109206611]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Curve'
+        Taborder: 5
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def"
deleted file mode 100644
index b50844d..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pOperation\043715.def"
+++ /dev/null
@@ -1,63 +0,0 @@
-Quintiq file version 2.0
-Component pOperation id:pOperation_715
-{
-  #keys: '[412672.0.1092111928]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component bExport
-    {
-      #keys: '[412672.0.1092111929]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: '瀵煎嚭'
-        Taborder: 0
-      ]
-    }
-    Component bDownload
-    {
-      #keys: '[412672.0.1092111930]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'DOWNLOAD'
-        Label: '涓嬭浇'
-        Taborder: 1
-      ]
-    }
-    Component dhXMLDataListener
-    {
-      #keys: '[412672.0.1092111931]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'ExportXMLManager'
-      Children:
-      [
-        Component DataExtractor510
-        {
-          #keys: '[412672.0.1092111932]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'RecycleBin'
-            FixedFilter: 'object.Name() = "LocalTableXML"'
-            Source: 'RecycleBin'
-            Taborder: 0
-            Transformation: 'ExportXMLManager'
-          ]
-        }
-      ]
-      Properties:
-      [
-        Taborder: 2
-      ]
-    }
-  ]
-  Properties:
-  [
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 2
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionBudget.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionBudget.def
new file mode 100644
index 0000000..01b3985
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionBudget.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pSelectionBudget
+{
+  #keys: '[412672.0.1109211897]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListBaseVersionBudget
+    {
+      #keys: '[412672.0.1109211898]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveBudget'
+      Children:
+      [
+        Component DataExtractorOperation221
+        {
+          #keys: '[412672.0.1109211899]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveBudget'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component dhBaseVersionBudget
+    {
+      #keys: '[412672.0.1109211900]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchiveBudget'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListCompareVersionBudget
+    {
+      #keys: '[412672.0.1109211901]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveBudget'
+      Children:
+      [
+        Component DataExtractorOperation655
+        {
+          #keys: '[412672.0.1109211902]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionBudget'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveBudget'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 3
+    Title: 'Budget'
+    Visible: false
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionCurve.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionCurve.def
new file mode 100644
index 0000000..a5d916d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionCurve.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pSelectionCurve
+{
+  #keys: '[412672.0.1109211963]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListBaseVersionCurve
+    {
+      #keys: '[412672.0.1109211964]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveCurve'
+      Children:
+      [
+        Component DataExtractorOperation154
+        {
+          #keys: '[412672.0.1109211965]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveCurve'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component dhBaseVersionCurve
+    {
+      #keys: '[412672.0.1109211966]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchiveCurve'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListCompareVersionCurve
+    {
+      #keys: '[412672.0.1109211967]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveCurve'
+      Children:
+      [
+        Component DataExtractorOperation687
+        {
+          #keys: '[412672.0.1109211968]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionCurve'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveCurve'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 6
+    Title: 'Curve'
+    Visible: false
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionIDS.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionIDS.def
new file mode 100644
index 0000000..99ebb61
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionIDS.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pSelectionIDS
+{
+  #keys: '[412672.0.1109211941]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListBaseVersionIDS
+    {
+      #keys: '[412672.0.1109211942]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveIDS'
+      Children:
+      [
+        Component DataExtractorOperation504
+        {
+          #keys: '[412672.0.1109211943]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveIDS'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component dhBaseVersionIDS
+    {
+      #keys: '[412672.0.1109211944]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchiveIDS'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DataExtractorOperationIDS
+    {
+      #keys: '[412672.0.1109211945]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchiveIDS'
+      Children:
+      [
+        Component DataExtractorOperation493
+        {
+          #keys: '[412672.0.1109211946]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionIDS'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchiveIDS'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 5
+    Title: 'IDS'
+    Visible: false
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPP.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPP.def
new file mode 100644
index 0000000..6143d29
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPP.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pSelectionPP
+{
+  #keys: '[412672.0.1109211874]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListBaseVersionPP
+    {
+      #keys: '[412672.0.1109211875]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePP'
+      Children:
+      [
+        Component DataExtractorOperation267
+        {
+          #keys: '[412672.0.1109211876]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component dhBaseVersionPP
+    {
+      #keys: '[412672.0.1109211877]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchivePP'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListCompareVersionPP
+    {
+      #keys: '[412672.0.1109211878]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePP'
+      Children:
+      [
+        Component DataExtractorOperation510
+        {
+          #keys: '[412672.0.1109211879]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionPP'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 2
+    Title: 'PP'
+    Visible: false
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPPA.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPPA.def
new file mode 100644
index 0000000..bc16673
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPPA.def
@@ -0,0 +1,83 @@
+Quintiq file version 2.0
+Component pSelectionPPA
+{
+  #keys: '[412672.0.1109211919]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownListBaseVersionPPA
+    {
+      #keys: '[412672.0.1109211920]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePPA'
+      Children:
+      [
+        Component DataExtractorOperation300
+        {
+          #keys: '[412672.0.1109211921]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePPA'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍩哄噯闇�姹傜増鏈細'
+        Taborder: 0
+      ]
+    }
+    Component dhBaseVersionPPA
+    {
+      #keys: '[412672.0.1109211922]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchivePPA'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListCompareVersionPPA
+    {
+      #keys: '[412672.0.1109211923]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePPA'
+      Children:
+      [
+        Component DataExtractorOperation949
+        {
+          #keys: '[412672.0.1109211924]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionPPA'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePPA'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 4
+    Title: 'PPA'
+    Visible: false
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPR.def
similarity index 73%
rename from _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPR.def
index 828d235..1bf0f92 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_PanelOperation11.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Component_pSelectionPR.def
@@ -1,59 +1,20 @@
 Quintiq file version 2.0
-Component PanelOperation11
+Component pSelectionPR
 {
-  #keys: '[412672.0.1085801711]'
+  #keys: '[412672.0.1109203593]'
   BaseType: 'WebPanel'
   Children:
   [
-    Component DropDownListCompareVersion id:DropDownListCompareVersion_85
+    Component DropDownListBaseVersionPR
     {
-      #keys: '[412672.0.1085801792]'
+      #keys: '[412672.0.1109203679]'
       BaseType: 'WebDropDownList'
       Databinding: 'ArchivePR'
       Children:
       [
-        Component DataExtractorOperation876 id:DataExtractorOperation876_293
+        Component DataExtractorOperation id:DataExtractorOperation_866
         {
-          #keys: '[412672.0.1085801793]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'Archive'
-            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersion'
-            FixedFilter: 'object <> baseSelection'
-            Source: 'Archive'
-            Taborder: 0
-            Transformation: 'ArchivePR'
-          ]
-        }
-      ]
-      Properties:
-      [
-        DisplayField: 'Name'
-        Label: '瀵规瘮闇�姹傜増鏈細'
-        Taborder: 2
-      ]
-    }
-    Component dhBaseVersion id:dhBaseVersion_357
-    {
-      #keys: '[412672.0.1085801820]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'ArchivePR'
-      Properties:
-      [
-        Taborder: 1
-      ]
-    }
-    Component DropDownListBaseVersion id:DropDownListBaseVersion_668
-    {
-      #keys: '[412672.0.1085801851]'
-      BaseType: 'WebDropDownList'
-      Databinding: 'ArchivePR'
-      Children:
-      [
-        Component DataExtractorOperation id:DataExtractorOperation_669
-        {
-          #keys: '[412672.0.1085801852]'
+          #keys: '[412672.0.1109203680]'
           BaseType: 'WebDataExtractor'
           Properties:
           [
@@ -71,11 +32,52 @@
         Taborder: 0
       ]
     }
+    Component dhBaseVersionPR
+    {
+      #keys: '[412672.0.1109203707]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ArchivePR'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component DropDownListCompareVersionPR
+    {
+      #keys: '[412672.0.1109203739]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ArchivePR'
+      Children:
+      [
+        Component DataExtractorOperation876 id:DataExtractorOperation876_784
+        {
+          #keys: '[412672.0.1109203740]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'Archive'
+            FilterArguments: 'baseSelection:QMacroPlanner::FormDemandComparison.dhBaseVersionPR'
+            FixedFilter: 'object <> baseSelection'
+            Source: 'Archive'
+            Taborder: 0
+            Transformation: 'ArchivePR'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '瀵规瘮闇�姹傜増鏈細'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
     FixedSize: true
     Orientation: 'horizontal'
-    Taborder: 0
+    Taborder: 1
+    Title: 'PR'
+    Visible: false
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
deleted file mode 100644
index a95fc67..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged\043168.def"
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-#parent: PanelOperation11/DropDownListBaseVersion_668
-Response OnSelectionChanged (
-  ArchivePR selection
-) id:Response_PanelOperation11_DropDownListBaseVersion_OnSelectionChanged_168
-{
-  #keys: '[412672.0.1085801849]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
-  GroupServerCalls: true
-  QuillAction
-  {
-    Body:
-    [*
-      dhBaseVersion.Data( selection );
-      this.Tooltip( selection.Name() );
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def
deleted file mode 100644
index ba590f9..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged.def
+++ /dev/null
@@ -1,18 +0,0 @@
-Quintiq file version 2.0
-#parent: PanelOperation11/DropDownListCompareVersion_85
-Response OnSelectionChanged (
-  ArchivePR selection
-) id:Response_PanelOperation11_DropDownListCompareVersion_OnSelectionChanged
-{
-  #keys: '[412672.0.1093350988]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
-  GroupServerCalls: true
-  QuillAction
-  {
-    Body:
-    [*
-      this.Tooltip( selection.Name() );
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def
new file mode 100644
index 0000000..e372ac2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelOperation_568/ButtonCompare
+Response OnClick () id:Response_PanelOperation_568_ButtonCompare_OnClick
+{
+  #keys: '[412672.0.1111643148]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      
+      table := LocalCell_DemandComparison::Compared( RecycleBin,dhBaseVersionPath.Data(),dhCompareVersionPath.Data() );
+      dhComparisonData.Data( table );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bDownload_OnClick\043781.def"
similarity index 82%
rename from _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bDownload_OnClick\043781.def"
index 1fd2a91..798a871 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bDownload_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bDownload_OnClick\043781.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: pOperation_715/bDownload
-Response OnClick () id:Response_pOperation_715_bDownload_OnClick
+#parent: PanelOperation_568/bDownload_352
+Response OnClick () id:Response_pOperation_bDownload_OnClick_781
 {
-  #keys: '[412672.0.1092111926]'
+  #keys: '[412672.0.1109203541]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bExport_OnClick\043723.def"
similarity index 74%
rename from _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bExport_OnClick\043723.def"
index 02b5b31..585ba3c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pOperation_715_bExport_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_bExport_OnClick\043723.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: pOperation_715/bExport
-Response OnClick () id:Response_pOperation_715_bExport_OnClick
+#parent: PanelOperation_568/bExport_98
+Response OnClick () id:Response_pOperation_bExport_OnClick_723
 {
-  #keys: '[412672.0.1092111927]'
+  #keys: '[412672.0.1109203509]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def
deleted file mode 100644
index a761ea1..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_ButtonCompare_OnClick.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: PanelOperation/ButtonCompare
-Response OnClick () id:Response_PanelOperation_ButtonCompare_OnClick
-{
-  #keys: '[412672.0.1085802211]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      table := ArchivePR::Compared( RecycleBin,DropDownListBaseVersion.Data(),DropDownListCompareVersion.Data() );
-      dhComparisonData.Data( table );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxBudget_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxBudget_OnChanged.def
new file mode 100644
index 0000000..f7b4213
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxBudget_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxBudget
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxBudget_OnChanged
+{
+  #keys: '[412672.0.1112392619]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionBudget.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxCurve_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxCurve_OnChanged.def
new file mode 100644
index 0000000..ae34ee1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxCurve_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxCurve
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxCurve_OnChanged
+{
+  #keys: '[412672.0.1109206610]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionCurve.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxIDS_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxIDS_OnChanged.def
new file mode 100644
index 0000000..80822a8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxIDS_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxIDS
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxIDS_OnChanged
+{
+  #keys: '[412672.0.1109206605]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionIDS.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPPA_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPPA_OnChanged.def
new file mode 100644
index 0000000..f14848a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPPA_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxPPA
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxPPA_OnChanged
+{
+  #keys: '[412672.0.1112392624]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionPPA.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPP_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPP_OnChanged.def
new file mode 100644
index 0000000..7b148be
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPP_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxPP
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxPP_OnChanged
+{
+  #keys: '[412672.0.1112392613]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionPP.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPR_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPR_OnChanged.def
new file mode 100644
index 0000000..c27e799
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelSelectionChecks_CheckboxPR_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSelectionChecks/CheckboxPR
+Response OnChanged () id:Response_PanelSelectionChecks_CheckboxPR_OnChanged
+{
+  #keys: '[412672.0.1112326553]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      pSelectionPR.Visible( this.Checked() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListBaseVersionBudget_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListBaseVersionBudget_OnSelectionChanged.def
new file mode 100644
index 0000000..8cfbed8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListBaseVersionBudget_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionBudget/DropDownListBaseVersionBudget
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionBudget_DropDownListBaseVersionBudget_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211896]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListCompareVersionBudget_OnSelectionChange.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListCompareVersionBudget_OnSelectionChange.def
new file mode 100644
index 0000000..2a0e750
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionBudget_DropDownListCompareVersionBudget_OnSelectionChange.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionBudget/DropDownListCompareVersionBudget
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionBudget_DropDownListCompareVersionBudget_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211895]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListBaseVersionCurve_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListBaseVersionCurve_OnSelectionChanged.def
new file mode 100644
index 0000000..a220cc2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListBaseVersionCurve_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionCurve/DropDownListBaseVersionCurve
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionCurve_DropDownListBaseVersionCurve_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211962]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListCompareVersionCurve_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListCompareVersionCurve_OnSelectionChanged.def
new file mode 100644
index 0000000..a427350
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionCurve_DropDownListCompareVersionCurve_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionCurve/DropDownListCompareVersionCurve
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionCurve_DropDownListCompareVersionCurve_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211961]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DataExtractorOperationIDS_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DataExtractorOperationIDS_OnSelectionChanged.def
new file mode 100644
index 0000000..5500771
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DataExtractorOperationIDS_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionIDS/DataExtractorOperationIDS
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionIDS_DataExtractorOperationIDS_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211939]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DropDownListBaseVersionIDS_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DropDownListBaseVersionIDS_OnSelectionChanged.def
new file mode 100644
index 0000000..d5d74b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionIDS_DropDownListBaseVersionIDS_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionIDS/DropDownListBaseVersionIDS
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionIDS_DropDownListBaseVersionIDS_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211940]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListBaseVersionPPA_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListBaseVersionPPA_OnSelectionChanged.def
new file mode 100644
index 0000000..3962e2c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListBaseVersionPPA_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPPA/DropDownListBaseVersionPPA
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPPA_DropDownListBaseVersionPPA_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211918]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListCompareVersionPPA_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListCompareVersionPPA_OnSelectionChanged.def
new file mode 100644
index 0000000..eb49f2b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPPA_DropDownListCompareVersionPPA_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPPA/DropDownListCompareVersionPPA
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPPA_DropDownListCompareVersionPPA_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211917]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListBaseVersionPP_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListBaseVersionPP_OnSelectionChanged.def
new file mode 100644
index 0000000..ffcbefc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListBaseVersionPP_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPP/DropDownListBaseVersionPP
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPP_DropDownListBaseVersionPP_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211873]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListCompareVersionPP_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListCompareVersionPP_OnSelectionChanged.def
new file mode 100644
index 0000000..d46fc20
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPP_DropDownListCompareVersionPP_OnSelectionChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPP/DropDownListCompareVersionPP
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPP_DropDownListCompareVersionPP_OnSelectionChanged
+{
+  #keys: '[412672.0.1109211872]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListBaseVersionPR_OnSelectionChanged\04398.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListBaseVersionPR_OnSelectionChanged\04398.def"
new file mode 100644
index 0000000..e477b8f
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListBaseVersionPR_OnSelectionChanged\04398.def"
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPR/DropDownListBaseVersionPR
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPR_DropDownListBaseVersionPR_OnSelectionChanged_98
+{
+  #keys: '[412672.0.1109203677]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhBaseVersionPR.Data( selection );
+      this.Tooltip( selection.Name() );
+      efBaseVersion.Text( selection.Name() );
+      dhBaseVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListCompareVersionPR_OnSelectionChanged\043599.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListCompareVersionPR_OnSelectionChanged\043599.def"
new file mode 100644
index 0000000..10a3e31
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_pSelectionPR_DropDownListCompareVersionPR_OnSelectionChanged\043599.def"
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pSelectionPR/DropDownListCompareVersionPR
+Response OnSelectionChanged (
+  ArchivePR selection
+) id:Response_pSelectionPR_DropDownListCompareVersionPR_OnSelectionChanged_599
+{
+  #keys: '[412672.0.1109203737]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownList_OnSelectionChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Tooltip( selection.Name() );
+      
+      efCompareVersion.Text( selection.Name() );
+      dhCompareVersionPath.Data( selection.FilePath() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def
index 6d79dcf..23b9386 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/_ROOT_Component_FormDemandComparison.def
@@ -8,7 +8,7 @@
   Children:
   [
     #child: PanelDemandComparison
-    #child: PanelOperation
+    #child: PanelDemandComparison294
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_MatrixEditorTable.def
new file mode 100644
index 0000000..2efd8dd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_MatrixEditorTable.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditorTable
+{
+  #keys: '[415136.0.844701426]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellTable
+    {
+      #keys: '[415136.0.844701427]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCell
+        {
+          #keys: '[415136.0.844701428]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'FinancialProductionReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'FinancialProductionColumn.FinancialProductionCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'FinancialProductionColumn'
+        Row: 'FinancialProductionRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsTable
+    {
+      #keys: '[415136.0.844701431]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRow
+        {
+          #keys: '[415136.0.844701432]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'FinancialProductionReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'FinancialProductionRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsTable
+    {
+      #keys: '[415136.0.844701435]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumn
+        {
+          #keys: '[415136.0.844701436]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'FinancialProductionReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'FinancialProductionColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable
+    #child: matrixeditorContextMenuTable
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumnsTable'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorRowsTable'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportHeader.def
index 5779852..5527cd6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportHeader.def
@@ -10,6 +10,7 @@
   ]
   Properties:
   [
-    Taborder: 0
+    FixedSize: true
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportTable.def
deleted file mode 100644
index 19a477e..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportTable.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component PanelFinancialProductionReportTable
-{
-  #keys: '[415136.0.834352365]'
-  BaseType: 'WebPanel'
-  Properties:
-  [
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelTable.def
new file mode 100644
index 0000000..4cf2817
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelTable.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelTable
+{
+  #keys: '[415136.0.834352365]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable
+  ]
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelUnit.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelUnit.def
index 451f699..067a367 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelUnit.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelUnit.def
@@ -12,7 +12,6 @@
       Properties:
       [
         Label: 'Unit'
-        Strings: '<All>;闀挎槬;澶ц繛'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixEditorActionBarPageTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixEditorActionBarPageTable.def
new file mode 100644
index 0000000..16fafd3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixEditorActionBarPageTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable
+{
+  #keys: '[415136.0.844701439]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixeditorContextMenuTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixeditorContextMenuTable.def
new file mode 100644
index 0000000..5a4b184
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_matrixeditorContextMenuTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable
+{
+  #keys: '[415136.0.844701442]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
new file mode 100644
index 0000000..62f7985
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormFinancialProductionReport_OnCreated
+{
+  #keys: '[415136.0.842812649]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      //鍒濆鍖�
+      if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
+        FinancialProductionSource::Initialize( MacroPlan );
+      }
+      //info( '------------------1----------------' );
+      table := selectobject( MacroPlan, FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() and table.IsShow() );
+      info( '------------------2----------------', table.IsImport(), table.IsShow() );
+      DataHolderTable.Data( table );
+      
+      dhSearch.Data( table.FinancialProductionSource().FinancialProductionSearch() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelFinancialProductionReportOperation_ButtonProductionImport_OnCl.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelFinancialProductionReportOperation_ButtonProductionImport_OnCl.def
index 03863b1..53c7632 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelFinancialProductionReportOperation_ButtonProductionImport_OnCl.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelFinancialProductionReportOperation_ButtonProductionImport_OnCl.def
@@ -27,7 +27,16 @@
           source := FinancialProductionSource::Upload( MacroPlan, webFileBinaryData, fileName );
           source.ReadStructure();
           
+          if( not source.IsExistFutureMonthData() or 
+              ( source.IsExistFutureMonthData() and WebMessageBox::Question( this, Translations::MP_FinancialProductionReport_Question(), 'Yes|No' ) = 0 ) ){
+             source.AfterImport();
+             DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+          }
+          
           WebMessageBox::Success( Translations::A_VWED_Success() );
+          traverse( MacroPlan, FinancialProductionSource, psource, psource.IsImport() and psource <> source ){
+            psource.Delete();
+          }
         }
       } onerror {
         WebMessageBox::Error( e.GeneralInformation() );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def
new file mode 100644
index 0000000..b299a53
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelGeneration/ddslGeneration
+Response OnSelectionChanged () id:Response_PanelGeneration_ddslGeneration_OnSelectionChanged
+{
+  #keys: '[415136.0.840791771]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      if( dhSearch.Data().Generation() <> selection ){
+        dhSearch.Data().Generation( selection );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def
new file mode 100644
index 0000000..972e396
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelMQBMLB/ddslMQBMLB
+Response OnSelectionChanged () id:Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged
+{
+  #keys: '[415136.0.842090372]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      if( dhSearch.Data().MqbMlb() <> selection ){
+        dhSearch.Data().MqbMlb( selection );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelPower_ddslPower_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelPower_ddslPower_OnSelectionChanged.def
new file mode 100644
index 0000000..782939b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelPower_ddslPower_OnSelectionChanged.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelPower/ddslPower
+Response OnSelectionChanged () id:Response_PanelPower_ddslPower_OnSelectionChanged
+{
+  #keys: '[415136.0.842090478]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      if( dhSearch.Data().Power() <> selection ){
+        dhSearch.Data().Power( selection );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnCreated.def
new file mode 100644
index 0000000..f6c7ab5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnCreated.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelUnit/ddslUnit
+Response OnCreated () id:Response_PanelUnit_ddslUnit_OnCreated
+{
+  #keys: '[415136.0.848320822]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      
+      valueString := "<All>;" + FinancialProductionReport::GetDefaultCCUnit() + ";" + FinancialProductionReport::GetDefaultDLUnit();
+      
+      this.Strings( valueString );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def
new file mode 100644
index 0000000..7fbf5de
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelUnit/ddslUnit
+Response OnSelectionChanged () id:Response_PanelUnit_ddslUnit_OnSelectionChanged
+{
+  #keys: '[415136.0.840791631]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      if( dhSearch.Data().Unit() <> selection ){
+        dhSearch.Data().Unit( selection );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/_ROOT_Component_FormFinancialProductionReport.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/_ROOT_Component_FormFinancialProductionReport.def
index aee99fe..146e986 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/_ROOT_Component_FormFinancialProductionReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/_ROOT_Component_FormFinancialProductionReport.def
@@ -8,7 +8,27 @@
   Children:
   [
     #child: PanelFinancialProductionReportHeader
-    #child: PanelFinancialProductionReportTable
+    #child: PanelTable
+    Component DataHolderTable
+    {
+      #keys: '[415136.0.840720309]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'FinancialProductionReport'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component dhSearch
+    {
+      #keys: '[415136.0.849431513]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'FinancialProductionSearch'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [

--
Gitblit v1.9.3