From 229b7b06dfccb7054c143c21339388ad7773f022 Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期二, 02 七月 2024 10:57:00 +0800
Subject: [PATCH] 库存汇总报表数据结构创建

---
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryProductSearch.def                              |   19 
 _Main/BL/Type_InventorySummaryCell/Attribute_AverageInventory.qbl                                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixEditorActionBarPageTable.def                                  |   10 
 _Main/BL/Relations/Relation_InventorySummarySearch_InventorySummarySource_InventorySummarySourc.qbl                                            |   23 
 _Main/BL/Type_InventorySummarySource/Attribute_Name.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryHeader.def                                     |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnCreated.def                         |   23 
 _Main/BL/Type_InventorySummaryColumn/Attribute_Period.qbl                                                                                      |    7 
 _Main/BL/Type_InventorySummarySearch/Attribute_StartDate.qbl                                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def                                                     |   24 
 _Main/BL/Type_InventorySummarySource/StaticMethod_Upload.qbl                                                                                   |   22 
 _Main/BL/Type_ProductInStockingPointInPeriod#228/_ROOT_Type_ProductInStockingPointInPeriod.qbl                                                 |    6 
 _Main/BL/Relations/Relation_InventorySummaryReport_InventorySummaryColumn_InventorySummaryColum.qbl                                            |   26 
 _Main/BL/Type_InventorySummaryCell/Attribute_MinimumInventory.qbl                                                                              |    8 
 _Main/BL/Type_InventorySummaryColumn/Attribute_Category.qbl                                                                                    |    8 
 _Main/BL/Type_InventorySummarySource/StaticMethod_DownloadTemplate.qbl                                                                         |   40 +
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixeditorContextMenuTable.def                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnSelectionChanged.def                          |   20 
 _Main/BL/Type_InventorySummarySearch/Attribute_Unit.qbl                                                                                        |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnCreated.def                                   |   23 
 _Main/BL/Type_InventorySummaryReport/_ROOT_Type_InventorySummaryReport.qbl                                                                     |   10 
 _Main/BL/Type_InventorySummaryColumn/Attribute_Index.qbl                                                                                       |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnCreated.def                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/_ROOT_Component_FormInventorySummaryReport.def                                |   38 +
 _Main/BL/Type_InventorySummarySearch/DefaultValue_Generation.qbl                                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def                            |   20 
 _Main/BL/Type_InventorySummaryReport/Attribute_ID.qbl                                                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnCreated.def                                     |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelUnit.def                                                       |   24 
 _Main/BL/Type_InventorySummaryReport/DefaultValue_ID.qbl                                                                                       |    6 
 _Main/BL/Relations/Relation_InventorySummaryReport_InventroySummaryRow_InventroySummaryRow_Inve.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def                                                     |   34 +
 _Main/UI/MacroPlannerWebApp/Views/Inventory_summary_report_view.vw                                                                             |  140 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_MatrixEditorTable.def                                               |   98 +++
 _Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl                                                                               |   53 +
 _Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl                                                                            |   13 
 _Main/BL/Type_InventorySummaryColumn/_ROOT_Type_InventorySummaryColumn.qbl                                                                     |   10 
 _Main/BL/Relations/Relation_InventorySummaryColumn_InventorySummaryCell_InventorySummaryCell_In.qbl                                            |   26 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonInventorySummaryReport_OnCl.def |   16 
 _Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl                                                                           |   13 
 _Main/BL/Type_InventorySummarySearch/Attribute_Generation.qbl                                                                                  |    7 
 _Main/BL/Type_InventroySummaryRow/Attribute_Unit.qbl                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryColumnSearch.def                               |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def                                                   |   30 
 _Main/BL/Type_InventorySummaryColumn/Attribute_Name.qbl                                                                                        |    7 
 _Main/BL/Type_InventorySummarySearch/Attribute_EndDate.qbl                                                                                     |    8 
 _Main/BL/Type_InventorySummarySource/_ROOT_Type_InventorySummarySource.qbl                                                                     |   10 
 _Main/BL/Type_InventorySummarySource/DefaultValue_Name.qbl                                                                                     |    6 
 _Main/BL/Type_InventorySummarySearch/Attribute_Power.qbl                                                                                       |    7 
 _Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl                                                                                 |   78 ++
 _Main/BL/Type_InventroySummaryRow/DefaultValue_Name.qbl                                                                                        |    6 
 _Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl                                                                                        |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPower.def                                                      |   24 
 _Main/BL/Relations/Relation_InventroySummaryRow_InventorySummaryCell_InventorySummaryCell_Inven.qbl                                            |   23 
 _Main/BL/Type_InventorySummaryReport/DefaultValue_Name.qbl                                                                                     |    6 
 _Main/BL/Type_InventorySummaryReport/Method_Clear.qbl                                                                                          |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def                |   20 
 _Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultName.qbl                                                                           |   10 
 _Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl                                                                           |   13 
 _Main/BL/Type_InventroySummaryRow/_ROOT_Type_InventroySummaryRow.qbl                                                                           |   10 
 _Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl                                            |   23 
 _Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl                                                                                 |   20 
 _Main/BL/Type_InventroySummaryRow/DefaultValue_Unit.qbl                                                                                        |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelGeneration.def                                                 |   24 
 _Main/BL/Type_InventorySummaryReport/Attribute_Name.qbl                                                                                        |    8 
 _Main/BL/Type_InventorySummarySearch/Attribute_MqbMlb.qbl                                                                                      |    7 
 _Main/BL/Type_InventorySummaryColumn/DefaultValue_Name.qbl                                                                                     |    6 
 _Main/BL/Type_InventorySummarySearch/DefaultValue_MqbMlb.qbl                                                                                   |    6 
 _Main/BL/Type_InventroySummaryRow/Method_Filter.qbl                                                                                            |   22 
 _Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl                                                                                         |   23 
 _Main/BL/Type_InventroySummaryRow/Method_Initialize#0.qbl                                                                                      |   15 
 _Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultAllUnit.qbl                                                                        |   10 
 _Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl                                                                                    |   20 
 _Main/BL/Type_InventorySummaryCell/Attribute_MaximumInventory.qbl                                                                              |    8 
 _Main/BL/Type_InventorySummaryReport/Method_Generate.qbl                                                                                       |   44 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                               |   11 
 _Main/BL/Type_InventroySummaryRow/Attribute_RowNr.qbl                                                                                          |    7 
 _Main/BL/Type_InventorySummarySearch/_ROOT_Type_InventorySummarySearch.qbl                                                                     |   10 
 _Main/BL/Type_InventroySummaryRow/Attribute_Name.qbl                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def                          |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelMQBMLB.def                                                     |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def                        |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def                            |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelTable.def                                                      |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def                                                        |   24 
 _Main/BL/Type_InventorySummaryColumn/Function_CalcIndex.qbl                                                                                    |   13 
 _Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl                                                                         |   11 
 _Main/BL/Type_InventorySummarySearch/DefaultValue_Power.qbl                                                                                    |    6 
 _Main/BL/Type_InventorySummarySearch/DefaultValue_Unit.qbl                                                                                     |    6 
 _Main/BL/Relations/Relation_InventorySummarySource_MacroPlan_MacroPlan_InventorySummarySource.qbl                                              |   23 
 _Main/BL/Type_InventorySummaryCell/_ROOT_Type_InventorySummaryCell.qbl                                                                         |   10 
 _Main/BL/Type_InventorySummaryCell/Attribute_EndingInventory.qbl                                                                               |    8 
 _Main/BL/Type_InventorySummarySearch/Attribute_Category.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnChanged#847.def       |   20 
 _Main/BL/Relations/Relation_FinancialSalesSource_FinancialSalesSearch_FinancialSalesSearch_Fina.qbl                                            |   23 
 _Main/BL/Type_InventroySummaryRow/StaticMethod_NewStaticMethod.qbl                                                                             |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def                          |   22 
 /dev/null                                                                                                                                      |   23 
 _Main/BL/Type_InventorySummaryReport/Attribute_IsShow.qbl                                                                                      |    7 
 _Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl                                                                           |   13 
 _Main/BL/Relations/Relation_InventorySummarySource_InventorySummaryReport_InventorySummaryRepor.qbl                                            |   23 
 _Main/BL/Type_InventorySummarySource/Attribute_ID.qbl                                                                                          |    8 
 _Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl                                                                         |   11 
 103 files changed, 1,841 insertions(+), 23 deletions(-)

diff --git a/_Main/BL/Relations/Relation_FinancialSalesSearch_FinancialSalesSource_FinancialSalesSource_Fina.qbl b/_Main/BL/Relations/Relation_FinancialSalesSearch_FinancialSalesSource_FinancialSalesSource_Fina.qbl
deleted file mode 100644
index 4bb9678..0000000
--- a/_Main/BL/Relations/Relation_FinancialSalesSearch_FinancialSalesSource_FinancialSalesSource_Fina.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation FinancialSalesSearch_FinancialSalesSource_FinancialSalesSource_FinancialSalesSearch
-{
-  #keys: '1[415136.0.857450518]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide FinancialSalesSource
-  {
-    #keys: '3[415136.0.857450520][415136.0.857450519][415136.0.857450521]'
-    Cardinality: '0to1'
-    ObjectDefinition: FinancialSalesSearch
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide FinancialSalesSearch
-  {
-    #keys: '3[415136.0.857450523][415136.0.857450522][415136.0.857450524]'
-    Cardinality: '0to1'
-    ObjectDefinition: FinancialSalesSource
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_FinancialSalesSource_FinancialSalesSearch_FinancialSalesSearch_Fina.qbl b/_Main/BL/Relations/Relation_FinancialSalesSource_FinancialSalesSearch_FinancialSalesSearch_Fina.qbl
new file mode 100644
index 0000000..e037345
--- /dev/null
+++ b/_Main/BL/Relations/Relation_FinancialSalesSource_FinancialSalesSearch_FinancialSalesSearch_Fina.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation FinancialSalesSource_FinancialSalesSearch_FinancialSalesSearch_FinancialSalesSource
+{
+  #keys: '1[415136.0.865304861]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide FinancialSalesSearch
+  {
+    #keys: '3[415136.0.865304863][415136.0.865304862][415136.0.865304864]'
+    Cardinality: '0to1'
+    ObjectDefinition: FinancialSalesSource
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide FinancialSalesSource
+  {
+    #keys: '3[415136.0.865304866][415136.0.865304865][415136.0.865304867]'
+    Cardinality: '0to1'
+    ObjectDefinition: FinancialSalesSearch
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl b/_Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl
new file mode 100644
index 0000000..b73e32a
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStockingPointInPeriod_InventorySummaryCell
+{
+  #keys: '1[415136.0.865101866]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ProductInStockingPointInPeriod
+  {
+    #keys: '3[415136.0.865101868][415136.0.865101867][415136.0.865101869]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventorySummaryCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide InventorySummaryCell
+  {
+    #keys: '3[415136.0.865101871][415136.0.865101870][415136.0.865101872]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductInStockingPointInPeriod
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummaryColumn_InventorySummaryCell_InventorySummaryCell_In.qbl b/_Main/BL/Relations/Relation_InventorySummaryColumn_InventorySummaryCell_InventorySummaryCell_In.qbl
new file mode 100644
index 0000000..c042c63
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummaryColumn_InventorySummaryCell_InventorySummaryCell_In.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummaryColumn_InventorySummaryCell_InventorySummaryCell_InventorySummaryColumn
+{
+  #keys: '1[415136.0.865304752]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.865304771][415136.0.865304765][415136.0.865304772][415136.0.865304766][415136.0.865304773][415136.0.865304767][415136.0.865304774][415136.0.865304768][415136.0.865304775][415136.0.865304769][415136.0.865304776][415136.0.865304770]'
+    SequenceElementSuffix: 'CellInColumn'
+    SequenceSuffix: 'CellInColumn'
+  }
+  RelationSide.LeftSide InventorySummaryCell
+  {
+    #keys: '3[415136.0.865304754][415136.0.865304753][415136.0.865304755]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventorySummaryColumn
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide InventorySummaryColumn
+  {
+    #keys: '3[415136.0.865304757][415136.0.865304756][415136.0.865304758]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummaryCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummaryReport_InventorySummaryColumn_InventorySummaryColum.qbl b/_Main/BL/Relations/Relation_InventorySummaryReport_InventorySummaryColumn_InventorySummaryColum.qbl
new file mode 100644
index 0000000..e1575bb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummaryReport_InventorySummaryColumn_InventorySummaryColum.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummaryReport_InventorySummaryColumn_InventorySummaryColumn_InventorySummaryReport
+{
+  #keys: '1[415136.0.865304722]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.865304741][415136.0.865304735][415136.0.865304742][415136.0.865304736][415136.0.865304743][415136.0.865304737][415136.0.865304744][415136.0.865304738][415136.0.865304745][415136.0.865304739][415136.0.865304746][415136.0.865304740]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+  }
+  RelationSide.LeftSide InventorySummaryColumn
+  {
+    #keys: '3[415136.0.865304724][415136.0.865304723][415136.0.865304725]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventorySummaryReport
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide InventorySummaryReport
+  {
+    #keys: '3[415136.0.865304727][415136.0.865304726][415136.0.865304728]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummaryColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummaryReport_InventroySummaryRow_InventroySummaryRow_Inve.qbl b/_Main/BL/Relations/Relation_InventorySummaryReport_InventroySummaryRow_InventroySummaryRow_Inve.qbl
new file mode 100644
index 0000000..b0030b0
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummaryReport_InventroySummaryRow_InventroySummaryRow_Inve.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummaryReport_InventroySummaryRow_InventroySummaryRow_InventorySummaryReport
+{
+  #keys: '1[415136.0.865304709]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InventroySummaryRow
+  {
+    #keys: '3[415136.0.865304711][415136.0.865304710][415136.0.865304712]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventorySummaryReport
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide InventorySummaryReport
+  {
+    #keys: '3[415136.0.865304714][415136.0.865304713][415136.0.865304715]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventroySummaryRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummarySearch_InventorySummarySource_InventorySummarySourc.qbl b/_Main/BL/Relations/Relation_InventorySummarySearch_InventorySummarySource_InventorySummarySourc.qbl
new file mode 100644
index 0000000..2fd19a0
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummarySearch_InventorySummarySource_InventorySummarySourc.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummarySearch_InventorySummarySource_InventorySummarySource_InventorySummarySearch
+{
+  #keys: '1[415136.0.865304882]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InventorySummarySource
+  {
+    #keys: '3[415136.0.865304884][415136.0.865304883][415136.0.865304885]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummarySearch
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide InventorySummarySearch
+  {
+    #keys: '3[415136.0.865304887][415136.0.865304886][415136.0.865304888]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummarySource
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummarySource_InventorySummaryReport_InventorySummaryRepor.qbl b/_Main/BL/Relations/Relation_InventorySummarySource_InventorySummaryReport_InventorySummaryRepor.qbl
new file mode 100644
index 0000000..2b2803e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummarySource_InventorySummaryReport_InventorySummaryRepor.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummarySource_InventorySummaryReport_InventorySummaryReport_InventorySummarySource
+{
+  #keys: '1[415136.0.865304908]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InventorySummaryReport
+  {
+    #keys: '3[415136.0.865304910][415136.0.865304909][415136.0.865304911]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventorySummarySource
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide InventorySummarySource
+  {
+    #keys: '3[415136.0.865304913][415136.0.865304912][415136.0.865304914]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummaryReport
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventorySummarySource_MacroPlan_MacroPlan_InventorySummarySource.qbl b/_Main/BL/Relations/Relation_InventorySummarySource_MacroPlan_MacroPlan_InventorySummarySource.qbl
new file mode 100644
index 0000000..ebfbb87
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventorySummarySource_MacroPlan_MacroPlan_InventorySummarySource.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventorySummarySource_MacroPlan_MacroPlan_InventorySummarySource
+{
+  #keys: '1[415136.0.865304895]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[415136.0.865304897][415136.0.865304896][415136.0.865304898]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummarySource
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide InventorySummarySource
+  {
+    #keys: '3[415136.0.865304900][415136.0.865304899][415136.0.865304901]'
+    Cardinality: '0to1'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InventroySummaryRow_InventorySummaryCell_InventorySummaryCell_Inven.qbl b/_Main/BL/Relations/Relation_InventroySummaryRow_InventorySummaryCell_InventorySummaryCell_Inven.qbl
new file mode 100644
index 0000000..eeac640
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InventroySummaryRow_InventorySummaryCell_InventorySummaryCell_Inven.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InventroySummaryRow_InventorySummaryCell_InventorySummaryCell_InventroySummaryRow
+{
+  #keys: '1[415136.0.865304782]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InventorySummaryCell
+  {
+    #keys: '3[415136.0.865304784][415136.0.865304783][415136.0.865304785]'
+    Cardinality: '1toN'
+    ObjectDefinition: InventroySummaryRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide InventroySummaryRow
+  {
+    #keys: '3[415136.0.865304787][415136.0.865304786][415136.0.865304788]'
+    Cardinality: '0to1'
+    ObjectDefinition: InventorySummaryCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Attribute_AverageInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Attribute_AverageInventory.qbl
new file mode 100644
index 0000000..cc4cf47
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Attribute_AverageInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute AverageInventory
+{
+  #keys: '3[415136.0.865305024][415136.0.865305023][415136.0.865305025]'
+  Description: '璇勪环搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Attribute_EndingInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Attribute_EndingInventory.qbl
new file mode 100644
index 0000000..f51b0bc
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Attribute_EndingInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndingInventory
+{
+  #keys: '3[415136.0.865304924][415136.0.865304923][415136.0.865304925]'
+  Description: '鏈熸湯搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Attribute_MaximumInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Attribute_MaximumInventory.qbl
new file mode 100644
index 0000000..341b8e7
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Attribute_MaximumInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaximumInventory
+{
+  #keys: '3[415136.0.865304944][415136.0.865304943][415136.0.865304945]'
+  Description: '鏈�澶у簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Attribute_MinimumInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Attribute_MinimumInventory.qbl
new file mode 100644
index 0000000..d686c7f
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Attribute_MinimumInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MinimumInventory
+{
+  #keys: '3[415136.0.865304934][415136.0.865304933][415136.0.865304935]'
+  Description: '鏈�灏忓簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl
new file mode 100644
index 0000000..976add9
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcAverageInventory
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-1-2024 (created)
+    
+    value := average( this, ProductInStockingPointInPeriod, pispip, pispip.PlannedInventoryLevelEnd() );
+    
+    this.AverageInventory( value );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl
new file mode 100644
index 0000000..7fcd1da
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcEndingInventory
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-1-2024 (created)
+    
+    value := maxobject( this, ProductInStockingPointInPeriod, pispip, pispip.Start() );
+    
+    this.EndingInventory( value.PlannedInventoryLevelEnd() );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl
new file mode 100644
index 0000000..db9ad44
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcMaximumInventory
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-1-2024 (created)
+    
+    value := max( this, ProductInStockingPointInPeriod, pispip, pispip.PlannedInventoryLevelEnd() );
+    
+    this.MaximumInventory( value );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl b/_Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl
new file mode 100644
index 0000000..e730b7c
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcMinimumInventory
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-1-2024 (created)
+    
+    value := min( this, ProductInStockingPointInPeriod, pispip, pispip.PlannedInventoryLevelEnd() );
+    
+    this.MinimumInventory( value );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryCell/_ROOT_Type_InventorySummaryCell.qbl b/_Main/BL/Type_InventorySummaryCell/_ROOT_Type_InventorySummaryCell.qbl
new file mode 100644
index 0000000..153a82e
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryCell/_ROOT_Type_InventorySummaryCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventorySummaryCell
+{
+  #keys: '5[415136.0.865304684][415136.0.865304682][0.0.0][415136.0.865304683][415136.0.865304685]'
+  BaseType: Object
+  Description: '搴撳瓨姹囨�绘姤琛ㄥ崟鍏冩牸'
+  StructuredName: 'InventorySummaryCells'
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/Attribute_Category.qbl b/_Main/BL/Type_InventorySummaryColumn/Attribute_Category.qbl
new file mode 100644
index 0000000..2674d93
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/Attribute_Category.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Category
+{
+  #keys: '3[415136.0.865101993][415136.0.865101992][415136.0.865101994]'
+  Description: 'day;week;month'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/Attribute_Index.qbl b/_Main/BL/Type_InventorySummaryColumn/Attribute_Index.qbl
new file mode 100644
index 0000000..851f48d
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415136.0.865304670][415136.0.865304669][415136.0.865304671]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/Attribute_Name.qbl b/_Main/BL/Type_InventorySummaryColumn/Attribute_Name.qbl
new file mode 100644
index 0000000..0503193
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.865304673][415136.0.865304672][415136.0.865304674]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/Attribute_Period.qbl b/_Main/BL/Type_InventorySummaryColumn/Attribute_Period.qbl
new file mode 100644
index 0000000..5c8b136
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/Attribute_Period.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.865304676][415136.0.865304675][415136.0.865304677]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/DefaultValue_Name.qbl b/_Main/BL/Type_InventorySummaryColumn/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/Function_CalcIndex.qbl b/_Main/BL/Type_InventorySummaryColumn/Function_CalcIndex.qbl
new file mode 100644
index 0000000..56bbf20
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/Function_CalcIndex.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-21-2024 (created)
+    
+    value := ifexpr( isnull( this.PreviousColumn() ), 0, this.PreviousColumn().Index() + 1 );
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryColumn/_ROOT_Type_InventorySummaryColumn.qbl b/_Main/BL/Type_InventorySummaryColumn/_ROOT_Type_InventorySummaryColumn.qbl
new file mode 100644
index 0000000..8025104
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryColumn/_ROOT_Type_InventorySummaryColumn.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventorySummaryColumn
+{
+  #keys: '5[415136.0.865304667][415136.0.865304665][0.0.0][415136.0.865304666][415136.0.865304668]'
+  BaseType: Object
+  Description: '搴撳瓨姹囨�诲垪'
+  StructuredName: 'InventorySummaryColumns'
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Attribute_ID.qbl b/_Main/BL/Type_InventorySummaryReport/Attribute_ID.qbl
new file mode 100644
index 0000000..6c9df63
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.865304629][415136.0.865304628][415136.0.865304630]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Attribute_IsShow.qbl b/_Main/BL/Type_InventorySummaryReport/Attribute_IsShow.qbl
new file mode 100644
index 0000000..43d060a
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Attribute_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsShow
+{
+  #keys: '3[415136.0.865304635][415136.0.865304634][415136.0.865304636]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Attribute_Name.qbl b/_Main/BL/Type_InventorySummaryReport/Attribute_Name.qbl
new file mode 100644
index 0000000..5951a3f
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.865304638][415136.0.865304637][415136.0.865304639]'
+  Description: '鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/DefaultValue_ID.qbl b/_Main/BL/Type_InventorySummaryReport/DefaultValue_ID.qbl
new file mode 100644
index 0000000..049abc0
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/DefaultValue_ID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ID
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/DefaultValue_Name.qbl b/_Main/BL/Type_InventorySummaryReport/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_Clear.qbl b/_Main/BL/Type_InventorySummaryReport/Method_Clear.qbl
new file mode 100644
index 0000000..ec171dc
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Method_Clear.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Method Clear
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    this.InventorySummaryColumn( relflush );
+    this.InventroySummaryRow( relflush );
+    
+    this.GenerateColumn( this.InventorySummarySource().MacroPlan() );
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl b/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
new file mode 100644
index 0000000..8fbefce
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method Generate (
+  InventorySummarySearch search,
+  Product_MPs products
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    table      := selectobject( this, InventorySummarySource.InventorySummaryReport, 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.InventroySummaryRow( relnew, Name := 'SUM', Unit := search.Unit(), RowNr := table.InventroySummaryRow( relsize ) );
+    traverse( table, InventroySummaryRow, row, row.Unit() = search.Unit() ){
+      productid  := construct( Strings );
+      productid.Add( row.Name() );
+      
+      if( productids.ContainsAll( productid ) ){
+        showrow := this.InventroySummaryRow( relnew, Name := row.Name(), Unit := row.Unit(), RowNr := row.RowNr() );
+        
+        traverse( row, InventorySummaryCell, cell ){
+    //      column   := selectobject( this, InventorySummaryColumn, column, column.Name() = cell.InventorySummaryColumn().Name() );
+    //      
+    //      sumcell  := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
+    //      if( isnull( sumcell ) ){
+    //        sumcell := column.InventorySummaryCell( relnew, Value := '0' );
+    //        sumrow.InventorySummaryCell( relinsert, sumcell );
+    //      }
+    //      
+    //      showcell := column.InventorySummaryCell( relnew, Value := cell.Value() );
+    //      showrow.InventorySummaryCell( relinsert, showcell );
+    //      value := [Real]cell.Value() + [Real]sumcell.Value();
+    //      sumcell.Value( [String]value );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl b/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl
new file mode 100644
index 0000000..bce7074
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/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.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl b/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
new file mode 100644
index 0000000..c11af49
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetRow (
+  String unit,
+  String product,
+  DateTime startdate,
+  DateTime enddate
+) as InventroySummaryRow
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    row := selectobject( this, InventroySummaryRow, row, row.Name() = product and row.Unit() = unit );
+    
+    if( isnull( row ) ){
+      row := this.InventroySummaryRow( relnew, Name := product, Unit := unit );
+      //鍒濆鍖栧崟鍏冩牸
+      row.InitializeCell( this, startdate, enddate );
+    }
+    
+    return row;
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultAllUnit.qbl b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultAllUnit.qbl
new file mode 100644
index 0000000..518f4c6
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultAllUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultAllUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    return '<All>';
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl
new file mode 100644
index 0000000..6b92234
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    return '闀挎槬';
+    //return 'China';
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl
new file mode 100644
index 0000000..f21ff7d
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    return '澶ц繛';
+    //return 'Foregin';
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultName.qbl b/_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultName.qbl
new file mode 100644
index 0000000..fba1410
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/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 'Inventory summary';
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/_ROOT_Type_InventorySummaryReport.qbl b/_Main/BL/Type_InventorySummaryReport/_ROOT_Type_InventorySummaryReport.qbl
new file mode 100644
index 0000000..d260b23
--- /dev/null
+++ b/_Main/BL/Type_InventorySummaryReport/_ROOT_Type_InventorySummaryReport.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventorySummaryReport
+{
+  #keys: '5[415136.0.865304626][415136.0.865304624][0.0.0][415136.0.865304625][415136.0.865304627]'
+  BaseType: Object
+  Description: '搴撳瓨姹囨�绘姤琛�'
+  StructuredName: 'InventorySummaryReports'
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_Category.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_Category.qbl
new file mode 100644
index 0000000..795b6e6
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_Category.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Category
+{
+  #keys: '3[415136.0.865101964][415136.0.865101963][415136.0.865101965]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_EndDate.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_EndDate.qbl
new file mode 100644
index 0000000..a0f273b
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_EndDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndDate
+{
+  #keys: '3[415136.0.865304981][415136.0.865304980][415136.0.865304982]'
+  Description: '鎺ュ彈鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_Generation.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_Generation.qbl
new file mode 100644
index 0000000..f1d7453
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[415136.0.865304596][415136.0.865304595][415136.0.865304597]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_MqbMlb.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_MqbMlb.qbl
new file mode 100644
index 0000000..c60b1d6
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_MqbMlb.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MqbMlb
+{
+  #keys: '3[415136.0.865304599][415136.0.865304598][415136.0.865304600]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_Power.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_Power.qbl
new file mode 100644
index 0000000..e993cb3
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_Power.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Power
+{
+  #keys: '3[415136.0.865304602][415136.0.865304601][415136.0.865304603]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_StartDate.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_StartDate.qbl
new file mode 100644
index 0000000..1f97228
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_StartDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[415136.0.865101837][415136.0.865101836][415136.0.865101838]'
+  Description: '寮�濮嬫棩鏈�'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/Attribute_Unit.qbl b/_Main/BL/Type_InventorySummarySearch/Attribute_Unit.qbl
new file mode 100644
index 0000000..b265b0c
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[415136.0.865304605][415136.0.865304604][415136.0.865304606]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/DefaultValue_Generation.qbl b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Generation.qbl
new file mode 100644
index 0000000..9e5b51e
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Generation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Generation
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/DefaultValue_MqbMlb.qbl b/_Main/BL/Type_InventorySummarySearch/DefaultValue_MqbMlb.qbl
new file mode 100644
index 0000000..78982c5
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/DefaultValue_MqbMlb.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: MqbMlb
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/DefaultValue_Power.qbl b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Power.qbl
new file mode 100644
index 0000000..4922731
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Power.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Power
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/DefaultValue_Unit.qbl b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Unit.qbl
new file mode 100644
index 0000000..7e60e2c
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/DefaultValue_Unit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Unit
+}
diff --git a/_Main/BL/Type_InventorySummarySearch/_ROOT_Type_InventorySummarySearch.qbl b/_Main/BL/Type_InventorySummarySearch/_ROOT_Type_InventorySummarySearch.qbl
new file mode 100644
index 0000000..56a668e
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySearch/_ROOT_Type_InventorySummarySearch.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventorySummarySearch
+{
+  #keys: '5[415136.0.865304593][415136.0.865304591][0.0.0][415136.0.865304592][415136.0.865304594]'
+  BaseType: Object
+  Description: '鏌ヨ绫�'
+  StructuredName: 'InventorySummarySearchs'
+}
diff --git a/_Main/BL/Type_InventorySummarySource/Attribute_ID.qbl b/_Main/BL/Type_InventorySummarySource/Attribute_ID.qbl
new file mode 100644
index 0000000..77f645f
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.865304968][415136.0.865304967][415136.0.865304969]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySource/Attribute_Name.qbl b/_Main/BL/Type_InventorySummarySource/Attribute_Name.qbl
new file mode 100644
index 0000000..56307c5
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.865304835][415136.0.865304834][415136.0.865304836]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventorySummarySource/DefaultValue_Name.qbl b/_Main/BL/Type_InventorySummarySource/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
new file mode 100644
index 0000000..6fe5b7f
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
@@ -0,0 +1,78 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
+  TextBody:
+  [*
+    
+    table := selectobject( macroPlan, FinancialSalesSource.FinancialSalesReport, 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, FinancialSalesColumn, column ) {
+      columnelement := xmlDOM.CreateElement( "column" );
+      nameelement   := xmlDOM.CreateElement( "name" );
+      typeelement   := xmlDOM.CreateElement( "type" );
+      nameelement.TextContent( column.Name() );
+      typeelement.TextContent( "String" );
+      columnelement.AppendChild( nameelement );
+      columnelement.AppendChild( typeelement );
+      
+      cells := selectsortedset( column, FinancialSalesCell, cell, cell.FinancialSalesRow().RowNr() );
+    
+      traverse ( cells, Elements, c ) {
+        if( column.Index() = 0 ){
+          row := c.FinancialSalesRow();
+          //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() ); 
+        columnelement.AppendChild( cellElement );
+      }
+      tableElement.AppendChild( columnelement );  
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM );
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( FinancialSalesReport::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_DownloadTemplate.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_DownloadTemplate.qbl
new file mode 100644
index 0000000..a47c88a
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_DownloadTemplate.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DownloadTemplate (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name><column><name>Product</name><type>String</type></column><column><name>Unit</name><type>String</type></column></table>' );
+    
+    tableElement              := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    startofyear               := macroPlan.StartOfPlanning().StartOfYear();
+    startofnextyear           := macroPlan.StartOfPlanning().StartOfNextYear();
+    
+    for( start := startofyear; start < startofnextyear; start := start.StartOfNextMonth() ){
+      columnElement := xmlDOM.CreateElement( "column" );
+      nameElement   := xmlDOM.CreateElement( "name" );
+      typeElement   := xmlDOM.CreateElement( "type" );
+      nameElement.TextContent( start.Format( "M2/D2/Y" ) );
+      typeElement.TextContent( "String" );
+      columnElement.AppendChild( nameElement );
+      columnElement.AppendChild( typeElement );
+      tableElement.AppendChild( columnElement );  
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( FinancialSalesReport::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
new file mode 100644
index 0000000..6ed8f07
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
@@ -0,0 +1,53 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Initialize (
+  MacroPlan owner
+)
+{
+  Description: '鍒濆鍖�'
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    owner.InventorySummarySource( relflush );
+    products                  := construct( Product_MPs );
+    allunit                   := InventorySummaryReport::GetDefaultAllUnit();
+    ccunit                    := InventorySummaryReport::GetDefaultCCUnit();
+    dlunit                    := InventorySummaryReport::GetDefaultDLUnit();
+    
+    source                    := owner.InventorySummarySource( relnew, ID := InventorySummaryReport::GetDefaultName(), Name := InventorySummaryReport::GetDefaultName() );
+    table                     := source.InventorySummaryReport( relnew, ID := source.Name(), Name := source.Name() );
+    showtable                 := source.InventorySummaryReport( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsShow := true );
+    startofplanning           := owner.StartOfPlanning();
+    startofyear               := startofplanning.StartOfYear();
+    startofnextyear           := startofplanning.StartOfNextYear();
+    
+    search                    := source.InventorySummarySearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit, StartDate := Date::MinDate(), EndDate := Date::MaxDate() );
+    
+    table.GenerateColumn( owner );
+    
+    //浠嶱roduct planning鏌ユ壘搴撳瓨鐐逛负闀挎槬瑁呴厤绾胯竟搴撶殑鎵�鏈塎QB浜у搧锛屽彇Total Demand瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
+    traverse( owner, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() and ( pisp.StockingPoint_MP().UnitID() = ccunit or pisp.StockingPoint_MP().UnitID() = dlunit ) ){
+      unit := pisp.StockingPoint_MP().UnitID();
+      product := pisp.Product_MP();
+        traverse( pisp, ProductInStockingPointInPeriod, pispip, pispip.Start() >= startofplanning
+                and 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, InventorySummaryColumn, column, column.Name() = periodname and column.Period() = periodtime );
+          ccrow := table.GetRow( ccunit, product.ID(), startofyear, startofnextyear );
+          ccrow.Initialize( column, pispip );//鍙朤otal Demand瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
+          
+          allrow     := table.GetRow( allunit, product.ID(), startofyear, startofnextyear );
+          allrow.Initialize( column, pispip );
+        }
+    }
+    
+    rows := selectsortedset( table, InventroySummaryRow, 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_InventorySummarySource/StaticMethod_Upload.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Upload.qbl
new file mode 100644
index 0000000..df950f0
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Upload.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Upload (
+  MacroPlan owner,
+  BinaryValue binaryValue,
+  String filePath
+) as FinancialSalesSource
+{
+  TextBody:
+  [*
+    fileName := filePath.Tokenize( "\" ).Element( filePath.Tokenize( "\" ).Size() - 1 );
+    
+    source := owner.FinancialSalesSource( 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(), "" ) );
+    
+    return source;
+  *]
+}
diff --git a/_Main/BL/Type_InventorySummarySource/_ROOT_Type_InventorySummarySource.qbl b/_Main/BL/Type_InventorySummarySource/_ROOT_Type_InventorySummarySource.qbl
new file mode 100644
index 0000000..3ba4e03
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/_ROOT_Type_InventorySummarySource.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventorySummarySource
+{
+  #keys: '5[415136.0.865304823][415136.0.865304821][0.0.0][415136.0.865304822][415136.0.865304824]'
+  BaseType: Object
+  Description: '搴撳瓨姹囨�绘姤琛�'
+  StructuredName: 'InventorySummarySources'
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_Name.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_Name.qbl
new file mode 100644
index 0000000..b941a62
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.865304652][415136.0.865304651][415136.0.865304653]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_RowNr.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..05992ac
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.865304655][415136.0.865304654][415136.0.865304656]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_Unit.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_Unit.qbl
new file mode 100644
index 0000000..066f3de
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[415136.0.865304658][415136.0.865304657][415136.0.865304659]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/DefaultValue_Name.qbl b/_Main/BL/Type_InventroySummaryRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/DefaultValue_Unit.qbl b/_Main/BL/Type_InventroySummaryRow/DefaultValue_Unit.qbl
new file mode 100644
index 0000000..7e60e2c
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/DefaultValue_Unit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Unit
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Method_Filter.qbl b/_Main/BL/Type_InventroySummaryRow/Method_Filter.qbl
new file mode 100644
index 0000000..8c62e9b
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/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_InventroySummaryRow/Method_Initialize\0430.qbl" "b/_Main/BL/Type_InventroySummaryRow/Method_Initialize\0430.qbl"
new file mode 100644
index 0000000..ec79cf4
--- /dev/null
+++ "b/_Main/BL/Type_InventroySummaryRow/Method_Initialize\0430.qbl"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  InventorySummaryColumn column,
+  ProductInStockingPointInPeriod pispip
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, InventorySummaryCell, cell, cell.InventorySummaryColumn() = column );
+    
+    cell.ProductInStockingPointInPeriod( relinsert, pispip );
+  *]
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl b/_Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl
new file mode 100644
index 0000000..fbffb32
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  InventorySummaryColumn column,
+  String unit
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := column.InventorySummaryCell( relnew );
+    
+    this.InventorySummaryCell( relinsert, cell );
+  *]
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl b/_Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl
new file mode 100644
index 0000000..a619b37
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeCell (
+  InventorySummaryReport table,
+  DateTime startdate,
+  DateTime enddate
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    for( start := startdate; start < enddate; start := start.StartOfNextMonth() ){
+      periodtime := start.Date();
+      periodname := periodtime.Format( "M2/D2/Y" );
+      column := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname and column.Period() = periodtime );
+    
+      this.Initialize( column, this.Unit() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_InventroySummaryRow/StaticMethod_NewStaticMethod.qbl
new file mode 100644
index 0000000..dc906f4
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/StaticMethod_NewStaticMethod.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod NewStaticMethod
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-1-2024 (created)
+  *]
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/_ROOT_Type_InventroySummaryRow.qbl b/_Main/BL/Type_InventroySummaryRow/_ROOT_Type_InventroySummaryRow.qbl
new file mode 100644
index 0000000..746a1ea
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/_ROOT_Type_InventroySummaryRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InventroySummaryRow
+{
+  #keys: '5[415136.0.865304646][415136.0.865304644][0.0.0][415136.0.865304645][415136.0.865304647]'
+  BaseType: Object
+  Description: '搴撳瓨姹囨�昏'
+  StructuredName: 'InventroySummaryRows'
+}
diff --git "a/_Main/BL/Type_ProductInStockingPointInPeriod\043228/_ROOT_Type_ProductInStockingPointInPeriod.qbl" "b/_Main/BL/Type_ProductInStockingPointInPeriod\043228/_ROOT_Type_ProductInStockingPointInPeriod.qbl"
new file mode 100644
index 0000000..48d9cd9
--- /dev/null
+++ "b/_Main/BL/Type_ProductInStockingPointInPeriod\043228/_ROOT_Type_ProductInStockingPointInPeriod.qbl"
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ProductInStockingPointInPeriod #extension
+{
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index cfc3cee..68f5a8f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -27,6 +27,17 @@
         Taborder: 1
       ]
     }
+    Component ButtonInventorySummaryReport
+    {
+      #keys: '[415136.0.862201699]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_CHECK_EDIT'
+        Label: 'Inventory summary report'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonInventorySummaryReport_OnCl.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonInventorySummaryReport_OnCl.def
new file mode 100644
index 0000000..616a1fb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonInventorySummaryReport_OnCl.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonInventorySummaryReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonInventorySummaryReport_OnClick
+{
+  #keys: '[415136.0.862201823]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Inventory_summary_report_view", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_MatrixEditorTable.def
new file mode 100644
index 0000000..19c25a9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_MatrixEditorTable.def
@@ -0,0 +1,98 @@
+Quintiq file version 2.0
+Component MatrixEditorTable
+{
+  #keys: '[415136.0.864612253]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellTable
+    {
+      #keys: '[415136.0.864612254]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCell
+        {
+          #keys: '[415136.0.864612255]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InventorySummaryReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'InventorySummaryColumn.InventorySummaryCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'EndingInventory;MinimumInventory;MaximumInventory;AverageInventory'
+        Column: 'InventorySummaryColumn'
+        Row: 'InventroySummaryRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsTable
+    {
+      #keys: '[415136.0.864612256]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRow
+        {
+          #keys: '[415136.0.864612257]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InventorySummaryReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'InventroySummaryRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsTable
+    {
+      #keys: '[415136.0.864612258]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumn
+        {
+          #keys: '[415136.0.864612259]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InventorySummaryReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'InventorySummaryColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable
+    #child: matrixeditorContextMenuTable
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumnsTable'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorRowsTable'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
new file mode 100644
index 0000000..1c06644
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+Component PanelCategory
+{
+  #keys: '[415136.0.862221867]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component RadioButtonGroupUseForPlanning id:RadioButtonGroupUseForPlanning_545
+    {
+      #keys: '[415136.0.862222092]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        BoundValue: 'Day'
+        ButtonLabels: 'Day;Week;Month'
+        ButtonValues: 'Day;Week;Month'
+        Orientation: 'horizontal'
+        ShowTitle: false
+        Taborder: 0
+        Title: 'Periods'
+        Tooltip: '<html>Select if the periods are used for planning or merely for visualization.<br>The planning periods define the granularity at which planning is done.<br>In case of overlapping planning periods, the smallest ones are used.<br>The planning periods are shown in the period overview in blue.</html>'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def
new file mode 100644
index 0000000..cded950
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelExport
+{
+  #keys: '[415136.0.862221896]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonSummaryExport
+    {
+      #keys: '[415136.0.862221939]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelGeneration.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelGeneration.def
new file mode 100644
index 0000000..27105c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelGeneration.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelGeneration
+{
+  #keys: '[415136.0.864612093]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslGeneration
+    {
+      #keys: '[415136.0.864612094]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'Generation'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryColumnSearch.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryColumnSearch.def
new file mode 100644
index 0000000..c91046e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryColumnSearch.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component PanelInventorySummaryColumnSearch
+{
+  #keys: '[415136.0.864612101]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelPeriod
+    #child: PanelExport
+    #child: PanelCategory
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryHeader.def
new file mode 100644
index 0000000..e149da6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryHeader.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component PanelInventorySummaryHeader
+{
+  #keys: '[415136.0.864612089]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelInventorySummaryProductSearch
+    #child: PanelInventorySummaryColumnSearch
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryProductSearch.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryProductSearch.def
new file mode 100644
index 0000000..bfd68b1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelInventorySummaryProductSearch.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+Component PanelInventorySummaryProductSearch
+{
+  #keys: '[415136.0.864612090]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelUnit
+    #child: PanelGeneration
+    #child: PanelMQBMLB
+    #child: PanelPower
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelMQBMLB.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelMQBMLB.def
new file mode 100644
index 0000000..b261493
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelMQBMLB.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelMQBMLB
+{
+  #keys: '[415136.0.864612095]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslMQBMLB
+    {
+      #keys: '[415136.0.864612096]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'MQB/MLB'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def
new file mode 100644
index 0000000..bc6b316
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+Component PanelPeriod
+{
+  #keys: '[415136.0.862221329]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DateSelectorStart
+    {
+      #keys: '[415136.0.862221355]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start date'
+        Taborder: 0
+      ]
+    }
+    Component DateSelectorEnd
+    {
+      #keys: '[415136.0.862221609]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'End date'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPower.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPower.def
new file mode 100644
index 0000000..f59f987
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPower.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelPower
+{
+  #keys: '[415136.0.864612097]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslPower
+    {
+      #keys: '[415136.0.864612098]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'Power'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelTable.def
new file mode 100644
index 0000000..636f0fc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelTable.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelTable
+{
+  #keys: '[415136.0.864612252]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable
+  ]
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelUnit.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelUnit.def
new file mode 100644
index 0000000..4990a44
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelUnit.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelUnit
+{
+  #keys: '[415136.0.864612091]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslUnit
+    {
+      #keys: '[415136.0.864612092]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'Unit'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixEditorActionBarPageTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixEditorActionBarPageTable.def
new file mode 100644
index 0000000..ece6871
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixEditorActionBarPageTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable
+{
+  #keys: '[415136.0.864612260]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixeditorContextMenuTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixeditorContextMenuTable.def
new file mode 100644
index 0000000..e7171db
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_matrixeditorContextMenuTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable
+{
+  #keys: '[415136.0.864612261]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
new file mode 100644
index 0000000..9b50f5f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormInventorySummaryReport_OnCreated
+{
+  #keys: '[415136.0.864612555]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      if( not isnull( MacroPlan.InventorySummarySource() ) ){
+        InventorySummarySource::Initialize( MacroPlan );
+      }
+      //info( '------------------1----------------' );
+      table := selectobject( MacroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
+      info( '------------------2----------------', table.IsShow() );
+      DataHolderTable.Data( table );
+      
+      dhSearch.Data( table.InventorySummarySource().InventorySummarySearch() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnChanged\043847.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnChanged\043847.def"
new file mode 100644
index 0000000..83bb279
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnChanged\043847.def"
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelCategory/RadioButtonGroupUseForPlanning_545
+Response OnChanged () id:Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged_847
+{
+  #keys: '[415136.0.862222091]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鍖洪棿鏀瑰彉鍚庡埛鏂版樉绀�
+      if( dhSearch.Data().Category() <> this.BoundValue() ){
+        dhSearch.Data().Category( this.BoundValue() );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
new file mode 100644
index 0000000..dda4e49
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: PanelExport/ButtonSummaryExport
+Response OnClick () id:Response_PanelExport_ButtonSummaryExport_OnClick
+{
+  #keys: '[415136.0.862221938]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := InventorySummarySource::Download( MacroPlan );
+      
+      Application.Download( InventorySummaryReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnCreated.def
new file mode 100644
index 0000000..0659423
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnCreated.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: PanelGeneration/ddslGeneration
+Response OnCreated () id:Response_PanelGeneration_ddslGeneration_OnCreated
+{
+  #keys: '[415136.0.864612086]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      values := selectuniquevalues( MacroPlan, Product_MP, tempPMP, true, tempPMP.Generation() );
+      
+      valueString := values.Concatenate( ";" );
+      valueString := selectuniquevalues( valueString.Tokenize( ";" ), Elements, tempS, true, tempS ).Concatenate( ";" );
+      
+      valueString := "<All>" + ifexpr( valueString = "", "", ";" ) + valueString;
+      
+      this.Strings( valueString );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def
new file mode 100644
index 0000000..41e1fd3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelGeneration_ddslGeneration_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelGeneration/ddslGeneration
+Response OnSelectionChanged () id:Response_PanelGeneration_ddslGeneration_OnSelectionChanged
+{
+  #keys: '[415136.0.864612085]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //浠f暟鏀瑰彉鍚庡埛鏂版樉绀�
+      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_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnCreated.def
new file mode 100644
index 0000000..31df8e8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnCreated.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: PanelMQBMLB/ddslMQBMLB
+Response OnCreated () id:Response_PanelMQBMLB_ddslMQBMLB_OnCreated
+{
+  #keys: '[415136.0.864612084]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      values := selectuniquevalues( MacroPlan, Product_MP, tempPMP, true, tempPMP.MQBMLB() );
+      
+      valueString := values.Concatenate( ";" );
+      valueString := selectuniquevalues( valueString.Tokenize( ";" ), Elements, tempS, true, tempS ).Concatenate( ";" );
+      
+      valueString := "<All>" + ifexpr( valueString = "", "", ";" ) + valueString;
+      
+      this.Strings( valueString );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def
new file mode 100644
index 0000000..a86bd8c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelMQBMLB/ddslMQBMLB
+Response OnSelectionChanged () id:Response_PanelMQBMLB_ddslMQBMLB_OnSelectionChanged
+{
+  #keys: '[415136.0.864612083]'
+  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_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def
new file mode 100644
index 0000000..7d13e79
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelPeriod/DateSelectorEnd
+Response OnChanged () id:Response_PanelPeriod_DateSelectorEnd_OnChanged
+{
+  #keys: '[415136.0.862221640]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( dhSearch.Data().EndDate() <> this.Date() ){
+        dhSearch.Data().EndDate( this.Date() );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def
new file mode 100644
index 0000000..aa54f0a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelPeriod/DateSelectorStart
+Response OnChanged () id:Response_PanelPeriod_DateSelectorStart_OnChanged
+{
+  #keys: '[415136.0.862221461]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( dhSearch.Data().StartDate() <> this.Date() ){
+        dhSearch.Data().StartDate( this.Date() );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnCreated.def
new file mode 100644
index 0000000..24138aa
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnCreated.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: PanelPower/ddslPower
+Response OnCreated () id:Response_PanelPower_ddslPower_OnCreated
+{
+  #keys: '[415136.0.864612082]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      values := selectuniquevalues( MacroPlan, Product_MP, tempPMP, true, tempPMP.Power() );
+      
+      valueString := values.Concatenate( ";" );
+      valueString := selectuniquevalues( valueString.Tokenize( ";" ), Elements, tempS, true, tempS ).Concatenate( ";" );
+      
+      valueString := "<All>" + ifexpr( valueString = "", "", ";" ) + valueString;
+      
+      this.Strings( valueString );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnSelectionChanged.def
new file mode 100644
index 0000000..01ad63c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPower_ddslPower_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelPower/ddslPower
+Response OnSelectionChanged () id:Response_PanelPower_ddslPower_OnSelectionChanged
+{
+  #keys: '[415136.0.864612081]'
+  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_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnCreated.def
new file mode 100644
index 0000000..67038e1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/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.864612088]'
+  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_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def
new file mode 100644
index 0000000..a4cb7ef
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelUnit/ddslUnit
+Response OnSelectionChanged () id:Response_PanelUnit_ddslUnit_OnSelectionChanged
+{
+  #keys: '[415136.0.864612087]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //Unit鏇存柊鍚庣敓鎴愭柊鐨勬樉绀�
+      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_FormInventorySummaryReport/_ROOT_Component_FormInventorySummaryReport.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/_ROOT_Component_FormInventorySummaryReport.def
new file mode 100644
index 0000000..18cc120
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/_ROOT_Component_FormInventorySummaryReport.def
@@ -0,0 +1,38 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormInventorySummaryReport
+{
+  #keys: '[415136.0.864611956]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    Component DataHolderTable
+    {
+      #keys: '[415136.0.864612009]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'InventorySummaryReport'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component dhSearch
+    {
+      #keys: '[415136.0.864612034]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'InventorySummarySearch'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    #child: PanelInventorySummaryHeader
+    #child: PanelTable
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CHECK_EDIT'
+    Title: 'Inventory summary report'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Inventory_summary_report_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Inventory_summary_report_view.vw
new file mode 100644
index 0000000..f1f7de6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Inventory_summary_report_view.vw
@@ -0,0 +1,140 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormInventorySummaryReport
+      {
+        title: 'QMacroPlanner::FormInventorySummaryReport'
+        shown: true
+        componentID: 'QMacroPlanner::FormInventorySummaryReport'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormInventorySummaryReport_PanelInventorySummaryHeader
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelInventorySummaryProductSearch
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelUnit
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelGeneration
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelMQBMLB
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelPower
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelInventorySummaryColumnSearch
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_PanelTable
+          {
+            sizeRatio: 1
+          }
+          FormInventorySummaryReport_MatrixEditorTable
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormInventorySummaryReport.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_EndingInventory
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'EndingInventory'
+                    }
+                    attribute_MinimumInventory
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'MinimumInventory'
+                    }
+                    attribute_MaximumInventory
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 2
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'MaximumInventory'
+                    }
+                    attribute_AverageInventory
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 3
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'AverageInventory'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 18
+    image: 'DOCUMENT_CHECK_EDIT'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Inventory_summary_report_view'
+  name: 'Inventory summary report view'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3