From 035ff4e0ea0e65da8631e940d9dd2312d3c38dee Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期一, 15 七月 2024 14:05:35 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/BL/Type_MachiningPipelineColumn0/DefaultValue_Name.qbl                                                                                   |    6 
 _Main/BL/Type_EnginePipelineRow/Attribute_RowNr.qbl                                                                                            |    7 
 _Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultDLUnit.qbl                                                                           |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def                                                       |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listContextMenuEnginePipelineDemand.def                               |   10 
 _Main/BL/Relations/Relation_EnginePipelineReport_Row_EnginePipelineRow_Report.qbl                                                              |   23 
 _Main/BL/Type_MachiningPipelineCell/Method_Copy.qbl                                                                                            |   21 
 _Main/BL/Relations/Relation_EnginePipelineDemand_Cell_EnginePipelineCell_Demand.qbl                                                            |   23 
 _Main/BL/Type_MachiningPipelineSource0/_ROOT_Type_MachiningPipelineSource0.qbl                                                                 |   10 
 _Main/BL/Type_MachiningPipelineReport/DefaultValue_Name.qbl                                                                                    |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixEditorActionBarPageTable#1.def                               |   10 
 _Main/BL/Type_EnginePipelineColumn/Attribute_TimeUnit.qbl                                                                                      |    8 
 _Main/BL/Type_MachiningPipelineReport/Method_Clear.qbl                                                                                         |   17 
 _Main/BL/Type_EnginePipelineReport/DefaultValue_Name.qbl                                                                                       |    6 
 _Main/BL/Type_EnginePipelineReport/Attribute_Name.qbl                                                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Views/Engine_pipleline_report.vw                                                                                   |  367 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnCreated.def             |   16 
 _Main/BL/Type_EnginePipelineColumn/Attribute_Name.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/_ROOT_Component_FormEnginePipelineDemand.def                                    |   17 
 _Main/BL/Type_MachiningPipelineColumn0/Attribute_Period.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelExport_570_ButtonSummaryExport_OnClick.def                        |   22 
 _Main/BL/Type_EnginePipelineCell/Method_Copy.qbl                                                                                               |   19 
 _Main/BL/Type_MachiningPipelineSource0/DefaultValue_Name.qbl                                                                                   |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTimeUnit#778.def                                              |   28 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def                                                               |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelPeriod#325.def                                                   |   35 
 _Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl                                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixeditorContextMenuTable#1.def                                 |   10 
 _Main/BL/Type_EnginePipelineCell/Attribute_DemandQuantity.qbl                                                                                  |    8 
 _Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw                                                                          |   16 
 _Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl                                                                         |   30 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixEditorActionBarPageTable.def                                    |   10 
 _Main/BL/Relations/Relation_EnginePipelineSource_Search_EnginePipelineSearch_Source.qbl                                                        |   23 
 _Main/BL/Type_MachiningPipelineCell/Attribute_TotalInventoryQty.qbl                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTable.def                                                        |   14 
 _Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl                                                                             |   84 +
 _Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultAllUnit.qbl                                                                          |   10 
 _Main/BL/Type_MachiningPipelineRow/Method_SetCellAssemblyValue.qbl                                                                             |   20 
 _Main/BL/Type_EnginePipelineReport/Attribute_IsShow.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_MatrixEditorTable.def                                                 |   97 +
 _Main/BL/Type_MachiningPipelineReport/_ROOT_Type_MachiningPipelineReport.qbl                                                                   |   10 
 _Main/BL/Type_MachiningPipelineRow/_ROOT_Type_MachiningPipelineRow.qbl                                                                         |   10 
 _Main/BL/Type_EnginePipelineProduction/_ROOT_Type_EnginePipelineProduction.qbl                                                                 |   10 
 _Main/BL/Type_EnginePipelineReport/_ROOT_Type_EnginePipelineReport.qbl                                                                         |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixeditorContextMenuTable.def                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def                                                          |   24 
 _Main/BL/Relations/Relation_EnginePipelineReport_Column_EnginePipelineColumn_Report.qbl                                                        |   26 
 _Main/BL/Relations/Relation_MachiningPipelineColumn_Report_MachiningPipelineReport_Column.qbl                                                  |   26 
 _Main/BL/Type_MachiningPipelineColumn0/Attribute_TimeUnit.qbl                                                                                  |    8 
 _Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultCCUnit.qbl                                                                           |   11 
 _Main/BL/Type_MachiningPipelineCell/Attribute_DLAssemblyPlanQty.qbl                                                                            |    8 
 _Main/BL/Type_MachiningPipelineSearch/Attribute_StartDate.qbl                                                                                  |    8 
 _Main/BL/Type_EnginePipelineCellValue/Attribute_Value.qbl                                                                                      |    7 
 _Main/BL/Type_EnginePipelineDemand/Attribute_Model.qbl                                                                                         |    8 
 _Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl                                                                                 |   38 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTable#141.def                                                 |   14 
 _Main/BL/Relations/Relation_MachiningPipelineCell_Column_MachiningPipelineColumn_Cell.qbl                                                      |   26 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLProductionUnit.qbl                                                              |   11 
 _Main/BL/Type_MachiningPipelineReport/Attribute_IsShow.qbl                                                                                     |    7 
 _Main/BL/Relations/Relation_EnginePipelineColumn_Cell_EnginePipelineCell_Column.qbl                                                            |   26 
 _Main/BL/Type_MachiningPipelineSearch/DefaultValue_TimeUnit.qbl                                                                                |    6 
 _Main/BL/Type_EnginePipelineReport/Method_GetRow.qbl                                                                                           |   20 
 _Main/BL/Type_EnginePipelineSource/StaticMethod_Download.qbl                                                                                   |   55 
 _Main/BL/Type_MachiningPipelineColumn0/Attribute_Name.qbl                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listContextMenuEnginePipelineProduction.def                       |   10 
 _Main/BL/Type_MachiningPipelineRow/Attribute_RowNr.qbl                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def                          |   21 
 _Main/BL/Type_EnginePipelineProduction/Attribute_EngineType.qbl                                                                                |    8 
 _Main/BL/Type_EnginePipelineCell/Attribute_ProductionQuantity.qbl                                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def                               |   22 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                               |   22 
 _Main/BL/Relations/Relation_EnginePipelineSource_Report_EnginePipelineReport_Source.qbl                                                        |   23 
 _Main/BL/Type_EnginePipelineColumn/Function_CalcIndex.qbl                                                                                      |   13 
 _Main/BL/Type_MachiningPipelineColumn0/DefaultValue_TimeUnit.qbl                                                                               |    6 
 _Main/BL/Type_MachiningPipelineRow/Method_SetCellProductionValue.qbl                                                                           |   20 
 _Main/BL/Relations/Relation_EnginePipelineSource_MacroPlan_MacroPlan_EnginePipelineSource.qbl                                                  |   23 
 _Main/BL/Relations/Relation_EnginePipelineRow_CellValue_EnginePipelineCellValue_Row.qbl                                                        |   23 
 _Main/BL/Type_EnginePipelineRow/Method_Initialize.qbl                                                                                          |   14 
 _Main/BL/Type_EnginePipelineSearch/_ROOT_Type_EnginePipelineSearch.qbl                                                                         |   10 
 _Main/BL/Type_MachiningPipelineReport/DefaultValue_ID.qbl                                                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def                             |   16 
 _Main/BL/Type_EnginePipelineSource/StaticMethod_Initialize.qbl                                                                                 |   73 
 _Main/BL/Type_EnginePipelineReport/Method_Generate.qbl                                                                                         |  150 ++
 _Main/BL/Type_EnginePipelineRow/Method_SetCellProductionValue.qbl                                                                              |   26 
 _Main/BL/Type_MachiningPipelineCell/Attribute_DLProductionQty.qbl                                                                              |    8 
 _Main/BL/Type_MachiningPipelineCell/Attribute_DLTransferQty.qbl                                                                                |    8 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultName.qbl                                                                          |   10 
 _Main/BL/Type_EnginePipelineRow/Method_InitializeCell.qbl                                                                                      |   14 
 _Main/BL/Relations/Relation_MachiningPipelineRow_Report_MachiningPipelineReport_Row.qbl                                                        |   23 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCUnit.qbl                                                                        |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def                         |   24 
 _Main/BL/Type_EnginePipelineCell/Function_CalcProductionQuantity.qbl                                                                           |   16 
 _Main/BL/Type_EnginePipelineCellValue/DefaultValue_Value.qbl                                                                                   |    6 
 _Main/BL/Type_EnginePipelineSearch/Attribute_EndDate.qbl                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonEnginePipelineReport_OnClic.def |   16 
 _Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw                                                                                                 |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listActionBarPageEnginePipelineProduction.def                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_MatrixEditorTable#870.def                                          |   98 +
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def                                        |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/_ROOT_Component_FormEnginePipelineReport.def                                    |   48 
 _Main/BL/Type_MachiningPipelineRow/DefaultValue_Name.qbl                                                                                       |    6 
 _Main/BL/Type_EnginePipelineCell/Function_CalcDemandQuantity.qbl                                                                               |   13 
 _Main/BL/Type_EnginePipelineDemand/Attribute_EngineType.qbl                                                                                    |    8 
 _Main/BL/Type_EnginePipelineSource/DefaultValue_Name.qbl                                                                                       |    6 
 _Main/BL/Type_EnginePipelineSearch/Attribute_StartDate.qbl                                                                                     |    8 
 _Main/BL/Type_MachiningPipelineColumn0/_ROOT_Type_MachiningPipelineColumn0.qbl                                                                 |   10 
 _Main/BL/Type_MachiningPipelineCell/Method_Add.qbl                                                                                             |   19 
 _Main/BL/Type_MachiningPipelineCell/Attribute_CCAssemblyPlanQty.qbl                                                                            |    8 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl                                                                                       |    2 
 _Main/BL/Type_MachiningPipelineSearch/Attribute_TimeUnit.qbl                                                                                   |    8 
 _Main/BL/Type_EnginePipelineColumn/Attribute_Index.qbl                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnChanged.def             |   20 
 _Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl                                                                                             |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelSearch#957.def                                                |   18 
 _Main/BL/Type_EnginePipelineCellValue/_ROOT_Type_EnginePipelineCellValue.qbl                                                                   |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def                           |   24 
 _Main/BL/Type_EnginePipelineProduction/Attribute_DLProduction.qbl                                                                              |    8 
 _Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl                                                                                          |   28 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCProductionUnit.qbl                                                              |   11 
 _Main/BL/Type_MachiningPipelineReport/Method_GetRow.qbl                                                                                        |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport#570.def                                                   |   24 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLUnit.qbl                                                                        |   11 
 _Main/BL/Type_EnginePipelineRow/_ROOT_Type_EnginePipelineRow.qbl                                                                               |   10 
 _Main/BL/Type_EnginePipelineProduction/Attribute_CCProduction.qbl                                                                              |    8 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def                                           |   10 
 _Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl                                                                                 |   30 
 _Main/BL/Type_MachiningPipelineCell/_ROOT_Type_MachiningPipelineCell.qbl                                                                       |   10 
 _Main/BL/Type_MachiningPipelineRow/Method_SetCellInventoryValue.qbl                                                                            |   20 
 _Main/BL/Type_EnginePipelineRow/StaticMethod_CraeteCellValueForRow.qbl                                                                         |   26 
 _Main/BL/Relations/Relation_MachiningPipelineReport_Source_MachiningPipelineSource_Report.qbl                                                  |   23 
 _Main/BL/Type_EnginePipelineProduction/Attribute_Period.qbl                                                                                    |    8 
 _Main/BL/Type_MachiningPipelineRow/Method_InitializeCell.qbl                                                                                   |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTimeUnit.def                                                     |   28 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/_ROOT_Component_FormMachiningPipelineReport.def                              |   38 
 _Main/BL/Type_MachiningPipelineSource0/Attribute_Name.qbl                                                                                      |    7 
 _Main/BL/Type_MachiningPipelineCell/Attribute_CCTransferQty.qbl                                                                                |    8 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCAssemnlyUnit.qbl                                                                |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelHeader.def                                                       |   15 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def                                             |   10 
 _Main/BL/Type_EnginePipelineReport/Attribute_ID.qbl                                                                                            |    8 
 _Main/BL/Relations/Relation_EnginePipelineRow_Cell_EnginePipelineCell_Row.qbl                                                                  |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnCreated.def      |   16 
 _Main/BL/Type_EnginePipelineColumn/Attribute_Period.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/_ROOT_Component_FormEnginePipelineProduction.def                            |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorEnd_OnChanged.def                          |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def                                                   |    1 
 _Main/BL/Type_MachiningPipelineCell/Attribute_DLInventoryQty.qbl                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_ListEnginePipelineDemand.def                                          |   42 
 _Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl                                                                                |    2 
 _Main/BL/Type_EnginePipelineDemand/Attribute_Period.qbl                                                                                        |    8 
 _Main/BL/Type_MachiningPipelineColumn0/Attribute_Index.qbl                                                                                     |    7 
 _Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl                                                                                             |   17 
 _Main/BL/Type_EnginePipelineSource/_ROOT_Type_EnginePipelineSource.qbl                                                                         |   10 
 _Main/BL/Type_MachiningPipelineCell/Attribute_CCProductionQty.qbl                                                                              |    8 
 _Main/BL/Type_EnginePipelineColumn/_ROOT_Type_EnginePipelineColumn.qbl                                                                         |   10 
 _Main/BL/Type_EnginePipelineReport/Method_GenerateColumn.qbl                                                                                   |   23 
 _Main/BL/Type_EnginePipelineRow/Method_SetCellInventoryValue.qbl                                                                               |   15 
 _Main/BL/Type_MachiningPipelineReport/Method_Generate.qbl                                                                                      |   39 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelPeriod.def                                                    |   35 
 _Main/BL/Relations/Relation_MachiningPipelineCell_Row_MachiningPipelineRow_Cell.qbl                                                            |   23 
 _Main/BL/Type_MachiningPipelineSearch/_ROOT_Type_MachiningPipelineSearch.qbl                                                                   |   10 
 _Main/BL/Type_EnginePipelineCell/Attribute_InventoryQuantity.qbl                                                                               |    8 
 _Main/BL/Type_MachiningPipelineCell/Attribute_CCInventoryQty.qbl                                                                               |    8 
 _Main/BL/Type_EnginePipelineSource/Attribute_Name.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_ListEnginePipelineProduction.def                                  |   42 
 _Main/BL/Type_MachiningPipelineReport/Attribute_Name.qbl                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelHeader#832.def                                                |   15 
 _Main/BL/Type_EnginePipelineRow/Attribute_Name.qbl                                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def                                                    |   24 
 _Main/BL/Type_MachiningPipelineCell/Function_CalcTotalInventoryQty.qbl                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw                                                                                               |    2 
 _Main/BL/Type_MachiningPipelineSource0/StaticMethod_Download.qbl                                                                               |  168 ++
 _Main/BL/Type_EnginePipelineColumn/DefaultValue_Name.qbl                                                                                       |    6 
 _Main/BL/Type_MachiningPipelineRow/Attribute_Name.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listActionBarPageEnginePipelineDemand.def                             |   10 
 _Main/BL/Type_InventorySummaryReport/Method_Generate.qbl                                                                                       |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_MatrixEditorTable_OnSelectionChanged.def                               |   19 
 _Main/BL/Type_EnginePipelineReport/Method_Clear.qbl                                                                                            |   18 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def                                                                  |   16 
 _Main/BL/Relations/Relation_MachiningPipelineSearch_Source_MachiningPipelineSource_Search.qbl                                                  |   23 
 _Main/BL/Type_MachiningPipelineSearch/Attribute_EndDate.qbl                                                                                    |    8 
 _Main/BL/Type_MachiningPipelineReport/Method_GenerateColumn.qbl                                                                                |   23 
 _Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultName.qbl                                                                             |   10 
 _Main/BL/Relations/Relation_EnginePipelineCellValue_Column_EnginePipelineColumn_CellValue.qbl                                                  |   23 
 _Main/BL/Type_EnginePipelineSearch/Attribute_TimeUnit.qbl                                                                                      |    8 
 _Main/BL/Type_EnginePipelineReport/DefaultValue_ID.qbl                                                                                         |    6 
 _Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl                                                                                    |    7 
 _Main/BL/Relations/Relation_MachiningPipelineSource_MacroPlan_MacroPlan_MachiningPipelineSource.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorStart_OnChanged.def                        |   24 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction#633.def                                                        |   65 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelExport_ButtonSummaryExport_OnClick.def                         |   22 
 _Main/BL/Type_EnginePipelineRow/DefaultValue_Name.qbl                                                                                          |    6 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultAllUnit.qbl                                                                       |   10 
 _Main/BL/Type_EnginePipelineCell/_ROOT_Type_EnginePipelineCell.qbl                                                                             |   10 
 _Main/BL/Type_EnginePipelineDemand/Attribute_Quantity.qbl                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def                                                        |   97 +
 _Main/BL/Relations/Relation_EnginePipelineCell_Production_EnginePipelineProduction_Cell.qbl                                                    |   23 
 _Main/BL/Type_MachiningPipelineColumn0/Function_CalcIndex.qbl                                                                                  |   13 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                                                            |  110 +
 _Main/BL/Type_MachiningPipelineReport/Attribute_ID.qbl                                                                                         |    8 
 _Main/BL/Type_EnginePipelineRow/Method_SetCellDemandValue.qbl                                                                                  |   22 
 _Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLAssemnlyUnit.qbl                                                                |   11 
 _Main/BL/Type_EnginePipelineDemand/_ROOT_Type_EnginePipelineDemand.qbl                                                                         |   10 
 /dev/null                                                                                                                                      |   63 
 _Main/BL/Type_MachiningPipelineCell/StaticMethod_Initialize.qbl                                                                                |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelSearch.def                                                       |   18 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                                                   |  122 +
 _Main/BL/Type_MachiningPipelineRow/Method_Initialize.qbl                                                                                       |   14 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnChanged.def      |   20 
 210 files changed, 4,339 insertions(+), 97 deletions(-)

diff --git a/_Main/BL/Relations/Relation_EnginePipelineCellValue_Column_EnginePipelineColumn_CellValue.qbl b/_Main/BL/Relations/Relation_EnginePipelineCellValue_Column_EnginePipelineColumn_CellValue.qbl
new file mode 100644
index 0000000..f733b7f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineCellValue_Column_EnginePipelineColumn_CellValue.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineCellValue_Column_EnginePipelineColumn_CellValue
+{
+  #keys: '1[415136.0.886711679]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Column
+  {
+    #keys: '3[415136.0.886711681][415136.0.886711680][415136.0.886711682]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineCellValue
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CellValue
+  {
+    #keys: '3[415136.0.886711684][415136.0.886711683][415136.0.886711685]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineColumn
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineCell_Production_EnginePipelineProduction_Cell.qbl b/_Main/BL/Relations/Relation_EnginePipelineCell_Production_EnginePipelineProduction_Cell.qbl
new file mode 100644
index 0000000..c2e500d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineCell_Production_EnginePipelineProduction_Cell.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineCell_Production_EnginePipelineProduction_Cell
+{
+  #keys: '1[415136.0.883590181]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Production
+  {
+    #keys: '3[415136.0.883590183][415136.0.883590182][415136.0.883590184]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineCell
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Cell
+  {
+    #keys: '3[415136.0.883590186][415136.0.883590185][415136.0.883590187]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineProduction
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineColumn_Cell_EnginePipelineCell_Column.qbl b/_Main/BL/Relations/Relation_EnginePipelineColumn_Cell_EnginePipelineCell_Column.qbl
new file mode 100644
index 0000000..dcd538e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineColumn_Cell_EnginePipelineCell_Column.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineColumn_Cell_EnginePipelineCell_Column
+{
+  #keys: '1[415136.0.883590111]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.883590130][415136.0.883590124][415136.0.883590131][415136.0.883590125][415136.0.883590132][415136.0.883590126][415136.0.883590133][415136.0.883590127][415136.0.883590134][415136.0.883590128][415136.0.883590135][415136.0.883590129]'
+    SequenceElementSuffix: 'CellInColumn'
+    SequenceSuffix: 'CellInColumn'
+  }
+  RelationSide.LeftSide Cell
+  {
+    #keys: '3[415136.0.883590113][415136.0.883590112][415136.0.883590114]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineColumn
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Column
+  {
+    #keys: '3[415136.0.883590116][415136.0.883590115][415136.0.883590117]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineDemand_Cell_EnginePipelineCell_Demand.qbl b/_Main/BL/Relations/Relation_EnginePipelineDemand_Cell_EnginePipelineCell_Demand.qbl
new file mode 100644
index 0000000..083f2c4
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineDemand_Cell_EnginePipelineCell_Demand.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineDemand_Cell_EnginePipelineCell_Demand
+{
+  #keys: '1[415136.0.883590237]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Cell
+  {
+    #keys: '3[415136.0.883590239][415136.0.883590238][415136.0.883590240]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineDemand
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Demand
+  {
+    #keys: '3[415136.0.883590242][415136.0.883590241][415136.0.883590243]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineCell
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineReport_Column_EnginePipelineColumn_Report.qbl b/_Main/BL/Relations/Relation_EnginePipelineReport_Column_EnginePipelineColumn_Report.qbl
new file mode 100644
index 0000000..ce13b04
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineReport_Column_EnginePipelineColumn_Report.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineReport_Column_EnginePipelineColumn_Report
+{
+  #keys: '1[415136.0.883590042]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.883590073][415136.0.883590067][415136.0.883590074][415136.0.883590068][415136.0.883590075][415136.0.883590069][415136.0.883590076][415136.0.883590070][415136.0.883590077][415136.0.883590071][415136.0.883590078][415136.0.883590072]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+  }
+  RelationSide.LeftSide Column
+  {
+    #keys: '3[415136.0.883590044][415136.0.883590043][415136.0.883590045]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineReport
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Report
+  {
+    #keys: '3[415136.0.883590047][415136.0.883590046][415136.0.883590048]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineReport_Row_EnginePipelineRow_Report.qbl b/_Main/BL/Relations/Relation_EnginePipelineReport_Row_EnginePipelineRow_Report.qbl
new file mode 100644
index 0000000..6be2a1d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineReport_Row_EnginePipelineRow_Report.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineReport_Row_EnginePipelineRow_Report
+{
+  #keys: '1[415136.0.883590084]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Row
+  {
+    #keys: '3[415136.0.883590086][415136.0.883590085][415136.0.883590087]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineReport
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Report
+  {
+    #keys: '3[415136.0.883590089][415136.0.883590088][415136.0.883590090]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineRow_CellValue_EnginePipelineCellValue_Row.qbl b/_Main/BL/Relations/Relation_EnginePipelineRow_CellValue_EnginePipelineCellValue_Row.qbl
new file mode 100644
index 0000000..a029ad6
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineRow_CellValue_EnginePipelineCellValue_Row.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineRow_CellValue_EnginePipelineCellValue_Row
+{
+  #keys: '1[415136.0.886711663]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide CellValue
+  {
+    #keys: '3[415136.0.886711665][415136.0.886711664][415136.0.886711666]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Row
+  {
+    #keys: '3[415136.0.886711668][415136.0.886711667][415136.0.886711669]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineCellValue
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineRow_Cell_EnginePipelineCell_Row.qbl b/_Main/BL/Relations/Relation_EnginePipelineRow_Cell_EnginePipelineCell_Row.qbl
new file mode 100644
index 0000000..982e533
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineRow_Cell_EnginePipelineCell_Row.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineRow_Cell_EnginePipelineCell_Row
+{
+  #keys: '1[415136.0.883590141]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Cell
+  {
+    #keys: '3[415136.0.883590143][415136.0.883590142][415136.0.883590144]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Row
+  {
+    #keys: '3[415136.0.883590146][415136.0.883590145][415136.0.883590147]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineSource_MacroPlan_MacroPlan_EnginePipelineSource.qbl b/_Main/BL/Relations/Relation_EnginePipelineSource_MacroPlan_MacroPlan_EnginePipelineSource.qbl
new file mode 100644
index 0000000..b290f6b
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineSource_MacroPlan_MacroPlan_EnginePipelineSource.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineSource_MacroPlan_MacroPlan_EnginePipelineSource
+{
+  #keys: '1[415136.0.883574775]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[415136.0.883574777][415136.0.883574776][415136.0.883574778]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineSource
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide EnginePipelineSource
+  {
+    #keys: '3[415136.0.883574780][415136.0.883574779][415136.0.883574781]'
+    Cardinality: '0to1'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineSource_Report_EnginePipelineReport_Source.qbl b/_Main/BL/Relations/Relation_EnginePipelineSource_Report_EnginePipelineReport_Source.qbl
new file mode 100644
index 0000000..6200815
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineSource_Report_EnginePipelineReport_Source.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineSource_Report_EnginePipelineReport_Source
+{
+  #keys: '1[415136.0.883590029]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Report
+  {
+    #keys: '3[415136.0.883590031][415136.0.883590030][415136.0.883590032]'
+    Cardinality: '1toN'
+    ObjectDefinition: EnginePipelineSource
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Source
+  {
+    #keys: '3[415136.0.883590034][415136.0.883590033][415136.0.883590035]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineReport
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_EnginePipelineSource_Search_EnginePipelineSearch_Source.qbl b/_Main/BL/Relations/Relation_EnginePipelineSource_Search_EnginePipelineSearch_Source.qbl
new file mode 100644
index 0000000..0c057e3
--- /dev/null
+++ b/_Main/BL/Relations/Relation_EnginePipelineSource_Search_EnginePipelineSearch_Source.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation EnginePipelineSource_Search_EnginePipelineSearch_Source
+{
+  #keys: '1[415136.0.883574788]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Search
+  {
+    #keys: '3[415136.0.883574790][415136.0.883574789][415136.0.883574791]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineSource
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide Source
+  {
+    #keys: '3[415136.0.883574793][415136.0.883574792][415136.0.883574794]'
+    Cardinality: '0to1'
+    ObjectDefinition: EnginePipelineSearch
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineCell_Column_MachiningPipelineColumn_Cell.qbl b/_Main/BL/Relations/Relation_MachiningPipelineCell_Column_MachiningPipelineColumn_Cell.qbl
new file mode 100644
index 0000000..1e560cf
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineCell_Column_MachiningPipelineColumn_Cell.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineCell_Column_MachiningPipelineColumn_Cell
+{
+  #keys: '1[415136.0.894469828]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.894469847][415136.0.894469841][415136.0.894469848][415136.0.894469842][415136.0.894469849][415136.0.894469843][415136.0.894469850][415136.0.894469844][415136.0.894469851][415136.0.894469845][415136.0.894469852][415136.0.894469846]'
+    SequenceElementSuffix: 'CellInColumn'
+    SequenceSuffix: 'CellInColumn'
+  }
+  RelationSide.LeftSide Column
+  {
+    #keys: '3[415136.0.894469830][415136.0.894469829][415136.0.894469831]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Cell
+  {
+    #keys: '3[415136.0.894469833][415136.0.894469832][415136.0.894469834]'
+    Cardinality: '1toN'
+    ObjectDefinition: MachiningPipelineColumn
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineCell_Row_MachiningPipelineRow_Cell.qbl b/_Main/BL/Relations/Relation_MachiningPipelineCell_Row_MachiningPipelineRow_Cell.qbl
new file mode 100644
index 0000000..4c63725
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineCell_Row_MachiningPipelineRow_Cell.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineCell_Row_MachiningPipelineRow_Cell
+{
+  #keys: '1[415136.0.894469858]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Row
+  {
+    #keys: '3[415136.0.894469860][415136.0.894469859][415136.0.894469861]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Cell
+  {
+    #keys: '3[415136.0.894469863][415136.0.894469862][415136.0.894469864]'
+    Cardinality: '1toN'
+    ObjectDefinition: MachiningPipelineRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineColumn_Report_MachiningPipelineReport_Column.qbl b/_Main/BL/Relations/Relation_MachiningPipelineColumn_Report_MachiningPipelineReport_Column.qbl
new file mode 100644
index 0000000..a228ebb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineColumn_Report_MachiningPipelineReport_Column.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineColumn_Report_MachiningPipelineReport_Column
+{
+  #keys: '1[415136.0.894481255]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][415136.0.894481277][415136.0.894481271][415136.0.894481278][415136.0.894481272][415136.0.894481279][415136.0.894481273][415136.0.894481280][415136.0.894481274][415136.0.894481281][415136.0.894481275][415136.0.894481282][415136.0.894481276]'
+    SequenceElementSuffix: 'Column'
+    SequenceSuffix: 'Column'
+  }
+  RelationSide.LeftSide Report
+  {
+    #keys: '3[415136.0.894481257][415136.0.894481256][415136.0.894481258]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Column
+  {
+    #keys: '3[415136.0.894481260][415136.0.894481259][415136.0.894481261]'
+    Cardinality: '1toN'
+    ObjectDefinition: MachiningPipelineReport
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineReport_Source_MachiningPipelineSource_Report.qbl b/_Main/BL/Relations/Relation_MachiningPipelineReport_Source_MachiningPipelineSource_Report.qbl
new file mode 100644
index 0000000..718c40e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineReport_Source_MachiningPipelineSource_Report.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineReport_Source_MachiningPipelineSource_Report
+{
+  #keys: '1[415136.0.894481242]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Source
+  {
+    #keys: '3[415136.0.894481244][415136.0.894481243][415136.0.894481245]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineReport
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Report
+  {
+    #keys: '3[415136.0.894481247][415136.0.894481246][415136.0.894481248]'
+    Cardinality: '1toN'
+    ObjectDefinition: MachiningPipelineSource
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineRow_Report_MachiningPipelineReport_Row.qbl b/_Main/BL/Relations/Relation_MachiningPipelineRow_Report_MachiningPipelineReport_Row.qbl
new file mode 100644
index 0000000..d5c63be
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineRow_Report_MachiningPipelineReport_Row.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineRow_Report_MachiningPipelineReport_Row
+{
+  #keys: '1[415136.0.894481229]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Report
+  {
+    #keys: '3[415136.0.894481231][415136.0.894481230][415136.0.894481232]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Row
+  {
+    #keys: '3[415136.0.894481234][415136.0.894481233][415136.0.894481235]'
+    Cardinality: '1toN'
+    ObjectDefinition: MachiningPipelineReport
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineSearch_Source_MachiningPipelineSource_Search.qbl b/_Main/BL/Relations/Relation_MachiningPipelineSearch_Source_MachiningPipelineSource_Search.qbl
new file mode 100644
index 0000000..08a3ddc
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineSearch_Source_MachiningPipelineSource_Search.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineSearch_Source_MachiningPipelineSource_Search
+{
+  #keys: '1[415136.0.894481216]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Source
+  {
+    #keys: '3[415136.0.894481218][415136.0.894481217][415136.0.894481219]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineSearch
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Search
+  {
+    #keys: '3[415136.0.894481221][415136.0.894481220][415136.0.894481222]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineSource
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachiningPipelineSource_MacroPlan_MacroPlan_MachiningPipelineSource.qbl b/_Main/BL/Relations/Relation_MachiningPipelineSource_MacroPlan_MacroPlan_MachiningPipelineSource.qbl
new file mode 100644
index 0000000..5fe270c
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachiningPipelineSource_MacroPlan_MacroPlan_MachiningPipelineSource.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachiningPipelineSource_MacroPlan_MacroPlan_MachiningPipelineSource
+{
+  #keys: '1[415136.0.894481203]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[415136.0.894481205][415136.0.894481204][415136.0.894481206]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachiningPipelineSource
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MachiningPipelineSource
+  {
+    #keys: '3[415136.0.894481208][415136.0.894481207][415136.0.894481209]'
+    Cardinality: '0to1'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl b/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl
new file mode 100644
index 0000000..3d83fd5
--- /dev/null
+++ b/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetSalary (
+  const Unit owner,
+  const OvertimeMultiplier overtimeMutiplier,
+  Real overtime
+) const as Real
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    value := 0.0;
+    salaryByEmployeeTypeTree := NamedValueTree::Create();
+    traverse( owner,EmployeeCost,cost ){
+      salaryByEmployeeTypeHandle := salaryByEmployeeTypeTree.GetHandle( cost.EmployeeType().Name() );
+      salary := guard( salaryByEmployeeTypeTree.Root().Child( salaryByEmployeeTypeHandle ),null( NamedValue ));
+      // 浜х嚎浜哄憳绫诲埆1*浜烘暟*鍩烘湰宸ヨ祫1/21.75/8*宸ヤ綔鏃ュ姞鐝椂闀�*鍊嶇巼1
+      temp_salary := cost.EmployeeNumber() * cost.BaseSalary() / owner.MacroPlan().StandardWorkingDay() / 8 * overtime * overtimeMutiplier.Multiplier();
+      if( not isnull( salary )){
+        salary.SetValue( salary.GetValueAsReal() + temp_salary );
+      }else{
+        salaryByEmployeeTypeTree.Root().AddChild( salaryByEmployeeTypeHandle,temp_salary );
+      }
+      value := value + temp_salary;
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Attribute_DemandQuantity.qbl b/_Main/BL/Type_EnginePipelineCell/Attribute_DemandQuantity.qbl
new file mode 100644
index 0000000..d4578fa
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Attribute_DemandQuantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DemandQuantity
+{
+  #keys: '3[415136.0.883574849][415136.0.883574848][415136.0.883574850]'
+  Description: '闇�姹�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Attribute_InventoryQuantity.qbl b/_Main/BL/Type_EnginePipelineCell/Attribute_InventoryQuantity.qbl
new file mode 100644
index 0000000..a27f3e7
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Attribute_InventoryQuantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InventoryQuantity
+{
+  #keys: '3[415136.0.883574836][415136.0.883574835][415136.0.883574837]'
+  Description: '搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Attribute_ProductionQuantity.qbl b/_Main/BL/Type_EnginePipelineCell/Attribute_ProductionQuantity.qbl
new file mode 100644
index 0000000..7c57b40
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Attribute_ProductionQuantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionQuantity
+{
+  #keys: '3[415136.0.883574826][415136.0.883574825][415136.0.883574827]'
+  Description: '鐢熶骇'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Function_CalcDemandQuantity.qbl b/_Main/BL/Type_EnginePipelineCell/Function_CalcDemandQuantity.qbl
new file mode 100644
index 0000000..cdcad31
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Function_CalcDemandQuantity.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcDemandQuantity
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-9-2024 (created)
+    
+    value := sum( this, Demand, demand, demand.Quantity() );
+    
+    this.DemandQuantity( value );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Function_CalcProductionQuantity.qbl b/_Main/BL/Type_EnginePipelineCell/Function_CalcProductionQuantity.qbl
new file mode 100644
index 0000000..a69638d
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Function_CalcProductionQuantity.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcProductionQuantity
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-9-2024 (created)
+    production := this.Production();
+    value      := [Real]0;
+    if( not isnull( production ) ){
+      value    := production.CCProduction() + production.DLProduction();
+    }
+    
+    this.ProductionQuantity( value );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/Method_Copy.qbl b/_Main/BL/Type_EnginePipelineCell/Method_Copy.qbl
new file mode 100644
index 0000000..a110f23
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/Method_Copy.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method Copy (
+  EnginePipelineColumn column
+) as EnginePipelineCell
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-9-2024 (created)
+    cell := column.Cell( relnew, InventoryQuantity := this.InventoryQuantity() );
+    
+    traverse( this, Demand, demand ){
+      cell.Demand( relnew, EngineType := demand.EngineType(), Model := demand.Model(), Period := demand.Period(), Quantity := demand.Quantity() );
+    }
+    production := this.Production();
+    cell.Production( relnew, EngineType := production.EngineType(), Period := production.Period(), DLProduction := production.DLProduction(), CCProduction := production.CCProduction() );
+    return cell;
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineCell/_ROOT_Type_EnginePipelineCell.qbl b/_Main/BL/Type_EnginePipelineCell/_ROOT_Type_EnginePipelineCell.qbl
new file mode 100644
index 0000000..e383691
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCell/_ROOT_Type_EnginePipelineCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineCell
+{
+  #keys: '5[415136.0.883574656][415136.0.883574654][0.0.0][415136.0.883574655][415136.0.883574657]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎姤琛ㄥ崟鍏冩牸'
+  StructuredName: 'EnginePipelineCells'
+}
diff --git a/_Main/BL/Type_EnginePipelineCellValue/Attribute_Value.qbl b/_Main/BL/Type_EnginePipelineCellValue/Attribute_Value.qbl
new file mode 100644
index 0000000..2483b7c
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCellValue/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[415136.0.886711654][415136.0.886711653][415136.0.886711655]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineCellValue/DefaultValue_Value.qbl b/_Main/BL/Type_EnginePipelineCellValue/DefaultValue_Value.qbl
new file mode 100644
index 0000000..913414b
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCellValue/DefaultValue_Value.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Value
+}
diff --git a/_Main/BL/Type_EnginePipelineCellValue/_ROOT_Type_EnginePipelineCellValue.qbl b/_Main/BL/Type_EnginePipelineCellValue/_ROOT_Type_EnginePipelineCellValue.qbl
new file mode 100644
index 0000000..27cb759
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineCellValue/_ROOT_Type_EnginePipelineCellValue.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineCellValue
+{
+  #keys: '5[415136.0.886711642][415136.0.886711640][0.0.0][415136.0.886711641][415136.0.886711643]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎姤琛ㄦ樉绀哄崟鍏冩牸'
+  StructuredName: 'EnginePipelineCellValues'
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/Attribute_Index.qbl b/_Main/BL/Type_EnginePipelineColumn/Attribute_Index.qbl
new file mode 100644
index 0000000..d5d3ac9
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415136.0.883574675][415136.0.883574674][415136.0.883574676]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/Attribute_Name.qbl b/_Main/BL/Type_EnginePipelineColumn/Attribute_Name.qbl
new file mode 100644
index 0000000..e3025ae
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.883574678][415136.0.883574677][415136.0.883574679]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/Attribute_Period.qbl b/_Main/BL/Type_EnginePipelineColumn/Attribute_Period.qbl
new file mode 100644
index 0000000..b07e6fa
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/Attribute_Period.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.883574681][415136.0.883574680][415136.0.883574682]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/Attribute_TimeUnit.qbl b/_Main/BL/Type_EnginePipelineColumn/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..b1c79f5
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/Attribute_TimeUnit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[415136.0.883590099][415136.0.883590098][415136.0.883590100]'
+  Description: '鏃ユ湡绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/DefaultValue_Name.qbl b/_Main/BL/Type_EnginePipelineColumn/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/Function_CalcIndex.qbl b/_Main/BL/Type_EnginePipelineColumn/Function_CalcIndex.qbl
new file mode 100644
index 0000000..56bbf20
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/Function_CalcIndex.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-21-2024 (created)
+    
+    value := ifexpr( isnull( this.PreviousColumn() ), 0, this.PreviousColumn().Index() + 1 );
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineColumn/_ROOT_Type_EnginePipelineColumn.qbl b/_Main/BL/Type_EnginePipelineColumn/_ROOT_Type_EnginePipelineColumn.qbl
new file mode 100644
index 0000000..e4e61c9
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineColumn/_ROOT_Type_EnginePipelineColumn.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineColumn
+{
+  #keys: '5[415136.0.883574672][415136.0.883574670][0.0.0][415136.0.883574671][415136.0.883574673]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎姤琛ㄥ垪'
+  StructuredName: 'EnginePipelineColumns'
+}
diff --git a/_Main/BL/Type_EnginePipelineDemand/Attribute_EngineType.qbl b/_Main/BL/Type_EnginePipelineDemand/Attribute_EngineType.qbl
new file mode 100644
index 0000000..9f3f1a2
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineDemand/Attribute_EngineType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineType
+{
+  #keys: '3[415136.0.883590198][415136.0.883590197][415136.0.883590199]'
+  Description: '鍙戝姩鏈哄瀷鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineDemand/Attribute_Model.qbl b/_Main/BL/Type_EnginePipelineDemand/Attribute_Model.qbl
new file mode 100644
index 0000000..cc2d581
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineDemand/Attribute_Model.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Model
+{
+  #keys: '3[415136.0.883590218][415136.0.883590217][415136.0.883590219]'
+  Description: '杞﹀瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineDemand/Attribute_Period.qbl b/_Main/BL/Type_EnginePipelineDemand/Attribute_Period.qbl
new file mode 100644
index 0000000..c840b66
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineDemand/Attribute_Period.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.883590208][415136.0.883590207][415136.0.883590209]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_EnginePipelineDemand/Attribute_Quantity.qbl b/_Main/BL/Type_EnginePipelineDemand/Attribute_Quantity.qbl
new file mode 100644
index 0000000..b4fa560
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineDemand/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[415136.0.883590228][415136.0.883590227][415136.0.883590229]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineDemand/_ROOT_Type_EnginePipelineDemand.qbl b/_Main/BL/Type_EnginePipelineDemand/_ROOT_Type_EnginePipelineDemand.qbl
new file mode 100644
index 0000000..dce6c57
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineDemand/_ROOT_Type_EnginePipelineDemand.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineDemand
+{
+  #keys: '5[415136.0.883574869][415136.0.883574867][0.0.0][415136.0.883574868][415136.0.883574870]'
+  BaseType: Object
+  Description: '闇�姹傚瓙琛�'
+  StructuredName: 'EnginePipelineDemands'
+}
diff --git a/_Main/BL/Type_EnginePipelineProduction/Attribute_CCProduction.qbl b/_Main/BL/Type_EnginePipelineProduction/Attribute_CCProduction.qbl
new file mode 100644
index 0000000..39d886d
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineProduction/Attribute_CCProduction.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCProduction
+{
+  #keys: '3[415136.0.883590169][415136.0.883590168][415136.0.883590170]'
+  Description: '闀挎槬浜ч噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineProduction/Attribute_DLProduction.qbl b/_Main/BL/Type_EnginePipelineProduction/Attribute_DLProduction.qbl
new file mode 100644
index 0000000..a9bbcfd
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineProduction/Attribute_DLProduction.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLProduction
+{
+  #keys: '3[415136.0.883574893][415136.0.883574892][415136.0.883574894]'
+  Description: '澶ц繛浜ч噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_EnginePipelineProduction/Attribute_EngineType.qbl b/_Main/BL/Type_EnginePipelineProduction/Attribute_EngineType.qbl
new file mode 100644
index 0000000..9c97d29
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineProduction/Attribute_EngineType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineType
+{
+  #keys: '3[415136.0.883574873][415136.0.883574872][415136.0.883574874]'
+  Description: '鍙戝姩鏈哄瀷鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineProduction/Attribute_Period.qbl b/_Main/BL/Type_EnginePipelineProduction/Attribute_Period.qbl
new file mode 100644
index 0000000..5205478
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineProduction/Attribute_Period.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.883574883][415136.0.883574882][415136.0.883574884]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_EnginePipelineProduction/_ROOT_Type_EnginePipelineProduction.qbl b/_Main/BL/Type_EnginePipelineProduction/_ROOT_Type_EnginePipelineProduction.qbl
new file mode 100644
index 0000000..4fd698c
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineProduction/_ROOT_Type_EnginePipelineProduction.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineProduction
+{
+  #keys: '5[415136.0.883574864][415136.0.883574862][0.0.0][415136.0.883574863][415136.0.883574865]'
+  BaseType: Object
+  Description: '鐢熶骇瀛愯〃'
+  StructuredName: 'EnginePipelineProductions'
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Attribute_ID.qbl b/_Main/BL/Type_EnginePipelineReport/Attribute_ID.qbl
new file mode 100644
index 0000000..7e0420a
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.883574713][415136.0.883574712][415136.0.883574714]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Attribute_IsShow.qbl b/_Main/BL/Type_EnginePipelineReport/Attribute_IsShow.qbl
new file mode 100644
index 0000000..437a25d
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Attribute_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsShow
+{
+  #keys: '3[415136.0.883574719][415136.0.883574718][415136.0.883574720]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Attribute_Name.qbl b/_Main/BL/Type_EnginePipelineReport/Attribute_Name.qbl
new file mode 100644
index 0000000..aa6d530
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.883574722][415136.0.883574721][415136.0.883574723]'
+  Description: '鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/DefaultValue_ID.qbl b/_Main/BL/Type_EnginePipelineReport/DefaultValue_ID.qbl
new file mode 100644
index 0000000..049abc0
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/DefaultValue_ID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ID
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/DefaultValue_Name.qbl b/_Main/BL/Type_EnginePipelineReport/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Method_Clear.qbl b/_Main/BL/Type_EnginePipelineReport/Method_Clear.qbl
new file mode 100644
index 0000000..345583b
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Method_Clear.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method Clear (
+  String timeunit,
+  Date startdate,
+  Date enddate
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    this.Column( relflush );
+    this.Row( relflush );
+    this.Column( relnew, Name := '', TimeUnit := timeunit );
+    this.Column( relnew, Name := '', TimeUnit := timeunit );
+    this.GenerateColumn( this.Source().MacroPlan(), timeunit, startdate, enddate );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Method_Generate.qbl b/_Main/BL/Type_EnginePipelineReport/Method_Generate.qbl
new file mode 100644
index 0000000..846f44a
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Method_Generate.qbl
@@ -0,0 +1,150 @@
+Quintiq file version 2.0
+#parent: #root
+Method Generate (
+  EnginePipelineSearch search,
+  Product_MPs products
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    table                   := selectobject( this, Source.Report, report, not report.IsShow() );
+    
+    //娓呯┖涔嬪墠瀛樺偍鐨勬樉绀烘暟鎹�
+    this.Clear( search.TimeUnit(), search.StartDate(), search.EndDate() );
+    Transaction::Transaction().Propagate( attribute( EnginePipelineColumn, Index ) );
+    Transaction::Transaction().Propagate( attribute( EnginePipelineCell, ProductionQuantity ) );
+    Transaction::Transaction().Propagate( attribute( EnginePipelineCell, DemandQuantity ) );
+    //杩囨护鍚庣殑浜у搧id
+    productids              := selectuniquevalues( products, Elements, product, true, product.ID() );
+    rows                    := selectsortedset( table, Row, row, row.RowNr() );
+    //鏄剧ず鍒�
+    productcolumn           := selectobject( this, Column, column, column.Index() = 0 );
+    attricolumn             := selectobject( this, Column, column, column.Index() = 1 );
+    models                  := selectuniquevalues( table, Column.Cell.Demand, demand, demand.Model() );
+    cellnr                  := 5 + models.Size();
+    //鍚堣琛�
+    sumrowproduction        := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '鐢熶骇', rows.Size() * cellnr, true );
+    sumrowdlproduction      := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '澶ц繛浜ч噺', sumrowproduction.RowNr() + 1, false );
+    sumrowccproduction      := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '闀挎槬浜ч噺', sumrowproduction.RowNr() + 2, false );
+    sumrowdemand            := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '闇�姹�', sumrowproduction.RowNr() + 3, false );
+    rowno                   := sumrowproduction.RowNr() + 4;
+    traverse( models, Elements, model ){
+      EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', model, rowno, false ); 
+      rowno                 := rowno + 1;
+    }
+    sumrowinventory         := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '搴撳瓨', rowno, false );
+    
+    //琛岃鏁�
+    rownr                   := 0;
+    traverse( rows, Elements, row, productids.Find( row.Name() ) >= 0 ){
+    
+      showrowproduction   := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '鐢熶骇', rownr, true );;
+      showrowdlproduction := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '澶ц繛浜ч噺', rownr + 1, false );
+      showrowccproduction := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '闀挎槬浜ч噺', rownr + 2, false );
+      showrowdemand       := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '闇�姹�', rownr + 3, false );
+      rownr               := rownr + 4;
+      traverse( models, Elements, model ){
+        EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), model, rownr, false ); 
+        rownr             := rownr + 1;
+      }
+      showrowinventory    :=  EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '搴撳瓨', rownr, false );
+    
+      traverse( row, Cell, cell, cell.Column().TimeUnit() = search.TimeUnit() ){
+    
+        column            := selectobject( this, Column, column, column.Name() = cell.Column().Name() and column.TimeUnit() = search.TimeUnit() );
+        
+        if( not isnull( column ) ){
+          
+          //鐢熶骇
+          production              := column.CellValue( relnew, Value := [String]cell.ProductionQuantity() );
+          showrowproduction.CellValue( relinsert, production );
+          sumproduction           := selectobject( column, CellValue, c, c.Row() = sumrowproduction );
+          if( isnull( sumproduction ) ){
+            sumproduction         := column.CellValue( relnew, Value := [String]0 );
+            sumrowproduction.CellValue( relinsert, sumproduction );
+          }
+          sumproduction.Value( [String]( [Real]sumproduction.Value() + cell.ProductionQuantity() ) );
+    
+          //澶ц繛浜ч噺
+          dlproductionquantity     := guard( cell.Production().DLProduction(), 0 );
+          dlproduction             := column.CellValue( relnew, Value := [String]dlproductionquantity );
+          showrowdlproduction.CellValue( relinsert, dlproduction );
+          sumdlproduction          := selectobject( column, CellValue, c, c.Row() = sumrowdlproduction );
+          if( isnull( sumdlproduction ) ){
+            sumdlproduction        := column.CellValue( relnew, Value := [String]0 );
+            sumrowdlproduction.CellValue( relinsert, sumdlproduction );
+          }
+          sumdlproduction.Value( [String]( [Real]sumdlproduction.Value() + dlproductionquantity ) );
+          
+          //闀挎槬浜ч噺
+          ccproductionquantity     := guard( cell.Production().CCProduction(), 0 );
+          ccproduction             := column.CellValue( relnew, Value := [String]ccproductionquantity );
+          showrowccproduction.CellValue( relinsert, ccproduction );
+          sumccproduction          := selectobject( column, CellValue, c, c.Row() = sumrowccproduction );
+          if( isnull( sumccproduction ) ){
+            sumccproduction        := column.CellValue( relnew, Value := [String]0 );
+            sumrowccproduction.CellValue( relinsert, sumccproduction );
+          }
+          sumccproduction.Value( [String]( [Real]sumccproduction.Value() + ccproductionquantity ) );
+          
+          //闇�姹�
+          totaldemand              := column.CellValue( relnew, Value := [String]cell.DemandQuantity() );
+          showrowdemand.CellValue( relinsert, totaldemand );
+          sumdemand                := selectobject( column, CellValue, c, c.Row() = sumrowdemand );
+          if( isnull( sumdemand ) ){
+            sumdemand              := column.CellValue( relnew, Value := [String]0 );
+            sumrowdemand.CellValue( relinsert, sumdemand );
+          }
+          sumdemand.Value( [String]( [Real]sumdemand.Value() + cell.DemandQuantity() ) );
+          
+          traverse( cell, Demand, demand ){
+            demandrow              := selectobject( this, Row, r, r.Name() = row.Name() and exists( r, CellValue, cv, cv.Value() = demand.Model() ) );
+            sumdemandrow           := selectobject( this, Row, r, r.Name() = 'SUM' and exists( r, CellValue, cv, cv.Value() = demand.Model() ) );
+    
+            if( not isnull( demandrow ) ){
+              demandcell             := column.CellValue( relnew, Value := [String]demand.Quantity() );
+              demandrow.CellValue( relinsert, demandcell );
+            }
+            
+            sumdemandcell          := selectobject( column, CellValue, c, c.Row() = sumdemandrow );
+            if( isnull( sumdemandcell ) ){
+              sumdemandcell        := column.CellValue( relnew, Value := [String]0 );
+              sumdemandrow.CellValue( relinsert, sumdemandcell );
+            }
+            sumdemandcell.Value( [String]( [Real]sumdemandcell.Value() + demand.Quantity() ) );
+          }
+    
+          for( demandr := showrowdemand.RowNr() + 1; demandr < showrowinventory.RowNr(); demandr := demandr + 1 ){
+            demandrow              := selectobject( this, Row, r, r.RowNr() = demandr );
+            if( not isnull( demandrow ) and not exists( demandrow, CellValue, cv, cv.Column() = column ) ){
+              demandcell           := column.CellValue( relnew, Value := '' );
+              demandrow.CellValue( relinsert, demandcell );
+            }
+          }
+    
+          
+          //搴撳瓨
+          inventory                := column.CellValue( relnew, Value := [String]cell.InventoryQuantity() );
+          showrowinventory.CellValue( relinsert, inventory );
+          suminventory             := selectobject( column, CellValue, c, c.Row() = sumrowinventory );
+          if( isnull( suminventory ) ){
+            suminventory           := column.CellValue( relnew, Value := [String]0 );
+            sumrowinventory.CellValue( relinsert, suminventory );
+          }
+          suminventory.Value( [String]( [Real]suminventory.Value() + cell.InventoryQuantity() ) );
+    
+        }
+      }
+    }
+    traverse( this, Column, column ){
+      for( demandr := sumrowdemand.RowNr() + 1; demandr < sumrowinventory.RowNr(); demandr := demandr + 1 ){
+        demandrow              := selectobject( this, Row, r, r.RowNr() = demandr );
+        if( not isnull( demandrow ) and not exists( demandrow, CellValue, cv, cv.Column() = column ) ){
+          demandcell           := column.CellValue( relnew, Value := '' );
+          demandrow.CellValue( relinsert, demandcell );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Method_GenerateColumn.qbl b/_Main/BL/Type_EnginePipelineReport/Method_GenerateColumn.qbl
new file mode 100644
index 0000000..1eba4c1
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Method_GenerateColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method GenerateColumn (
+  MacroPlan owner,
+  String timeunit,
+  Date startdate,
+  Date enddate
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    //鏌ヨ鏃ユ湡杩斿洖闇�瑕佸湪璁″垝鏃ユ湡涔嬪唴
+    traverse( owner, Period_MP, period, not period.IsHistorical() and period.StartDate() >= startdate and period.EndDate() <= enddate
+              and ( ( timeunit = 'All' and ( period.TimeUnit() = Translations::MP_GlobalParameters_Day() or period.TimeUnit() = Translations::MP_GlobalParameters_Week() ) ) 
+                    or period.TimeUnit() = timeunit ) ){
+      periodtime := period.StartDate();
+      periodname := periodtime.Format( "M2/D2/Y" );
+      
+      this.Column( relnew, Name := periodname, Period := periodtime, TimeUnit := period.TimeUnit() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/Method_GetRow.qbl b/_Main/BL/Type_EnginePipelineReport/Method_GetRow.qbl
new file mode 100644
index 0000000..e4936c2
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/Method_GetRow.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetRow (
+  String product
+) as EnginePipelineRow
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    row := selectobject( this, Row, row, row.Name() = product );
+    
+    if( isnull( row ) ){
+      row := this.Row( relnew, Name := product );
+      //鍒濆鍖栧崟鍏冩牸
+      row.InitializeCell( this );
+    }
+    
+    return row;
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultAllUnit.qbl b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultAllUnit.qbl
new file mode 100644
index 0000000..e912c3f
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultAllUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultAllUnit () const declarative as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '<All>';
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultCCUnit.qbl b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultCCUnit.qbl
new file mode 100644
index 0000000..77d1f16
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultDLUnit.qbl b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultDLUnit.qbl
new file mode 100644
index 0000000..4759121
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛';
+    //return 'Assembly Plant (Spain)';
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultName.qbl b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultName.qbl
new file mode 100644
index 0000000..2948919
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/StaticMethod_GetDefaultName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultName () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return 'Machining pipelines';
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineReport/_ROOT_Type_EnginePipelineReport.qbl b/_Main/BL/Type_EnginePipelineReport/_ROOT_Type_EnginePipelineReport.qbl
new file mode 100644
index 0000000..633e95a
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineReport/_ROOT_Type_EnginePipelineReport.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineReport
+{
+  #keys: '5[415136.0.883574710][415136.0.883574708][0.0.0][415136.0.883574709][415136.0.883574711]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎姤琛�'
+  StructuredName: 'EnginePipelineReports'
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Attribute_Name.qbl b/_Main/BL/Type_EnginePipelineRow/Attribute_Name.qbl
new file mode 100644
index 0000000..5708f85
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.883574695][415136.0.883574694][415136.0.883574696]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Attribute_RowNr.qbl b/_Main/BL/Type_EnginePipelineRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..b3b14d3
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.883574698][415136.0.883574697][415136.0.883574699]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/DefaultValue_Name.qbl b/_Main/BL/Type_EnginePipelineRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Method_Initialize.qbl b/_Main/BL/Type_EnginePipelineRow/Method_Initialize.qbl
new file mode 100644
index 0000000..d63c966
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Method_Initialize.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  EnginePipelineColumn column
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := column.Cell( relnew, InventoryQuantity := 0 );
+    
+    this.Cell( relinsert, cell );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Method_InitializeCell.qbl b/_Main/BL/Type_EnginePipelineRow/Method_InitializeCell.qbl
new file mode 100644
index 0000000..78516db
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Method_InitializeCell.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeCell (
+  EnginePipelineReport table
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    traverse( table, Column, column ){
+      this.Initialize( column );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Method_SetCellDemandValue.qbl b/_Main/BL/Type_EnginePipelineRow/Method_SetCellDemandValue.qbl
new file mode 100644
index 0000000..b1ce10b
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Method_SetCellDemandValue.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellDemandValue (
+  EnginePipelineColumn column,
+  String segment,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    demand := selectobject( cell, Demand, demand, demand.EngineType() = cell.Row().Name() and demand.Model() = segment and demand.Period() = column.Period() );
+    
+    if( isnull( demand ) ){
+      demand := cell.Demand( relnew, EngineType := cell.Row().Name(), Period := column.Period(), Model := segment, Quantity := 0 );
+    }
+    
+    demand.Quantity( demand.Quantity() + quantity );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Method_SetCellInventoryValue.qbl b/_Main/BL/Type_EnginePipelineRow/Method_SetCellInventoryValue.qbl
new file mode 100644
index 0000000..d72aa93
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Method_SetCellInventoryValue.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellInventoryValue (
+  EnginePipelineColumn column,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    cell.InventoryQuantity( cell.InventoryQuantity() + quantity );
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/Method_SetCellProductionValue.qbl b/_Main/BL/Type_EnginePipelineRow/Method_SetCellProductionValue.qbl
new file mode 100644
index 0000000..fbe0391
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/Method_SetCellProductionValue.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellProductionValue (
+  EnginePipelineColumn column,
+  String unit,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    production := cell.Production();
+    
+    if( isnull( production ) ){
+      production := cell.Production( relnew, EngineType := cell.Row().Name(), Period := column.Period(), DLProduction := 0, CCProduction := 0 );
+    }
+    
+    if( unit = EnginePipelineReport::GetDefaultCCUnit() ){
+      production.CCProduction( production.CCProduction() + quantity );
+    }else if( unit = EnginePipelineReport::GetDefaultDLUnit() ){
+      production.DLProduction( production.DLProduction() + quantity );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/StaticMethod_CraeteCellValueForRow.qbl b/_Main/BL/Type_EnginePipelineRow/StaticMethod_CraeteCellValueForRow.qbl
new file mode 100644
index 0000000..bef755c
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/StaticMethod_CraeteCellValueForRow.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CraeteCellValueForRow (
+  EnginePipelineReport table,
+  EnginePipelineColumn productcolumn,
+  EnginePipelineColumn attricolumn,
+  String productname,
+  String attriname,
+  Number rownr,
+  Boolean isfirst
+) as EnginePipelineRow
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-11-2024 (created)
+    row           := table.Row( relnew, Name := productname, RowNr := rownr );
+    if( not isfirst ){
+      productname := '';
+    }
+    pcell         := productcolumn.CellValue( relnew, Value := productname );
+    acell         := attricolumn.CellValue( relnew, Value := attriname );
+    row.CellValue( relinsert, pcell );
+    row.CellValue( relinsert, acell );
+    return row;
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineRow/_ROOT_Type_EnginePipelineRow.qbl b/_Main/BL/Type_EnginePipelineRow/_ROOT_Type_EnginePipelineRow.qbl
new file mode 100644
index 0000000..7316365
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineRow/_ROOT_Type_EnginePipelineRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineRow
+{
+  #keys: '5[415136.0.883574689][415136.0.883574687][0.0.0][415136.0.883574688][415136.0.883574690]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾胯'
+  StructuredName: 'EnginePipelineRows'
+}
diff --git a/_Main/BL/Type_EnginePipelineSearch/Attribute_EndDate.qbl b/_Main/BL/Type_EnginePipelineSearch/Attribute_EndDate.qbl
new file mode 100644
index 0000000..31562fa
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSearch/Attribute_EndDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndDate
+{
+  #keys: '3[415136.0.883574814][415136.0.883574813][415136.0.883574815]'
+  Description: '缁撴潫鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_EnginePipelineSearch/Attribute_StartDate.qbl b/_Main/BL/Type_EnginePipelineSearch/Attribute_StartDate.qbl
new file mode 100644
index 0000000..89459da
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSearch/Attribute_StartDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[415136.0.883574802][415136.0.883574801][415136.0.883574803]'
+  Description: '寮�濮嬫椂闂�'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_EnginePipelineSearch/Attribute_TimeUnit.qbl b/_Main/BL/Type_EnginePipelineSearch/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..a246ec7
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSearch/Attribute_TimeUnit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[415136.0.883590020][415136.0.883590019][415136.0.883590021]'
+  Description: '鏃ユ湡绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineSearch/_ROOT_Type_EnginePipelineSearch.qbl b/_Main/BL/Type_EnginePipelineSearch/_ROOT_Type_EnginePipelineSearch.qbl
new file mode 100644
index 0000000..359f4a5
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSearch/_ROOT_Type_EnginePipelineSearch.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineSearch
+{
+  #keys: '5[415136.0.883574730][415136.0.883574728][0.0.0][415136.0.883574729][415136.0.883574731]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎煡璇㈢被'
+  StructuredName: 'EnginePipelineSearchs'
+}
diff --git a/_Main/BL/Type_EnginePipelineSource/Attribute_Name.qbl b/_Main/BL/Type_EnginePipelineSource/Attribute_Name.qbl
new file mode 100644
index 0000000..15c082a
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.883574762][415136.0.883574761][415136.0.883574763]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_EnginePipelineSource/DefaultValue_Name.qbl b/_Main/BL/Type_EnginePipelineSource/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_EnginePipelineSource/StaticMethod_Download.qbl b/_Main/BL/Type_EnginePipelineSource/StaticMethod_Download.qbl
new file mode 100644
index 0000000..b611c42
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/StaticMethod_Download.qbl
@@ -0,0 +1,55 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  Description: '涓嬭浇鍙戝姩鏈虹绾挎暟鎹�'
+  TextBody:
+  [*
+    
+    table := selectobject( macroPlan, EnginePipelineSource.Report, table, table.IsShow() );
+    
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    traverse ( table, Column, column ) {
+      columnelement := xmlDOM.CreateElement( "column" );
+      nameelement   := xmlDOM.CreateElement( "name" );
+      typeelement   := xmlDOM.CreateElement( "type" );
+      if( column.Index() = 0 ){
+        nameelement.TextContent( 'Product' );
+      }else if( column.Index() = 1 ){
+        nameelement.TextContent( 'Attribute' );
+      }else{
+        nameelement.TextContent( column.Name() );
+      }
+      typeelement.TextContent( "String" );
+      columnelement.AppendChild( nameelement );
+      columnelement.AppendChild( typeelement );
+      
+      cells := selectsortedset( column, CellValue, cell, cell.Row().RowNr() );
+    
+      traverse ( cells, Elements, c ) {
+        cellElement := xmlDOM.CreateElement( "cell" );
+        cellElement.SetAttribute( "value", c.Value() );
+        columnelement.AppendChild( cellElement );
+      }
+      tableElement.AppendChild( columnelement );  
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM );
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( EnginePipelineReport::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_EnginePipelineSource/StaticMethod_Initialize.qbl b/_Main/BL/Type_EnginePipelineSource/StaticMethod_Initialize.qbl
new file mode 100644
index 0000000..9d263fc
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/StaticMethod_Initialize.qbl
@@ -0,0 +1,73 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Initialize (
+  MacroPlan owner
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    owner.EnginePipelineSource( relflush );
+    ccunit                    := EnginePipelineReport::GetDefaultCCUnit();
+    dlunit                    := EnginePipelineReport::GetDefaultDLUnit();
+    //allunit                   := EnginePipelineReport::GetDefaultAllUnit();
+    source                    := owner.EnginePipelineSource( relnew, Name := EnginePipelineReport::GetDefaultName() );
+    table                     := source.Report( relnew, ID := source.Name(), Name := source.Name() );
+    showtable                 := source.Report( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsShow := true );
+    
+    search                    := source.Search( relnew, StartDate := Date::MinDate(), EndDate := Date::MaxDate(), TimeUnit := Translations::MP_GlobalParameters_Day() );
+    
+    products                  := construct( Product_MPs );
+    //鍒濆鍖栧垪
+    table.GenerateColumn( owner, 'All', search.StartDate(), search.EndDate() );
+    
+    //鐢熸垚鐢熶骇鍜屽簱瀛樻暟鎹�
+    traverse( owner, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() ){
+      unit := pisp.StockingPoint_MP().UnitID();
+    //  info( unit, pisp.ProductID() );
+      //鍒濆鍖栬
+      row := table.GetRow( pisp.ProductID() );
+      
+      traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical()
+                and ( pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() 
+                      or pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Week() ) ){
+        periodtime := pispip.Period_MP().StartDate();
+        periodname := periodtime.Format( "M2/D2/Y" );
+    //    info( '---------------------------------', periodtime, table.Column( relsize ), pispip.Period_MP().TimeUnit() );
+        column := selectobject( table, Column, column, column.Name() = periodname and column.Period() = periodtime and column.TimeUnit() = pispip.Period_MP().TimeUnit() );
+    //    info( '---------------------------------', isnull( column ), isnull( row ) );
+    //    info( '---------------------------------', column.Name(), row.Name() );
+        if( unit = ccunit or unit = dlunit ){
+          row.SetCellProductionValue( column, unit, pispip.NewSupplyProductionQuantity() );
+        }
+        row.SetCellInventoryValue( column, pispip.PlannedInventoryLevelEnd() );
+      }
+    }
+    
+    //鐢熸垚闇�姹傛暟鎹�
+    traverse( owner, SalesDemand.astype( Forecast ), forecast, ( forecast.EndDate() - forecast.StartDate() ) < 8){
+      row := table.GetRow( forecast.ProductID() );
+      weekdate   := ( forecast.StartDate() - Duration::Days( 7 ) ).Date();
+      periodtime := forecast.StartDate();
+      periodname := periodtime.Format( "M2/D2/Y" );
+      
+      column := selectobject( table, Column, column, column.Name() = periodname and column.Period() = periodtime and column.TimeUnit() = Translations::MP_GlobalParameters_Day() );
+      weekcolumn := minobject( table, Column, wcolumn, wcolumn.Period() <= weekdate and wcolumn.TimeUnit() = Translations::MP_GlobalParameters_Week(), wcolumn.Period() );
+      
+      if( not isnull( column ) ){
+        row.SetCellDemandValue( column, forecast.SalesSegmentName(), forecast.Quantity() );
+      }
+      
+      if( not isnull( weekcolumn ) ){
+        row.SetCellDemandValue( weekcolumn, forecast.SalesSegmentName(), forecast.Quantity() );
+      }
+    }
+    rows := selectsortedset( table, Row, 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_EnginePipelineSource/_ROOT_Type_EnginePipelineSource.qbl b/_Main/BL/Type_EnginePipelineSource/_ROOT_Type_EnginePipelineSource.qbl
new file mode 100644
index 0000000..ba748aa
--- /dev/null
+++ b/_Main/BL/Type_EnginePipelineSource/_ROOT_Type_EnginePipelineSource.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type EnginePipelineSource
+{
+  #keys: '5[415136.0.883574750][415136.0.883574748][0.0.0][415136.0.883574749][415136.0.883574751]'
+  BaseType: Object
+  Description: '鍙戝姩鏈虹绾挎姤琛�'
+  StructuredName: 'EnginePipelineSources'
+}
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl b/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
index f2bc208..0fc5d8b 100644
--- a/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
+++ b/_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
@@ -33,14 +33,16 @@
           traverse( row, InventorySummaryCell, cell, cell.InventorySummaryColumn().TimeUnit() = search.Category() ){
             column   := selectobject( this, InventorySummaryColumn, column, column.Name() = cell.InventorySummaryColumn().Name() );
             
-            sumcell  := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
-            
-            showcell := column.InventorySummaryCell( relnew, EndingInventory := cell.EndingInventory(), MinimumInventory := cell.MinimumInventory(), MaximumInventory := cell.MaximumInventory(), AverageInventory := cell.AverageInventory() );
-            showrow.InventorySummaryCell( relinsert, showcell );
-            sumcell.EndingInventory( sumcell.EndingInventory() + cell.EndingInventory() );
-            sumcell.MinimumInventory( sumcell.MinimumInventory() + cell.MinimumInventory() );
-            sumcell.MaximumInventory( sumcell.MaximumInventory() + cell.MaximumInventory() );
-            sumcell.AverageInventory( sumcell.AverageInventory() + cell.AverageInventory() );
+            if( not isnull( column ) ){
+              sumcell  := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
+              
+              showcell := column.InventorySummaryCell( relnew, EndingInventory := cell.EndingInventory(), MinimumInventory := cell.MinimumInventory(), MaximumInventory := cell.MaximumInventory(), AverageInventory := cell.AverageInventory() );
+              showrow.InventorySummaryCell( relinsert, showcell );
+              sumcell.EndingInventory( sumcell.EndingInventory() + cell.EndingInventory() );
+              sumcell.MinimumInventory( sumcell.MinimumInventory() + cell.MinimumInventory() );
+              sumcell.MaximumInventory( sumcell.MaximumInventory() + cell.MaximumInventory() );
+              sumcell.AverageInventory( sumcell.AverageInventory() + cell.AverageInventory() );
+            }
           }
         }
       }
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl b/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl
index 1b7156e..8bdba43 100644
--- a/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl
+++ b/_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl
@@ -21,28 +21,28 @@
       if( endtime > startofendyear ){
         endtime := startofendyear;
       }
-    for( start := starttime; start <= endtime; start := start.StartOfNextDay() ){
-      periodtime := start.Date();
-      periodname := periodtime.Format( "M2/D2/Y" );
-      
-      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Day() ){
-        this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Day() );
-      }
-      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Week() ){
-        weekend := ( start.StartOfNextWeek() - Duration::Days( 1 ) ).Date();
+      for( start := starttime; start <= endtime; start := start.StartOfNextDay() ){
+        periodtime := start.Date();
+        periodname := periodtime.Format( "M2/D2/Y" );
         
-        if( periodtime = weekend ){
-          this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Week() );
+        if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Day() ){
+          this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Day() );
+        }
+        if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Week() ){
+          weekend := ( start.StartOfNextWeek() - Duration::Days( 1 ) ).Date();
+          
+          if( periodtime = weekend ){
+            this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Week() );
+          }
+        }
+        if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Month() ){
+          monthend := ( start.StartOfNextMonth() - Duration::Days( 1 ) ).Date();
+          
+          if( periodtime = monthend ){
+            this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Month() );
+          }
         }
       }
-      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Month() ){
-        monthend := ( start.StartOfNextMonth() - Duration::Days( 1 ) ).Date();
-        
-        if( periodtime = monthend ){
-          this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Month() );
-        }
-      }
-    }
     }
   *]
 }
diff --git a/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl b/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl
new file mode 100644
index 0000000..4273106
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetBreakDayOverTimeDurction (
+  String outcome
+)
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    overtime := 0.0;
+    nextDayOvertime := 0.0;
+    if( outcome = "涓�鐝�" ){
+      overtime := 8.5;
+      nextDayOvertime := 0.0;
+    }else if( outcome = "浜岀彮" ){
+      overtime := 16;
+      nextDayOvertime := 0.5;
+    }else if(outcome = "9+9"){
+      overtime := 16;
+      nextDayOvertime := 2.5;
+    }else if(outcome = "10+10"){
+      overtime := 16;
+      nextDayOvertime := 4.5;
+    }else if(outcome = "涓夌彮"){
+      overtime := 16;
+      nextDayOvertime := 8;
+    }
+    this.RealValue( this.RealValue() + overtime + nextDayOvertime );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl b/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl
new file mode 100644
index 0000000..a5fb5ae
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetOvertimeDurction (
+  String outcome
+)
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    overtime := 0.0;
+    nextDayOvertime := 0.0;
+    if( outcome = "涓�鐝�" ){
+      overtime := 0.5;
+      nextDayOvertime := 0.0;
+    }else if( outcome = "浜岀彮" ){
+      overtime := 8;
+      nextDayOvertime := 0.5;
+    }else if(outcome = "9+9"){
+      overtime := 8;
+      nextDayOvertime := 2.5;
+    }else if(outcome = "10+10"){
+      overtime := 8;
+      nextDayOvertime := 4.5;
+    }else if(outcome = "涓夌彮"){
+      overtime := 8;
+      nextDayOvertime := 8;
+    }
+    this.RealValue( this.RealValue() + overtime + nextDayOvertime );
+  *]
+}
diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
new file mode 100644
index 0000000..19ebdae
--- /dev/null
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -0,0 +1,110 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateComprehensiveHoursReport (
+  MacroPlan macroPlan,
+  const constcontent ShiftPlans shiftPlans,
+  RecycleBin owner
+) as LocalTable
+{
+  Description: '缁煎悎宸ユ椂鍒舵姤琛�'
+  TextBody:
+  [*
+    // rislai Jul-9-2024 (created)
+    table := owner.LocalTable( relnew,Name := "缁煎悎宸ユ椂鍒舵姤琛�");
+    
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    
+    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,Index := 4);
+    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    
+    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,Index := 8);
+    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    
+    units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
+    
+    rows := construct( LocalRows );
+    rowIndexTree := NamedValueTree::Create();
+    
+    cells := construct( LocalCell_Defaults );
+    cellIndexTree := NamedValueTree::Create();
+    
+    unitIndexTree := NamedValueTree::Create();
+    
+    for( i := 0; i < units.Size(); i++){
+      unit := units.Element( i );
+      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() ,CustomName := unit.ID());
+      rowHandle := rowIndexTree.GetHandle( unit.ID() );
+      rows.Add( row );
+      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
+      
+      unitIndexTree.Root().AddChild( unitIndexTree.GetHandle( unit.ID() ),i );
+    }
+    traverse( shiftPlans,Elements,shiftPlan ){
+      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
+      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+    
+      // gongchangCell := LocalCell_Default::GetCell(  rowKey + column1.Name(), cellIndexTree, cells, row, column1 );
+      // chanxianxCell := LocalCell_Default::GetCell(  rowKey + column2.Name(), cellIndexTree, cells, row, column2 );
+    
+      shengchanCell := LocalCell_Default::GetCell(  rowKey + column3.Name(), cellIndexTree, cells, row, column3 );
+      week := shiftPlan.UnitPeriodTime().Period_MP().StartDate().DayOfWeek();
+      if( shiftPlan.Outcome() <> "" ){
+        shengchanCell.RealValue( shengchanCell.RealValue() + 1 );
+        if( shiftPlan.IsHoliday() ){
+          // 鑺傚亣鏃ュ姞鐝� 
+          jiejiariCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+          jiejiariCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else if( week = 6 or week = 7 ){
+          // 浼戞伅鏃ュ姞鐝� 
+          xiuxiCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          xiuxiCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else{
+          // 骞虫椂鍔犵彮
+          jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          jiabanCell.SetOvertimeDurction( shiftPlan.Outcome() );
+        }
+      }else{
+        if( not shiftPlan.IsHoliday() and not ( week = 6 or week = 7 )){
+          qiangongCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          qiangongCell.RealValue( qiangongCell.RealValue() - 8 );
+        }
+      }
+    }
+    
+    // 骞虫椂鍔犵彮鍊嶇巼
+    defaultMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "骞虫椂鍔犵彮鍊嶇巼" );
+    if( isnull( defaultMultiplier )){
+      defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1 );
+    }
+    
+    // 浼戞伅鏃ュ姞鐝�嶇巼
+    breakDayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "浼戞伅鏃ュ姞鐝�嶇巼");
+    if( isnull( breakDayMultiplier )){
+      breakDayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "浼戞伅鏃ュ姞鐝�嶇巼",Multiplier := 2 );
+    }
+    
+    // 鑺傚亣鏃ュ姞鐝�嶇巼
+    holidayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "鑺傚亣鏃ュ姞鐝�嶇巼");
+    if( isnull( holidayMultiplier )){
+      holidayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "鑺傚亣鏃ュ姞鐝�嶇巼",Multiplier := 3 ); 
+    }
+    
+    traverse( table,LocalRow,row ){
+      rowKey := row.CustomName();
+      unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+      
+      jiejiariCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      
+      qiangongCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
new file mode 100644
index 0000000..b88493c
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -0,0 +1,122 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateStandardHoursReport (
+  MacroPlan macroPlan,
+  const constcontent ShiftPlans shiftPlans,
+  RecycleBin owner
+) as LocalTable
+{
+  Description: '鏍囧噯宸ユ椂鍒舵姤琛�'
+  TextBody:
+  [*
+    // rislai Jul-4-2024 (created)
+    table := owner.LocalTable( relnew,Name := "鏍囧噯宸ユ椂鍒舵姤琛�");
+    
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    
+    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,Index := 4);
+    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,Index := 5);
+    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,Index := 7);
+    
+    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,Index := 8);
+    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,Index := 9);
+    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,Index := 11);
+    
+    units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
+    
+    rows := construct( LocalRows );
+    rowIndexTree := NamedValueTree::Create();
+    
+    cells := construct( LocalCell_Defaults );
+    cellIndexTree := NamedValueTree::Create();
+    
+    unitIndexTree := NamedValueTree::Create();
+    
+    for( i := 0; i < units.Size(); i++){
+      unit := units.Element( i );
+      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() ,CustomName := unit.ID());
+      rowHandle := rowIndexTree.GetHandle( unit.ID() );
+      rows.Add( row );
+      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
+      
+      unitIndexTree.Root().AddChild( unitIndexTree.GetHandle( unit.ID() ),i );
+    }
+    traverse( shiftPlans,Elements,shiftPlan ){
+      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
+      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+    
+      // gongchangCell := LocalCell_Default::GetCell(  rowKey + column1.Name(), cellIndexTree, cells, row, column1 );
+      // chanxianxCell := LocalCell_Default::GetCell(  rowKey + column2.Name(), cellIndexTree, cells, row, column2 );
+    
+      shengchanCell := LocalCell_Default::GetCell(  rowKey + column3.Name(), cellIndexTree, cells, row, column3 );
+      week := shiftPlan.UnitPeriodTime().Period_MP().StartDate().DayOfWeek();
+      if( shiftPlan.Outcome() <> "" ){
+        shengchanCell.RealValue( shengchanCell.RealValue() + 1 );
+        if( shiftPlan.IsHoliday() ){
+          // 鑺傚亣鏃ュ姞鐝� 
+          jiejiariCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+          jiejiariCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else if( week = 6 or week = 7 ){
+          // 浼戞伅鏃ュ姞鐝� 
+          xiuxiCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+          xiuxiCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else{
+          // 骞虫椂鍔犵彮
+          jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          jiabanCell.SetOvertimeDurction( shiftPlan.Outcome() );
+        }
+      }else{
+        if( not shiftPlan.IsHoliday() and not ( week = 6 or week = 7 )){
+          qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+          qiangongCell.RealValue( qiangongCell.RealValue() + 8 );
+        }
+      }
+    }
+    
+    // 骞虫椂鍔犵彮鍊嶇巼
+    defaultMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "骞虫椂鍔犵彮鍊嶇巼" );
+    if( isnull( defaultMultiplier )){
+      defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1 );
+    }
+    
+    // 浼戞伅鏃ュ姞鐝�嶇巼
+    breakDayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "浼戞伅鏃ュ姞鐝�嶇巼");
+    if( isnull( breakDayMultiplier )){
+      breakDayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "浼戞伅鏃ュ姞鐝�嶇巼",Multiplier := 2 );
+    }
+    
+    // 鑺傚亣鏃ュ姞鐝�嶇巼
+    holidayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "鑺傚亣鏃ュ姞鐝�嶇巼");
+    if( isnull( holidayMultiplier )){
+      holidayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "鑺傚亣鏃ュ姞鐝�嶇巼",Multiplier := 3 ); 
+    }
+    
+    traverse( table,LocalRow,row ){
+      rowKey := row.CustomName();
+      unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+      
+      jiejiariCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column10.Name(), cellIndexTree, cells, row, column10 );
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      
+      xiuxiCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+      xiuxifeiCell := LocalCell_Default::GetCell(  rowKey + column9.Name(), cellIndexTree, cells, row, column9 );
+      xiuxifeiCell.RealValue( EmployeeCost::GetSalary( unit,breakDayMultiplier,xiuxiCell.RealValue()));
+      
+      jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+      jiabanfeiCell := LocalCell_Default::GetCell(  rowKey + column8.Name(), cellIndexTree, cells, row, column8 );
+      jiabanfeiCell.RealValue( EmployeeCost::GetSalary( unit,holidayMultiplier,jiabanCell.RealValue()));
+      
+      qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column11.Name(), cellIndexTree, cells, row, column11 );
+      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
index 27c9816..b8e97f8 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
@@ -14,7 +14,7 @@
     cellHandle := cellIndexTree.GetHandle( cellKey );
     cellIndex := guard( cellIndexTree.Root().Child( cellHandle ),null( NamedValue ));
     cell := null( LocalCell_Default );
-    if( isnull( cell )){
+    if( isnull( cellIndex )){
        cell := row.LocalCell( relnew,LocalCell_Default,LocalColumn := column );
        cells.Add( cell );
        cellIndexTree.Root().AddChild( cellHandle,cells.Size() - 1 );
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl
deleted file mode 100644
index c7e6f6a..0000000
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl
+++ /dev/null
@@ -1,63 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod NewStaticMethod (
-  const constcontent ShiftPlans shiftPlans,
-  RecycleBin owner
-)
-{
-  TextBody:
-  [*
-    // rislai Jul-4-2024 (created)
-    table := owner.LocalTable( relnew,Name := "");
-    
-    column1 := table.LocalColumn( relnew,Name := "宸ュ巶" );
-    column2 := table.LocalColumn( relnew,Name := "浜х嚎" );
-    
-    column3 := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" );
-    column4 := table.LocalColumn( relnew,Name := "鍔犵彮鏃堕暱" );
-    column5 := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" );
-    column6 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" );
-    column7 := table.LocalColumn( relnew,Name := "鍔犵彮璐�" );
-    column8 := table.LocalColumn( relnew,Name := "娆犲伐璐�" );
-    column9 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" );
-    
-    unitIDs := selectuniquevalues( shiftPlans,Elements.UnitPeriodTime.Unit,unit,unit.ID() );
-    
-    rows := construct( LocalRows );
-    rowIndexTree := NamedValueTree::Create();
-    
-    cells := construct( LocalCell_Defaults );
-    cellIndexTree := NamedValueTree::Create();
-    
-    traverse( unitIDs,Elements,element ){
-      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() );
-      rowHandle := rowIndexTree.GetHandle( element );
-      rows.Add( row );
-      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
-    }
-    
-    traverse( shiftPlans,Elements,shiftPlan ){
-      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
-      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
-      
-      gongchangCell := LocalCell_Default::GetCell(  rowKey + "宸ュ巶", cellIndexTree, cells, row, column1 );
-      chanxianxCell := LocalCell_Default::GetCell(  rowKey + "浜х嚎", cellIndexTree, cells, row, column2 );
-      
-      shengchanCell := LocalCell_Default::GetCell(  rowKey + "鐢熶骇澶╂暟", cellIndexTree, cells, row, column3 );
-      jiabanCell := LocalCell_Default::GetCell(  rowKey + "鍔犵彮鏃堕暱", cellIndexTree, cells, row, column4 );
-      qiangongCell := LocalCell_Default::GetCell(  rowKey + "娆犲伐鏃堕暱", cellIndexTree, cells, row, column5 );
-      jiejiariCell := LocalCell_Default::GetCell(  rowKey + "鑺傚亣鏃ュ姞鐝椂闀�", cellIndexTree, cells, row, column6 );
-      
-      jiabanfeiCell := LocalCell_Default::GetCell(  rowKey + "鍔犵彮璐�", cellIndexTree, cells, row, column7 );
-      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + "娆犲伐璐�", cellIndexTree, cells, row, column8 );
-      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + "鑺傚亣鏃ュ姞鐝垂", cellIndexTree, cells, row, column9 );
-      
-      if( shiftPlan.Outcome() <> "" ){
-        
-      }else{
-        
-      }
-      
-    }
-  *]
-}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
index 64f77be..19b7ed7 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
@@ -5,7 +5,7 @@
   DateTime end1,
   DateTime start2,
   DateTime end2
-) const declarative as Boolean
+) const declarative remote as Boolean
 {
   TextBody:
   [*
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
index e4d6bb3..8ec6afe 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
@@ -5,11 +5,11 @@
   Date end1,
   Date start2,
   Date end2
-) const declarative as Boolean
+) const declarative remote as Boolean
 {
   TextBody:
   [*
     // rislai Jun-14-2024 (created)
-    return start1 < end2 and start2 < end1 ;
+    return start1 <= end2 and start2 <= end1 ;
   *]
 }
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_CCAssemblyPlanQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCAssemblyPlanQty.qbl
new file mode 100644
index 0000000..8630496
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCAssemblyPlanQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCAssemblyPlanQty
+{
+  #keys: '3[415136.0.886711537][415136.0.886711536][415136.0.886711538]'
+  Description: '闀挎槬瑁呴厤璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_CCInventoryQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCInventoryQty.qbl
new file mode 100644
index 0000000..71455dc
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCInventoryQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCInventoryQty
+{
+  #keys: '3[415136.0.886711534][415136.0.886711533][415136.0.886711535]'
+  Description: '闀挎槬搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_CCProductionQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCProductionQty.qbl
new file mode 100644
index 0000000..5d55afc
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCProductionQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCProductionQty
+{
+  #keys: '3[415136.0.886711531][415136.0.886711530][415136.0.886711532]'
+  Description: '闀挎槬鐢熶骇璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_CCTransferQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCTransferQty.qbl
new file mode 100644
index 0000000..e674522
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_CCTransferQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CCTransferQty
+{
+  #keys: '3[415136.0.894481176][415136.0.894481175][415136.0.894481177]'
+  Description: '闀挎槬璋冩嫧璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_DLAssemblyPlanQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLAssemblyPlanQty.qbl
new file mode 100644
index 0000000..c044a24
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLAssemblyPlanQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLAssemblyPlanQty
+{
+  #keys: '3[415136.0.894481139][415136.0.894481138][415136.0.894481140]'
+  Description: '澶ц繛瑁呴厤璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_DLInventoryQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLInventoryQty.qbl
new file mode 100644
index 0000000..3e46b8e
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLInventoryQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLInventoryQty
+{
+  #keys: '3[415136.0.894481162][415136.0.894481161][415136.0.894481163]'
+  Description: '澶ц繛搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_DLProductionQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLProductionQty.qbl
new file mode 100644
index 0000000..8656cb3
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLProductionQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLProductionQty
+{
+  #keys: '3[415136.0.894481152][415136.0.894481151][415136.0.894481153]'
+  Description: '澶ц繛鐢熶骇璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_DLTransferQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLTransferQty.qbl
new file mode 100644
index 0000000..a0a5d52
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_DLTransferQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DLTransferQty
+{
+  #keys: '3[415136.0.894481186][415136.0.894481185][415136.0.894481187]'
+  Description: '澶ц繛璋冩嫧璁″垝'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Attribute_TotalInventoryQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Attribute_TotalInventoryQty.qbl
new file mode 100644
index 0000000..a2361c6
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Attribute_TotalInventoryQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TotalInventoryQty
+{
+  #keys: '3[415136.0.894481169][415136.0.894481168][415136.0.894481170]'
+  Description: '闀挎槬 + 澶ц繛 搴撳瓨'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Function_CalcTotalInventoryQty.qbl b/_Main/BL/Type_MachiningPipelineCell/Function_CalcTotalInventoryQty.qbl
new file mode 100644
index 0000000..49e3496
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Function_CalcTotalInventoryQty.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcTotalInventoryQty
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-12-2024 (created)
+    
+    value := this.CCInventoryQty() + this.DLInventoryQty();
+    
+    this.TotalInventoryQty( value );
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Method_Add.qbl b/_Main/BL/Type_MachiningPipelineCell/Method_Add.qbl
new file mode 100644
index 0000000..d23330d
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Method_Add.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method Add (
+  MachiningPipelineCell cell
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-12-2024 (created)
+    this.CCAssemblyPlanQty( this.CCAssemblyPlanQty() + cell.CCAssemblyPlanQty() );
+    this.CCProductionQty( this.CCProductionQty() + cell.CCProductionQty() );
+    this.CCTransferQty( this.CCTransferQty() + cell.CCTransferQty() );
+    this.CCInventoryQty( this.CCInventoryQty() + cell.CCInventoryQty() );
+    this.DLAssemblyPlanQty( this.DLAssemblyPlanQty() + cell.DLAssemblyPlanQty() );
+    this.DLProductionQty( this.DLProductionQty() + cell.DLProductionQty() );
+    this.DLTransferQty( this.DLTransferQty() + cell.DLTransferQty() );
+    this.DLInventoryQty( this.DLInventoryQty() + cell.DLInventoryQty() );
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/Method_Copy.qbl b/_Main/BL/Type_MachiningPipelineCell/Method_Copy.qbl
new file mode 100644
index 0000000..603d348
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/Method_Copy.qbl
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: #root
+Method Copy (
+  MachiningPipelineColumn column
+) as MachiningPipelineCell
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-12-2024 (created)
+    cell := column.Cell( relnew, CCAssemblyPlanQty := this.CCAssemblyPlanQty(), 
+                         CCProductionQty := this.CCProductionQty(), 
+                         CCTransferQty := this.CCTransferQty(),
+                         CCInventoryQty := this.CCInventoryQty(), 
+                         DLAssemblyPlanQty := this.DLAssemblyPlanQty(), 
+                         DLProductionQty := this.DLProductionQty(), 
+                         DLTransferQty := this.DLTransferQty(), 
+                         DLInventoryQty := this.DLInventoryQty() );
+    
+    return cell;
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/StaticMethod_Initialize.qbl b/_Main/BL/Type_MachiningPipelineCell/StaticMethod_Initialize.qbl
new file mode 100644
index 0000000..ba284fe
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/StaticMethod_Initialize.qbl
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Initialize (
+  MachiningPipelineColumn column
+) as MachiningPipelineCell
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-12-2024 (created)
+    cell := column.Cell( relnew, CCAssemblyPlanQty := 0, 
+                         CCProductionQty := 0, 
+                         CCTransferQty := 0,
+                         CCInventoryQty := 0, 
+                         DLAssemblyPlanQty := 0, 
+                         DLProductionQty := 0, 
+                         DLTransferQty := 0,
+                         DLInventoryQty := 0 );
+    
+    return cell;
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineCell/_ROOT_Type_MachiningPipelineCell.qbl b/_Main/BL/Type_MachiningPipelineCell/_ROOT_Type_MachiningPipelineCell.qbl
new file mode 100644
index 0000000..ae5d58c
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineCell/_ROOT_Type_MachiningPipelineCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineCell
+{
+  #keys: '5[415136.0.886711528][415136.0.886711526][0.0.0][415136.0.886711527][415136.0.886711529]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾挎姤琛ㄥ崟鍏冩牸'
+  StructuredName: 'MachiningPipelineCells'
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Index.qbl b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Index.qbl
new file mode 100644
index 0000000..3834786
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415136.0.886711548][415136.0.886711547][415136.0.886711549]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Name.qbl b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Name.qbl
new file mode 100644
index 0000000..8fef8cd
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.886711551][415136.0.886711550][415136.0.886711552]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Period.qbl b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Period.qbl
new file mode 100644
index 0000000..4ee9a29
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_Period.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Period
+{
+  #keys: '3[415136.0.886711554][415136.0.886711553][415136.0.886711555]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/Attribute_TimeUnit.qbl b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..3e870fe
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/Attribute_TimeUnit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[415136.0.886711557][415136.0.886711556][415136.0.886711558]'
+  Description: '鏃ユ湡绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_Name.qbl b/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_TimeUnit.qbl b/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_TimeUnit.qbl
new file mode 100644
index 0000000..e29979e
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/DefaultValue_TimeUnit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: TimeUnit
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/Function_CalcIndex.qbl b/_Main/BL/Type_MachiningPipelineColumn0/Function_CalcIndex.qbl
new file mode 100644
index 0000000..56bbf20
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/Function_CalcIndex.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-21-2024 (created)
+    
+    value := ifexpr( isnull( this.PreviousColumn() ), 0, this.PreviousColumn().Index() + 1 );
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineColumn0/_ROOT_Type_MachiningPipelineColumn0.qbl b/_Main/BL/Type_MachiningPipelineColumn0/_ROOT_Type_MachiningPipelineColumn0.qbl
new file mode 100644
index 0000000..34b6217
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineColumn0/_ROOT_Type_MachiningPipelineColumn0.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineColumn
+{
+  #keys: '5[415136.0.886711545][415136.0.886711543][0.0.0][415136.0.886711544][415136.0.886711546]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾挎姤琛ㄥ垪'
+  StructuredName: 'MachiningPipelineColumns'
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Attribute_ID.qbl b/_Main/BL/Type_MachiningPipelineReport/Attribute_ID.qbl
new file mode 100644
index 0000000..5e6ab08
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.886711585][415136.0.886711584][415136.0.886711586]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Attribute_IsShow.qbl b/_Main/BL/Type_MachiningPipelineReport/Attribute_IsShow.qbl
new file mode 100644
index 0000000..169625c
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Attribute_IsShow.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsShow
+{
+  #keys: '3[415136.0.886711588][415136.0.886711587][415136.0.886711589]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Attribute_Name.qbl b/_Main/BL/Type_MachiningPipelineReport/Attribute_Name.qbl
new file mode 100644
index 0000000..ca400d3
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.886711591][415136.0.886711590][415136.0.886711592]'
+  Description: '鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/DefaultValue_ID.qbl b/_Main/BL/Type_MachiningPipelineReport/DefaultValue_ID.qbl
new file mode 100644
index 0000000..049abc0
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/DefaultValue_ID.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: ID
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/DefaultValue_Name.qbl b/_Main/BL/Type_MachiningPipelineReport/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Method_Clear.qbl b/_Main/BL/Type_MachiningPipelineReport/Method_Clear.qbl
new file mode 100644
index 0000000..9ea6219
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Method_Clear.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method Clear (
+  String timeunit,
+  Date startdate,
+  Date enddate
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    this.Column( relflush );
+    this.Row( relflush );
+    
+    this.GenerateColumn( this.Source().MacroPlan(), timeunit, startdate, enddate );
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Method_Generate.qbl b/_Main/BL/Type_MachiningPipelineReport/Method_Generate.qbl
new file mode 100644
index 0000000..d6715fd
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Method_Generate.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+Method Generate (
+  MachiningPipelineSearch search,
+  Product_MPs products
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    table      := selectobject( this, Source.Report, report, not report.IsShow() );
+    //娓呯┖涔嬪墠瀛樺偍鐨勬樉绀烘暟鎹�
+    this.Clear( search.TimeUnit(), search.StartDate(), search.EndDate() );
+    //杩囨护鍚庣殑浜у搧id
+    productids := selectuniquevalues( products, Elements, product, true, product.ID() );
+    sumrow     := this.Row( relnew, Name := 'SUM', RowNr := table.Row( relsize ) );
+    traverse( table, Row, row, productids.Find( row.Name() ) >= 0 ){
+      showrow := this.Row( relnew, Name := row.Name(), RowNr := row.RowNr() );
+      
+      traverse( row, Cell, cell, cell.Column().TimeUnit() = search.TimeUnit() ){
+        column   := selectobject( this, Column, column, column.Name() = cell.Column().Name() and column.TimeUnit() = search.TimeUnit() );
+        
+        if( not isnull( column ) ){
+          sumcell  := selectobject( column, Cell, c, c.Row() = sumrow );
+          if( isnull( sumcell ) ){
+            sumcell := MachiningPipelineCell::Initialize( column );
+            sumrow.Cell( relinsert, sumcell );
+          }
+          
+          showcell := cell.Copy( column );
+          showrow.Cell( relinsert, showcell );
+      
+          sumcell.Add( cell );
+    
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Method_GenerateColumn.qbl b/_Main/BL/Type_MachiningPipelineReport/Method_GenerateColumn.qbl
new file mode 100644
index 0000000..1eba4c1
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Method_GenerateColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method GenerateColumn (
+  MacroPlan owner,
+  String timeunit,
+  Date startdate,
+  Date enddate
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    //鏌ヨ鏃ユ湡杩斿洖闇�瑕佸湪璁″垝鏃ユ湡涔嬪唴
+    traverse( owner, Period_MP, period, not period.IsHistorical() and period.StartDate() >= startdate and period.EndDate() <= enddate
+              and ( ( timeunit = 'All' and ( period.TimeUnit() = Translations::MP_GlobalParameters_Day() or period.TimeUnit() = Translations::MP_GlobalParameters_Week() ) ) 
+                    or period.TimeUnit() = timeunit ) ){
+      periodtime := period.StartDate();
+      periodname := periodtime.Format( "M2/D2/Y" );
+      
+      this.Column( relnew, Name := periodname, Period := periodtime, TimeUnit := period.TimeUnit() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/Method_GetRow.qbl b/_Main/BL/Type_MachiningPipelineReport/Method_GetRow.qbl
new file mode 100644
index 0000000..c19b0a5
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/Method_GetRow.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetRow (
+  String product
+) as MachiningPipelineRow
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    row := selectobject( this, Row, row, row.Name() = product );
+    
+    if( isnull( row ) ){
+      row := this.Row( relnew, Name := product );
+      //鍒濆鍖栧崟鍏冩牸
+      row.InitializeCell( this );
+    }
+    
+    return row;
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultAllUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultAllUnit.qbl
new file mode 100644
index 0000000..e912c3f
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultAllUnit.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultAllUnit () const declarative as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '<All>';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCAssemnlyUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCAssemnlyUnit.qbl
new file mode 100644
index 0000000..22667e7
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCAssemnlyUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCAssemnlyUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬瑁呴厤绾�';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCProductionUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCProductionUnit.qbl
new file mode 100644
index 0000000..050172d
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCProductionUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCProductionUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬鏈哄姞浜х嚎';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCUnit.qbl
new file mode 100644
index 0000000..77d1f16
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultCCUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '闀挎槬';
+    //return 'Assembly Plant (France)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLAssemnlyUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLAssemnlyUnit.qbl
new file mode 100644
index 0000000..a34d00c
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLAssemnlyUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLAssemnlyUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛瑁呴厤绾�';
+    //return 'Assembly Plant (Spain)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLProductionUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLProductionUnit.qbl
new file mode 100644
index 0000000..4056b04
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLProductionUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLProductionUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛鏈哄姞浜х嚎';
+    //return 'Assembly Plant (Spain)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLUnit.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLUnit.qbl
new file mode 100644
index 0000000..4759121
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultDLUnit () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return '澶ц繛';
+    //return 'Assembly Plant (Spain)';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultName.qbl b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultName.qbl
new file mode 100644
index 0000000..2948919
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/StaticMethod_GetDefaultName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultName () const as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-25-2024 (created)
+    return 'Machining pipelines';
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineReport/_ROOT_Type_MachiningPipelineReport.qbl b/_Main/BL/Type_MachiningPipelineReport/_ROOT_Type_MachiningPipelineReport.qbl
new file mode 100644
index 0000000..322c157
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineReport/_ROOT_Type_MachiningPipelineReport.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineReport
+{
+  #keys: '5[415136.0.886711582][415136.0.886711580][0.0.0][415136.0.886711581][415136.0.886711583]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾挎姤琛�'
+  StructuredName: 'MachiningPipelineReports'
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Attribute_Name.qbl b/_Main/BL/Type_MachiningPipelineRow/Attribute_Name.qbl
new file mode 100644
index 0000000..a3fe676
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.886711571][415136.0.886711570][415136.0.886711572]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Attribute_RowNr.qbl b/_Main/BL/Type_MachiningPipelineRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..d416652
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.886711574][415136.0.886711573][415136.0.886711575]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/DefaultValue_Name.qbl b/_Main/BL/Type_MachiningPipelineRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Method_Initialize.qbl b/_Main/BL/Type_MachiningPipelineRow/Method_Initialize.qbl
new file mode 100644
index 0000000..c0f341b
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Method_Initialize.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method Initialize (
+  MachiningPipelineColumn column
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := MachiningPipelineCell::Initialize( column );
+    
+    this.Cell( relinsert, cell );
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Method_InitializeCell.qbl b/_Main/BL/Type_MachiningPipelineRow/Method_InitializeCell.qbl
new file mode 100644
index 0000000..bc90a14
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Method_InitializeCell.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeCell (
+  MachiningPipelineReport table
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-28-2024 (created)
+    traverse( table, Column, column ){
+      this.Initialize( column );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Method_SetCellAssemblyValue.qbl b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellAssemblyValue.qbl
new file mode 100644
index 0000000..00732ef
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellAssemblyValue.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellAssemblyValue (
+  MachiningPipelineColumn column,
+  String unit,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    if( unit = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() ){
+      cell.CCAssemblyPlanQty( cell.CCAssemblyPlanQty() + quantity );
+    }else if( unit = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() ){
+      cell.DLAssemblyPlanQty( cell.DLAssemblyPlanQty() + quantity );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Method_SetCellInventoryValue.qbl b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellInventoryValue.qbl
new file mode 100644
index 0000000..568d35f
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellInventoryValue.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellInventoryValue (
+  MachiningPipelineColumn column,
+  String unit,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    if( unit = MachiningPipelineReport::GetDefaultCCUnit() ){
+      cell.CCInventoryQty( cell.CCInventoryQty() + quantity );
+    }else if( unit = MachiningPipelineReport::GetDefaultDLUnit() ){
+      cell.DLInventoryQty( cell.DLInventoryQty() + quantity );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/Method_SetCellProductionValue.qbl b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellProductionValue.qbl
new file mode 100644
index 0000000..cc60df0
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/Method_SetCellProductionValue.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetCellProductionValue (
+  MachiningPipelineColumn column,
+  String unit,
+  Real quantity
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    cell := selectobject( this, Cell, cell, cell.Column() = column );
+    
+    if( unit = MachiningPipelineReport::GetDefaultCCProductionUnit() ){
+      cell.CCProductionQty( cell.CCProductionQty() + quantity );
+    }else if( unit = MachiningPipelineReport::GetDefaultDLProductionUnit() ){
+      cell.DLProductionQty( cell.DLProductionQty() + quantity );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineRow/_ROOT_Type_MachiningPipelineRow.qbl b/_Main/BL/Type_MachiningPipelineRow/_ROOT_Type_MachiningPipelineRow.qbl
new file mode 100644
index 0000000..bbe4ab8
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineRow/_ROOT_Type_MachiningPipelineRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineRow
+{
+  #keys: '5[415136.0.886711568][415136.0.886711566][0.0.0][415136.0.886711567][415136.0.886711569]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾胯'
+  StructuredName: 'MachiningPipelineRows'
+}
diff --git a/_Main/BL/Type_MachiningPipelineSearch/Attribute_EndDate.qbl b/_Main/BL/Type_MachiningPipelineSearch/Attribute_EndDate.qbl
new file mode 100644
index 0000000..1a0f3cb
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSearch/Attribute_EndDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndDate
+{
+  #keys: '3[415136.0.886711605][415136.0.886711604][415136.0.886711606]'
+  Description: '缁撴潫鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MachiningPipelineSearch/Attribute_StartDate.qbl b/_Main/BL/Type_MachiningPipelineSearch/Attribute_StartDate.qbl
new file mode 100644
index 0000000..4e30a0e
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSearch/Attribute_StartDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[415136.0.886711602][415136.0.886711601][415136.0.886711603]'
+  Description: '寮�濮嬫椂闂�'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MachiningPipelineSearch/Attribute_TimeUnit.qbl b/_Main/BL/Type_MachiningPipelineSearch/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..ec161a6
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSearch/Attribute_TimeUnit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[415136.0.886711608][415136.0.886711607][415136.0.886711609]'
+  Description: '鏃ユ湡绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineSearch/DefaultValue_TimeUnit.qbl b/_Main/BL/Type_MachiningPipelineSearch/DefaultValue_TimeUnit.qbl
new file mode 100644
index 0000000..e29979e
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSearch/DefaultValue_TimeUnit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: TimeUnit
+}
diff --git a/_Main/BL/Type_MachiningPipelineSearch/_ROOT_Type_MachiningPipelineSearch.qbl b/_Main/BL/Type_MachiningPipelineSearch/_ROOT_Type_MachiningPipelineSearch.qbl
new file mode 100644
index 0000000..e8b9a36
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSearch/_ROOT_Type_MachiningPipelineSearch.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineSearch
+{
+  #keys: '5[415136.0.886711599][415136.0.886711597][0.0.0][415136.0.886711598][415136.0.886711600]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾挎煡璇㈢被'
+  StructuredName: 'MachiningPipelineSearchs'
+}
diff --git a/_Main/BL/Type_MachiningPipelineSource0/Attribute_Name.qbl b/_Main/BL/Type_MachiningPipelineSource0/Attribute_Name.qbl
new file mode 100644
index 0000000..e3fa381
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.886711619][415136.0.886711618][415136.0.886711620]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachiningPipelineSource0/DefaultValue_Name.qbl b/_Main/BL/Type_MachiningPipelineSource0/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Download.qbl b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Download.qbl
new file mode 100644
index 0000000..62d0044
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Download.qbl
@@ -0,0 +1,168 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Download (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  Description: '涓嬭浇鍙戝姩鏈虹绾挎暟鎹�'
+  TextBody:
+  [*
+    
+    table := selectobject( macroPlan, MachiningPipelineSource.Report, table, table.IsShow() );
+    
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    //Product
+    productcolumnelement := xmlDOM.CreateElement( "column" );
+    productnameelement   := xmlDOM.CreateElement( "name" );
+    producttypeelement   := xmlDOM.CreateElement( "type" );
+    productnameelement.TextContent( 'Product' );
+    producttypeelement.TextContent( "String" );
+    productcolumnelement.AppendChild( productnameelement );
+    productcolumnelement.AppendChild( producttypeelement );
+    //Attribute
+    attricolumnelement := xmlDOM.CreateElement( "column" );
+    attrinameelement   := xmlDOM.CreateElement( "name" );
+    attritypeelement   := xmlDOM.CreateElement( "type" );
+    attrinameelement.TextContent( 'Attribute' );
+    attritypeelement.TextContent( "String" );
+    attricolumnelement.AppendChild( attrinameelement );
+    attricolumnelement.AppendChild( attritypeelement );
+    
+    tableElement.AppendChild( productcolumnelement ); 
+    tableElement.AppendChild( attricolumnelement );
+    traverse ( table, Column, column ) {
+      columnelement := xmlDOM.CreateElement( "column" );
+      nameelement   := xmlDOM.CreateElement( "name" );
+      typeelement   := xmlDOM.CreateElement( "type" );
+      nameelement.TextContent( column.Name() );
+      typeelement.TextContent( "String" );
+      columnelement.AppendChild( nameelement );
+      columnelement.AppendChild( typeelement );
+      
+      cells := selectsortedset( column, Cell, cell, cell.Row().RowNr() );
+    
+      traverse ( cells, Elements, c ) {
+        if( column.Index() = 0 ){
+          row := c.Row();
+          //Product
+          productcellElement1 := xmlDOM.CreateElement( "cell" );
+          productcellElement1.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement1 );
+          productcellElement2 := xmlDOM.CreateElement( "cell" );
+          productcellElement2.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement2 );
+          productcellElement3 := xmlDOM.CreateElement( "cell" );
+          productcellElement3.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement3 );
+          productcellElement4 := xmlDOM.CreateElement( "cell" );
+          productcellElement4.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement4 );
+          productcellElement5 := xmlDOM.CreateElement( "cell" );
+          productcellElement5.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement5 );
+          productcellElement6 := xmlDOM.CreateElement( "cell" );
+          productcellElement6.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement6 );
+          productcellElement7 := xmlDOM.CreateElement( "cell" );
+          productcellElement7.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement7 );
+          productcellElement8 := xmlDOM.CreateElement( "cell" );
+          productcellElement8.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement8 );
+          productcellElement9 := xmlDOM.CreateElement( "cell" );
+          productcellElement9.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement9 );
+          //Attribute
+          //闀挎槬瑁呴厤璁″垝
+          ccaqcellElement := xmlDOM.CreateElement( "cell" );
+          ccaqcellElement.SetAttribute( "value", 'CCAssemblyPlanQty' );
+          attricolumnelement.AppendChild( ccaqcellElement );
+          //闀挎槬鐢熶骇璁″垝
+          ccpqcellElement := xmlDOM.CreateElement( "cell" );
+          ccpqcellElement.SetAttribute( "value", 'CCProductionQty' );
+          attricolumnelement.AppendChild( ccpqcellElement );
+          //闀挎槬璋冩嫧璁″垝
+          cctqcellElement := xmlDOM.CreateElement( "cell" );
+          cctqcellElement.SetAttribute( "value", 'CCTransferQty' );
+          attricolumnelement.AppendChild( cctqcellElement );
+          //闀挎槬搴撳瓨
+          cciqcellElement := xmlDOM.CreateElement( "cell" );
+          cciqcellElement.SetAttribute( "value", 'CCInventoryQty' );
+          attricolumnelement.AppendChild( cciqcellElement );
+          //澶ц繛瑁呴厤璁″垝
+          dlaqcellElement := xmlDOM.CreateElement( "cell" );
+          dlaqcellElement.SetAttribute( "value", 'DLAssemblyPlanQty' );
+          attricolumnelement.AppendChild( dlaqcellElement );
+          //澶ц繛鐢熶骇璁″垝
+          dlpqcellElement := xmlDOM.CreateElement( "cell" );
+          dlpqcellElement.SetAttribute( "value", 'DLProductionQty' );
+          attricolumnelement.AppendChild( dlpqcellElement );
+          //澶ц繛璋冩嫧璁″垝
+          dltqcellElement := xmlDOM.CreateElement( "cell" );
+          dltqcellElement.SetAttribute( "value", 'DLTransferQty' );
+          attricolumnelement.AppendChild( dltqcellElement );
+          //澶ц繛搴撳瓨
+          dliqcellElement := xmlDOM.CreateElement( "cell" );
+          dliqcellElement.SetAttribute( "value", 'DLInventoryQty' );
+          attricolumnelement.AppendChild( dliqcellElement );
+          //闀挎槬 + 澶ц繛 搴撳瓨
+          tiqcellElement := xmlDOM.CreateElement( "cell" );
+          tiqcellElement.SetAttribute( "value", 'TotalInventoryQty' );
+          attricolumnelement.AppendChild( tiqcellElement );
+        }
+        //闀挎槬瑁呴厤璁″垝
+        ccaqcellElement := xmlDOM.CreateElement( "cell" );
+        ccaqcellElement.SetAttribute( "value", [String]c.CCAssemblyPlanQty() );
+        columnelement.AppendChild( ccaqcellElement );
+        //闀挎槬鐢熶骇璁″垝
+        ccpqcellElement := xmlDOM.CreateElement( "cell" );
+        ccpqcellElement.SetAttribute( "value", [String]c.CCProductionQty() );
+        columnelement.AppendChild( ccpqcellElement );
+        //闀挎槬璋冩嫧璁″垝
+        cctqcellElement := xmlDOM.CreateElement( "cell" );
+        cctqcellElement.SetAttribute( "value", [String]c.CCTransferQty() );
+        columnelement.AppendChild( cctqcellElement );
+        //闀挎槬搴撳瓨
+        cciqcellElement := xmlDOM.CreateElement( "cell" );
+        cciqcellElement.SetAttribute( "value", [String]c.CCInventoryQty() );
+        columnelement.AppendChild( cciqcellElement );
+        //澶ц繛瑁呴厤璁″垝
+        dlaqcellElement := xmlDOM.CreateElement( "cell" );
+        dlaqcellElement.SetAttribute( "value", [String]c.DLAssemblyPlanQty() );
+        columnelement.AppendChild( dlaqcellElement );
+        //澶ц繛鐢熶骇璁″垝
+        dlpqcellElement := xmlDOM.CreateElement( "cell" );
+        dlpqcellElement.SetAttribute( "value", [String]c.DLProductionQty() );
+        columnelement.AppendChild( dlpqcellElement );
+        //澶ц繛璋冩嫧璁″垝
+        dltqcellElement := xmlDOM.CreateElement( "cell" );
+        dltqcellElement.SetAttribute( "value", [String]c.DLTransferQty() );
+        columnelement.AppendChild( dltqcellElement );
+        //澶ц繛搴撳瓨
+        dliqcellElement := xmlDOM.CreateElement( "cell" );
+        dliqcellElement.SetAttribute( "value", [String]c.DLInventoryQty() );
+        columnelement.AppendChild( dliqcellElement );
+        //闀挎槬 + 澶ц繛 搴撳瓨
+        tiqcellElement := xmlDOM.CreateElement( "cell" );
+        tiqcellElement.SetAttribute( "value", [String]c.TotalInventoryQty() );
+        columnelement.AppendChild( tiqcellElement );
+      }
+      tableElement.AppendChild( columnelement );  
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM );
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( MachiningPipelineReport::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl
new file mode 100644
index 0000000..bf09a16
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/StaticMethod_Initialize.qbl
@@ -0,0 +1,84 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Initialize (
+  MacroPlan owner
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-24-2024 (created)
+    owner.FinancialProductionSource( relflush );
+    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() );
+    showtable                 := source.Report( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsShow := true );
+    
+    search                    := source.Search( relnew, StartDate := Date::MinDate(), EndDate := Date::MaxDate(), TimeUnit := Translations::MP_GlobalParameters_Day() );
+    
+    products                  := construct( Product_MPs );
+    //鍒濆鍖栧垪
+    table.GenerateColumn( owner, 'All', search.StartDate(), search.EndDate() );
+    
+    //鐢熸垚瑁呴厤銆佺敓浜у拰搴撳瓨鏁版嵁
+    traverse( owner, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() ){
+      unit := pisp.StockingPoint_MP().UnitID();
+      //鍒濆鍖栬
+      row := table.GetRow( pisp.ProductID() );
+      
+      traverse( pisp, ProductInStockingPointInPeriod, pispip, not pispip.Period_MP().IsHistorical()
+                and ( pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day() 
+                      or pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Week() ) ){
+        periodtime := pispip.Period_MP().StartDate();
+        periodname := periodtime.Format( "M2/D2/Y" );
+        column := selectobject( table, Column, column, column.Name() = periodname and column.Period() = periodtime and column.TimeUnit() = pispip.Period_MP().TimeUnit() );
+    
+        //瑁呴厤绾�
+        if( unit = MachiningPipelineReport::GetDefaultCCAssemnlyUnit() or unit = MachiningPipelineReport::GetDefaultDLAssemnlyUnit() ){
+          row.SetCellAssemblyValue( column, unit, pispip.NewSupplyProductionQuantity() );
+        }
+        //鏈哄姞绾�
+        if( unit = MachiningPipelineReport::GetDefaultCCProductionUnit() or unit = MachiningPipelineReport::GetDefaultDLProductionUnit() ){
+          row.SetCellProductionValue( column, unit, pispip.NewSupplyProductionQuantity() );
+        }
+        if( unit = ccunit or unit = dlunit ){
+          row.SetCellInventoryValue( column, unit, pispip.PlannedInventoryLevelEnd() );
+        }
+      }
+    }
+    
+    //鐢熸垚璋冩嫧鏁版嵁
+    traverse( owner, TransferPlanRow, tprow, ( tprow.SourceStockpoingPointID() = 'CC' and tprow.TargetStockpoingPointID() = 'DL' ) or ( tprow.SourceStockpoingPointID() = 'DL' and tprow.TargetStockpoingPointID() = 'CC' ) ){
+      row := selectobject( table, Row, row, row.Name() = tprow.Name() );
+      traverse( table, Column, column ){
+        cell := selectobject( row, Cell, cell, cell.Column() = column );
+        if( column.TimeUnit() = Translations::MP_GlobalParameters_Day() ){
+          tpcell := selectobject( tprow, TransferPlanCell, tpcell, tpcell.TransferPlanColumn().ColumnDate() = column.Period() );
+          if( tprow.SourceStockpoingPointID() = 'CC' and tprow.TargetStockpoingPointID() = 'DL' ){
+            cell.CCTransferQty( [Real]tpcell.Value() );
+          }else if( tprow.SourceStockpoingPointID() = 'DL' and tprow.TargetStockpoingPointID() = 'CC' ){
+            cell.DLTransferQty( [Real]tpcell.Value() );
+          }
+        }else if( column.TimeUnit() = Translations::MP_GlobalParameters_Week() ){
+          period := column.Period() + Duration::Days( 6 );
+          tpcell := selectobject( tprow, TransferPlanCell, tpcell, tpcell.TransferPlanColumn().ColumnDate() = period.Date() );
+          
+          if( tprow.SourceStockpoingPointID() = 'CC' and tprow.TargetStockpoingPointID() = 'DL' ){
+            cell.CCTransferQty( [Real]tpcell.Value() );
+          }else if( tprow.SourceStockpoingPointID() = 'DL' and tprow.TargetStockpoingPointID() = 'CC' ){
+            cell.DLTransferQty( [Real]tpcell.Value() );
+          }
+        }
+      }
+    }
+    
+    rows := selectsortedset( table, Row, 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_MachiningPipelineSource0/_ROOT_Type_MachiningPipelineSource0.qbl b/_Main/BL/Type_MachiningPipelineSource0/_ROOT_Type_MachiningPipelineSource0.qbl
new file mode 100644
index 0000000..c2ef091
--- /dev/null
+++ b/_Main/BL/Type_MachiningPipelineSource0/_ROOT_Type_MachiningPipelineSource0.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachiningPipelineSource
+{
+  #keys: '5[415136.0.886711616][415136.0.886711614][0.0.0][415136.0.886711615][415136.0.886711617]'
+  BaseType: Object
+  Description: '鏈哄姞宸ョ绾挎姤琛�'
+  StructuredName: 'MachiningPipelineSources'
+}
diff --git a/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl b/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl
new file mode 100644
index 0000000..8e874be
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: '21.75'
+  TargetAttribute: StandardWorkingDay
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl b/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl
new file mode 100644
index 0000000..7b96cc3
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsHoliday
+{
+  #keys: '3[412672.1.34300030][412672.1.34300029][412672.1.34300031]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl
new file mode 100644
index 0000000..64cd9e9
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsHoliday
+{
+  TextBody:
+  [*
+    // rislai Jul-9-2024 (created)
+    
+    value := false
+    
+    if( this.EventType() = "娉曞畾鑺傚亣鏃�"){
+      value := true;
+    }
+    
+    this.IsHoliday( value );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index ab55c75..8417130 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -49,6 +49,28 @@
         Taborder: 3
       ]
     }
+    Component ButtonComprehensiveStandardHoursReport
+    {
+      #keys: '[412672.1.39734996]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_CHART'
+        Label: '宸ユ椂鍒舵姤琛�'
+        Taborder: 4
+      ]
+    }
+    Component ButtonEnginePipelineReport
+    {
+      #keys: '[415136.0.884991586]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_CONNECTION'
+        Label: 'Engine pipeline report'
+        Taborder: 5
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def
new file mode 100644
index 0000000..611518a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonComprehensiveStandardHoursReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursReport_OnClick
+{
+  #keys: '[412672.1.36822187]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'ComprehensiveStandardHoursReport', ButtonComprehensiveStandardHoursReport );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonEnginePipelineReport_OnClic.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonEnginePipelineReport_OnClic.def
new file mode 100644
index 0000000..e5bc9a9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonEnginePipelineReport_OnClic.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonEnginePipelineReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonEnginePipelineReport_OnClick
+{
+  #keys: '[415136.0.888144270]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Engine_pipleline_report", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_ListEnginePipelineDemand.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_ListEnginePipelineDemand.def
new file mode 100644
index 0000000..27d66db
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_ListEnginePipelineDemand.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListEnginePipelineDemand
+{
+  #keys: '[415136.0.889610579]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorEnginePipelineDemand
+    {
+      #keys: '[415136.0.889610580]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'structured[external[EnginePipelineCell]]'
+        Source: 'FormEnginePipelineReport.dhEnginePipelineCells'
+        Taborder: 0
+        Transformation: 'Elements.Demand'
+      ]
+    }
+    #child: listActionBarPageEnginePipelineDemand
+    Component DataSetLevelEnginePipelineDemand
+    {
+      #keys: '[415136.0.889610585]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuEnginePipelineDemand
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineType","title":"EngineType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EngineType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Model","title":"Model","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Model"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Period","title":"Period","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Period"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}}]'
+        ContextMenu: 'listContextMenuEnginePipelineDemand'
+        SortCriteria: 'EngineType;Model;Period'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listActionBarPageEnginePipelineDemand.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listActionBarPageEnginePipelineDemand.def
new file mode 100644
index 0000000..cfc1102
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listActionBarPageEnginePipelineDemand.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageEnginePipelineDemand
+{
+  #keys: '[415136.0.889610582]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listContextMenuEnginePipelineDemand.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listContextMenuEnginePipelineDemand.def
new file mode 100644
index 0000000..dad609b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/Component_listContextMenuEnginePipelineDemand.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuEnginePipelineDemand
+{
+  #keys: '[415136.0.889610587]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/_ROOT_Component_FormEnginePipelineDemand.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/_ROOT_Component_FormEnginePipelineDemand.def
new file mode 100644
index 0000000..16a715b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineDemand/_ROOT_Component_FormEnginePipelineDemand.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormEnginePipelineDemand
+{
+  #keys: '[415136.0.889610518]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListEnginePipelineDemand
+  ]
+  Properties:
+  [
+    Image: 'NOTE'
+    Title: 'Engine pipeline demand'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_ListEnginePipelineProduction.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_ListEnginePipelineProduction.def
new file mode 100644
index 0000000..85baf9c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_ListEnginePipelineProduction.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListEnginePipelineProduction
+{
+  #keys: '[415136.0.888050782]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorEnginePipelineProduction
+    {
+      #keys: '[415136.0.888050783]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'structured[EnginePipelineCell]'
+        Source: 'FormEnginePipelineReport.dhEnginePipelineCells'
+        Taborder: 0
+        Transformation: 'Elements.Production'
+      ]
+    }
+    #child: listActionBarPageEnginePipelineProduction
+    Component DataSetLevelEnginePipelineProduction
+    {
+      #keys: '[415136.0.888050788]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuEnginePipelineProduction
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineType","title":"EngineType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EngineType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Period","title":"Period","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Period"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DLProduction","title":"DLProduction","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DLProduction"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CCProduction","title":"CCProduction","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CCProduction"}}]'
+        ContextMenu: 'listContextMenuEnginePipelineProduction'
+        SortCriteria: 'EngineType;Period'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listActionBarPageEnginePipelineProduction.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listActionBarPageEnginePipelineProduction.def
new file mode 100644
index 0000000..360385c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listActionBarPageEnginePipelineProduction.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageEnginePipelineProduction
+{
+  #keys: '[415136.0.888050785]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listContextMenuEnginePipelineProduction.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listContextMenuEnginePipelineProduction.def
new file mode 100644
index 0000000..4e440a5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/Component_listContextMenuEnginePipelineProduction.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuEnginePipelineProduction
+{
+  #keys: '[415136.0.888050790]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/_ROOT_Component_FormEnginePipelineProduction.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/_ROOT_Component_FormEnginePipelineProduction.def
new file mode 100644
index 0000000..4937166
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineProduction/_ROOT_Component_FormEnginePipelineProduction.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormEnginePipelineProduction
+{
+  #keys: '[415136.0.886943096]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListEnginePipelineProduction
+  ]
+  Properties:
+  [
+    Image: 'NOTE'
+    Title: 'Engine pipeline production'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_MatrixEditorTable.def
new file mode 100644
index 0000000..b681d32
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_MatrixEditorTable.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditorTable
+{
+  #keys: '[415136.0.884991429]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellTable
+    {
+      #keys: '[415136.0.884991430]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCell
+        {
+          #keys: '[415136.0.884991431]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'EnginePipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Column.CellValue'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'Column'
+        Row: 'Row'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsTable
+    {
+      #keys: '[415136.0.884991434]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRow
+        {
+          #keys: '[415136.0.884991435]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'EnginePipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Row'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'RowNr'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsTable
+    {
+      #keys: '[415136.0.884991438]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumn
+        {
+          #keys: '[415136.0.884991439]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'EnginePipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Column'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable
+    #child: matrixeditorContextMenuTable
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumnsTable'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorRowsTable'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def"
new file mode 100644
index 0000000..490d3d9
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelExport\043570.def"
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelExport id:PanelExport_570
+{
+  #keys: '[415136.0.884991008]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonSummaryExport
+    {
+      #keys: '[415136.0.884991009]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelHeader.def
new file mode 100644
index 0000000..647dc18
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelHeader.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelHeader
+{
+  #keys: '[415136.0.884990889]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelSearch
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelPeriod\043325.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelPeriod\043325.def"
new file mode 100644
index 0000000..adcaaa3
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelPeriod\043325.def"
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component PanelPeriod id:PanelPeriod_325
+{
+  #keys: '[415136.0.884991005]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DateSelectorStart
+    {
+      #keys: '[415136.0.884991006]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start date'
+        Taborder: 0
+      ]
+    }
+    Component DateSelectorEnd
+    {
+      #keys: '[415136.0.884991007]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End date'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelSearch.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelSearch.def
new file mode 100644
index 0000000..7cfd66b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelSearch.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component PanelSearch
+{
+  #keys: '[415136.0.884991004]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelPeriod_325
+    #child: PanelExport_570
+    #child: PanelTimeUnit
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTable.def
new file mode 100644
index 0000000..88e1943
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTable.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelTable
+{
+  #keys: '[415136.0.884991246]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable
+  ]
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTimeUnit.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTimeUnit.def
new file mode 100644
index 0000000..47c86f2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_PanelTimeUnit.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+Component PanelTimeUnit
+{
+  #keys: '[415136.0.884991010]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component RadioButtonGroupUseForTimeUnit
+    {
+      #keys: '[415136.0.884991011]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        ButtonLabels: 'Day;Week'
+        ButtonValues: 'Day;Week'
+        Orientation: 'horizontal'
+        ShowTitle: false
+        Taborder: 0
+        Title: 'Periods'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixEditorActionBarPageTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixEditorActionBarPageTable.def
new file mode 100644
index 0000000..511fcad
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixEditorActionBarPageTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable
+{
+  #keys: '[415136.0.884991442]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixeditorContextMenuTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixeditorContextMenuTable.def
new file mode 100644
index 0000000..5a9cab1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Component_matrixeditorContextMenuTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable
+{
+  #keys: '[415136.0.884991445]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_MatrixEditorTable_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_MatrixEditorTable_OnSelectionChanged.def
new file mode 100644
index 0000000..2e8c090
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_MatrixEditorTable_OnSelectionChanged.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: MatrixEditorTable
+Response OnSelectionChanged (
+  structured[EnginePipelineCell] selection
+) id:Response_MatrixEditorTable_OnSelectionChanged
+{
+  #keys: '[415136.0.886943328]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMatrixEditor_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //閫夋嫨鐨勫崟鍏冩牸
+      dhEnginePipelineCells.Data( selection.Copy() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def
new file mode 100644
index 0000000..54cbda2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_OnCreated.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormEnginePipelineReport_OnCreated
+{
+  #keys: '[415136.0.884991340]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      //if( not isnull( MacroPlan.EnginePipelineSource() ) ){
+        EnginePipelineSource::Initialize( MacroPlan );
+      //}
+      //info( '------------------1----------------' );
+      table := selectobject( MacroPlan, EnginePipelineSource.Report, table, table.IsShow() );
+      //info( '------------------2----------------', table.IsShow() );
+      DataHolderTable.Data( table );
+      
+      dhSearch.Data( table.Source().Search() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelExport_570_ButtonSummaryExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelExport_570_ButtonSummaryExport_OnClick.def
new file mode 100644
index 0000000..42b92ae
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelExport_570_ButtonSummaryExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: PanelExport_570/ButtonSummaryExport
+Response OnClick () id:Response_PanelExport_570_ButtonSummaryExport_OnClick
+{
+  #keys: '[415136.0.884991001]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := EnginePipelineSource::Download( MacroPlan );
+      
+      Application.Download( EnginePipelineReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorEnd_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorEnd_OnChanged.def
new file mode 100644
index 0000000..166de15
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorEnd_OnChanged.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelPeriod_325/DateSelectorEnd
+Response OnChanged () id:Response_PanelPeriod_325_DateSelectorEnd_OnChanged
+{
+  #keys: '[415136.0.884991002]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( this.Date() < DateSelectorStart.Date() ){
+        this.HintError( 'The end date cannot be less than the start date!' );
+      }else{
+        if( dhSearch.Data().EndDate() <> this.Date() ){
+          dhSearch.Data().EndDate( this.Date() );
+          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorStart_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorStart_OnChanged.def
new file mode 100644
index 0000000..223f7f8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelPeriod_325_DateSelectorStart_OnChanged.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelPeriod_325/DateSelectorStart
+Response OnChanged () id:Response_PanelPeriod_325_DateSelectorStart_OnChanged
+{
+  #keys: '[415136.0.884991003]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( this.Date() > DateSelectorEnd.Date() ){
+        this.HintError( 'The start date cannot be later than the end date!' );
+      }else{
+        if( dhSearch.Data().StartDate() <> this.Date() ){
+          dhSearch.Data().StartDate( this.Date() );
+          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnChanged.def
new file mode 100644
index 0000000..57a65bb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelTimeUnit/RadioButtonGroupUseForTimeUnit
+Response OnChanged () id:Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnChanged
+{
+  #keys: '[415136.0.884991000]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鍖洪棿鏀瑰彉鍚庡埛鏂版樉绀�
+      if( dhSearch.Data().TimeUnit() <> this.BoundValue() ){
+        dhSearch.Data().TimeUnit( this.BoundValue() );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnCreated.def
new file mode 100644
index 0000000..86c7e81
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelTimeUnit/RadioButtonGroupUseForTimeUnit
+Response OnCreated () id:Response_PanelTimeUnit_RadioButtonGroupUseForTimeUnit_OnCreated
+{
+  #keys: '[415136.0.884990999]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      this.ButtonValues( Translations::MP_GlobalParameters_Day() + ';' + Translations::MP_GlobalParameters_Week() + ';' + Translations::MP_GlobalParameters_Month() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/_ROOT_Component_FormEnginePipelineReport.def b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/_ROOT_Component_FormEnginePipelineReport.def
new file mode 100644
index 0000000..3a6bcc9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormEnginePipelineReport/_ROOT_Component_FormEnginePipelineReport.def
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormEnginePipelineReport
+{
+  #keys: '[415136.0.884990753]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    Component DataHolderTable id:DataHolderTable_750
+    {
+      #keys: '[415136.0.884990847]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'EnginePipelineReport'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component dhSearch id:dhSearch_316
+    {
+      #keys: '[415136.0.884990864]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'EnginePipelineSearch'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    #child: PanelHeader
+    #child: PanelTable
+    Component dhEnginePipelineCells id:dhEnginePipelineCells_430
+    {
+      #keys: '[415136.0.888401920]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[EnginePipelineCell]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CONNECTION'
+    Title: 'Engine pipeline report'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
index fe8fadd..f819d7b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
@@ -17,7 +17,6 @@
         ShowTitle: false
         Taborder: 0
         Title: 'Periods'
-        Tooltip: '<html>Select if the periods are used for planning or merely for visualization.<br>The planning periods define the granularity at which planning is done.<br>In case of overlapping planning periods, the smallest ones are used.<br>The planning periods are shown in the period overview in blue.</html>'
       ]
     }
   ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_MatrixEditorTable\043870.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_MatrixEditorTable\043870.def"
new file mode 100644
index 0000000..4b75459
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_MatrixEditorTable\043870.def"
@@ -0,0 +1,98 @@
+Quintiq file version 2.0
+Component MatrixEditorTable id:MatrixEditorTable_870
+{
+  #keys: '[415136.0.893820897]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellTable
+    {
+      #keys: '[415136.0.893820898]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCell
+        {
+          #keys: '[415136.0.893820899]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MachiningPipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Column.Cell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'CCAssemblyPlanQty;CCProductionQty;CCTransferQty;CCInventoryQty;DLAssemblyPlanQty;DLProductionQty;DLTransferQty;DLInventoryQty;TotalInventoryQty'
+        Column: 'Column'
+        Row: 'Row'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsTable
+    {
+      #keys: '[415136.0.893820900]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRow
+        {
+          #keys: '[415136.0.893820901]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MachiningPipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Row'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsTable
+    {
+      #keys: '[415136.0.893820902]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumn
+        {
+          #keys: '[415136.0.893820903]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MachiningPipelineReport'
+            Source: 'DataHolderTable'
+            Taborder: 0
+            Transformation: 'Column'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable_1
+    #child: matrixeditorContextMenuTable_1
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumnsTable'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorRowsTable'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def
new file mode 100644
index 0000000..f599c42
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelExport.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component PanelExport
+{
+  #keys: '[415136.0.893820864]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonSummaryExport
+    {
+      #keys: '[415136.0.893820865]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelHeader\043832.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelHeader\043832.def"
new file mode 100644
index 0000000..0e5f9ac
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelHeader\043832.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelHeader id:PanelHeader_832
+{
+  #keys: '[415136.0.893820859]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelSearch_957
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelPeriod.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelPeriod.def
new file mode 100644
index 0000000..dae1858
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelPeriod.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component PanelPeriod
+{
+  #keys: '[415136.0.893820861]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DateSelectorStart
+    {
+      #keys: '[415136.0.893820862]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start date'
+        Taborder: 0
+      ]
+    }
+    Component DateSelectorEnd
+    {
+      #keys: '[415136.0.893820863]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End date'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelSearch\043957.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelSearch\043957.def"
new file mode 100644
index 0000000..c0e0948
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelSearch\043957.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component PanelSearch id:PanelSearch_957
+{
+  #keys: '[415136.0.893820860]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelPeriod
+    #child: PanelExport
+    #child: PanelTimeUnit_778
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTable\043141.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTable\043141.def"
new file mode 100644
index 0000000..7d91afa
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTable\043141.def"
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelTable id:PanelTable_141
+{
+  #keys: '[415136.0.893820896]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable_870
+  ]
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTimeUnit\043778.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTimeUnit\043778.def"
new file mode 100644
index 0000000..9d87c09
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_PanelTimeUnit\043778.def"
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+Component PanelTimeUnit id:PanelTimeUnit_778
+{
+  #keys: '[415136.0.893820866]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component RadioButtonGroupUseForTimeUnit
+    {
+      #keys: '[415136.0.893820867]'
+      BaseType: 'WebRadioButtonGroup'
+      Properties:
+      [
+        ButtonLabels: 'Day;Week'
+        ButtonValues: 'Day;Week'
+        Orientation: 'horizontal'
+        ShowTitle: false
+        Taborder: 0
+        Title: 'Periods'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixEditorActionBarPageTable\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixEditorActionBarPageTable\0431.def"
new file mode 100644
index 0000000..b7dcd53
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixEditorActionBarPageTable\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable id:matrixEditorActionBarPageTable_1
+{
+  #keys: '[415136.0.893820904]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixeditorContextMenuTable\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixeditorContextMenuTable\0431.def"
new file mode 100644
index 0000000..9826bd0
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Component_matrixeditorContextMenuTable\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable id:matrixeditorContextMenuTable_1
+{
+  #keys: '[415136.0.893820905]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def
new file mode 100644
index 0000000..c07555d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_OnCreated.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormMachiningPipelineReport_OnCreated
+{
+  #keys: '[415136.0.897182652]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      //if( not isnull( MacroPlan.EnginePipelineSource() ) ){
+        MachiningPipelineSource::Initialize( MacroPlan );
+      //}
+      //info( '------------------1----------------' );
+      table := selectobject( MacroPlan, MachiningPipelineSource.Report, table, table.IsShow() );
+      //info( '------------------2----------------', table.IsShow() );
+      DataHolderTable.Data( table );
+      
+      dhSearch.Data( table.Source().Search() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelExport_ButtonSummaryExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
new file mode 100644
index 0000000..d1bbc51
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: PanelExport/ButtonSummaryExport
+Response OnClick () id:Response_PanelExport_ButtonSummaryExport_OnClick
+{
+  #keys: '[415136.0.893820856]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := MachiningPipelineSource::Download( MacroPlan );
+      
+      Application.Download( MachiningPipelineReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def
new file mode 100644
index 0000000..89d54eb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelPeriod/DateSelectorEnd
+Response OnChanged () id:Response_PanelPeriod_DateSelectorEnd_OnChanged
+{
+  #keys: '[415136.0.893820857]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( this.Date() < DateSelectorStart.Date() ){
+        this.HintError( 'The end date cannot be less than the start date!' );
+      }else{
+        if( dhSearch.Data().EndDate() <> this.Date() ){
+          dhSearch.Data().EndDate( this.Date() );
+          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def
new file mode 100644
index 0000000..f1b84da
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelPeriod/DateSelectorStart
+Response OnChanged () id:Response_PanelPeriod_DateSelectorStart_OnChanged
+{
+  #keys: '[415136.0.893820858]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏃ユ湡鏀瑰彉鍚庡埛鏂版樉绀�
+      if( this.Date() > DateSelectorEnd.Date() ){
+        this.HintError( 'The start date cannot be later than the end date!' );
+      }else{
+        if( dhSearch.Data().StartDate() <> this.Date() ){
+          dhSearch.Data().StartDate( this.Date() );
+          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnChanged.def
new file mode 100644
index 0000000..983fe7e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelTimeUnit_778/RadioButtonGroupUseForTimeUnit
+Response OnChanged () id:Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnChanged
+{
+  #keys: '[415136.0.893820855]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鍖洪棿鏀瑰彉鍚庡埛鏂版樉绀�
+      if( dhSearch.Data().TimeUnit() <> this.BoundValue() ){
+        dhSearch.Data().TimeUnit( this.BoundValue() );
+        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnCreated.def
new file mode 100644
index 0000000..3e62dba
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelTimeUnit_778/RadioButtonGroupUseForTimeUnit
+Response OnCreated () id:Response_PanelTimeUnit_778_RadioButtonGroupUseForTimeUnit_OnCreated
+{
+  #keys: '[415136.0.893820854]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      this.ButtonValues( Translations::MP_GlobalParameters_Day() + ';' + Translations::MP_GlobalParameters_Week() + ';' + Translations::MP_GlobalParameters_Month() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/_ROOT_Component_FormMachiningPipelineReport.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/_ROOT_Component_FormMachiningPipelineReport.def
new file mode 100644
index 0000000..323e7bd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachiningPipelineReport/_ROOT_Component_FormMachiningPipelineReport.def
@@ -0,0 +1,38 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMachiningPipelineReport
+{
+  #keys: '[415136.0.893820723]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    Component DataHolderTable
+    {
+      #keys: '[415136.0.893820797]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'MachiningPipelineReport'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component dhSearch
+    {
+      #keys: '[415136.0.893820823]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'MachiningPipelineSearch'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    #child: PanelHeader_832
+    #child: PanelTable_141
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CONNECTION'
+    Title: 'Machining pipeline report'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
new file mode 100644
index 0000000..915e9ca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor859
+{
+  #keys: '[412672.1.33151379]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell642
+    {
+      #keys: '[412672.1.33151380]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor872
+        {
+          #keys: '[412672.1.33151381]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_Default)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'RealValue'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows590
+    {
+      #keys: '[412672.1.33151384]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor862
+        {
+          #keys: '[412672.1.33151385]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns481
+    {
+      #keys: '[412672.1.33151388]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor661
+        {
+          #keys: '[412672.1.33151389]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage681
+    #child: matrixeditorContextMenu445
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns481'
+    ContextMenu: 'matrixeditorContextMenu445'
+    Rows: 'MatrixEditorRows590'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
new file mode 100644
index 0000000..8755839
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component Panel743
+{
+  #keys: '[412672.1.33151321]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor859
+    Component dhTable
+    {
+      #keys: '[412672.1.33151419]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def
new file mode 100644
index 0000000..f28ea9d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage681
+{
+  #keys: '[412672.1.33151392]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def
new file mode 100644
index 0000000..d3ba7c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu445
+{
+  #keys: '[412672.1.33151395]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def
new file mode 100644
index 0000000..1263073
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component pMain
+{
+  #keys: '[412672.1.33151242]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: Panel743
+    #child: pOperaction
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def" "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
new file mode 100644
index 0000000..8be63c5
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component pOperaction
+{
+  #keys: '[412672.1.33151285]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component cbStandardHours
+    {
+      #keys: '[412672.1.33151450]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        CheckboxType: 'toggle'
+        Label: '鏍囧噯宸ユ椂鍒�'
+        Taborder: 0
+      ]
+    }
+    Component cbComprehensiveHours
+    {
+      #keys: '[412672.1.33151469]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        CheckboxType: 'toggle'
+        Label: '缁煎悎宸ユ椂鍒�'
+        Taborder: 1
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.1.33151495]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.1.33151514]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Taborder: 3
+      ]
+    }
+    Component bCalculating
+    {
+      #keys: '[412672.1.33180446]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Calculating'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def
new file mode 100644
index 0000000..32e7ad6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: pOperaction/bCalculating
+Response OnClick () id:Response_pOperaction_bCalculating_OnClick
+{
+  #keys: '[412672.1.33160729]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      shiftPlans := selectset( MacroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan,LocalTool::IsOverlap( dsStartDate.Date(),dsEndDate.Date(),shiftPlan.UnitPeriodTime().Period_MP().StartDate(),shiftPlan.UnitPeriodTime().Period_MP().EndDate()));
+      
+      if( cbStandardHours.Checked() ){
+        dhTable.Data( LocalCell_Default::GenerateStandardHoursReport( MacroPlan ,shiftPlans ,RecycleBin )); 
+      }
+      if( cbComprehensiveHours.Checked()){
+        dhTable.Data( LocalCell_Default::GenerateComprehensiveHoursReport( MacroPlan ,shiftPlans ,RecycleBin )); 
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def
new file mode 100644
index 0000000..7f3145b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pOperaction/cbComprehensiveHours
+Response OnUserChanged () id:Response_pOperaction_cbComprehensiveHours_OnUserChanged
+{
+  #keys: '[412672.1.33151755]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnUserChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      cbStandardHours.Checked( not this.Checked() );
+      if( this.Checked() ){
+        FormComprehensiveStandardHoursReport.Title( "缁煎悎宸ユ椂鍒舵姤琛�" );
+      }else{
+        FormComprehensiveStandardHoursReport.Title( "鏍囧噯宸ユ椂鍒舵姤琛�" );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def
new file mode 100644
index 0000000..c65fbd7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pOperaction/cbStandardHours
+Response OnUserChanged () id:Response_pOperaction_cbStandardHours_OnUserChanged
+{
+  #keys: '[412672.1.33151672]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnUserChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      cbComprehensiveHours.Checked( not this.Checked() );
+      
+      if( this.Checked() ){
+        FormComprehensiveStandardHoursReport.Title( "鏍囧噯宸ユ椂鍒舵姤琛�" );
+      }else{
+        FormComprehensiveStandardHoursReport.Title( "缁煎悎宸ユ椂鍒舵姤琛�" );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def
new file mode 100644
index 0000000..5a8f45a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormComprehensiveStandardHoursReport
+{
+  #keys: '[412672.1.33151116]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pMain
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CHART'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw b/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw
new file mode 100644
index 0000000..97583b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    page: ''
+    group: ''
+    index: 0
+    image: 'DOCUMENT_CHART'
+    description: ''
+  }
+  formatversion: 2
+  id: 'ComprehensiveStandardHoursReport'
+  name: 'ComprehensiveStandardHoursReport'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Engine_pipleline_report.vw b/_Main/UI/MacroPlannerWebApp/Views/Engine_pipleline_report.vw
new file mode 100644
index 0000000..0b36ffb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Engine_pipleline_report.vw
@@ -0,0 +1,367 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormEnginePipelineReport
+      {
+        title: 'QMacroPlanner::FormEnginePipelineReport'
+        shown: true
+        componentID: 'QMacroPlanner::FormEnginePipelineReport'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormEnginePipelineReport_PanelHeader
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_PanelSearch
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_PanelPeriod
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_PanelTimeUnit
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_PanelExport
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_PanelTable
+          {
+            sizeRatio: 1
+          }
+          FormEnginePipelineReport_MatrixEditorTable
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormEnginePipelineReport.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Value
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Value'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormMachiningPipelineReport
+      {
+        title: 'QMacroPlanner::FormMachiningPipelineReport'
+        shown: true
+        componentID: 'QMacroPlanner::FormMachiningPipelineReport'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 16
+          rowSpan: 19
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormMachiningPipelineReport_PanelHeader
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_PanelSearch
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_PanelPeriod
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_PanelTimeUnit
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_PanelExport
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_PanelTable
+          {
+            sizeRatio: 1
+          }
+          FormMachiningPipelineReport_MatrixEditorTable
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormMachiningPipelineReport.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_CCAssemblyPlanQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'CCAssemblyPlanQty'
+                    }
+                    attribute_CCProductionQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'CCProductionQty'
+                    }
+                    attribute_CCTransferQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 2
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'CCTransferQty'
+                    }
+                    attribute_CCInventoryQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 3
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'CCInventoryQty'
+                    }
+                    attribute_DLAssemblyPlanQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 4
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DLAssemblyPlanQty'
+                    }
+                    attribute_DLProductionQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 5
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DLProductionQty'
+                    }
+                    attribute_DLTransferQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 6
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DLTransferQty'
+                    }
+                    attribute_DLInventoryQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 7
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DLInventoryQty'
+                    }
+                    attribute_TotalInventoryQty
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 8
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'TotalInventoryQty'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 20
+    image: 'DOCUMENT_CONNECTION'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Engine_pipleline_report'
+  name: 'Engine pipleline report'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
index 6bec5b0..f547af8 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
@@ -2,10 +2,10 @@
 {
   viewcontents
   {
+    image: 'MONEY_BILL_FIRE'
     page: ''
     group: ''
     index: 0
-    image: 'MONEY_BILL_FIRE'
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
index 1caecfc..7ecffee 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
@@ -2,10 +2,10 @@
 {
   viewcontents
   {
+    image: 'COMPASSES'
     page: ''
     group: ''
     index: 0
-    image: 'COMPASSES'
     description: ''
   }
   formatversion: 2

--
Gitblit v1.9.3