From b18e4004f21e9ec18e2984630888f6626befeb55 Mon Sep 17 00:00:00 2001
From: yanweiyuan3 <yanweiyuan3@gmail.com>
Date: 星期六, 07 十月 2023 11:02:28 +0800
Subject: [PATCH] Merge branch 'dev' into dev_yy

---
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick.def                                           |   18 
 _Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl                                                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/_ROOT_Component_DialogEditCustomerOrderPriority.def                                                     |   32 
 _Main/BL/Type_YuxTest/Attribute_TestString.qbl                                                                                                                                |    7 
 _Main/BL/EDI/Broker_GlobalOTDTable_CustomerGrade.qbl                                                                                                                          |   64 
 _Main/BL/Relations/Relation_Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow.qbl                                                                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def                                              |   28 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def                                                   |    4 
 _Main/BL/Type_Global_ShowCell/Attribute_Value.qbl                                                                                                                             |    7 
 _Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl                                                                                        |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_PanelButton_ButtonTransform_OnClick.def                                                              |   20 
 _Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl                                                                                                  |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def                                                     |    4 
 _Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowRow_Global_ShowRow_GlobalOTDTable.qbl                                                                                   |   23 
 _Main/BL/Type_YuxTest/StaticMethod_Export.qbl                                                                                                                                 |   85 
 LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport#382.qbl                                                                                                  |    4 
 _Main/BL/Type_Global_ShowColumn/Attribute_ColumnName.qbl                                                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def                                                                   |   12 
 _Main/UI/MacroPlannerWebApp/Views/Test.vw                                                                                                                                     |  794 ++++++
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def                                                                               |   50 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def                                                     |    4 
 _Main/BL/Type_Global_ShowRow/Attribute_RowNr.qbl                                                                                                                              |    7 
 _Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl                                                                                   |    3 
 _Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCount.qbl                                                                                                                 |    8 
 _Main/BL/Type_CustomerOrder/Attribute_BusinessType.qbl                                                                                                                        |    8 
 _Main/BL/Type_Global_MappingCustomerGrade/TypeIndex_Global_MappingCustomerGradeTypeIndex.qbl                                                                                  |   20 
 _Main/BL/Type_CustomerAndForecastOrder/Attribute_CustomerOrderID.qbl                                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlContent.def                                                                                     |   33 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl                                                                                                 |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_ListInterfaceTest.def                                                                                       |   59 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def                                                                               |   15 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_ProductGrade.qbl                                                                                                            |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnCancel_OnClick.def                                                                    |   15 
 _Main/BL/Type_CustomerAndForecastOrder/StaticMethod_RefreshData.qbl                                                                                                           |   56 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl                                                                                    |   20 
 _Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl                                                                                                                   |   18 
 _Main/BL/Type_Global_MappingCustomerGrade/Attribute_CustomerGrade.qbl                                                                                                         |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def                                                  |   33 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_OrganCode.qbl                                                                                                                   |    9 
 _Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl                                                                             |   14 
 _Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl                                                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnDataChanged.def                                                      |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged.def                                         |   18 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_SheetProfitability.qbl                                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def                                                                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def             |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def                                                                                       |    4 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl                                                                           |   23 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                                                           |    5 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated.def                                             |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listActionBarPageInterfaceTest.def                                                                          |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_EditCustomerOrderPriority.def                                                                    |   17 
 _Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl                                                                                                                |    1 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType#905.qbl                                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_OpenChoose.def                                                                                        |   10 
 LibSOPImportExport/metadata.properties                                                                                                                                        |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOptions.def                                                                                   |   62 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews#633.def                                                                      |   11 
 _Main/BL/Type_Global_ShowColumn/_ROOT_Type_Global_ShowColumn.qbl                                                                                                              |    9 
 _Main/BL/Type_Global_ShowRow/_ROOT_Type_Global_ShowRow.qbl                                                                                                                    |    9 
 _Main/BL/Type_PriorityFactor/Attribute_ReflectionType.qbl                                                                                                                     |    7 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl                                                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgInterfaceTest.def                                                                                  |   24 
 _Main/BL/KnowledgeBaseDomain_MacroPlanner/KnowledgeBase_Knowledge_MP/_ROOT_KnowledgeBase_Knowledge_MP.qbl                                                                     |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlContent.def                                                                                |   91 
 _Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl                                                                                         |   20 
 _Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl                                                                                                                  |   88 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def                                                                               |    2 
 _Main/BL/Type_Global_MappingDOI_DSI/_ROOT_Type_Global_MappingDOI_DSI.qbl                                                                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnCreated.def                                                                |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnOk_OnClick.def                                                                   |   15 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_ProductID.qbl                                                                                                                   |    9 
 _Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl                                                                                                         |   84 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def                                                             |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def                                                                           |   13 
 _Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl                                                                                                                              |    7 
 _Main/BL/Type_CustomerAndForecastOrder/Attribute_ForecastID.qbl                                                                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton#713.def                                                                 |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl                                                                           |   23 
 _Main/BL/Type_CustomerAndForecastOrder/StaticMethod_CreateData.qbl                                                                                                            |   22 
 _Main/UI/MacroPlannerWebApp/Views/PriorityTest.vw                                                                                                                             | 2745 +++++++++++++++++++++
 _Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl                                                                                                 |    8 
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl                                                                                                             |    8 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl                                                                                         |    6 
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl                                                                                                                    |   75 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl                                                                                                             |    0 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl                                                                                    |    4 
 _Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan.qbl                                                                                                            |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_listContextMenuSD.def                                                                                      |   27 
 _Main/BL/Type_Global_MappingCustomerGrade/Attribute_Customer.qbl                                                                                                              |    9 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_DOI.qbl                                                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def                                                  |   14 
 _Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl                                                                                                                                  |    9 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl                                                                           |   24 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl                                                                                                     |    4 
 _Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl                                                                                                                 |  124 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixeditorContextMenuShowInterfaceData.def                                                            |   10 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl                                                                           |   23 
 _Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl                                                                                                                 |   23 
 _Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl                                                                                                                           |   22 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl                                                                                            |    6 
 _Main/BL/Relations/Relation_Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/_ROOT_Component_FormShowInterfaceData.def                                                                         |   17 
 _Main/BL/Type_YuxTest/Attribute_TestReal.qbl                                                                                                                                  |    7 
 _Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl                                                                                                                            |   29 
 _Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl                                                                                                                          |    6 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuGlobalOTDTableTest_OnClick.def                                               |   12 
 _Main/BL/Type_CustomerOrder/Attribute_OrderType.qbl                                                                                                                           |    8 
 _Main/BL/Type_PriorityResult/StaticMethod_CalculateBracketScore.qbl                                                                                                           |   19 
 _Main/BL/Type_Global_MappingDOI_DSI/TypeIndex_Global_MappingDOI_DSITypeIndex.qbl                                                                                              |   16 
 _Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl                                                                                                                 |   91 
 _Main/BL/Type_CustomerOrder/Attribute_CustomerPolicy.qbl                                                                                                                      |    8 
 _Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl                                                                                                                        |   47 
 _Main/BL/Type_CustomerOrder/Attribute_IsAvailable.qbl                                                                                                                         |    8 
 _Main/BL/Type_YuxTest/Attribute_TestDate.qbl                                                                                                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def                                          |    8 
 _Main/BL/Type_YuxTest/StaticMethod_ExportTest#887.qbl                                                                                                                         |   26 
 _Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/FunctionOverride_CalcStockLevelInDays.qbl                                                                            |   79 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl                                                                           |   23 
 _Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable.qbl                                                                             |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuPriorityResult_OnClick.def                                               |   19 
 _Main/BL/Type_PriorityFactor/Attribute_ReflectionAttribute.qbl                                                                                                                |    7 
 _Main/BL/Type_YuxTest/Attribute_TestNumber.qbl                                                                                                                                |    7 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnCreated.def                                                          |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_PanelButton.def                                                                                     |   26 
 _Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl                                                                                                |    6 
 _Main/BL/EDI/Broker_GlobalOTDTable_DOI_DSI.qbl                                                                                                                                |   71 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnApply_OnClick.def                                                                |   19 
 _Main/BL/Type_Global_ShowCell/_ROOT_Type_Global_ShowCell.qbl                                                                                                                  |    9 
 _Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/_ROOT_Type_ProductInStockingPointInPeriodPlanningLeaf.qbl                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def                                                                          |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def                                                                                 |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def                                                                                         |    2 
 _Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl                                                                                                                       |  124 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlActions.def                                                                                |   50 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def                                        |   10 
 LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl                                                                                            |    3 
 _Main/BL/Type_Global_ShowColumn/Attribute_ColumnIndex.qbl                                                                                                                     |    7 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart#156.qbl                                                                                                         |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def                                         |    4 
 _Main/BL/Type_Global_MappingCustomerGrade/_ROOT_Type_Global_MappingCustomerGrade.qbl                                                                                          |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def                                                  |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def                                                                            |   24 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick.def                                      |   16 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl                                                                                           |   17 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def                                                                        |   18 
 _Main/BL/Type_CustomerOrder/Attribute_SheetProfitability.qbl                                                                                                                  |    8 
 _Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable.qbl                                                                                 |   23 
 _Main/BL/Relations/Relation_Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingD.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_MatrixEditorShowInterfaceData.def                                                                       |   97 
 _Main/BL/Type_CustomerOrder/Attribute_SegmentPriority.qbl                                                                                                                     |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC#663.def |    2 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_SegmentPriority.qbl                                                                                                         |    7 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderTime.qbl                                                                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_abgInterfaceTest_btnInterfaceTest_OnClick.def                                            |   16 
 _Main/UI/MacroPlannerWebApp/Views/接口测试.vw                                                                                                                                     |  178 +
 LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl                                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def                                                                              |    2 
 _Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl                                                                                                        |    2 
 _Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl                                                                                                                               |    7 
 _Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl                                                                                                                        |    2 
 _Main/BL/Type_ImportExcel/Method_Execute.qbl                                                                                                                                  |   43 
 _Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl                                                                                           |    4 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport#522.qbl                                                                                |    5 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl                                                                           |   23 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 
 _Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl                                                                                                      |    6 
 _Main/BL/Type_CustomerOrder/Attribute_OrderTime.qbl                                                                                                                           |    8 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl                                                                                          |   20 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlActions.def                                                                                     |   40 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/_ROOT_Component_DialogChoosePriorityPolicy.def                                                               |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def                                                                |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def                                                              |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def                                                                |    2 
 _Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl                                                                                                                |   33 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_ClickBynOk.def                                                                                   |   17 
 _Main/BL/Type_PriorityResult/Attribute_CustomerOrderID.qbl                                                                                                                    |    7 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl                                                                                                           |   38 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_DSI.qbl                                                                                                                         |    8 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl                                                                                                |    2 
 _Main/BL/Type_CustomerOrder/Attribute_ProductGrade.qbl                                                                                                                        |    8 
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl                                                                                                            |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def                                                              |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuEditCustomerOrderPriority_OnClic.def                                     |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def                                                   |   12 
 _Main/BL/Relations/Relation_Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_Ma.qbl                                                                           |   23 
 _Main/BL/Type_GlobalDTOTable/Method_Test.qbl                                                                                                                                  |    9 
 _Main/BL/Type_Global_MappingCustomerGrade/Attribute_BusinessType.qbl                                                                                                          |    9 
 _Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl                                                                                                                  |   29 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnCancel_OnClick.def                                                               |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest.def                                                                                      |   37 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixEditorActionBarPageShowInterfaceData.def                                                          |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def             |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef#1.def                                                          |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def                                      |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def                                                           |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def                                                             |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnDataChanged.def                                                            |   18 
 /dev/null                                                                                                                                                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def                                     |    4 
 _Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl                                                                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest981.def                                                                                   |   14 
 208 files changed, 7,312 insertions(+), 169 deletions(-)

diff --git a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
index 9f508eb..c429f65 100644
--- a/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
+++ b/LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl
@@ -12,7 +12,6 @@
     Cardinality: '1toN'
     ObjectDefinition: MPSync
     OwningSide: 'Owned'
-    InterfaceProperties { Accessibility: 'Module' }
   }
   RelationSide.RightSide MPSync
   {
@@ -20,6 +19,5 @@
     Cardinality: '0to1'
     ObjectDefinition: ImportExcel
     OwningSide: 'Reference'
-    InterfaceProperties { Accessibility: 'Module' }
   }
 }
diff --git a/LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl b/LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl
index 7b7de81..704abc5 100644
--- a/LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl
+++ b/LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl
@@ -16,7 +16,8 @@
                                
       if( not isnull( planningup ) )
       {
-         value := planningup.BaseAvailableCapacity().HoursAsReal() * planningup.MaximumLoadPercentage() / 100;   
+         value := planningup.BaseAvailableCapacity().HoursAsReal() * planningup.MaximumLoadPercentage() / 100
+                  * this.PlanningSystemRatio(); // Tianma fix 20230926
       }
     }
     else
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
index 4ea6109..af8fd45 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport\043522.qbl"
@@ -1,6 +1,9 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o, Boolean needUserUploadAllFiles) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o,
+  Boolean needUserUploadAllFiles
+) remote as Boolean
 {
   TextBody:
   [*
diff --git a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
index b8c6585..a6720f7 100644
--- a/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
+++ b/LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method HasAllRequiredFilesForImport (output Strings missingFiles_o) as Boolean
+Method HasAllRequiredFilesForImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   TextBody:
   [*
diff --git "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl" "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
index 590b315..d9785ad 100644
--- "a/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
+++ "b/LibSOPImportExport/BL/Type_LibSOPImpExp_ImportExcel/Method_CanImport\043382.qbl"
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method CanImport (output Strings missingFiles_o) as Boolean
+Method CanImport (
+  output Strings missingFiles_o
+) remote as Boolean
 {
   Description: 'Checks if necessary files are sufficent before starting import.'
   TextBody:
diff --git a/LibSOPImportExport/metadata.properties b/LibSOPImportExport/metadata.properties
index c38fbdb..6d65136 100644
--- a/LibSOPImportExport/metadata.properties
+++ b/LibSOPImportExport/metadata.properties
@@ -5,4 +5,4 @@
 system=false
 version.component=2022.3.0.0
 version.fileformat=2
-version.quintiq=6.3.3.0 NightlyBuild 247983, build 247983
+version.quintiq=6.3.3.0 , build 248673
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl
index 62a47a5..c405497 100644
--- a/_Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl
@@ -21,12 +21,16 @@
       EDIMLColumn OrderDate { Attribute: OrderDate ValueType: Date }
       EDIMLColumn OrderID { Attribute: OrderID ValueType: String }
       EDIMLColumn OrderLineID { Attribute: OrderLineID ValueType: String }
+      EDIMLColumn OrderTime { Attribute: OrderTime ValueType: Date }
       EDIMLColumn OrderType { Attribute: OrderType ValueType: String }
       EDIMLColumn Price { Attribute: Price ValueType: Real }
       EDIMLColumn PriorityName { Attribute: PriorityName ValueType: String }
+      EDIMLColumn ProductGrade { Attribute: ProductGrade ValueType: String }
       EDIMLColumn ProductID { Attribute: ProductID ValueType: String }
       EDIMLColumn Quantity { Attribute: Quantity ValueType: Real }
       EDIMLColumn SalesSegmentName { Attribute: SalesSegmentName ValueType: String }
+      EDIMLColumn SegmentPriority { Attribute: SegmentPriority ValueType: String }
+      EDIMLColumn SheetProfitability { Attribute: SheetProfitability ValueType: String }
       EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
       EDIMLColumn UnitOfMeasureName { Attribute: UnitOfMeasureName ValueType: String }
     }
@@ -93,7 +97,7 @@
       EDIODBCLinkColumn ORDERTIME
       {
         OthersMayUpdateColumn: true
-        ValueType: String
+        ValueType: DateTime
       }
       EDIODBCLinkColumn ORDERTYPE
       {
@@ -184,12 +188,33 @@
       }
       EDIColumnMatch { InputColumn: ORDERID OutputColumn: OrderID }
       EDIColumnMatch { InputColumn: ORDERLINEID OutputColumn: OrderLineID }
-      EDIColumnMatch { InputColumn: ORDERTIME OutputColumn: OrderType }
+      EDIColumnMatch
+      {
+        InputColumn: ORDERTIME
+        OutputColumn: OrderTime
+        Converter
+        {
+          XMLDefinition:
+          [*
+            <?xml version="1.0" encoding="UTF-16"?>
+            <DateTimeToDate xmlns="http://www.quintiq.com/GEB/DateTimeToDate" Key="@1">
+              <IsStandard>true</IsStandard>
+              <IsISO>false</IsISO>
+              <IsCustom>false</IsCustom>
+              <ConversionType>0</ConversionType>
+            </DateTimeToDate>
+          *]
+        }
+      }
+      EDIColumnMatch { InputColumn: ORDERTYPE OutputColumn: OrderType }
       EDIColumnMatch { InputColumn: PRICE OutputColumn: Price }
       EDIColumnMatch { InputColumn: PRIORITYNAME OutputColumn: PriorityName }
+      EDIColumnMatch { InputColumn: PRODUCTGRADE OutputColumn: ProductGrade }
       EDIColumnMatch { InputColumn: PRODUCTID OutputColumn: ProductID }
       EDIColumnMatch { InputColumn: QUANTITY OutputColumn: Quantity }
       EDIColumnMatch { InputColumn: SALESEGMENTNAME OutputColumn: SalesSegmentName }
+      EDIColumnMatch { InputColumn: SEGMENTPRIORITY OutputColumn: SegmentPriority }
+      EDIColumnMatch { InputColumn: SHEETPROFITABILITY OutputColumn: SheetProfitability }
       EDIColumnMatch { InputColumn: STOCKINGPOINTID OutputColumn: StockingPointID }
       EDIColumnMatch { InputColumn: UNITOFMEASURENAME OutputColumn: UnitOfMeasureName }
     }
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CustomerGrade.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CustomerGrade.qbl
new file mode 100644
index 0000000..9ba2dac
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CustomerGrade.qbl
@@ -0,0 +1,64 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CustomerGrade
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Destination Destination16
+  {
+    EDIMLTable Global_MappingCustomerGrade
+    {
+      PrimaryKeyColumns: BusinessType
+      PrimaryKeyColumns: Customer
+      PrimaryKeyColumns: CustomerGrade
+      TargetType: Global_MappingCustomerGrade
+      TypeIndex: Global_MappingCustomerGradeTypeIndex
+      EDIMLColumn BusinessType { Attribute: BusinessType ValueType: String }
+      EDIMLColumn Customer { Attribute: Customer ValueType: String }
+      EDIMLColumn CustomerGrade { Attribute: CustomerGrade ValueType: String }
+    }
+  }
+  EDIODBCLink.Source Source15
+  {
+    DataIntegrityStrategy: 'Disabled'
+    SettingsEngineLink: 'domainmodel.ediremotedatasourcedefinition.remotestorage.oracle'
+    EDIODBCLinkTable MID_CUSTOMERGRADE
+    {
+      OthersMayCreateTable: true
+      OthersMayDeleteRow: true
+      OthersMayDropTable: true
+      OthersMayFlushTable: true
+      OthersMayInsertRow: true
+      Parameters: '/owner="OTD"'
+      PrimaryKeyColumns: CUSTOMER
+      RecordModificationHintStrategy: 'None'
+      EDIODBCLinkColumn BUSINESSTYPE
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+      EDIODBCLinkColumn CUSTOMER
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+      EDIODBCLinkColumn CUSTOMERGRADE
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+    }
+  }
+  EDITransformation.Transformation Transformation15
+  {
+    EDITableTransformation
+    {
+      InputTable: MID_CUSTOMERGRADE
+      OutputTable: Global_MappingCustomerGrade
+      EDIColumnMatch { InputColumn: BUSINESSTYPE OutputColumn: BusinessType }
+      EDIColumnMatch { InputColumn: CUSTOMER OutputColumn: Customer }
+      EDIColumnMatch { InputColumn: CUSTOMERGRADE OutputColumn: CustomerGrade }
+    }
+  }
+}
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_DOI_DSI.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_DOI_DSI.qbl
new file mode 100644
index 0000000..4fcd29e
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_DOI_DSI.qbl
@@ -0,0 +1,71 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_DOI_DSI
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Destination Destination15
+  {
+    EDIMLTable Global_MappingDOI_DSI
+    {
+      PrimaryKeyColumns: OrganCode
+      PrimaryKeyColumns: ProductID
+      TargetType: Global_MappingDOI_DSI
+      TypeIndex: Global_MappingDOI_DSITypeIndex
+      EDIMLColumn DOI { Attribute: DOI ValueType: String }
+      EDIMLColumn DSI { Attribute: DSI ValueType: String }
+      EDIMLColumn OrganCode { Attribute: OrganCode ValueType: String }
+      EDIMLColumn ProductID { Attribute: ProductID ValueType: String }
+    }
+  }
+  EDIODBCLink.Source Source14
+  {
+    DataIntegrityStrategy: 'Disabled'
+    SettingsEngineLink: 'domainmodel.ediremotedatasourcedefinition.remotestorage.oracle'
+    EDIODBCLinkTable MID_DOI_DSI
+    {
+      OthersMayCreateTable: true
+      OthersMayDeleteRow: true
+      OthersMayDropTable: true
+      OthersMayFlushTable: true
+      OthersMayInsertRow: true
+      Parameters: '/owner="OTD"'
+      PrimaryKeyColumns: ORGANCODE
+      PrimaryKeyColumns: PRODUCTID
+      RecordModificationHintStrategy: 'None'
+      EDIODBCLinkColumn DOI
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+      EDIODBCLinkColumn DSI
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+      EDIODBCLinkColumn ORGANCODE
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+      EDIODBCLinkColumn PRODUCTID
+      {
+        OthersMayUpdateColumn: true
+        ValueType: String
+      }
+    }
+  }
+  EDITransformation.Transformation Transformation14
+  {
+    EDITableTransformation
+    {
+      InputTable: MID_DOI_DSI
+      OutputTable: Global_MappingDOI_DSI
+      EDIColumnMatch { InputColumn: DOI OutputColumn: DOI }
+      EDIColumnMatch { InputColumn: DSI OutputColumn: DSI }
+      EDIColumnMatch { InputColumn: ORGANCODE OutputColumn: OrganCode }
+      EDIColumnMatch { InputColumn: PRODUCTID OutputColumn: ProductID }
+    }
+  }
+}
diff --git a/_Main/BL/KnowledgeBaseDomain_MacroPlanner/KnowledgeBase_Knowledge_MP/_ROOT_KnowledgeBase_Knowledge_MP.qbl b/_Main/BL/KnowledgeBaseDomain_MacroPlanner/KnowledgeBase_Knowledge_MP/_ROOT_KnowledgeBase_Knowledge_MP.qbl
new file mode 100644
index 0000000..ea0a67e
--- /dev/null
+++ b/_Main/BL/KnowledgeBaseDomain_MacroPlanner/KnowledgeBase_Knowledge_MP/_ROOT_KnowledgeBase_Knowledge_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #root
+KnowledgeBase Knowledge_MP #extension
+{
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl
new file mode 100644
index 0000000..2d5380f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_Capa.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeChartElement_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeChartElement
+{
+  #keys: '1[414384.0.921264786]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264788][414384.0.921264787][414384.0.921264789]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeChartElement
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeChartElement
+  {
+    #keys: '3[414384.0.921264791][414384.0.921264790][414384.0.921264792]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl
deleted file mode 100644
index fcd971b..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_Ca.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeChartElement_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeChartElement
-{
-  #keys: '1[414384.0.852466576]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.852466578][414384.0.852466577][414384.0.852466579]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeChartElement
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeChartElement
-  {
-    #keys: '3[414384.0.852466581][414384.0.852466580][414384.0.852466582]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl
new file mode 100644
index 0000000..a5fe974
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeChartRow
+{
+  #keys: '1[414384.0.921264769]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264771][414384.0.921264770][414384.0.921264772]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeChartRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeChartRow
+  {
+    #keys: '3[414384.0.921264774][414384.0.921264773][414384.0.921264775]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl
deleted file mode 100644
index 13e8d6d..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_Capaci.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeChartRow_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeChartRow
-{
-  #keys: '1[414384.0.852471828]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.852471830][414384.0.852471829][414384.0.852471831]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeChartRow
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeChartRow
-  {
-    #keys: '3[414384.0.852471833][414384.0.852471832][414384.0.852471834]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl
new file mode 100644
index 0000000..132284d
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeCompareItemColumn
+{
+  #keys: '1[414384.0.921264730]'
+  ProceduralSequenceRelationStrategy
+  {
+    #keys: '13[0.0.0][414384.0.921264749][414384.0.921264743][414384.0.921264750][414384.0.921264744][414384.0.921264751][414384.0.921264745][414384.0.921264752][414384.0.921264746][414384.0.921264753][414384.0.921264747][414384.0.921264754][414384.0.921264748]'
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264732][414384.0.921264731][414384.0.921264733]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeCompareItemColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeCompareItemColumn
+  {
+    #keys: '3[414384.0.921264735][414384.0.921264734][414384.0.921264736]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl
deleted file mode 100644
index 07afbdf..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManag.qbl
+++ /dev/null
@@ -1,26 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeCompareItemColumn_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeCompareItemColumn
-{
-  #keys: '1[414384.0.816631032]'
-  ProceduralSequenceRelationStrategy
-  {
-    #keys: '13[0.0.0][414384.0.827659683][414384.0.827659677][414384.0.827659684][414384.0.827659678][414384.0.827659685][414384.0.827659679][414384.0.827659686][414384.0.827659680][414384.0.827659687][414384.0.827659681][414384.0.827659688][414384.0.827659682]'
-    SequenceElementSuffix: 'ColumnInManager'
-    SequenceSuffix: 'ColumnInManager'
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631034][414384.0.816631033][414384.0.816631035]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeCompareItemColumn
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeCompareItemColumn
-  {
-    #keys: '3[414384.0.816631037][414384.0.816631036][414384.0.816631038]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl
new file mode 100644
index 0000000..d33c56f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeCompareItemRow
+{
+  #keys: '1[414384.0.921264713]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264715][414384.0.921264714][414384.0.921264716]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeCompareItemRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeCompareItemRow
+  {
+    #keys: '3[414384.0.921264718][414384.0.921264717][414384.0.921264719]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl
deleted file mode 100644
index 59829f6..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeCompareItemRow_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeCompareItemRow
-{
-  #keys: '1[414384.0.816631016]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631018][414384.0.816631017][414384.0.816631019]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeCompareItemRow
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeCompareItemRow
-  {
-    #keys: '3[414384.0.816631021][414384.0.816631020][414384.0.816631022]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl
new file mode 100644
index 0000000..f0b0349
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterBusinessType
+{
+  #keys: '1[414384.0.921264696]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264698][414384.0.921264697][414384.0.921264699]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterBusinessType
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterBusinessType
+  {
+    #keys: '3[414384.0.921264701][414384.0.921264700][414384.0.921264702]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl
deleted file mode 100644
index fe18a82..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSal.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterBusinessType_MPSync_MPSync_CapacityAndSaleBudgeFilterBusinessType
-{
-  #keys: '1[414384.0.873958122]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MPSync
-  {
-    #keys: '3[414384.0.873958124][414384.0.873958123][414384.0.873958125]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterBusinessType
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterBusinessType
-  {
-    #keys: '3[414384.0.873958127][414384.0.873958126][414384.0.873958128]'
-    Cardinality: '1toN'
-    ObjectDefinition: MPSync
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
new file mode 100644
index 0000000..7933192
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterItem
+{
+  #keys: '1[414384.0.921264679]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264681][414384.0.921264680][414384.0.921264682]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterItem
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterItem
+  {
+    #keys: '3[414384.0.921264684][414384.0.921264683][414384.0.921264685]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl
deleted file mode 100644
index 041c7c2..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_Capa.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterItem_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterItem
-{
-  #keys: '1[414384.0.816665103]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816665105][414384.0.816665104][414384.0.816665106]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterItem
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterItem
-  {
-    #keys: '3[414384.0.816665108][414384.0.816665107][414384.0.816665109]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl
new file mode 100644
index 0000000..d8b447f
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterMonth
+{
+  #keys: '1[414384.0.921264662]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264664][414384.0.921264663][414384.0.921264665]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterMonth
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterMonth
+  {
+    #keys: '3[414384.0.921264667][414384.0.921264666][414384.0.921264668]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl
deleted file mode 100644
index cc133c7..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_Cap.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterMonth_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterMonth
-{
-  #keys: '1[414384.0.816631074]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631076][414384.0.816631075][414384.0.816631077]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterMonth
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterMonth
-  {
-    #keys: '3[414384.0.816631079][414384.0.816631078][414384.0.816631080]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl
new file mode 100644
index 0000000..e10c202
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+{
+  #keys: '1[414384.0.921264645]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264647][414384.0.921264646][414384.0.921264648]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+  {
+    #keys: '3[414384.0.921264650][414384.0.921264649][414384.0.921264651]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl
deleted file mode 100644
index ef6b268..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_Ca.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_MPSync_MPSync_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-{
-  #keys: '1[414384.0.873958138]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide MPSync
-  {
-    #keys: '3[414384.0.873958140][414384.0.873958139][414384.0.873958141]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterPlaceOfProductionOfArray
-  {
-    #keys: '3[414384.0.873958143][414384.0.873958142][414384.0.873958144]'
-    Cardinality: '1toN'
-    ObjectDefinition: MPSync
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
new file mode 100644
index 0000000..8df8fb7
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_CapacityAndSaleBudgeFilterYear
+{
+  #keys: '1[414384.0.921264628]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414384.0.921264630][414384.0.921264629][414384.0.921264631]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAndSaleBudgeFilterYear
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAndSaleBudgeFilterYear
+  {
+    #keys: '3[414384.0.921264633][414384.0.921264632][414384.0.921264634]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl b/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl
deleted file mode 100644
index 5fb08a4..0000000
--- a/_Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_Capa.qbl
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Relation CapacityAndSaleBudgeFilterYear_ScenarioManager_ScenarioManager_CapacityAndSaleBudgeFilterYear
-{
-  #keys: '1[414384.0.816631057]'
-  DefaultRelationStrategy
-  {
-  }
-  RelationSide.LeftSide ScenarioManager
-  {
-    #keys: '3[414384.0.816631059][414384.0.816631058][414384.0.816631060]'
-    Cardinality: '0to1'
-    ObjectDefinition: CapacityAndSaleBudgeFilterYear
-    OwningSide: 'Reference'
-  }
-  RelationSide.RightSide CapacityAndSaleBudgeFilterYear
-  {
-    #keys: '3[414384.0.816631062][414384.0.816631061][414384.0.816631063]'
-    Cardinality: '1toN'
-    ObjectDefinition: ScenarioManager
-    OwningSide: 'Owned'
-  }
-}
diff --git a/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable.qbl b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable.qbl
new file mode 100644
index 0000000..4521d55
--- /dev/null
+++ b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable
+{
+  #keys: '1[414702.0.483720679]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_ShowCell
+  {
+    #keys: '3[414702.0.483720681][414702.0.483720680][414702.0.483720682]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.483720684][414702.0.483720683][414702.0.483720685]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ShowCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable.qbl b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable.qbl
new file mode 100644
index 0000000..5508eb3
--- /dev/null
+++ b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable
+{
+  #keys: '1[414702.0.483720692]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_ShowColumn
+  {
+    #keys: '3[414702.0.483720694][414702.0.483720693][414702.0.483720695]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.483720697][414702.0.483720696][414702.0.483720698]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ShowColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowRow_Global_ShowRow_GlobalOTDTable.qbl b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowRow_Global_ShowRow_GlobalOTDTable.qbl
new file mode 100644
index 0000000..d8f6a4b
--- /dev/null
+++ b/_Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowRow_Global_ShowRow_GlobalOTDTable.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation GlobalOTDTable_Global_ShowRow_Global_ShowRow_GlobalOTDTable
+{
+  #keys: '1[414702.0.483720663]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_ShowRow
+  {
+    #keys: '3[414702.0.483720665][414702.0.483720664][414702.0.483720666]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.483720668][414702.0.483720667][414702.0.483720669]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ShowRow
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_Ma.qbl b/_Main/BL/Relations/Relation_Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_Ma.qbl
new file mode 100644
index 0000000..9f05865
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_Ma.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_MappingCustomerGrade
+{
+  #keys: '1[414702.0.445485678]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.445485680][414702.0.445485679][414702.0.445485681]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingCustomerGrade
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MappingCustomerGrade
+  {
+    #keys: '3[414702.0.445485683][414702.0.445485682][414702.0.445485684]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingD.qbl b/_Main/BL/Relations/Relation_Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingD.qbl
new file mode 100644
index 0000000..2020f2e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingD.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingDOI_DSI
+{
+  #keys: '1[414702.0.445364657]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.445364659][414702.0.445364658][414702.0.445364660]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_MappingDOI_DSI
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_MappingDOI_DSI
+  {
+    #keys: '3[414702.0.445364662][414702.0.445364661][414702.0.445364663]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn.qbl b/_Main/BL/Relations/Relation_Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn.qbl
new file mode 100644
index 0000000..86258ab
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn
+{
+  #keys: '1[414702.0.483720723]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_ShowCell
+  {
+    #keys: '3[414702.0.483720725][414702.0.483720724][414702.0.483720726]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ShowColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ShowColumn
+  {
+    #keys: '3[414702.0.483720728][414702.0.483720727][414702.0.483720729]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ShowCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow.qbl b/_Main/BL/Relations/Relation_Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow.qbl
new file mode 100644
index 0000000..efa77b8
--- /dev/null
+++ b/_Main/BL/Relations/Relation_Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow
+{
+  #keys: '1[414702.0.483720707]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Global_ShowCell
+  {
+    #keys: '3[414702.0.483720709][414702.0.483720708][414702.0.483720710]'
+    Cardinality: '1toN'
+    ObjectDefinition: Global_ShowRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide Global_ShowRow
+  {
+    #keys: '3[414702.0.483720712][414702.0.483720711][414702.0.483720713]'
+    Cardinality: '0to1'
+    ObjectDefinition: Global_ShowCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl b/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl
new file mode 100644
index 0000000..743c739
--- /dev/null
+++ b/_Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation YuxTest_MPSync_MPSync_YuxTest
+{
+  #keys: '1[414384.0.915854641]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MPSync
+  {
+    #keys: '3[414384.0.915854643][414384.0.915854642][414384.0.915854644]'
+    Cardinality: '0to1'
+    ObjectDefinition: YuxTest
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide YuxTest
+  {
+    #keys: '3[414384.0.915854646][414384.0.915854645][414384.0.915854647]'
+    Cardinality: '1toN'
+    ObjectDefinition: MPSync
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl b/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl
index 22f2d2e..7496f0f 100644
--- a/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl
+++ b/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl
@@ -7,7 +7,6 @@
   TextBody:
   [*
     // NBoTk Sep-7-2023 (created)
-    
     // 鑾峰彇businessType 闆嗗悎
     result := "";
     businessTypeList := construct( structured[String]);
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
index 39c29d0..3d1269f 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod TestData (
-  ScenarioManager scenarioManager
+  GlobalOTDTable parent
 )
 {
   Description: '鐢熸垚娴嬭瘯鏁版嵁'
@@ -11,7 +11,7 @@
     
     info( "鐢熸垚骞村害浜ч攢棰勭畻鎶ヨ〃娴嬭瘯鏁版嵁" )
     
-    scenarioManager.CapacityAndSaleBudgeChartElement( relflush );
+    parent.CapacityAndSaleBudgeChartElement( relflush );
     
     for( sc := 0; sc < 4; sc := sc + 1 ) {
       scenarioName := "SC" + [String]sc;
@@ -19,7 +19,7 @@
         businessTypeString := "BT" + [String]i;
         for( j := 1; j <= 12; j := j + 1 ) {
           monthString := "MONTH" + ifexpr( j < 10, "0" + [String]j, [String]j );
-          scenarioManager.CapacityAndSaleBudgeChartElement( relnew, 
+          parent.CapacityAndSaleBudgeChartElement( relnew, 
                                                             BusinessTypeOrPlaceOfProductionOfArray := businessTypeString, 
                                                             TimeStringAndScenarioName := monthString + " - " + scenarioName, 
                                                             Quantity := Real::Random( 20.0, 30.0 ) );
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
index cb76a5f..76a61fb 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager scenarioManager,
+  GlobalOTDTable parent,
   String businessType,
   String placeOfProductionOfArray
 ) as CapacityAndSaleBudgeChartRow
@@ -9,9 +9,9 @@
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( scenarioManager, CapacityAndSaleBudgeChartRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
+    value := select( parent, CapacityAndSaleBudgeChartRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
     if( isnull( value ) ) {
-      value := scenarioManager.CapacityAndSaleBudgeChartRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
+      value := parent.CapacityAndSaleBudgeChartRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
     } 
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
index 1e42b21..77bfe99 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl
@@ -1,16 +1,16 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager manager,
+  GlobalOTDTable parent,
   String columnName
 ) as CapacityAndSaleBudgeCompareItemColumn
 {
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( manager, CapacityAndSaleBudgeCompareItemColumn, item, item.ColumnName() = columnName );
+    value := select( parent, CapacityAndSaleBudgeCompareItemColumn, item, item.ColumnName() = columnName );
     if( isnull( value ) ) {
-      value := manager.CapacityAndSaleBudgeCompareItemColumn( relnew, ColumnName := columnName );  
+      value := parent.CapacityAndSaleBudgeCompareItemColumn( relnew, ColumnName := columnName );  
     }
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
index e155e81..7a485f5 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager scenarioManager,
+  GlobalOTDTable parent,
   String businessType,
   String placeOfProductionOfArray
 ) as CapacityAndSaleBudgeCompareItemRow
@@ -9,9 +9,9 @@
   TextBody:
   [*
     // yypsybs Sep-18-2023 (created)
-    value := select( scenarioManager, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
+    value := select( parent, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
     if( isnull( value ) ) {
-      value := scenarioManager.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
+      value := parent.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
     } 
     return value;
   *]
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
index 4e3f888..33a800b 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  MPSync parent,
+  GlobalOTDTable parent,
   String value
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
index 02b6d70..e05188e 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  ScenarioManager parent,
+  GlobalOTDTable parent,
   String itemName
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
index 1e15a86..14b634a 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧姣旈」'
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
index ae10a43..f14808d 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧勾浠�'
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
index 6bb6aff..3e96143 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod CreateIfNotExist (
-  MPSync parent,
+  GlobalOTDTable parent,
   String value
 )
 {
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
index 7fa388c..dc5898d 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Initial (
-  ScenarioManager parent
+  GlobalOTDTable parent
 )
 {
   Description: '鍒濆鍖栧勾浠�'
diff --git a/_Main/BL/Type_CustomerAndForecastOrder/Attribute_CustomerOrderID.qbl b/_Main/BL/Type_CustomerAndForecastOrder/Attribute_CustomerOrderID.qbl
new file mode 100644
index 0000000..19d7605
--- /dev/null
+++ b/_Main/BL/Type_CustomerAndForecastOrder/Attribute_CustomerOrderID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomerOrderID
+{
+  #keys: '3[414382.0.554303146][414382.0.554303145][414382.0.554303147]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerAndForecastOrder/Attribute_ForecastID.qbl b/_Main/BL/Type_CustomerAndForecastOrder/Attribute_ForecastID.qbl
new file mode 100644
index 0000000..d3d12e5
--- /dev/null
+++ b/_Main/BL/Type_CustomerAndForecastOrder/Attribute_ForecastID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ForecastID
+{
+  #keys: '3[414382.0.554303156][414382.0.554303155][414382.0.554303157]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_CreateData.qbl b/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_CreateData.qbl
new file mode 100644
index 0000000..0f86052
--- /dev/null
+++ b/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_CreateData.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateData (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    traverse ( macroPlan, SalesDemand.astype( CustomerOrder ), co, true ) {
+      macroPlan.CustomerAndForecastOrder( relnew,
+                                          OrderID := co.OrderID(),
+                                          ProductID := co.ProductID(),
+                                          BusinessType := co.BusinessType(),
+                                          Customer := co.CustomerName(),
+                                          CustomerID := co.CustomerID(),
+                                          Quantity := co.Quantity(),
+                                          UnitOfMeasureName := co.UnitOfMeasureName(),
+                                          DemandDate := co.StartDate()
+                                         );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_RefreshData.qbl b/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_RefreshData.qbl
new file mode 100644
index 0000000..4a04c7d
--- /dev/null
+++ b/_Main/BL/Type_CustomerAndForecastOrder/StaticMethod_RefreshData.qbl
@@ -0,0 +1,56 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod RefreshData (
+  MacroPlan owner,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    // 鑾峰彇宸茬粡瀛樺湪 customerOrderID 鍜宖orecastID
+    customerOrderIDs := selectvalues( owner,CustomerAndForecastOrder,c,
+                                      c.CustomerOrderID() <> '',
+                                      c.CustomerID()
+                                      );
+    
+    forecastIDs := selectvalues( owner,CustomerAndForecastOrder,c,
+                                      c.ForecastID() <> '',
+                                      c.ForecastID()
+                                      );
+    
+    
+    // 浠庢暟鎹箹 Global_MappingCustomerOrder Global_MappingForecast 涓幏鍙栨柊鐨勮鍗曟暟鎹�
+    
+    traverse( globalOTDTable,Global_MappingCustomOrder,cus)
+    {
+        if ( customerOrderIDs.Find( cus.ID() ) = -1 ) {
+             owner.CustomerAndForecastOrder( relnew,
+                                             OrderID := cus.OrderID(),
+                                             ProductID := cus.ProductID(),
+                                             BusinessType := cus.BusinessType(),
+                                             Customer := cus.Customer(),
+                                             CustomerID := cus.CustomerID(),
+                                             Quantity := cus.Quantity(),
+                                             UnitOfMeasureName := cus.UnitOfMeasureName(),
+                                             DemandDate := cus.OrderDate()
+                                             
+                                            );
+        }    
+    }
+    
+    traverse( globalOTDTable,Global_MappingForecast,forecast)
+    {
+        if(forecastIDs.Find( forecast.ID() ) = -1 ) {
+             owner.CustomerAndForecastOrder( relnew,
+                                             ProductID := forecast.ProductID(),
+                                             BusinessType := forecast.BusinessType(),
+                                             Quantity := forecast.Quantity(),
+                                             UnitOfMeasureName := forecast.UnitOfMeasureName(),
+                                             DemandDate := forecast.EndDate()
+                                            );
+        }    
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_BusinessType.qbl b/_Main/BL/Type_CustomerOrder/Attribute_BusinessType.qbl
new file mode 100644
index 0000000..a39b026
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_BusinessType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BusinessType
+{
+  #keys: '3[414382.0.554303217][414382.0.554303216][414382.0.554303218]'
+  Description: '浜嬩笟閮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_CustomerPolicy.qbl b/_Main/BL/Type_CustomerOrder/Attribute_CustomerPolicy.qbl
new file mode 100644
index 0000000..6647d7a
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_CustomerPolicy.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomerPolicy
+{
+  #keys: '3[414382.0.554014841][414382.0.554014840][414382.0.554014842]'
+  Description: '瀹㈡埛绛栫暐'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_IsAvailable.qbl b/_Main/BL/Type_CustomerOrder/Attribute_IsAvailable.qbl
new file mode 100644
index 0000000..1a6ca55
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_IsAvailable.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsAvailable
+{
+  #keys: '3[414382.0.554303237][414382.0.554303236][414382.0.554303238]'
+  Description: '璁㈠崟鏄惁鍙備笌璁″垝'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_OrderTime.qbl b/_Main/BL/Type_CustomerOrder/Attribute_OrderTime.qbl
new file mode 100644
index 0000000..e89a41d
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_OrderTime.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderTime
+{
+  #keys: '3[414382.0.554303277][414382.0.554303276][414382.0.554303278]'
+  Description: '璁㈠崟涓嬪崟鏃堕棿'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_OrderType.qbl b/_Main/BL/Type_CustomerOrder/Attribute_OrderType.qbl
new file mode 100644
index 0000000..4efd905
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_OrderType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderType
+{
+  #keys: '3[414382.0.554303227][414382.0.554303226][414382.0.554303228]'
+  Description: '璁㈠崟绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_ProductGrade.qbl b/_Main/BL/Type_CustomerOrder/Attribute_ProductGrade.qbl
new file mode 100644
index 0000000..76e256b
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_ProductGrade.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductGrade
+{
+  #keys: '3[414382.0.554303247][414382.0.554303246][414382.0.554303248]'
+  Description: '浜у搧绛夌骇'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_SegmentPriority.qbl b/_Main/BL/Type_CustomerOrder/Attribute_SegmentPriority.qbl
new file mode 100644
index 0000000..6f488d6
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_SegmentPriority.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SegmentPriority
+{
+  #keys: '3[414382.0.554303257][414382.0.554303256][414382.0.554303258]'
+  Description: '缁嗗垎甯傚満浼樺厛绾�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CustomerOrder/Attribute_SheetProfitability.qbl b/_Main/BL/Type_CustomerOrder/Attribute_SheetProfitability.qbl
new file mode 100644
index 0000000..726b8ab
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_SheetProfitability.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SheetProfitability
+{
+  #keys: '3[414382.0.554303267][414382.0.554303266][414382.0.554303268]'
+  Description: '澶у紶鐩堝埄姘村钩'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
index e0aa42b..3f0ea88 100644
--- a/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
+++ b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
@@ -34,8 +34,7 @@
     salesSegmentName := salesSegmentNameList.Concatenate( ",")
     
     schemeDate := Date::Today();
-    
-    filllingCapacityOrderScheme := owner.FilllingCapacityOrderScheme(relnew,SchemeName := schemeName,SchemeDate := schemeDate,BusinessType := businessType,Customer := customer,CustomerID := customerID,
+    owner.FilllingCapacityOrderScheme(relnew,SchemeName := schemeName,SchemeDate := schemeDate,BusinessType := businessType,Customer := customer,CustomerID := customerID,
                                                                       SalesSegmentName := salesSegmentName);
     
     
diff --git "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl" "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
similarity index 96%
rename from "_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
rename to "_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
index c543694..6afbad7 100644
--- "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
+++ "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
@@ -25,27 +25,27 @@
     // 闈㈡澘鍩哄湴;浜嬩笟閮�
     info( byBusinessTypeOrByOrgCode );
     traverse( businessTypes, Elements, businessType ) {
-      info( "businessType : " + businessType.BusinessType() );
+      debuginfo( "businessType : " + businessType.BusinessType() );
     }
     traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-      info( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
+      debuginfo( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
     }
     traverse( macroPlans, Elements, macroPlan ) {
-      info( "macroPlan : " + macroPlan.ScenarioName() );  
+      debuginfo( "macroPlan : " + macroPlan.ScenarioName() );  
     }
     // 骞翠唤涓嶉�夋椂鍏ㄩ��
     if( years.Size() = 0 ) {
       years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
     }
     traverse( years, Elements, year ) {
-      info( "yearNo : " + [String]year.YearNo() );
+      debuginfo( "yearNo : " + [String]year.YearNo() );
     }
     // 鏈堜唤涓嶉�夋椂鍏ㄩ��
     if( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, true, item.MonthNo() );
     }
     traverse( months, Elements, month ) {
-      info( "monthNo : " + [String]month.MonthNo() );
+      debuginfo( "monthNo : " + [String]month.MonthNo() );
     }
     
     // ====娓呯悊鏃ф暟鎹�====
@@ -74,7 +74,7 @@
     businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
     // 鐢熸垚鍥捐〃鍏冪礌
     traverse( years, Elements, year ) {
-      info( "process year start : " + [String]year.YearNo() );
+      debuginfo( "process year start : " + [String]year.YearNo() );
       if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
         // 鐩爣
         traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
@@ -232,7 +232,7 @@
       }
       if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
         for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-          info( "process season start : " + [String]seasonNo );
+          debuginfo( "process season start : " + [String]seasonNo );
           traverse( businessTypeList, Elements, businessType ) {
             productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
             this.CapacityAndSaleBudgeChartElement( relnew, 
@@ -259,7 +259,7 @@
       }
       if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
         traverse( months, Elements, month ) {
-          info( "process month start : " + [String]month.MonthNo() );
+          debuginfo( "process month start : " + [String]month.MonthNo() );
           monthNoString := ifexpr( month.MonthNo() <= 9, "0" + [String]month.MonthNo(), [String]month.MonthNo() );
           traverse( businessTypeList, Elements, businessType ) {
             productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
@@ -282,10 +282,10 @@
                                                      ); 
             }            
           }
-          info( "process month end : " + [String]month.MonthNo() );
+          debuginfo( "process month end : " + [String]month.MonthNo() );
         }
       }
-      info( "process year end : " + [String]year.YearNo() )
+      debuginfo( "process year end : " + [String]year.YearNo() )
     }
     //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
     //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
similarity index 100%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
similarity index 89%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
index d5d4352..90a0bff 100644
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
@@ -22,23 +22,23 @@
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
     }
     traverse( macroPlans, Elements, item ) {
-      info( "scenario : " + item.ScenarioName() );
+      debuginfo( "scenario : " + item.ScenarioName() );
     }
     traverse( items, Elements, item ) {
-      info( "item : " + item.ItemName() );
+      debuginfo( "item : " + item.ItemName() );
     }
     traverse( years, Elements, item ) {
-      info( "year : " + [String]item.YearNo() );
+      debuginfo( "year : " + [String]item.YearNo() );
     }
     traverse( months, Elements, item ) {
-      info( "month : " + [String]item.MonthNo() );
+      debuginfo( "month : " + [String]item.MonthNo() );
     }
     // ====娓呯悊鏃ф暟鎹�====
     this.CapacityAndSaleBudgeCompareItemRow( relflush );
     this.CapacityAndSaleBudgeCompareItemColumn( relflush );
     // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
     historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
-    info( "historyData : " + [String]historyData.Size() )
+    debuginfo( "historyData : " + [String]historyData.Size() )
     traverse( historyData, Elements, one ) {
       productCode := one.ProductCode();
       MappingBOM::CreateTestData( mappingParent, "浜嬩笟閮�" + [String](productCode.Length() mod 3), [String](productCode.Length() mod 4), productCode );
@@ -52,13 +52,13 @@
         // 璁板綍姣忚鍖呭惈鍝簺product
         CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
       } else {
-        info( "no boms for product : " + productCode );
+        debuginfo( "no boms for product : " + productCode );
       }
     }
-    info( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
+    debuginfo( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
     // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
     // 浜嬩笟閮紝缁勭粐
-    info( "dealing businessType and placeOfProductionOfArray" )
+    debuginfo( "dealing businessType and placeOfProductionOfArray" )
     columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
     columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
     traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -72,9 +72,9 @@
     info( "dealing 闈㈡澘鍒嗛厤閲�" )
     if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
       traverse( years, Elements, year ) {
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
         // 鍘嗗彶鏁版嵁
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
         traverse( months, Elements, month ) {
           columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
           traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -89,7 +89,7 @@
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
         }
-        info( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
         // S&OP鏁版嵁
         traverse( macroPlans, Elements, macroPlan ) {
           traverse( months, Elements, month ) {
@@ -112,12 +112,12 @@
       }
     }
     // 骞村害閿�鍞
-    info( "dealing 閿�鍞" )
+    debuginfo( "dealing 閿�鍞" )
     if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
       traverse( years, Elements, year ) {
-        info( "閿�鍞" + [String]year.YearNo() + "骞�" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞�" );
         // 鍘嗗彶鏁版嵁
-        info( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
         traverse( months, Elements, month ) {
           columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
           traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -132,7 +132,7 @@
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
         }
-        info( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
         // S&OP鏁版嵁
         traverse( macroPlans, Elements, macroPlan ) {
           traverse( months, Elements, month ) {
@@ -154,7 +154,7 @@
       }
     }
     // 澶у紶鐩堝埄棰�
-    info( "dealing 澶у紶鐩堝埄棰�" )
+    debuginfo( "dealing 澶у紶鐩堝埄棰�" )
     traverse( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
@@ -174,7 +174,7 @@
       }
     }
     // 浜у搧鐩堝埄棰�
-    info( "dealing 浜у搧鐩堝埄棰�" )
+    debuginfo( "dealing 浜у搧鐩堝埄棰�" )
     traverse( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
@@ -195,7 +195,7 @@
     }
     
     // 璁剧疆rowNo鍜宑olumnNo
-    info( "set rowNo and columnNo" );
+    debuginfo( "set rowNo and columnNo" );
     rowNo := 1;
     rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
     traverse( rowSorted, Elements, item ) {
@@ -207,6 +207,6 @@
       item.ColumnNo( columnNo );
       columnNo := columnNo + 1;
     }
-    info( "done" );
+    debuginfo( "done" );
   *]
 }
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
similarity index 93%
rename from _Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl
rename to _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
index 44dab2e..45ee95c 100644
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompareExport.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
@@ -13,7 +13,7 @@
     // 澶勭悊column <column><name>鐗╂枡缂栫爜</name><type>String</type></column>
     columnXml := ""
     traverse( this, CapacityAndSaleBudgeCompareItemColumn, column ) {
-      info( "columnName : " + column.ColumnName() );
+      debuginfo( "columnName : " + column.ColumnName() );
       columnXml := columnXml + "<column><name>" + column.ColumnName() + "</name><type>String</type></column>";
     }
     text := text + columnXml + "</table>"
@@ -24,7 +24,7 @@
     tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
     rows := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, row, row.PlaceOfProductionOfArray() + "_" + row.BusinessType() );
     traverse ( rows, Elements, row ) {
-      info( "rowNo : " + [String]row.RowNo() );
+      debuginfo( "rowNo : " + [String]row.RowNo() );
       traverse( row, CapacityAndSaleBudgeCompareItemCell, cell ) {
         ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, cell.CellContent(), cell.CapacityAndSaleBudgeCompareItemColumn().ColumnName() );  
       }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl
new file mode 100644
index 0000000..26b2034
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade (
+  Number errorNo,
+  String errorMessage
+)
+{
+  TextBody:
+  [*
+    this.Global_BrokerExecuteLog( relnew,
+                                  BrokerName    := "GlobalOTDTable_CustomerGrade",
+                                  ElementTotal  := 0,
+                                  ErrorMessage  := errorMessage,
+                                  IsSuccess     := false,
+                                  Name          := "瀹㈡埛绛夌骇鏁版嵁",
+                                  ErrorNo       := errorNo,
+                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
+                                 );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl
new file mode 100644
index 0000000..8ebfbf3
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI (
+  Number errorNo,
+  String errorMessage
+)
+{
+  TextBody:
+  [*
+    this.Global_BrokerExecuteLog( relnew,
+                                  BrokerName    := "GlobalOTDTable_DOI_DSI",
+                                  ElementTotal  := 0,
+                                  ErrorMessage  := errorMessage,
+                                  IsSuccess     := false,
+                                  Name          := "DOI_DSI鏁版嵁",
+                                  ErrorNo       := errorNo,
+                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
+                                 );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl
new file mode 100644
index 0000000..e09fc63
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecute_GlobalOTDTable_CustomerGrade
+{
+  TextBody:
+  [*
+    this.Global_BrokerExecuteLog( relnew,
+                                  BrokerName      := "GlobalOTDTable_CustomerGrade",
+                                  ElementTotal    := this.Global_MappingCustomerGrade( relsize ),
+                                  ErrorMessage    := "",
+                                  IsSuccess       := true,
+                                  Name            := "瀹㈡埛绛夌骇鏁版嵁",
+                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
+                                  ErrorNo         := 0
+                                 );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl
new file mode 100644
index 0000000..9082ba1
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecute_GlobalOTDTable_DOI_DSI
+{
+  TextBody:
+  [*
+    this.Global_BrokerExecuteLog( relnew,
+                                  BrokerName      := "GlobalOTDTable_DOI_DSI",
+                                  ElementTotal    := this.Global_MappingDOI_DSI( relsize ),
+                                  ErrorMessage    := "",
+                                  IsSuccess       := true,
+                                  Name            := "DOI_DSI鏁版嵁",
+                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
+                                  ErrorNo         := 0
+                                 );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
index 6aedc24..5a4ba17 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
@@ -30,12 +30,16 @@
     traverse( this, Global_MappingProduct_MP, product,
               product.ProductMajorType() = "鎴愬搧" )
     {
+      uniquebomids := construct( Strings );
+      product.IsLinkedWithFinishedGood( false );
       product.SetIsLinkedWithFinishedGoodAttributes_Recursive( 0, // depth
                                                                100, // maxdepth
                                                                productspool,
                                                                operationspool,
-                                                               operationbomspool );
-      
+                                                               operationbomspool,
+                                                               uniquebomids );
+      uniquebomids := uniquebomids.Unique();
+      product.BOMCount( uniquebomids.Size() );
     }
   *]
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl
new file mode 100644
index 0000000..79a5e28
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SynchronizationAllMappingBrokerAndAPIByOption (
+  Boolean isCustomOrder,
+  Boolean isForeacst
+)
+{
+  TextBody:
+  [*
+    if ( isCustomOrder ) {
+      this.Global_MappingCustomOrder( relflush );
+      this.GlobalOTDTable_CustomOrder().AsyncExecute();
+    }
+    
+    if ( isForeacst ) {
+      this.Global_MappingForecast( relflush );
+      this.GlobalOTDTable_Forecast().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan.qbl
new file mode 100644
index 0000000..b41460d
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method SynchronizeDataToMacroPlan (
+  MacroPlan macroPlan,
+  Strings businessTypes,
+  Boolean isCustomOrder,
+  Boolean isForecast
+)
+{
+  TextBody:
+  [*
+    if ( isCustomOrder ) {
+      macroPlan.MappingCustomerOrderData( businessTypes, this );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_Test.qbl b/_Main/BL/Type_GlobalDTOTable/Method_Test.qbl
new file mode 100644
index 0000000..26e43f9
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_Test.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Method Test
+{
+  TextBody:
+  [*
+    // KKO2 Sep-27-2023 (created)
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl b/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl
index 100a489..9239cfb 100644
--- a/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl
@@ -25,6 +25,8 @@
     globalOTDTable.Global_MappingOperationCost( relflush );
     globalOTDTable.Global_MappingForecast( relflush );
     globalOTDTable.Global_MappingCustomOrder( relflush );
+    globalOTDTable.Global_MappingDOI_DSI( relflush );
+    globalOTDTable.Global_MappingCustomerGrade( relflush );
     
     globalOTDTable.GlobalOTDTable_UnitOfMeasure_MP().AsyncExecute();
     globalOTDTable.GlobalOTDTable_SalesSegment_MP().AsyncExecute();
@@ -44,5 +46,7 @@
     globalOTDTable.GlobalOTDTable_OperationCost().AsyncExecute();
     globalOTDTable.GlobalOTDTable_Forecast().AsyncExecute();
     globalOTDTable.GlobalOTDTable_CustomOrder().AsyncExecute();
+    globalOTDTable.GlobalOTDTable_DOI_DSI().AsyncExecute();
+    globalOTDTable.GlobalOTDTable_CustomerGrade().AsyncExecute();
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderTime.qbl b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderTime.qbl
new file mode 100644
index 0000000..a9066b7
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderTime.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderTime
+{
+  #keys: '3[414702.0.462647536][414702.0.462647535][414702.0.462647537]'
+  ValueType: Date
+}
diff --git "a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType\043905.qbl" "b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType\043905.qbl"
new file mode 100644
index 0000000..7998bc6
--- /dev/null
+++ "b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType\043905.qbl"
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderType
+{
+  #keys: '3[414702.0.462647526][414702.0.462647525][414702.0.462647527]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType.qbl b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType.qbl
deleted file mode 100644
index 7e887b1..0000000
--- a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType.qbl
+++ /dev/null
@@ -1,7 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute OrderType
-{
-  #keys: '3[414702.0.265050347][414702.0.265050346][414702.0.265050348]'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_ProductGrade.qbl b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_ProductGrade.qbl
new file mode 100644
index 0000000..2eff593
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_ProductGrade.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductGrade
+{
+  #keys: '3[414702.0.462647546][414702.0.462647545][414702.0.462647547]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SegmentPriority.qbl b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SegmentPriority.qbl
new file mode 100644
index 0000000..47ce029
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SegmentPriority.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SegmentPriority
+{
+  #keys: '3[414702.0.462647556][414702.0.462647555][414702.0.462647557]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SheetProfitability.qbl b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SheetProfitability.qbl
new file mode 100644
index 0000000..d1c49f7
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/Attribute_SheetProfitability.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SheetProfitability
+{
+  #keys: '3[414702.0.462647566][414702.0.462647565][414702.0.462647567]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_BusinessType.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_BusinessType.qbl
new file mode 100644
index 0000000..0c0ee82
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_BusinessType.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BusinessType
+{
+  #keys: '3[414702.0.445738362][414702.0.445738361][414702.0.445738363]'
+  Description: '浜嬩笟閮�'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_Customer.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_Customer.qbl
new file mode 100644
index 0000000..046a760
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_Customer.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Customer
+{
+  #keys: '3[414702.0.445738352][414702.0.445738351][414702.0.445738353]'
+  Description: '瀹㈡埛鍚嶇О'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_CustomerGrade.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_CustomerGrade.qbl
new file mode 100644
index 0000000..cd779bb
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/Attribute_CustomerGrade.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomerGrade
+{
+  #keys: '3[414702.0.445738372][414702.0.445738371][414702.0.445738373]'
+  Description: '瀹㈡埛绛夌骇'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingCustomerGrade/TypeIndex_Global_MappingCustomerGradeTypeIndex.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/TypeIndex_Global_MappingCustomerGradeTypeIndex.qbl
new file mode 100644
index 0000000..b30282d
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/TypeIndex_Global_MappingCustomerGradeTypeIndex.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex Global_MappingCustomerGradeTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: BusinessType
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: Customer
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: CustomerGrade
+    }
+  ]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomerGrade/_ROOT_Type_Global_MappingCustomerGrade.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/_ROOT_Type_Global_MappingCustomerGrade.qbl
new file mode 100644
index 0000000..f568483
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/_ROOT_Type_Global_MappingCustomerGrade.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_MappingCustomerGrade
+{
+  #keys: '5[414702.0.445485672][414702.0.445485670][0.0.0][414702.0.445485671][414702.0.445485673]'
+  BaseType: Object
+  StructuredName: 'Global_MappingCustomerGrades'
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DOI.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DOI.qbl
new file mode 100644
index 0000000..d4d3c40
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DOI.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DOI
+{
+  #keys: '3[414702.0.445364709][414702.0.445364708][414702.0.445364710]'
+  Description: '搴撳瓨鍛ㄨ浆澶╂暟'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DSI.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DSI.qbl
new file mode 100644
index 0000000..2ad6d72
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_DSI.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DSI
+{
+  #keys: '3[414702.0.445364719][414702.0.445364718][414702.0.445364720]'
+  Description: '搴撳瓨鍙敭澶╂暟'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_OrganCode.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_OrganCode.qbl
new file mode 100644
index 0000000..2bd3055
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_OrganCode.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrganCode
+{
+  #keys: '3[414702.0.445364699][414702.0.445364698][414702.0.445364700]'
+  Description: '缁勭粐缂栫爜'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_ProductID.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_ProductID.qbl
new file mode 100644
index 0000000..51fd7ff
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/Attribute_ProductID.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.0.445364677][414702.0.445364676][414702.0.445364678]'
+  Description: '鐗╂枡缂栫爜'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/TypeIndex_Global_MappingDOI_DSITypeIndex.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/TypeIndex_Global_MappingDOI_DSITypeIndex.qbl
new file mode 100644
index 0000000..c088e3b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/TypeIndex_Global_MappingDOI_DSITypeIndex.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex Global_MappingDOI_DSITypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ProductID
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: OrganCode
+    }
+  ]
+}
diff --git a/_Main/BL/Type_Global_MappingDOI_DSI/_ROOT_Type_Global_MappingDOI_DSI.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/_ROOT_Type_Global_MappingDOI_DSI.qbl
new file mode 100644
index 0000000..628e476
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/_ROOT_Type_Global_MappingDOI_DSI.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_MappingDOI_DSI
+{
+  #keys: '5[414702.0.445364654][414702.0.445364652][0.0.0][414702.0.445364653][414702.0.445364655]'
+  BaseType: Object
+  StructuredName: 'Global_MappingDOI_DSIs'
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCount.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCount.qbl
new file mode 100644
index 0000000..1916cbd
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCount.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BOMCount
+{
+  #keys: '3[157968.0.1161166085][157968.0.1161166084][157968.0.1161166086]'
+  Description: 'Number of unique BOM used to produce this finished good.'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
index 4c9b813..f0425fa 100644
--- a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
@@ -5,7 +5,8 @@
   Number maxdepth,
   Global_MappingProduct_MPs productspool,
   Global_MappingOperations operationspool,
-  Global_MappingOperationBOMs operationbomspool
+  Global_MappingOperationBOMs operationbomspool,
+  output Strings uniquebomids_o
 )
 {
   Description: 'Method to traverse the supply chain recursively to determine if there are any products that are not used to produce finished goods.'
@@ -13,6 +14,11 @@
   [*
     if( not this.IsLinkedWithFinishedGood() )
     {
+      if( this.ProductMajorType() <> "鎴愬搧" )
+      {
+        uniquebomids_o.Add( this.ID() );
+      }
+      
       depth := depth + 1;
       this.IsLinkedWithFinishedGood( true );
       
@@ -50,7 +56,8 @@
                                                                                 maxdepth,
                                                                                 productspool,
                                                                                 operationspool,
-                                                                                operationbomspool );
+                                                                                operationbomspool,
+                                                                                uniquebomids_o );
             }
             
             if( operationbom.AlternativeMaterialCode() <> ""
@@ -66,7 +73,8 @@
                                                                                     maxdepth,
                                                                                     productspool,
                                                                                     operationspool,
-                                                                                    operationbomspool );
+                                                                                    operationbomspool,
+                                                                                    uniquebomids_o );
               }
             }
           }
diff --git a/_Main/BL/Type_Global_ShowCell/Attribute_Value.qbl b/_Main/BL/Type_Global_ShowCell/Attribute_Value.qbl
new file mode 100644
index 0000000..a20bc71
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/Attribute_Value.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Value
+{
+  #keys: '3[414702.0.483720762][414702.0.483720761][414702.0.483720763]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl b/_Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl
new file mode 100644
index 0000000..1e5c9aa
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl
@@ -0,0 +1,124 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ShowData (
+  GlobalOTDTable globalOTDTable,
+  Global_BrokerExecuteLog global_BrokerExecuteLog
+)
+{
+  TextBody:
+  [*
+    if ( global_BrokerExecuteLog.BrokerName() = "GlobalOTDTable_CustomOrder" ) {
+      businessTypeColumn       := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 0, ColumnName := "浜嬩笟閮�" );
+      currencyIDColumn         := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 1, ColumnName := "璐у竵" );
+      customerColumn           := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 2, ColumnName := "瀹㈡埛鍚嶇О" );
+      customerIDColumn         := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 3, ColumnName := "瀹㈡埛ID" );
+      idColumn                 := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 4, ColumnName := "鍞竴鏍囪瘑" );
+      orderDateColumn          := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 5, ColumnName := "璁㈠崟鏃ユ湡" );
+      orderIDColumn            := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 6, ColumnName := "璁㈠崟鍙�" );
+      orderLineIDColumn        := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 7, ColumnName := "璁㈠崟琛屽彿" );
+      priceColumn              := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 8, ColumnName := "鍗曚环" );
+      priorityNameColumn       := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 9, ColumnName := "浼樺厛绾у悕绉�" );
+      productIDColumn          := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 10, ColumnName := "浜у搧缂栫爜" );
+      stockingPointIDColumn    := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 11, ColumnName := "搴撳瓨鐐圭紪鐮�" );
+      salesegmentNameColumn    :=globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 12, ColumnName := "閿�鍞儴闂ㄥ悕绉�" );
+      quantityColumn           := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 13, ColumnName := "鏁伴噺" );
+      unitofmeasureNameColumn  := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 14, ColumnName := "鍗曚綅" );
+      orderTypeColumn          := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 15, ColumnName := "璁㈠崟绫诲瀷" );
+      isAvailableColumn        := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 16, ColumnName := "鏄惁鍙敤" );
+      productGradeColumn       := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 17, ColumnName := "浜у搧绛夌骇" );
+      segmentPriorityColumn    := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 18, ColumnName := "缁嗗垎甯傚満浼樺厛绾�" );
+      sheetProfitabilityColumn := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 19, ColumnName := "澶у紶鐩堝埄" );
+      orderTimeColumn          := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := 20, ColumnName := "璁㈠崟涓嬪崟鏃堕棿" );
+      i := 1;
+      traverse ( globalOTDTable, Global_MappingCustomOrder, gmco ) {
+        gloabal_ShowRow := globalOTDTable.Global_ShowRow( relnew, RowNr := i );
+        
+        businessTypeCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.BusinessType() );
+        businessTypeCell.Global_ShowColumn( relset, businessTypeColumn );
+        businessTypeCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        currencyIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.CurrencyID() );
+        currencyIDCell.Global_ShowColumn( relset, currencyIDColumn );
+        currencyIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        customerCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.Customer() );
+        customerCell.Global_ShowColumn( relset, customerColumn );
+        customerCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        customerIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.CustomerID() );
+        customerIDCell.Global_ShowColumn( relset, customerIDColumn );
+        customerIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        idCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.ID() );
+        idCell.Global_ShowColumn( relset, idColumn );
+        idCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        orderDateCell := globalOTDTable.Global_ShowCell( relnew, Value := guard( gmco.OrderDate().Format( "Y-M2-D2" ), "鏃堕棿鏍煎紡閿欒" ) );
+        orderDateCell.Global_ShowColumn( relset, orderDateColumn );
+        orderDateCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        orderIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.OrderID() );
+        orderIDCell.Global_ShowColumn( relset, orderIDColumn );
+        orderIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        orderLineIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.OrderLineID() );
+        orderLineIDCell.Global_ShowColumn( relset, orderLineIDColumn );
+        orderLineIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        priceCell := globalOTDTable.Global_ShowCell( relnew, Value := [String]gmco.Price() );
+        priceCell.Global_ShowColumn( relset, priceColumn );
+        priceCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        priorityNameCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.PriorityName() );
+        priorityNameCell.Global_ShowColumn( relset, priorityNameColumn );
+        priorityNameCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        productIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.ProductID() );
+        productIDCell.Global_ShowColumn( relset, productIDColumn );
+        productIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        stockingPointIDCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.StockingPointID() );
+        stockingPointIDCell.Global_ShowColumn( relset, stockingPointIDColumn );
+        stockingPointIDCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        salesegmentNameCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.SalesSegmentName() );
+        salesegmentNameCell.Global_ShowColumn( relset, salesegmentNameColumn );
+        salesegmentNameCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        quantityCell := globalOTDTable.Global_ShowCell( relnew, Value := [String]gmco.Quantity() );
+        quantityCell.Global_ShowColumn( relset, quantityColumn );
+        quantityCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        unitofmeasureNameCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.UnitOfMeasureName() );
+        unitofmeasureNameCell.Global_ShowColumn( relset, unitofmeasureNameColumn );
+        unitofmeasureNameCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        orderTypeCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.OrderType() );
+        orderTypeCell.Global_ShowColumn( relset, orderTypeColumn );
+        orderTypeCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        isAvailableCell := globalOTDTable.Global_ShowCell( relnew, Value := [String]gmco.IsAvailable() );
+        isAvailableCell.Global_ShowColumn( relset, isAvailableColumn );
+        isAvailableCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        productGradeCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.ProductGrade() );
+        productGradeCell.Global_ShowColumn( relset, productGradeColumn );
+        productGradeCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        segmentPriorityCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.SegmentPriority() );
+        segmentPriorityCell.Global_ShowColumn( relset, segmentPriorityColumn );
+        segmentPriorityCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        sheetProfitabilityCell := globalOTDTable.Global_ShowCell( relnew, Value := gmco.SheetProfitability() );
+        sheetProfitabilityCell.Global_ShowColumn( relset, sheetProfitabilityColumn );
+        sheetProfitabilityCell.Global_ShowRow( relset, gloabal_ShowRow );
+        
+        orderTimeCell := globalOTDTable.Global_ShowCell( relnew, Value := guard( gmco.OrderTime().Format( "Y-M2-D2" ), "鏃堕棿鏍煎紡閿欒" ) );
+        orderTimeCell.Global_ShowColumn( relset, orderTimeColumn );
+        orderTimeCell.Global_ShowRow( relset, gloabal_ShowRow );
+           
+        i++;                                                             
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ShowCell/_ROOT_Type_Global_ShowCell.qbl b/_Main/BL/Type_Global_ShowCell/_ROOT_Type_Global_ShowCell.qbl
new file mode 100644
index 0000000..51638e9
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/_ROOT_Type_Global_ShowCell.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ShowCell
+{
+  #keys: '5[414702.0.483720658][414702.0.483720656][0.0.0][414702.0.483720657][414702.0.483720659]'
+  BaseType: Object
+  StructuredName: 'Global_ShowCells'
+}
diff --git a/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnIndex.qbl b/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnIndex.qbl
new file mode 100644
index 0000000..cccd0ed
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnIndex
+{
+  #keys: '3[414702.0.487974706][414702.0.487974705][414702.0.487974707]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnName.qbl b/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnName.qbl
new file mode 100644
index 0000000..1b0b026
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowColumn/Attribute_ColumnName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ColumnName
+{
+  #keys: '3[414702.0.483720752][414702.0.483720751][414702.0.483720753]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_ShowColumn/_ROOT_Type_Global_ShowColumn.qbl b/_Main/BL/Type_Global_ShowColumn/_ROOT_Type_Global_ShowColumn.qbl
new file mode 100644
index 0000000..19f614d
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowColumn/_ROOT_Type_Global_ShowColumn.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ShowColumn
+{
+  #keys: '5[414702.0.483720653][414702.0.483720651][0.0.0][414702.0.483720652][414702.0.483720654]'
+  BaseType: Object
+  StructuredName: 'Global_ShowColumns'
+}
diff --git a/_Main/BL/Type_Global_ShowRow/Attribute_RowNr.qbl b/_Main/BL/Type_Global_ShowRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..06bfcac
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[414702.0.483720742][414702.0.483720741][414702.0.483720743]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_Global_ShowRow/_ROOT_Type_Global_ShowRow.qbl b/_Main/BL/Type_Global_ShowRow/_ROOT_Type_Global_ShowRow.qbl
new file mode 100644
index 0000000..9c143f2
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowRow/_ROOT_Type_Global_ShowRow.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Global_ShowRow
+{
+  #keys: '5[414702.0.483720648][414702.0.483720646][0.0.0][414702.0.483720647][414702.0.483720649]'
+  BaseType: Object
+  StructuredName: 'Global_ShowRows'
+}
diff --git a/_Main/BL/Type_ImportExcel/Method_Execute.qbl b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
new file mode 100644
index 0000000..8bad7ba
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/Method_Execute.qbl
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#parent: #root
+MethodOverride Execute #extension
+{
+  TextBody:
+  [*
+    opt := DatasetFindOptions::Construct( this.MacroPlanDatasetName() );
+    mp := MDSMacroPlan::Find( opt );
+    
+    opt := DatasetFindOptions::Construct();
+    scenarioManager := MDSScenarioManager::Find( opt );
+    
+    // Only get data source which has all required files uploaded
+    dummyMissingFiles := construct( Strings );
+    needUserUploadAllFiles := true;
+    validUploadedFiles := selectset( this, LibSOPImpExp_DataSourceChildren, ds, 
+                                     ds.HasAllRequiredFilesForImport( dummyMissingFiles, needUserUploadAllFiles ) );
+    
+    traverse( validUploadedFiles, Elements, file )
+    {
+      this.LibSOPImpExp_UserInput( relnew, Value := file.Name() );
+    }
+    
+    binaryValues := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile.LibSOPImpExp_ImportUploadedFile, file, true, file.DataAsBinary() );
+    brokerNames := selectvalues( validUploadedFiles, Elements.LibSOPImpExp_DataSourceFile, file, true, file.BrokerName() );
+    userinputvalues := selectuniquevalues( this, LibSOPImpExp_UserInput, userinput,
+                                           true,
+                                           userinput.Value() );
+    mpsync := this.MPSync();
+    
+    // Reactive way to import
+    o := this
+    ->SetStatusInProgress()
+    ->|mp->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|scenarioManager->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|mpsync->ImportExcels_Tianma( userinputvalues, binaryValues.Copy(), brokerNames )
+    ->|this->SetStatusDone()
+    ->|mp->SetLastImportTime()
+    ->Exception();
+    
+    this->OnException(o);
+  *]
+}
diff --git a/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
new file mode 100644
index 0000000..cd6e3ac
--- /dev/null
+++ b/_Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization ImportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
new file mode 100644
index 0000000..710f4a0
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IsDataSourceIncluded_Tianma (
+  Strings userinputvalues,
+  String datasource_i
+) remote as Boolean
+{
+  Description: 'If data source selected by user to export'
+  TextBody: 'return exists( userinputvalues, Elements, input, input = datasource_i );'
+}
diff --git a/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
new file mode 100644
index 0000000..9510e76
--- /dev/null
+++ b/_Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LibSOPImpExp_ExportExcel #extension
+{
+}
diff --git a/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..01d9ef9
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userInput_i - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ImportProfiles() ),
+                 mpBinaryValues_i, mpBrokers_i, is3DDrive, construct( FileItems), construct( Strings ) );
+  *]
+}
diff --git "a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl" "b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl"
deleted file mode 100644
index 5f2c716..0000000
--- "a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter\043323.qbl"
+++ /dev/null
@@ -1,15 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method RefreshCapacityAndSaleBudgeFilter (
-  Boolean deleteBeforeCreate
-)
-{
-  TextBody:
-  [*
-    if( deleteBeforeCreate ) {
-      this.CapacityAndSaleBudgeFilterBusinessType( relflush );
-      this.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );  
-    }
-    this.RefreshCapacityAndSaleBudgeFilter();
-  *]
-}
diff --git a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
index 6c1f176..496ec45 100644
--- a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
+++ b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: #root
-Method RefreshCapacityAndSaleBudgeFilter
+Method RefreshCapacityAndSaleBudgeFilter (
+  GlobalOTDTable globalOtdTable
+)
 {
   TextBody:
   [*
@@ -9,12 +11,12 @@
     businessTypes := selectuniquevalues( this, MappingCapacityAndSaleBudge, item, item.BusinessType() );
     info( [String]businessTypes.Size() );
     traverse( businessTypes, Elements, businessType ) {
-      CapacityAndSaleBudgeFilterBusinessType::CreateIfNotExist( this, businessType );
+      CapacityAndSaleBudgeFilterBusinessType::CreateIfNotExist( globalOtdTable, businessType );
     }
     placeOfProductionOfArrays := selectuniquevalues( this, MappingCapacityAndSaleBudge, item, item.PlaceOfProductionOfArray() );
     info( [String]placeOfProductionOfArrays.Size() );
     traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::CreateIfNotExist( this, placeOfProductionOfArray );
+      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::CreateIfNotExist( globalOtdTable, placeOfProductionOfArray );
     }
   *]
 }
diff --git a/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl
new file mode 100644
index 0000000..c8d1bbb
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Method RefreshCapacityAndSaleBudgeFilter (
+  Boolean deleteBeforeCreate,
+  GlobalOTDTable globalOtdTable
+)
+{
+  TextBody:
+  [*
+    if( deleteBeforeCreate ) {
+      globalOtdTable.CapacityAndSaleBudgeFilterBusinessType( relflush );
+      globalOtdTable.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );  
+    }
+    this.RefreshCapacityAndSaleBudgeFilter( globalOtdTable );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..7d409ec
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Synchronize( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_SupplyChainParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_GlobalParameters() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Periods() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_InventorySupplies() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Products() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Forecasts() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_ServiceLevels() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Campaigns() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Entities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Costs() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Lanes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Routings() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Capacities() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Functionality_SupplySpecifications() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Recipes() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_Designer_Actuals() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MP_GlobalParameters_KPIFeedbackName() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_OptimizerPuzzles() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_PostponementSpecAndFulfillmentRestriction() ),
+                      LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_CustomerOrder() ),
+                      false, /* isImportBinary */
+                      mpBinaryValues_i,
+                      mpBrokers_i,
+                      is3DDrive,
+                      construct( FileItems ), /* 3ddrive, ignore */
+                      construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
index 4504921..9d01ece 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
@@ -38,12 +38,18 @@
         }
     //  if( not isnull( Product_MP::FindById( this, item.ProductID() ) ) ){
     //    info( item.ProductID().AsQUILL() );
-      CustomerOrder::CreateOrUpdate( this, item.CurrencyID(), item.Customer(), item.CustomerID(), item.ID(), 
-                                     item.OrderDate(), item.OrderID(), item.OrderLineID(), item.Price(), 
-                                     priorityName, item.ProductID(), 
-                                     item.StockingPointID(), 
-                                     item.SalesSegmentName(), 
-                                     item.Quantity(), item.UnitOfMeasureName(), item.OrderType(), item.IsAvailable());
+      customOrder := CustomerOrder::CreateOrUpdate( this, item.CurrencyID(), item.Customer(), item.CustomerID(), item.ID(), 
+                                                    item.OrderDate(), item.OrderID(), item.OrderLineID(), item.Price(), 
+                                                    priorityName, item.ProductID(), 
+                                                    item.StockingPointID(), 
+                                                    item.SalesSegmentName(), 
+                                                    item.Quantity(), item.UnitOfMeasureName(), item.OrderType(), item.IsAvailable());
+      customOrder.BusinessType( item.BusinessType() );
+      customOrder.OrderType( item.OrderType() );
+      customOrder.OrderTime( item.OrderTime() );
+      customOrder.ProductGrade( item.ProductGrade() );
+      customOrder.SegmentPriority( item.SegmentPriority() );
+      customOrder.SheetProfitability( item.SheetProfitability() );
     //  }else{
     //    info( "invaild product: " + item.ProductID().AsQUILL() );
     //    }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
index 254be84..663464c 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
@@ -10,7 +10,6 @@
   TextBody:
   [*
     // yypsybs Aug-21-2023 (created)
-    
     keyProductList := construct( Strings );
     if( isKeyProduct ) {
         keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
@@ -61,6 +60,7 @@
                   // ========鍒嗙粍澶勭悊杈撳叆========
                   
                 }
+                
                 if( not isnull( stockingPoint)){
                   if( isKeyProduct){
                       keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
@@ -83,5 +83,78 @@
             this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
         }
     }
+    
+    
+    //
+    //keyProductList := construct( Strings );
+    //if( isKeyProduct ) {
+    //    keyProductList := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, item, item.ProductMajorType()="鎴愬搧" or item.ProductMajorType()="鍗婃垚鍝�", item.ID() );
+    //}
+    //bomList := selectsortedset(  globalOTDTable, Global_MappingOperationBOM, item,
+    //                             ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
+    //                                     true, 
+    ////                                     businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
+    //                                     businessTypes.Find( item.BusinessType() ) >= 0 )
+    ////                             and ifexpr( isKeyProduct, 
+    ////                                         keyProductList.Size() > 0 and keyProductList.Find( item.ComponentCode() ) >= 0,
+    ////                                         true )
+    //                             ,
+    //                             item.OrganCode() + "_" + item.ProductCode() + "_" + item.ProcessSection() );
+    //// 鎸塺outing鍙妑outingStep鍒嗙粍
+    //routingIds := selectuniquevalues( bomList, Elements, item, true, item.OrganCode() + "_" + item.ProductCode() );
+    //traverse( routingIds, Elements, routingId ) {
+    //    routingRows := selectset( bomList, Elements, item, true, routingId = item.OrganCode() + "_" + item.ProductCode() );
+    //    if( routingRows.Size() > 0 ) {
+    //        firstRow := routingRows.Element( 0 );
+    ////        stockingPointId := firstRow.OrganCode()  + "_" + firstRow.ProductType() + "_Stock";
+    ////        inputStockingPointId := firstRow.OrganCode()  + "_" + firstRow.ComponentType() + "_Stock";
+    //        stockingPointId := firstRow.OrganCode()  + "_Stock";
+    //
+    //        // ========妫�鏌�========
+    //        product := Product_MP::FindProductTypeIndex( firstRow.ProductCode() );
+    //        if( not isnull( product ) ) {
+    ////              error( "product : " + firstRow.ProductCode() + " not found" );
+    //          stockingPoint := StockingPoint_MP::FindStockingPointTypeIndex( stockingPointId );
+    //
+    ////          info( stockingPointId.AsQUILL() );
+    //  //        if( isnull( stockingPoint ) ) {
+    //  //            error( "stockingPoint : " + stockingPointId + " not found" );
+    //  //        }
+    //          routing := Routing::FindRoutingTypeIndex(  routingId );
+    //          if( not isnull( routing ) ) {
+    ////              error( "routing : " + routingId + " not found" );
+    //            // ========澶勭悊杈撳嚭========
+    //            if( not isnull( stockingPoint ) ) {
+    ////              info( 1 );
+    //              operationsInLastSteps := Operation::FindFinalOperationsByRoutingId( this, routingId );
+    //              traverse( operationsInLastSteps, Elements, operationsInLastStep ) {
+    //                  operationsInLastStep.CreateOperationBOM( product, stockingPoint, false, true );
+    //                  operationsInLastStep.GetOperationBOM( product.ID(), stockingPoint.ID(), false ).Quantity( 1 );
+    //              }
+    //              // ========鍒嗙粍澶勭悊杈撳叆========
+    //              
+    //            }
+    //            if( not isnull( stockingPoint)){
+    //              if( isKeyProduct){
+    //                  keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,keyRows);
+    //                }else{
+    //                  this.MappingOperationBOMDataRouting( routing,globalOTDTable,routingRows);
+    //                }
+    //                
+    //            }
+    //          }
+    //       }
+    //    }
+    //}
+    //if( createPurchaseSupplyMaterial ) {
+    //    toCreateBomList := selectuniquevalues( bomList, Elements, item, 
+    //                                           item.ComponentType() = "P", item.OrganCode() + item.ComponentCode());
+    //    traverse( toCreateBomList, Elements, key ) {
+    //        boms := selectset( bomList, Elements, item, item.ComponentType() = "P" and item.OrganCode() + item.ComponentCode() = key );
+    //        bom := boms.First();
+    //        this.MappingOperationBOMDataSupplyPurchase( bom.OrganCode(), bom.ComponentCode(), bom.ComponentType());
+    //    }
+    //}
   *]
 }
diff --git a/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl b/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl
deleted file mode 100644
index 0c8ee87..0000000
--- a/_Main/BL/Type_MappingSaleBudge/DefaultValue_PlaceOfProductionOfEvaporation.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: PlaceOfProductionOfEvaporation
-}
diff --git a/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
index c469165..c75f124 100644
--- a/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
+++ b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
@@ -61,7 +61,7 @@
     }
     //---------------------------------------------------------------------------------------------
     xmlTemplate := xmlTemplate + "</table>";
-    info( xmlTemplate );
+    //info( xmlTemplate );
     tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
     XLS::SaveTable( tableHandle, OS::TempPath() + "MappingCapacityAndSaleBudge.xlsx" );
     file := OSFile::Construct();
diff --git a/_Main/BL/Type_PriorityFactor/Attribute_ReflectionAttribute.qbl b/_Main/BL/Type_PriorityFactor/Attribute_ReflectionAttribute.qbl
new file mode 100644
index 0000000..3f5a69d
--- /dev/null
+++ b/_Main/BL/Type_PriorityFactor/Attribute_ReflectionAttribute.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ReflectionAttribute
+{
+  #keys: '3[414382.0.554303396][414382.0.554303395][414382.0.554303397]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PriorityFactor/Attribute_ReflectionType.qbl b/_Main/BL/Type_PriorityFactor/Attribute_ReflectionType.qbl
new file mode 100644
index 0000000..49b163b
--- /dev/null
+++ b/_Main/BL/Type_PriorityFactor/Attribute_ReflectionType.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ReflectionType
+{
+  #keys: '3[414382.0.554014806][414382.0.554014805][414382.0.554014807]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
index c6c69c4..1449c61 100644
--- a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
+++ b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
@@ -15,15 +15,88 @@
         isBusinessType := true; 
     }
     
-    priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+    if( priorityFactor.Name() = "澶у紶鐩堝埄姘村钩" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
                                             IsRange := false,GradingName := "澶х泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-    priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
-                                            IsRange := false,GradingName := "灏忕泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-    priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 0,
-                                            IsRange := false,GradingName := "鎸佸钩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-    priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -3,
-                                            IsRange := false,GradingName := "灏忎簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
-    priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -5,
-                                            IsRange := false,GradingName := "澶т簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "灏忕泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 0,
+                                                IsRange := false,GradingName := "鎸佸钩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -3,
+                                                IsRange := false,GradingName := "灏忎簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -5,
+                                                IsRange := false,GradingName := "澶т簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "瀹㈡埛绛栫暐" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "81%鈮鈮�100%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 4,
+                                                IsRange := false,GradingName := "61%鈮鈮�80%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "41%鈮鈮�60%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 2,
+                                                IsRange := false,GradingName := "21%鈮鈮�40%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "1%鈮鈮�20%",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "缁嗗垎甯傚満绛夌骇" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鎴樼暐",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "閲嶇偣",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "娼滃姏",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "璁㈠崟涓嬪崟鏃堕棿" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "120",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 4,
+                                                IsRange := false,GradingName := "90",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "60",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 2,
+                                                IsRange := false,GradingName := "30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "0",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "闇�姹傜被鍨�" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鏈夐娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "鏃犻娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "绾娴�",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "瀹㈡埛绛夌骇" )
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "鎴樼暐",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "閲嶇偣",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "娼滃姏",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+    }
+    
+    if( priorityFactor.Name() = "DOI" or priorityFactor.Name() = "DSI")
+    {
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
+                                            IsRange := false,GradingName := "<7",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
+                                                IsRange := false,GradingName := "<15",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := "<30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());
+        priorityFactor.PriorityFactorDetails(relnew,BusinessType := priorityFactor.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 1,
+                                                IsRange := false,GradingName := ">30",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := priorityFactor.Name());                                                                                     
+    }
   *]
 }
diff --git a/_Main/BL/Type_PriorityResult/Attribute_CustomerOrderID.qbl b/_Main/BL/Type_PriorityResult/Attribute_CustomerOrderID.qbl
new file mode 100644
index 0000000..f65a510
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/Attribute_CustomerOrderID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomerOrderID
+{
+  #keys: '3[414382.0.554015006][414382.0.554015005][414382.0.554015007]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_CalculateBracketScore.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateBracketScore.qbl
new file mode 100644
index 0000000..962e51e
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateBracketScore.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CalculateBracketScore (
+  String calcStr,
+  CustomerOrder customerOrder,
+  String businessType,
+  MacroPlan macroPlan,
+  GlobalOTDTable globalOTDTable
+) as Real
+{
+  Description: '璁$畻鍏紡涓嫭鍙峰唴鐨勬暟鎹�'
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    
+    return PriorityResult::CalculateScore( calcStr,customerOrder,businessType,macroPlan,0.0,globalOTDTable);
+  *]
+}
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
new file mode 100644
index 0000000..93e2b2f
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
@@ -0,0 +1,88 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CalculateScore (
+  String formula,
+  CustomerOrder customerOrder,
+  String businessType,
+  MacroPlan macroPlan,
+  Real lastScore,
+  GlobalOTDTable globalOTDTable
+) as Real
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    score := 0.0;
+    remindFormula := formula;
+    
+    // 閬嶅巻浼樺厛绾у洜瀛愰厤缃�
+    
+    if( not remindFormula = '' )
+    {
+            // 浠庤捣濮嬩綅缃紑濮嬪尮閰� 
+            if(remindFormula.StartsWith( "+" ))
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable); 
+                score := lastScore + score;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+            else if( remindFormula.StartsWith( "-" ))
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
+                score := lastScore - score;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+            else if( remindFormula.StartsWith( "*" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
+                score := lastScore * score;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+            else if( remindFormula.StartsWith( "/" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
+                score := lastScore / score;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+            else if( remindFormula.StartsWith( "(" ) )
+            {
+                // 鎵惧埌绗竴涓粨鏉熺殑 )
+                // 璁$畻鎷彿涓殑鍐呭
+                rightBracket := remindFormula.FindString( ")",0);
+                calcStr := remindFormula.SubString( 1,rightBracket);
+                PriorityResult::CalculateBracketScore(calcStr,customerOrder,businessType,macroPlan,globalOTDTable);
+                
+                // 鎴彇 ) 鍚庣殑瀛楃缁х画杩涜璁$畻
+                remindFormula := remindFormula.SubString( rightBracket,remindFormula.Length());
+            }
+            else
+            {
+                // 涓嶆槸绗﹀彿 鐩存帴鑾峰彇璁$畻鍚庣殑鏁板��
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+    }
+    
+    // 娌℃湁鍖归厤 鍏紡璁$畻瀹屾垚
+    return lastScore;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl
new file mode 100644
index 0000000..78c3611
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl
@@ -0,0 +1,124 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDetailsValue (
+  CustomerOrder customerOrder,
+  String formula,
+  MacroPlan macroPlan,
+  GlobalOTDTable globalOTDTable
+) as Real
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    // 褰撳墠璁$畻浼樺厛绾у洜瀛愮粏鍒� 濡傛灉鑾峰彇涓嶅埌鍏ㄩ儴鍏堥粯璁や负1
+    
+    value := 0.0;
+    
+    priorityFactor := null( PriorityFactor);
+    traverse( macroPlan,PriorityFactor,p)
+    {   
+         if( formula.StartsWith( p.Name()) )
+         {
+            priorityFactor := p;
+         }
+    }
+    
+    if(isnull( priorityFactor) )
+    {
+        value := 1.0;
+    }
+    else
+    {
+            if( "瀹㈡埛绛栫暐" =  priorityFactor.Name())
+            {
+                 obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "瀹㈡埛绛栫暐" and p.GradingName() = customerOrder.CustomerPolicy());
+                 gradeTarget := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      gradeTarget := obj.GradeTarget();
+                 }
+                 value := priorityFactor.Coefficient() * gradeTarget;
+            }
+            
+            if( "澶у紶鐩堝埄姘村钩" =  priorityFactor.Name())
+            {
+                 obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "澶у紶鐩堝埄姘村钩" and  p.GradingName() = customerOrder.SheetProfitability());
+                 gradeTarget := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      gradeTarget := obj.GradeTarget();
+                 }
+                 value := priorityFactor.Coefficient() * gradeTarget;
+            }
+            
+            if( "DOI" =  priorityFactor.Name())
+            {
+                 // DOI鏁版嵁
+                 obj := selectobject( globalOTDTable,Global_MappingDOI_DSI,doi,doi.ProductID() = customerOrder.ProductID())
+                 doi := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      doi := [Real]obj.DOI();
+                 }
+                 value := priorityFactor.Coefficient() * doi;
+            }
+            
+            if( "DSI" =  priorityFactor.Name())
+            {
+                 // DOI鏁版嵁
+                 obj := selectobject( globalOTDTable,Global_MappingDOI_DSI,doi,doi.ProductID() = customerOrder.ProductID())
+                 dsi := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      dsi := [Real]obj.DSI();
+                 }
+                 value := priorityFactor.Coefficient() * dsi;
+            }
+            
+            if( "缁嗗垎甯傚満绛夌骇" =  priorityFactor.Name())
+            {
+                 obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "缁嗗垎甯傚満绛夌骇" and p.GradingName() = customerOrder.SegmentPriority());
+                 gradeTarget := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      gradeTarget := obj.GradeTarget();
+                 }
+                 value := priorityFactor.Coefficient() * gradeTarget;
+            }
+            
+            if( "闇�姹傜被鍨�" =  priorityFactor.Name())
+            {     
+                // 鏈夐娴� 鏃犻娴� 绾娴�
+                 obj := selectobject( priorityFactor,PriorityFactorDetails,p,p.GradingName() = customerOrder.OrderType());
+                 gradeTarget := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      gradeTarget := obj.GradeTarget();
+                 }
+                 value := priorityFactor.Coefficient() * gradeTarget;
+            }
+            
+            if( "瀹㈡埛绛夌骇" =  priorityFactor.Name())
+            {
+                 // 閫氳繃鏁版嵁婀栬绠楀鎴风瓑绾�
+                 obj := selectobject( globalOTDTable,Global_MappingCustomerGrade,doi,doi.BusinessType() = customerOrder.BusinessType() and doi.Customer() = customerOrder.CustomerName())
+                 customerGrade := 1.0;
+                 if( not isnull( obj ) )
+                 {
+                      customerGrade := [Real]obj.CustomerGrade();
+                 }
+                 value := priorityFactor.Coefficient() * customerGrade;
+            }
+            
+            if( "璁㈠崟涓嬪崟鏃堕棿" =  priorityFactor.Name())
+            {
+                 // 涓嬪崟鏃堕棿
+                 orderTime := customerOrder.OrderTime();
+                 days := orderTime.TotalInDays() - customerOrder.EndDate().TotalInDays();
+                 obj := selectobject( priorityFactor,PriorityFactorDetails,p , p.PriorityFactorName() = "璁㈠崟涓嬪崟鏃堕棿" and days >= [Number]p.GradingName());
+                 value := priorityFactor.Coefficient() * obj.GradeTarget();
+            }
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
new file mode 100644
index 0000000..fd4f1f0
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetRemindFormula (
+  String formula,
+  MacroPlan macroPlan
+) as String
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    str := "";
+    
+    traverse( macroPlan,PriorityFactor,p)
+    {  
+         if( formula.StartsWith( p.Name()) )
+         {
+              // 鍒ゆ柇鍓╀綑瀛楃闀垮害
+              if( p.Name().Length() = formula.Length() )
+              {
+                 str := ""
+              }
+              else
+              {              
+                str := formula.SubString( p.Name().Length(),formula.Length() - p.Name().Length());
+              }
+         }
+    }
+    
+    info( "remindStr = " + str );
+    return str;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl b/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
new file mode 100644
index 0000000..715b2f8
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
@@ -0,0 +1,84 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CalculatePriorityResult (
+  String priorityPolicyName,
+  MacroPlan macroPlan,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    // 璁$畻瀹㈡埛璁㈠崟鐨勪紭鍏堢骇寰楀垎 鍥炲~鏉冮噸鏁版嵁 鐢熸垚鏂扮殑Priority鏄庣粏鏁版嵁
+    
+    traverse( macroPlan,SalesDemand.astype( CustomerOrder ),e)
+    {
+         // 浜嬩笟閮ㄤ俊鎭�
+         businessType := e.BusinessType();
+         //businessType :=  "鎵嬫満浜嬩笟閮�";
+         
+         // 鑾峰彇瀵瑰簲浜嬩笟閮ㄨ绠楀叕寮�
+         priorityPolicys := selectobject( macroPlan,PriorityPolicy,p,p.BusinessType() = businessType and p.Name() = priorityPolicyName);
+         formula := priorityPolicys.Formula();
+         
+         // 閫掑綊澶勭悊璁$畻鍏紡 鑾峰彇褰撳墠璁㈠崟鐨勫緱鍒�
+         value := PriorityResult::CalculateScore( formula,e,businessType,macroPlan,0.0,globalOTDTable);
+         
+         // 鐢熸垚浼樺厛绾у洜瀛愯窇鍒嗙粨鏋�
+         priorityResult := macroPlan.PriorityResult(relnew,CustomerOrderID := e.ID(),BusinessType := businessType,Customer := e.CustomerName(),CustomerID := e.CustomerID(),
+                                                     DemandDate := e.EndDate(),ProductID := e.ProductID(),Quantity := e.Quantity(),SalesSegmentName := e.SalesSegmentName(),
+                                                     StockingPointID := e.StockingPointID(),UnitOfMeasureName := e.UnitOfMeasureName()
+                                                     );
+          
+         // 鍒ゆ柇鏄泦鍥� 杩樻槸浜嬩笟閮�
+         if( businessType.FindString( "闆嗗洟",0 ) <> -1)
+         {
+              priorityResult.PriorityResultGroupDetail( relnew,BusinessType := businessType,Customer := e.CustomerName(),CustomerID := e.CustomerID(),
+                                                        DemandDate := e.EndDate(),PriorityPolicyName := priorityPolicyName,PriorityResultScore := value,
+                                                        Quantity := e.Quantity(),SalesSegmentName := e.SalesSegmentName(),StockingPointID := e.StockingPointID(),
+                                                        UnitOfMeasureName := e.UnitOfMeasureName(),PriorityTotalScore := value
+                                                        );
+         }
+         else
+         {
+               priorityResult.PriorityResultBusinessTypeDetail( relnew,BusinessType := businessType,Customer := e.CustomerName(),CustomerID := e.CustomerID(),
+                                                                DemandDate := e.EndDate(),PriorityPolicyName := priorityPolicyName,PriorityResultScore := value,
+                                                                Quantity := e.Quantity(),SalesSegmentName := e.SalesSegmentName(),StockingPointID := e.StockingPointID(),
+                                                                UnitOfMeasureName := e.UnitOfMeasureName(),PriorityTotalScore := value 
+                                                                );      
+         }                                                                                                                                       
+    }
+    
+    // 浼樺厛绾у洜瀛愬鐞嗗畬鎴愬悗 鎺掑簭鍥炲~鏁版嵁
+    resultList := selectsortedset( macroPlan,PriorityResult,result,
+                                   true,
+                                   result.PriorityResultScore()
+                                   )
+    
+    priorityValue := 1;
+    traverse( resultList,Elements,e)
+    {
+        obj := selectobject( macroPlan,SalesDemand.astype( CustomerOrder ),order, 
+                             order.ID() = e.CustomerOrderID()
+                             );
+        
+        // 璁㈠崟鏁版嵁涓嶄负绌哄啀鍋氬鐞�
+        if( not isnull( obj ) )
+        {
+              obj.PriorityName([String]priorityValue);
+              
+              // 鍒涘缓浼樺厛绾ф暟鎹� 闇�瑕佸厛娓呴櫎涓婁竴娆$殑璁$畻缁撴灉
+              // 鍒ゆ柇褰撳墠customerOrder鏄惁瀛樺湪
+              oldPriority := selectobject( macroPlan,Priority,p,p.Name() = obj.OrderID());
+              if(not isnull( oldPriority ) )
+              {
+                    macroPlan.Priority(reldelete, oldPriority);
+              }
+              macroPlan.Priority(relnew,Weight := priorityValue,Name := obj.OrderID());
+              priorityValue := priorityValue + 1;
+        }
+    
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/FunctionOverride_CalcStockLevelInDays.qbl b/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/FunctionOverride_CalcStockLevelInDays.qbl
new file mode 100644
index 0000000..bd5d786
--- /dev/null
+++ b/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/FunctionOverride_CalcStockLevelInDays.qbl
@@ -0,0 +1,79 @@
+Quintiq file version 2.0
+#parent: #root
+FunctionOverride CalcStockLevelInDays #extension
+{
+  TextBody:
+  [*
+    totalDays := 0.0;
+    
+    if( not this.Period_MP().MacroPlan().IsMetaOptimizerRunning() ) 
+    {
+      balanceInv := this.InventoryLevelEnd();
+      
+      if( balanceInv > 0 )
+      {
+        // Calculate stock level in days
+        futureperiods := selectsortedset( this, ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), p,
+                                          p.Start() >= this.End(), p.Start() );
+        product := this.ProductInStockingPoint_MP().Product_MP();
+        shelflife := this.ShelfLife();
+        hasshelflife := product.HasShelfLife() and not isnull( shelflife );
+        agevector := RealVector::Construct();
+        quantityvector := RealVector::Construct();
+        
+        // Modified logic to consider shelf-life for stock level in days
+        if( hasshelflife )
+        {
+          // Get the age and quantity vector of remaining product stock at the end of period
+          agevector := RealVector::Construct( shelflife.ShelfLifeEndAgeVectorAsBinaryValue() );
+          quantityvector := RealVector::Construct( shelflife.ShelfLifeEndQuantityVectorAsBinaryValue() );
+        }
+        
+        /*
+          Track if consecutive future periods has 0 demand (although we have balance supply, but if remaining future periods has 0 demand not consider as coverable).
+          Accumulate the coverable days and only add to total days if manage to find a subsequent period with demand.
+        */
+        traverse( futureperiods, Elements, pispip,
+                  // Terminate calculation once remaining supply is 0
+                  balanceInv > 0 )
+        {
+          if( balanceInv > 0 )
+          {
+            demandQty := pispip.DependentDemandAndSalesDemandQuantity();
+            
+            // Include expired quantity as demand to determine stock level in days
+            if( hasshelflife )
+            {
+              isexpiredinperiodvector := BooleanVector::Construct();
+              
+              traverse( agevector.AsValues(), Elements, age )
+              {
+                isexpiredinperiod := not product.GetIsUsableInTargetPeriod( [Real] age, pispip.Start(), pispip.Period_MP() );
+                isexpiredinperiodvector.Append( isexpiredinperiod );
+                agevector.Add( pispip.Period_MP().GetDurationInDaysForShelfLife(), false );
+              }
+              
+              // Sum of all elements in the quantity vector that corresponds to element = true in the boolean vector
+              expiredinventoryqty := quantityvector.GetSelection( isexpiredinperiodvector ).Sum();
+              demandQty := demandQty + expiredinventoryqty; // Reduce inventory as expired
+            }
+            
+            if( balanceInv > demandQty ) // Remaining supply can cover demand in period
+            {
+              totalDays := totalDays + pispip.Period_MP().DurationInDays();
+              balanceInv := balanceInv - demandQty;
+            }
+            else // Remaining supply partially cover the demand in period
+            {
+              // Main calc logic
+              totalDays := totalDays + ( balanceInv / demandQty * pispip.Period_MP().DurationInDays() );
+              balanceInv := 0.0;
+            }
+          }
+        }
+      }
+    }
+    
+    this.StockLevelInDays( totalDays );
+  *]
+}
diff --git a/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/_ROOT_Type_ProductInStockingPointInPeriodPlanningLeaf.qbl b/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/_ROOT_Type_ProductInStockingPointInPeriodPlanningLeaf.qbl
new file mode 100644
index 0000000..8c6a2c8
--- /dev/null
+++ b/_Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/_ROOT_Type_ProductInStockingPointInPeriodPlanningLeaf.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization ProductInStockingPointInPeriodPlanningLeaf #extension
+{
+}
diff --git a/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
new file mode 100644
index 0000000..2c38e3e
--- /dev/null
+++ b/_Main/BL/Type_ScenarioManager/Method_ImportExcels_Tianma.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+Method ImportExcels_Tianma (
+  Strings userinputvalues,
+  BinaryValues mpBinaryValues_i,
+  Strings mpBrokers_i
+)
+{
+  Description: 'Import from Excel, used by web app.'
+  TextBody:
+  [*
+    // @userinputvalues - Array of data group that user imports
+    // @mpBinaryValues_i - Array of uploaded Excels in binary value. Binary at position x matches @mpBrokers_i at same position
+    // @mpBrokers_i - Array of uploaded Excels' broker name
+    
+    is3DDrive := false;
+    
+    // Check if each data group has files uploaded by user for import
+    this.Import( LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Strategies() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Accounts() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_Bookmarks() ),
+                 LibSOPImpExp_ExportExcel::IsDataSourceIncluded_Tianma( userinputvalues, Translations::MPSync_ObjectGroup_KPISetting() ),
+                 mpBinaryValues_i.Copy(), 
+                 mpBrokers_i, 
+                 is3DDrive, 
+                 construct( FileItems ), /* 3ddrive, ignore */ 
+                 construct( Strings ) /* 3ddrive, ignore */ );
+  *]
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl b/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl
new file mode 100644
index 0000000..7a1e8b7
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestBoolean
+{
+  #keys: '3[414384.0.915854691][414384.0.915854690][414384.0.915854692]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl b/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl
new file mode 100644
index 0000000..f96d5cd
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestDate
+{
+  #keys: '3[414384.0.915854704][414384.0.915854703][414384.0.915854705]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl b/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl
new file mode 100644
index 0000000..4ebf668
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestDateTime.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestDateTime
+{
+  #keys: '3[414384.0.915854714][414384.0.915854713][414384.0.915854715]'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl b/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl
new file mode 100644
index 0000000..95e5da0
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestNumber.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestNumber
+{
+  #keys: '3[414384.0.915854681][414384.0.915854680][414384.0.915854682]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl b/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl
new file mode 100644
index 0000000..1852888
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestReal.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestReal
+{
+  #keys: '3[414384.0.915854668][414384.0.915854667][414384.0.915854669]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_YuxTest/Attribute_TestString.qbl b/_Main/BL/Type_YuxTest/Attribute_TestString.qbl
new file mode 100644
index 0000000..5965156
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/Attribute_TestString.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TestString
+{
+  #keys: '3[414384.0.915854658][414384.0.915854657][414384.0.915854659]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl b/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl
new file mode 100644
index 0000000..d6f5aaf
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/StaticMethod_Export.qbl
@@ -0,0 +1,85 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  YuxTests toExportList
+) as String
+{
+  TextBody:
+  [*
+    // generate by generate_export_method.py
+    xmlTemplate := '<?xml version="1.0" encoding="UTF-16"?>
+    <table>
+      <name>YuxTest</name>
+    ';
+    convDateToString := DateToString::StandardConverter();
+    convDateToString.SetCustomConversion();
+    convDateToString.CustomFormatString( 'yyyy-MM-dd' );
+    convDateTimeToString := DateTimeToString::StandardConverter();
+    convDateTimeToString.SetCustomConversion();
+    convDateTimeToString.CustomFormatString( 'yyyy-MM-dd HH:mm:ss' );
+    info( "export start" );
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏁板瓧</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testNumber := toExportItem.TestNumber();
+      cellStr := '<cell value="' + [String]testNumber + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯灏忔暟</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testReal := toExportItem.TestReal();
+      cellStr := '<cell value="' + [String]testReal + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯瀛楃涓�</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testString := toExportItem.TestString();
+      cellStr := '<cell value="' + testString + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯甯冨皵</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testBoolean := toExportItem.TestBoolean();
+      cellStr := '<cell value="' + [String]testBoolean + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏃ユ湡</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testDate := toExportItem.TestDate();
+      cellStr := '<cell value="' + ifexpr( testDate = Date::MinDate(), "", convDateToString.Convert( testDate )) + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    columnStr := "<column><name>娴嬭瘯鏃ユ湡鏃堕棿</name><type>String</type>";
+    traverse( toExportList, Elements, toExportItem ) {
+      testDateTime := toExportItem.TestDateTime();
+      cellStr := '<cell value="' + ifexpr( testDateTime = DateTime::MinDateTime(), "", convDateTimeToString.Convert( testDateTime )) + '"/>';
+      columnStr := columnStr + cellStr;
+    }
+    columnStr := columnStr + "</column>";
+    xmlTemplate := xmlTemplate + columnStr;
+    //---------------------------------------------------------------------------------------------
+    xmlTemplate := xmlTemplate + "</table>";
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
+    XLS::SaveTable( tableHandle, OS::TempPath() + "YuxTest.xlsx" );
+    file := OSFile::Construct();
+    file.Open( OS::TempPath() + "YuxTest.xlsx", "Read", true );
+    data := file.ReadBinary()
+    info( "export end" );
+    return data.AsBase64EncodedString();
+  *]
+}
diff --git "a/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl" "b/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl"
new file mode 100644
index 0000000..f77f7ce
--- /dev/null
+++ "b/_Main/BL/Type_YuxTest/StaticMethod_ExportTest\043887.qbl"
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportTest (
+  MPSync parent
+) as String
+{
+  TextBody:
+  [*
+    // yypsybs Sep-25-2023 (created)
+    list := selectset( parent, YuxTest, item, true );
+    if( list.Size() = 0 ) {
+      for( i := 0; i < 100; i := i + 1 ) {
+        parent.YuxTest( relnew, 
+                        TestBoolean := ifexpr( Number::Random( 0, 1 ) = 1, true, false ), 
+                        TestDate :=   ifexpr( Number::Random( 0, 1 ) = 1, Date::MinDate(), Date::ActualDate() ), 
+                        TestDateTime :=   ifexpr( Number::Random( 0, 1 ) = 1,DateTime::MinDateTime(), DateTime::ActualTime() ),
+                        TestNumber :=  Number::Random( 100, 200 ),
+                        TestReal := Real::Random( 10.0, 20.0 ), 
+                        TestString := [String]Number::Random( 1000, 2000 ) 
+                        );
+      }
+    }
+    list := selectset( parent, YuxTest, item, true );
+    return YuxTest::Export( list );
+  *]
+}
diff --git a/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl b/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl
new file mode 100644
index 0000000..13ff536
--- /dev/null
+++ b/_Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type YuxTest
+{
+  #keys: '5[414384.0.915854638][414384.0.915854636][0.0.0][414384.0.915854637][414384.0.915854639]'
+  BaseType: Object
+  StructuredName: 'YuxTests'
+}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 7aa83c9..4ad9e84 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -13,6 +13,10 @@
           [
             Component MenuSpecial #extension
             {
+              Children:
+              [
+                Component MenuGlobalOTDTableTest { #keys: '[157968.0.1170224128]' BaseType: 'Menu' Properties: [ Image: 'DUDE2' Text: 'GlobalOTDTable Test' ] }
+              ]
               Properties:
               [
                 ModeledStringList ChildOrdering
@@ -30,6 +34,7 @@
                   c: MenuTest
                   c: MenuScenarioManagerTest
                   c: MenuMPDomainHandlerTest
+                  c: MenuGlobalOTDTableTest
                   c: MenuRemoveHistory
                   c: Menu46
                   c: MenuRefresh
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuGlobalOTDTableTest_OnClick.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuGlobalOTDTableTest_OnClick.def
new file mode 100644
index 0000000..9596987
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_TIANMA_JITUAN_mbMainMenu_MenuGlobalOTDTableTest_OnClick.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: mbMainMenu/MenuGlobalOTDTableTest
+Response OnClick () id:Response_TIANMA_JITUAN_mbMainMenu_MenuGlobalOTDTableTest_OnClick
+{
+  #keys: '[157968.0.1170224134]'
+  Body:
+  [*
+    // Run GlobalOTDTable test method
+    GlobalOTDTable.Test();
+  *]
+  DefinitionID: 'Responsedef_Menu_OnClick'
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews\043633.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews\043633.def"
index 82df44f..b9da9db 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews\043633.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews\043633.def"
@@ -18,5 +18,16 @@
         Taborder: 3
       ]
     }
+    Component ButtonPriority
+    {
+      #keys: '[414382.0.587601840]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'QUEUE'
+        Label: '浼樺厛绾у洜瀛�'
+        Taborder: 4
+      ]
+    }
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgInterfaceTest.def
new file mode 100644
index 0000000..5941080
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgInterfaceTest.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component abgInterfaceTest
+{
+  #keys: '[414702.0.457001887]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component btnInterfaceTest
+    {
+      #keys: '[414702.0.459575623]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BEAR'
+        Label: '鎺ュ彛娴嬭瘯'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 5
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
index 42787dc..7966b9e 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
@@ -4,5 +4,6 @@
   Children:
   [
     #child: abgTest
+    #child: abgInterfaceTest
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick.def
new file mode 100644
index 0000000..feae35c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupSalesViews/ButtonPriority
+Response OnClick () id:Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick
+{
+  #keys: '[414382.0.587601951]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "PriorityTest",true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_abgInterfaceTest_btnInterfaceTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_abgInterfaceTest_btnInterfaceTest_OnClick.def
new file mode 100644
index 0000000..d330b41
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_abgInterfaceTest_btnInterfaceTest_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: abgInterfaceTest/btnInterfaceTest
+Response OnClick () id:Response_TIANMA_JITUAN_abgInterfaceTest_btnInterfaceTest_OnClick
+{
+  #keys: '[414702.0.459575742]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "鎺ュ彛娴嬭瘯", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
index 7c1b15d..fbfa4cc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
@@ -15,7 +15,7 @@
     businessType := DataHolderBusinessType.Data().BusinessTypeName();
     DataHolderBusinessType.Data().Commit();
     
-    // PriorityFactor
+     
     PriorityFactor::InitData( MacroPlan,businessType);
     
     this.Close();
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlActions.def
new file mode 100644
index 0000000..d27cc39
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[414382.0.563131222]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[414382.0.563131226]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[414382.0.563131228]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlContent.def
new file mode 100644
index 0000000..38aee9e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlContent.def
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[414382.0.563131220]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component PriorityPolicyStringList
+    {
+      #keys: '[414382.0.563131262]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    Component DataHolderChoosePriorityPolicy
+    {
+      #keys: '[414382.0.563131279]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[PriorityPolicy]*'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def
new file mode 100644
index 0000000..3d2bf8a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Method CalculatePriorityResult (
+  String name
+) id:Method_DialogChoosePriorityPolicy_CalculatePriorityResult
+{
+  #keys: '[414382.0.577602130]'
+  Body:
+  [*
+    PriorityResult::CalculatePriorityResult(name,MacroPlan,GlobalOTDTable);
+    this.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_OpenChoose.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_OpenChoose.def
new file mode 100644
index 0000000..bae85c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_OpenChoose.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method OpenChoose () id:Method_DialogChoosePriorityPolicy_OpenChoose
+{
+  #keys: '[414382.0.563950563]'
+  Body:
+  [*
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..1d6fe8b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[414382.0.563131232]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..4b92eb4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[414382.0.563131231]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      name := PriorityPolicyStringList.Text();
+      dlg := construct( DialogChoosePriorityPolicy );
+      dlg.CalculatePriorityResult(name);
+      dlg.Close();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated.def
new file mode 100644
index 0000000..dd31dea
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/DataHolderChoosePriorityPolicy
+Response OnCreated () id:Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated
+{
+  #keys: '[414382.0.563131469]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      dataList := selectuniquevalues(  MacroPlan,PriorityPolicy,p,p.Name());
+      strings := dataList.Concatenate( ";");
+      PriorityPolicyStringList.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged.def
new file mode 100644
index 0000000..956d116
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/DataHolderChoosePriorityPolicy
+Response OnDataChanged () id:Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged
+{
+  #keys: '[414382.0.563131545]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      dataList := selectuniquevalues(  MacroPlan,PriorityPolicy,p,p.Name());
+      strings := dataList.Concatenate( ";");
+      PriorityPolicyStringList.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/_ROOT_Component_DialogChoosePriorityPolicy.def b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/_ROOT_Component_DialogChoosePriorityPolicy.def
new file mode 100644
index 0000000..11665d9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/_ROOT_Component_DialogChoosePriorityPolicy.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogChoosePriorityPolicy
+{
+  #keys: '[414382.0.563131218]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+    Title: '閫夋嫨浼樺厛绾х瓥鐣�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlActions.def
new file mode 100644
index 0000000..f5b2f80
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlActions.def
@@ -0,0 +1,50 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[414382.0.579140304]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnApply
+    {
+      #keys: '[414382.0.579140306]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Apply'
+        Taborder: 0
+      ]
+    }
+    Component btnOk
+    {
+      #keys: '[414382.0.579140308]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 1
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[414382.0.579140310]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlContent.def
new file mode 100644
index 0000000..410a038
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlContent.def
@@ -0,0 +1,91 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[414382.0.579140302]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component EditBusinessType
+    {
+      #keys: '[414382.0.581576821]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.BusinessType'
+        Label: '浜嬩笟閮�'
+        Taborder: 0
+      ]
+    }
+    Component EditCustomerPolicy
+    {
+      #keys: '[414382.0.581576840]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.CustomerPolicy'
+        Label: '瀹㈡埛绛栫暐'
+        Taborder: 1
+      ]
+    }
+    Component EditOrderType
+    {
+      #keys: '[414382.0.581576842]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.OrderType'
+        Label: '璁㈠崟绫诲瀷'
+        Taborder: 2
+      ]
+    }
+    Component EditProductGrade
+    {
+      #keys: '[414382.0.581576844]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.ProductGrade'
+        Label: '浜у搧绛夌骇'
+        Taborder: 4
+      ]
+    }
+    Component EditSegmentPriority
+    {
+      #keys: '[414382.0.581576846]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.SegmentPriority'
+        Label: '缁嗗垎甯傚満浼樺厛绾�'
+        Taborder: 5
+      ]
+    }
+    Component EditOrderTime
+    {
+      #keys: '[414382.0.581576988]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.OrderTime'
+        Label: '璁㈠崟涓嬪崟鏃堕棿'
+        Taborder: 3
+      ]
+    }
+    Component EditSheetProfitability
+    {
+      #keys: '[414382.0.581577181]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderSelectCustomerOrder.Data.SheetProfitability'
+        Label: '澶у紶鐩堝埄姘村钩'
+        Taborder: 6
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_ClickBynOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_ClickBynOk.def
new file mode 100644
index 0000000..e782835
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_ClickBynOk.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method ClickBynOk () id:Method_DialogEditCustomerOrderPriority_ClickBynOk
+{
+  #keys: '[414382.0.581577357]'
+  Body:
+  [*
+    // Disabled button to prevent the possibility of multiple firing
+    
+    btnOk.Enabled(false,'');
+    
+    // OnOk
+    this.ApplyChanges();
+    DataHolderSelectCustomerOrder.Data().Commit();
+    this.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_EditCustomerOrderPriority.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_EditCustomerOrderPriority.def
new file mode 100644
index 0000000..343d6f0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_EditCustomerOrderPriority.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method EditCustomerOrderPriority (
+  CustomerOrder selection
+) id:Method_DialogEditCustomerOrderPriority_EditCustomerOrderPriority
+{
+  #keys: '[414382.0.581575991]'
+  Body:
+  [*
+    // Edits assumption
+    data := shadow( selection );
+    
+    DataHolderSelectCustomerOrder.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnApply_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnApply_OnClick.def
new file mode 100644
index 0000000..5935b2f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnApply_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnApply
+Response OnClick () id:Response_pnlActions_btnApply_OnClick
+{
+  #keys: '[414382.0.579140312]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  Precondition:
+  [*
+    return Form.HasChanges();
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ApplyChanges();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..0b78789
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[414382.0.579140314]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..a1d53c6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[414382.0.579140313]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ClickBynOk();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/_ROOT_Component_DialogEditCustomerOrderPriority.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/_ROOT_Component_DialogEditCustomerOrderPriority.def
new file mode 100644
index 0000000..ddfdb14
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/_ROOT_Component_DialogEditCustomerOrderPriority.def
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogEditCustomerOrderPriority
+{
+  #keys: '[414382.0.579140300]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderSelectCustomerOrder
+    {
+      #keys: '[414382.0.581575244]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[CustomerOrder]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+    Title: '淇敼璁㈠崟浼樺厛绾у洜瀛愪俊鎭�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
index 984c1f6..452f77b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
@@ -38,6 +38,6 @@
   ]
   Properties:
   [
-    Taborder: 1
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def
new file mode 100644
index 0000000..990eb11
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ButtonExportTest
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportTest_OnClick
+{
+  #keys: '[414384.0.914711825]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MPSync );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      base64 := YuxTest::ExportTest( MPSync );
+      Application.Download( "result.xlsx", base64 );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
index d4df714..9458d5d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
@@ -12,7 +12,7 @@
     [*
       MPSync::TestData( MPSync, MacroPlan );
       GlobalOTDTable.InitTestData();
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
index 8758502..c2687d8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
@@ -19,6 +19,18 @@
         Taborder: 0
       ]
     }
+    Component ButtonExportTest
+    {
+      #keys: '[414384.0.914711826]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭娴嬭瘯'
+        Taborder: 1
+        Visible: false
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
index d6e755a..71754e3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
@@ -17,8 +17,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeChartElement'
           ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
index 53e33ba..c481c62 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
@@ -10,19 +10,19 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeChartElement::TestData( ScenarioManager );
+      CapacityAndSaleBudgeChartElement::TestData( GlobalOTDTable );
       
-      ScenarioManager.CapacityAndSaleBudgeChart( DataHolderMacroPlansForScenarioComparison.Data(), 
-                                                 DropDownSaleOrCapacity.Text(),
-                                                 DropDownTimeGroup.Text(),
-                                                 DropDownByBusinessTypeOrByOrgCode.Text(),
-                                                 DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterYear.Data(),
-                                                 DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
-                                                 MPSync, 
-                                                 GlobalOTDTable, 
-                                                 MacroPlan );
+      GlobalOTDTable.CapacityAndSaleBudgeChart( DataHolderMacroPlansForScenarioComparison.Data(), 
+                                                DropDownSaleOrCapacity.Text(),
+                                                DropDownTimeGroup.Text(),
+                                                DropDownByBusinessTypeOrByOrgCode.Text(),
+                                                DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterYear.Data(),
+                                                DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
+                                                MPSync, 
+                                                GlobalOTDTable, 
+                                                MacroPlan );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
index cbfdc2b..5dd68bd 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
@@ -17,8 +17,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemColumn.CapacityAndSaleBudgeCompareItemCell'
           ]
@@ -44,8 +44,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemRow'
           ]
@@ -70,8 +70,8 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'ScenarioManager'
-            Source: 'ScenarioManager'
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
             Taborder: 0
             Transformation: 'CapacityAndSaleBudgeCompareItemColumn'
           ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
index 50ded64..6d37df2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
@@ -14,13 +14,13 @@
       info( DataHolderCapacityAndSaleBudgeFilterItem.Data().Size() );
       info( DataHolderCapacityAndSaleBudgeFilterYear.Data().Size() );
       info( DataHolderCapacityAndSaleBudgeFilterMonth.Data().Size() );
-      ScenarioManager.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
-                                                   DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
-                                                   MPSync, 
-                                                   GlobalOTDTable,
-                                                   MacroPlan );
+      GlobalOTDTable.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
+                                                  DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
+                                                  MPSync, 
+                                                  GlobalOTDTable,
+                                                  MacroPlan );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
index 97cea9d..a01173d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      tableBinaryData := ScenarioManager.CapacityAndSaleBudgeCompareExport().AsBinaryData();
+      tableBinaryData := GlobalOTDTable.CapacityAndSaleBudgeCompareExport().AsBinaryData();
       Application.Download( "骞村害浜ч攢棰勭畻瀵规瘮.xlsx", tableBinaryData );
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
index 712bf75..cbe6b9e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'MPSync'
-        Source: 'MPSync'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterBusinessType'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
index 682a492..0437f14 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
index 84bcffe..ea63655 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterItem'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
index c5f4133..a9ccb24 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterItem::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterItem::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
index 13a9e02..577ebb4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterMonth'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
index 46cc025..d922a4a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterMonth::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterMonth::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
index 0d881d5..ae0a48a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'MPSync'
-        Source: 'MPSync'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterPlaceOfProductionOfArray'
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
index bda9b55..8b48eac 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnC\043663.def"
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      MPSync.RefreshCapacityAndSaleBudgeFilter();
+      MPSync.RefreshCapacityAndSaleBudgeFilter( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
index f51357d..c89499c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'ScenarioManager'
-        Source: 'ScenarioManager'
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'CapacityAndSaleBudgeFilterYear'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
index 6c61e95..19ea091 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def
@@ -10,7 +10,7 @@
   {
     Body:
     [*
-      CapacityAndSaleBudgeFilterYear::Initial( ScenarioManager );
+      CapacityAndSaleBudgeFilterYear::Initial( GlobalOTDTable );
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
index 352a599..54be6e2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
@@ -5,6 +5,10 @@
   [
     Component DataSetLevelSalesDemands #extension
     {
+      Children:
+      [
+        #child: listContextMenuSD
+      ]
       Properties:
       [
         Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"Customer name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerID","title":"Customer ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"Order ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderLineID","title":"Order line ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderLineID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Order date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue( object.Quantity() - object.FulfilledQuantity(), 0.0).Round( 2)"}},{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfilled demand","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round( 2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsFirmed","title":"Is firmed","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsFirmed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsEligibleForNetting","title":"Is eligible for netting","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsEligibleForNetting"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderTag","title":"璁㈠崟鏍囩","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderTag"}}]'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_listContextMenuSD.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_listContextMenuSD.def
new file mode 100644
index 0000000..4d52db8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_listContextMenuSD.def
@@ -0,0 +1,27 @@
+Quintiq file version 2.0
+Component listContextMenuSD #extension
+{
+  Children:
+  [
+    Component MenuPriorityResult
+    {
+      #keys: '[414382.0.562012014]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Taborder: 10
+        Title: '浜嬩笟閮ㄤ紭鍏堢骇璁$畻'
+      ]
+    }
+    Component MenuEditCustomerOrderPriority
+    {
+      #keys: '[414382.0.581575364]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Taborder: 11
+        Title: '淇敼瀹㈡埛璁㈠崟浼樺厛绾у洜瀛愪俊鎭�'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuEditCustomerOrderPriority_OnClic.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuEditCustomerOrderPriority_OnClic.def
new file mode 100644
index 0000000..db0367b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuEditCustomerOrderPriority_OnClic.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick (
+  SalesDemandBase selection
+) id:Response_ListSalesDemands_MenuEditCustomerOrderPriority_OnClick
+{
+  #keys: '[414382.0.581575400]'
+  CanBindMultiple: false
+  DefinitionID => //FormSalesDemands/ListSalesDemands/Responsedef_ListSalesDemands_WebMenu_OnClick
+  Initiator: 'MenuEditCustomerOrderPriority'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogEditCustomerOrderPriority );
+      data := selection.astype( CustomerOrder );
+      dlg.EditCustomerOrderPriority( data);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuPriorityResult_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuPriorityResult_OnClick.def
new file mode 100644
index 0000000..c4f3379
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuPriorityResult_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () id:Response_ListSalesDemands_MenuPriorityResult_OnClick
+{
+  #keys: '[414382.0.563130924]'
+  CanBindMultiple: false
+  DefinitionID => //FormSalesDemands/ListSalesDemands/Responsedef_ListSalesDemands_WebMenu_OnClick
+  Initiator: 'MenuPriorityResult'
+  QuillAction
+  {
+    Body:
+    [*
+      
+      dlg := construct( DialogChoosePriorityPolicy );
+      dlg.OpenChoose();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def
index 5ea0d0a..8f81976 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def
@@ -36,7 +36,7 @@
   ]
   Properties:
   [
-    Taborder: 0
+    Taborder: 1
   ]
   ResponseDefinitions:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_PanelButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_PanelButton.def
new file mode 100644
index 0000000..912c452
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_PanelButton.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelButton
+{
+  #keys: '[414702.0.454190771]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonTransform
+    {
+      #keys: '[414702.0.454190800]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BARRIER_CLOSED'
+        Label: '杞崲'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def
index 01848c5..cdcd03d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def
@@ -11,20 +11,43 @@
       BaseType: 'WebMenu'
       Properties:
       [
-        Image: 'ADD2'
+        Image: 'JERRYCAN'
         Taborder: 3
-        Title: 'Filling'
+        Title: '濉骇'
       ]
     }
-    Component MenuTest
+    Component MenuRefresh
     {
       #keys: '[414382.0.415603149]'
       BaseType: 'WebMenu'
       Properties:
       [
-        Image: 'ADD2'
+        Image: 'EDITOR_HAS_DECLARATIVE_DEFINITION'
         Taborder: 4
-        Title: 'Test'
+        Title: '鍒涘缓娴嬭瘯鏁版嵁'
+      ]
+    }
+    Component MenuDelete
+    {
+      #keys: '[414702.0.472081906]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 5
+        Title: '鍒犻櫎'
+      ]
+    }
+    Component MenuSelectAll
+    {
+      #keys: '[414702.0.472012591]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DOCUMENT_SELECTION'
+        Shortcut: 'Ctrl+A'
+        Taborder: 6
+        Title: '鍏ㄩ��'
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick.def
new file mode 100644
index 0000000..8bd8ba9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListCustomerAndFillingCapacityOrder
+Response OnClick (
+  CustomerAndForecastOrder selection
+) id:Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick
+{
+  #keys: '[414702.0.472032713]'
+  DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
+  Initiator: 'MenuDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def
similarity index 70%
rename from _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def
index f292299..aba413a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def
@@ -1,17 +1,17 @@
 Quintiq file version 2.0
 #parent: ListCustomerAndFillingCapacityOrder
-Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick
+Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick
 {
   #keys: '[414382.0.415724061]'
   CanBindMultiple: false
   DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
-  GroupServerCalls: true
-  Initiator: 'MenuTest'
+  Initiator: 'MenuRefresh'
   QuillAction
   {
     Body:
     [*
-      CustomerAndForecastOrder::CreateTestData( MacroPlan);
+      CustomerAndForecastOrder::RefreshData(  MacroPlan,GlobalOTDTable);
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def
similarity index 66%
copy from _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
copy to _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def
index f292299..95443c6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def
@@ -1,17 +1,17 @@
 Quintiq file version 2.0
 #parent: ListCustomerAndFillingCapacityOrder
-Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick
+Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick
 {
-  #keys: '[414382.0.415724061]'
+  #keys: '[414702.0.474548365]'
   CanBindMultiple: false
   DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
-  GroupServerCalls: true
-  Initiator: 'MenuTest'
+  Initiator: 'MenuSelectAll'
   QuillAction
   {
     Body:
     [*
-      CustomerAndForecastOrder::CreateTestData( MacroPlan);
+      this.SelectAll();
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_PanelButton_ButtonTransform_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_PanelButton_ButtonTransform_OnClick.def
new file mode 100644
index 0000000..30c3208
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_PanelButton_ButtonTransform_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelButton/ButtonTransform
+Response OnClick () id:Response_PanelButton_ButtonTransform_OnClick
+{
+  #keys: '[414702.0.454181189]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      CustomerAndForecastOrder::CreateData( MacroPlan );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def
index a456ad1..6c6d614 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def
@@ -8,6 +8,7 @@
   Children:
   [
     #child: ListCustomerAndFillingCapacityOrder
+    #child: PanelButton
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_ListInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_ListInterfaceTest.def
new file mode 100644
index 0000000..882b6d4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_ListInterfaceTest.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component ListInterfaceTest
+{
+  #keys: '[414702.0.459846558]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorInterfaceTest
+    {
+      #keys: '[414702.0.459846559]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
+        Taborder: 0
+        Transformation: 'Global_BrokerExecuteLog'
+      ]
+    }
+    #child: listActionBarPageInterfaceTest
+    Component DataSetLevelInterfaceTest
+    {
+      #keys: '[414702.0.459846564]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuInterfaceTest
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BrokerName","title":"BrokerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BrokerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ElementTotal","title":"ElementTotal","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ElementTotal"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorDateTime","title":"ErrorDateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorDateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorMessage","title":"ErrorMessage","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorMessage"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorNo","title":"ErrorNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsSuccess","title":"IsSuccess","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsSuccess"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Name","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SuccessDateTime","title":"SuccessDateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SuccessDateTime"}}]'
+        ContextMenu: 'listContextMenuInterfaceTest'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListInterfaceTest_WebMenu_OnClick
+    {
+      #keys: '[414702.0.488307130]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[1041.0.20211517]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOptions.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOptions.def
new file mode 100644
index 0000000..4fe176c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOptions.def
@@ -0,0 +1,62 @@
+Quintiq file version 2.0
+Component PanelInterfaceOptions
+{
+  #keys: '[414702.0.459752107]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component CheckboxCustomOrder
+    {
+      #keys: '[414702.0.459786494]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'CustomOrder'
+        Taborder: 0
+      ]
+    }
+    Component CheckboxForecast
+    {
+      #keys: '[414702.0.459501981]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Forecast'
+        Taborder: 1
+      ]
+    }
+    Component DropDownListBusinessType
+    {
+      #keys: '[414702.0.465923773]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'BusinessType'
+      Children:
+      [
+        Component DataExtractorInterfaceOptions
+        {
+          #keys: '[414702.0.465923775]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'BusinessType'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'BusinessTypeName'
+        Label: '浜嬩笟閮�'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest.def
new file mode 100644
index 0000000..90f59dd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component PanelInterfaceTest
+{
+  #keys: '[414702.0.459815967]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonPullInterfaceDataToIntermediateTable
+    {
+      #keys: '[414702.0.457042579]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'WINE'
+        Label: '鎷夊彇鎺ュ彛鏁版嵁鍒颁腑闂磋〃'
+        Taborder: 0
+      ]
+    }
+    Component ButtonSynchronizeDataToMacroPlan
+    {
+      #keys: '[414702.0.461471389]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COFFEE_MACHINE'
+        Label: '鍚屾鏁版嵁鍒癕acroPlan'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest981.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest981.def
new file mode 100644
index 0000000..b8b4a3f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceTest981.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelInterfaceTest981
+{
+  #keys: '[414702.0.459917264]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListInterfaceTest
+  ]
+  Properties:
+  [
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listActionBarPageInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listActionBarPageInterfaceTest.def
new file mode 100644
index 0000000..fc5877b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listActionBarPageInterfaceTest.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageInterfaceTest
+{
+  #keys: '[414702.0.459846561]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def
new file mode 100644
index 0000000..8cbab4b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component listContextMenuInterfaceTest
+{
+  #keys: '[414702.0.459846566]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuCreateShowData
+    {
+      #keys: '[414702.0.488246034]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'VIEW'
+        Taborder: 3
+        Title: '鏄剧ず鏁版嵁'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def
new file mode 100644
index 0000000..052d40d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: ListInterfaceTest
+Response OnClick (
+  Global_BrokerExecuteLog selection
+) id:Response_ListInterfaceTest_MenuCreateShowData_OnClick
+{
+  #keys: '[414702.0.488307153]'
+  CanBindMultiple: false
+  DefinitionID => /ListInterfaceTest/Responsedef_ListInterfaceTest_WebMenu_OnClick
+  Initiator: 'MenuCreateShowData'
+  QuillAction
+  {
+    Body:
+    [*
+      GlobalOTDTable.Global_ShowRow( relflush );
+      GlobalOTDTable.Global_ShowColumn( relflush );
+      GlobalOTDTable.Global_ShowCell( relflush );
+      
+      Global_ShowCell::ShowData( GlobalOTDTable, selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def
new file mode 100644
index 0000000..7ec600a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: PanelInterfaceTest/ButtonPullInterfaceDataToIntermediateTable
+Response OnClick () id:Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnClick
+{
+  #keys: '[414702.0.459947783]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      GlobalOTDTable.SynchronizationAllMappingBrokerAndAPIByOption( CheckboxCustomOrder.Checked(),
+                                                                    CheckboxForecast.Checked() );
+      
+      WebMessageBox::Success( "鎷夊彇鎴愬姛锛�", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def
new file mode 100644
index 0000000..c2eb216
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: PanelInterfaceTest/ButtonSynchronizeDataToMacroPlan
+Response OnClick () id:Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick
+{
+  #keys: '[414702.0.465857875]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable ) and not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      businessTypes := construct( Strings );
+      businessTypes.Add( DropDownListBusinessType.Data().BusinessTypeName() );
+      GlobalOTDTable.SynchronizeDataToMacroPlan( MacroPlan, 
+                                                 businessTypes,
+                                                 CheckboxCustomOrder.Checked(),
+                                                 CheckboxForecast.Checked()
+                                                );
+      
+      WebMessageBox::Success( "鍚屾鎴愬姛锛�", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
new file mode 100644
index 0000000..05dd2d6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormInterfaceTest
+{
+  #keys: '[414702.0.459670964]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelInterfaceOptions
+    #child: PanelInterfaceTest
+    #child: PanelInterfaceTest981
+  ]
+  Properties:
+  [
+    Image: 'BACON'
+    Title: '鎺ュ彛娴嬭瘯'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/Component_PanelKpiMatrixButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/Component_PanelKpiMatrixButton.def
deleted file mode 100644
index 54d1eea..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/Component_PanelKpiMatrixButton.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component PanelKpiMatrixButton #extension
-{
-  Children:
-  [
-    Component ButtonKpiMatrixRefresh #extension
-    {
-    }
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/_ROOT_Component_FormKpiMatrix.def b/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/_ROOT_Component_FormKpiMatrix.def
deleted file mode 100644
index fe53993..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormKpiMatrix/_ROOT_Component_FormKpiMatrix.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-#root
-#parent: KpiTrackerWeb
-OrphanComponent FormKpiMatrix #extension
-{
-  Children:
-  [
-    #child: PanelKpiMatrixButton
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def
index 97bd89b..0ba2149 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def
@@ -9,8 +9,12 @@
   {
     Body:
     [*
-      businessTypeList := selectset( GlobalOTDTable,BusinessType,b,true);
-      this.Data(&businessTypeList);
+      //businessTypeList := selectset( GlobalOTDTable,BusinessType,b,true);
+      //this.Data(&businessTypeList);
+      
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.BusinessTypeName()).Concatenate( ";" );
+      DropDownStringListBusinessType.Strings(strings);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def
index f02625b..c492ed8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def
@@ -9,9 +9,12 @@
   {
     Body:
     [*
-      businessTypeList := selectset( GlobalOTDTable,BusinessType,b,true);
-      this.Data(&businessTypeList);
-      strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
+      //businessTypeList := selectset( GlobalOTDTable,BusinessType,b,true);
+      //this.Data(&businessTypeList);
+      //strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
+      //DropDownStringListBusinessType.Strings(strings);
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.BusinessTypeName()).Concatenate( ";" );
       DropDownStringListBusinessType.Strings(strings);
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def
index 639dcea..70938b2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def
@@ -9,8 +9,8 @@
   {
     Body:
     [*
-      strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
-      this.Strings(strings);
+      //strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
+      //this.Strings(strings);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def
index fa7ba3e..b3df733 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def
@@ -43,6 +43,21 @@
       #keys: '[414382.0.539205233]'
       BaseType: 'WebDataHolder'
       Databinding: 'structured[BusinessType]*'
+      Children:
+      [
+        Component DataExtractorPriorityFactorBusinessType
+        {
+          #keys: '[414382.0.584060499]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'BusinessType'
+          ]
+        }
+      ]
       Properties:
       [
         Taborder: 4
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
index 014ed5d..571a83c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
@@ -31,7 +31,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: '*'
+        Label: '-'
         Taborder: 3
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnCreated.def
new file mode 100644
index 0000000..09cb86c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityPolicyBusinessType
+Response OnCreated () id:Response_FormPriorityPolicy_DataHolderPriorityPolicyBusinessType_OnCreated
+{
+  #keys: '[414382.0.585796031]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.BusinessTypeName()).Concatenate( ";" );
+      PriorityPolicyBusinessType.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnDataChanged.def
new file mode 100644
index 0000000..3aa1c62
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnDataChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityPolicyBusinessType
+Response OnDataChanged () id:Response_FormPriorityPolicy_DataHolderPriorityPolicyBusinessType_OnDataChanged
+{
+  #keys: '[414382.0.585796110]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.BusinessTypeName()).Concatenate( ";" );
+      PriorityPolicyBusinessType.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnCreated.def
new file mode 100644
index 0000000..2ec5ac7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityPolicyFactor
+Response OnCreated () id:Response_FormPriorityPolicy_DataHolderPriorityPolicyFactor_OnCreated
+{
+  #keys: '[414382.0.586001511]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.Name()).Concatenate( ";" );
+      DropDownStringList.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnDataChanged.def
new file mode 100644
index 0000000..93d0f9c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnDataChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityPolicyFactor
+Response OnDataChanged () id:Response_FormPriorityPolicy_DataHolderPriorityPolicyFactor_OnDataChanged
+{
+  #keys: '[414382.0.585931640]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      list := this.Data();
+      strings := selectuniquevalues( list,Elements,e,e.Name()).Concatenate( ";" );
+      DropDownStringList.Strings(strings);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def
index 7cbbd08..992b235 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def
@@ -9,8 +9,8 @@
   {
     Body:
     [*
-      strs := PriorityFactor::GetNameList( MacroPlan,DropDownStringList.Text());
-      this.Strings(strs);
+      //strs := PriorityFactor::GetNameList( MacroPlan,DropDownStringList.Text());
+      //this.Strings(strs);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def
index 6ed7e84..7acc7f0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def
@@ -9,8 +9,8 @@
   {
     Body:
     [*
-      list := PriorityPolicy::GetDataByBusinessType( MacroPlan, PriorityPolicyBusinessType.Text());
-      DataHolderPriorityPolicy.Data(&list);
+      //list := PriorityPolicy::GetDataByBusinessType( MacroPlan, PriorityPolicyBusinessType.Text());
+      //DataHolderPriorityPolicy.Data(&list);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def
index cd5d437..72153cd 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def
@@ -39,6 +39,56 @@
         Taborder: 4
       ]
     }
+    Component DataHolderPriorityPolicyBusinessType
+    {
+      #keys: '[414382.0.585736261]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[BusinessType]*'
+      Children:
+      [
+        Component DataExtractorPriorityPolicyBusinessType
+        {
+          #keys: '[414382.0.585207663]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'BusinessType'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 5
+      ]
+    }
+    Component DataHolderPriorityPolicyFactor
+    {
+      #keys: '[414382.0.585208237]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[PriorityFactor]*'
+      Children:
+      [
+        Component DataExtractorPriorityPolicyFactor
+        {
+          #keys: '[414382.0.585705356]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'PriorityFactor'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 6
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_MatrixEditorShowInterfaceData.def b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_MatrixEditorShowInterfaceData.def
new file mode 100644
index 0000000..f73b35a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_MatrixEditorShowInterfaceData.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditorShowInterfaceData
+{
+  #keys: '[414702.0.491402111]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellShowInterfaceData
+    {
+      #keys: '[414702.0.491402112]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorShowInterfaceData
+        {
+          #keys: '[414702.0.491402113]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'Global_ShowCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Value'
+        Column: 'Global_ShowColumn'
+        Row: 'Global_ShowRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsShowInterfaceData
+    {
+      #keys: '[414702.0.491402116]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor703
+        {
+          #keys: '[414702.0.491402117]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'Global_ShowRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'RowNr'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsShowInterfaceData
+    {
+      #keys: '[414702.0.491402120]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor253
+        {
+          #keys: '[414702.0.491402121]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'Global_ShowColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'ColumnName'
+        SortCriteria: 'ColumnIndex'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageShowInterfaceData
+    #child: matrixeditorContextMenuShowInterfaceData
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumnsShowInterfaceData'
+    ContextMenu: 'matrixeditorContextMenuShowInterfaceData'
+    Rows: 'MatrixEditorRowsShowInterfaceData'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixEditorActionBarPageShowInterfaceData.def b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixEditorActionBarPageShowInterfaceData.def
new file mode 100644
index 0000000..92920fe
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixEditorActionBarPageShowInterfaceData.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageShowInterfaceData
+{
+  #keys: '[414702.0.491402124]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixeditorContextMenuShowInterfaceData.def b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixeditorContextMenuShowInterfaceData.def
new file mode 100644
index 0000000..d8c917e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixeditorContextMenuShowInterfaceData.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuShowInterfaceData
+{
+  #keys: '[414702.0.491402127]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/_ROOT_Component_FormShowInterfaceData.def b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/_ROOT_Component_FormShowInterfaceData.def
new file mode 100644
index 0000000..82115f2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/_ROOT_Component_FormShowInterfaceData.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormShowInterfaceData
+{
+  #keys: '[414702.0.484442828]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: MatrixEditorShowInterfaceData
+  ]
+  Properties:
+  [
+    Image: 'PROJECTOR'
+    Title: '鎺ュ彛鏁版嵁鏄剧ず'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/Component_pnlContent.def
deleted file mode 100644
index 2c4828b..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/Component_pnlContent.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component pnlContent #extension
-{
-  Children:
-  [
-    Component LabelCurrentStep #extension
-    {
-    }
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/_ROOT_Component_SWF_DialogCeateNextStepDefinitionDependency.def b/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/_ROOT_Component_SWF_DialogCeateNextStepDefinitionDependency.def
deleted file mode 100644
index 78fcf7f..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_SWF_DialogCeateNextStepDefinitionDependency/_ROOT_Component_SWF_DialogCeateNextStepDefinitionDependency.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-#root
-#parent: SOPWorkflowWeb
-OrphanComponent SWF_DialogCeateNextStepDefinitionDependency #extension
-{
-  Children:
-  [
-    #child: pnlContent
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/PriorityTest.vw b/_Main/UI/MacroPlannerWebApp/Views/PriorityTest.vw
new file mode 100644
index 0000000..68006ad
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/PriorityTest.vw
@@ -0,0 +1,2745 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormBusinessType
+      {
+        title: 'QTIANMA_JITUAN::FormBusinessType'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormBusinessType'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 11
+          columnPosition: 9
+          columnSpan: 4
+        }
+        components
+        {
+          FormBusinessType_ListBusinessType
+          {
+          }
+          FormBusinessType_DataSetLevelBusinessType
+          {
+            groupDepth: -1
+            column_BusinessTypeName
+            {
+              columnId: 'BusinessTypeName'
+              dataPath: 'BusinessTypeName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityResult
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityResult'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityResult'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 13
+          rowSpan: 11
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormPriorityResult_PanelPriorityResult
+          {
+            sizeRatio: 1
+          }
+          FormPriorityResult_ListPriorityResult
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResult
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityResult_PanelPriorityResultDetails
+          {
+            sizeRatio: 1
+          }
+          FormPriorityResult_ListPriorityResultBusinessTypeDetails
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResultDetails
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityPolicyName
+            {
+              columnId: 'PriorityPolicyName'
+              dataPath: 'PriorityPolicyName'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorName
+            {
+              columnId: 'PriorityFactorName'
+              dataPath: 'PriorityFactorName'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorGradingName
+            {
+              columnId: 'PriorityFactorGradingName'
+              dataPath: 'PriorityFactorGradingName'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityTotalScore
+            {
+              columnId: 'PriorityTotalScore'
+              dataPath: 'PriorityTotalScore'
+              dataType: 'real'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityResult_ListPriorityResultGroupDetails
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResultDetails872
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityPolicyName
+            {
+              columnId: 'PriorityPolicyName'
+              dataPath: 'PriorityPolicyName'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorName
+            {
+              columnId: 'PriorityFactorName'
+              dataPath: 'PriorityFactorName'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorGradingName
+            {
+              columnId: 'PriorityFactorGradingName'
+              dataPath: 'PriorityFactorGradingName'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityTotalScore
+            {
+              columnId: 'PriorityTotalScore'
+              dataPath: 'PriorityTotalScore'
+              dataType: 'real'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityFactor
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityFactor'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityFactor'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 12
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormPriorityFactor_ListPriorityFactor
+          {
+          }
+          FormPriorityFactor_DataSetLevelPriorityFactor
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Coefficient
+            {
+              columnId: 'Coefficient'
+              dataPath: 'Coefficient'
+              dataType: 'real'
+              index: 1
+              subtotals: ''
+              width: 496
+            }
+            column_Desc
+            {
+              columnId: 'Desc'
+              dataPath: 'Desc'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityFactorGrading
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityFactorGrading'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityFactorGrading'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 11
+          columnPosition: 5
+          columnSpan: 4
+        }
+        components
+        {
+          FormPriorityFactorGrading_ListPriorityFactorGrading
+          {
+          }
+          FormPriorityFactorGrading_DataSetLevelPriorityFactorGrading
+          {
+            groupDepth: -1
+            column_GradingName
+            {
+              columnId: 'GradingName'
+              dataPath: 'GradingName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_GradeValueStr
+            {
+              columnId: 'GradeValueStr'
+              dataPath: 'GradeValueStr'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_GradeDesc
+            {
+              columnId: 'GradeDesc'
+              dataPath: 'GradeDesc'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityPolicy
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityPolicy'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityPolicy'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 12
+          rowSpan: 14
+          columnPosition: 5
+          columnSpan: 7
+        }
+        components
+        {
+          FormPriorityPolicy_ListPriorityPolicy
+          {
+          }
+          FormPriorityPolicy_DataSetLevelPriorityPolicy
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Formula
+            {
+              columnId: 'Formula'
+              dataPath: 'Formula'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 433
+            }
+            column_CalculateValue
+            {
+              columnId: 'CalculateValue'
+              dataPath: 'CalculateValue'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 644
+            }
+            column_Desc
+            {
+              columnId: 'Desc'
+              dataPath: 'Desc'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityPolicy_PanelPriorityPolicyOperation
+          {
+            sizeRatio: 1
+          }
+          FormPriorityPolicy_PanelPriorityPolicyOperationButton
+          {
+            sizeRatio: 1
+          }
+          FormPriorityPolicy_PanelPriorityPolicyCoefficient
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+      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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_1
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 2
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_1
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 3
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_2
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 4
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_2
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 5
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_3
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 6
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_3
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 7
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_4
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 8
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_4
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 9
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_5
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 10
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_5
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 11
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_6
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 12
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_6
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 13
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_7
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 14
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_7
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 15
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormSanityCheck
+      {
+        title: 'Sanity Check'
+        shown: false
+        componentID: 'FormSanityCheck'
+        layout
+        {
+          mode: 'dockright'
+          index: 16
+        }
+        components
+        {
+          FormSanityCheck_PanelSanityCheckToolbar
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckContent
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckGroup
+          {
+            sizeRatio: 4
+          }
+          FormSanityCheck_ListSanityCheckGroup
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckGroup
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,DESC:SanityCheckHighestCategory,DESC:_Expr3'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Group
+            {
+              columnId: 'Group'
+              dataPath: 'Group'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 270
+            }
+            column__Expr3
+            {
+              columnId: '_Expr3'
+              dataPath: '_Expr3'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 95
+            }
+          }
+          FormSanityCheck_PanelSanityCheckMessage
+          {
+            sizeRatio: 5
+          }
+          FormSanityCheck_ListSanityCheckMessage
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckMessage
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,SanityCheckGroup.Type,SanityCheckGroup.Group,Description'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Messages
+            {
+              columnId: 'Messages'
+              dataPath: 'Messages'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 32
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 585
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_8
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 17
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_8
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 18
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_9
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 19
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_9
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 20
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_10
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 21
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_10
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 22
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_11
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 23
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_11
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 24
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_12
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 25
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_12
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 26
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_13
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 27
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_13
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 28
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_14
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 29
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_14
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 30
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles_15
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 31
+        }
+        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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: '鎻忚堪'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI_15
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 32
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          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: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormSanityCheck_1
+      {
+        title: 'Sanity Check'
+        shown: false
+        componentID: 'FormSanityCheck'
+        layout
+        {
+          mode: 'dockright'
+          index: 33
+        }
+        components
+        {
+          FormSanityCheck_PanelSanityCheckToolbar
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckContent
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckGroup
+          {
+            sizeRatio: 4
+          }
+          FormSanityCheck_ListSanityCheckGroup
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckGroup
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,DESC:SanityCheckHighestCategory,DESC:_Expr3'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Group
+            {
+              columnId: 'Group'
+              dataPath: 'Group'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 270
+            }
+            column__Expr3
+            {
+              columnId: '_Expr3'
+              dataPath: '_Expr3'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 95
+            }
+          }
+          FormSanityCheck_PanelSanityCheckMessage
+          {
+            sizeRatio: 5
+          }
+          FormSanityCheck_ListSanityCheckMessage
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckMessage
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,SanityCheckGroup.Type,SanityCheckGroup.Group,Description'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 32
+            }
+            column_Messages
+            {
+              columnId: 'Messages'
+              dataPath: 'Messages'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 32
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 585
+            }
+          }
+        }
+      }
+      form_FormKPI_16
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 34
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Metals_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+              Food_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+              Empty_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 0
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormKPI_17
+      {
+        title: 'KPI Dashboard'
+        shown: false
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 35
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPIDashboard'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Metals_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+              Food_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+              Empty_KPISetting: 'Fulfillment;Fulfillment target;On time fulfillment;On time in full;Sales'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 0
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+      form_FormPriorities
+      {
+        title: 'Priorities'
+        shown: true
+        componentID: 'FormPriorities'
+        layout
+        {
+          mode: 'dockright'
+          index: 36
+        }
+        components
+        {
+          FormPriorities_ListPriority
+          {
+          }
+          FormPriorities_DataSetLevelPriority
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_ImgHasSalesDemand
+            {
+              columnId: 'ImgHasSalesDemand'
+              dataPath: 'ImgHasSalesDemand'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 30
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 95
+            }
+            column_Weight
+            {
+              columnId: 'Weight'
+              dataPath: 'Weight'
+              dataType: 'real'
+              index: 3
+              subtotals: ''
+              width: 95
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 15
+    image: ''
+    description: ''
+  }
+  formatversion: 2
+  id: 'PriorityTest'
+  name: 'PriorityTest'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Test.vw b/_Main/UI/MacroPlannerWebApp/Views/Test.vw
index c66c058..36dff5d 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Test.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Test.vw
@@ -159,6 +159,800 @@
           }
         }
       }
+      form_FormCustomerAndForecastOrder
+      {
+        title: 'QTIANMA_JITUAN::FormCustomerAndForecastOrder'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCustomerAndForecastOrder'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 16
+          rowSpan: 16
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormCustomerAndForecastOrder_PanelButton
+          {
+            sizeRatio: 1
+          }
+          FormCustomerAndForecastOrder_ListCustomerAndFillingCapacityOrder
+          {
+          }
+          FormCustomerAndForecastOrder_DataSetLevelCustomerAndFillingCapacityOrder
+          {
+            groupDepth: -1
+            column_VerNo
+            {
+              columnId: 'VerNo'
+              dataPath: 'VerNo'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_OrderID
+            {
+              columnId: 'OrderID'
+              dataPath: 'OrderID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_ServiceType
+            {
+              columnId: 'ServiceType'
+              dataPath: 'ServiceType'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PanelBigSheetQuantity
+            {
+              columnId: 'PanelBigSheetQuantity'
+              dataPath: 'PanelBigSheetQuantity'
+              dataType: 'real'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_SalesAmount
+            {
+              columnId: 'SalesAmount'
+              dataPath: 'SalesAmount'
+              dataType: 'number'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_ForecastDemandDate
+            {
+              columnId: 'ForecastDemandDate'
+              dataPath: 'ForecastDemandDate'
+              dataType: 'date'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormFillingCapacityOrder
+      {
+        title: 'QTIANMA_JITUAN::FormFillingCapacityOrder'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormFillingCapacityOrder'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 16
+          rowSpan: 16
+          columnPosition: 5
+          columnSpan: 8
+        }
+        components
+        {
+          FormFillingCapacityOrder_ListFillingCapacityOrder
+          {
+          }
+          FormFillingCapacityOrder_DataSetLevelFillingCapacityOrder
+          {
+            groupDepth: -1
+            column_VerNo
+            {
+              columnId: 'VerNo'
+              dataPath: 'VerNo'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PanelBigSheetQuantity
+            {
+              columnId: 'PanelBigSheetQuantity'
+              dataPath: 'PanelBigSheetQuantity'
+              dataType: 'real'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_SalesAmount
+            {
+              columnId: 'SalesAmount'
+              dataPath: 'SalesAmount'
+              dataType: 'number'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_ForecastDemandDate
+            {
+              columnId: 'ForecastDemandDate'
+              dataPath: 'ForecastDemandDate'
+              dataType: 'date'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_OrderType
+            {
+              columnId: 'OrderType'
+              dataPath: 'OrderType'
+              dataType: 'string'
+              index: 12
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityPolicy
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityPolicy'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityPolicy'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 32
+          rowSpan: 13
+          columnPosition: 5
+          columnSpan: 8
+        }
+        components
+        {
+          FormPriorityPolicy_ListPriorityPolicy
+          {
+          }
+          FormPriorityPolicy_DataSetLevelPriorityPolicy
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Formula
+            {
+              columnId: 'Formula'
+              dataPath: 'Formula'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_CalculateValue
+            {
+              columnId: 'CalculateValue'
+              dataPath: 'CalculateValue'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_Desc
+            {
+              columnId: 'Desc'
+              dataPath: 'Desc'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityPolicy_PanelPriorityPolicyOperation
+          {
+            sizeRatio: 1
+          }
+          FormPriorityPolicy_PanelPriorityPolicyOperationButton
+          {
+            sizeRatio: 1
+          }
+          FormPriorityPolicy_PanelPriorityPolicyCoefficient
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+      form_FormPriorityResult
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityResult'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityResult'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 45
+          rowSpan: 17
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormPriorityResult_PanelPriorityResult
+          {
+            sizeRatio: 1
+          }
+          FormPriorityResult_ListPriorityResult
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResult
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityResult_PanelPriorityResultDetails
+          {
+            sizeRatio: 1
+          }
+          FormPriorityResult_ListPriorityResultBusinessTypeDetails
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResultDetails
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityPolicyName
+            {
+              columnId: 'PriorityPolicyName'
+              dataPath: 'PriorityPolicyName'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorName
+            {
+              columnId: 'PriorityFactorName'
+              dataPath: 'PriorityFactorName'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorGradingName
+            {
+              columnId: 'PriorityFactorGradingName'
+              dataPath: 'PriorityFactorGradingName'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityTotalScore
+            {
+              columnId: 'PriorityTotalScore'
+              dataPath: 'PriorityTotalScore'
+              dataType: 'real'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormPriorityResult_ListPriorityResultGroupDetails
+          {
+          }
+          FormPriorityResult_DataSetLevelPriorityResultDetails872
+          {
+            groupDepth: -1
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Customer
+            {
+              columnId: 'Customer'
+              dataPath: 'Customer'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Quantity
+            {
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_DemandDate
+            {
+              columnId: 'DemandDate'
+              dataPath: 'DemandDate'
+              dataType: 'date'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityResultScore
+            {
+              columnId: 'PriorityResultScore'
+              dataPath: 'PriorityResultScore'
+              dataType: 'real'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityPolicyName
+            {
+              columnId: 'PriorityPolicyName'
+              dataPath: 'PriorityPolicyName'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorName
+            {
+              columnId: 'PriorityFactorName'
+              dataPath: 'PriorityFactorName'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityFactorGradingName
+            {
+              columnId: 'PriorityFactorGradingName'
+              dataPath: 'PriorityFactorGradingName'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_PriorityTotalScore
+            {
+              columnId: 'PriorityTotalScore'
+              dataPath: 'PriorityTotalScore'
+              dataType: 'real'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityFactor
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityFactor'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityFactor'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 37
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormPriorityFactor_ListPriorityFactor
+          {
+          }
+          FormPriorityFactor_DataSetLevelPriorityFactor
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Coefficient
+            {
+              columnId: 'Coefficient'
+              dataPath: 'Coefficient'
+              dataType: 'real'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Desc
+            {
+              columnId: 'Desc'
+              dataPath: 'Desc'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormPriorityFactorGrading
+      {
+        title: 'QTIANMA_JITUAN::FormPriorityFactorGrading'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormPriorityFactorGrading'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 32
+          rowSpan: 5
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormPriorityFactorGrading_ListPriorityFactorGrading
+          {
+          }
+          FormPriorityFactorGrading_DataSetLevelPriorityFactorGrading
+          {
+            groupDepth: -1
+            column_GradingName
+            {
+              columnId: 'GradingName'
+              dataPath: 'GradingName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_GradeValueStr
+            {
+              columnId: 'GradeValueStr'
+              dataPath: 'GradeValueStr'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_GradeDesc
+            {
+              columnId: 'GradeDesc'
+              dataPath: 'GradeDesc'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
     }
     userconfigurableinformation
     {
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
new file mode 100644
index 0000000..43ce5f1
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
@@ -0,0 +1,178 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormInterfaceTest
+      {
+        title: 'QTIANMA_JITUAN::FormInterfaceTest'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormInterfaceTest'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 10
+          columnPosition: 1
+          columnSpan: 6
+        }
+        components
+        {
+          FormInterfaceTest_PanelInterfaceOptions
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceTest
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceTest981
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_ListInterfaceTest
+          {
+          }
+          FormInterfaceTest_DataSetLevelInterfaceTest
+          {
+            groupDepth: -1
+            column_BrokerName
+            {
+              columnId: 'BrokerName'
+              dataPath: 'BrokerName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ElementTotal
+            {
+              columnId: 'ElementTotal'
+              dataPath: 'ElementTotal'
+              dataType: 'number'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_ErrorDateTime
+            {
+              columnId: 'ErrorDateTime'
+              dataPath: 'ErrorDateTime'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_ErrorMessage
+            {
+              columnId: 'ErrorMessage'
+              dataPath: 'ErrorMessage'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_ErrorNo
+            {
+              columnId: 'ErrorNo'
+              dataPath: 'ErrorNo'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_IsSuccess
+            {
+              columnId: 'IsSuccess'
+              dataPath: 'IsSuccess'
+              dataType: 'boolean'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_SuccessDateTime
+            {
+              columnId: 'SuccessDateTime'
+              dataPath: 'SuccessDateTime'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormBusinessType
+      {
+        title: 'QTIANMA_JITUAN::FormBusinessType'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormBusinessType'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 11
+          rowSpan: 6
+          columnPosition: 1
+          columnSpan: 6
+        }
+        components
+        {
+          FormBusinessType_ListBusinessType
+          {
+          }
+          FormBusinessType_DataSetLevelBusinessType
+          {
+            groupDepth: -1
+            column_BusinessTypeName
+            {
+              columnId: 'BusinessTypeName'
+              dataPath: 'BusinessTypeName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormShowInterfaceData
+      {
+        title: 'QTIANMA_JITUAN::FormShowInterfaceData'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormShowInterfaceData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 16
+          columnPosition: 7
+          columnSpan: 6
+        }
+        components: null
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'SKIN_TIGER'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: '鎺ュ彛娴嬭瘯'
+  name: '鎺ュ彛娴嬭瘯'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3