From 03f93088637930acbda3cd0b405114e0b00c13e4 Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期一, 30 九月 2024 17:29:00 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/BL/Type_OfflinePlanImportData/Attribute_Date.qbl                                                                    |    7 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_Cell_AssemblyOnlinePlanVersionCell_Row.qbl                       |   23 
 _Main/BL/InfoMessages.qbl                                                                                                 |    2 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_InterfaceDataset_InterfaceDataset_A.qbl                       |   34 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def                               |   11 
 _Main/BL/Type_OfflinePlanCell/Method_QuantityGreaterThan0.qbl                                                             |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_cmContent.def                               |   69 +
 _Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetCCFactory.qbl                                                  |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Response_OnCreated.def                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/_ROOT_Component_FormOfflinePlan.def                                 |    2 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTop.def                                                |   29 
 _Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Shift.qbl                                                                 |    8 
 _Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_InventoryWeight.qbl                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bConfirm_OnClick.def                          |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def                                |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader1#799.def                                          |   85 +
 _Main/BL/Type_OfflinePlanColumn/Attribute_IsShow.qbl                                                                      |    7 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTopMost.def                                            |   20 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def                                     |   22 
 _Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitiateSearch.qbl                                                |   27 
 _Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Value.qbl                                                              |    6 
 _Main/BL/Type_MacroPlan/Attribute_A_PreviousScenaioName.qbl                                                               |    8 
 _Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def                              |   56 -
 _Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Component_PanelExport.def                           |    2 
 _Main/BL/Type_TransferMinimumQuantity/_ROOT_Type_TransferMinimumQuantity.qbl                                              |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/_ROOT_Component_DialogCreateEditTransferMinimumQuantity.def        |   32 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def                                     |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport#570.def                              |    3 
 _Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_InitiateSearch.qbl                                                 |   27 
 _Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent#611.def                                          |   27 
 _Main/BL/Type_ChangeLossSetting/StaticMethod_ValidateInput.qbl                                                            |    8 
 _Main/BL/Type_OfflinePlanImportData/StaticMethod_Upload.qbl                                                               |   66 +
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mNew_OnClick.def                  |   23 
 _Main/BL/Type_FinancialProductionCell/Attribute_Quantity.qbl                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mEdit_OnClick.def                 |   21 
 _Main/BL/Type_OfflinePlanImportData/StaticMethod_UpdateCell.qbl                                                           |   31 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlContent.def                                           |   36 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/_ROOT_Type_AssemblyOnlinePlanVersionRow.qbl                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def                                        |    2 
 _Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitializeNew.qbl                                                 |  164 +-
 _Main/Sys/Repr/Global/OfflinePlanCell.qrp                                                                                 |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bRestore_OnClick.def                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mDelete_OnClick.def               |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bGenerateReport_OnClick.def                   |    8 
 _Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_Download.qbl                                                           |   47 +
 _Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_Initialize.qbl                                                     |    9 
 _Main/BL/Type_MachiningPipelineSource0/StaticMethod_InitiateSearch.qbl                                                    |   26 
 _Main/BL/Type_OfflinePlanColumn/DefaultValue_IsShow.qbl                                                                   |    7 
 _Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Shift.qbl                                                              |    6 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_InitiateSearch.qbl                                                   |   28 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnCancel_OnClick.def                          |   15 
 _Main/metadata.properties                                                                                                 |    2 
 _Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl                                                          |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelFinancialSalesReportOperation.def           |    2 
 _Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl                                                        |   46 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_DeductionOfReplacementLoss.qbl                                                 |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlActions.def                                           |   40 
 _Main/BL/Type_Unit/Method_WholeShiftFiltering.qbl                                                                         |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Component_PanelExport#670.def                       |    6 
 _Main/BL/Type_AssemblyOnlinePlanColumn0/DefaultValue_ColumnName.qbl                                                       |    6 
 _Main/BL/Type_FinancialProductionReport/Method_Generate.qbl                                                               |   14 
 _Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLZKM.qbl                                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_abpContent.def                              |   10 
 _Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnIndex.qbl                                                         |    7 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductionLine.qbl                                                   |    7 
 _Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl                                                              |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader2.def                                              |   26 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Response_pnlActions_btnOk_OnClick.def             |    2 
 _Main/BL/Type_AssemblyOnlinePlanColumn0/_ROOT_Type_AssemblyOnlinePlanVersionColumn#0.qbl                                  |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def                                     |    7 
 _Main/BL/Type_TransferMinimumQuantity/Attribute_Quantity.qbl                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlContent_ddslProductID_OnCreated.def                    |   18 
 _Main/BL/Type_OfflinePlanImportData/Attribute_Order.qbl                                                                   |    7 
 _Main/BL/Type_InventorySummarySource/StaticMethod_InitiateSearch.qbl                                                      |   31 
 _Main/BL/Type_OfflinePlanImportData/_ROOT_Type_OfflinePlanImportData.qbl                                                  |    9 
 _Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_ProductionSerialNumber.qbl                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_Edit.def                                                    |   16 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_RowNr.qbl                                                            |    7 
 _Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl                                                            |   36 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelExport.def                             |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bImport_OnClick.def                           |   45 +
 _Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanColumn_OfflinePlanColumn_OfflinePlanCell.qbl                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDownload_OnClick.def                         |   22 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                       |    4 
 _Main/UI/MacroPlannerWebApp/Views/Change_loss_setting_view.vw                                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mSelectAll_OnClick.def            |   17 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pHeader_bDeselectAll_OnClick.def                    |   22 
 _Main/BL/Relations/Relation_OfflinePlanImportData_MacroPlan_MacroPlan_OfflinePlanImportData.qbl                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormChangeLossSetting/Component_ListChangeLossSetting#568.def                       |    2 
 _Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_GetCCFactory.qbl                                                   |   12 
 _Main/BL/Type_FinancialProductionRow/Method_Initialize#110.qbl                                                            |    2 
 _Main/BL/Type_OfflinePlanCell/Function_CalcQuantity.qbl                                                                   |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_lstContent.def                              |   59 +
 _Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_InterfaceDataset_InterfaceDataset_Asse.qbl                       |   23 
 _Main/BL/Type_ChangeLossSettingExcel/StaticMethod_CheckImport.qbl                                                         |    2 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl                                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_545_bRefresh_OnClick.def              |    2 
 _Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Value.qbl                                                                 |    7 
 _Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl                                                           |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def                               |    3 
 _Main/BL/Type_OfflinePlanImportData/Attribute_ProductID.qbl                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_New.def                                                     |   14 
 _Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanRow_OfflinePlanRow_OfflinePlanCell.qbl                             |    2 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_RowNr.qbl                                                         |    6 
 _Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl                                                     |    3 
 _Main/BL/Type_OfflinePlanColumn/Function_CalcColumnIndex.qbl                                                              |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pHeader.def                                        |   27 
 _Main/BL/Type_ChangeLossSettingExcel/StaticMethod_ExportTemplate.qbl                                                      |    2 
 _Main/BL/Type_OfflinePlanCell/Function_CalcIsQuantity.qbl                                                                 |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader2_sDateFilter_OnUserChanged.def                     |   26 
 _Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_RefreshData.qbl                                                        |   36 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Component_pnlContent.def                          |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelExport#545.def                              |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_MatrixEditor951_480_OnUpdateValue.def               |   28 
 _Main/BL/Type_TransferMinimumQuantity/Attribute_ProductID.qbl                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnOk_OnClick.def                              |   15 
 _Main/BL/Type_OfflinePlanImportData/Attribute_Quantity.qbl                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902#1.def                           |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def                                       |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader.def                                               |   65 -
 _Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_PanelExport_bRefresh_OnClick#57.def        |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_OnOK.def                                                    |   17 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis627/_ROOT_Component_frmStandardAnalysis627.def                         |   16 
 _Main/BL/Type_ChangeLossSettingExcel/StaticMethod_Import.qbl                                                              |    8 
 _Main/BL/Type_EnginePipelineSource/StaticMethod_InitiateSearch.qbl                                                        |   26 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_MatrixEditor951_OnUpdateValue.def                          |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bSaveAsDraft_OnClick.def                      |    8 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductID.qbl                                                     |    6 
 _Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNumber.qbl                                                            |    7 
 _Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl                                                         |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_OnCreated.def                              |    9 
 _Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnName.qbl                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportOperation.def |    2 
 _Main/BL/Relations/Relation_TransferMinimumQuantity_MacroPlan_MacroPlan_TransferMinimumQuantity.qbl                       |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDeductChangeoverLoss_OnClick.def             |    8 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl                                                         |    5 
 _Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl                                                     |    3 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def                                 |    1 
 _Main/BL/Type_OfflinePlanCell/Attribute_IsQuantity.qbl                                                                    |    7 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_Type.qbl                                                          |    6 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl                                                       |   10 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_Type.qbl                                                             |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def                                     |    1 
 _Main/BL/Type_FinancialSalesSource/StaticMethod_InitializeNew.qbl                                                         |  145 +++
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def     |    2 
 _Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnDate.qbl                                                          |    7 
 _Main/BL/Type_OfflinePlanRow/Attribute_Notes.qbl                                                                          |    1 
 _Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetDLFactory.qbl                                                  |   12 
 /dev/null                                                                                                                 |   22 
 _Main/BL/Type_AssemblyOnlinePlanCell0/_ROOT_Type_AssemblyOnlinePlanVersionCell#0.qbl                                      |   10 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductID.qbl                                                        |    7 
 _Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_Cell_AssemblyOnlinePlanVersionCell_.qbl                       |   23 
 _Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductionLine.qbl                                                |    6 
 _Main/BL/Type_FinancialSalesSource/StaticMethod_InitiateSearch.qbl                                                        |   28 
 _Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Quantity.qbl                                                              |    7 
 _Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl                                                         |   86 +
 161 files changed, 2,232 insertions(+), 457 deletions(-)

diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index 84c6052..fa931f1 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -172,7 +172,7 @@
   }
   InfoMessage MP_ChangeLossSettingExcel_Import_PositiveInteger
   {
-    DefaultText: 'The import ChangeLossNr is not positive integer.'
+    DefaultText: 'The import ChangeLossNr is not positive number.'
   }
   InfoMessage MP_ChangeLossSettingExcel_Import_ProductNoExist
   {
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_Cell_AssemblyOnlinePlanVersionCell_.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_Cell_AssemblyOnlinePlanVersionCell_.qbl
new file mode 100644
index 0000000..e92f156
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_Cell_AssemblyOnlinePlanVersionCell_.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanVersionColumn_Cell_AssemblyOnlinePlanVersionCell_Column
+{
+  #keys: '1[415136.0.1174730270]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Cell
+  {
+    #keys: '3[415136.0.1174730272][415136.0.1174730271][415136.0.1174730273]'
+    Cardinality: '1toN'
+    ObjectDefinition: AssemblyOnlinePlanVersionColumn
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Column
+  {
+    #keys: '3[415136.0.1174730275][415136.0.1174730274][415136.0.1174730276]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanVersionCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_InterfaceDataset_InterfaceDataset_A.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_InterfaceDataset_InterfaceDataset_A.qbl
new file mode 100644
index 0000000..5933f11
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionColumn_InterfaceDataset_InterfaceDataset_A.qbl
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanVersionColumn_InterfaceDataset_InterfaceDataset_AssemblyOnlinePlanVersionColumn
+{
+  #keys: '1[415136.0.1176550032]'
+  DeclarativeSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.1176550051][415136.0.1176550045][415136.0.1176550052][415136.0.1176550046][415136.0.1176550053][415136.0.1176550047][415136.0.1176550054][415136.0.1176550048][415136.0.1176550055][415136.0.1176550049][415136.0.1176550056][415136.0.1176550050]'
+    SequenceElementSuffix: 'AssemblyOnlinePlanVersionColumn'
+    SequenceSuffix: 'AssemblyOnlinePlanVersionColumn'
+    SortAttributes:
+    [
+      DeclarativeSequenceRelationSortAttribute
+      {
+        #keys: '1[415136.0.1176550058]'
+        Attribute: 'ColumnDate'
+      }
+    ]
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[415136.0.1176550034][415136.0.1176550033][415136.0.1176550035]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanVersionColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanVersionColumn
+  {
+    #keys: '3[415136.0.1176550037][415136.0.1176550036][415136.0.1176550038]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_Cell_AssemblyOnlinePlanVersionCell_Row.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_Cell_AssemblyOnlinePlanVersionCell_Row.qbl
new file mode 100644
index 0000000..ff699e8
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_Cell_AssemblyOnlinePlanVersionCell_Row.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanVersionRow_Cell_AssemblyOnlinePlanVersionCell_Row
+{
+  #keys: '1[415136.0.1174730181]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Cell
+  {
+    #keys: '3[415136.0.1174730183][415136.0.1174730182][415136.0.1174730184]'
+    Cardinality: '1toN'
+    ObjectDefinition: AssemblyOnlinePlanVersionRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Row
+  {
+    #keys: '3[415136.0.1174730186][415136.0.1174730185][415136.0.1174730187]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanVersionCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_InterfaceDataset_InterfaceDataset_Asse.qbl b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_InterfaceDataset_InterfaceDataset_Asse.qbl
new file mode 100644
index 0000000..7b963fb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_AssemblyOnlinePlanVersionRow_InterfaceDataset_InterfaceDataset_Asse.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation AssemblyOnlinePlanVersionRow_InterfaceDataset_InterfaceDataset_AssemblyOnlinePlanVersionRow
+{
+  #keys: '1[415136.0.1176550018]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[415136.0.1176550020][415136.0.1176550019][415136.0.1176550021]'
+    Cardinality: '0to1'
+    ObjectDefinition: AssemblyOnlinePlanVersionRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide AssemblyOnlinePlanVersionRow
+  {
+    #keys: '3[415136.0.1176550023][415136.0.1176550022][415136.0.1176550024]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanColumn_OfflinePlanColumn_OfflinePlanCell.qbl b/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanColumn_OfflinePlanColumn_OfflinePlanCell.qbl
index 44c130e..1966dbf 100644
--- a/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanColumn_OfflinePlanColumn_OfflinePlanCell.qbl
+++ b/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanColumn_OfflinePlanColumn_OfflinePlanCell.qbl
@@ -18,6 +18,6 @@
     #keys: '3[413988.0.1296697094][413988.0.1296697093][413988.0.1296697095]'
     Cardinality: '1toN'
     ObjectDefinition: OfflinePlanColumn
-    OwningSide: 'Owned'
+    OwningSide: 'Reference'
   }
 }
diff --git a/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanRow_OfflinePlanRow_OfflinePlanCell.qbl b/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanRow_OfflinePlanRow_OfflinePlanCell.qbl
index dfd7e00..68171d0 100644
--- a/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanRow_OfflinePlanRow_OfflinePlanCell.qbl
+++ b/_Main/BL/Relations/Relation_OfflinePlanCell_OfflinePlanRow_OfflinePlanRow_OfflinePlanCell.qbl
@@ -18,6 +18,6 @@
     #keys: '3[413988.0.1296697107][413988.0.1296697106][413988.0.1296697108]'
     Cardinality: '1toN'
     ObjectDefinition: OfflinePlanRow
-    OwningSide: 'Reference'
+    OwningSide: 'Owned'
   }
 }
diff --git a/_Main/BL/Relations/Relation_OfflinePlanImportData_MacroPlan_MacroPlan_OfflinePlanImportData.qbl b/_Main/BL/Relations/Relation_OfflinePlanImportData_MacroPlan_MacroPlan_OfflinePlanImportData.qbl
new file mode 100644
index 0000000..1c92a84
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OfflinePlanImportData_MacroPlan_MacroPlan_OfflinePlanImportData.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OfflinePlanImportData_MacroPlan_MacroPlan_OfflinePlanImportData
+{
+  #keys: '1[413988.0.1558681405]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1558681407][413988.0.1558681406][413988.0.1558681408]'
+    Cardinality: '0to1'
+    ObjectDefinition: OfflinePlanImportData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OfflinePlanImportData
+  {
+    #keys: '3[413988.0.1558681410][413988.0.1558681409][413988.0.1558681411]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_TransferMinimumQuantity_MacroPlan_MacroPlan_TransferMinimumQuantity.qbl b/_Main/BL/Relations/Relation_TransferMinimumQuantity_MacroPlan_MacroPlan_TransferMinimumQuantity.qbl
new file mode 100644
index 0000000..17a5fbe
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TransferMinimumQuantity_MacroPlan_MacroPlan_TransferMinimumQuantity.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TransferMinimumQuantity_MacroPlan_MacroPlan_TransferMinimumQuantity
+{
+  #keys: '1[413988.0.1584313394]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1584313396][413988.0.1584313395][413988.0.1584313397]'
+    Cardinality: '0to1'
+    ObjectDefinition: TransferMinimumQuantity
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TransferMinimumQuantity
+  {
+    #keys: '3[413988.0.1584313399][413988.0.1584313398][413988.0.1584313400]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl
index 457a74f..df7f2c7 100644
--- a/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell/StaticMethod_RefreshData.qbl
@@ -11,7 +11,9 @@
     macroPlan.AssemblyOnlinePlanColumn( relflush );
     
     // 鎵捐閰嶇嚎琛�
-    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = "DL-MoMo" or tempOPR.ProductionLine() = "CC-MoMo", tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, 
+                             tempOPR.ProductionLine() = "DL MoMo" or tempOPR.ProductionLine() = "CC MoMo" or tempOPR.ProductionLine() = "DL ZKM", 
+                             tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
     opcs := selectsortedset( opt, OfflinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
     
     // 鐢熸垚琛ㄦ牸
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_InventoryWeight.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_InventoryWeight.qbl
new file mode 100644
index 0000000..a536175
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_InventoryWeight.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InventoryWeight
+{
+  #keys: '3[415136.0.1174730142][415136.0.1174730141][415136.0.1174730143]'
+  Description: '鍓╀綑搴撳瓨 - 鏈�灏忓簱瀛�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_ProductionSerialNumber.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_ProductionSerialNumber.qbl
new file mode 100644
index 0000000..839fa49
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_ProductionSerialNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionSerialNumber
+{
+  #keys: '3[415136.0.1174730145][415136.0.1174730144][415136.0.1174730146]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Quantity.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Quantity.qbl
new file mode 100644
index 0000000..bfb6bf5
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[415136.0.1174730148][415136.0.1174730147][415136.0.1174730149]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Shift.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Shift.qbl
new file mode 100644
index 0000000..b9b6d77
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Shift.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Shift
+{
+  #keys: '3[415136.0.1174730151][415136.0.1174730150][415136.0.1174730152]'
+  Description: '鐝'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Value.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Value.qbl
new file mode 100644
index 0000000..ef0e9df
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[415136.0.1174730154][415136.0.1174730153][415136.0.1174730155]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Shift.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Shift.qbl
new file mode 100644
index 0000000..b925fd8
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Shift.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Shift
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Value.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Value.qbl
new file mode 100644
index 0000000..913414b
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/DefaultValue_Value.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Value
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_Download.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_Download.qbl
new file mode 100644
index 0000000..3fc9100
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_Download.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    opcs := selectsortedset( macroPlan, AssemblyOnlinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
+    oprs := selectsortedset( macroPlan, AssemblyOnlinePlanRow, tempOPR, true, tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    traverse ( opcs, Elements, opc ) {
+      column := xmlDOM.CreateElement( "column" );
+      name   := xmlDOM.CreateElement( "name" );
+      type   := xmlDOM.CreateElement( "type" );
+      name.TextContent( ifexpr( opc.ColumnDate() < macroPlan.StartOfPlanning().Date(), "", opc.ColumnDate().Format( "Y/M2/D2" ) ) );
+      type.TextContent( "String" );
+      column.AppendChild( name );
+      column.AppendChild( type );
+      
+      traverse ( oprs, Elements, opr ) {
+        c    := select( opc, AssemblyOnlinePlanCell, tempOPC, tempOPC.AssemblyOnlinePlanRow() = opr );
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", guard( c.Value(), "" ) );
+        column.AppendChild( cell );
+      }
+      
+      tableElement.AppendChild( column );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_RefreshData.qbl b/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_RefreshData.qbl
new file mode 100644
index 0000000..457a74f
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanCell0/StaticMethod_RefreshData.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod RefreshData (
+  MacroPlan macroPlan,
+  OfflinePlanTable opt
+)
+{
+  TextBody:
+  [*
+    macroPlan.AssemblyOnlinePlanRow( relflush );
+    macroPlan.AssemblyOnlinePlanColumn( relflush );
+    
+    // 鎵捐閰嶇嚎琛�
+    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = "DL-MoMo" or tempOPR.ProductionLine() = "CC-MoMo", tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    opcs := selectsortedset( opt, OfflinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
+    
+    // 鐢熸垚琛ㄦ牸
+    traverse ( opcs, Elements, opc ) {
+      aopc := macroPlan.AssemblyOnlinePlanColumn( relnew, ColumnDate := opc.ColumnDate(), ColumnIndex := opc.ColumnIndex() );
+      traverse ( oprs, Elements, opr ) {
+        aopr := select( macroPlan, AssemblyOnlinePlanRow, tempAOPR, tempAOPR.ProductID() = opr.ProductID() and tempAOPR.ProductionLine() = opr.ProductionLine() and tempAOPR.Type() = opr.Type() );
+        if ( isnull( aopr ) ) {
+          aopr := macroPlan.AssemblyOnlinePlanRow( relnew, ProductID := opr.ProductID(), ProductionLine := opr.ProductionLine(), Type := opr.Type() );
+        }
+        
+        cellOPC := select( opr, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanColumn() = opc );
+        if ( not isnull( cellOPC ) ) {
+          cellAOPC := aopc.AssemblyOnlinePlanCell( relnew, Value := cellOPC.Value() );
+          cellAOPC.AssemblyOnlinePlanRow( relset, aopr );
+        }
+      }
+    }
+    
+    // 澶勭悊鏃ュ巻浜嬩欢
+  *]
+}
diff --git "a/_Main/BL/Type_AssemblyOnlinePlanCell0/_ROOT_Type_AssemblyOnlinePlanVersionCell\0430.qbl" "b/_Main/BL/Type_AssemblyOnlinePlanCell0/_ROOT_Type_AssemblyOnlinePlanVersionCell\0430.qbl"
new file mode 100644
index 0000000..e6e9c7a
--- /dev/null
+++ "b/_Main/BL/Type_AssemblyOnlinePlanCell0/_ROOT_Type_AssemblyOnlinePlanVersionCell\0430.qbl"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanVersionCell
+{
+  #keys: '5[415136.0.1174730139][415136.0.1174730137][0.0.0][415136.0.1174730138][415136.0.1174730140]'
+  BaseType: Object
+  Description: '瑁呴厤涓婄嚎璁″垝鐗堟湰'
+  StructuredName: 'AssemblyOnlinePlanVersionCells'
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnDate.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnDate.qbl
new file mode 100644
index 0000000..b0847b4
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnDate
+{
+  #keys: '3[415136.0.1174730129][415136.0.1174730128][415136.0.1174730130]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnIndex.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnIndex.qbl
new file mode 100644
index 0000000..e898d87
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnIndex
+{
+  #keys: '3[415136.0.1174730132][415136.0.1174730131][415136.0.1174730133]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnName.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnName.qbl
new file mode 100644
index 0000000..da7556e
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn0/Attribute_ColumnName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnName
+{
+  #keys: '3[415136.0.1174730135][415136.0.1174730134][415136.0.1174730136]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanColumn0/DefaultValue_ColumnName.qbl b/_Main/BL/Type_AssemblyOnlinePlanColumn0/DefaultValue_ColumnName.qbl
new file mode 100644
index 0000000..2ba9476
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanColumn0/DefaultValue_ColumnName.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ColumnName
+}
diff --git "a/_Main/BL/Type_AssemblyOnlinePlanColumn0/_ROOT_Type_AssemblyOnlinePlanVersionColumn\0430.qbl" "b/_Main/BL/Type_AssemblyOnlinePlanColumn0/_ROOT_Type_AssemblyOnlinePlanVersionColumn\0430.qbl"
new file mode 100644
index 0000000..022a9c2
--- /dev/null
+++ "b/_Main/BL/Type_AssemblyOnlinePlanColumn0/_ROOT_Type_AssemblyOnlinePlanVersionColumn\0430.qbl"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanVersionColumn
+{
+  #keys: '5[415136.0.1174730126][415136.0.1174730124][0.0.0][415136.0.1174730125][415136.0.1174730127]'
+  BaseType: Object
+  Description: '瑁呴厤涓婄嚎璁″垝鐗堟湰'
+  StructuredName: 'AssemblyOnlinePlanVersionColumns'
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductID.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductID.qbl
new file mode 100644
index 0000000..0435960
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[415136.0.1174730079][415136.0.1174730078][415136.0.1174730080]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductionLine.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductionLine.qbl
new file mode 100644
index 0000000..688eed9
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_ProductionLine.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionLine
+{
+  #keys: '3[415136.0.1174730082][415136.0.1174730081][415136.0.1174730083]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_RowNr.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..1eb0d1c
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.1174730085][415136.0.1174730084][415136.0.1174730086]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_Type.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_Type.qbl
new file mode 100644
index 0000000..128135c
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/Attribute_Type.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Type
+{
+  #keys: '3[415136.0.1174730088][415136.0.1174730087][415136.0.1174730089]'
+  Description:
+  [*
+    浜х嚎鍚嶈    锛�0
+    Quantity琛岋細1
+    Order琛�     锛�2
+    鍚堣琛�        锛�3
+    鐝琛�        锛�4
+  *]
+  ValueType: String
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductID.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductID.qbl
new file mode 100644
index 0000000..98649b2
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductID
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductionLine.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductionLine.qbl
new file mode 100644
index 0000000..c59ec43
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_ProductionLine.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ProductionLine
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_RowNr.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_RowNr.qbl
new file mode 100644
index 0000000..a05f652
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_RowNr.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: RowNr
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_Type.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_Type.qbl
new file mode 100644
index 0000000..fd112e9
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/DefaultValue_Type.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Type
+}
diff --git a/_Main/BL/Type_AssemblyOnlinePlanVersionRow/_ROOT_Type_AssemblyOnlinePlanVersionRow.qbl b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/_ROOT_Type_AssemblyOnlinePlanVersionRow.qbl
new file mode 100644
index 0000000..232548b
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlinePlanVersionRow/_ROOT_Type_AssemblyOnlinePlanVersionRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type AssemblyOnlinePlanVersionRow
+{
+  #keys: '5[415136.0.1174730076][415136.0.1174730074][0.0.0][415136.0.1174730075][415136.0.1174730077]'
+  BaseType: Object
+  Description: '瑁呴厤涓婄嚎璁″垝鐗堟湰'
+  StructuredName: 'AssemblyOnlinePlanVersionRows'
+}
diff --git a/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLZKM.qbl b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLZKM.qbl
new file mode 100644
index 0000000..cf7b59f
--- /dev/null
+++ b/_Main/BL/Type_AssemblyOnlineQuantity/Attribute_DLZKM.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLZKM
+{
+  #keys: '3[415754.0.315331249][415754.0.315331248][415754.0.315331250]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_GetCCFactory.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_GetCCFactory.qbl
new file mode 100644
index 0000000..6e57ba1
--- /dev/null
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_GetCCFactory.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetCCFactory () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬宸ュ巶';
+    //return 'VWED CC';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_Initialize.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_Initialize.qbl
index 1fadf1f..25ae29f 100644
--- a/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_Initialize.qbl
@@ -11,6 +11,7 @@
     produtparent              := CCEngineLogisticsCostReport::GetDefaultProductParent();
     name                      := CCEngineLogisticsCostReport::GetDefaultName();
     allunit                   := CCEngineLogisticsCostReport::GetDefaultAllUnit();
+    ccfactory                 := CCEngineLogisticsCostReport::GetCCFactory();
     ccunit                    := CCEngineLogisticsCostReport::GetDefaultCCUnit();
     ccline                    := CCEngineLogisticsCostReport::GetStockingPointCCLine();
     ccrent                    := CCEngineLogisticsCostReport::GetStockingPointCCRent();
@@ -36,7 +37,7 @@
             //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
             enginecosts       := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = ccunit );
+                                                 and engine.Factory() = ccfactory );//ccunit
             if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
               ccrow           := table.GetRow( row.Name() );
               products.Add( product );
@@ -66,7 +67,7 @@
             //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
             enginecosts       := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = ccunit );
+                                                 and engine.Factory() = ccfactory );
             if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
               ccrow           := table.GetRow( row.Name() );
               products.Add( product );
@@ -110,7 +111,7 @@
                 //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
                 enginecost     := selectobject( enginecosts, Elements, engine, engine.Generation().ToLower() = product.Generation().ToLower()
                                                    and engine.MLB_MQB() = product.MQBMLB()
-                                                   and engine.Factory() = ccunit );
+                                                   and engine.Factory() = ccfactory );
                 //鍦ㄨ繍杈撴垚鏈弬鏁拌〃閲屾壘鍒板彂鍔ㄦ満瀵瑰簲杩愯緭鍗曚环鍜岃杞藉閲�
                 transcost      := selectobject( transcosts, Elements, trans, trans.Origin() = ccline 
                                                   and trans.Destination() = ccrent 
@@ -143,7 +144,7 @@
             //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
             enginecosts        := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = ccunit );
+                                                 and engine.Factory() = ccfactory );
             if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
               row              := table.GetRow( pisp.ProductID() );
               products.Add( product );
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..a6cdcd8
--- /dev/null
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as CCEngineLogisticsCostReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    allunit                   := DLEngineLogisticsCostReport::GetDefaultAllUnit();
+    search                    := owner.CCEngineLogisticsCostSearch();
+    if( isnull( search ) ){
+      owner.CCEngineLogisticsCostSearch( relnew, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    }else{
+      search                  := owner.CCEngineLogisticsCostSearch();
+      search.Generation( allunit );
+      search.MqbMlb( allunit );
+      search.Power( allunit );
+    }
+    table := selectobject( owner, CCEngineLogisticsCostReport, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetCCFactory.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetCCFactory.qbl
new file mode 100644
index 0000000..6e57ba1
--- /dev/null
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetCCFactory.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetCCFactory () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬宸ュ巶';
+    //return 'VWED CC';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetDLFactory.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetDLFactory.qbl
new file mode 100644
index 0000000..16d53c9
--- /dev/null
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_GetDLFactory.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDLFactory () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛宸ュ巶';
+    //return 'VWED DL';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitializeNew.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitializeNew.qbl
index c37810c..90133e3 100644
--- a/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitializeNew.qbl
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitializeNew.qbl
@@ -13,9 +13,11 @@
     allunit                   := DLEngineLogisticsCostReport::GetDefaultAllUnit();
     ccunit                    := DLEngineLogisticsCostReport::GetDefaultCCUnit();
     dlunit                    := DLEngineLogisticsCostReport::GetDefaultDLUnit();
+    ccfactory                 := DLEngineLogisticsCostReport::GetCCFactory();
+    dlfactory                 := DLEngineLogisticsCostReport::GetDLFactory();
     //dlline                    := DLEngineLogisticsCostReport::GetStockingPointDLLine();
-    ccrent                    := DLEngineLogisticsCostReport::GetStockingPointCCRent();
-    dlrent                    := DLEngineLogisticsCostReport::GetStockingPointCCRent();
+    //ccrent                    := DLEngineLogisticsCostReport::GetStockingPointCCRent();
+    //dlrent                    := DLEngineLogisticsCostReport::GetStockingPointCCRent();
     
     startofplanning           := owner.StartOfPlanning().Date();
     //startofyear               := startofplanning.StartOfYear();
@@ -28,14 +30,74 @@
     products                  := construct( Product_MPs );
     
     table.GenerateColumn( owner );
+    //澶栫搴撲粨鍌ㄨ垂鐢細浠撳偍鏁伴噺/鍖呰瀹归噺*浠撳偍鍗曚环锛屽湪Actual inventories閲屽彇鍒伴暱鏄ュ绉熷簱/澶ц繛澶栫搴撹鍙戝姩鏈虹殑浠撳偍閲忥紝鏍规嵁鍙戝姩鏈哄彿鎵惧埌瀵瑰簲鐨凣eneration 鍜屾í绾靛埗锛屽湪鍙戝姩鏈烘垚鏈弬鏁拌〃閲屾壘鍒板搴旂殑浠撳偍鍗曚环鍜屽寘瑁呭閲忥紝鐢ㄥ叕寮忚绠楋紝鏈堝害杩涜姹囨��
+    //闀挎槬澶栫搴撳叆搴�/鍑哄簱璐圭敤锛屽ぇ杩炲彂鍔ㄦ満鐨勯暱鏄ュ绉熷簱鐨凬ew supply
+    traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID().EndsWith( '澶栫搴�' ) ){
+    //  unit                    := stockingpoint.Unit();
+    //  parentunits             := unit.GetAllParent();
+      //鏄惁灞炰簬闀挎槬澶栫搴�
+      isccrent                := stockingpoint.ID().StartsWith( '闀挎槬' ) or stockingpoint.ID().StartsWith( 'CC' );
+      //鏄惁灞炰簬澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�
+      isdltoccrent            := stockingpoint.ID().StartsWith( '澶ц繛鍙戝姩鏈虹殑闀挎槬' );
+      //鏄惁灞炰簬澶ц繛澶栫搴�
+      isdlrent                := stockingpoint.ID().StartsWith( '澶ц繛' ) or stockingpoint.ID().StartsWith( 'DL' );
+      if( isccrent or isdlrent ){
+        traverse( stockingpoint, ProductInStockingPoint_MP, pisp,  pisp.Product_MP().IsLeaf() 
+                  and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear and pispip.NewSupplyQuantity() <> 0 ) ){
+          //鑾峰彇琛�
+          product             := pisp.Product_MP();
+          productparents      := product.GetAllParent();
+          if( exists( productparents, Elements, e, e.ID() = produtparent ) ){//鏌ヨ浜у搧绫诲瀷鏄彂鍔ㄦ満
+            row               := table.GetRow( pisp.ProductID() );
+            enginecosts       := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() and engine.MLB_MQB() = product.MQBMLB() );
+            if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
+              products.Add( pisp.Product_MP() );
+              traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear and pispip.NewSupplyQuantity() <> 0  ){
+                periodtime    := pispip.Start().StartOfMonth().Date();
+                periodname    := periodtime.Format( "M2/D2/Y" );
+                column        := selectobject( table, Column, column, column.Name() = periodname and column.StartDate() = periodtime );
+                cell          := selectobject( row, Cell, cell, cell.Column() = column );
+                
+                if( isccrent or isdltoccrent){
+                  //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
+                  enginecost  := selectobject( enginecosts, Elements, engine, engine.StartDate() <= pispip.Start().Date() and engine.EndDate() >= pispip.Start().Date()
+                                                     and engine.Factory() = ccfactory );
+                   if( not isnull( enginecost ) ){
+                     quantity :=   [Number]pispip.NewSupplyQuantity();
+                     if( isccrent ){
+                       cost        := ceil( quantity / enginecost.PackagingCapacity() ) * enginecost.StoragePrice();//鍥涜垗浜斿叆
+                       cell.CCRentStorCost( cell.CCRentStorCost() + cost );
+                     }else{
+                       cell.CCRentQuantity( cell.CCRentQuantity() + quantity );
+                       //闀挎槬澶栫搴撳叆搴撹垂鐢細鍏ュ簱閲�/鍖呰瀹归噺*鍏ュ簱鍗曚环
+                       entercost  := ceil( quantity / enginecost.PackagingCapacity() ) * enginecost.WarehousingPrice();
+                       //闀挎槬澶栫搴撳嚭搴撹垂鐢�: 鍑哄簱閲�/鍖呰瀹归噺*鍑哄簱鍗曚环
+                       outcost    := ceil( quantity / enginecost.PackagingCapacity() ) * enginecost.WarehousingPrice();
+                       cell.CCRentInCost( cell.CCRentInCost() + entercost );
+                       cell.CCRentOutOfCost( cell.CCRentOutOfCost() + outcost );
+                     }
+                   }
+                } else {
+                  //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
+                  enginecost     := selectobject( enginecosts, Elements, engine, engine.StartDate() <= pispip.Start().Date() and engine.EndDate() >= pispip.Start().Date()
+                                                     and engine.Factory() = dlfactory  );
+                   if( not isnull( enginecost ) ){
+                     cost        := ceil( [Number]pispip.NewSupplyQuantity() / enginecost.PackagingCapacity() ) * enginecost.StoragePrice();//鍥涜垗浜斿叆
+                     cell.DLRentStorCost( cell.DLRentStorCost() + cost );
+                   }
+                }
+              }   
+            }
+          }
+        }
+      }
+    }
     //鍦� trip plan閲屾壘鍒板ぇ杩炶閰嶇嚎杈瑰簱鍒板ぇ杩炲绉熷簱鐨勮繍杈撴暟閲�//澶ц繛鍘傚唴搴撳埌澶栫搴�
     traverse( owner, Unit.Lane.LaneLeg, laneleg ){
       //璧峰搴撳瓨鐐规槸鍚︽槸澶ц繛瑁呴厤绾胯竟搴�
-    //  originsp               := selectobject( owner, StockingPoint_MP, sp, sp.ID() = laneleg.OriginStockingPointID() );
-      isdlspline             := laneleg.OriginStockingPointID().EndsWith( '鍘傚唴搴�' ) and ( laneleg.OriginStockingPointID().StartsWith( '澶ц繛' ) or laneleg.OriginStockingPointID().StartsWith( 'DL' ) );//table.IsInUnit( originsp, dlline );
+      isdlspline             := laneleg.OriginStockingPointID().EndsWith( '鍘傚唴搴�' ) and ( laneleg.OriginStockingPointID().StartsWith( '澶ц繛' ) or laneleg.OriginStockingPointID().StartsWith( 'DL' ) );
       //鐩殑鍦版槸鍚︽槸澶ц繛澶栫搴�
-    //  destisp                := selectobject( owner, StockingPoint_MP, sp, sp.ID() = laneleg.DestinationStockingPointID() );
-      isdlrent               := laneleg.DestinationStockingPointID().EndsWith( '澶栫搴�' ) and ( laneleg.DestinationStockingPointID().StartsWith( '澶ц繛' ) or laneleg.DestinationStockingPointID().StartsWith( 'DL' ) );//table.IsInUnit( destisp, dlrent );
+      isdlrent               := laneleg.DestinationStockingPointID().EndsWith( '澶栫搴�' ) and ( laneleg.DestinationStockingPointID().StartsWith( '澶ц繛' ) or laneleg.DestinationStockingPointID().StartsWith( 'DL' ) );
       if( isdlspline and isdlrent ){
         traverse( laneleg, Trip, trip, trip.Departure().Date() < startofnextyear ){//鐢变簬闇�瑕佽�冭檻浜у搧杩愯緭lead time锛屾瘡涓湀鐨勬眹鎬绘暟鎹渶瑕佹帹杩熶袱澶╄繘琛岃绠�
           periodtime         := trip.Departure().StartOfMonth().Date();
@@ -54,7 +116,7 @@
               //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
               enginecost     := selectobject( enginecosts, Elements, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                    and engine.MLB_MQB() = product.MQBMLB()
-                                                   and engine.Factory() = dlunit  );
+                                                   and engine.Factory() = dlfactory  );
               //鍦ㄨ繍杈撴垚鏈弬鏁拌〃閲屾壘鍒板彂鍔ㄦ満瀵瑰簲杩愯緭鍗曚环鍜岃杞藉閲�
               transcost      := selectobject( transcosts, Elements, trans, trans.Origin() = laneleg.OriginStockingPointID() 
                                                   and trans.Destination() = laneleg.DestinationStockingPointID() 
@@ -66,29 +128,12 @@
                 cost         := ceil( ceil( quantity / enginecost.PackagingCapacity() ) / transcost.LoadingCapacity() ) * transcost.TransportPrice();//鍥涜垗浜斿叆
                 cell.WerkToDLRentTransCost( cell.WerkToDLRentTransCost() + cost );
               }
-    //          if( isccrent ){//鐩殑鍦版槸闀挎槬澶栫搴�
-    //            //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
-    //            enginecost   := selectobject( enginecosts, Elements, engine, engine.Generation().ToLower() = product.Generation().ToLower()
-    //                                               and engine.MLB_MQB() = product.MQBMLB()
-    //                                               and engine.Factory() = ccunit );
-    //            if( not isnull( enginecost ) ){
-    //              products.Add( product );
-    //              cell       := selectobject( row, Cell, cell, cell.Column() = column );
-    //              cell.CCRentQuantity( cell.CCRentQuantity() + quantity );
-    //              //闀挎槬澶栫搴撳叆搴撹垂鐢細鍏ュ簱閲�/鍖呰瀹归噺*鍏ュ簱鍗曚环
-    //              entercost  := ceil( quantity / enginecost.PackagingCapacity() ) * enginecost.WarehousingPrice();
-    //              //闀挎槬澶栫搴撳嚭搴撹垂鐢�: 鍑哄簱閲�/鍖呰瀹归噺*鍑哄簱鍗曚环
-    //              outcost    := ceil( quantity / enginecost.PackagingCapacity() ) * enginecost.WarehousingPrice();
-    //              cell.CCRentEnterCost( cell.CCRentEnterCost() + entercost );
-    //              cell.CCRentOutCost( cell.CCRentOutCost() + outcost );
-    //            }
-    //          }
             }
           }
         }
       }
     }
-    //澶ц繛澶栫搴撳叆搴撹垂鐢細鍏ュ簱閲�/鍖呰瀹归噺*鍏ュ簱鍗曚环锛屽叆搴撻噺绛変簬澶ц繛宸ュ巶璇ヤ骇鍝佷骇閲忓噺鍘诲彂寰�闀挎槬鐨勬暟閲�-newSupply
+    //澶ц繛澶栫搴撳叆搴撹垂鐢細鍏ュ簱閲�/鍖呰瀹归噺*鍏ュ簱鍗曚环锛屽叆搴撻噺绛変簬澶ц繛宸ュ巶璇ヤ骇鍝佷骇閲忓噺鍘诲彂寰�闀挎槬(澶ц繛鐨勯暱鏄ュ绉熷簱锛夌殑鏁伴噺-newSupply
     traverse( owner, FinancialProductionSource, source, not source.IsImport() ){//璐㈠姟浜ч噺鎶ヨ〃闈炲鍏�
       traverse( source, FinancialProductionReport, report, not report.IsShow() ){//璐㈠姟浜ч噺鎶ヨ〃涓嶆樉绀�
         traverse( report, FinancialProductionRow, row, row.Unit() = dlunit and exists( row, FinancialProductionCell, cell, cell.Value() <> '0' and cell.FinancialProductionColumn().IsDay() ) ){//璐㈠姟浜ч噺鎶ヨ〃閲岀殑澶ц繛浜ч噺, 涓嶄负0
@@ -98,7 +143,7 @@
             //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
             enginecosts      := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = dlunit );
+                                                 and engine.Factory() = dlfactory );
             if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
               products.Add( product );
               ccrow          := table.GetRow( row.Name() );
@@ -126,7 +171,7 @@
             //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
             enginecosts      := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = dlunit );
+                                                 and engine.Factory() = dlfactory );
             if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
               products.Add( product );
               ccrow          := table.GetRow( row.Name() );
@@ -149,17 +194,15 @@
       product                 := selectobject( owner, Product_MP, product, product.ID() = tprow.ProductID() );
       productparents          := product.GetAllParent();
       if( exists( productparents, Elements, e, e.ID() = produtparent ) ){//鏌ヨ浜у搧绫诲瀷鏄彂鍔ㄦ満
-        //璧峰搴撳瓨鐐规槸鍚︽槸澶ц繛
-        originsp               := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.SourceStockpoingPointID() );
-        isdl                   := table.IsInUnit( originsp, dlunit );
-        //鐩殑鍦板簱瀛樼偣鏄惁鏄暱鏄�
-        destisp                := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.TargetStockpoingPointID() );
-        iscc                   := table.IsInUnit( destisp, ccunit );
+        //璧峰搴撳瓨鐐规槸鍚︽槸澶ц繛(澶ц繛鍘傚唴搴擄級
+        isdl                   := tprow.SourceStockpoingPointID().EndsWith( '鍘傚唴搴�' ) and ( tprow.TargetStockpoingPointID().StartsWith( '澶ц繛' ) or tprow.TargetStockpoingPointID().StartsWith( 'DL' ) );
+        //鐩殑鍦板簱瀛樼偣鏄惁鏄暱鏄ワ紙闀挎槬澶栫搴擄級
+        iscc                   := tprow.TargetStockpoingPointID().EndsWith( '澶栫搴�' ) and ( tprow.TargetStockpoingPointID().StartsWith( '闀挎槬' ) or tprow.TargetStockpoingPointID().StartsWith( 'CC' ) );
         if( isdl and iscc ){
           //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
           enginecosts          := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = ccunit );
+                                                 and engine.Factory() = ccfactory );
           //鍦ㄨ繍杈撴垚鏈弬鏁拌〃閲屾壘鍒板彂鍔ㄦ満瀵瑰簲杩愯緭鍗曚环鍜岃杞藉閲�
           transcosts           := selectset( owner, LogisticsCostTransport, trans, trans.Origin() = tprow.SourceStockpoingPointID() 
                                                   and trans.Destination() = tprow.TargetStockpoingPointID() 
@@ -190,7 +233,7 @@
       salessegment            := forecast.SalesSegment_MP();
       parentsalessegments     := salessegment.GetAllParent();
       //鏄惁灞炰簬闀挎槬
-      iscc                    := salessegment.Name() = ccunit or exists( parentsalessegments, Elements, psalessegment, psalessegment.Name() = ccunit );
+      iscc                    := salessegment.Name().StartsWith( 'Changechun' ) or exists( parentsalessegments, Elements, psalessegment, psalessegment.Name().StartsWith( 'Changechun' ) );
       if( iscc ){
         product               := forecast.Product_MP();
         productparents        := product.GetAllParent();
@@ -198,7 +241,7 @@
           //鏌ヨ瀵瑰簲鐨勫彂鍔ㄦ満鎴愭湰
           enginecosts         := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() 
                                                  and engine.MLB_MQB() = product.MQBMLB()
-                                                 and engine.Factory() = ccunit );
+                                                 and engine.Factory() = ccfactory );
           if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
             products.Add( forecast.Product_MP() );
             row               := table.GetRow( forecast.ProductID() );
@@ -219,54 +262,7 @@
         }
       }
     }
-    //澶栫搴撲粨鍌ㄨ垂鐢細浠撳偍鏁伴噺/鍖呰瀹归噺*浠撳偍鍗曚环锛屽湪Actual inventories閲屽彇鍒伴暱鏄ュ绉熷簱/澶ц繛澶栫搴撹鍙戝姩鏈虹殑浠撳偍閲忥紝鏍规嵁鍙戝姩鏈哄彿鎵惧埌瀵瑰簲鐨凣eneration 鍜屾í绾靛埗锛屽湪鍙戝姩鏈烘垚鏈弬鏁拌〃閲屾壘鍒板搴旂殑浠撳偍鍗曚环鍜屽寘瑁呭閲忥紝鐢ㄥ叕寮忚绠楋紝鏈堝害杩涜姹囨��
-    traverse( owner, StockingPoint_MP, stockingpoint ){
-      unit                    := stockingpoint.Unit();
-      parentunits             := unit.GetAllParent();
-      //鏄惁灞炰簬闀挎槬澶栫搴�
-      isccrent                := stockingpoint.ID() = ccrent or unit.ID() = ccrent or exists( parentunits, Elements, punit, punit.ID() = ccrent );
-      //鏄惁灞炰簬澶ц繛澶栫搴�
-      isdlrent                := stockingpoint.ID() = dlrent or unit.ID() = dlrent or exists( parentunits, Elements, punit, punit.ID() = dlrent );
-      if( isccrent or isdlrent ){
-        traverse( stockingpoint, ProductInStockingPoint_MP, pisp,  pisp.Product_MP().IsLeaf() 
-                  and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear and pispip.NewSupplyQuantity() <> 0 ) ){
-          //鑾峰彇琛�
-          product             := pisp.Product_MP();
-          productparents      := product.GetAllParent();
-          if( exists( productparents, Elements, e, e.ID() = produtparent ) ){//鏌ヨ浜у搧绫诲瀷鏄彂鍔ㄦ満
-            row               := table.GetRow( pisp.ProductID() );
-            enginecosts       := selectset( owner, LogisticsCostEngine, engine, engine.Generation().ToLower() = product.Generation().ToLower() and engine.MLB_MQB() = product.MQBMLB() );
-            if( not isnull( enginecosts ) and enginecosts.Size() > 0 ){
-              products.Add( pisp.Product_MP() );
-              traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear and pispip.NewSupplyQuantity() <> 0  ){
-                periodtime    := pispip.Start().StartOfMonth().Date();
-                periodname    := periodtime.Format( "M2/D2/Y" );
-                column        := selectobject( table, Column, column, column.Name() = periodname and column.StartDate() = periodtime );
-                cell          := selectobject( row, Cell, cell, cell.Column() = column );
-                
-                if( isccrent ){
-                  //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
-                  enginecost     := selectobject( enginecosts, Elements, engine, engine.StartDate() <= pispip.Start().Date() and engine.EndDate() >= pispip.Start().Date()
-                                                     and engine.Factory() = ccunit );
-                   if( not isnull( enginecost ) ){
-                     cost        := ceil( [Number]pispip.NewSupplyQuantity() / enginecost.PackagingCapacity() ) * enginecost.StoragePrice();//鍥涜垗浜斿叆
-                     cell.CCRentStorCost( cell.CCRentStorCost() + cost );
-                   }
-                } else {
-                  //鍦ㄥ彂鍔ㄦ満鎴愭湰鍙傛暟琛ㄦ壘鍒板搴旂殑鍖呰瀹归噺
-                  enginecost     := selectobject( enginecosts, Elements, engine, engine.StartDate() <= pispip.Start().Date() and engine.EndDate() >= pispip.Start().Date()
-                                                     and engine.Factory() = dlunit  );
-                   if( not isnull( enginecost ) ){
-                     cost        := ceil( [Number]pispip.NewSupplyQuantity() / enginecost.PackagingCapacity() ) * enginecost.StoragePrice();//鍥涜垗浜斿叆
-                     cell.DLRentStorCost( cell.DLRentStorCost() + cost );
-                   }
-                }
-              }   
-            }
-          }
-        }
-      }
-    }
+    
     rows := selectsortedset( table, Row, row, row.Name() );
     i    := 0;
     traverse( rows, Elements, e ){
diff --git a/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..997f6ba
--- /dev/null
+++ b/_Main/BL/Type_CCEngineLogisticsCostReport0/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as DLEngineLogisticsCostReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    allunit                   := DLEngineLogisticsCostReport::GetDefaultAllUnit();
+    search                    := owner.DLEngineLogisticsCostSearch();
+    if( isnull( search ) ){
+      owner.DLEngineLogisticsCostSearch( relnew, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    }else{
+      search                  := owner.DLEngineLogisticsCostSearch();
+      search.Generation( allunit );
+      search.MqbMlb( allunit );
+      search.Power( allunit );
+    }
+    table                     := selectobject( owner, DLEngineLogisticsCostReport, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNr.qbl b/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNr.qbl
deleted file mode 100644
index 3632e29..0000000
--- a/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNr.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute ChangeLossNr
-{
-  #keys: '3[415136.0.738030098][415136.0.738030097][415136.0.738030099]'
-  Description: '鎹㈠瀷鎹熷け锛堝彴锛�'
-  ValueType: Number
-}
diff --git a/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNumber.qbl b/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNumber.qbl
new file mode 100644
index 0000000..f110070
--- /dev/null
+++ b/_Main/BL/Type_ChangeLossSetting/Attribute_ChangeLossNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ChangeLossNumber
+{
+  #keys: '3[415136.0.1176550071][415136.0.1176550070][415136.0.1176550072]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ChangeLossSetting/StaticMethod_ValidateInput.qbl b/_Main/BL/Type_ChangeLossSetting/StaticMethod_ValidateInput.qbl
index 6980d92..ebd5300 100644
--- a/_Main/BL/Type_ChangeLossSetting/StaticMethod_ValidateInput.qbl
+++ b/_Main/BL/Type_ChangeLossSetting/StaticMethod_ValidateInput.qbl
@@ -9,15 +9,17 @@
   Product_MP product2,
   Date startdate,
   Date enddate,
-  Number number
+  String number
 ) as Boolean
 {
   TextBody:
   [*
     // 鐢勫叞楦� Jun-5-2024 (created)
     feedback := '';
-    
-    if( isnull( unit ) or isnull( product1 ) or isnull( product2 ) or number < 1 ){
+    if( [Number]number < 0 ){
+      feedback := Translations::MP_ChangeLossSettingExcel_Import_PositiveInteger();
+    }
+    if( isnull( unit ) or isnull( product1 ) or isnull( product2 ) or [Number]number = 0 ){
       feedback := Translations::MP_ChangeLossSetting_CheckNull();
     }
     if( product1 = product2 ){
diff --git a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_CheckImport.qbl b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_CheckImport.qbl
index de86c3f..7acf689 100644
--- a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_CheckImport.qbl
+++ b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_CheckImport.qbl
@@ -16,7 +16,7 @@
       error( Translations::MP_ChangeLossSettingExcel_Import_NullInputRequiredField() );
     }
     //瀵煎叆鐨勬暟閲忓皬浜�0
-    if( exists( macroplan, ChangeLossSettingExcel, excel, [Real]excel.ChangeLossNumber() > 0 and ceil( [Real]excel.ChangeLossNumber() ) <> floor( [Real]excel.ChangeLossNumber() ) ) ){
+    if( exists( macroplan, ChangeLossSettingExcel, excel, [Real]excel.ChangeLossNumber() <= 0 ) ){
       error( Translations::MP_ChangeLossSettingExcel_Import_PositiveInteger() );
     }
     //瀵煎叆浜у搧鏄惁瀛樺湪
diff --git a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_ExportTemplate.qbl b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_ExportTemplate.qbl
index eb73c40..22f4c62 100644
--- a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_ExportTemplate.qbl
+++ b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_ExportTemplate.qbl
@@ -9,7 +9,7 @@
   [*
     // 鐢勫叞楦� Aug-22-2024 (created)
     traverse( macroplan, ChangeLossSetting, cls ){
-      macroplan.ChangeLossSettingExcel( relnew, Product1 := cls.ProductFirst().ID(), Product2 := cls.ProductSecond().ID(), Unit := cls.Unit().ID(), ChangeLossNumber := [String]cls.ChangeLossNr(), StartDate := cls.StartDate(), EndDate := cls.EndDate() );
+      macroplan.ChangeLossSettingExcel( relnew, Product1 := cls.ProductFirst().ID(), Product2 := cls.ProductSecond().ID(), Unit := cls.Unit().ID(), ChangeLossNumber := [String]cls.ChangeLossNumber(), StartDate := cls.StartDate(), EndDate := cls.EndDate() );
     }
     value := macroplan.MP_ExportChangeLossSettingsBroker().ExecuteToXLS( isxlsxformat ).AsBinaryValue();
     macroplan.ChangeLossSettingExcel( relflush );
diff --git a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_Import.qbl b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_Import.qbl
index 2e8db80..7332ee9 100644
--- a/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_Import.qbl
+++ b/_Main/BL/Type_ChangeLossSettingExcel/StaticMethod_Import.qbl
@@ -28,13 +28,14 @@
                                           and cls.Unit().ID() = excel.Unit()
                                           and cls.StartDate() = excel.StartDate()
                                           and cls.EndDate() = excel.EndDate() );
+      info( excel.ChangeLossNumber() );
       if( isnull( cls ) ){
         product1        := selectobject( macroplan, Product_MP, product, product.ID() = excel.Product1() );
         product2        := selectobject( macroplan, Product_MP, product, product.ID() = excel.Product2() );
         unit            := selectobject( macroplan, Unit, unit, unit.ID() = excel.Unit() );
         feedback        := '';
-        if( ChangeLossSetting::ValidateInput( feedback, macroplan, null( ChangeLossSetting ), unit, product1, product2, excel.StartDate(), excel.EndDate(), [Number]excel.ChangeLossNumber() ) ){
-          cls             := macroplan.ChangeLossSetting( relnew, ChangeLossNr := [Number]excel.ChangeLossNumber() );
+        if( ChangeLossSetting::ValidateInput( feedback, macroplan, null( ChangeLossSetting ), unit, product1, product2, excel.StartDate(), excel.EndDate(), excel.ChangeLossNumber() ) ){
+          cls             := macroplan.ChangeLossSetting( relnew, ChangeLossNumber := [Real]excel.ChangeLossNumber() );
           
           cls.ProductFirst( relset, product1 );
           cls.ProductSecond( relset, product2 );
@@ -47,8 +48,9 @@
           error( feedback );
         }
       }else {
-        cls.ChangeLossNr( [Number]excel.ChangeLossNumber() );
+        cls.ChangeLossNumber( [Real]excel.ChangeLossNumber() );
       }
+      info( '-------------------', cls.ChangeLossNumber() );
       excel.Delete();
     }
   *]
diff --git a/_Main/BL/Type_EnginePipelineSource/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_EnginePipelineSource/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..2c3837f
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as EnginePipelineReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    search                    := owner.EnginePipelineSearch();
+    if( isnull( search ) ){
+      owner.EnginePipelineSearch( relnew, StartDate := Date::MinDate(), EndDate := Date::MaxDate(), TimeUnit := Translations::MP_GlobalParameters_Day() );
+    }else{
+      search                  := owner.EnginePipelineSearch();
+      search.TimeUnit( Translations::MP_GlobalParameters_Day() );
+      search.StartDate( Date::MinDate() );
+      search.EndDate( Date::MaxDate() );
+    }
+    table                     := selectobject( owner, EnginePipelineSource.Report, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_FinancialProductionCell/Attribute_Quantity.qbl b/_Main/BL/Type_FinancialProductionCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..a34b687
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionCell/Attribute_Quantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[415136.0.1167140019][415136.0.1167140018][415136.0.1167140020]'
+  Description: '鏁伴噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl b/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl
index c7c7b0d..45e40f0 100644
--- a/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl
+++ b/_Main/BL/Type_FinancialProductionReport/Method_Generate.qbl
@@ -29,16 +29,22 @@
           
           sumcell  := selectobject( column, FinancialProductionCell, c, c.FinancialProductionRow() = sumrow );
           if( isnull( sumcell ) ){
-            sumcell := column.FinancialProductionCell( relnew, Value := '0' );
+            sumcell := column.FinancialProductionCell( relnew, Quantity := 0 );
             sumrow.FinancialProductionCell( relinsert, sumcell );
           }
           
-          showcell := column.FinancialProductionCell( relnew, Value := cell.Value() );
+          showcell := column.FinancialProductionCell( relnew, Quantity := cell.Quantity() );
           showrow.FinancialProductionCell( relinsert, showcell );
-          value := [Real]cell.Value() + [Real]sumcell.Value();
-          sumcell.Value( [String]value );
+    //      value := [Real]cell.Value() + [Real]sumcell.Value();
+          sumcell.Quantity( sumcell.Quantity() + cell.Quantity() );
         }
       }
     }
+    
+    traverse( this, FinancialProductionRow, row ){
+      traverse( row, FinancialProductionCell, cell ){
+        cell.Value( [String]([Number]cell.Quantity()) );
+      }
+    }
   *]
 }
diff --git "a/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl" "b/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl"
index 9f6d003..bdd6e85 100644
--- "a/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl"
+++ "b/_Main/BL/Type_FinancialProductionRow/Method_Initialize\043110.qbl"
@@ -10,7 +10,7 @@
   TextBody:
   [*
     // 鐢勫叞楦� Jun-24-2024 (created)
-    cell := column.FinancialProductionCell( relnew, Value := '' );
+    cell := column.FinancialProductionCell( relnew, Quantity := 0 );
     
     this.FinancialProductionCell( relinsert, cell );
     if( unit <> FinancialProductionReport::GetDefaultAllUnit() ){
diff --git a/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl b/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl
index da223ae..e2695ab 100644
--- a/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl
+++ b/_Main/BL/Type_FinancialProductionRow/Method_Initialize.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 Method Initialize (
   FinancialProductionColumn column,
-  Number quantity
+  Real quantity
 )
 {
   TextBody:
@@ -10,7 +10,8 @@
     // 鐢勫叞楦� Jun-24-2024 (created)
     cell := selectobject( this, FinancialProductionCell, cell, cell.FinancialProductionColumn() = column );
           
-    value := [Number]cell.Value() + quantity;
-    cell.Value( [String]value );
+    //value := [Number]cell.Value() + quantity;
+    //cell.Value( [String]value );
+    cell.Quantity( cell.Quantity() + quantity );
   *]
 }
diff --git a/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl b/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl
index 3d1ed85..bb784f2 100644
--- a/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/Method_AfterImport.qbl
@@ -28,11 +28,13 @@
           allcell  := selectobject( allrow, FinancialProductionCell, allcell, allcell.FinancialProductionColumn().Name() = column.Name() );
     //      info( isnull( unitcell ), isnull( allcell ), cell.Value(), unitcell.Value(), allcell.Value() );
           if( not isnull( unitcell ) ){
-            unitcell.Value( cell.Value() );
+    //        unitcell.Value( cell.Value() );
+            unitcell.Quantity( [Real]cell.Value() );
           }
           if( not isnull( allcell ) ){
-            value := [Real]cell.Value() + [Real]allcell.Value();
-            allcell.Value( [String]value );
+    //        value := [Real]cell.Value() + [Real]allcell.Value();
+    //        allcell.Value( [String]value );
+            allcell.Quantity( allcell.Quantity() + [Real]allcell.Value() );
           }
         }
       }
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
index 87f56b0..ed8f090 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
@@ -33,7 +33,8 @@
     
     tableElement.AppendChild( productcolumnelement ); 
     tableElement.AppendChild( unitcolumnelement ); 
-    traverse ( table, FinancialProductionColumn, column ) {
+    minindex        := min( table, FinancialProductionColumn, column, not column.IsDay(), column.Index() );
+    traverse ( table, FinancialProductionColumn, column, not column.IsDay() ) {
       columnelement := xmlDOM.CreateElement( "column" );
       nameelement   := xmlDOM.CreateElement( "name" );
       typeelement   := xmlDOM.CreateElement( "type" );
@@ -45,7 +46,7 @@
       cells := selectsortedset( column, FinancialProductionCell, cell, cell.FinancialProductionRow().RowNr() );
     
       traverse ( cells, Elements, c ) {
-        if( column.Index() = 0 ){
+        if( column.Index() = minindex ){
           row := c.FinancialProductionRow();
           //Product
           productcellElement := xmlDOM.CreateElement( "cell" );
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl
index dec7ca1..0aa4ae5 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Initialize.qbl
@@ -36,7 +36,7 @@
     table.GenerateColumn( owner );
     //鍙栧綋鍓嶇増鏈殑product planning閲宯ew supply瀛楁锛屽垎澶ц繛鍜岄暱鏄ュ伐鍘傜殑浜х嚎锛岃繘琛屽姞鎬�
     //traverse( owner, StockingPoint_MP, stockingpoint ){
-    traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) ){
+    traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) or stockingpoint.ID() = '澶ц繛澶栫搴�' ){
       iscc                    := stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID().StartsWith( '闀挎槬' );
       isdl                    := stockingpoint.ID().StartsWith( 'DL' ) or stockingpoint.ID().StartsWith( '澶ц繛' );
     //  unit                    := stockingpoint.Unit();
@@ -59,12 +59,12 @@
             dayperiodname     := dayperiodtime.Format( "M2/D2/Y" );
             periodtime        := pispip.Start().StartOfMonth().Date();
             periodname        := periodtime.Format( "M2/D2/Y" );
-            quantity          := [Number]pispip.NewSupplyQuantity();//鍥涜垗浜斿叆
+    //        quantity          := [Number]pispip.NewSupplyQuantity();//鍥涜垗浜斿叆
             daycolumn         := selectobject( table, FinancialProductionColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
             column            := selectobject( table, FinancialProductionColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
-            factoryrow.Initialize( daycolumn, quantity );
-            factoryrow.Initialize( column, quantity );
-            allrow.Initialize( column, quantity );
+            factoryrow.Initialize( daycolumn, pispip.NewSupplyQuantity() );
+            factoryrow.Initialize( column, pispip.NewSupplyQuantity() );
+            allrow.Initialize( column, pispip.NewSupplyQuantity() );
           }    
         }
       }
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..748afbf
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as FinancialProductionReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    allunit                   := FinancialProductionReport::GetDefaultAllUnit();
+    search                    := owner.FinancialProductionSearch();
+    if( isnull( owner.FinancialProductionSearch() ) ){
+      owner.FinancialProductionSearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    }else{
+      search                  := owner.FinancialProductionSearch();
+      search.Unit( allunit );
+      search.Generation( allunit );
+      search.MqbMlb( allunit );
+      search.Power( allunit );
+    }
+    table                     := selectobject( owner, FinancialProductionSource.FinancialProductionReport, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
index 6fe5b7f..fcbd81e 100644
--- a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
@@ -33,7 +33,8 @@
     
     tableElement.AppendChild( productcolumnelement ); 
     tableElement.AppendChild( unitcolumnelement ); 
-    traverse ( table, FinancialSalesColumn, column ) {
+    minindex        := min( table, FinancialSalesColumn, column, not column.IsDay(), column.Index() );
+    traverse ( table, FinancialSalesColumn, column, not column.IsDay() ) {
       columnelement := xmlDOM.CreateElement( "column" );
       nameelement   := xmlDOM.CreateElement( "name" );
       typeelement   := xmlDOM.CreateElement( "type" );
@@ -45,7 +46,7 @@
       cells := selectsortedset( column, FinancialSalesCell, cell, cell.FinancialSalesRow().RowNr() );
     
       traverse ( cells, Elements, c ) {
-        if( column.Index() = 0 ){
+        if( column.Index() = minindex ){
           row := c.FinancialSalesRow();
           //Product
           productcellElement := xmlDOM.CreateElement( "cell" );
diff --git a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl
index d2b2932..8677d00 100644
--- a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl
@@ -83,27 +83,29 @@
       //鏄惁灞炰簬闀挎槬瑁呴厤绾�
     //  iscc                  := unit.ID() = ccspline or exists( parentunits, Elements, punit, punit.ID() = ccspline );
     //  if( table.IsInUnit( stockingpoint, ccspline ) ){
-        traverse( stockingpoint, ProductInStockingPoint_MP, pisp, pisp.Product_MP().IsLeaf() and pisp.Product_MP().MQBMLB() = 'MQB' 
+        traverse( stockingpoint, ProductInStockingPoint_MP, pisp, pisp.Product_MP().IsLeaf()
                   and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear 
                               and ( pispip.DependentDemandAndSalesDemandQuantity() <> 0 or pispip.NewSupplyQuantity() <> 0 ) ) ){//浜у搧涓篗QB
           product           := pisp.Product_MP();
           allrow            := table.GetRow( allunit, product );
-          ccrow             := table.GetRow( ccunit, product );
-          products.Add( product );
-          traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() 
-                    and pispip.Period_MP().StartDate() < startofnextyear 
-                    and ( pispip.DependentDemandAndSalesDemandQuantity() <> 0 or pispip.NewSupplyQuantity() <> 0 ) ){
-            dayperiodtime   := pispip.Start().Date();
-            dayperiodname   := dayperiodtime.Format( "M2/D2/Y" );
-            periodtime      := pispip.Start().StartOfMonth().Date();
-            periodname      := periodtime.Format( "M2/D2/Y" );
-            daycolumn       := selectobject( table, FinancialSalesColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
-            column          := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
-            quantity        := ifexpr( isdl, [Number]pispip.NewSupplyQuantity(), [Number]pispip.DependentDemandAndSalesDemandQuantity() );//鍥涜垗浜斿叆
-            
-            ccrow.Initialize( column, quantity );//鍙朤otal Demand瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
-            ccrow.Initialize( daycolumn, quantity );
-            allrow.Initialize( column, quantity );
+          if( isdl or pisp.Product_MP().MQBMLB() = 'MQB' ){
+            factoryrow      := table.GetRow( ifexpr( isdl, dlunit, ccunit ), product );
+            products.Add( product );
+            traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() 
+                      and pispip.Period_MP().StartDate() < startofnextyear 
+                      and ( pispip.DependentDemandAndSalesDemandQuantity() <> 0 or pispip.NewSupplyQuantity() <> 0 ) ){
+              dayperiodtime := pispip.Start().Date();
+              dayperiodname := dayperiodtime.Format( "M2/D2/Y" );
+              periodtime    := pispip.Start().StartOfMonth().Date();
+              periodname    := periodtime.Format( "M2/D2/Y" );
+              daycolumn     := selectobject( table, FinancialSalesColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
+              column        := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
+              quantity      := ifexpr( isdl, [Number]pispip.NewSupplyQuantity(), [Number]pispip.DependentDemandAndSalesDemandQuantity() );//鍥涜垗浜斿叆
+              
+              factoryrow.Initialize( column, quantity );//鍙朤otal Demand瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
+              factoryrow.Initialize( daycolumn, quantity );
+              allrow.Initialize( column, quantity );
+            }
           }
         }
     //  }
diff --git a/_Main/BL/Type_FinancialSalesSource/StaticMethod_InitializeNew.qbl b/_Main/BL/Type_FinancialSalesSource/StaticMethod_InitializeNew.qbl
new file mode 100644
index 0000000..bfd4632
--- /dev/null
+++ b/_Main/BL/Type_FinancialSalesSource/StaticMethod_InitializeNew.qbl
@@ -0,0 +1,145 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializeNew (
+  MacroPlan owner
+)
+{
+  Description: '鍒濆鍖�'
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    owner.FinancialSalesSource( relflush );
+    products                  := construct( Product_MPs );
+    allunit                   := FinancialSalesReport::GetDefaultAllUnit();
+    ccunit                    := FinancialSalesReport::GetDefaultCCUnit();
+    dlunit                    := FinancialSalesReport::GetDefaultDLUnit();
+    ccsalessegment            := FinancialSalesReport::GetSalesSegmentCC();
+    tjsalessegment            := FinancialSalesReport::GetSalesSegmentTJ();
+    fssalessegment            := FinancialSalesReport::GetSalesSegmentFS();
+    //ccspline                  := FinancialSalesReport::GetStockingPointCCLine();
+    //dlspline                  := FinancialSalesReport::GetStockingPointDLLine();
+    //ccrent                    := FinancialSalesReport::GetStockingPointCCRent();
+    
+    source                    := owner.FinancialSalesSource( relnew, IsImport := false, Name := FinancialSalesReport::GetDefaultName() );
+    table                     := source.FinancialSalesReport( relnew, ID := source.Name(), Name := source.Name(), IsImport := false );
+    showtable                 := source.FinancialSalesReport( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsImport := false, IsShow := true );
+    startofplanning           := owner.StartOfPlanning().Date();
+    //startofyear               := startofplanning.StartOfYear();
+    startofnextyear           := startofplanning.StartOfNextYear();
+    
+    search                    := owner.FinancialSalesSearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    
+    table.GenerateColumn( owner );
+    
+    //棣栧厛鍦╢orecast鐣岄潰鏌ユ壘sales segment涓洪暱鏄ョ殑鎵�鏈夐渶姹傦紝璇嗗埆鍑篗LB鐨勬墍鏈変骇鍝侊紝姣忎釜浜у搧鎸夋湀姹囨�婚渶姹傛暟閲�
+    traverse( owner, SalesDemand.astype( Forecast ), forecast, not isnull( forecast.SalesSegment_MP() ) and forecast.StartDate() < startofnextyear and forecast.Quantity() <> 0 
+              and exists( forecast, PlanningSalesDemandInPeriod, psdip, psdip.Quantity() <> 0 ) ){
+      salessegment            := forecast.SalesSegment_MP();
+      parentsalessegments     := salessegment.GetAllParent();
+      stockingpoint           := forecast.StockingPointID();
+      product                 := forecast.Product_MP();
+      //鏄惁灞炰簬闀挎槬
+      iscc                    := salessegment.Name().StartsWith( ccsalessegment ) or exists( parentsalessegments, Elements, psalessegment, psalessegment.Name().StartsWith( ccsalessegment ) );
+      isccrent                := iscc and stockingpoint.EndsWith( '澶栫搴�' ) and ( stockingpoint.StartsWith( 'CC' ) or stockingpoint.StartsWith( '闀挎槬' ) );
+      isdl                    := salessegment.Name().StartsWith( tjsalessegment ) or salessegment.Name().StartsWith( fssalessegment )
+                                  or exists( parentsalessegments, Elements, psalessegment, psalessegment.Name().StartsWith( tjsalessegment ) ) 
+                                  or exists( parentsalessegments, Elements, psalessegment, psalessegment.Name().StartsWith( fssalessegment ) );
+      //Forecast鐨凷ales Segment涓洪暱鏄ワ紝璇嗗埆鍑篗LB鐨勬墍鏈変骇鍝佹眹鎬�
+      //澶ц繛璐㈠姟閿�閲忥細棣栧厛鍦╢orecast鐣岄潰鏌ユ壘Sales Segment鏄ぉ娲ュ拰浣涘北鐨勬墍鏈夐渶姹傦紝姣忎釜浜у搧鎸夋湀姹囨�婚渶姹傛暟閲� and forecast.Product_MP().MQBMLB() = 'MLB' ) 
+      if( ( iscc and product.MQBMLB() = 'MLB' ) or ( isccrent and product.MQBMLB() = 'MQB' ) or isdl ){
+        
+        //鑾峰彇鍚堣琛�
+        allrow               := table.GetRow( allunit, product );
+        //鑾峰彇宸ュ巶琛�
+        factoryrow           := table.GetRow( ifexpr( isdl, dlunit, ccunit ), product );
+      
+        products.Add( product );
+        traverse( forecast, PlanningSalesDemandInPeriod, psdip, psdip.Quantity() <> 0 ){
+          dayperiodtime      := psdip.StartDate();
+          dayperiodname      := dayperiodtime.Format( "M2/D2/Y" );
+          periodtime         := psdip.StartDate().StartOfMonth();
+          periodname         := periodtime.Format( "M2/D2/Y" );
+    //      info( '-------------------------', periodname, periodtime );
+          daycolumn          := selectobject( table, FinancialSalesColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
+          column             := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
+    //      info( '-------------------------', column.Name() );
+          quantity   := [Number]psdip.Quantity();//鍥涜垗浜斿叆
+          
+          factoryrow.Initialize( column, quantity );
+          factoryrow.Initialize( daycolumn, quantity );
+          allrow.Initialize( column, quantity );
+        }
+      }
+    }
+    //浠嶱roduct planning鏌ユ壘搴撳瓨鐐逛负澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴擄紝鍙朜ew supply瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
+    traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID() = '澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�' ){
+        traverse( stockingpoint, ProductInStockingPoint_MP, pisp, pisp.Product_MP().IsLeaf()
+                  and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().StartDate() < startofnextyear 
+                              and ( pispip.DependentDemandAndSalesDemandQuantity() <> 0 or pispip.NewSupplyQuantity() <> 0 ) ) ){//浜у搧涓篗QB
+          product           := pisp.Product_MP();
+          allrow            := table.GetRow( allunit, product );
+          factoryrow        := table.GetRow( dlunit, product );
+          products.Add( product );
+          traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() 
+                    and pispip.Period_MP().StartDate() < startofnextyear 
+                    and ( pispip.DependentDemandAndSalesDemandQuantity() <> 0 or pispip.NewSupplyQuantity() <> 0 ) ){
+            dayperiodtime   := pispip.Start().Date();
+            dayperiodname   := dayperiodtime.Format( "M2/D2/Y" );
+            periodtime      := pispip.Start().StartOfMonth().Date();
+            periodname      := periodtime.Format( "M2/D2/Y" );
+            daycolumn       := selectobject( table, FinancialSalesColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
+            column          := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
+            quantity        := [Number]pispip.NewSupplyQuantity();//鍥涜垗浜斿叆
+            
+            factoryrow.Initialize( column, quantity );//鍙朤otal Demand瀛楁鎸夋湀姹囨�婚渶姹傛暟閲�
+            factoryrow.Initialize( daycolumn, quantity );
+            allrow.Initialize( column, quantity );
+          }
+        }
+    //  }
+    }
+    //startofnextyearlead       := startofplanning.StartOfNextYear() + FinancialSalesReport::GetDefaultTripLeadingTime();
+    //澶ц繛璐㈠姟閿�閲忥細闀挎槬鐨勯渶姹傞渶瑕佸湪trip plan閲岄潰鎵惧埌璧峰搴撳瓨鐐逛负澶ц繛瑁呴厤绾胯竟搴擄紝鐩殑鍦颁负闀挎槬澶栫搴撶殑浜у搧锛岀敱浜庨渶瑕佽�冭檻浜у搧杩愯緭lead time锛屾瘡涓湀鐨勬眹鎬绘暟鎹渶瑕佹帹杩熶袱澶╄繘琛岃绠�
+    //traverse( owner, Unit.Lane.LaneLeg, laneleg ){
+    //  //璧峰搴撳瓨鐐规槸鍚︽槸澶ц繛瑁呴厤绾胯竟搴�
+    //  originsp              := selectobject( owner, StockingPoint_MP, sp, sp.ID() = laneleg.OriginStockingPointID() );
+    //  isdlspline            := table.IsInUnit( originsp, dlspline );
+    //  //鐩殑鍦版槸鍚︽槸闀挎槬澶栫搴�
+    //  destisp               := selectobject( owner, StockingPoint_MP, sp, sp.ID() = laneleg.DestinationStockingPointID() );
+    //  isccrent              := table.IsInUnit( destisp, ccrent );
+    //  if( isdlspline and isccrent ){
+    //    traverse( laneleg, Trip, trip, trip.Arrival() < startofnextyearlead and exists( trip, ProductInTrip, pit, pit.Quantity() <> 0 ) ){
+    ////      periodtime        := ( trip.Arrival() - FinancialSalesReport::GetDefaultTripLeadingTime() ).StartOfMonth().Date();
+    //      dayperiodtime     := trip.Departure().Date();
+    //      dayperiodname     := dayperiodtime.Format( "M2/D2/Y" );
+    //      periodtime        := trip.Departure().StartOfMonth().Date();
+    //      periodname        := periodtime.Format( "M2/D2/Y" );
+    //      
+    //      daycolumn         := selectobject( table, FinancialSalesColumn, column, column.Name() = dayperiodname and column.Period() = dayperiodtime and column.IsDay() );
+    //      column            := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime and not column.IsDay() );
+    //      if( not isnull( column ) ){
+    //        traverse( trip, ProductInTrip, pit, pit.Quantity() <> 0 ){
+    //          product       := pit.Product_MP();
+    //          products.Add( product );
+    //          quantity      := [Number]pit.Quantity();//鍥涜垗浜斿叆
+    //          dlrow         := table.GetRow( dlunit, pit.Product_MP() );
+    //          dlrow.Initialize( column, quantity );//姹囨�绘暟閲�
+    //          dlrow.Initialize( daycolumn, quantity );
+    //          
+    //          allrow        := table.GetRow( allunit, pit.Product_MP() );
+    //          allrow.Initialize( column, quantity );
+    //        }
+    //      }
+    //    }
+    //  }
+    //}
+    
+    rows := selectsortedset( table, FinancialSalesRow, 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_FinancialSalesSource/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_FinancialSalesSource/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..eeff011
--- /dev/null
+++ b/_Main/BL/Type_FinancialSalesSource/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as FinancialSalesReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    allunit                   := FinancialSalesReport::GetDefaultAllUnit();
+    search                    := owner.FinancialSalesSearch();
+    if( isnull( search ) ){
+      owner.FinancialSalesSearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit );
+    }else{
+      search                  := owner.FinancialSalesSearch();
+      search.Unit( allunit );
+      search.Generation( allunit );
+      search.MqbMlb( allunit );
+      search.Power( allunit );
+    }
+    table                     := selectobject( owner, FinancialSalesSource.FinancialSalesReport, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl
index 7bf8369..eda6e70 100644
--- a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl
+++ b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -5,7 +5,8 @@
   TextBody:
   [*
     // 鐢勫叞楦� Jun-28-2024 (created)
-    return '闀挎槬宸ュ巶';
+    //return '闀挎槬宸ュ巶';
+    return 'VWED CC';
     //return 'Assembly Plant (France)';
   *]
 }
diff --git a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl
index 781dc80..bdc2b39 100644
--- a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl
+++ b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -5,7 +5,8 @@
   TextBody:
   [*
     // 鐢勫叞楦� Jun-28-2024 (created)
-    return '澶ц繛宸ュ巶';
+    //return '澶ц繛宸ュ巶';
+    return 'VWED DL';
     //return 'Assembly Plant (Spain)';
   *]
 }
diff --git a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl
index dcd3b98..ba8dd8d 100644
--- a/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl
@@ -44,38 +44,38 @@
     ccsvaluecumulant          := [Real]0;
     
     traverse( table, FinancialWeeklyColumn, column ){
-      productioncolumn      := selectobject( productiontable, FinancialProductionColumn, pcolumn, pcolumn.Name() = column.Name() and pcolumn.Period() = column.Period() );
-      salescolumn           := selectobject( salestable, FinancialSalesColumn, scolumn, scolumn.Name() = column.Name() and scolumn.Period() = column.Period() );
+      productioncolumn      := selectobject( productiontable, FinancialProductionColumn, pcolumn, pcolumn.Name() = column.Name() and pcolumn.Period() = column.Period() and not pcolumn.IsDay() );
+      salescolumn           := selectobject( salestable, FinancialSalesColumn, scolumn, scolumn.Name() = column.Name() and scolumn.Period() = column.Period() and not scolumn.IsDay() );
       
       //浜ч噺姹囨��
       totalpvalue           := [Real]0;
       dlpvalue              := [Real]0;
       ccpvalue              := [Real]0;
-      traverse( productioncolumn, FinancialProductionCell, cell, [Real]cell.Value() > 0 ){
+      traverse( productioncolumn, FinancialProductionCell, cell, cell.Quantity() > 0 ){
         unit                := cell.FinancialProductionRow().Unit();
         
         if( unit = allunit ){
-          totalpvalue       := totalpvalue + [Real]cell.Value();
+          totalpvalue       := totalpvalue + cell.Quantity();
           if( column.Period() = startofplanning.StartOfMonth().Date() ){
             totalpvaluecumulant := totalpvaluecumulant - cell.PlanValue();
           }
         }else if( unit = dlunit ){
-          dlpvalue          := dlpvalue + [Real]cell.Value();
+          dlpvalue          := dlpvalue + cell.Quantity();
           if( column.Period() = startofplanning.StartOfMonth().Date() ){
             dlpvaluecumulant := dlpvaluecumulant - cell.PlanValue();
           }
         }else if( unit = ccunit ){
-          ccpvalue          := ccpvalue + [Real]cell.Value();
+          ccpvalue          := ccpvalue + cell.Quantity();
           if( column.Period() = startofplanning.StartOfMonth().Date() ){
             ccpvaluecumulant := ccpvaluecumulant - cell.PlanValue();
           }
         }
       }
-      totalpcell            := column.FinancialWeeklyCell( relnew, Value := [String]totalpvalue );
+      totalpcell            := column.FinancialWeeklyCell( relnew, Value := [String]( [Number]totalpvalue ) );
       totalproduction.FinancialWeeklyCell( relinsert, totalpcell );
-      dlpcell               := column.FinancialWeeklyCell( relnew, Value := [String]dlpvalue );
+      dlpcell               := column.FinancialWeeklyCell( relnew, Value := [String]( [Number]dlpvalue ) );
       dlproduction.FinancialWeeklyCell( relinsert, dlpcell );
-      ccpcell               := column.FinancialWeeklyCell( relnew, Value := [String]ccpvalue );
+      ccpcell               := column.FinancialWeeklyCell( relnew, Value := [String]( [Number]ccpvalue ) );
       ccproduction.FinancialWeeklyCell( relinsert, ccpcell );
       
       //閿�閲忔眹鎬�
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
index 5bdd2d7..ec32de3 100644
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
@@ -26,17 +26,17 @@
     startofyear               := startofplanning.StartOfYear();
     startofnextyear           := startofplanning.StartOfNextYear();
     
-    search                    := owner.InventorySummarySearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit, StartDate := Date::MinDate(), EndDate := Date::MaxDate() );
+    search                    := owner.InventorySummarySearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit, Category := Translations::MP_GlobalParameters_Day(), StartDate := Date::MinDate(), EndDate := Date::MaxDate() );
     
     table.GenerateColumn( owner, 'All', startofyear, startofnextyear );
     //info( '-----------------------------------', table.InventorySummaryColumn( relsize ) );
     //搴撳瓨鏁伴噺涓篈ctual inventories閲岄潰鐨勭偣Planned inventories瀛楁搴撳瓨閲忓姞鎬�
-    //traverse( owner, StockingPoint_MP, stockingpoint ){
-    traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) ){
+    traverse( owner, StockingPoint_MP, stockingpoint ){
+    //traverse( owner, StockingPoint_MP, stockingpoint, stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) ){
     //  unit                    := stockingpoint.Unit();
     //  parentunits             := unit.GetAllParent();
       //鏄惁灞炰簬闀挎槬宸ュ巶
-      iscc                    := stockingpoint.ID().StartsWith( 'CC' );//unit.ID() = ccalineunit or unit.ID() = ccmplineunit or exists( parentunits, Elements, punit, punit.ID() = ccalineunit or punit.ID() = ccmplineunit );
+      iscc                    := stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID() = '闀挎槬' ;//unit.ID() = ccalineunit or unit.ID() = ccmplineunit or exists( parentunits, Elements, punit, punit.ID() = ccalineunit or punit.ID() = ccmplineunit );
     //  iscc                    := stockingpoint.ID().StartsWith( 'CC' ) or unit.ID().StartsWith( 'CC' ) or exists( parentunits, Elements, punit, punit.ID().StartsWith( 'CC' ) );
       //鏄惁灞炰簬澶ц繛宸ュ巶
       isdl                    := stockingpoint.ID().StartsWith( '澶ц繛' );//unit.ID() = dlalienunit or unit.ID() = dlmplineunit  or exists( parentunits, Elements, punit, punit.ID() = dlalienunit or punit.ID() = dlmplineunit );
@@ -59,6 +59,7 @@
                                                   and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day(), pispip.Start() );
     
           traverse( pispips, Elements, pispip ){
+            products.Add( pisp.Product_MP() );
             period            := pispip.Period_MP();
             periodtime        := period.Start().Date();
             periodname        := periodtime.Format( "M2/D2/Y" );
@@ -150,7 +151,7 @@
       if( exists( e, InventorySummaryCell, cell, cell.AverageInventory() <> 0 or cell.EndingInventory() <> 0 or cell.MaximumInventory() <> 0 or cell.MinimumInventory() <> 0 ) ){
         e.RowNr( i );
         i := i + 1;
-      }{
+      }else{
         e.Delete();
       }
     }
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..4003115
--- /dev/null
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as InventorySummaryReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    allunit                   := InventorySummaryReport::GetDefaultAllUnit();
+    search                    := owner.InventorySummarySearch();
+    if( isnull( search ) ){
+      owner.InventorySummarySearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit, Category := Translations::MP_GlobalParameters_Day(), StartDate := Date::MinDate(), EndDate := Date::MaxDate() );
+    }else{
+      search                  := owner.InventorySummarySearch();
+      search.Unit( allunit );
+      search.Generation( allunit );
+      search.MqbMlb( allunit );
+      search.Power( allunit );
+      search.Category( Translations::MP_GlobalParameters_Day() );
+      search.StartDate( Date::MinDate() );
+      search.EndDate( Date::MaxDate() );
+    }
+    table                     := selectobject( owner, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl
index de5f0d3..ca7ed85 100644
--- a/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl
@@ -9,8 +9,8 @@
     // 鐢勫叞楦� Jun-24-2024 (created)
     owner.FinancialProductionSource( relflush );
     productparent             := MachiningPipelineReport::GetDefaultProductParent();
-    ccunit                    := MachiningPipelineReport::GetDefaultCCUnit();
-    dlunit                    := MachiningPipelineReport::GetDefaultDLUnit();
+    //ccunit                    := MachiningPipelineReport::GetDefaultCCUnit();
+    //dlunit                    := MachiningPipelineReport::GetDefaultDLUnit();
     //allunit                   := EnginePipelineReport::GetDefaultAllUnit();
     source                    := owner.MachiningPipelineSource( relnew, Name := MachiningPipelineReport::GetDefaultName() );
     table                     := source.Report( relnew, ID := source.Name(), Name := source.Name() );
@@ -32,19 +32,21 @@
       //鏄惁灞炰簬澶ц繛宸ュ巶
       isdl                    := stockingpoint.ID().StartsWith( 'DL' ) or unit.ID().StartsWith( 'DL' ) or exists( parentunits, Elements, punit, punit.ID().StartsWith( 'DL' ) );//unit.ID() = dlunit or exists( parentunits, Elements, punit, punit.ID() = dlunit );
       //鏄惁灞炰簬闀挎槬瑁呴厤绾緾C鍘傚唴搴�
-      isccassemnly            := stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) and ( stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID().StartsWith( '闀挎槬' ) );//unit.ID() = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() );
+    //  isccassemnly            := stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) and ( stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID().StartsWith( '闀挎槬' ) );//unit.ID() = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() );
       //鏄惁灞炰簬澶ц繛瑁呴厤绾緿L鍘傚唴搴�
-      isdlassemnly            := stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) and ( stockingpoint.ID().StartsWith( 'DL' ) or stockingpoint.ID().StartsWith( '澶ц繛' ) );//unit.ID() = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() );
+    //  isdlassemnly            := stockingpoint.ID().EndsWith( '鍘傚唴搴�' ) and ( stockingpoint.ID().StartsWith( 'DL' ) or stockingpoint.ID().StartsWith( '澶ц繛' ) );//unit.ID() = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() );
       //鏄惁灞炰簬闀挎槬鏈哄姞浜х嚎
       isccproduction          := stockingpoint.ID().EndsWith( '绾胯竟搴�' ) and ( stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID().StartsWith( '闀挎槬' ) );//unit.ID() = MachiningPipelineReport::GetDefaultCCProductionUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultCCProductionUnit() );
       //鏄惁灞炰簬澶ц繛鏈哄姞浜х嚎
       isdlproduction          := unit.ID().EndsWith( 'MoMo' ) and unit.ID().StartsWith( 'DL' );//unit.ID() = MachiningPipelineReport::GetDefaultDLProductionUnit() or exists( parentunits, Elements, punit, punit.ID() = MachiningPipelineReport::GetDefaultDLProductionUnit() );
       if( iscc or isdl ){
         traverse( stockingpoint, ProductInStockingPoint_MP, pisp,  pisp.Product_MP().IsLeaf() and not pisp.IsSystem() 
-    //              and exists( pisp.Product_MP().GetAllParent(), Elements, e, e.ID() = productparent ) 
-                  and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() and ( pispip.NewSupplyQuantity() <> 0 or pispip.PlannedInventoryLevelEnd() <> 0 ) ) ){
+                  and exists( pisp.Product_MP().GetAllParent(), Elements, e, e.ID() = productparent ) 
+                  and exists( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() and ( pispip.NewSupplyQuantity() <> 0 or pispip.PlannedInventoryLevelEnd() <> 0 or pispip.DependentDemandAndSalesDemandQuantity() <> 0 ) ) ){
+          isccassemnly        := stockingpoint.ID().EndsWith( pisp.Product_MP().ParentID() + '绾胯竟搴�' ) and ( stockingpoint.ID().StartsWith( 'CC' ) or stockingpoint.ID().StartsWith( '闀挎槬' ) );
+          isdlassemnly        := stockingpoint.ID().EndsWith( pisp.Product_MP().ParentID() ) and ( stockingpoint.ID().StartsWith( 'DL' ) or stockingpoint.ID().StartsWith( '澶ц繛' ) );
           pispips             := selectsortedset( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical() 
-                                                  and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() and ( pispip.NewSupplyQuantity() <> 0 or pispip.PlannedInventoryLevelEnd() <> 0 ), pispip.Start() );
+                                                  and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() and ( pispip.NewSupplyQuantity() <> 0 or pispip.PlannedInventoryLevelEnd() <> 0 or pispip.DependentDemandAndSalesDemandQuantity() <> 0 ), pispip.Start() );
           traverse( pispips, Elements, pispip ){
             supplyquantity    := [Number]pispip.NewSupplyQuantity();//鍥涜垗浜斿叆
             //澶�
@@ -54,12 +56,13 @@
             
             //瑁呴厤绾�
             if( isccassemnly or isdlassemnly ){
+              quantity        := [Number]pispip.DependentDemandAndSalesDemandQuantity();//鍥涜垗浜斿叆
               if( isccassemnly ){
-                daycolumn.CCAssemblyPlanQty( daycolumn.CCAssemblyPlanQty() + supplyquantity );
-                weekcolumn.CCAssemblyPlanQty( weekcolumn.CCAssemblyPlanQty() + supplyquantity );
+                daycolumn.CCAssemblyPlanQty( daycolumn.CCAssemblyPlanQty() + quantity );
+                weekcolumn.CCAssemblyPlanQty( weekcolumn.CCAssemblyPlanQty() + quantity );
               } else {
-                daycolumn.DLAssemblyPlanQty( daycolumn.DLAssemblyPlanQty() + supplyquantity );
-                weekcolumn.DLAssemblyPlanQty( weekcolumn.DLAssemblyPlanQty() + supplyquantity );
+                daycolumn.DLAssemblyPlanQty( daycolumn.DLAssemblyPlanQty() + quantity );
+                weekcolumn.DLAssemblyPlanQty( weekcolumn.DLAssemblyPlanQty() + quantity );
               } 
             }
             
@@ -95,17 +98,17 @@
       productparents        := product.GetAllParent();
       if( exists( productparents, Elements, e, e.ID() = productparent ) ){//鏌ヨ浜у搧绫诲瀷鏄彂鍔ㄦ満
         //璧峰搴撳瓨鐐规槸鍚︽槸澶ц繛or闀挎槬
-        originsp              := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.SourceStockpoingPointID() );
-        originunit            := originsp.Unit();
-        originparentunits     := originunit.GetAllParent();
-        originiscc            := originsp.ID() = ccunit or originunit.ID() = ccunit or exists( originparentunits, Elements, punit, punit.ID() = ccunit );
-        originisdl            := originsp.ID() = dlunit or originunit.ID() = dlunit or exists( originparentunits, Elements, punit, punit.ID() = dlunit );
+    //    originsp              := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.SourceStockpoingPointID() );
+    //    originunit            := originsp.Unit();
+    //    originparentunits     := originunit.GetAllParent();
+        originiscc            := tprow.SourceStockpoingPointID() = 'CC';//originsp.ID() = ccunit or originunit.ID() = ccunit or exists( originparentunits, Elements, punit, punit.ID() = ccunit );
+        originisdl            := tprow.SourceStockpoingPointID() = 'DL';//originsp.ID() = dlunit or originunit.ID() = dlunit or exists( originparentunits, Elements, punit, punit.ID() = dlunit );
         //鐩殑鍦版槸鍚︽槸闀挎槬澶栫搴�
-        destisp               := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.TargetStockpoingPointID() );
-        destiunit             := destisp.Unit();
-        destiparentunits      := destiunit.GetAllParent();
-        destiiscc             := destisp.ID() = ccunit or destiunit.ID() = ccunit or exists( destiparentunits, Elements, punit, punit.ID() = ccunit );
-        destiisdl             := destisp.ID() = dlunit or destiunit.ID() = dlunit or exists( destiparentunits, Elements, punit, punit.ID() = dlunit );
+    //    destisp               := selectobject( owner, StockingPoint_MP, sp, sp.ID() = tprow.TargetStockpoingPointID() );
+    //    destiunit             := destisp.Unit();
+    //    destiparentunits      := destiunit.GetAllParent();
+        destiiscc             := tprow.TargetStockpoingPointID() = 'CC';//destisp.ID() = ccunit or destiunit.ID() = ccunit or exists( destiparentunits, Elements, punit, punit.ID() = ccunit );
+        destiisdl             := tprow.TargetStockpoingPointID() = 'DL';//destisp.ID() = dlunit or destiunit.ID() = dlunit or exists( destiparentunits, Elements, punit, punit.ID() = dlunit );
         if( ( originiscc and destiisdl ) or ( originisdl and destiiscc ) ){
           row := table.GetRow( tprow.ProductID() );
           traverse( tprow, TransferPlanCell, tpcell, tpcell.TransferPlanColumn().ColumnDate() <> Date::MinDate() ){
@@ -114,7 +117,6 @@
             //鍛�
             weekcolumn       := table.GetColumnByUnit( Translations::MP_GlobalParameters_Week(), tpcell.TransferPlanColumn().ColumnDate() );
             quantity         := [Real]tpcell.Value();//鍥涜垗浜斿叆
-            
             if( not isnull( daycolumn ) ){
               row.SetCellTransferValue( daycolumn, ( originiscc and destiisdl ), quantity );
             }
diff --git a/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_InitiateSearch.qbl b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_InitiateSearch.qbl
new file mode 100644
index 0000000..2f69e1e
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_InitiateSearch.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitiateSearch (
+  MacroPlan owner
+) as MachiningPipelineReport
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Sep-29-2024 (created)
+    search                    := owner.MachiningPipelineSearch();
+    if( isnull( search ) ){
+      owner.MachiningPipelineSearch( relnew, StartDate := Date::MinDate(), EndDate := Date::MaxDate(), TimeUnit := Translations::MP_GlobalParameters_Day() );
+    }else{
+      search                  := owner.MachiningPipelineSearch();
+      search.TimeUnit( Translations::MP_GlobalParameters_Day() );
+      search.StartDate( Date::MinDate() );
+      search.EndDate( Date::MaxDate() );
+    }
+    table                     := selectobject( owner, MachiningPipelineSource.Report, table, table.IsShow() );
+    if( not isnull( table ) ){
+      products                := selectset( owner, Product_MP, product, true );
+      table.Generate( search, products );
+    }
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_A_PreviousScenaioName.qbl b/_Main/BL/Type_MacroPlan/Attribute_A_PreviousScenaioName.qbl
new file mode 100644
index 0000000..8fd2023
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_A_PreviousScenaioName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute A_PreviousScenaioName
+{
+  #keys: '3[413988.0.1581730054][413988.0.1581730053][413988.0.1581730055]'
+  Description: '鐢ㄤ簬涓嬬嚎璁″垝纭鍔熻兘'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Attribute_IsQuantity.qbl b/_Main/BL/Type_OfflinePlanCell/Attribute_IsQuantity.qbl
new file mode 100644
index 0000000..3f8f7a2
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Attribute_IsQuantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsQuantity
+{
+  #keys: '3[413988.0.1565814440][413988.0.1565814439][413988.0.1565814441]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Function_CalcIsQuantity.qbl b/_Main/BL/Type_OfflinePlanCell/Function_CalcIsQuantity.qbl
new file mode 100644
index 0000000..eef4ef2
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Function_CalcIsQuantity.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsQuantity
+{
+  TextBody:
+  [*
+    // lihongji Sep-27-2024 (created)
+    
+    value := ifexpr( this.OfflinePlanRow().Type() = "1" and this.OfflinePlanColumn().ColumnIndex() > 1 and this.Quantity() > 0, true, false );
+    
+    this.IsQuantity( value );
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Function_CalcQuantity.qbl b/_Main/BL/Type_OfflinePlanCell/Function_CalcQuantity.qbl
new file mode 100644
index 0000000..9a7da92
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Function_CalcQuantity.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcQuantity
+{
+  TextBody:
+  [*
+    // lihongji Sep-27-2024 (created)
+    
+    value := ifexpr( ( this.OfflinePlanRow().Type() = "1" or this.OfflinePlanRow().Type() = "2" ) and this.OfflinePlanColumn().ColumnIndex() > 1, 
+                     guard( [Number]this.Value(), 0 ), 0 );
+    
+    this.Quantity( value );
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/Method_QuantityGreaterThan0.qbl b/_Main/BL/Type_OfflinePlanCell/Method_QuantityGreaterThan0.qbl
new file mode 100644
index 0000000..f5715e6
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanCell/Method_QuantityGreaterThan0.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Method QuantityGreaterThan0 (
+  String type,
+  String pl
+) as Boolean
+{
+  TextBody: 'return this.OfflinePlanRow().Type() = type and this.OfflinePlanRow().ProductionLine() = pl and this.Quantity() > 0.0;'
+}
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_DeductionOfReplacementLoss.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_DeductionOfReplacementLoss.qbl
index bf4f206..bc4f716 100644
--- a/_Main/BL/Type_OfflinePlanCell/StaticMethod_DeductionOfReplacementLoss.qbl
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_DeductionOfReplacementLoss.qbl
@@ -36,7 +36,7 @@
                                          tempOPC.OfflinePlanRow().Type() = "1" and 
                                          tempOPC.OfflinePlanRow().ProductID() = firstOrderCell.OfflinePlanRow().ProductID()
                                         );
-            firstQuantityCell.Value( [String] ( [Number]firstQuantityCell.Value() - cls.ChangeLossNr() ) );                 
+            firstQuantityCell.Value( [String] ( [Number]firstQuantityCell.Value() - cls.ChangeLossNumber() ) );                 
     //        info( "褰撳墠鍒楁椂闂达細", opc.ColumnDate().Format( "Y-M2-D2" ), "    褰撳墠搴忓彿锛�", i, "    鍗曞厓鏍肩殑鍊硷細", firstOrderCell.Value(), "    浜у搧鍚嶏細", firstOrderCell.OfflinePlanRow().ProductID(),
     //              "涓嬩竴涓簭鍙凤細", i + 1, "    鍗曞厓鏍肩殑鍊硷細", secondOrderCell.Value(), "    浜у搧鍚嶏細", secondOrderCell.OfflinePlanRow().ProductID() );
           }
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl
index d9685ab..b91c95f 100644
--- a/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_Download.qbl
@@ -1,7 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Download (
-  MacroPlan macroPlan
+  MacroPlan macroPlan,
+  OfflinePlanRows selectedOPRs
 ) as BinaryValue
 {
   TextBody:
@@ -13,12 +14,12 @@
     
     opt  := maxselect( macroPlan, OfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
     opcs := selectsortedset( opt, OfflinePlanColumn, tempOPC, true, tempOPC.ColumnDate() );
-    oprs := selectsortedset( opt, OfflinePlanRow, tempOPR, true, tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
+    oprs := selectsortedset( selectedOPRs, Elements, tempOPR, true, tempOPR.ProductionLine(), tempOPR.ProductID(), tempOPR.Type() );
     traverse ( opcs, Elements, opc ) {
       column := xmlDOM.CreateElement( "column" );
       name   := xmlDOM.CreateElement( "name" );
       type   := xmlDOM.CreateElement( "type" );
-      name.TextContent( ifexpr( opc.ColumnDate() < macroPlan.StartOfPlanning().Date(), "", opc.ColumnDate().Format( "Y/M2/D2" ) ) );
+      name.TextContent( ifexpr( opc.ColumnDate() < macroPlan.StartOfPlanning().Date(), "*", opc.ColumnDate().Format( "Y/M2/D2" ) ) );
       type.TextContent( "String" );
       column.AppendChild( name );
       column.AppendChild( type );
diff --git a/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl b/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
index 98e9f56..131d267 100644
--- a/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
+++ b/_Main/BL/Type_OfflinePlanCell/StaticMethod_RefreshOfflinePlan.qbl
@@ -35,12 +35,13 @@
           }
           
           // 璧嬪�煎崟鍏冩牸
-          cellQuantity := opc.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name(), Quantity := ns.Quantity() );
-          cellQuantity.OfflinePlanRow( relset, oprQuantity );
-          cellOrder := opc.OfflinePlanCell( relnew, Value := "鍗曞彿" + [String]ns.Quantity().Round( 0 ) + "_" + [String]( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ), 
-                                            Quantity := ns.Quantity(), 
-                                            InventoryWeight := ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() );
-          cellOrder.OfflinePlanRow( relset, oprOrder );
+          cellQuantity := oprQuantity.OfflinePlanCell( relnew, Value := [String]ns.Quantity().Round( 0 ), Shift := ns.PeriodTask_MP().UnitPeriod().astype( UnitPeriodTimeBase ).ShiftPattern().Name() );
+          cellQuantity.OfflinePlanColumn( relset, opc );
+          cellOrder := oprOrder.OfflinePlanCell( relnew, 
+    //                                             Value := "鍗曞彿" + [String]ns.Quantity().Round( 0 ) + "_" + [String]( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ),
+                                                 Value := [String]ns.Quantity().Round( 0 ),
+                                                 InventoryWeight := ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() );
+          cellOrder.OfflinePlanColumn( relset, opc );
         }
       }
       
@@ -59,30 +60,30 @@
     typeOPC    := opt.OfflinePlanColumn( relnew, ColumnDate := macroPlan.StartOfPlanning().Date() - 1 );
     traverse ( opt, OfflinePlanRow, opr ) {
       if ( opr.Type() = "0" ) {
-        productLineCell := productOPC.OfflinePlanCell( relnew, Value := opr.ProductionLine() );
-        productLineCell.OfflinePlanRow( relset, opr );
+        productLineCell := opr.OfflinePlanCell( relnew, Value := opr.ProductionLine() );
+        productLineCell.OfflinePlanColumn( relset, productOPC );
       } else if( opr.Type() = "1" ) {
-        productCell := productOPC.OfflinePlanCell( relnew, Value := opr.ProductID() + ifexpr( opr.Notes() = "", "", "-" + opr.Notes() ) );
-        productCell.OfflinePlanRow( relset, opr );
-        typeCell    := typeOPC.OfflinePlanCell( relnew, Value :=  "Quantity" );
-        typeCell.OfflinePlanRow( relset, opr );
+        productCell := opr.OfflinePlanCell( relnew, Value := opr.ProductID() + ifexpr( opr.Notes() = "", "", "-" + opr.Notes() ) );
+        productCell.OfflinePlanColumn( relset, productOPC );
+        typeCell    := opr.OfflinePlanCell( relnew, Value :=  "Quantity" );
+        typeCell.OfflinePlanColumn( relset, typeOPC );
       } else if ( opr.Type() = "2" ) {
-        typeCell    := typeOPC.OfflinePlanCell( relnew, Value :=  "Order" );
-        typeCell.OfflinePlanRow( relset, opr );
+        typeCell    := opr.OfflinePlanCell( relnew, Value :=  "Order" );
+        typeCell.OfflinePlanColumn( relset, typeOPC );
       } else if ( opr.Type() = "3" ) {
-        totalCell := productOPC.OfflinePlanCell( relnew, Value := "鍚堣" );
-        totalCell.OfflinePlanRow( relset, opr );
-        totalCell := typeOPC.OfflinePlanCell( relnew, Value :=  "鎬婚噺" );
-        totalCell.OfflinePlanRow( relset, opr );
+        totalCell := opr.OfflinePlanCell( relnew, Value := "鍚堣" );
+        totalCell.OfflinePlanColumn( relset, productOPC );
+        totalCell := opr.OfflinePlanCell( relnew, Value :=  "鎬婚噺" );
+        totalCell.OfflinePlanColumn( relset, typeOPC );
       } else if ( opr.Type() = "4" ) {
-        shiftCell := typeOPC.OfflinePlanCell( relnew, Value :=  "鐝" );
-        shiftCell.OfflinePlanRow( relset, opr );
+        shiftCell := opr.OfflinePlanCell( relnew, Value :=  "鐝" );
+        shiftCell.OfflinePlanColumn( relset, typeOPC );
       } else if ( opr.Type() = "5" ) {
-        shiftStartDateCell := typeOPC.OfflinePlanCell( relnew, Value :=  "鐝寮�濮嬫椂闂�" );
-        shiftStartDateCell.OfflinePlanRow( relset, opr );
+        shiftStartDateCell := opr.OfflinePlanCell( relnew, Value :=  "鐝寮�濮嬫椂闂�" );
+        shiftStartDateCell.OfflinePlanColumn( relset, typeOPC );
       } else if ( opr.Type() = "6" ) {
-        shiftEndDateCell := typeOPC.OfflinePlanCell( relnew, Value :=  "鐝缁撴潫鏃堕棿" );
-        shiftEndDateCell.OfflinePlanRow( relset, opr );
+        shiftEndDateCell := opr.OfflinePlanCell( relnew, Value :=  "鐝缁撴潫鏃堕棿" );
+        shiftEndDateCell.OfflinePlanColumn( relset, typeOPC );
       }
     }
     
@@ -92,35 +93,39 @@
     shiftStartDateOPRs := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "5" );
     shiftEndDateOPRs   := selectset( opt, OfflinePlanRow, tempOPR, tempOPR.Type() = "6" );
     traverse ( opt, OfflinePlanColumn, opc, opc.OfflinePlanCell( relsize ) > 0 and opc.ColumnDate() >= macroPlan.StartOfPlanning().Date() ) {
+      // 琛ュ叏鎬婚噺
       traverse ( totalOPRs, Elements, totalOPR ) {
         total     := sum( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = totalOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1", [Real]tempOPC.Value() );
-        totalCell := opc.OfflinePlanCell( relnew, Value := [String]total );
-        totalCell.OfflinePlanRow( relset, totalOPR );
+        totalCell := totalOPR.OfflinePlanCell( relnew, Value := [String]total );
+        totalCell.OfflinePlanColumn( relset, opc );
       }
       
+      // &鐝
       traverse ( shiftOPRs, Elements, shiftOPR ) {
         shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = shiftOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
         if ( not isnull( shift ) ) {
-          shiftCell := opc.OfflinePlanCell( relnew, Value := shift.Shift() );
-          shiftCell.OfflinePlanRow( relset, shiftOPR );
+          shiftCell := shiftOPR.OfflinePlanCell( relnew, Value := shift.Shift() );
+          shiftCell.OfflinePlanColumn( relset, opc );
         }
       }
       
+      // 鐝寮�濮嬫椂闂�
       traverse ( shiftStartDateOPRs, Elements, ssdOPR ) {
         shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = ssdOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
         if ( not isnull( shift ) ) {
           startDate     := guard( minselect( macroPlan, ShiftPattern.ShiftDayTime, tempSDT, tempSDT.ShiftPattern().Name() = shift.Shift(), tempSDT.Sequence() ).StartDateTime().Format( "H:m" ), "" );
-          startDateCell := opc.OfflinePlanCell( relnew, Value := startDate );
-          startDateCell.OfflinePlanRow( relset, ssdOPR );
+          startDateCell := ssdOPR.OfflinePlanCell( relnew, Value := startDate );
+          startDateCell.OfflinePlanColumn( relset, opc );
         }
       }
       
+      // 鐝缁撴潫鏃堕棿
       traverse ( shiftEndDateOPRs, Elements, sedOPR ) {
         shift := select( opc, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanRow().ProductionLine() = sedOPR.ProductionLine() and tempOPC.OfflinePlanRow().Type() = "1" ); 
         if ( not isnull( shift ) ) {
           endDate     := guard( maxselect( macroPlan, ShiftPattern.ShiftDayTime, tempSDT, tempSDT.ShiftPattern().Name() = shift.Shift(), tempSDT.Sequence() ).EndDateTIme().Format( "H:m" ), "" );
-          endDateCell := opc.OfflinePlanCell( relnew, Value := endDate );
-          endDateCell.OfflinePlanRow( relset, sedOPR );
+          endDateCell := sedOPR.OfflinePlanCell( relnew, Value := endDate );
+          endDateCell.OfflinePlanColumn( relset, opc );
         }
       }
     }
@@ -136,6 +141,18 @@
       indexDate := indexDate + 1;
     }
     
+    // 琛ュ叏绌烘牸瀛�
+    traverse ( opt, OfflinePlanRow, opr ) {
+      traverse ( opt, OfflinePlanColumn, opc ) {
+        cell := select( opr, OfflinePlanCell, tempOPC, tempOPC.OfflinePlanColumn() = opc );
+        if ( isnull( cell ) ) {
+          cell := opr.OfflinePlanCell( relnew, Value := "" );
+          cell.OfflinePlanColumn( relset, opc );
+        }
+      }
+    }
+    
+    Transaction::Transaction().Propagate( attribute( OfflinePlanCell, Quantity ) );
     Transaction::Transaction().PropagateAll();
     
     // 璁剧疆鐢熶骇椤哄簭
@@ -146,12 +163,13 @@
       nextColumn     := indexColumn.NextColumn();
       
       while ( not isnull( indexColumn.NextColumn() ) 
-    //          and indexColumn.ColumnDate() <= Date::Construct( 2024, 4, 16 ) // 娴嬭瘯瀹為檯鍦烘櫙鏃跺彲浠ヨ繃婊�
+    //          and indexColumn.ColumnDate() <= Date::Construct( 2020, 4, 1 ) // 娴嬭瘯瀹為檯鍦烘櫙鏃跺彲浠ヨ繃婊�
              ) {
         productionSerialNumber := 1;
         opcs                   := selectsortedset( indexColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.InventoryWeight() );
         initialSize            := opcs.Size();
-        if ( opcs.Size() > 0 ) {
+        info( "璁″垝寮�濮嬫椂闂达細", macroPlan.StartOfPlanning().Date().Format( "Y-M2-D2" ), "    绱㈠紩鏃堕棿锛�", indexDate.Format( "Y-M2-D2" ), "    涓暟锛�", opcs.Size() );
+        if ( opcs.Size() > 0 ) { 
           // 鍒ゅ畾1
           previousOPC := maxselect( previousColumn, OfflinePlanCell, tempOPC, tempOPC.FindType( "2", pl ), tempOPC.ProductionSerialNumber() );
           if ( isnull( previousOPC ) or indexColumn.ColumnDate() = macroPlan.StartOfPlanning().Date() ) {
diff --git a/_Main/BL/Type_OfflinePlanColumn/Attribute_IsShow.qbl b/_Main/BL/Type_OfflinePlanColumn/Attribute_IsShow.qbl
new file mode 100644
index 0000000..8871340
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanColumn/Attribute_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsShow
+{
+  #keys: '3[413988.0.1565821671][413988.0.1565821670][413988.0.1565821672]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_OfflinePlanColumn/DefaultValue_IsShow.qbl b/_Main/BL/Type_OfflinePlanColumn/DefaultValue_IsShow.qbl
new file mode 100644
index 0000000..8bd79cf
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanColumn/DefaultValue_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: 'true'
+  TargetAttribute: IsShow
+}
diff --git a/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnIndex.qbl b/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnIndex.qbl
new file mode 100644
index 0000000..05e1a7d
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanColumn/Function_CalcColumnIndex.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcColumnIndex
+{
+  TextBody:
+  [*
+    // lihongji Sep-27-2024 (created)
+    
+    value := guard( this.PreviousColumn().ColumnIndex() + 1, 0 )
+    
+    this.ColumnIndex( value );
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/Attribute_Date.qbl b/_Main/BL/Type_OfflinePlanImportData/Attribute_Date.qbl
new file mode 100644
index 0000000..14e1f42
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/Attribute_Date.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Date
+{
+  #keys: '3[413988.0.1558681449][413988.0.1558681448][413988.0.1558681450]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/Attribute_Order.qbl b/_Main/BL/Type_OfflinePlanImportData/Attribute_Order.qbl
new file mode 100644
index 0000000..41491b7
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/Attribute_Order.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Order
+{
+  #keys: '3[413988.0.1558681429][413988.0.1558681428][413988.0.1558681430]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/Attribute_ProductID.qbl b/_Main/BL/Type_OfflinePlanImportData/Attribute_ProductID.qbl
new file mode 100644
index 0000000..d98b8b5
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[413988.0.1558681419][413988.0.1558681418][413988.0.1558681420]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/Attribute_Quantity.qbl b/_Main/BL/Type_OfflinePlanImportData/Attribute_Quantity.qbl
new file mode 100644
index 0000000..5a025ff
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.0.1558681439][413988.0.1558681438][413988.0.1558681440]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/StaticMethod_UpdateCell.qbl b/_Main/BL/Type_OfflinePlanImportData/StaticMethod_UpdateCell.qbl
new file mode 100644
index 0000000..c29622a
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/StaticMethod_UpdateCell.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod UpdateCell (
+  GeneralExcelImportAndExportDataTable table,
+  GeneralExcelImportAndExportDataRow row,
+  OfflinePlanTable opt,
+  OfflinePlanRow opr
+)
+{
+  TextBody:
+  [*
+    traverse ( table, GeneralExcelImportAndExportDataColumn, column ) {
+      if ( column.ColumnIndex() = 0 ) {
+        cell := select( column, GeneralExcelImportAndExportDataCell, tempColumn, tempColumn.GeneralExcelImportAndExportDataRow() = row );
+        opc  := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnIndex() = 0 );
+        opcell := opr.OfflinePlanCell( relnew, Value := cell.Value() );
+        opcell.OfflinePlanColumn( relset, opc );
+      } else if ( column.ColumnIndex() = 1 ) {
+        cell := select( column, GeneralExcelImportAndExportDataCell, tempColumn, tempColumn.GeneralExcelImportAndExportDataRow() = row );
+        opc  := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnIndex() = 1 );
+        opcell := opr.OfflinePlanCell( relnew, Value := cell.Value() );
+        opcell.OfflinePlanColumn( relset, opc );
+      } else {
+        cell   := select( column, GeneralExcelImportAndExportDataCell, tempColumn, tempColumn.GeneralExcelImportAndExportDataRow() = row );
+        opc    := select( opt, OfflinePlanColumn, tempOPC, tempOPC.ColumnName() = column.Name() );
+        opcell := opr.OfflinePlanCell( relnew, Value := cell.Value() );
+        opcell.OfflinePlanColumn( relset, opc );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/StaticMethod_Upload.qbl b/_Main/BL/Type_OfflinePlanImportData/StaticMethod_Upload.qbl
new file mode 100644
index 0000000..9060059
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/StaticMethod_Upload.qbl
@@ -0,0 +1,66 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Upload (
+  MacroPlan macroPlan,
+  OfflinePlanTable opt,
+  GeneralExcelImportAndExportDataTable table
+)
+{
+  TextBody:
+  [*
+    indexUnitID    := "";
+    indexProductID := "";
+    
+    traverse ( table, GeneralExcelImportAndExportDataRow, row ) {
+      firstColumn  := select( table, GeneralExcelImportAndExportDataColumn, tempC, tempC.ColumnIndex() = 0 );
+      secondColumn := select( table, GeneralExcelImportAndExportDataColumn, tempC, tempC.ColumnIndex() = 1 );
+      
+      firstCell    := select( row, GeneralExcelImportAndExportDataCell, tempC, tempC.GeneralExcelImportAndExportDataColumn() = firstColumn );
+      u            := select( macroPlan, Unit, tempU, tempU.ID() = firstCell.Value() );
+      product      := select( macroPlan, Product_MP, tempPMP, tempPMP.ID() = firstCell.Value() );
+      
+      secondCell    := select( row, GeneralExcelImportAndExportDataCell, tempC, tempC.GeneralExcelImportAndExportDataColumn() = secondColumn );
+      
+      if ( not isnull( u ) and secondCell.Value() = "" ) {
+        indexUnitID := u.ID();
+        opr         := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = "" and tempOPR.Type() = "0" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( not isnull( product ) and secondCell.Value() = "Quantity" ) {
+        indexProductID := product.ID();
+        opr            := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = indexProductID and tempOPR.Type() = "1" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( isnull( product ) and secondCell.Value() = "Order" ) {
+        opr := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = indexProductID and tempOPR.Type() = "2" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( firstCell.Value() = "鍚堣" and secondCell.Value() = "鎬婚噺" ) {
+        opr := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = "Z" and tempOPR.Type() = "3" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( firstCell.Value() = "" and secondCell.Value() = "鐝" ) {
+        opr := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = "Z" and tempOPR.Type() = "4" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( firstCell.Value() = "" and secondCell.Value() = "鐝寮�濮嬫椂闂�" ) {
+        opr := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = "Z" and tempOPR.Type() = "5" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else if ( firstCell.Value() = "" and secondCell.Value() = "鐝缁撴潫鏃堕棿" ) {
+        opr := select( opt, OfflinePlanRow, tempOPR, tempOPR.ProductionLine() = indexUnitID and tempOPR.ProductID() = "Z" and tempOPR.Type() = "6" );
+        opr.OfflinePlanCell( relflush );
+        
+        OfflinePlanImportData::UpdateCell( table, row, opt, opr );
+      } else {
+        error( "瀵煎叆澶辫触锛屾暟鎹紓甯�" );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanImportData/_ROOT_Type_OfflinePlanImportData.qbl b/_Main/BL/Type_OfflinePlanImportData/_ROOT_Type_OfflinePlanImportData.qbl
new file mode 100644
index 0000000..ae1bf89
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanImportData/_ROOT_Type_OfflinePlanImportData.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type OfflinePlanImportData
+{
+  #keys: '5[413988.0.1558681402][413988.0.1558681400][0.0.0][413988.0.1558681401][413988.0.1558681403]'
+  BaseType: Object
+  StructuredName: 'OfflinePlanImportDatas'
+}
diff --git a/_Main/BL/Type_OfflinePlanRow/Attribute_Notes.qbl b/_Main/BL/Type_OfflinePlanRow/Attribute_Notes.qbl
index b3d7f68..5630cec 100644
--- a/_Main/BL/Type_OfflinePlanRow/Attribute_Notes.qbl
+++ b/_Main/BL/Type_OfflinePlanRow/Attribute_Notes.qbl
@@ -3,5 +3,6 @@
 Attribute Notes
 {
   #keys: '3[415754.0.180041713][415754.0.180041712][415754.0.180041714]'
+  Description: '4浣嶇爜'
   ValueType: String
 }
diff --git a/_Main/BL/Type_TransferMinimumQuantity/Attribute_ProductID.qbl b/_Main/BL/Type_TransferMinimumQuantity/Attribute_ProductID.qbl
new file mode 100644
index 0000000..07fa71a
--- /dev/null
+++ b/_Main/BL/Type_TransferMinimumQuantity/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[413988.0.1584313375][413988.0.1584313374][413988.0.1584313376]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TransferMinimumQuantity/Attribute_Quantity.qbl b/_Main/BL/Type_TransferMinimumQuantity/Attribute_Quantity.qbl
new file mode 100644
index 0000000..b575bdf
--- /dev/null
+++ b/_Main/BL/Type_TransferMinimumQuantity/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.0.1584313385][413988.0.1584313384][413988.0.1584313386]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_TransferMinimumQuantity/_ROOT_Type_TransferMinimumQuantity.qbl b/_Main/BL/Type_TransferMinimumQuantity/_ROOT_Type_TransferMinimumQuantity.qbl
new file mode 100644
index 0000000..47a1a91
--- /dev/null
+++ b/_Main/BL/Type_TransferMinimumQuantity/_ROOT_Type_TransferMinimumQuantity.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TransferMinimumQuantity
+{
+  #keys: '5[413988.0.1584313371][413988.0.1584313369][0.0.0][413988.0.1584313370][413988.0.1584313372]'
+  BaseType: Object
+  StructuredName: 'TransferMinimumQuantitys'
+}
diff --git a/_Main/BL/Type_Unit/Method_WholeShiftFiltering.qbl b/_Main/BL/Type_Unit/Method_WholeShiftFiltering.qbl
new file mode 100644
index 0000000..b110d74
--- /dev/null
+++ b/_Main/BL/Type_Unit/Method_WholeShiftFiltering.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+Method WholeShiftFiltering () declarative remote as Boolean
+{
+  TextBody: 'return this.HasCapacityTypeTime() or this.HasCapacityTypeTransportQuantity();'
+}
diff --git a/_Main/Sys/Repr/Global/OfflinePlanCell.qrp b/_Main/Sys/Repr/Global/OfflinePlanCell.qrp
new file mode 100644
index 0000000..0dade67
--- /dev/null
+++ b/_Main/Sys/Repr/Global/OfflinePlanCell.qrp
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: #root
+TypeRepresentation OfflinePlanCell
+{
+  AttributeRepresentation Value
+  {
+    AttributeKey: '[413988.0.1296697079]'
+    Conditional:
+    [
+      DataRepresentation.Conditional
+      {
+        BackgroundColor: '$FF3399'
+        ConditionBody: 'object.IsQuantity()'
+        ConversionBody: ''
+        DefaultBackgroundColor: false
+        InheritConversion: false
+      }
+    ]
+  }
+  RelationRepresentation OfflinePlanColumn { RelationKey: '[413988.0.1296697090]' Visibility: 'Normal' }
+}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 07043ad..ab7805e 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -85,6 +85,8 @@
         Component ComponentMenu702 { #keys: '[413988.0.1234424010]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis822' Text: 'Interface Dataset' ] }
         Component menuSeparator891 { #keys: '[413988.0.1263894630]' BaseType: 'Menu' Properties: [ Separator: true ] }
         Component MenuWholeShift { #keys: '[413988.0.1263894682]' BaseType: 'Menu' Properties: [ Image: 'FISH_BOWL' Text: '娴嬭瘯鏁寸彮' ] }
+        Component menuSeparator604 { #keys: '[413988.0.1559834087]' BaseType: 'Menu' Properties: [ Separator: true ] }
+        Component ComponentMenu710 { #keys: '[413988.0.1559834106]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis627' Text: '' ] }
       ]
       Properties:
       [
@@ -104,10 +106,12 @@
           c: ComponentMenu469
           c: ComponentMenu357
           c: ComponentMenu702
+          c: ComponentMenu710
           c: menuSeparator222
           c: ComponentMenu347
           c: menuSeparator891
           c: MenuWholeShift
+          c: menuSeparator604
         }
       ]
     }
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTop.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTop.def
new file mode 100644
index 0000000..2e97d32
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTop.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component swTop
+{
+  #keys: '[530.0.3531806]'
+  BaseType: 'swTop'
+  IsDerived: true
+  Children:
+  [
+    Component spTopLeft
+    {
+      #keys: '[530.0.3531807]'
+      BaseType: 'spTopLeft'
+      IsDerived: true
+      Children:
+      [
+        Component Analysis
+        {
+          #keys: '[530.0.3532065]'
+          BaseType: 'Analysis'
+          IsDerived: true
+          Properties:
+          [
+            GlobalInstance: 'RecycleBin'
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTopMost.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTopMost.def
new file mode 100644
index 0000000..8a8fcd7
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/Component_swTopMost.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component swTopMost
+{
+  #keys: '[530.0.3531801]'
+  BaseType: 'swTopMost'
+  IsDerived: true
+  Children:
+  [
+    Component SplitterPane1
+    {
+      #keys: '[530.0.3531802]'
+      BaseType: 'SplitterPane1'
+      IsDerived: true
+      Children:
+      [
+        #child: swTop
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/_ROOT_Component_frmStandardAnalysis627.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/_ROOT_Component_frmStandardAnalysis627.def
new file mode 100644
index 0000000..a0e4ead
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis627/_ROOT_Component_frmStandardAnalysis627.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlanner
+OrphanComponent frmStandardAnalysis627
+{
+  #keys: '[413988.0.1559834123]'
+  BaseType: 'frmStandardAnalysis'
+  Children:
+  [
+    #child: swTopMost
+  ]
+  Properties:
+  [
+    Title: 'RecycleBin'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def
index 84293b3..506672c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogAssemblyOnlineQuantity/Component_pnlContent.def
@@ -27,6 +27,17 @@
         Taborder: 1
       ]
     }
+    Component npDLZKM
+    {
+      #keys: '[415754.0.318111807]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.AssemblyOnlineQuantity.DLZKM'
+        Label: 'DL-ZKM (pcs)'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlActions.def
new file mode 100644
index 0000000..73baecb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1584412873]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1584412877]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1584412879]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlContent.def
new file mode 100644
index 0000000..62574ab
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Component_pnlContent.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1584412871]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslProductID
+    {
+      #keys: '[413988.0.1584413067]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ProductID'
+        Label: 'Product ID'
+        Taborder: 0
+      ]
+    }
+    Component npQuantity
+    {
+      #keys: '[413988.0.1584413087]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Quantity'
+        Label: 'Quantity'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_Edit.def
new file mode 100644
index 0000000..9d58235
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_Edit.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  TransferMinimumQuantity selection
+) id:Method_DialogCreateEditTransferMinimumQuantity_Edit
+{
+  #keys: '[413988.0.1584413050]'
+  Body:
+  [*
+    data := shadow( selection );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_New.def
new file mode 100644
index 0000000..2f11379
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_New.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method New () id:Method_DialogCreateEditTransferMinimumQuantity_New
+{
+  #keys: '[413988.0.1584413052]'
+  Body:
+  [*
+    data := MacroPlan.TransferMinimumQuantity( relshadow );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_OnOK.def
new file mode 100644
index 0000000..f9b5433
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Method_OnOK.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogCreateEditTransferMinimumQuantity_OnOK
+{
+  #keys: '[413988.0.1584413053]'
+  Body:
+  [*
+    // On ok
+    Form.ApplyChanges();
+    
+    data := DataHolderDialogData.Data();
+    
+    data.Commit();
+    
+    Form.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..27bdb3b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[413988.0.1584412883]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..5876a55
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[413988.0.1584412882]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.OnOK();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlContent_ddslProductID_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlContent_ddslProductID_OnCreated.def
new file mode 100644
index 0000000..6a38990
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/Response_pnlContent_ddslProductID_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/ddslProductID
+Response OnCreated () id:Response_pnlContent_ddslProductID_OnCreated
+{
+  #keys: '[413988.0.1584413155]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      ids := selectuniquevalues( MacroPlan, Product_MP, tempPMP, true, tempPMP.ID() );
+      
+      this.Strings( ids.Concatenate( ";" ) );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/_ROOT_Component_DialogCreateEditTransferMinimumQuantity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/_ROOT_Component_DialogCreateEditTransferMinimumQuantity.def
new file mode 100644
index 0000000..1aea87b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEdit/_ROOT_Component_DialogCreateEditTransferMinimumQuantity.def
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditTransferMinimumQuantity
+{
+  #keys: '[413988.0.1584412869]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderDialogData id:DataHolderDialogData_438
+    {
+      #keys: '[413988.0.1584413005]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[TransferMinimumQuantity]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+    Title: 'TransferMinimumQuantity'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Component_pnlContent.def
index 94aa80b..5aec729 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Component_pnlContent.def
@@ -89,18 +89,6 @@
         Taborder: 2
       ]
     }
-    Component npChangeLossNr
-    {
-      #keys: '[415136.0.738250237]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'dhDialogData.Data.ChangeLossNr'
-        Label: 'Change loss number'
-        Min: '0'
-        Taborder: 5
-      ]
-    }
     Component dsStartDate
     {
       #keys: '[415136.0.1132411785]'
@@ -123,6 +111,17 @@
         Taborder: 4
       ]
     }
+    Component efChangeLossNr
+    {
+      #keys: '[415136.0.1176801957]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'dhDialogData.Data.ChangeLossNumber'
+        Label: 'Change loss number'
+        Taborder: 5
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Response_pnlActions_btnOk_OnClick.def
index 5def9ee..3d1e36b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditChangeLossSetting/Response_pnlActions_btnOk_OnClick.def
@@ -6,7 +6,7 @@
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    return ChangeLossSetting::ValidateInput( feedback, MacroPlan, dhDialogData.Data().WrappedInstance(), ddlUnit.Data(), ddlProduct1.Data(), ddlProduct2.Data(), dsStartDate.Date(), dsEndDate.Date(), [Number]npChangeLossNr.Number() );
+    return ChangeLossSetting::ValidateInput( feedback, MacroPlan, dhDialogData.Data().WrappedInstance(), ddlUnit.Data(), ddlProduct1.Data(), ddlProduct2.Data(), dsStartDate.Date(), dsEndDate.Date(), efChangeLossNr.Text() );
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_abpContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_abpContent.def
new file mode 100644
index 0000000..0d81068
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_abpContent.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component abpContent
+{
+  #keys: '[413988.0.1584413600]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_cmContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_cmContent.def
new file mode 100644
index 0000000..f8104df
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_cmContent.def
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component cmContent
+{
+  #keys: '[413988.0.1584413605]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component mSelectAll
+    {
+      #keys: '[413988.0.1584413729]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION_VIEW'
+        Shortcut: 'Ctrl+A'
+        Taborder: 2
+        Title: 'Select all'
+      ]
+    }
+    Component mNew
+    {
+      #keys: '[413988.0.1584413791]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 4
+        Title: 'New'
+      ]
+    }
+    Component mEdit
+    {
+      #keys: '[413988.0.1584413813]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        BindOnDoubleClick: true
+        Image: 'PENCIL'
+        Taborder: 5
+        Title: 'Edit'
+      ]
+    }
+    Component mDelete
+    {
+      #keys: '[413988.0.1584413835]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 6
+        Title: 'Delete'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_lstContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_lstContent.def
new file mode 100644
index 0000000..de9e1d8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_lstContent.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component lstContent
+{
+  #keys: '[413988.0.1584413597]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component deContent
+    {
+      #keys: '[413988.0.1584413598]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'TransferMinimumQuantity'
+      ]
+    }
+    #child: abpContent
+    Component dslContent
+    {
+      #keys: '[413988.0.1584413603]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: cmContent
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}}]'
+        ContextMenu: 'cmContent'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_lstContent_WebMenu_OnClick
+    {
+      #keys: '[413988.0.1584413922]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[3751.0.8761425]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
index 3ff0626..1c826a3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
@@ -5,61 +5,7 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component npCylinderBlock
-    {
-      #keys: '[413988.0.1273522242]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'MacroPlan.CylinderBlock'
-        Label: '缂镐綋(pcs)'
-        Taborder: 0
-      ]
-    }
-    Component npCylinderHead
-    {
-      #keys: '[413988.0.1273522255]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'MacroPlan.CylinderHead'
-        Label: '缂哥洊(pcs)'
-        Taborder: 1
-      ]
-    }
-    Component npConnectingRod
-    {
-      #keys: '[413988.0.1273522267]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'MacroPlan.ConnectingRod'
-        Label: '杩炴潌(pcs)'
-        Taborder: 2
-      ]
-    }
-    Component npCrankshaft
-    {
-      #keys: '[413988.0.1273522280]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'MacroPlan.Crankshaft'
-        Label: '鏇茶酱(pcs)'
-        Taborder: 3
-      ]
-    }
-    Component npBalanceAxis
-    {
-      #keys: '[413988.0.1273522292]'
-      BaseType: 'WebNumberPicker'
-      Properties:
-      [
-        DataBinding: 'MacroPlan.BalanceAxis'
-        Label: '骞宠 杞�(pcs)'
-        Taborder: 4
-      ]
-    }
+    #child: lstContent
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mDelete_OnClick.def
new file mode 100644
index 0000000..22cdd1b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: lstContent
+Response OnClick (
+  structured[TransferMinimumQuantity] selection
+) id:Response_lstContent_mDelete_OnClick
+{
+  #keys: '[413988.0.1584415019]'
+  CanBindMultiple: false
+  DefinitionID => /lstContent/Responsedef_lstContent_WebMenu_OnClick
+  Initiator: 'mDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      MacroPlan::DeleteObjects( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mEdit_OnClick.def
new file mode 100644
index 0000000..e14a266
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: lstContent
+Response OnClick (
+  TransferMinimumQuantity selection
+) id:Response_lstContent_mEdit_OnClick
+{
+  #keys: '[413988.0.1584414766]'
+  CanBindMultiple: false
+  DefinitionID => /lstContent/Responsedef_lstContent_WebMenu_OnClick
+  Initiator: 'mEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditTransferMinimumQuantity );
+      
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mNew_OnClick.def
new file mode 100644
index 0000000..9100d24
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mNew_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: lstContent
+Response OnClick () id:Response_lstContent_mNew_OnClick
+{
+  #keys: '[413988.0.1584414263]'
+  CanBindMultiple: false
+  DefinitionID => /lstContent/Responsedef_lstContent_WebMenu_OnClick
+  Initiator: 'mNew'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditTransferMinimumQuantity );
+      
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mSelectAll_OnClick.def
new file mode 100644
index 0000000..6775177
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_lstContent_mSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: lstContent
+Response OnClick () id:Response_lstContent_mSelectAll_OnClick
+{
+  #keys: '[413988.0.1584414036]'
+  CanBindMultiple: false
+  DefinitionID => /lstContent/Responsedef_lstContent_WebMenu_OnClick
+  Initiator: 'mSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
index b2f9f0d..12c8a5f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
@@ -16,6 +16,8 @@
     EnterButton: 'btnOk'
     EscapeButton: 'btnCancel'
     ExcludeFromActiveComponent: true
+    MinimumColumns: 50
+    MinimumRows: 30
     Padding: 'false'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
index 9993e10..2e353d2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
@@ -12,10 +12,10 @@
       Properties:
       [
         DataType: 'MacroPlan'
-        FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
+        FixedFilter: 'not object.GetIsSystem() and object.IsUnit() and object.WholeShiftFiltering();'
         Source: 'MacroPlan'
         Taborder: 0
-        Transformation: 'RootEntity'
+        Transformation: 'Unit'
       ]
     }
     Component DataSetLevelRootEntity
@@ -25,27 +25,11 @@
       Children:
       [
         #child: listContextMenu902_1
-        Component DataSetLevelChildEntity
-        {
-          #keys: '[414702.2.1845329623]'
-          BaseType: 'WebDataSetLevel'
-          Properties:
-          [
-            Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
-            ContextMenu: 'listContextMenu902'
-            FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
-            RelationFromParent: 'ChildEntity'
-            RelationRepeating: 'ChildEntity'
-            SortCriteria: 'DisplayIndex'
-            Taborder: 0
-          ]
-        }
       ]
       Properties:
       [
         Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
         ContextMenu: 'listContextMenu902'
-        RelationFromParent: 'ChildEntity'
         SortCriteria: 'DisplayIndex'
         Taborder: 1
       ]
@@ -55,7 +39,7 @@
   Properties:
   [
     DefaultExpandLevels: 100
-    Taborder: 0
+    Taborder: 1
   ]
   ResponseDefinitions:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
index b97df8e..f04789c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
@@ -52,6 +52,6 @@
   ]
   Properties:
   [
-    Taborder: 1
+    Taborder: 0
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pHeader.def
new file mode 100644
index 0000000..9e302b1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pHeader.def
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.0.1584415148]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bDeselectAll
+    {
+      #keys: '[413988.0.1585579042]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'SELECTION_DELETE'
+        Label: 'Deselect all'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def
index 0216bca..cf54825 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def
@@ -6,6 +6,7 @@
   Children:
   [
     #child: ListEntity
+    #child: pHeader
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pHeader_bDeselectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pHeader_bDeselectAll_OnClick.def
new file mode 100644
index 0000000..6676b9a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pHeader_bDeselectAll_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bDeselectAll
+Response OnClick () id:Response_pHeader_bDeselectAll_OnClick
+{
+  #keys: '[413988.0.1585579057]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      traverse ( MacroPlan, Unit, u ) {
+        u.IsToFill( false );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def
index 68b8f49..3e8f767 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Component_pHeader.def
@@ -21,7 +21,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: 'Online quantity'
+        Label: 'Filing line volume'
         Taborder: 2
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_MatrixEditor951_480_OnUpdateValue.def b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_MatrixEditor951_480_OnUpdateValue.def
new file mode 100644
index 0000000..3e6eb15
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlan/Response_MatrixEditor951_480_OnUpdateValue.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: MatrixEditor951_480
+Response OnUpdateValue (
+  AssemblyOnlinePlanRow row,
+  AssemblyOnlinePlanColumn column,
+  AssemblyOnlinePlanCell cell,
+  String value,
+  String oldvalue
+) id:Response_MatrixEditor951_480_OnUpdateValue
+{
+  #keys: '[415754.0.313052247]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMatrixEditor_OnUpdateValue'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      if ( row.Type() = "1" and column.ColumnDate() >= MacroPlan.StartOfPlanning().Date() and cell.Value() <> "" ) {
+        cell.Value( value );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Component_PanelExport\043670.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Component_PanelExport\043670.def"
index f56b008..f78bec0 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Component_PanelExport\043670.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Component_PanelExport\043670.def"
@@ -12,7 +12,8 @@
       Properties:
       [
         Image: 'EXPORT1'
-        Taborder: 1
+        Label: '瀵煎嚭'
+        Taborder: 2
       ]
     }
     Component ButtonSearch
@@ -32,7 +33,8 @@
       Properties:
       [
         Image: 'IMPORT1'
-        Taborder: 2
+        Label: '瀵煎叆'
+        Taborder: 1
       ]
     }
     Component bRefresh
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Response_OnCreated.def
index 3ada041..7221c3c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCCEngineLogisticsCostReport/Response_OnCreated.def
@@ -10,13 +10,10 @@
     Body:
     [*
       //鍒濆鍖�
-      //if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
-      //  CCEngineLogisticsCostReport::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
+      table := CCEngineLogisticsCostReport::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, CCEngineLogisticsCostReport, table, table.IsShow() );
       //info( '------------------2----------------', table.IsImport(), table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( table.MacroPlan().CCEngineLogisticsCostSearch() );
     *]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormChangeLossSetting/Component_ListChangeLossSetting\043568.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormChangeLossSetting/Component_ListChangeLossSetting\043568.def"
index 13d921e..19e17fb 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormChangeLossSetting/Component_ListChangeLossSetting\043568.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormChangeLossSetting/Component_ListChangeLossSetting\043568.def"
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit.ID","title":"Unit","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Unit.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductFirst.ID","title":"Product1","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductFirst.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductSecond.ID","title":"Product2","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductSecond.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ChangeLossNr","title":"ChangeLossNr","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ChangeLossNr"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit.ID","title":"Unit","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Unit.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductFirst.ID","title":"Product1","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductFirst.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductSecond.ID","title":"Product2","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductSecond.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ChangeLossNumber","title":"ChangeLossNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ChangeLossNumber"}}]'
         ContextMenu: 'listContextMenuChangeLossSetting'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Component_PanelExport.def
index 6b21362..3955c6c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Component_PanelExport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Component_PanelExport.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 1
       ]
     }
@@ -32,6 +33,7 @@
       Properties:
       [
         Image: 'IMPORT1'
+        Label: '瀵煎叆'
         Taborder: 2
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_OnCreated.def
index 090c39f..7802afc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_OnCreated.def
@@ -10,13 +10,10 @@
     Body:
     [*
       //鍒濆鍖�
-      //if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
-      //  DLEngineLogisticsCostReport::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
-      //table := selectobject( MacroPlan, DLEngineLogisticsCostReport, table, table.IsShow() );
+      table := DLEngineLogisticsCostReport::InitiateSearch( MacroPlan );
+      //table := selectobject( MacroPlan, DLEngineLogisticsCostReport, table, table.IsShow() );/
       //info( '------------------2----------------', table.IsImport(), table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( table.MacroPlan().DLEngineLogisticsCostSearch() );
       //info( '------------------2----------------', isnull( dhSearch.Data() ) );
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_PanelExport_bRefresh_OnClick\04357.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_PanelExport_bRefresh_OnClick\04357.def"
index 13ea574..109cc6d 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_PanelExport_bRefresh_OnClick\04357.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormDLEngineLogisticsCostReport/Response_PanelExport_bRefresh_OnClick\04357.def"
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      DLEngineLogisticsCostReport::Initialize( MacroPlan );
+      DLEngineLogisticsCostReport::InitializeNew( MacroPlan );
       
       table := selectobject( MacroPlan, DLEngineLogisticsCostReport, table, table.IsShow() );
       
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def"
index ec10521..d819dc1 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def"
@@ -11,7 +11,8 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Image: 'IMPORT1'
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def
index 16152ac..ca04bd3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def
@@ -9,13 +9,10 @@
   {
     Body:
     [*
-      //if( not isnull( MacroPlan.EnginePipelineSource() ) ){
-      //  EnginePipelineSource::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
+      table := EnginePipelineSource::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, EnginePipelineSource.Report, table, table.IsShow() );
       //info( '------------------2----------------', table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( table.Source().Search() );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelExport.def
index d776a17..512bfd5 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelExport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelExport.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportOperation.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportOperation.def
index 3b019a4..8bd7043 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportOperation.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Component_PanelFinancialProductionReportOperation.def
@@ -23,6 +23,7 @@
       Properties:
       [
         Image: 'IMPORT1'
+        Label: '瀵煎叆'
         Taborder: 1
       ]
     }
@@ -33,6 +34,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 2
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
index 03e00bf..3c15265 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
@@ -10,13 +10,10 @@
     Body:
     [*
       //鍒濆鍖�
-      //if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
-      //  FinancialProductionSource::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
+      table := FinancialProductionSource::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() and table.IsShow() );
       //info( '------------------2----------------', table.IsImport(), table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( MacroPlan.FinancialProductionSearch() );
     *]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelExport\043545.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelExport\043545.def"
index 9f9b106..c3e5888 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelExport\043545.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelExport\043545.def"
@@ -12,6 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelFinancialSalesReportOperation.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelFinancialSalesReportOperation.def
index b204aa7..c007602 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelFinancialSalesReportOperation.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelFinancialSalesReportOperation.def
@@ -23,6 +23,7 @@
       Properties:
       [
         Image: 'IMPORT1'
+        Label: '瀵煎叆'
         Taborder: 1
       ]
     }
@@ -33,6 +34,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 2
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def
index 8afab20..c61aeb4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def
@@ -9,13 +9,10 @@
   {
     Body:
     [*
-      //if( not exists( MacroPlan, FinancialSalesSource, source, not source.IsImport() ) ){
-      //  FinancialSalesSource::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
+      table := FinancialSalesSource::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, FinancialSalesSource.FinancialSalesReport, table, not table.IsImport() and table.IsShow() );
       //info( '------------------2----------------', table.IsImport(), table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( MacroPlan.FinancialSalesSearch() );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_545_bRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_545_bRefresh_OnClick.def
index 76278ef..8485ba6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_545_bRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_545_bRefresh_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      FinancialSalesSource::Initialize( MacroPlan );
+      FinancialSalesSource::InitializeNew( MacroPlan );
       
       table := selectobject( MacroPlan, FinancialSalesSource.FinancialSalesReport, table, not table.IsImport() and table.IsShow() );
       
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def
index 7b37425..14a5d3b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def
index b1ddee6..5654402 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelExport.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
+        Label: '瀵煎嚭'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
index 7f67159..379e9a6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
@@ -9,13 +9,10 @@
   {
     Body:
     [*
-      //if( not isnull( MacroPlan.InventorySummarySource() ) ){
-      //  InventorySummarySource::Initialize( MacroPlan, InterfaceDataset );
-      //}
-      //info( '------------------1----------------' );
+      table := InventorySummarySource::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
       //info( '------------------2----------------', table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( table.InventorySummarySource().InventorySummarySearch() );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def
index 7c71f89..f09e76f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def
@@ -11,7 +11,8 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Image: 'IMPORT1'
+        Image: 'EXPORT1'
+        Label: '瀵煎叆'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def
index 90189c0..f9c1344 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def
@@ -9,13 +9,10 @@
   {
     Body:
     [*
-      //if( not isnull( MacroPlan.EnginePipelineSource() ) ){
-      //  MachiningPipelineSource::Initialize( MacroPlan );
-      //}
-      //info( '------------------1----------------' );
+      table := MachiningPipelineSource::InitiateSearch( MacroPlan );
       //table := selectobject( MacroPlan, MachiningPipelineSource.Report, table, table.IsShow() );
       //info( '------------------2----------------', table.IsShow() );
-      //DataHolderTable.Data( table );
+      DataHolderTable.Data( table );
       
       //dhSearch.Data( table.Source().Search() );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
index 463493b..8777a1d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_MatrixEditor951.def
@@ -44,12 +44,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'OfflinePlanTable'
-            FilterArguments: 'entities:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderCheckedEntities'
-            FixedFilter: 'object.Filter( entities )'
-            Source: 'dhOfflinePlanTable'
+            DataType: 'structured[OfflinePlanRow]'
+            Source: 'dhSelectedOfflinePlanRow'
             Taborder: 0
-            Transformation: 'OfflinePlanRow'
+            Transformation: 'Elements'
           ]
         }
       ]
@@ -73,6 +71,7 @@
           Properties:
           [
             DataType: 'OfflinePlanTable'
+            FixedFilter: 'object.IsShow()'
             Source: 'dhOfflinePlanTable'
             Taborder: 0
             Transformation: 'OfflinePlanColumn'
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
index a78013e..859f9c4 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pContent\043611.def"
@@ -16,6 +16,33 @@
         Taborder: 1
       ]
     }
+    Component dhSelectedOfflinePlanRow
+    {
+      #keys: '[413988.0.1557550767]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[OfflinePlanRow]*'
+      Children:
+      [
+        Component deSelectedOfflinePlanRow
+        {
+          #keys: '[413988.0.1557550817]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'OfflinePlanTable'
+            FilterArguments: 'entities:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderCheckedEntities'
+            FixedFilter: 'object.Filter( entities )'
+            Source: 'dhOfflinePlanTable'
+            Taborder: 0
+            Transformation: 'OfflinePlanRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader.def
index a935cd4..dea8989 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader.def
@@ -1,76 +1,17 @@
 Quintiq file version 2.0
 Component pHeader
 {
-  #keys: '[413988.0.1296872680]'
+  #keys: '[413988.0.1568330469]'
   BaseType: 'WebPanel'
   Children:
   [
-    Component bRefresh
-    {
-      #keys: '[413988.0.1296860898]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'REFRESH'
-        Taborder: 0
-      ]
-    }
-    Component bDownload
-    {
-      #keys: '[413988.0.1296875316]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Download'
-        Taborder: 1
-      ]
-    }
-    Component bDeductionOfReplacementLoss
-    {
-      #keys: '[413988.0.1297911732]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Deduction of replacement loss'
-        Taborder: 2
-      ]
-    }
-    Component bRestore
-    {
-      #keys: '[413988.0.1297911774]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Restore'
-        Taborder: 3
-      ]
-    }
-    Component bSaveAsDraft
-    {
-      #keys: '[413988.0.1297973728]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Save as draft'
-        Taborder: 4
-      ]
-    }
-    Component bConfirm
-    {
-      #keys: '[413988.0.1297973782]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Confirm'
-        Taborder: 5
-      ]
-    }
+    #child: pHeader1_799
+    #child: pHeader2
   ]
   Properties:
   [
     Border: true
     FixedSize: true
-    Orientation: 'horizontal'
     Taborder: 0
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader1\043799.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader1\043799.def"
new file mode 100644
index 0000000..acea00e
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader1\043799.def"
@@ -0,0 +1,85 @@
+Quintiq file version 2.0
+Component pHeader1 id:pHeader1_799
+{
+  #keys: '[413988.0.1568330588]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bGenerateReport
+    {
+      #keys: '[413988.0.1568330589]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Generate report'
+        Taborder: 0
+      ]
+    }
+    Component bDownload
+    {
+      #keys: '[413988.0.1568330590]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Download'
+        Taborder: 1
+      ]
+    }
+    Component bDeductChangeoverLoss
+    {
+      #keys: '[413988.0.1568330591]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Deduct changeover loss'
+        Taborder: 3
+      ]
+    }
+    Component bRestore
+    {
+      #keys: '[413988.0.1568330592]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Restore'
+        Taborder: 4
+      ]
+    }
+    Component bSaveAsDraft
+    {
+      #keys: '[413988.0.1568330593]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Save as draft'
+        Taborder: 5
+      ]
+    }
+    Component bConfirm
+    {
+      #keys: '[413988.0.1568330594]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Confirm'
+        Taborder: 6
+      ]
+    }
+    Component bImport
+    {
+      #keys: '[413988.0.1568330595]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Import'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader2.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader2.def
new file mode 100644
index 0000000..50678f7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Component_pHeader2.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component pHeader2
+{
+  #keys: '[413988.0.1568330735]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component sDateFilter
+    {
+      #keys: '[413988.0.1567271085]'
+      BaseType: 'WebSlider'
+      Properties:
+      [
+        NumberOfColumns: 100
+        Taborder: 0
+        Visible: false
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_MatrixEditor951_OnUpdateValue.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_MatrixEditor951_OnUpdateValue.def
index a646cdb..4aeee49 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_MatrixEditor951_OnUpdateValue.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_MatrixEditor951_OnUpdateValue.def
@@ -23,6 +23,8 @@
         cell.IsQuantityChange( true );
         cell.Value( value );
         cell.Quantity( [Real]value );
+      } else if ( row.Type() = "2" and column.ColumnDate() >= MacroPlan.StartOfPlanning().Date() ) {
+        cell.Value( value );
       }
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bConfirm_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bConfirm_OnClick.def
new file mode 100644
index 0000000..0f75914
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bConfirm_OnClick.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: pHeader1_799/bConfirm
+Response OnClick () id:Response_pHeader1_799_bConfirm_OnClick
+{
+  #keys: '[413988.0.1568330582]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      OfflinePlanCell::SynchronizeToNewSupply( MacroPlan, dhOfflinePlanTable.Data() );
+      
+      MacroPlan.A_PreviousScenaioName( MacroPlan.ScenarioName() );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDeductionOfReplacementLoss_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDeductChangeoverLoss_OnClick.def
similarity index 66%
rename from _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDeductionOfReplacementLoss_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDeductChangeoverLoss_OnClick.def
index 16a2713..b50a224 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDeductionOfReplacementLoss_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDeductChangeoverLoss_OnClick.def
@@ -1,13 +1,13 @@
 Quintiq file version 2.0
-#parent: pHeader/bDeductionOfReplacementLoss
-Response OnClick () id:Response_pHeader_bDeductionOfReplacementLoss_OnClick
+#parent: pHeader1_799/bDeductChangeoverLoss
+Response OnClick () id:Response_pHeader1_799_bDeductChangeoverLoss_OnClick
 {
-  #keys: '[413988.0.1297973984]'
+  #keys: '[413988.0.1568330585]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    return not isnull( MacroPlan );
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDownload_OnClick.def
new file mode 100644
index 0000000..5558821
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bDownload_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader1_799/bDownload
+Response OnClick () id:Response_pHeader1_799_bDownload_OnClick
+{
+  #keys: '[413988.0.1568330586]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := OfflinePlanCell::Download( MacroPlan, dhSelectedOfflinePlanRow.Data() );
+      
+      Application.Download( "Offline plan.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bGenerateReport_OnClick.def
similarity index 65%
rename from _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bGenerateReport_OnClick.def
index 94d48f9..96194e0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bGenerateReport_OnClick.def
@@ -1,13 +1,13 @@
 Quintiq file version 2.0
-#parent: pHeader/bRefresh
-Response OnClick () id:Response_pHeader_bRefresh_OnClick
+#parent: pHeader1_799/bGenerateReport
+Response OnClick () id:Response_pHeader1_799_bGenerateReport_OnClick
 {
-  #keys: '[413988.0.1297973814]'
+  #keys: '[413988.0.1568330587]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    return not isnull( MacroPlan );
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bImport_OnClick.def
new file mode 100644
index 0000000..d81e24c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bImport_OnClick.def
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: pHeader1_799/bImport
+Response OnClick () id:Response_pHeader1_799_bImport_OnClick
+{
+  #keys: '[413988.0.1568330581]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          Archive::VerifyTheFileName( uploadJson );
+                
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+              
+          webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
+          
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource.ReadStructure();
+          
+          selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
+          
+          OfflinePlanImportData::Upload( MacroPlan, dhOfflinePlanTable.Data(), selection );
+          
+          // 鍚庣画鍒犻櫎
+      //    generalExcelImportAndExportDataSource.Delete();
+          
+          WebMessageBox::Success( Translations::A_VWED_Success() );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bRestore_OnClick.def
similarity index 71%
rename from _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bRestore_OnClick.def
index 14e4993..8b98925 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bRestore_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bRestore_OnClick.def
@@ -1,13 +1,13 @@
 Quintiq file version 2.0
-#parent: pHeader/bRestore
-Response OnClick () id:Response_pHeader_bRestore_OnClick
+#parent: pHeader1_799/bRestore
+Response OnClick () id:Response_pHeader1_799_bRestore_OnClick
 {
-  #keys: '[413988.0.1297974069]'
+  #keys: '[413988.0.1568330584]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    return not isnull( MacroPlan );
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bSaveAsDraft_OnClick.def
similarity index 62%
rename from _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bSaveAsDraft_OnClick.def
index e94ded1..1ec387e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bSaveAsDraft_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader1_799_bSaveAsDraft_OnClick.def
@@ -1,13 +1,13 @@
 Quintiq file version 2.0
-#parent: pHeader/bSaveAsDraft
-Response OnClick () id:Response_pHeader_bSaveAsDraft_OnClick
+#parent: pHeader1_799/bSaveAsDraft
+Response OnClick () id:Response_pHeader1_799_bSaveAsDraft_OnClick
 {
-  #keys: '[413988.0.1297974155]'
+  #keys: '[413988.0.1568330583]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    return not isnull( MacroPlan );
+    return not isnull( MacroPlan ) and MacroPlan.A_PreviousScenaioName() <> MacroPlan.ScenarioName();
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader2_sDateFilter_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader2_sDateFilter_OnUserChanged.def
new file mode 100644
index 0000000..d95c376
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader2_sDateFilter_OnUserChanged.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: pHeader2/sDateFilter
+Response OnUserChanged () id:Response_pHeader2_sDateFilter_OnUserChanged
+{
+  #keys: '[413988.0.1568579788]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebSlider_OnUserChanged'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      traverse ( dhOfflinePlanTable.Data(), OfflinePlanColumn, opc ) {
+       opc.IsShow( true ); 
+      
+        if ( opc.ColumnIndex() > 1 and opc.ColumnIndex() < this.EndReal() ) {
+          opc.IsShow( false );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bConfirm_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bConfirm_OnClick.def
deleted file mode 100644
index ef72979..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bConfirm_OnClick.def
+++ /dev/null
@@ -1,22 +0,0 @@
-Quintiq file version 2.0
-#parent: pHeader/bConfirm
-Response OnClick () id:Response_pHeader_bConfirm_OnClick
-{
-  #keys: '[413988.0.1297974240]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan );
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      OfflinePlanCell::SynchronizeToNewSupply( MacroPlan, dhOfflinePlanTable.Data() );
-      
-      WebMessageBox::Success( Translations::A_VWED_Success() );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def
deleted file mode 100644
index 7e12122..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/Response_pHeader_bDownload_OnClick.def
+++ /dev/null
@@ -1,22 +0,0 @@
-Quintiq file version 2.0
-#parent: pHeader/bDownload
-Response OnClick () id:Response_pHeader_bDownload_OnClick
-{
-  #keys: '[413988.0.1297973899]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan );
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      binaryValue := OfflinePlanCell::Download( MacroPlan );
-      
-      Application.Download( "Offline plan.xlsx", binaryValue.AsBinaryData() );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/_ROOT_Component_FormOfflinePlan.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/_ROOT_Component_FormOfflinePlan.def
index be8fe4d..8d1b9fc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/_ROOT_Component_FormOfflinePlan.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlan/_ROOT_Component_FormOfflinePlan.def
@@ -7,8 +7,8 @@
   BaseType: 'WebForm'
   Children:
   [
-    #child: pHeader
     #child: pContent
+    #child: pHeader
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Change_loss_setting_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Change_loss_setting_view.vw
index d72a303..3bafc0d 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Change_loss_setting_view.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Change_loss_setting_view.vw
@@ -78,14 +78,14 @@
               subtotals: ''
               width: 150
             }
-            column_ChangeLossNr
+            column_ChangeLossNumber
             {
-              columnId: 'ChangeLossNr'
-              dataPath: 'ChangeLossNr'
-              dataType: 'number'
+              columnId: 'ChangeLossNumber'
+              dataPath: 'ChangeLossNumber'
+              dataType: 'real'
               index: 5
               subtotals: ''
-              width: 150
+              width: 183
             }
           }
         }
diff --git a/_Main/metadata.properties b/_Main/metadata.properties
index 6123311..14be557 100644
--- a/_Main/metadata.properties
+++ b/_Main/metadata.properties
@@ -1,6 +1,6 @@
 component=submodel
 kind=Quintiq Metadata File
 name=MacroPlanner
-version.component=2022.3.0.0
+version.component=2022.3.0.56
 version.fileformat=2
 version.quintiq=6.3.3.0 , build 248673

--
Gitblit v1.9.3