From 472c228ef6d7c8d877558ff90051b1fdb35ffb5c Mon Sep 17 00:00:00 2001
From: renhao <renhui.hao@capgemini.com>
Date: 星期二, 10 十月 2023 14:05:34 +0800
Subject: [PATCH] Merge branch 'dev'

---
 _Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl                                                                                                         |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/_ROOT_Component_DialogEditCustomerOrderPriority.def                                                     |   32 
 _Main/BL/Type_PriorityFactor/StaticMethod_GetCoeffcientByName.qbl                                                                                                             |    2 
 _Main/BL/Type_YuxTest/Attribute_TestString.qbl                                                                                                                                |    7 
 _Main/BL/Type_OrganCode/_ROOT_Type_OrganCode.qbl                                                                                                                              |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def                                                                                                |    9 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationCost.qbl                                                                                           |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def                                              |   26 
 _Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeInterfaceData.qbl                                                                                        |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Component_ListCapacityAndSaleBudgeFilterMonth.def                                                   |    4 
 _Main/BL/Type_Global_ShowCell/Attribute_Value.qbl                                                                                                                             |    7 
 _Main/BL/Type_H_MaterialInfo/Attribute_ID.qbl                                                                                                                                 |    8 
 _Main/BL/Type_CapacityAndSaleBudgeChartRow/StaticMethod_CreateIfNotExist.qbl                                                                                                  |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Response_pnlActions_btnOk_OnClick.def                                                                          |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Component_ListCapacityAndSaleBudgeFilterItem.def                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnClick#106.def                                                                          |    0 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomOrder.qbl                                                                                      |   13 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_UnitOfMeasure_MP.qbl                                                                                 |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyCoefficient_902_ButtonCommit_OnClick.def                                                 |    7 
 _var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc                                                                                                      |   20 
 _Main/BL/Type_Global_ShowColumn/Attribute_ColumnName.qbl                                                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Views/Test.vw                                                                                                                                     |  458 +
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def                                                          |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def                                                                               |   79 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Component_ListCapacityAndSaleBudgeFilterYear.def                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuDelete_OnClick.def                                                                     |   18 
 _Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CreateInOperation.qbl                                                                                                      |   16 
 _Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl                                                                                   |   51 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def                                                    |    2 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetProduct_MP.qbl                                                                                                        |   17 
 _Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/_ROOT_Component_FrmErrorLogs.def                                                                                           |    3 
 _Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCount.qbl                                                                                                                 |    8 
 _Main/BL/Type_Operation/Method_OnCommitCustom.qbl                                                                                                                             |    4 
 _Main/BL/Type_CustomerOrder/Attribute_BusinessType.qbl                                                                                                                        |    8 
 _Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl                                                                                                                    |    5 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCustomerAndForecast/Component_pnlContent.def                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR#39.def                          |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick#715.def                                                              |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_PanelFillingCapacityOrder.def                                                                        |   26 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Response_pnlActions_btnOk_OnClick.def                                                                        |   52 
 _Main/UI/MacroPlannerWebApp/Component_DialogNewPriorityPolicy/Method_Edit.def                                                                                                 |   15 
 _Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl                                                                                                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlContent.def                                                                                     |   33 
 _Main/BL/Type_FillingCapacityOrder/Attribute_State.qbl                                                                                                                        |    8 
 _Main/BL/Type_Unit/StaticMethod_CreateOrUpdate.qbl                                                                                                                            |    8 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_ProductGrade.qbl                                                                                                            |    7 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedgingEx.qbl                                                                                                              |  181 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_New.def                                                                         |   14 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_CreateCustomOrder.qbl                                                                                                    |   45 
 _Main/BL/Type_FillingCapacityOrder/StaticMethod_CreateCustomOrder.qbl                                                                                                         |   36 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl                                                                                        |    9 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Operation.qbl                                                                                               |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnCancel_OnClick.def                                                                    |   15 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl                                                                                    |    9 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Product_MP.qbl                                                                                              |   13 
 _Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl                                                                                                                   |   27 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Response_PanelFillingCapacityOrder_ButtonDeduct_OnClick.def                                                    |   24 
 _Main/BL/Type_Global_ShowCell/StaticMethod_SetColumnsAndRows.qbl                                                                                                              |   16 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Query_FM_OnClick.def                                                                                  |   15 
 _Main/BL/Type_GlobalDTOTable/_ROOT_Type_GlobalOTDTable.qbl                                                                                                                    |   12 
 _Main/BL/Type_Global_MappingCustomerGrade/Attribute_CustomerGrade.qbl                                                                                                         |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_listContextMenuCustomerAndFillingCapacityOrder.def                                                  |   33 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyCoefficient#902.def                                                                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def                                                       |   37 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_OrganCode.qbl                                                                                                                   |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def                                                     |   11 
 _Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl                                                                           |   23 
 _Main/BL/Type_BusinessType/Attribute_DisplayType.qbl                                                                                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog.def                                                                                        |    6 
 _Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl                                                                             |   91 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuNew_OnClick.def              |   19 
 _Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_CreateIfNotExist.qbl                                                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlActions_btnOk_OnClick.def                                                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_Edit.def                                                                                              |   15 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def                                                                                          |   79 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_ListMaterialPurchase.def                                                                                 |    3 
 _Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def                                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def                                                                                       |   18 
 _Main/UI/MacroPlannerWebApp/Component_Form234/Component_List174.def                                                                                                           |    2 
 _Main/BL/Type_FillingCapacityOrder/Attribute_UnitOfMeasure_MPID.qbl                                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Method_New.def                                                                                                 |   18 
 _Main/BL/Type_MPSync/Method_CapacityAndSaleBudgeExport.qbl                                                                                                                    |  143 
 _Main/BL/Type_Global_MappingOperationBOM/StaticMethod_SynchronizeInterfaceData.qbl                                                                                            |   18 
 _Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl                                                                                                                 |   17 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemRow_GlobalOTDTable_GlobalOTDTable_Ca.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listActionBarPageInterfaceTest.def                                                                          |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_New.def                                                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnSelectionChanged.def                                                       |    4 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_OrderType#905.qbl                                                                                                           |    7 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetSalesSegment_MP.qbl                                                                                                   |   16 
 _Main/BL/Type_MacroPlan/Method_MappingProductData.qbl                                                                                                                         |    4 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupSalesViews#633.def                                                                      |   11 
 _Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_List710.def                                                                                                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/_ROOT_Component_FormPriorityFactorGrading.def                                                                 |    4 
 _Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl                                                                                                        |    7 
 _Main/BL/Type_Global_ShowRow/_ROOT_Type_Global_ShowRow.qbl                                                                                                                    |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def                                                                                   |    8 
 _Main/BL/Type_FillingCapacityOrder/TypeIndex_FillingCapacityOrderTypeIndex.qbl                                                                                                |   12 
 _Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl                                                                                                                           |   49 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_ConversionFactor.qbl                                                                                 |   13 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl                                                                                                                 |    8 
 _Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl                                                                                                      |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlContent.def                                                                                |   91 
 _Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl                                                                                         |  119 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingCapac.def                                |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def                                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterItem/Response_OnCreated.def                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnChanged.def                                                               |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/_ROOT_Component_DialogOrganCode.def                                                                                     |   33 
 _Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick#545.def                                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog221.def                                                                                     |   26 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType655.def                                                                                    |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnCreated.def                                                                |   18 
 _Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CanRun.qbl                                                                                                                 |   16 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationBOM.qbl                                                                                     |   13 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_SalesSegment_MP.qbl                                                                                         |   13 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_ProductID.qbl                                                                                                                   |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnDataChanged.def                                                                  |    8 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl                                                                                                        |  110 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def                                                             |   33 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationCost.qbl                                                                                    |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_CalculatePriorityResult.def                                                                           |   13 
 _Main/BL/Type_Global_MappingConversionFactor/StaticMethod_SynchronizeInterfaceData.qbl                                                                                        |   18 
 _Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_OnException.qbl                                                                                                          |    9 
 _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                                                                 |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def                                                                                            |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption4.def                                                                                   |   65 
 _Main/BL/Type_CustomerAndForecastOrder/StaticMethod_CreateData.qbl                                                                                                            |   22 
 _Main/UI/MacroPlannerWebApp/Views/PriorityTest.vw                                                                                                                             | 2745 +++++++++
 _Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl                                                                                                 |   45 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnCapacityAllocationAndProductionFillin.def                                |   16 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/StaticMethod_CreateIfNotExist.qbl                                                                                         |    6 
 _Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl                                                                                                                        |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def                                                  |    2 
 _Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl                                                                                                                    |   81 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def                                                                                |   11 
 _Main/UI/MacroPlannerWebApp/Views/填产方案列表.vw                                                                                                                                   |    2 
 _Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_DeleteDetails.qbl                                                                                                      |   19 
 _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/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_StockingPointCost.qbl                                                                                       |   13 
 _Main/BL/Type_Global_MappingDOI_DSI/StaticMethod_SynchronizeInterfaceData.qbl                                                                                                 |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def                                         |   29 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonMultiply_OnClick.def                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlActions.def                                                                                                |   40 
 _Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl                                                                                                            |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase.def                                                                                |    4 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeCompareItemColumn_GlobalOTDTable_GlobalOTDTable.qbl                                                                           |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/_ROOT_Component_FormFillingCapacityOrder.def                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_ListReleaseRecord_OnSelectionChanged.def                                                                     |   10 
 _Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl                                                                                                                           |   49 
 _Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl                                                                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterYear/Response_OnCreated.def                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonLeftParenthesis_OnClick.def                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonSubtract_OnClick.def                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixeditorContextMenuShowInterfaceData.def                                                            |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnSelectionChanged.def                                                                   |   20 
 _Main/BL/Relations/Relation_YuxTest_MPSync_MPSync_YuxTest.qbl                                                                                                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_OnCreated.def                                                                                                |    2 
 _Main/BL/Relations/Relation_Global_ShowColumn_Global_ShowCell_Global_ShowCell_Global_ShowColumn.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Component_pnlContent.def                                                                                |   27 
 _Main/BL/InfoMessages.qbl                                                                                                                                                     |    6 
 _Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl                                                                                                                  |   12 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def                                                                                   |   96 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/_ROOT_Type_CapacityAllocationResultsRuleConfiguration.qbl                                                            |   10 
 _Main/BL/EDI/Broker_GlobalOTDTable_CustomOrder.qbl                                                                                                                            |   29 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType.def                                                                                       |   35 
 _Main/BL/Type_Global_MappingDOI_DSI/TypeIndex_Global_MappingDOI_DSITypeIndex.qbl                                                                                              |   16 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ProductInLane.qbl                                                                                           |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnOk_OnClick.def                                                                                   |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_ClickBtnOk.def                                                                                                   |   19 
 _Main/BL/Type_CustomerOrder/Attribute_CustomerPolicy.qbl                                                                                                                      |    8 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl                                                                                                                        |    2 
 _Main/BL/Type_Forecast/StaticMethod_CreateOrUpdate.qbl                                                                                                                        |   16 
 _Main/BL/Type_Scenario/Attribute_ScenarioName.qbl                                                                                                                             |    8 
 _Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl                                                                                                                              |   31 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption3.def                                                                                   |   65 
 _Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowColumn_Global_ShowColumn_GlobalOTDTable.qbl                                                                             |   23 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ConversionFactor.qbl                                                                                        |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_ListHedgingOfLog.def                                                                                         |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuPriorityResult_OnClick.def                                               |   19 
 _Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl                                                                                                                           |    5 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeMacroPlanData.qbl                                                                                             |   31 
 _Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_Panel391.def                                                                                                     |   24 
 _Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl                                                                                                                    |   11 
 _Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcStr.qbl                                                                                                                      |   94 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def                             |   59 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnCreated.def                                                          |   18 
 _Main/BL/Type_Global_MappingLaneLeg/StaticMethod_OnException.qbl                                                                                                              |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_PanelButton.def                                                                                     |   26 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditIssueWorkOrder/Response_pnlActions_btnOk_OnClick.def                                                                    |   10 
 _Main/BL/Type_LibSOPImpExp_ExportExcel/_ROOT_Type_LibSOPImpExp_ExportExcel.qbl                                                                                                |    6 
 _Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcFormula.qbl                                                                                                                  |   22 
 _Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl                                                                                               |   23 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl                                                                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_List696.def                                                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportTest_OnClick.def                                                                          |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593#93.def                                                                                  |   38 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def                                                                                 |   22 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuEdit526_OnClick.def                                                                                  |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def                                                                                         |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Component_pnlActions.def                                                                                |   50 
 _Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecuteUser.qbl                                                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def                                        |   17 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_StockingPointCost.qbl                                                                                |   13 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetUnitOfMeasure_MP.qbl                                                                                                  |   16 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetStockingPoing_MP.qbl                                                                                                  |   17 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/_ROOT_Component_DialogCreateEditCapacityAllocationResultsRuleConfiguration.def         |   32 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_New.def                                                                                                          |   15 
 _Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl                                                                                                                   |   47 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListBusinessType.def                                                                                                  |    2 
 _Main/Sys/ImgAttr/Global_BrokerExecuteLog.dme                                                                                                                                 |   25 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl                                                                                           |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_ListFillingCapacityOrder.def                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlActions_btnOk_OnClick.def                                                                        |   18 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl                                                                                              |   14 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl                                                                                                                |  237 
 _Main/BL/Type_PriorityFactor/StaticMethod_CheckNameValid.qbl                                                                                                                  |   29 
 _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/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def                                                         |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def                                                |   16 
 _Main/BL/Type_PriorityFactor/StaticMethod_InitData.qbl                                                                                                                        |   52 
 _Main/BL/Type_Global_MappingLane/StaticMethod_OnException.qbl                                                                                                                 |    9 
 LibMacroPlanner/BL/Relations/Relation_MPSync_ImportExcel_ImportExcel_MPSync.qbl                                                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceGlobal_BrokerExecuteLog#981.def                                                               |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterMonth/Response_OnCreated.def                                                                              |    2 
 _Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl                                                                                                        |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_ListPriorityPolicy.def                                                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_Buttonplus_OnClick.def                                                   |    7 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl                                                                                                                 |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_listContextMenuProduct#1.def                                                                                     |   28 
 _Main/BL/Type_ImportExcel/Method_Execute.qbl                                                                                                                                  |   43 
 _Main/BL/Type_Routing/Method_GetHasTianmaNonSupplierOperationWithNoInput.qbl                                                                                                  |   28 
 _Main/BL/Type_PriorityPolicy/StaticMethod_RollBackStr.qbl                                                                                                                     |    4 
 _Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl                                                                                           |   40 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeChartRow_GlobalOTDTable_GlobalOTDTable_Capacity.qbl                                                                           |   23 
 _Main/BL/Type_CapacityAndSaleBudgeChartElement/StaticMethod_TestData.qbl                                                                                                      |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Response_ListIssueWorkOrder_MenuEdit_OnClick.def                                                                     |   12 
 _Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_GlobalOTDTable_GlobalOTD.qbl                                                                           |   23 
 _Main/BL/Type_CustomerOrder/Attribute_OrderTime.qbl                                                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Component_pnlActions.def                                                                                     |   40 
 _Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrder.vw                                                                                                                     |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_ClickBtnOk.def                                                                                        |    4 
 _Main/BL/Type_H_MaterialInfo/Attribute_SKU.qbl                                                                                                                                |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def                                                                |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def                                          |    2 
 _Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl                                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuSelectionAll_OnClick.def                                                               |   17 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl                                                                                      |    9 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_AIPISPIP.qbl                                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def                                                                    |   19 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnCancel_OnClick.def                                                                               |   15 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP.qbl                                                                                        |   13 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl                                                                                                           |  212 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_ObtainTheFinalOutputProduct.qbl                                                                                          |   35 
 _Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Material/Response_OnCreated.def                                                                              |   23 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_Edit.def                                                                        |   17 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_InventorySupply.qbl                                                                                  |   13 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Forecast.qbl                                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Component_Form367/_ROOT_Component_FormBusinessType#367.def                                                                                        |    3 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/_ROOT_Component_FormCustomerAndForecastOrder.def                                                              |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRightParenthesis_OnClick.def                                       |    7 
 _Main/BL/Type_H_MaterialInfo/_ROOT_Type_H_MaterialInfo.qbl                                                                                                                    |   10 
 _Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl                                                                                                     |   16 
 _Main/BL/Type_ManufactureLTImputation/StaticMethod_Transfer.qbl                                                                                                               |   42 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listActionBarPageCapacityAllocationResultsRuleConfiguration.def                |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def                                                                    |   20 
 _Main/BL/Relations/Relation_Global_MappingCustomerGrade_GlobalOTDTable_GlobalOTDTable_Global_Ma.qbl                                                                           |   23 
 _Main/BL/Type_GlobalDTOTable/Method_Test.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_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                                                                     |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlContent.def                                                                                                |   26 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_matrixEditorActionBarPageShowInterfaceData.def                                                          |   10 
 _Main/BL/Type_H_MaterialInfo/Attribute_NeedQty.qbl                                                                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Component_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.def             |    4 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListOrganCode.def                                                                                                     |   62 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def                                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def                                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def                                      |   42 
 _Main/BL/Type_BusinessType/StaticMethod_GetScenarioNamesStr.qbl                                                                                                               |   31 
 _Main/BL/Type_BusinessType/Attribute_BusinessTypeName.qbl                                                                                                                     |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def                                                      |   22 
 _Main/BL/Type_MPSync/StaticMethod_TestData.qbl                                                                                                                                |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Component_ListCapacityAndSaleBudgeFilterBusinessType.def                                     |    4 
 _Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan#127.qbl                                                                                                        |   20 
 _Main/BL/Type_H_MaterialInfo/Attribute_OrgCode.qbl                                                                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Response_PanelHedgingOfLog593_93_btn_Query_FHO_OnClick.def                                                             |   19 
 _Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeMacroPlanData.qbl                                                                                        |   31 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuDelete_OnClick.def                                           |   18 
 _Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFinishedGood.qbl                                                                                               |    8 
 _Main/BL/Type_ManufactureLTProcessSection/StaticMethod_CreateOrUpdate.qbl                                                                                                     |   10 
 _Main/BL/EDI/Broker_GlobalOTDTable_CustomerGrade.qbl                                                                                                                          |   64 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationBOM.qbl                                                                                            |   13 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingS#360.def                                |    3 
 _Main/BL/Relations/Relation_Global_ShowRow_Global_ShowCell_Global_ShowCell_Global_ShowRow.qbl                                                                                 |   23 
 LibMacroPlannerOptimizer/BL/Type_CapacityPlanningSuboptimizer/Method_CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputG.qbl                                |   39 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Operation.qbl                                                                                        |   13 
 _Main/UI/MacroPlannerWebApp/Views/OrderLock.vw                                                                                                                                |  451 +
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def                                                                                    |   30 
 _Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_CreateIfNotExist.qbl                                                                                        |    2 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl                                                                                                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuSelectAll_OnClic.def         |   17 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuSalesFillingCapacity.def                                                                   |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_PanelButton_ButtonTransform_OnClick.def                                                              |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormProducts/Response_TIANMA_JITUAN_ListProduct_844_MenuMarkingPanelMaterial_OnClick.def                                                |   19 
 _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/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Component_ListIssueWorkOrder.def                                                                                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def                                                                   |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_listContextMenuFillingCapacityOrder.def                                                              |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnCreated.def                                                                      |   19 
 _Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl                                                                                                               |    7 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def                                                                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_MenuDelete_OnClick.def                                                                     |    3 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def                                                                        |   23 
 _Main/BL/Type_Global_ShowRow/Attribute_RowNr.qbl                                                                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Order/Response_OnCreated.def                                                                                 |   10 
 _Main/BL/Type_FillingCapacityOrder/Attribute_CurrencyID.qbl                                                                                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption1.def                                                                                   |   65 
 _Main/UI/MacroPlannerWebApp/Views/年度产销复盘.vw                                                                                                                                   |  777 ++
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl                                                                                              |   14 
 _Main/BL/Type_H_MaterialInfo/Attribute_MaterialType.qbl                                                                                                                       |    8 
 _Main/BL/Type_PriorityPolicy/StaticMethod_RollBackCalcStr.qbl                                                                                                                 |   44 
 LibMacroPlannerOptimizer/BL/Type_SelectorFullPuzzle/Method_SetOptimizerInput.qbl                                                                                              |    4 
 _Main/BL/Type_Global_MappingCustomerGrade/TypeIndex_Global_MappingCustomerGradeTypeIndex.qbl                                                                                  |   20 
 _Main/BL/Type_BusinessType/Attribute_ScenarioName.qbl                                                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonAddPriorityPolicy_OnClick.def                                      |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormProducts/_ROOT_Component_FormProducts.def                                                                                           |   10 
 _Main/BL/Type_CustomerAndForecastOrder/Attribute_CustomerOrderID.qbl                                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def                                                                                           |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Component_pnlContent.def                                                                                     |  238 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl                                                                                                 |    6 
 _Main/BL/Type_H_Forecast/Attribute_StockingPointID.qbl                                                                                                                        |    8 
 _Main/BL/Type_Global_MappingProductInLane/StaticMethod_SynchronizeInterfaceData.qbl                                                                                           |   18 
 _Main/BL/Type_GlobalDTOTable/Method_SettingSuccessfulDetails.qbl                                                                                                              |   20 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Forecast.qbl                                                                                                |   13 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl                                                                                                             |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_ListInterfaceTest.def                                                                                       |   59 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def                                                                               |   45 
 _Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/_ROOT_Component_FormHedgingOfLog.def                                                                                   |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_ListProduct#844.def                                                                                              |   14 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_Panel418.def                                                                                                      |   16 
 _Main/BL/Type_BusinessType/StaticMethod_CreateData.qbl                                                                                                                        |    1 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick#222.def                                                              |   35 
 _Main/BL/Type_CustomerAndForecastOrder/StaticMethod_RefreshData.qbl                                                                                                           |   56 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnCancel_OnClick.def                                              |   15 
 _Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl                                                                                                                            |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick#549.def                                                            |    2 
 _Main/BL/Relations/Relation_H_MaterialInfo_MacroPlan_MacroPlan_H_MaterialInfo.qbl                                                                                             |   23 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl                                                                                                             |  109 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyBusinessType_OnDataChanged.def                                                      |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnDataChanged.def                                         |   18 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_Division.qbl                                                                                               |    8 
 _Main/BL/Type_Global_MappingCustomOrder/Attribute_SheetProfitability.qbl                                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/_ROOT_Component_FormMaterialPurchase.def                                                                           |   12 
 _Main/BL/Type_Global_MappingProduct_MP/StaticMethod_SynchronizeInterfaceData.qbl                                                                                              |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterBusinessType/Response_listContextMenuCapacityAndSaleBudgeFilterYear_1_MenuRefresh_OnClick.def             |    2 
 _Main/BL/Type_H_FunctionClass/_ROOT_Type_H_FunctionClass.qbl                                                                                                                  |    2 
 _Main/BL/Type_BaseConversionFactor/StaticMethod_CreateOrUpdate.qbl                                                                                                            |   15 
 _Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/StaticMethod_SynchronizeInterfaceData.qbl                                                                    |   18 
 _Main/BL/Type_Global_MappingCustomerGrade/StaticMethod_SynchronizeInterfaceData.qbl                                                                                           |   18 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_SalesSegment_MP.qbl                                                                                  |   13 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_PanelBusinessType.def                                                                                                 |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def                                                                         |   18 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                                                           |    5 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Response_pnlContent_DataHolderChoosePriorityPolicy_OnCreated.def                                             |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnCreated.def                                                               |   30 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord243.def                                                                                    |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_EditCustomerOrderPriority.def                                                                    |   17 
 _Main/BL/Type_GlobalDTOTable/Method_SettingFailureDetails.qbl                                                                                                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def                                                                                   |   12 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Component_listActionBarPageOrganCode.def                                                                                        |   10 
 _Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Response_Panel391_Button655_OnClick.def                                                                                    |   39 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/Method_OpenChoose.def                                                                                        |   10 
 LibSOPImportExport/metadata.properties                                                                                                                                        |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_Edit.def                                                                                                         |   17 
 _Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl                                                                                                                   |   58 
 _Main/BL/Type_Global_ShowColumn/_ROOT_Type_Global_ShowColumn.qbl                                                                                                              |    9 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl                                                    |   20 
 _Main/BL/Type_PriorityFactor/Attribute_ReflectionType.qbl                                                                                                                     |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingSchem.def                                |    3 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl                                                                                                         |    2 
 _Main/BL/Type_OrganCode/Attribute_OrganCodeName.qbl                                                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuDelete267_OnClick.def                                                                                |   19 
 _Main/BL/Type_FillingCapacityOrder/StaticMethod_OrderOffset.qbl                                                                                                               |   58 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgInterfaceTest.def                                                                                  |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Component_listContextMenuPriorityFactor.def                                                                          |   19 
 _Main/BL/KnowledgeBaseDomain_MacroPlanner/KnowledgeBase_Knowledge_MP/_ROOT_KnowledgeBase_Knowledge_MP.qbl                                                                     |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def                                                              |   37 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def                                          |   10 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick#975.def                                                                                |   35 
 _Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl                                                                                                                  |   87 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_OnSelectionChanged.def                                                                     |   20 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl                                                                                                                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_OrderH_FOF_OnClick.def                                                                           |   16 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def                                                                                                 |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuEdit_OnClick.def                                                                     |   15 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def                                                                                     |   35 
 _Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_Panel224.def                                                                                                        |    1 
 _Main/BL/Relations/Relation_OrganCode_BusinessType_BusinessType_OrganCode.qbl                                                                                                 |   23 
 _Main/BL/Type_Global_MappingDOI_DSI/_ROOT_Type_Global_MappingDOI_DSI.qbl                                                                                                      |    9 
 _Main/BL/Type_Global_MappingStockingPointCost/StaticMethod_SynchronizeInterfaceData.qbl                                                                                       |   18 
 _Main/BL/Type_Global_MappingUnitCost/StaticMethod_SynchronizeInterfaceData.qbl                                                                                                |   18 
 _var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw                                                                                            |   14 
 _Main/BL/Type_Global_ShowColumn/StaticMethod_CreateColumn.qbl                                                                                                                 |   15 
 _var/_Main/ProjSettings/MacroPlannerWebApp/Views/Test.vw                                                                                                                      |   42 
 _Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_OnException.qbl                                                                                                      |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Response_pnlActions_btnOk_OnClick.def                                                                   |   15 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl                                                                                                     |    9 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick#880.def                                                                 |   21 
 _Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl                                                                                                                    |    7 
 _Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl                                                                                                         |  132 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuDelete_OnClick.def                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def                                                  |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnSelectionCh.def                                     |    2 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterBusinessType_GlobalOTDTable_GlobalOTDTabl.qbl                                                                           |   23 
 _Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl                                                                                     |    9 
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter.qbl                                                                                                             |    8 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def                                                                            |   21 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl                                                                                                 |  113 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def                                                                                             |    8 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl                                                                                                             |  264 
 _Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl                                                                                                          |   16 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport.qbl                                                                                    |    4 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomOrder.qbl                                                                                             |   13 
 _Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecutionStatus.qbl                                                                                                           |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlActions.def                                                               |   40 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def                                                  |   14 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeInterfaceData.qbl                                                                                             |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Component_listContextMenuPriorityFactorGrading.def                                                            |   14 
 _Main/BL/Type_YuxTest/_ROOT_Type_YuxTest.qbl                                                                                                                                  |    9 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl                                                                                                     |   42 
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl                                                                                          |    2 
 _Main/BL/Type_PriorityResult/StaticMethod_GetDetailsValue.qbl                                                                                                                 |  124 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorSelect_OnDataChanged.def                                                            |   17 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray_GlobalOTDTable_G.qbl                                                                           |   23 
 _Main/BL/Type_MPSync/Method_ImportExcels_Tianma.qbl                                                                                                                           |   22 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl                                                                                            |    6 
 _Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl                                                                                                                       |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/_ROOT_Component_FormShowInterfaceData.def                                                                         |   17 
 _Main/BL/Type_YuxTest/Attribute_TestReal.qbl                                                                                                                                  |    7 
 _Main/BL/Type_ImportExcel/_ROOT_Type_ImportExcel.qbl                                                                                                                          |    6 
 _Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl                                                                                                              |   16 
 _Main/BL/Type_H_MaterialInfo/Attribute_MaterialName.qbl                                                                                                                       |    8 
 _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_FillingCapacityOrder/Attribute_ID.qbl                                                                                                                           |    8 
 _Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl                                                                                                                 |  111 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.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/BL/Type_Global_MappingOperation/StaticMethod_SynchronizeInterfaceData.qbl                                                                                               |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def                                          |   17 
 _Main/BL/Type_PriorityFactor/StaticMethod_GetNameList.qbl                                                                                                                     |    1 
 _Main/BL/Type_YuxTest/StaticMethod_ExportTest#887.qbl                                                                                                                         |   26 
 _Main/UI/MacroPlannerWebApp/Component_FormPanelMaterialTianHua/_ROOT_Component_FormPanelMaterialTianHua.def                                                                   |    4 
 _Main/BL/Type_ProductInStockingPointInPeriodPlanningLeaf/FunctionOverride_CalcStockLevelInDays.qbl                                                                            |   79 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterMonth_GlobalOTDTable_GlobalOTDTable_Capac.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/_ROOT_Component_FormReleaseRecord.def                                                                                 |   12 
 _Main/BL/Type_MappingSaleBudge/StaticMethod_ExportFields.qbl                                                                                                                  |   64 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord.def                                                                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuDelete_OnClick.def           |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_PanelList.def                                                                                                    |    8 
 _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/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_AIPISPIP.qbl                                                                                                |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def                                                               |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick.def                                                       |    2 
 _Main/BL/Type_Global_ShowCell/StaticMethod_CreateShowData_CustomOrder.qbl                                                                                                     |   58 
 _Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFinishedGood.qbl                                                                                                 |    8 
 _Main/BL/EDI/Broker_GlobalOTDTable_DOI_DSI.qbl                                                                                                                                |   71 
 _Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl                                                                                                             |    7 
 _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_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def                       |   43 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgTest.def                                                                                           |   29 
 _Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl                                                                                                                      |    7 
 _Main/BL/Type_MappingSaleBudge/StaticMethod_ExpectedHeaders.qbl                                                                                                               |   64 
 _Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl                                                                                                                       |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInit_OnClick.def                                                                     |   18 
 _Main/BL/Type_Forecast/StaticMethod_DoSync.qbl                                                                                                                                |    5 
 _Main/UI/MacroPlannerWebApp/Views/PriorityResults.vw                                                                                                                          |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def                                         |   16 
 _Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFinishedGood.qbl                                                                                                  |    8 
 LibMacroPlanner/BL/Type_UnitPeriodTimeBase/Function_CalcTotalAvailableCapacity.qbl                                                                                            |    3 
 _Main/BL/Type_H_MaterialInfo/Attribute_ParentSKU.qbl                                                                                                                          |    8 
 _Main/BL/Type_Global_ShowColumn/Attribute_ColumnIndex.qbl                                                                                                                     |    7 
 _var/_Main/ModelSettings/Common/Dev-21/_ROOT_Role_Dev-21.properties                                                                                                           |    2 
 _Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart#156.qbl                                                                                                         |  301 +
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def                                         |   17 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def                                                                                                 |   42 
 _Main/BL/Type_Global_MappingCustomerGrade/_ROOT_Type_Global_MappingCustomerGrade.qbl                                                                                          |    9 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl                                                                                                           |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def                                                  |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def                                                                            |   47 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupSalesViews_ButtonPriority_OnClick.def                                      |   16 
 _Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl                                                       |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityResult/_ROOT_Component_FormPriorityResult.def                                                                               |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock#844.def                                                                                           |    2 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Product_MP.qbl                                                                                       |   13 
 _Main/BL/Type_CustomerOrder/Attribute_SheetProfitability.qbl                                                                                                                  |    8 
 _Main/BL/Relations/Relation_GlobalOTDTable_Global_ShowCell_Global_ShowCell_GlobalOTDTable.qbl                                                                                 |   23 
 _Main/BL/Type_FillingCapacityOrder/Attribute_OrderType.qbl                                                                                                                    |    1 
 _Main/BL/Type_Routing/Method_DoSanityCheckData.qbl                                                                                                                            |   20 
 _Main/BL/Relations/Relation_Global_MappingDOI_DSI_GlobalOTDTable_GlobalOTDTable_Global_MappingD.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormShowInterfaceData/Component_MatrixEditorShowInterfaceData.def                                                                       |   97 
 _Main/UI/MacroPlannerWebApp/Views/Business_Type_Maintain.vw                                                                                                                   |  351 +
 _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_H_MaterialInfo/Attribute_Unit.qbl                                                                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Views/接口测试.vw                                                                                                                                     |  223 
 _Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl                                                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw                                                                                                           |    2 
 _Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl                                                                                                                             |   65 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase354.def                                                                             |   26 
 _Main/BL/Type_YuxTest/Attribute_TestBoolean.qbl                                                                                                                               |    7 
 _Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl                                                                                                                        |   73 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetBOMBySKU.qbl                                                                                                                 |   18 
 _Main/BL/Type_H_MaterialInfo/Attribute_NeedDate.qbl                                                                                                                           |    8 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl                                                                                                            |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperation.def                                                                           |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_PanelReleaseRecord423.def                                                                                   |   26 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetUnitBySKU.qbl                                                                                                                |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader#545.def                                                                                    |   16 
 _Main/BL/Type_Global_MappingSalesSegment_MP/StaticMethod_SynchronizeInterfaceData.qbl                                                                                         |   18 
 _Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def                                                                                       |    2 
 _Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl                                                                                                               |   13 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterItem_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 
 LibSOPImportExport/BL/Type_LibSOPImpExp_DataSource/Method_HasAllRequiredFilesForImport#522.qbl                                                                                |    5 
 _Main/BL/Relations/Relation_CapacityAndSaleBudgeFilterYear_GlobalOTDTable_GlobalOTDTable_Capaci.qbl                                                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonDivide_OnClick.def                                                 |    7 
 _Main/BL/Type_Global_MappingInventorySupply/StaticMethod_SynchronizeInterfaceData.qbl                                                                                         |   18 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_InventorySupply.qbl                                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def                                                  |   34 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listContextMenuCapacityAllocationResultsRuleConfiguration.def                  |   59 
 _Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl                                                                                          |    9 
 _Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo#1.qbl                                                                                                            |   20 
 _Main/UI/MacroPlannerWebApp/Component_DialogChoosePriorityPolicy/_ROOT_Component_DialogChoosePriorityPolicy.def                                                               |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_OnUserSelectionChanged.def                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def                                                                                |   33 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def         |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def                                                              |    4 
 _Main/BL/Type_ScenarioManager/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl                                                                                                 |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def                                                                |   21 
 _Main/BL/Type_ScenarioManager/StaticMethod_AvailableScenarioNames.qbl                                                                                                         |   23 
 _Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl                                                                                                                |   32 
 _Main/UI/MacroPlannerWebApp/Component_DialogEditCustomerOrderPriority/Method_ClickBynOk.def                                                                                   |   17 
 _Main/BL/Type_PriorityResult/Attribute_CustomerOrderID.qbl                                                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNewOrganCode_OnClick.def                                                                          |   20 
 _Main/BL/Type_Global_MappingDOI_DSI/Attribute_DSI.qbl                                                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral#549.def                                                                                 |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRollBack_OnClick.def                                               |    9 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_CreateIfNotExist.qbl                                                                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/_ROOT_Component_FrmMaterial.def                                                                                             |    7 
 _Main/BL/Type_H_MaterialInfo/Attribute_VCode.qbl                                                                                                                              |    8 
 _Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl                                                                                                                    |    8 
 _Main/BL/Type_CustomerOrder/Attribute_ProductGrade.qbl                                                                                                                        |    8 
 _Main/BL/Type_MPSync/Method_RefreshCapacityAndSaleBudgeFilter0.qbl                                                                                                            |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Response_TIANMA_JITUAN_ListSalesDemands_MenuEditCustomerOrderPriority_OnClic.def                                     |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def                                                   |   14 
 _Main/BL/Type_Global_MappingCustomerGrade/Attribute_BusinessType.qbl                                                                                                          |    9 
 _Main/BL/Type_H_MaterialInfo/Attribute_StockPoint.qbl                                                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_List832.def                                                                                                       |    4 
 _Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl                                                                                                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick.def                                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuEdit_OnClick.def                                                                          |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def                                                               |   58 
 _Main/UI/MacroPlannerWebApp/Component_FrmOrderResult/Component_List782.def                                                                                                    |    2 
 _Main/BL/Type_H_MaterialInfo/Attribute_ForecastID.qbl                                                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption2#456.def                                                                               |   65 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def                                                         |   22 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef#1.def                                                          |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Component_ListCustomerAndFillingCapacityOrder.def                                                             |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicyFactor_OnDataChanged.def                                                            |   18 
 _Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetCurrency_MP.qbl                                                                                                       |   16 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnAnnualProductionAndSalesReview_OnClic.def                                |   16 
 /dev/null                                                                                                                                                                     |   12 
 _Main/BL/Type_LibSOPImpExp_ExportExcel/StaticMethod_IsDataSourceIncluded_Tianma.qbl                                                                                           |   10 
 _Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_OnException.qbl                                                                                                     |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Component_pnlContent.def                                                                                             |   27 
 _Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnCreated.def                                                                    |    5 
 _Main/BL/Type_Global_MappingForecast/StaticMethod_SynchronizeInterfaceData.qbl                                                                                                |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuEdit_OnClick.def             |   21 
 596 files changed, 16,122 insertions(+), 1,247 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/LibMacroPlannerOptimizer/BL/Type_CapacityPlanningSuboptimizer/Method_CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputG.qbl b/LibMacroPlannerOptimizer/BL/Type_CapacityPlanningSuboptimizer/Method_CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputG.qbl
index dcaa2a7..48ca380 100644
--- a/LibMacroPlannerOptimizer/BL/Type_CapacityPlanningSuboptimizer/Method_CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputG.qbl
+++ b/LibMacroPlannerOptimizer/BL/Type_CapacityPlanningSuboptimizer/Method_CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputG.qbl
@@ -9,7 +9,6 @@
   Description: 'Assign the optimal quantity from optimizer for dependent demand in input group.'
   TextBody:
   [*
-    // Tianma fix 20230727
     // Dependent demand of input group fulfillment
     ptperiod := periodtaskoperation.UnitPeriod().Period_MP();
     operation := periodtaskoperation.Operation();
@@ -19,22 +18,24 @@
               dd, 
               dd.HasRegularProductForOptimizer() or dd.OperationInput().GetIsProductInOptimizerRun( runcontext.IsPostProcessing() ) )
     {
-      pispipperiods := construct( Period_MPs, constcontent ); 
-      if ( getfromperiodtask ) // in case we are able to get from period tasks, below method refinds periodtask for (operation, ptperiod) i.e. periodtaskoperation and then output dep.demand periods
-      {
-        traverse( periodtaskoperation, DependentDemand.ProductInStockingPointInPeriodPlanningLeaf.Period_MP, ddperiod ) 
-        {
-          pispipperiods.Add( ddperiod ); 
-        }
-      }
-      else
-      {
-        CapacityPlanningSuboptimizer::GetOperationDependentDemandPeriods( ptperiod, operation, &pispipperiods, getfromperiodtask );
-      }
+      fulfilledqty := 0.0; 
       
-      fulfilledqty := 0.0;  
       if( operation.HasLeadTime() )     // Get the dependent demands that is located at different period from the period of period task.
       {
+        // compute dependent demand periods
+        pispipperiods := construct( Period_MPs, constcontent ); 
+        if ( getfromperiodtask ) // in case we are able to get from period tasks, below method refinds periodtask for (operation, ptperiod) i.e. periodtaskoperation and then output dep.demand periods
+        {
+          traverse( periodtaskoperation, DependentDemand.ProductInStockingPointInPeriodPlanningLeaf.Period_MP, ddperiod ) 
+          {
+            pispipperiods.Add( ddperiod ); 
+          }
+        }
+        else
+        {
+          CapacityPlanningSuboptimizer::GetOperationDependentDemandPeriods( ptperiod, operation, &pispipperiods, getfromperiodtask );
+        }
+        
         fulfilledqty := sum( pispipperiods, Elements, pispipperiod,
                              this.GetOptimalValue( program.PartialOperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod, ptperiod ) ) );
         if ( runcontext.IsMetaIteration() and operation.IsBlending() ) // no filtering for numerical sensitive blending operation in meta optimizer
@@ -44,15 +45,15 @@
         }                     
       }
       else
-      {
-        fulfilledqty := sum( pispipperiods, Elements, pispipperiod,
-                             this.GetOptimalValue( program.OperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod ) ) );
+      { 
+        // note that in case there is no lead time then the set of dependent demand periods just equals the singleton set {ptperiod}
+        fulfilledqty := this.GetOptimalValue( program.OperationDemandQtyVariables().Get( dd.OperationInput(), ptperiod ) );
         if( runcontext.IsMetaIteration() and operation.IsBlending() ) // no filtering for numerical sensitive blending operation in meta optimizer
         {
-          fulfilledqty := sum( pispipperiods, Elements, pispipperiod,
-                               this.GetOptimalValueUnfiltered( program.OperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod ) ) );
+          fulfilledqty := this.GetOptimalValueUnfiltered( program.OperationDemandQtyVariables().Get( dd.OperationInput(), ptperiod ) );
         }
       }
+      
       dd.OptimizerFulfilledQuantity( fulfilledqty );
     }
   *]
diff --git a/LibMacroPlannerOptimizer/BL/Type_SelectorFullPuzzle/Method_SetOptimizerInput.qbl b/LibMacroPlannerOptimizer/BL/Type_SelectorFullPuzzle/Method_SetOptimizerInput.qbl
index d9e0f40..c34a5c7 100644
--- a/LibMacroPlannerOptimizer/BL/Type_SelectorFullPuzzle/Method_SetOptimizerInput.qbl
+++ b/LibMacroPlannerOptimizer/BL/Type_SelectorFullPuzzle/Method_SetOptimizerInput.qbl
@@ -175,10 +175,12 @@
       
       if ( ddperiodstotal.Size() > 0 ) 
       {
+        minstart := min( ddperiodstotal, Elements, p, p.Start() ); 
+        minstartperiods := min( periods, Elements, p, p.Start() ); 
         pispiptoadd := selectset( operation, 
                                   OperationInput.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, 
                                   pispip,
-                                  ddperiodstotal.Find( pispip.Period_MP() ) > 0
+                                  pispip.Start() >= minstart and pispip.Start() < minstartperiods // must add the entire block. Don't want gaps in the pispip horizon
                                   and ( pispip.HasRegularProductForOptimizer() or pispip.GetProductIsIncludedInOptimizerRun( runcontext.IsPostProcessing() ) ) 
                                   and not scope.Contains( pispip.PISPIPInOptimizerRun() ) )
                                     
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_CARRC_Export.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl
new file mode 100644
index 0000000..d50d284
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Export.qbl
@@ -0,0 +1,49 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CARRC_Export
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Source Source11
+  {
+    EDIMLTable CapacityAllocationResultsRuleConfiguration
+    {
+      PrimaryKeyColumns: ModuleMaterialCode
+      PrimaryKeyColumns: PanelMaterialCode
+      PrimaryKeyColumns: StockingPointID
+      TargetType: CapacityAllocationResultsRuleConfiguration
+      TypeIndex: CapacityAllocationResultsRuleConfigurationTypeIndex
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation11
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResultsRuleConfiguration
+      OutputTable: CapacityAllocationResultsRuleConfiguration
+      EDIColumnMatch { InputColumn: Division OutputColumn: Division }
+      EDIColumnMatch { InputColumn: ModuleMaterialCode OutputColumn: ModuleMaterialCode }
+      EDIColumnMatch { InputColumn: PanelMaterialCode OutputColumn: PanelMaterialCode }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+    }
+  }
+  EDIXLSLink.Destination Destination12
+  {
+    FileName: 'Destination12'
+    EDIXLSLinkTable CapacityAllocationResultsRuleConfiguration
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Division { ValueType: String }
+        EDIXLSLinkColumn ModuleMaterialCode { ValueType: String }
+        EDIXLSLinkColumn PanelMaterialCode { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl
new file mode 100644
index 0000000..e539ed2
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CARRC_Import.qbl
@@ -0,0 +1,49 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CARRC_Import
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Destination Destination13
+  {
+    EDIMLTable CapacityAllocationResultsRuleConfiguration
+    {
+      PrimaryKeyColumns: ModuleMaterialCode
+      PrimaryKeyColumns: PanelMaterialCode
+      PrimaryKeyColumns: StockingPointID
+      TargetType: CapacityAllocationResultsRuleConfiguration
+      TypeIndex: CapacityAllocationResultsRuleConfigurationTypeIndex
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation12
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResultsRuleCo
+      OutputTable: CapacityAllocationResultsRuleConfiguration
+      EDIColumnMatch { InputColumn: Division OutputColumn: Division }
+      EDIColumnMatch { InputColumn: ModuleMaterialCode OutputColumn: ModuleMaterialCode }
+      EDIColumnMatch { InputColumn: PanelMaterialCode OutputColumn: PanelMaterialCode }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+    }
+  }
+  EDIXLSLink.Source Source12
+  {
+    FileName: '浜ц兘鍒嗛厤缁撴灉瑙勫垯.xlsx'
+    EDIXLSLinkTable CapacityAllocationResultsRuleCo
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Division { ValueType: String }
+        EDIXLSLinkColumn ModuleMaterialCode { ValueType: String }
+        EDIXLSLinkColumn PanelMaterialCode { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl b/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl
new file mode 100644
index 0000000..571fce9
--- /dev/null
+++ b/_Main/BL/EDI/Broker_GlobalOTDTable_CAR_Export.qbl
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker GlobalOTDTable_CAR_Export
+{
+  MDSDefinition: GlobalOTDTable
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Source Source13
+  {
+    EDIMLTable CapacityAllocationResults
+    {
+      TargetType: CapacityAllocationResults
+      EDIMLColumn Date { Attribute: Date ValueType: Date }
+      EDIMLColumn Description { Attribute: Description ValueType: String }
+      EDIMLColumn Division { Attribute: Division ValueType: String }
+      EDIMLColumn ID { Attribute: ID ValueType: String }
+      EDIMLColumn ManufacturedDate { Attribute: ManufacturedDate ValueType: Date }
+      EDIMLColumn ModuleBase { Attribute: ModuleBase ValueType: String }
+      EDIMLColumn ModuleMaterialCode { Attribute: ModuleMaterialCode ValueType: String }
+      EDIMLColumn ModuleMeasurementUnit { Attribute: ModuleMeasurementUnit ValueType: String }
+      EDIMLColumn NumberOfModules { Attribute: NumberOfModules ValueType: Real }
+      EDIMLColumn NumberOfPanels { Attribute: NumberOfPanels ValueType: Real }
+      EDIMLColumn PanelBase { Attribute: PanelBase ValueType: String }
+      EDIMLColumn PanelMaterialCode { Attribute: PanelMaterialCode ValueType: String }
+      EDIMLColumn PanelMeasurementUnit { Attribute: PanelMeasurementUnit ValueType: String }
+      EDIMLColumn ProductID { Attribute: ProductID ValueType: String }
+      EDIMLColumn RequirementDate { Attribute: RequirementDate ValueType: Date }
+      EDIMLColumn StockingPointID { Attribute: StockingPointID ValueType: String }
+      EDIMLColumn UserQuantity { Attribute: UserQuantity ValueType: Real }
+      EDIMLColumn VersionNumber { Attribute: VersionNumber ValueType: String }
+    }
+  }
+  EDITransformation.Transformation Transformation13
+  {
+    EDITableTransformation
+    {
+      InputTable: CapacityAllocationResults
+      OutputTable: CapacityAllocationResults
+      EDIColumnMatch { InputColumn: Date OutputColumn: Date }
+      EDIColumnMatch { InputColumn: Description OutputColumn: Description }
+      EDIColumnMatch { InputColumn: ID OutputColumn: ID }
+      EDIColumnMatch { InputColumn: ManufacturedDate OutputColumn: ManufacturedDate }
+      EDIColumnMatch { InputColumn: ProductID OutputColumn: ProductID }
+      EDIColumnMatch { InputColumn: StockingPointID OutputColumn: StockingPointID }
+      EDIColumnMatch { InputColumn: UserQuantity OutputColumn: UserQuantity }
+    }
+  }
+  EDIXLSLink.Destination Destination14
+  {
+    FileName: 'Destination14'
+    EDIXLSLinkTable CapacityAllocationResults
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn Date { ValueType: Date }
+        EDIXLSLinkColumn Description { ValueType: String }
+        EDIXLSLinkColumn ID { ValueType: String }
+        EDIXLSLinkColumn ProductID { ValueType: String }
+        EDIXLSLinkColumn StockingPointID { ValueType: String }
+        EDIXLSLinkColumn UserQuantity { ValueType: Real }
+        EDIXLSLinkColumn ManufacturedDate { ValueType: Date }
+      ]
+    }
+  }
+}
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/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index 952d7d5..aa2917b 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -10,4 +10,8 @@
   {
     DefaultText: 'Please input validate value !'
   }
-}
\ No newline at end of file
+  InfoMessage PriorityFactor_CheckNameValid
+  {
+    DefaultText: '璇ヤ紭鍏堢骇鍥犲瓙鍚嶇О宸插瓨鍦紒'
+  }
+}
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_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl
new file mode 100644
index 0000000..744cd1a
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_CapacityAllocationResult.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAllocationResultsRuleConfiguration_CapacityAllocationResults_CapacityAllocationResults_CapacityAllocationResultsRuleConfiguration
+{
+  #keys: '1[414702.0.387791788]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide CapacityAllocationResults
+  {
+    #keys: '3[414702.0.387791790][414702.0.387791789][414702.0.387791791]'
+    Cardinality: '1toN'
+    ObjectDefinition: CapacityAllocationResultsRuleConfiguration
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAllocationResultsRuleConfiguration
+  {
+    #keys: '3[414702.0.387791793][414702.0.387791792][414702.0.387791794]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAllocationResults
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_GlobalOTDTable_GlobalOTD.qbl b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_GlobalOTDTable_GlobalOTD.qbl
new file mode 100644
index 0000000..40be5f9
--- /dev/null
+++ b/_Main/BL/Relations/Relation_CapacityAllocationResultsRuleConfiguration_GlobalOTDTable_GlobalOTD.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation CapacityAllocationResultsRuleConfiguration_GlobalOTDTable_GlobalOTDTable_CapacityAllocationResultsRuleConfiguration
+{
+  #keys: '1[414702.0.374991408]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide GlobalOTDTable
+  {
+    #keys: '3[414702.0.374991410][414702.0.374991409][414702.0.374991411]'
+    Cardinality: '0to1'
+    ObjectDefinition: CapacityAllocationResultsRuleConfiguration
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CapacityAllocationResultsRuleConfiguration
+  {
+    #keys: '3[414702.0.374991413][414702.0.374991412][414702.0.374991414]'
+    Cardinality: '1toN'
+    ObjectDefinition: GlobalOTDTable
+    OwningSide: 'Owned'
+  }
+}
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_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl b/_Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl
new file mode 100644
index 0000000..6a5b131
--- /dev/null
+++ b/_Main/BL/Relations/Relation_H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation H_CustomOrder_MacroPlan_MacroPlan_H_CustomOrder
+{
+  #keys: '1[414724.0.177854649]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[414724.0.177854651][414724.0.177854650][414724.0.177854652]'
+    Cardinality: '0to1'
+    ObjectDefinition: H_CustomOrder
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide H_CustomOrder
+  {
+    #keys: '3[414724.0.177854654][414724.0.177854653][414724.0.177854655]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_H_MaterialInfo_MacroPlan_MacroPlan_H_MaterialInfo.qbl b/_Main/BL/Relations/Relation_H_MaterialInfo_MacroPlan_MacroPlan_H_MaterialInfo.qbl
new file mode 100644
index 0000000..075c195
--- /dev/null
+++ b/_Main/BL/Relations/Relation_H_MaterialInfo_MacroPlan_MacroPlan_H_MaterialInfo.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation H_MaterialInfo_MacroPlan_MacroPlan_H_MaterialInfo
+{
+  #keys: '1[414724.0.142347478]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[414724.0.142347480][414724.0.142347479][414724.0.142347481]'
+    Cardinality: '0to1'
+    ObjectDefinition: H_MaterialInfo
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide H_MaterialInfo
+  {
+    #keys: '3[414724.0.142347483][414724.0.142347482][414724.0.142347484]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_OrganCode_BusinessType_BusinessType_OrganCode.qbl b/_Main/BL/Relations/Relation_OrganCode_BusinessType_BusinessType_OrganCode.qbl
new file mode 100644
index 0000000..53c42ae
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OrganCode_BusinessType_BusinessType_OrganCode.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OrganCode_BusinessType_BusinessType_OrganCode
+{
+  #keys: '1[412960.0.276650038]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide BusinessType
+  {
+    #keys: '3[412960.0.276650040][412960.0.276650039][412960.0.276650041]'
+    Cardinality: '0to1'
+    ObjectDefinition: OrganCode
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OrganCode
+  {
+    #keys: '3[412960.0.276650043][412960.0.276650042][412960.0.276650044]'
+    Cardinality: '1toN'
+    ObjectDefinition: BusinessType
+    OwningSide: 'Owned'
+  }
+}
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_BaseConversionFactor/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_BaseConversionFactor/StaticMethod_CreateOrUpdate.qbl
index 4ecdf63..cd44e09 100644
--- a/_Main/BL/Type_BaseConversionFactor/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_BaseConversionFactor/StaticMethod_CreateOrUpdate.qbl
@@ -19,19 +19,22 @@
     result := null(ConversionFactor );
     
     if( isnull( source ) or isnull( target ) ) {
-        error( "can't find source or target unit of measure" )
+        info(  "can't find source or target unit of measure" )
     }
-    if( productId <> "" ) {
+    
+    if( not isnull( source) and not isnull( target)){
+      if( productId <> "" ) {
         product := Product_MP::FindById( macroPlan, productId );
-    }else{
-      result := BaseConversionFactor::CreateUpdate( source, target, factor, product, isEnable )
+      }else{
+        result := BaseConversionFactor::CreateUpdate( source, target, factor, product, isEnable )
       }
     
-    if( isnull( product ) ) {
-          info( "invalid product id" )  
+      if( isnull( product ) ) {
+          info( "鍗曚綅杞崲鍑虹幇鏃犳晥id锛�"+productId )  
         }else{
           result := BaseConversionFactor::CreateUpdate( source, target, factor, product, isEnable );
         }
+    }
     
     return result;
   *]
diff --git a/_Main/BL/Type_BusinessType/Attribute_BusinessTypeName.qbl b/_Main/BL/Type_BusinessType/Attribute_BusinessTypeName.qbl
index f2fb6a3..44f63a3 100644
--- a/_Main/BL/Type_BusinessType/Attribute_BusinessTypeName.qbl
+++ b/_Main/BL/Type_BusinessType/Attribute_BusinessTypeName.qbl
@@ -3,5 +3,6 @@
 Attribute BusinessTypeName
 {
   #keys: '3[414382.0.361554811][414382.0.361554810][414382.0.361554812]'
+  Description: '浜嬩笟閮ㄥ悕绉�'
   ValueType: String
 }
diff --git a/_Main/BL/Type_BusinessType/Attribute_DisplayType.qbl b/_Main/BL/Type_BusinessType/Attribute_DisplayType.qbl
new file mode 100644
index 0000000..72577fd
--- /dev/null
+++ b/_Main/BL/Type_BusinessType/Attribute_DisplayType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DisplayType
+{
+  #keys: '3[412960.0.276650024][412960.0.276650023][412960.0.276650025]'
+  Description: '鏄剧ず绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_BusinessType/Attribute_ScenarioName.qbl b/_Main/BL/Type_BusinessType/Attribute_ScenarioName.qbl
new file mode 100644
index 0000000..bf93bb5
--- /dev/null
+++ b/_Main/BL/Type_BusinessType/Attribute_ScenarioName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ScenarioName
+{
+  #keys: '3[412960.0.276650011][412960.0.276650010][412960.0.276650012]'
+  Description: '鍦烘櫙鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_BusinessType/StaticMethod_CreateData.qbl b/_Main/BL/Type_BusinessType/StaticMethod_CreateData.qbl
index 0606111..f82bfcb 100644
--- a/_Main/BL/Type_BusinessType/StaticMethod_CreateData.qbl
+++ b/_Main/BL/Type_BusinessType/StaticMethod_CreateData.qbl
@@ -2,6 +2,7 @@
 #parent: #root
 StaticMethod CreateData (
   GlobalOTDTable owner,
+  MacroPlan macroPlan,
   String businessName
 )
 {
diff --git a/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl b/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl
deleted file mode 100644
index eb62f70..0000000
--- a/_Main/BL/Type_BusinessType/StaticMethod_GetBusinessNameStr.qbl
+++ /dev/null
@@ -1,32 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod GetBusinessNameStr (
-  GlobalOTDTable owner
-) as String
-{
-  TextBody:
-  [*
-    // NBoTk Sep-7-2023 (created)
-    
-    // 鑾峰彇businessType 闆嗗悎
-    result := "";
-    businessTypeList := construct( structured[String]);
-    
-    traverse( owner,BusinessType,b)
-    {
-        businessTypeList.Add( b.BusinessTypeName()); 
-    }
-    
-    // 濡傛灉瀛樺湪businessType鏁版嵁 鍒欒繑鍥� : a,b,c
-    
-    if( not isnull( businessTypeList ) )
-    {
-        result := businessTypeList.Concatenate( ";" );
-    }
-    
-    // 娴嬭瘯鏁版嵁
-    result := "闆嗗洟闈㈡澘;涓撲笟鏄剧ず浜嬩笟閮�;澶栧崠CELL;闈炴樉;杩愬姩鍋ュ悍;杩愬姩鍋ュ悍浜嬩笟閮�;鎵嬫満浜嬩笟閮�;鐗圭鏄剧ず;姹借溅鐢靛瓙浜嬩笟閮�;杞﹁浇鏄剧ず浜嬩笟閮�;IT浜嬩笟閮�";
-    
-    return result;
-  *]
-}
diff --git a/_Main/BL/Type_BusinessType/StaticMethod_GetScenarioNamesStr.qbl b/_Main/BL/Type_BusinessType/StaticMethod_GetScenarioNamesStr.qbl
new file mode 100644
index 0000000..130ee5a
--- /dev/null
+++ b/_Main/BL/Type_BusinessType/StaticMethod_GetScenarioNamesStr.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetScenarioNamesStr (
+  GlobalOTDTable owner
+) as String
+{
+  TextBody:
+  [*
+    // NBoTk Sep-7-2023 (created)
+    // 鑾峰彇businessType 闆嗗悎
+    result := "";
+    scenarioNameList := construct( structured[String]);
+    
+    traverse( owner,BusinessType,b)
+    {
+        scenarioNameList.Add( b.ScenarioName() ); 
+    }
+    
+    // 濡傛灉瀛樺湪businessType鏁版嵁 鍒欒繑鍥� : a,b,c
+    
+    if( not isnull( scenarioNameList ) )
+    {
+        result := scenarioNameList.Concatenate( ";" );
+    }
+    
+    // 娴嬭瘯鏁版嵁
+    //result := "闆嗗洟闈㈡澘;涓撲笟鏄剧ず浜嬩笟閮�;澶栧崠CELL;闈炴樉;杩愬姩鍋ュ悍;杩愬姩鍋ュ悍浜嬩笟閮�;鎵嬫満浜嬩笟閮�;鐗圭鏄剧ず;姹借溅鐢靛瓙浜嬩笟閮�;杞﹁浇鏄剧ず浜嬩笟閮�;IT浜嬩笟閮�";
+    
+    return result;
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl
new file mode 100644
index 0000000..a158e2b
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_Date.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Date
+{
+  #keys: '3[414702.0.388471426][414702.0.388471425][414702.0.388471427]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl
new file mode 100644
index 0000000..4d7f093
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_Description.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Description
+{
+  #keys: '3[414702.0.388471436][414702.0.388471435][414702.0.388471437]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl
new file mode 100644
index 0000000..3a52d76
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[414702.0.388471446][414702.0.388471445][414702.0.388471447]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl
new file mode 100644
index 0000000..15ee01f
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ManufacturedDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ManufacturedDate
+{
+  #keys: '3[414702.0.388471486][414702.0.388471485][414702.0.388471487]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl
new file mode 100644
index 0000000..ca7c6e4
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_ProductID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductID
+{
+  #keys: '3[414702.0.388471456][414702.0.388471455][414702.0.388471457]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..2a28f0d
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_StockingPointID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414702.0.388471466][414702.0.388471465][414702.0.388471467]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl b/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl
new file mode 100644
index 0000000..9c3d31c
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/Attribute_UserQuantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UserQuantity
+{
+  #keys: '3[414702.0.388471476][414702.0.388471475][414702.0.388471477]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl b/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl
new file mode 100644
index 0000000..59c9af0
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/DeclarativeReferenceRelation_CalcCapacityAllocationResultsRuleConfiguration.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+DeclarativeReferenceRelation CalcCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '1[414702.0.388304510]'
+  Expression:
+  [*
+    targetCapacityAllocationResultsRuleConfiguration := select( this.GlobalOTDTable(), CapacityAllocationResultsRuleConfiguration, tempCARRC, 
+                                                                tempCARRC.ModuleMaterialCode() = this.ModuleMaterialCode() and
+                                                                tempCARRC.PanelMaterialCode() = this.PanelMaterialCode() );
+    
+    return targetCapacityAllocationResultsRuleConfiguration;
+  *]
+  Relation: CapacityAllocationResultsRuleConfiguration
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
index ef9782f..2340157 100644
--- a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_CreateDate.qbl
@@ -2,27 +2,32 @@
 #parent: #root
 StaticMethod CreateDate (
   GlobalOTDTable globalOTDTable,
-  MacroPlan macroPlan
+  MacroPlan macroPlan,
+  Scenario scenario
 )
 {
   TextBody:
   [*
     globalOTDTable.CapacityAllocationResults( relflush );
     
-    finaleProduct_MPs := CapacityAllocationResults::ObtainTheFinalOutputProduct( macroPlan );
+    finaleProductInStockingPoint_MPs := CapacityAllocationResults::ObtainTheFinalOutputProduct( macroPlan, globalOTDTable );
     
     period_MPS := null( Period_MPs );
     traverse ( macroPlan, PeriodSpecification_MP, psmp, psmp.ID() = "Planning periods" ) {
       period_MPS := selectsortedset( psmp, PeriodSpecificationPeriod.Period_MP, pmp, not pmp.IsHistorical(), pmp.StartDate() );
     }
     
-    traverse ( finaleProduct_MPs, Elements, fpmp/*, fpmp.ID() = "ProXOver 1 D2.6 A"*/ ) {
-      traverse ( fpmp, ProductInStockingPoint_MP, pisp, /*pisp.Name() = "ProXOver 1 D2.6 A in Finished Cars (France)" and*/ not pisp.IsSystem() ) {
-        traverse ( period_MPS, Elements, pmp ) {     
-          CapacityAllocationResults::IterativeGeneration( globalOTDTable, pisp, 1, null( NewSupply ), -1.0, pmp.StartDate() );
-        }
-    //    info( pisp.Name() );
+    traverse ( finaleProductInStockingPoint_MPs, Elements, fpispmp ) {
+      capacityAllocationResultsRuleConfigurations := selectset( globalOTDTable, CapacityAllocationResultsRuleConfiguration, tempCARRC, tempCARRC.ModuleMaterialCode() = fpispmp.ProductID() and tempCARRC.StockingPointID() = fpispmp.StockingPointID() );
+    //  info( "鐢熶骇鐨勪骇鍝侊細", fpispmp.ProductID(), "------浜у搧鍦ㄥ簱瀛樼偣-------锛�", fpispmp.StockingPointID() );
+      traverse ( period_MPS, Elements, pmp ) {     
+        // CapacityAllocationResults::IterativeGeneration( globalOTDTable, pisp, 1, null( NewSupply ), -1.0, pmp.StartDate() ); 鑰佺増
+        CapacityAllocationResults::IterativeGeneration2( globalOTDTable, fpispmp, pmp.StartDate(), capacityAllocationResultsRuleConfigurations, 0, null( NewSupply ), 0.0 );
       }
     }
+    
+    traverse ( globalOTDTable, CapacityAllocationResults, car ) {
+      car.VersionNumber( scenario.Name() );
+    }
   *]
 }
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl
new file mode 100644
index 0000000..14045dd
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_Export.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  GlobalOTDTable globalOTDTable
+) as BinaryValue
+{
+  TextBody:
+  [*
+    binaryData := globalOTDTable.GlobalOTDTable_CAR_Export().ExecuteToXLS( true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl
new file mode 100644
index 0000000..226f832
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_IterativeGeneration2.qbl
@@ -0,0 +1,113 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IterativeGeneration2 (
+  GlobalOTDTable globalOTDTable,
+  ProductInStockingPoint_MP pisp,
+  Date targetDate,
+  CapacityAllocationResultsRuleConfigurations carrcs,
+  Number numberOfLayers,
+  NewSupply firstLevelSupply,
+  Real currentLayerDependentDemandQuantity
+)
+{
+  TextBody:
+  [*
+    numberOfLayers++;
+    //info( "鐩爣鏃堕棿锛�", targetDate.Format( "Y-M2-D2" ) );
+    //info( pisp.Name() );
+    traverse ( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispippl, pispippl.Start().Date() = targetDate ) {
+      //info( "鏄惁鏈変緵搴旓細", pispippl.NewSupply( relsize ) > 0, "    搴撳瓨锛�", pispippl.InventoryLevelEnd() );
+      if ( numberOfLayers <> 1 and pispippl.NewSupply( relsize ) = 0 ) {
+        previous := pispippl.PreviousPlanningPISPIP().astype( ProductInStockingPointInPeriodPlanningLeaf );
+        if ( not previous.Period_MP().IsHistorical() ) {
+          previousDate := previous.Start().Date();
+          CapacityAllocationResults::IterativeGeneration2( globalOTDTable,
+                                                           pisp,
+                                                           previousDate,
+                                                           carrcs,
+                                                           numberOfLayers,
+                                                           firstLevelSupply,
+                                                           currentLayerDependentDemandQuantity
+                                                          );
+        }
+      } 
+      
+      traverse ( pispippl, NewSupply, ns, ns.Quantity() > 0 ) {
+        if ( numberOfLayers = 1 ) {
+          firstLevelSupply := ns;
+        }
+        
+        ontype( ns.PeriodTask_MP() ) {
+          PeriodTaskOperation as pto : {
+    //        info( "Operation鍛ㄦ湡浠诲姟..." );     
+            traverse ( ns, PeriodTask_MP.astype( PeriodTaskOperation ).DependentDemand, dd, dd.Quantity() > 0 ) {
+              if ( numberOfLayers = 1 ) {
+                currentLayerDependentDemandQuantity := ns.Quantity();
+              }
+              currentLayerDependentDemandQuantity := currentLayerDependentDemandQuantity                     * 
+                                                     ns.ProcessOutput().astype( OperationOutput ).Quantity() *
+                                                     dd.ProcessInput().astype( OperationInput ).Quantity();
+    //          info( "灞傛暟锛�", numberOfLayers, "    褰撳墠渚涘簲鐨刾isp锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    鎬讳緵搴斿�硷細", ns.Quantity(), "    闇�瑕佷緵搴斿�硷細", currentLayerDependentDemandQuantity,
+    //                "    褰撳墠闇�姹俻isp锛�", dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    闇�姹傚�硷細", currentLayerDependentDemandQuantity );
+    //          info( "-----------------------------------------------------------------------------------------------------------------" );
+              CapacityAllocationResults::IterativeGeneration2( globalOTDTable,
+                                                               dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(),
+                                                               targetDate,
+                                                               carrcs,
+                                                               numberOfLayers,
+                                                               firstLevelSupply,
+                                                               currentLayerDependentDemandQuantity
+                                                              );
+            }
+            carrc := select( carrcs, Elements, carrc, carrc.PanelMaterialCode() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() );
+            if ( not isnull( carrc ) ) {
+    //          info( "鎵惧埌闈㈡澘鐗╂枡..." );
+              globalOTDTable.CapacityAllocationResults( relnew,
+                                                        PanelBase             := pto.Operation().UnitID(),
+                                                        PanelMaterialCode     := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        NumberOfPanels        := currentLayerDependentDemandQuantity,
+                                                        PanelMeasurementUnit  := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(),
+                                                        ModuleMaterialCode    := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        NumberOfModules       := firstLevelSupply.Quantity(),
+                                                        ModuleMeasurementUnit := firstLevelSupply.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().UnitOfMeasureName(),
+                                                        ModuleBase            := guard( firstLevelSupply.PeriodTask_MP().astype( PeriodTaskOperation ).Operation().UnitID(), "杞﹂亾杩愯緭" ),
+                                                        Division              := carrc.Division(),
+                                                        RequirementDate       := firstLevelSupply.Start().Date(),
+                                                        Date                  := firstLevelSupply.Start().Date(),
+                                                        Description           := "",
+                                                        ID                    := OS::GenerateGUIDAsString(),
+                                                        ProductID             := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(),
+                                                        StockingPointID       := ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().StockingPointID(),
+                                                        UserQuantity          := currentLayerDependentDemandQuantity,
+                                                        ManufacturedDate      := Date::MinDate()
+                                                       );
+                                                        
+            }
+            //info( "-----------------------------------------------------------------------------------------------------------------" );
+          }
+          
+          PeriodTaskLaneLeg as ptll : {
+            targetDependentDemand := select( ptll, DependentDemand, dd, dd.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() );
+            currentLayerDependentDemandQuantity := ifexpr( numberOfLayers = 1, targetDependentDemand.Quantity(), currentLayerDependentDemandQuantity );
+    //        info( "灞傛暟锛�", numberOfLayers,"    褰撳墠渚涘簲鐨刾isp锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    鎬讳緵搴斿�硷細", ns.Quantity(), "    闇�瑕佷緵搴斿�硷細", currentLayerDependentDemandQuantity,
+    //              "    褰撳墠闇�姹俻isp锛�", targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().Name(), "    闇�姹傚�硷細", currentLayerDependentDemandQuantity );
+    //        info( "LaneLeg鍛ㄦ湡浠诲姟..." );
+            //info( "-----------------------------------------------------------------------------------------------------------------" );
+            CapacityAllocationResults::IterativeGeneration2( globalOTDTable,
+                                                             targetDependentDemand.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP(),
+                                                             targetDate,
+                                                             carrcs,
+                                                             numberOfLayers,
+                                                             firstLevelSupply,
+                                                             currentLayerDependentDemandQuantity
+                                                            );
+          }
+        }
+        
+        if ( numberOfLayers = 1 ) {
+          firstLevelSupply := null( NewSupply );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_ObtainTheFinalOutputProduct.qbl b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_ObtainTheFinalOutputProduct.qbl
index 0db5a04..6501563 100644
--- a/_Main/BL/Type_CapacityAllocationResults/StaticMethod_ObtainTheFinalOutputProduct.qbl
+++ b/_Main/BL/Type_CapacityAllocationResults/StaticMethod_ObtainTheFinalOutputProduct.qbl
@@ -1,25 +1,30 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod ObtainTheFinalOutputProduct (
-  MacroPlan macroPlan
-) as owning Product_MPs
+  MacroPlan macroPlan,
+  GlobalOTDTable globalOTDTable
+) as owning ProductInStockingPoint_MPs
 {
   TextBody:
   [*
-    finaleProducts := construct( Product_MPs );
+    //finaleProducts := construct( Product_MPs );
+    //
+    //traverse ( macroPlan, Product_MP, pmp, pmp.IsLeaf() ) {
+    //  flag := true;
+    //  traverse ( macroPlan, Routing.RoutingStep.Operation.OperationInput, oi, flag ) {
+    //    if ( pmp = oi.ProductInStockingPoint_MP().Product_MP() ) {
+    //      flag := false;
+    //    }
+    //  }
+    //  if ( flag ) {
+    //    finaleProducts.Add( pmp );
+    //  }
+    //}
     
-    traverse ( macroPlan, Product_MP, pmp, pmp.IsLeaf() ) {
-      flag := true;
-      traverse ( macroPlan, Routing.RoutingStep.Operation.OperationInput, oi, flag ) {
-        if ( pmp = oi.ProductInStockingPoint_MP().Product_MP() ) {
-          flag := false;
-        }
-      }
-      if ( flag ) {
-        finaleProducts.Add( pmp );
-      }
-    }
+    finaleProductInStockingPoint_MPs := selectset( macroPlan, Product_MP.ProductInStockingPoint_MP, tempPISPMP, 
+                                                   exists( globalOTDTable, CapacityAllocationResultsRuleConfiguration, tempCARRC, tempCARRC.ModuleMaterialCode() = tempPISPMP.ProductID() and tempCARRC.StockingPointID() = tempPISPMP.StockingPointID() )
+                                                  );
     
-    return &finaleProducts;
+    return &finaleProductInStockingPoint_MPs;
   *]
 }
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_Division.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_Division.qbl
new file mode 100644
index 0000000..2b0b5c3
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_Division.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Division
+{
+  #keys: '3[414702.0.374991447][414702.0.374991446][414702.0.374991448]'
+  Description: '浜嬩笟閮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl
new file mode 100644
index 0000000..ca60799
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_ModuleMaterialCode.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ModuleMaterialCode
+{
+  #keys: '3[414702.0.374991437][414702.0.374991436][414702.0.374991438]'
+  Description: '妯$粍鐗╂枡缂栫爜'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl
new file mode 100644
index 0000000..02037a2
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_PanelMaterialCode.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute PanelMaterialCode
+{
+  #keys: '3[414702.0.374991427][414702.0.374991426][414702.0.374991428]'
+  Description: '闈㈡澘鐗╂枡缂栫爜'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..fb82a94
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/Attribute_StockingPointID.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414702.0.375010145][414702.0.375010144][414702.0.375010146]'
+  Description: '妯$粍浜ф垚鍝佸簱瀛樼偣ID'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl
new file mode 100644
index 0000000..4397413
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Export.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  GlobalOTDTable globalOTDTable
+) as BinaryValue
+{
+  TextBody:
+  [*
+    // hongjli Sep-25-2023 (created)
+    binaryValue := globalOTDTable.GlobalOTDTable_CARRC_Export().ExecuteToXLS( true ).AsBinaryValue();
+    
+    return binaryValue;
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl
new file mode 100644
index 0000000..a4eddc6
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/StaticMethod_Import.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  GlobalOTDTable globalOTDTable,
+  String base64String
+)
+{
+  TextBody:
+  [*
+    binaryData := BinaryData::FromBase64EncodedString( base64String );
+    
+    globalOTDTable.GlobalOTDTable_CARRC_Import().ExecuteFromXLS( &binaryData, true );
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl
new file mode 100644
index 0000000..ea74562
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/TypeIndex_CapacityAllocationResultsRuleConfigurationTypeIndex.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex CapacityAllocationResultsRuleConfigurationTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ModuleMaterialCode
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: PanelMaterialCode
+    }
+    TypeIndexAttribute
+    {
+      ModelElement: StockingPointID
+    }
+  ]
+}
diff --git a/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/_ROOT_Type_CapacityAllocationResultsRuleConfiguration.qbl b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/_ROOT_Type_CapacityAllocationResultsRuleConfiguration.qbl
new file mode 100644
index 0000000..7e012c9
--- /dev/null
+++ b/_Main/BL/Type_CapacityAllocationResultsRuleConfiguration/_ROOT_Type_CapacityAllocationResultsRuleConfiguration.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type CapacityAllocationResultsRuleConfiguration
+{
+  #keys: '5[414702.0.374991403][414702.0.374991401][0.0.0][414702.0.374991402][414702.0.374991404]'
+  BaseType: Object
+  Description: '浜ц兘鍒嗛厤缁撴灉锛岃鍒欓厤缃�'
+  StructuredName: 'CapacityAllocationResultsRuleConfigurations'
+}
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 822bde4..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: '鍒濆鍖栧勾浠�'
@@ -10,7 +10,7 @@
     // yypsybs Sep-15-2023 (created)
     existList := selectuniquevalues( parent, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
     nowYear := Date::Today().Year();
-    for( i := nowYear - 10; i <= nowYear; i++ ) {
+    for( i := nowYear - 10; i <= nowYear + 5; i++ ) {
       if( existList.Find( i ) = -1 ) {
         parent.CapacityAndSaleBudgeFilterYear( relnew, 
                                                YearNo := i );
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_OrderTag.qbl b/_Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl
new file mode 100644
index 0000000..4d3e7e6
--- /dev/null
+++ b/_Main/BL/Type_CustomerOrder/Attribute_OrderTag.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrderTag
+{
+  #keys: '3[414724.0.177854629][414724.0.177854628][414724.0.177854630]'
+  Description: '璁㈠崟鐘舵�侊紝鍐插噺鍚庤祴鍊硷紝绾娴�,鏈夐娴嬶紝鏃犻娴嬶紝鍙嶇锛屾巿鏉�'
+  ValueType: String
+}
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_CustomerOrder/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
index e885859..1728622 100644
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_CustomerOrder/StaticMethod_CreateOrUpdate.qbl
@@ -38,33 +38,58 @@
     }
     // 妫�鏌ヤ緷璧栭」
     if( isnull( product) ) {
-        info( "product not found" );  
+        info( "product not found" + productId);  
     }
     if( isnull( salesSegment) ) {
-        info( "sales segment not found" );  
+        info( "sales segment not found" + salesSegmentName);  
     }
     if( isnull( stockingPoint) ) {
-        info( "stock point not found" );  
+        info( "stock point not found" + stockingPointId);  
     }
     //if( isnull( currency) ) {
     //    error( "currency not found" );  
     //}
     if( unitOfMeasureName <> "" and isnull( unitOfMeasure) ) {
-        info( "unit of measure not found" );  
+        info( "unit of measure not found" + unitOfMeasureName);  
     }
-    if( priorityName <> "" and isnull( stockingPoint) ) {
-        info( "priority not found" );  
-    }
+    //if( priorityName <> "" and isnull( stockingPoint) ) {
+    //    info( "priority not found" );  
+    //}
     // 鏂板/鏇存柊
     result := CustomerOrder::FindById( macroPlan, id );
     if( isnull( result ) ) {
-        CustomerOrder::Create( product, stockingPoint, id, orderDate, quantity, price, 
+        result := CustomerOrder::Create( product, stockingPoint, id, orderDate, quantity, price, 
                                priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
                                false, customerName, customerId, orderId, orderLineId, true, true, true );
     } else {
-        result.Update( product, stockingPoint, orderDate, quantity, price, 
-                       priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
-                       false, customerName, customerId, orderId, orderLineId, true, true, true );
+        if( result.ProductID() = productId 
+            and result.StockingPointID() = stockingPointId 
+            and result.StartDate() = orderDate 
+            and result.Quantity() = quantity 
+            and result.Price() = price 
+            and result.PriorityName() = priorityName 
+            and result.SalesSegmentName() = salesSegmentName 
+            and result.CurrencyID() = currencyId 
+            and result.UnitOfMeasureName() = unitOfMeasureName 
+            and result.CustomerName() = customerName 
+            and result.CustomerID() = customerId 
+            and result.OrderID() = orderId 
+            and result.OrderLineID() = orderLineId ){
+              info( "No need to update this order: " + id );
+              }else{
+                if( result.IsLocked() = true ){
+                  pispips := selectset( result, ProductInStockingPoint_MP.ProductInStockingPointInPeriod, pispip, true );
+                  pispipLeafs := selectset( pispips, 
+                                            Elements.astype( ProductInStockingPointInPeriodPlanningLeaf ), 
+                                            pispip, 
+                                            true );
+                  ProductInStockingPointInPeriod::LockUnlockPlanning( pispipLeafs, false, true );
+                }
+                result.Update( product, stockingPoint, orderDate, quantity, price, 
+                               priorityName, salesSegmentName, currencyId, unitOfMeasureName, 
+                               false, customerName, customerId, orderId, orderLineId, true, true, true );
+                result.IsLocked( false );
+                }
     }
     return result;
   *]
diff --git a/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl
index 170d328..4994e49 100644
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl
+++ b/_Main/BL/Type_CustomerOrder/StaticMethod_DoSync.qbl
@@ -3,7 +3,8 @@
 StaticMethod DoSync (
   MacroPlan macroPlan,
   Strings businessTypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   TextBody:
@@ -12,6 +13,6 @@
     //info( "Forecast Finished, Start CustomerOrder Data Broker" );
     //macroPlan.Broker_OTD_CustomerOrder().Execute();
     info( "CustomerOrder Data Broker Finished, Start CustomerOrder Mapping" );
-    macroPlan.MappingCustomerOrderData( businessTypes,globalOTDTable );
+    macroPlan.MappingCustomerOrderData( businessTypes,globalOTDTable, organcodelist );
   *]
 }
diff --git a/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl b/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
index 755761e..3126a57 100644
--- a/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
+++ b/_Main/BL/Type_CustomerOrder/StaticMethod_LockUnlock.qbl
@@ -20,7 +20,7 @@
         owner.OrderLockLog( relnew, 
                             CustomerName := order.CustomerName(), 
                             End := order.First().AsPlanningBaseSalesDemandInPeriod().End().Date(), 
-                            EndDate := order.EndDate(), 
+                            EndDate := order.StartDate(), 
                             IsLocked := order.IsLocked(), 
                             LastModify := order.LastModify(), 
                             LastModifyTime := order.LastModifyTime(), 
@@ -41,7 +41,7 @@
           owner.OrderLockLog( relnew, 
                               CustomerName := order.CustomerName(), 
                               End := order.First().AsPlanningBaseSalesDemandInPeriod().End().Date(), 
-                              EndDate := order.EndDate(), 
+                              EndDate := order.StartDate(), 
                               IsLocked := order.IsLocked(), 
                               LastModify := order.LastModify(), 
                               LastModifyTime := order.LastModifyTime(), 
diff --git a/_Main/BL/Type_FillingCapacityOrder/Attribute_CurrencyID.qbl b/_Main/BL/Type_FillingCapacityOrder/Attribute_CurrencyID.qbl
new file mode 100644
index 0000000..5a202bb
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/Attribute_CurrencyID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CurrencyID
+{
+  #keys: '3[414502.0.397320037][414502.0.397320036][414502.0.397320038]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/Attribute_ID.qbl b/_Main/BL/Type_FillingCapacityOrder/Attribute_ID.qbl
new file mode 100644
index 0000000..a15a6b3
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[414702.0.525344991][414702.0.525344990][414702.0.525344992]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/Attribute_OrderType.qbl b/_Main/BL/Type_FillingCapacityOrder/Attribute_OrderType.qbl
index da22dcc..29434aa 100644
--- a/_Main/BL/Type_FillingCapacityOrder/Attribute_OrderType.qbl
+++ b/_Main/BL/Type_FillingCapacityOrder/Attribute_OrderType.qbl
@@ -3,5 +3,6 @@
 Attribute OrderType
 {
   #keys: '3[414382.0.394820190][414382.0.394820189][414382.0.394820191]'
+  Description: '璁㈠崟绫诲瀷鍖呮嫭锛堝弽绛俱�佹巿鏉冿級'
   ValueType: String
 }
diff --git a/_Main/BL/Type_FillingCapacityOrder/Attribute_State.qbl b/_Main/BL/Type_FillingCapacityOrder/Attribute_State.qbl
new file mode 100644
index 0000000..fa630ba
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/Attribute_State.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute State
+{
+  #keys: '3[414702.0.533501330][414702.0.533501329][414702.0.533501331]'
+  Description: '鐘舵�侊紙鏈啿鍑忋�佸凡鍐插噺锛�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/Attribute_UnitOfMeasure_MPID.qbl b/_Main/BL/Type_FillingCapacityOrder/Attribute_UnitOfMeasure_MPID.qbl
new file mode 100644
index 0000000..938000c
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/Attribute_UnitOfMeasure_MPID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UnitOfMeasure_MPID
+{
+  #keys: '3[414502.0.397254634][414502.0.397254633][414502.0.397254635]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/StaticMethod_CreateCustomOrder.qbl b/_Main/BL/Type_FillingCapacityOrder/StaticMethod_CreateCustomOrder.qbl
new file mode 100644
index 0000000..c40a89b
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/StaticMethod_CreateCustomOrder.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateCustomOrder (
+  MacroPlan macroPlan,
+  FillingCapacityOrder fillingCapacityOrder,
+  Real quantity
+) as CustomerOrder
+{
+  TextBody:
+  [*
+    targetProduct_MP := select( macroPlan, Product_MP, tempPMP, tempPMP.ID() = fillingCapacityOrder.ProductID() );
+    targetStockingPoint_MP := select( macroPlan, StockingPoint_MP, tempSPMP, tempSPMP.ID() = fillingCapacityOrder.StockingPointID() );
+    
+    targetCustomerOrder := CustomerOrder::Create( targetProduct_MP,
+                                                  targetStockingPoint_MP,
+                                                  OS::GenerateGUIDAsString(),
+                                                  fillingCapacityOrder.OrderDate(),
+                                                  quantity,
+                                                  0.0,
+                                                  "Normal",
+                                                  fillingCapacityOrder.SalesSegmentName(),
+                                                  fillingCapacityOrder.CurrencyID(),
+                                                  fillingCapacityOrder.UnitOfMeasureName(),
+                                                  false,
+                                                  fillingCapacityOrder.Customer(),
+                                                  fillingCapacityOrder.CustomerID(),
+                                                  "",
+                                                  "",
+                                                  true,
+                                                  true,
+                                                  false
+                                                 );
+    
+    return targetCustomerOrder;
+  *]
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/StaticMethod_OrderOffset.qbl b/_Main/BL/Type_FillingCapacityOrder/StaticMethod_OrderOffset.qbl
new file mode 100644
index 0000000..9dfb713
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/StaticMethod_OrderOffset.qbl
@@ -0,0 +1,58 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OrderOffset (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    needOffsetFillingCapacityOrders := selectset( macroPlan, FillingCapacityOrder, tempFCO, tempFCO.State() = "鏈啿鍑�" or tempFCO.State() ="" );
+    
+    traverse ( needOffsetFillingCapacityOrders, Elements, fco, fco.Quantity() > 0 ) {
+      originalCounterSignedOrder := select( macroPlan, SalesDemand.astype( CustomerOrder ), tempCO, tempCO.CustomerName() = fco.Customer()  and 
+                                                                                                    tempCO.ProductID()    = fco.ProductID() and 
+                                                                                                    tempCO.OrderTag()     = "鍙嶇"
+                                           );
+      if ( fco.OrderType() = "鍙嶇" ) {
+        if ( isnull( originalCounterSignedOrder ) ) {
+          customerOrder := FillingCapacityOrder::CreateCustomOrder( macroPlan, fco, fco.Quantity() );
+          customerOrder.OrderTag( "鍙嶇" );
+        } else {
+          originalCounterSignedOrder.Quantity( originalCounterSignedOrder.Quantity() + fco.Quantity() );
+        }
+      } else if ( fco.OrderType() = "鎺堟潈" ) {
+        originalAuthorizedOrder := select( macroPlan, SalesDemand.astype( CustomerOrder ), tempCO, tempCO.CustomerName() = fco.Customer()  and 
+                                                                                                   tempCO.ProductID()    = fco.ProductID() and 
+                                                                                                   tempCO.OrderTag()     = "鎺堟潈"
+                                          );
+        if ( isnull( originalCounterSignedOrder ) ) {
+          if ( isnull( originalAuthorizedOrder ) ) {
+            customOrder := FillingCapacityOrder::CreateCustomOrder( macroPlan, fco, fco.Quantity() );
+            customOrder.OrderTag( "鎺堟潈" );
+          } else {
+            originalAuthorizedOrder.Quantity( originalAuthorizedOrder.Quantity() + fco.Quantity() );
+          }
+        } else {
+          numberOfReverseSignatures := originalCounterSignedOrder.Quantity();
+          newNumberOfAuthorizations := ifexpr( ( fco.Quantity() - numberOfReverseSignatures ) >= 0, fco.Quantity() - numberOfReverseSignatures, 0 );
+          numberOfReverseSignatures := ifexpr( ( fco.Quantity() - numberOfReverseSignatures ) >= 0, 0, numberOfReverseSignatures - fco.Quantity() );
+          
+          if ( numberOfReverseSignatures >= 0 ) {
+            originalCounterSignedOrder.Quantity( numberOfReverseSignatures );
+          } else {
+            originalCounterSignedOrder.Delete();
+          }
+          
+          if ( newNumberOfAuthorizations > 0 ) {
+            if ( isnull( originalAuthorizedOrder ) ) {
+              customerOrder := FillingCapacityOrder::CreateCustomOrder( macroPlan, fco, newNumberOfAuthorizations );
+              customerOrder.OrderTag( "鎺堟潈" );
+            } else {
+              originalAuthorizedOrder.Quantity( originalAuthorizedOrder.Quantity() + newNumberOfAuthorizations );
+            }
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FillingCapacityOrder/TypeIndex_FillingCapacityOrderTypeIndex.qbl b/_Main/BL/Type_FillingCapacityOrder/TypeIndex_FillingCapacityOrderTypeIndex.qbl
new file mode 100644
index 0000000..41296eb
--- /dev/null
+++ b/_Main/BL/Type_FillingCapacityOrder/TypeIndex_FillingCapacityOrderTypeIndex.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex FillingCapacityOrderTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ID
+    }
+  ]
+}
diff --git a/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
index 15c7113..3f0ea88 100644
--- a/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
+++ b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_CreateFillingCapacityOrderScheme.qbl
@@ -8,7 +8,7 @@
   TextBody:
   [*
     // NBoTk Sep-14-2023 (created)
-    
+    info('test' )
     fillingCapacityOrders := selectset( owner,FillingCapacityOrder,fillingOrder,
                                         not fillingOrder.IsFilling()
                                         );
@@ -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);
     
     
@@ -43,27 +42,35 @@
     {
       e.SchemeName(schemeName);
       e.IsFilling(true);
-      filllingCapacityOrderScheme.FillingCapacityOrder(relinsert, e);
     }
-    
-    // 鐗堟湰鍙�
-    verNoOrder := select( filllingCapacityOrderScheme,FillingCapacityOrder,o,
-                                 o.VerNo() <> ''
-                                 )
     
     // 闇�瑕佸皢閿�鍞鍗曞拰棰勫敭璁㈠崟鍚屾椂淇濆瓨鍒版柟妗堜腑
-    traverse( owner,CustomerAndForecastOrder,order)
-    {
-      
-         fillingOrder := owner.FillingCapacityOrder(relnew,BusinessType := order.BusinessType(),Customer := order.Customer(),CustomerID := order.CustomerID(),
-                                                                           DemandDate := order.DemandDate(),ForecastDemandDate := order.ForecastDemandDate(),IsFilling := true,
-                                                                           OrderType := '鎻愭媺',PanelBigSheetQuantity := order.PanelBigSheetQuantity(),ProductID := order.ProductID(),
-                                                                           Quantity := order.Quantity(),SalesSegmentName := order.SalesSegmentName(),SalesAmount := order.SalesAmount(),
-                                                                           SchemeName := schemeName,StockingPointID := order.StockingPointID(),UnitOfMeasureName := order.UnitOfMeasureName(),
-                                                                           VerNo := verNoOrder.VerNo()
-                                                                           );
-                                                                           
-        filllingCapacityOrderScheme.FillingCapacityOrder(relinsert, fillingOrder);
-    }
+    //traverse( owner,CustomerAndForecastOrder,order)
+    //{
+    //  
+    //     fillingOrder := owner.FillingCapacityOrder(relnew,BusinessType := order.BusinessType(),Customer := order.Customer(),CustomerID := order.CustomerID(),
+    //                                                                       DemandDate := order.DemandDate(),ForecastDemandDate := order.ForecastDemandDate(),IsFilling := true,
+    //                                                                       OrderType := '鎻愭媺',PanelBigSheetQuantity := order.PanelBigSheetQuantity(),ProductID := order.ProductID(),
+    //                                                                       Quantity := order.Quantity(),SalesSegmentName := order.SalesSegmentName(),SalesAmount := order.SalesAmount(),
+    //                                                                       SchemeName := schemeName,StockingPointID := order.StockingPointID(),UnitOfMeasureName := order.UnitOfMeasureName(),
+    //                                                                       VerNo := order.VerNo()
+    //                                                                       );
+    //                                                                       
+    //    filllingCapacityOrderScheme.FillingCapacityOrder(relinsert, fillingOrder);
+    //}
+    
+    //// 鏂板鍙嶇/鎺堟潈璁㈠崟 璁㈠崟淇℃伅鍔犲叆濉骇
+    //traverse( owner,H_Forecast,hf)
+    //{
+    //          fillingOrder := owner.FillingCapacityOrder(relnew,BusinessType := hf.Department(),Customer := hf.CustomName(),CustomerID := hf.CustomCode(),
+    //                                                                       DemandDate := Date::Today(),ForecastDemandDate := Date::Today(),IsFilling := true,
+    //                                                                       OrderType := '鎻愭媺',PanelBigSheetQuantity := 0,ProductID := '',
+    //                                                                       Quantity := hf.ForecastQty(),SalesSegmentName := '',SalesAmount := 0,
+    //                                                                       SchemeName := schemeName,StockingPointID := '',UnitOfMeasureName := hf.Util(),
+    //                                                                       VerNo := ''
+    //                                                                       );
+    //                                                                       
+    //    filllingCapacityOrderScheme.FillingCapacityOrder(relinsert, fillingOrder);
+    //}
   *]
 }
diff --git a/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_DeleteDetails.qbl b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_DeleteDetails.qbl
new file mode 100644
index 0000000..7eeebb0
--- /dev/null
+++ b/_Main/BL/Type_FilllingCapacityOrderScheme/StaticMethod_DeleteDetails.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DeleteDetails (
+  MacroPlan owner,
+  String schemeName
+)
+{
+  TextBody:
+  [*
+    // NBoTk Sep-25-2023 (created)
+    
+    details := selectset( owner,FillingCapacityOrder,f,true);
+    
+    traverse( details,Elements,e)
+    {
+      owner.FillingCapacityOrder(reldelete,e);
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Forecast/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_Forecast/StaticMethod_CreateOrUpdate.qbl
index a5c8eb8..ac5c1bb 100644
--- a/_Main/BL/Type_Forecast/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_Forecast/StaticMethod_CreateOrUpdate.qbl
@@ -33,23 +33,23 @@
     }
     // 妫�鏌ヤ緷璧栭」
     if( isnull( product ) ) {
-        error( "product not found" );  
+        info(  "product not found" + productId);  
     }
     if( isnull( salesSegment ) ) {
-        error( "sales segment not found" );  
+        info( "sales segment not found" + salesSegmentName);  
     }
     if( isnull( stockingPoint ) ) {
-        error( "stock point not found" );  
+        info( "stock point not found" + stockingPointId);  
     }
     if( isnull( currency ) ) {
-        error( "currency not found" );  
+        info(  "currency not found" + currencyId);  
     }
     if( unitOfMeasureName <> "" and isnull( unitOfMeasure) ) {
-        error( "unit of measure not found" );  
+        info( "unit of measure not found" + unitOfMeasureName );  
     }
-    if( priorityName <> "" and isnull( stockingPoint) ) {
-        error( "priority not found" );  
-    }
+    //if( priorityName <> "" and isnull( stockingPoint) ) {
+    //    info( "priority not found" );  
+    //}
     // 鏂板/鏇存柊
     result := Forecast::FindById( macroPlan, id );
     if( isnull( result) ) {
diff --git a/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl b/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl
index 1fdba27..e952521 100644
--- a/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl
+++ b/_Main/BL/Type_Forecast/StaticMethod_DoSync.qbl
@@ -3,7 +3,8 @@
 StaticMethod DoSync (
   MacroPlan macroPlan,
   Strings businessTypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   TextBody:
@@ -12,6 +13,6 @@
     //info( "OperationCost Finished, Start Forecast Data Broker" );
     //macroPlan.Broker_OTD_Forecast().Execute();
     info( "Forecast Data Broker Finished, Start Forecast Mapping" );
-    macroPlan.MappingForecastData( businessTypes,globalOTDTable );
+    macroPlan.MappingForecastData( businessTypes,globalOTDTable, organcodelist );
   *]
 }
diff --git "a/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl" "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
new file mode 100644
index 0000000..6afbad7
--- /dev/null
+++ "b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart\043156.qbl"
@@ -0,0 +1,301 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityAndSaleBudgeChart (
+  MacroPlans macroPlans,
+  String saleOrCapacity,
+  String groupBy,
+  String byBusinessTypeOrByOrgCode,
+  CapacityAndSaleBudgeFilterBusinessTypes businessTypes,
+  CapacityAndSaleBudgeFilterPlaceOfProductionOfArrays placeOfProductionOfArrays,
+  CapacityAndSaleBudgeFilterYears years,
+  CapacityAndSaleBudgeFilterMonths months,
+  MPSync mpSync,
+  GlobalOTDTable otdTable,
+  MacroPlan mappingParent
+)
+{
+  Description: '鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement'
+  TextBody:
+  [*
+    // yypsybs Sep-19-2023 (created)
+    // true, false
+    info( saleOrCapacity );
+    // 鏈�;瀛e害;鍗婂勾;骞�
+    info( groupBy );
+    // 闈㈡澘鍩哄湴;浜嬩笟閮�
+    info( byBusinessTypeOrByOrgCode );
+    traverse( businessTypes, Elements, businessType ) {
+      debuginfo( "businessType : " + businessType.BusinessType() );
+    }
+    traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
+      debuginfo( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
+    }
+    traverse( macroPlans, Elements, macroPlan ) {
+      debuginfo( "macroPlan : " + macroPlan.ScenarioName() );  
+    }
+    // 骞翠唤涓嶉�夋椂鍏ㄩ��
+    if( years.Size() = 0 ) {
+      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
+    }
+    traverse( years, Elements, year ) {
+      debuginfo( "yearNo : " + [String]year.YearNo() );
+    }
+    // 鏈堜唤涓嶉�夋椂鍏ㄩ��
+    if( months.Size() = 0 ) {
+      months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, true, item.MonthNo() );
+    }
+    traverse( months, Elements, month ) {
+      debuginfo( "monthNo : " + [String]month.MonthNo() );
+    }
+    
+    // ====娓呯悊鏃ф暟鎹�====
+    this.CapacityAndSaleBudgeChartRow( relflush );
+    this.CapacityAndSaleBudgeChartElement( relflush );
+    
+    // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
+    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
+    if( businessTypes.Size() > 0 ) {
+      businessTypeStrings := selectuniquevalues( businessTypes, Elements, item, true, item.BusinessType() );
+      historyData := selectset( historyData, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
+    }
+    if( placeOfProductionOfArrays.Size() > 0 ) {
+      placeOfProductionOfArrayStrings := selectuniquevalues( placeOfProductionOfArrays, Elements, item, true, item.PlaceOfProductionOfArray() );
+      historyData := selectset( historyData, Elements, item, placeOfProductionOfArrayStrings.Find( item.PlaceOfProductionOfArray() ) > -1 );
+    }
+    //info( "historyData : " + [String]historyData.Size() );
+    traverse( historyData, Elements, item ) {
+      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.PlaceOfProductionOfArray() );
+      // 璁板綍姣忚鍖呭惈鍝簺product
+      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductCode() );
+    }
+    rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
+    //info( "rows : " + [String]rows.Size() );
+    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.PlaceOfProductionOfArray() );
+    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
+    // 鐢熸垚鍥捐〃鍏冪礌
+    traverse( years, Elements, year ) {
+      debuginfo( "process year start : " + [String]year.YearNo() );
+      if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
+        // 鐩爣
+        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, year.YearNo() ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, year.YearNo() ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingCustomerOrder::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ),
+                                                                       Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ) 
+                                                                       )
+                                                   ); 
+          }                    
+        }
+      } 
+      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鍗婂勾" ) {
+        for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
+          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ),
+                                                                       MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ) )
+                                                   );  
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ),
+                                                                         Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo )
+                                                                         )
+                                                     ); 
+            }                    
+          }
+        }
+      }
+      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "瀛e害" ) {
+        for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
+          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+      //      info( "productCodeList : " + [String]productCodeList.Size() );
+      //      info( "MappingCapacityAndSaleBudge::GetSheetBySeason : " + [String]MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) );
+      //      info( "seasonNo : " + [String]seasonNo );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ),
+                                                                       MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ) )
+                                                   );  
+      //      info( "productCodeList : " + [String]productCodeList.Size() );
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ) ,
+                                                                         Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo )
+                                                                         )
+                                                     ); 
+            }                    
+          }
+        }
+      }
+      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鏈�" ) {
+        traverse( months, Elements, month ) {
+          info( "process month start : " + [String]month.MonthNo() );
+          monthNoString := ifexpr( month.MonthNo() <= 9, "0" + [String]month.MonthNo(), [String]month.MonthNo() );
+          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ),
+                                                                       MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ) )
+                                                   );  
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ),
+                                                                         Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ) 
+                                                                         )
+                                                     ); 
+            }
+          }
+          info( "process month end : " + [String]month.MonthNo() );
+        }
+      }
+      if( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "骞�" ) {
+        // 鐩爣
+        traverse( businessTypeList, Elements, businessType ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, year.YearNo() ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, year.YearNo() ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingCustomerOrder::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ) ,
+                                                                       Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() )
+                                                                       )
+                                                   ); 
+          }                    
+        }
+      } 
+      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鍗婂勾" ) {
+        for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
+          traverse( businessTypeList, Elements, businessType ) {
+            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ),
+                                                                       MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ) )
+                                                   );  
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ) ,
+                                                                         Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo )
+                                                                         )
+                                                     ); 
+            }                    
+          }
+        }
+      }
+      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
+        for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
+          debuginfo( "process season start : " + [String]seasonNo );
+          traverse( businessTypeList, Elements, businessType ) {
+            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ),
+                                                                       MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ) )
+                                                   );  
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ),
+                                                                         Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ) 
+                                                                         )
+                                                     ); 
+            }                    
+          }
+          info( "process season end : " + [String]seasonNo );
+        }
+      }
+      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
+        traverse( months, Elements, month ) {
+          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 );
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ),
+                                                                       MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ) )
+                                                   );  
+            // S&OP
+            traverse( macroPlans, Elements, macroPlan ) {
+              this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
+                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                     Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                         MappingCustomerOrder::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ) ,
+                                                                         Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() )
+                                                                         )
+                                                     ); 
+            }            
+          }
+          debuginfo( "process month end : " + [String]month.MonthNo() );
+        }
+      }
+      debuginfo( "process year end : " + [String]year.YearNo() )
+    }
+    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
+    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
+    //  info( "==鈫�==" );
+    //  info( row.BusinessType() );
+    //  info( row.PlaceOfProductionOfArray() );
+    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
+    //  info( elements.Size() );
+    //  info( row.GetProductCodes().Concatenate( " | " ) );
+    //  info( "==鈫�==" );
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
new file mode 100644
index 0000000..fbb2caf
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeChart.qbl
@@ -0,0 +1,264 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityAndSaleBudgeChart (
+  MacroPlans macroPlans,
+  String saleOrCapacity,
+  String groupBy,
+  String byBusinessTypeOrByOrgCode,
+  String businessTypeChosen,
+  String placeOfProductionOfArrayChosen,
+  String year,
+  MPSync mpSync,
+  GlobalOTDTable otdTable,
+  MacroPlan mappingParent
+)
+{
+  Description:
+  [*
+    鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement
+    锛侊紒锛侊紒搴熷純锛侊紒锛侊紒
+  *]
+  TextBody:
+  [*
+    // yypsybs Sep-19-2023 (created)
+    // true, false
+    info( saleOrCapacity );
+    // 鏈�;瀛e害;鍗婂勾;骞�
+    info( groupBy );
+    // 闈㈡澘鍩哄湴;浜嬩笟閮�
+    info( byBusinessTypeOrByOrgCode );
+    info( businessTypeChosen );
+    info( placeOfProductionOfArrayChosen );
+    info( year );
+    
+    // ====娓呯悊鏃ф暟鎹�====
+    this.CapacityAndSaleBudgeChartRow( relflush );
+    this.CapacityAndSaleBudgeChartElement( relflush );
+    
+    // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
+    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
+    if( placeOfProductionOfArrayChosen <> "" ) {
+      historyData := selectset( historyData, Elements, item, item.PlaceOfProductionOfArray() = placeOfProductionOfArrayChosen );
+    }
+    if( businessTypeChosen <> "" ) {
+      historyData := selectset( historyData, Elements, item, item.BusinessType() = businessTypeChosen );
+    }
+    //info( "historyData : " + [String]historyData.Size() );
+    traverse( historyData, Elements, item ) {
+      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.PlaceOfProductionOfArray() );
+      // 璁板綍姣忚鍖呭惈鍝簺product
+      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductCode() );
+    }
+    rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
+    //info( "rows : " + [String]rows.Size() );
+    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.PlaceOfProductionOfArray() );
+    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
+    // 鐢熸垚鍥捐〃鍏冪礌
+    if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
+      // 鐩爣
+      traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+        productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+        this.CapacityAndSaleBudgeChartElement( relnew, 
+                                               TimeStringAndScenarioName := [String]year + "骞�-鐩爣",
+                                               BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                               Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                   MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, [Number]year ),
+                                                                   MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, [Number]year ) )
+                                               );  
+        // S&OP
+        traverse( macroPlans, Elements, macroPlan ) {
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-" + macroPlan.ScenarioName(),
+                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     0.0,
+                                                                     Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, [Number]year ) )
+                                                 ); 
+        }                    
+      }
+    } 
+    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鍗婂勾" ) {
+      for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
+        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, [Number]year, halfNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "瀛e害" ) {
+      for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
+        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+    //      info( "productCodeList : " + [String]productCodeList.Size() );
+    //      info( "MappingCapacityAndSaleBudge::GetSheetBySeason : " + [String]MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) );
+    //      info( "seasonNo : " + [String]seasonNo );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) )
+                                                 );  
+    //      info( "productCodeList : " + [String]productCodeList.Size() );
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, [Number]year, seasonNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鏈�" ) {
+      for( monthNo := 1; monthNo <= 12; monthNo := monthNo + 1 ) {
+        monthNoString := ifexpr( monthNo <= 9, "0" + [String]monthNo, [String]monthNo );
+        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, [Number]year, monthNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    if( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "骞�" ) {
+      // 鐩爣
+      traverse( businessTypeList, Elements, businessType ) {
+        productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+        this.CapacityAndSaleBudgeChartElement( relnew, 
+                                               TimeStringAndScenarioName := [String]year + "骞�-鐩爣",
+                                               BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                               Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                   MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, [Number]year ),
+                                                                   MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, [Number]year ) )
+                                               );  
+        // S&OP
+        traverse( macroPlans, Elements, macroPlan ) {
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-" + macroPlan.ScenarioName(),
+                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     0.0,
+                                                                     Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, [Number]year ) )
+                                                 ); 
+        }                    
+      }
+    } 
+    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鍗婂勾" ) {
+      for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
+        traverse( businessTypeList, Elements, businessType ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, [Number]year, halfNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
+      for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
+        traverse( businessTypeList, Elements, businessType ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, [Number]year, seasonNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
+      for( monthNo := 1; monthNo <= 12; monthNo := monthNo + 1 ) {
+        monthNoString := ifexpr( monthNo <= 9, "0" + [String]monthNo, [String]monthNo );
+        traverse( businessTypeList, Elements, businessType ) {
+          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
+          this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
+                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                 Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                     MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ),
+                                                                     MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ) )
+                                                 );  
+          // S&OP
+          traverse( macroPlans, Elements, macroPlan ) {
+            this.CapacityAndSaleBudgeChartElement( relnew, 
+                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
+                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
+                                                   Quantity := ifexpr( saleOrCapacity = "閿�鍞",
+                                                                       0.0,
+                                                                       Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, [Number]year, monthNo ) )
+                                                   ); 
+          }                    
+        }
+      }
+    }
+    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
+    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
+    //  info( "==鈫�==" );
+    //  info( row.BusinessType() );
+    //  info( row.PlaceOfProductionOfArray() );
+    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
+    //  info( elements.Size() );
+    //  info( row.GetProductCodes().Concatenate( " | " ) );
+    //  info( "==鈫�==" );
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
new file mode 100644
index 0000000..90a0bff
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompare.qbl
@@ -0,0 +1,212 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityAndSaleBudgeCompare (
+  MacroPlans macroPlans,
+  CapacityAndSaleBudgeFilterItems items,
+  CapacityAndSaleBudgeFilterYears years,
+  CapacityAndSaleBudgeFilterMonths months,
+  MPSync mpSync,
+  GlobalOTDTable otdTable,
+  MacroPlan mappingParent
+)
+{
+  Description: 'todo : mappingParent鏀逛负mpSync, random鍒犱簡'
+  TextBody:
+  [*
+    // yypsybs Sep-18-2023 (created)
+    // ====涓嶉�夋椂榛樿鍏ㄩ��====
+    if( years.Size() = 0 ) {
+      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
+    }
+    if( months.Size() = 0 ) {
+      months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
+    }
+    traverse( macroPlans, Elements, item ) {
+      debuginfo( "scenario : " + item.ScenarioName() );
+    }
+    traverse( items, Elements, item ) {
+      debuginfo( "item : " + item.ItemName() );
+    }
+    traverse( years, Elements, item ) {
+      debuginfo( "year : " + [String]item.YearNo() );
+    }
+    traverse( months, Elements, item ) {
+      debuginfo( "month : " + [String]item.MonthNo() );
+    }
+    // ====娓呯悊鏃ф暟鎹�====
+    this.CapacityAndSaleBudgeCompareItemRow( relflush );
+    this.CapacityAndSaleBudgeCompareItemColumn( relflush );
+    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
+    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
+    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 );
+      boms := selectset( mappingParent, MappingBOM, bom, bom.ProductCode() = productCode );
+      if( boms.Size() > 0 ) {
+        bom := boms.First();
+        businessType := bom.BusinessType();
+        placeOfProductionOfArray := one.PlaceOfProductionOfArray();
+        // 鐩稿悓闈㈡澘鍩哄湴鍜屼簨涓氶儴鐨勬斁涓�琛�
+        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, businessType, placeOfProductionOfArray );
+        // 璁板綍姣忚鍖呭惈鍝簺product
+        CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
+      } else {
+        debuginfo( "no boms for product : " + productCode );
+      }
+    }
+    debuginfo( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
+    // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
+    // 浜嬩笟閮紝缁勭粐
+    debuginfo( "dealing businessType and placeOfProductionOfArray" )
+    columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
+    columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
+    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+      cell := columnBusinessType.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.BusinessType() );
+      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+      cell := columnPlaceOfProductionOfArray.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.PlaceOfProductionOfArray() );
+      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    }
+    // 闈㈡澘鍒嗛厤閲� - 骞村害棰勭畻 (sheets)
+    // 鏍煎紡锛� 闈㈡澘鍒嗛厤閲� - 骞� - 鏈堬紙1-12 & total锛� - 骞村害棰勭畻/scenarioName
+    info( "dealing 闈㈡澘鍒嗛厤閲�" )
+    if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
+      traverse( years, Elements, year ) {
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [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 ) {
+            cellReal := MappingCapacityAndSaleBudge::GetSheetByMonth( row.GetProductCodes(), mpSync, DateTime::Now().Year(), month.MonthNo() );
+            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+          }
+        }
+        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+          cellReal := MappingCapacityAndSaleBudge::GetSheetByYear( row.GetProductCodes(), mpSync, year.YearNo() );
+          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+        }
+        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
+        // S&OP鏁版嵁
+        traverse( macroPlans, Elements, macroPlan ) {
+          traverse( months, Elements, month ) {
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+                                                                                    "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+              cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
+              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            }
+          }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+                                                                                 "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+            cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
+            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+          }
+        }
+      }
+    }
+    // 骞村害閿�鍞
+    debuginfo( "dealing 閿�鍞" )
+    if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
+      traverse( years, Elements, year ) {
+        debuginfo( "閿�鍞" + [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 ) {
+            cellReal := MappingCapacityAndSaleBudge::GetSaleByMonth( row.GetProductCodes(), mpSync, year.YearNo(), month.MonthNo() );
+            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+          }
+        }
+        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
+        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+          cellReal := MappingCapacityAndSaleBudge::GetSaleByYear( row.GetProductCodes(), mpSync, year.YearNo() );
+          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+        }
+        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
+        // S&OP鏁版嵁
+        traverse( macroPlans, Elements, macroPlan ) {
+          traverse( months, Elements, month ) {
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+              cellReal := MappingAnnualBudget::GetSaleByMonth( row.GetProductCodes(), mpSync, year.YearNo(), month.MonthNo() );
+              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            }
+          }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+            // QID 23
+            cellReal := MappingAnnualBudget::GetSaleByYear( row.GetProductCodes(), mpSync, year.YearNo() );
+            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+          }
+        }
+      }
+    }
+    // 澶у紶鐩堝埄棰�
+    debuginfo( "dealing 澶у紶鐩堝埄棰�" )
+    traverse( years, Elements, year ) {
+      // 鍘嗗彶鏁版嵁
+      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
+      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+        // todo 
+        // QID 23
+        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
+        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+      }
+      // S&OP鏁版嵁
+      traverse( macroPlans, Elements, macroPlan ) {
+        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName() );
+        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+        }
+      }
+    }
+    // 浜у搧鐩堝埄棰�
+    debuginfo( "dealing 浜у搧鐩堝埄棰�" )
+    traverse( years, Elements, year ) {
+      // 鍘嗗彶鏁版嵁
+      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
+      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+        // todo
+        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
+        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+      }
+      // S&OP鏁版嵁
+      traverse( macroPlans, Elements, macroPlan ) {
+        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName() );
+        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+          // todo
+          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+        }
+      }
+    }
+    
+    // 璁剧疆rowNo鍜宑olumnNo
+    debuginfo( "set rowNo and columnNo" );
+    rowNo := 1;
+    rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
+    traverse( rowSorted, Elements, item ) {
+      item.RowNo( rowNo );
+      rowNo := rowNo + 1;
+    }
+    columnNo := 1;
+    traverse( this, CapacityAndSaleBudgeCompareItemColumn, item ) {
+      item.ColumnNo( columnNo );
+      columnNo := columnNo + 1;
+    }
+    debuginfo( "done" );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
new file mode 100644
index 0000000..45ee95c
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_CapacityAndSaleBudgeCompareExport.qbl
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityAndSaleBudgeCompareExport () as BinaryValue
+{
+  Description: '瀵煎嚭姣旇緝缁撴灉'
+  TextBody:
+  [*
+    // yypsybs Sep-22-2023 (created)
+    tableName := "骞村害浜ч攢棰勭畻瀵规瘮";
+    
+    text:= '<?xml version="1.0" encoding="utf-8" standalone="yes"?><table><name>' + tableName + '</name>';
+    
+    // 澶勭悊column <column><name>鐗╂枡缂栫爜</name><type>String</type></column>
+    columnXml := ""
+    traverse( this, CapacityAndSaleBudgeCompareItemColumn, column ) {
+      debuginfo( "columnName : " + column.ColumnName() );
+      columnXml := columnXml + "<column><name>" + column.ColumnName() + "</name><type>String</type></column>";
+    }
+    text := text + columnXml + "</table>"
+    
+    // 濉炲唴瀹�
+    xmlDOMImplementation := XMLDOMImplementation::Create();
+    xmlDOMDocument := xmlDOMImplementation.CreateDocumentFromString( text );
+    tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
+    rows := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, row, row.PlaceOfProductionOfArray() + "_" + row.BusinessType() );
+    traverse ( rows, Elements, row ) {
+      debuginfo( "rowNo : " + [String]row.RowNo() );
+      traverse( row, CapacityAndSaleBudgeCompareItemCell, cell ) {
+        ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, cell.CellContent(), cell.CapacityAndSaleBudgeCompareItemColumn().ColumnName() );  
+      }
+    }
+    xmlDOMSerializer := xmlDOMImplementation.CreateSerializer();
+    xmlTableString := xmlDOMSerializer.WriteToString( xmlDOMDocument );
+    
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTableString ) );
+    tableGroupHandle := TableGroupHandle::Create( tableName );
+    tableGroupHandle.Add( tableHandle );
+    tableBinaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return tableBinaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_AIPISPIP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_AIPISPIP.qbl
index ac058bb..df86b5a 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_AIPISPIP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_AIPISPIP.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_AIPISPIP",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "瀹為檯搴撳瓨鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_AIPISPIP", "瀹為檯搴撳瓨鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_ConversionFactor.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_ConversionFactor.qbl
index fb840ce..34022c8 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_ConversionFactor.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_ConversionFactor.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_ConversionFactor",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "鍗曚綅杞崲鍥犲瓙鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_ConversionFactor", "鍗曚綅杞崲鍥犲瓙鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomOrder.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomOrder.qbl
index 66d92a1..b488e5a 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomOrder.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomOrder.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_CustomOrder",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "璁㈠崟鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_CustomOrder", "璁㈠崟鏁版嵁" );'
 }
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..95cbb13
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecuteFailure_GlobalOTDTable_CustomerGrade (
+  Number errorNo,
+  String errorMessage
+)
+{
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_CustomerGrade", "瀹㈡埛绛夌骇鏁版嵁" );'
+}
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..5989bef
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecuteFailure_GlobalOTDTable_DOI_DSI (
+  Number errorNo,
+  String errorMessage
+)
+{
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_DOI_DSI", "DOI_DSI鏁版嵁" );'
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Forecast.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Forecast.qbl
index 2384943..21f56b3 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Forecast.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Forecast.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_Forecast",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "棰勬祴鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_Forecast", "棰勬祴鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_InventorySupply.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_InventorySupply.qbl
index fd32c60..e3cdc5c 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_InventorySupply.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_InventorySupply.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_InventorySupply",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "搴撳瓨渚涘簲鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_InventorySupply", "搴撳瓨渚涘簲鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Operation.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Operation.qbl
index 3d491fe..3d19d66 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Operation.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Operation.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_Operation",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "鎿嶄綔鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_Operation", "鎿嶄綔鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationBOM.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationBOM.qbl
index 49e26b7..4c18d21 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationBOM.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationBOM.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_OperationBOM",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "鎿嶄綔BOM鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_OperationBOM", "鎿嶄綔BOM鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationCost.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationCost.qbl
index 2364cd5..8dd61ac 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationCost.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_OperationCost.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_OperationCost",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "鎿嶄綔鎴愭湰鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_OperationCost", "鎿嶄綔鎴愭湰鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Product_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Product_MP.qbl
index 2637fd7..a6c260b 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Product_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_Product_MP.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_Product_MP",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "浜у搧鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_Product_MP", "浜у搧鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_SalesSegment_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_SalesSegment_MP.qbl
index 56d48d9..f861032 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_SalesSegment_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_SalesSegment_MP.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_SalesSegment_MP",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "閿�鍞儴闂�",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_SalesSegment_MP", "閿�鍞儴闂�" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_StockingPointCost.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_StockingPointCost.qbl
index 0f166b2..e77ffa9 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_StockingPointCost.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_StockingPointCost.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_StockingPointCost",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "搴撳瓨鐐规垚鏈暟鎹�",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_StockingPointCost", "搴撳瓨鐐规垚鏈暟鎹�" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_UnitOfMeasure_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_UnitOfMeasure_MP.qbl
index 4974578..6fc9e3b 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_UnitOfMeasure_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecuteFailure_GlobalOTDTable_UnitOfMeasure_MP.qbl
@@ -5,16 +5,5 @@
   String errorMessage
 )
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName    := "GlobalOTDTable_UnitOfMeasure_MP",
-                                  ElementTotal  := 0,
-                                  ErrorMessage  := errorMessage,
-                                  IsSuccess     := false,
-                                  Name          := "鍗曚綅鏁版嵁",
-                                  ErrorNo       := errorNo,
-                                  ErrorDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" )
-                                 );
-  *]
+  TextBody: 'this.SettingFailureDetails( errorNo, errorMessage, "GlobalOTDTable_UnitOfMeasure_MP", "鍗曚綅鏁版嵁" );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_AIPISPIP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_AIPISPIP.qbl
index a0a1af4..e180696 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_AIPISPIP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_AIPISPIP.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_AIPISPIP
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_AIPISPIP",
-                                  ElementTotal    := this.Global_MappingActualProductInStockingPointInPeriod( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "瀹為檯搴撳瓨鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_AIPISPIP", "瀹為檯搴撳瓨鏁版嵁", this.Global_MappingActualProductInStockingPointInPeriod( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ConversionFactor.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ConversionFactor.qbl
index b0ad4d2..f9857c3 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ConversionFactor.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ConversionFactor.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_ConversionFactor
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_ConversionFactor",
-                                  ElementTotal    := this.Global_MappingConversionFactor( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "鍗曚綅杞崲鍥犲瓙鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_ConversionFactor", "鍗曚綅杞崲鍥犲瓙鏁版嵁", this.Global_MappingConversionFactor( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomOrder.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomOrder.qbl
index 677960c..d27917a 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomOrder.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomOrder.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_CustomOrder
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_CustomOrder",
-                                  ElementTotal    := this.Global_MappingCustomOrder( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "璁㈠崟鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_CustomOrder", "璁㈠崟鏁版嵁", this.Global_MappingCustomOrder( relsize ) );'
 }
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..c47d9ef
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_CustomerGrade.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecute_GlobalOTDTable_CustomerGrade
+{
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_CustomerGrade", "瀹㈡埛绛夌骇鏁版嵁", this.Global_MappingCustomerGrade( relsize ) );'
+}
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..f8826f9
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_DOI_DSI.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnAsyncExecute_GlobalOTDTable_DOI_DSI
+{
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_DOI_DSI", "DOI_DSI鏁版嵁", this.Global_MappingDOI_DSI( relsize ) );'
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Forecast.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Forecast.qbl
index c9f8835..ec74612 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Forecast.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Forecast.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_Forecast
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_Forecast",
-                                  ElementTotal    := this.Global_MappingForecast( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "棰勬祴鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_Forecast", "棰勬祴鏁版嵁", this.Global_MappingForecast( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_InventorySupply.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_InventorySupply.qbl
index 2ae1628..7745472 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_InventorySupply.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_InventorySupply.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_InventorySupply
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_InventorySupply",
-                                  ElementTotal    := this.Global_MappingInventorySupply( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "搴撳瓨渚涘簲鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_InventorySupply", "搴撳瓨渚涘簲鏁版嵁", this.Global_MappingInventorySupply( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Operation.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Operation.qbl
index 718b9d0..d537c11 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Operation.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Operation.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_Operation
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_Operation",
-                                  ElementTotal    := this.Global_MappingOperation( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "鎿嶄綔鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_Operation", "鎿嶄綔鏁版嵁", this.Global_MappingOperation( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationBOM.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationBOM.qbl
index 12bda61..6902690 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationBOM.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationBOM.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_OperationBOM
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_OperationBOM",
-                                  ElementTotal    := this.Global_MappingOperationBOM( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "鎿嶄綔BOM鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_OperationBOM", "鎿嶄綔BOM鏁版嵁", this.Global_MappingOperationBOM( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationCost.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationCost.qbl
index 313be5a..58d1ce1 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationCost.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_OperationCost.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_OperationCost
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_OperationCost",
-                                  ElementTotal    := this.Global_MappingOperationCost( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "鎿嶄綔鎴愭湰鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_OperationCost", "鎿嶄綔鎴愭湰鏁版嵁", this.Global_MappingOperationCost( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ProductInLane.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ProductInLane.qbl
index d4da6d7..7b117d2 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ProductInLane.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_ProductInLane.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_ProductInLane
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_ProductInLane",
-                                  ElementTotal    := this.Global_MappingProductInLane( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "浜у搧鍦ㄨ溅閬撴暟鎹�",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_ProductInLane", "浜у搧鍦ㄨ溅閬撴暟鎹�", this.Global_MappingProductInLane( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Product_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Product_MP.qbl
index bac0207..6b8ac8a 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Product_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_Product_MP.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_Product_MP
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_Product_MP",
-                                  ElementTotal    := this.Global_MappingProduct_MP( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "浜у搧鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_Product_MP", "浜у搧鏁版嵁", this.Global_MappingProduct_MP( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_SalesSegment_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_SalesSegment_MP.qbl
index 4cf7193..422a176 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_SalesSegment_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_SalesSegment_MP.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_SalesSegment_MP
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_SalesSegment_MP",
-                                  ElementTotal    := this.Global_MappingSalesSegment_MP( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "閿�鍞儴闂�",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_SalesSegment_MP", "閿�鍞儴闂�", this.Global_MappingSalesSegment_MP( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_StockingPointCost.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_StockingPointCost.qbl
index 1e75ed5..9b93f9c 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_StockingPointCost.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_StockingPointCost.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_StockingPointCost
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_StockingPointCost",
-                                  ElementTotal    := this.Global_MappingStockingPointCost( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "搴撳瓨鐐规垚鏈暟鎹�",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_StockingPointCost", "搴撳瓨鐐规垚鏈暟鎹�", this.Global_MappingStockingPointCost( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP.qbl b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP.qbl
index d8eb2dd..1192289 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP.qbl
@@ -2,16 +2,5 @@
 #parent: #root
 Method OnAsyncExecute_GlobalOTDTable_UnitOfMeasure_MP
 {
-  TextBody:
-  [*
-    this.Global_BrokerExecuteLog( relnew,
-                                  BrokerName      := "GlobalOTDTable_UnitOfMeasure_MP",
-                                  ElementTotal    := this.Global_MappingUnitOfMeasure_MP( relsize ),
-                                  ErrorMessage    := "",
-                                  IsSuccess       := true,
-                                  Name            := "鍗曚綅鏁版嵁",
-                                  SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                  ErrorNo         := 0
-                                 );
-  *]
+  TextBody: 'this.SettingSuccessfulDetails( "GlobalOTDTable_UnitOfMeasure_MP", "鍗曚綅鏁版嵁", this.Global_MappingUnitOfMeasure_MP( relsize ) );'
 }
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
new file mode 100644
index 0000000..5a4ba17
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetIsLinkedWithFinishedGoodAttributes
+{
+  Description: 'Method to traverse the supply chain to determine if there are any products that are not used to produce finished goods.'
+  TextBody:
+  [*
+    // Reset IsLinkedWithFinishedGood
+    traverse( this, Global_MappingProduct_MP, instance )
+    {
+      instance.IsLinkedWithFinishedGood( false );
+    }
+    
+    traverse( this, Global_MappingOperation, instance )
+    {
+      instance.IsLinkedWithFinishedGood( false );
+    }
+    
+    traverse( this, Global_MappingOperationBOM, instance )
+    {
+      instance.IsLinkedWithFinishedGood( false );
+    }
+    
+    productspool := selectset( this, Global_MappingProduct_MP, product,
+                               product.ProductMajorType() <> "鎴愬搧" );
+    operationspool := this.Global_MappingOperation( relget );
+    operationbomspool := this.Global_MappingOperationBOM( relget );
+    
+    // Traverse each finished good and search for linked products/operations/lanes
+    traverse( this, Global_MappingProduct_MP, product,
+              product.ProductMajorType() = "鎴愬搧" )
+    {
+      uniquebomids := construct( Strings );
+      product.IsLinkedWithFinishedGood( false );
+      product.SetIsLinkedWithFinishedGoodAttributes_Recursive( 0, // depth
+                                                               100, // maxdepth
+                                                               productspool,
+                                                               operationspool,
+                                                               operationbomspool,
+                                                               uniquebomids );
+      uniquebomids := uniquebomids.Unique();
+      product.BOMCount( uniquebomids.Size() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SettingFailureDetails.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SettingFailureDetails.qbl
new file mode 100644
index 0000000..3d9aad0
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SettingFailureDetails.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method SettingFailureDetails (
+  Number errorNo,
+  String errorMessage,
+  String brokerName,
+  String name
+)
+{
+  TextBody:
+  [*
+    gbel := select( this, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                             tempGBEL.BrokerName()      = brokerName );
+    
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( 0 );
+    gbel.ErrorMessage( errorMessage );
+    gbel.IsSuccess( false );
+    gbel.Name( name );
+    gbel.ErrorNo( errorNo );
+    gbel.ErrorDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SettingSuccessfulDetails.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SettingSuccessfulDetails.qbl
new file mode 100644
index 0000000..f3f619d
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SettingSuccessfulDetails.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SettingSuccessfulDetails (
+  String brokerName,
+  String name,
+  Number elementTotal
+)
+{
+  TextBody:
+  [*
+    gbel := select( this, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                             tempGBEL.BrokerName()      = brokerName );
+    
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( elementTotal );
+    gbel.IsSuccess( true );
+    gbel.Name( name );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl
new file mode 100644
index 0000000..31f8b7b
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizationAllMappingBrokerAndAPIByOption.qbl
@@ -0,0 +1,119 @@
+Quintiq file version 2.0
+#parent: #root
+Method SynchronizationAllMappingBrokerAndAPIByOption (
+  String executionUser,
+  Boolean isCustomOrder,
+  Boolean isForeacst,
+  Boolean isUnitOfMeasure_MP,
+  Boolean isSalesSegment_MP,
+  Boolean isProduct_MP,
+  Boolean isConversionFactor,
+  Boolean isOperation,
+  Boolean isOperationBOM,
+  Boolean isProductInLane,
+  Boolean isAIPISPIP,
+  Boolean isInventorySupply,
+  Boolean isStockingPointCost,
+  Boolean isOperationCost,
+  Boolean isDOI_DSI,
+  Boolean isCustomerGrade,
+  Boolean isStockingPoint_MP,
+  Boolean isCurrency_MP,
+  Boolean isCurrencyRate_MP,
+  Boolean isLane,
+  Boolean isLaneLeg
+)
+{
+  TextBody:
+  [*
+    if ( isCustomOrder ) {
+      Global_MappingCustomOrder::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_CustomOrder" );
+    }
+    
+    if ( isForeacst ) {
+      Global_MappingForecast::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_Forecast" );
+    }
+    
+    if ( isUnitOfMeasure_MP ) {
+      Global_MappingUnitOfMeasure_MP::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_UnitOfMeasure_MP" );
+    }
+    
+    if ( isSalesSegment_MP ) {
+      Global_MappingSalesSegment_MP::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_SalesSegment_MP" );
+    }
+    
+    if ( isProduct_MP ) {
+      Global_MappingProduct_MP::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_Product_MP" );
+    }
+    
+    if ( isConversionFactor ) {
+      Global_MappingConversionFactor::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_ConversionFactor" );
+    }
+    
+    if ( isOperation ) {
+      Global_MappingOperation::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_Operation" );
+    }
+    
+    if ( isOperationBOM ) {
+      Global_MappingOperationBOM::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_OperationBOM" );
+    }
+    
+    if ( isProductInLane ) {
+      Global_MappingProductInLane::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_ProductInLane" );
+    }
+    
+    if ( isAIPISPIP ) {
+      Global_MappingActualProductInStockingPointInPeriod::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_AIPISPIP" );
+    }
+    
+    if ( isInventorySupply ) {
+      Global_MappingInventorySupply::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_InventorySupply" );
+    }
+    
+    if ( isStockingPointCost ) {
+      Global_MappingStockingPointCost::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_StockingPointCost" );
+    }
+    
+    if ( isOperationCost ) {
+      Global_MappingOperationCost::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_OperationCost" );
+    }
+    
+    if ( isDOI_DSI ) {
+      Global_MappingDOI_DSI::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_DOI_DSI" );
+    }
+    
+    if ( isCustomerGrade ) {
+      Global_MappingCustomerGrade::SynchronizeInterfaceData( this, executionUser, "GlobalOTDTable_CustomerGrade" );
+    }
+    
+    if ( isStockingPoint_MP ) {
+      this.Global_MappingStockingPoint_MP( relflush );
+      Global_BrokerExecuteLog::CreateInOperation( this, "StockingPoint_MP", executionUser );
+    //  this -> Global_MappingStockingPoint_MP::CreateByAPI() -> Exception() -> Global_MappingStockingPoint_MP::OnException( this );
+    }
+    
+    if ( isCurrency_MP ) {
+      this.Global_MappingCurrency_MP( relflush );
+      Global_BrokerExecuteLog::CreateInOperation( this, "Currency_MP", executionUser );
+    //  this -> Global_MappingCurrency_MP::CreateByAPI() -> Exception() -> Global_MappingCurrency_MP::OnException( this );
+    }
+    
+    if ( isCurrencyRate_MP ) {
+      this.Global_MappingCurrencyRate_MP( relflush );
+      Global_BrokerExecuteLog::CreateInOperation( this, "CurrencyRate_MP", executionUser );
+    //  this -> Global_MappingCurrencyRate_MP::CreateByAPI() -> Exception() -> Global_MappingCurrencyRate_MP::OnException( this );
+    }
+    
+    if ( isLane ) {
+      this.Global_MappingLane( relflush );
+      Global_BrokerExecuteLog::CreateInOperation( this, "Lane", executionUser );
+    //  this -> Global_MappingLane::CreateByAPI() -> Exception() -> Global_MappingLane::OnException( this );
+    }
+    
+    if ( isLaneLeg ) {
+      this.Global_MappingLaneLeg( relflush );
+      Global_BrokerExecuteLog::CreateInOperation( this, "LaneLeg", executionUser );
+    //  this -> Global_MappingLaneLeg::CreateByAPI() -> Exception() -> Global_MappingLaneLeg::OnException( this );
+    }
+  *]
+}
diff --git "a/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl" "b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl"
new file mode 100644
index 0000000..ff774ec
--- /dev/null
+++ "b/_Main/BL/Type_GlobalDTOTable/Method_SynchronizeDataToMacroPlan\043127.qbl"
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method SynchronizeDataToMacroPlan (
+  MacroPlan macroPlan,
+  String executionUser,
+  Boolean isUnitOfMeasure_MP,
+  Boolean isCustomOrder
+)
+{
+  TextBody:
+  [*
+    if ( isUnitOfMeasure_MP ) {
+      Global_MappingUnitOfMeasure_MP::SynchronizeMacroPlanData( this, macroPlan );
+    }
+    
+    if ( isCustomOrder ) {
+      Global_MappingCustomOrder::SynchronizeMacroPlanData( this, macroPlan, executionUser );
+    }
+  *]
+}
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..486c9a6 100644
--- a/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/StaticMethod_SynchronizationAllMappingBrokerAndAPI.qbl
@@ -25,24 +25,28 @@
     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();
-    globalOTDTable -> OnException( globalOTDTable -> Global_MappingStockingPoint_MP::CreateByAPI() -> Exception(), globalOTDTable );
-    globalOTDTable -> OnException( globalOTDTable -> Global_MappingCurrency_MP::CreateByAPI() -> Exception(), globalOTDTable );
-    globalOTDTable -> OnException( globalOTDTable -> Global_MappingCurrencyRate_MP::CreateByAPI() -> Exception(), globalOTDTable );
-    globalOTDTable.GlobalOTDTable_Product_MP().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_ConversionFactor().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_Operation().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_OperationBOM().AsyncExecute();
-    globalOTDTable -> OnException( globalOTDTable -> Global_MappingLane::CreateByAPI() -> Exception(), globalOTDTable );
-    globalOTDTable -> OnException( globalOTDTable -> Global_MappingLaneLeg::CreateByAPI() -> Exception(), globalOTDTable );
-    globalOTDTable.GlobalOTDTable_ProductInLane().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_AIPISPIP().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_InventorySupply().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_StockingPointCost().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_OperationCost().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_Forecast().AsyncExecute();
-    globalOTDTable.GlobalOTDTable_CustomOrder().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_UnitOfMeasure_MP().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_SalesSegment_MP().AsyncExecute();
+    //globalOTDTable -> OnException( globalOTDTable -> Global_MappingStockingPoint_MP::CreateByAPI() -> Exception(), globalOTDTable );
+    //globalOTDTable -> OnException( globalOTDTable -> Global_MappingCurrency_MP::CreateByAPI() -> Exception(), globalOTDTable );
+    //globalOTDTable -> OnException( globalOTDTable -> Global_MappingCurrencyRate_MP::CreateByAPI() -> Exception(), globalOTDTable );
+    //globalOTDTable.GlobalOTDTable_Product_MP().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_ConversionFactor().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_Operation().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_OperationBOM().AsyncExecute();
+    //globalOTDTable -> OnException( globalOTDTable -> Global_MappingLane::CreateByAPI() -> Exception(), globalOTDTable );
+    //globalOTDTable -> OnException( globalOTDTable -> Global_MappingLaneLeg::CreateByAPI() -> Exception(), globalOTDTable );
+    //globalOTDTable.GlobalOTDTable_ProductInLane().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_AIPISPIP().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_InventorySupply().AsyncExecute();
+    //globalOTDTable.GlobalOTDTable_StockingPointCost().AsyncExecute();
+    //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_GlobalDTOTable/_ROOT_Type_GlobalOTDTable.qbl b/_Main/BL/Type_GlobalDTOTable/_ROOT_Type_GlobalOTDTable.qbl
index 0518307..c3d49d2 100644
--- a/_Main/BL/Type_GlobalDTOTable/_ROOT_Type_GlobalOTDTable.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/_ROOT_Type_GlobalOTDTable.qbl
@@ -5,5 +5,17 @@
 {
   #keys: '5[414702.0.83354588][414702.0.83354586][0.0.0][414702.0.83354587][414702.0.83354589]'
   BaseType: Object
+  OnCreate:
+  [*
+    this.BusinessType( relnew, BusinessTypeName := "鎵嬫満浜嬩笟閮∣LED" );
+    this.BusinessType( relnew, BusinessTypeName := "涓撲笟鏄剧ず浜嬩笟閮�" );
+    this.BusinessType( relnew, BusinessTypeName := "澶栧崠CELLOLED" );
+    this.BusinessType( relnew, BusinessTypeName := "鎵嬫満浜嬩笟閮�" );
+    this.BusinessType( relnew, BusinessTypeName := "姹借溅鐢靛瓙浜嬩笟閮�" );
+    this.BusinessType( relnew, BusinessTypeName := "鐗圭鏄剧ず" );
+    this.BusinessType( relnew, BusinessTypeName := "杩愬姩鍋ュ悍浜嬩笟閮�" );
+    this.BusinessType( relnew, BusinessTypeName := "杞﹁浇鏄剧ず浜嬩笟閮�" );
+    this.BusinessType( relnew, BusinessTypeName := "IT浜嬩笟閮�" );
+  *]
   StructuredName: 'GlobalOTDTables'
 }
diff --git a/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecuteUser.qbl b/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecuteUser.qbl
new file mode 100644
index 0000000..4549caf
--- /dev/null
+++ b/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecuteUser.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ExecuteUser
+{
+  #keys: '3[414702.0.498264673][414702.0.498264672][414702.0.498264674]'
+  Description: '鎵ц鐢ㄦ埛'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecutionStatus.qbl b/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecutionStatus.qbl
new file mode 100644
index 0000000..e4a5392
--- /dev/null
+++ b/_Main/BL/Type_Global_BrokerExecuteLog/Attribute_ExecutionStatus.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ExecutionStatus
+{
+  #keys: '3[414702.0.498264686][414702.0.498264685][414702.0.498264687]'
+  Description:
+  [*
+    鎵ц鐘舵��
+    InOperation
+    Complete
+  *]
+  ValueType: String
+}
diff --git a/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CanRun.qbl b/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CanRun.qbl
new file mode 100644
index 0000000..428134f
--- /dev/null
+++ b/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CanRun.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CanRun (
+  GlobalOTDTable globalOTDTable,
+  String brokerName
+) as Boolean
+{
+  TextBody:
+  [*
+    isCanRun := exists( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.BrokerName() = brokerName and
+                                                                 tempGBEL.ExecutionStatus() = "InOperation"
+                       );
+    
+    return isCanRun;
+  *]
+}
diff --git a/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CreateInOperation.qbl b/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CreateInOperation.qbl
new file mode 100644
index 0000000..5f46a5f
--- /dev/null
+++ b/_Main/BL/Type_Global_BrokerExecuteLog/StaticMethod_CreateInOperation.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateInOperation (
+  GlobalOTDTable globalOTDTable,
+  String brokerName,
+  String executionUser
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_BrokerExecuteLog( relnew, 
+                                            BrokerName := brokerName, 
+                                            ExecuteUser := executionUser, 
+                                            ExecutionStatus := "InOperation" );
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..e45d793
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingActualProductInStockingPointInPeriod/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingActualProductInStockingPointInPeriod( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_AIPISPIP().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingConversionFactor/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingConversionFactor/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..58bc3d5
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingConversionFactor/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingConversionFactor( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_ConversionFactor().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
index 13d9157..e3b0e63 100644
--- a/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_CreateByAPI.qbl
@@ -38,14 +38,12 @@
                                                    );
     }
     
-    globalOTDTable.Global_BrokerExecuteLog( relnew,
-                                            BrokerName      := "",
-                                            ElementTotal    := globalOTDTable.Global_MappingCurrencyRate_MP( relsize ),
-                                            ErrorMessage    := "",
-                                            IsSuccess       := true,
-                                            Name            := "鎺ュ彛鏁版嵁锛堣揣甯佹眹鐜囷級",
-                                            SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                            ErrorNo         := 0
-                                           );
+    gbel := select( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                                       tempGBEL.BrokerName()      = "CurrencyRate_MP" );
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( globalOTDTable.Global_MappingCurrencyRate_MP( relsize ) );
+    gbel.IsSuccess( true );
+    gbel.Name( "鎺ュ彛鏁版嵁锛堣揣甯佹眹鐜囷級" );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_OnException.qbl b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_OnException.qbl
new file mode 100644
index 0000000..1775209
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCurrencyRate_MP/StaticMethod_OnException.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnException (
+  Exception e,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody: 'globalOTDTable.SettingFailureDetails( e.ErrorNumber(), e.Message(), "CurrencyRate_MP", "璐у竵姹囩巼鎺ュ彛鏁版嵁" );'
+}
diff --git a/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
index e938f73..2480088 100644
--- a/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_CreateByAPI.qbl
@@ -35,14 +35,12 @@
                                                );
     }
     
-    globalOTDTable.Global_BrokerExecuteLog( relnew,
-                                            BrokerName      := "",
-                                            ElementTotal    := globalOTDTable.Global_MappingCurrency_MP( relsize ),
-                                            ErrorMessage    := "",
-                                            IsSuccess       := true,
-                                            Name            := "鎺ュ彛鏁版嵁锛堣揣甯侊級",
-                                            SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                            ErrorNo         := 0
-                                           );
+    gbel := select( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                                       tempGBEL.BrokerName()      = "Currency_MP" );
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( globalOTDTable.Global_MappingCurrency_MP( relsize ) );
+    gbel.IsSuccess( true );
+    gbel.Name( "鎺ュ彛鏁版嵁锛堣揣甯侊級" );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_OnException.qbl b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_OnException.qbl
new file mode 100644
index 0000000..1ee262a
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCurrency_MP/StaticMethod_OnException.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnException (
+  Exception e,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody: 'globalOTDTable.SettingFailureDetails( e.ErrorNumber(), e.Message(), "Currency_MP", "璐у竵鎺ュ彛鏁版嵁" );'
+}
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_MappingCustomOrder/StaticMethod_CreateCustomOrder.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_CreateCustomOrder.qbl
new file mode 100644
index 0000000..f07437b
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_CreateCustomOrder.qbl
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateCustomOrder (
+  GlobalOTDTable globalOTDTable,
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    traverse ( globalOTDTable, Global_MappingCustomOrder, gmco ) {
+      targetProduct_MP := Global_MappingCustomOrder::GetProduct_MP( macroPlan, gmco );
+      targetStockingPoint_MP := Global_MappingCustomOrder::GetStockingPoing_MP( macroPlan, gmco );
+      Global_MappingCustomOrder::GetSalesSegment_MP( macroPlan, gmco );
+      Global_MappingCustomOrder::GetCurrency_MP( macroPlan, gmco );
+      Global_MappingCustomOrder::GetUnitOfMeasure_MP( macroPlan, gmco );
+      
+      targetCustomerOrder := CustomerOrder::Create( targetProduct_MP,
+                                                    targetStockingPoint_MP,
+                                                    gmco.ID(),
+                                                    gmco.OrderDate(),
+                                                    gmco.Quantity(),
+                                                    gmco.Price(),
+                                                    "Normal",
+                                                    gmco.SalesSegmentName(),
+                                                    gmco.CurrencyID(),
+                                                    gmco.UnitOfMeasureName(),
+                                                    false,
+                                                    gmco.Customer(),
+                                                    gmco.CustomerID(),
+                                                    gmco.OrderID(),
+                                                    gmco.OrderLineID(),
+                                                    true,
+                                                    true,
+                                                    false
+                                                   );
+      targetCustomerOrder.BusinessType( gmco.BusinessType() );
+      targetCustomerOrder.OrderType( gmco.OrderType() );
+      targetCustomerOrder.IsAvailable( gmco.IsAvailable() );
+      targetCustomerOrder.ProductGrade( gmco.ProductGrade() );
+      targetCustomerOrder.SegmentPriority( gmco.SegmentPriority() );
+      targetCustomerOrder.SheetProfitability( gmco.SheetProfitability() );
+      targetCustomerOrder.OrderTime( gmco.OrderTime() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetCurrency_MP.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetCurrency_MP.qbl
new file mode 100644
index 0000000..f4d504d
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetCurrency_MP.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetCurrency_MP (
+  MacroPlan macroPlan,
+  Global_MappingCustomOrder gmco
+)
+{
+  TextBody:
+  [*
+    isExists := exists( macroPlan, Currency_MP, tempCMP, tempCMP.ID() = gmco.CurrencyID() );
+    
+    if ( not isExists ) {
+      Currency_MP::Create( gmco.CurrencyID(), macroPlan, gmco.CurrencyID(), "", false, false );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetProduct_MP.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetProduct_MP.qbl
new file mode 100644
index 0000000..ba6e469
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetProduct_MP.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetProduct_MP (
+  MacroPlan macroPlan,
+  Global_MappingCustomOrder gmco
+) as Product_MP
+{
+  TextBody:
+  [*
+    targetProduct_MP := select( macroPlan, Product_MP, tempPMP, tempPMP.ID() = gmco.ProductID() );
+    if ( isnull( targetProduct_MP ) ) {
+      targetProduct_MP := Product_MP::Create( gmco.ProductID(), macroPlan, null( Product_MP ), gmco.ProductID(), null( SupplyChainView ), 0, 0, false );
+    }
+    
+    return targetProduct_MP;
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetSalesSegment_MP.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetSalesSegment_MP.qbl
new file mode 100644
index 0000000..2e2e473
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetSalesSegment_MP.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetSalesSegment_MP (
+  MacroPlan macroPlan,
+  Global_MappingCustomOrder gmco
+)
+{
+  TextBody:
+  [*
+    isExists := exists( macroPlan, SalesSegment_MP, tempSSMP, tempSSMP.Name() = gmco.SalesSegmentName() );
+    
+    if ( not isExists ) {
+      SalesSegment_MP::Create( macroPlan, "", gmco.SalesSegmentName(), 0, false );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetStockingPoing_MP.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetStockingPoing_MP.qbl
new file mode 100644
index 0000000..37d8b42
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetStockingPoing_MP.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetStockingPoing_MP (
+  MacroPlan macroPlan,
+  Global_MappingCustomOrder gmco
+) as StockingPoint_MP
+{
+  TextBody:
+  [*
+    targetStockingPoint_MP := select( macroPlan, StockingPoint_MP, tempSPMP, tempSPMP.ID() = gmco.StockingPointID() );
+    if ( isnull( targetStockingPoint_MP ) ) {
+      targetStockingPoint_MP := StockingPoint_MP::Create( gmco.StockingPointID(), macroPlan, null( Unit ), gmco.StockingPointID(), null( SupplyChainView ), 0, 0, false );
+    }
+    
+    return targetStockingPoint_MP;
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetUnitOfMeasure_MP.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetUnitOfMeasure_MP.qbl
new file mode 100644
index 0000000..b85c24d
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_GetUnitOfMeasure_MP.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetUnitOfMeasure_MP (
+  MacroPlan macroPlan,
+  Global_MappingCustomOrder gmco
+)
+{
+  TextBody:
+  [*
+    isExists := exists( macroPlan, UnitOfMeasure_MP, tempUOMMP, tempUOMMP.Name() = gmco.UnitOfMeasureName() );
+    
+    if ( not isExists ) {
+      UnitOfMeasure_MP::Create( macroPlan, gmco.UnitOfMeasureName(), false, false );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..9f855d0
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingCustomOrder( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_CustomOrder().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeMacroPlanData.qbl b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeMacroPlanData.qbl
new file mode 100644
index 0000000..9a69cf5
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomOrder/StaticMethod_SynchronizeMacroPlanData.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeMacroPlanData (
+  GlobalOTDTable globalOTDTable,
+  MacroPlan macroPlan,
+  String executionUser
+)
+{
+  TextBody:
+  [*
+    global_BrokerExecuteLog := globalOTDTable.Global_BrokerExecuteLog( relnew,
+                                                                       Name        := "鍚屾璁㈠崟鏁版嵁",
+                                                                       IsSuccess   := true,
+                                                                       ExecuteUser := executionUser
+                                                                      );
+                                            
+      
+    try {
+      Global_MappingCustomOrder::CreateCustomOrder( globalOTDTable, macroPlan );
+      
+      global_BrokerExecuteLog.ExecutionStatus( "Complete" );
+      global_BrokerExecuteLog.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
+    } onerror {
+      global_BrokerExecuteLog.IsSuccess( false );
+      global_BrokerExecuteLog.ErrorNo( e.ErrorNr() );
+      global_BrokerExecuteLog.ErrorMessage( e.GeneralInformation() );
+      global_BrokerExecuteLog.ErrorDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
+      global_BrokerExecuteLog.ExecutionStatus( "Complete" );
+    }
+  *]
+}
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/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingCustomerGrade/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..073d3d2
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingCustomerGrade/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingCustomerGrade( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_CustomerGrade().AsyncExecute();
+    }
+  *]
+}
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/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingDOI_DSI/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..619df91
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingDOI_DSI/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingDOI_DSI( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_DOI_DSI().AsyncExecute();
+    }
+  *]
+}
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_MappingForecast/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingForecast/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..a9bf8b3
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingForecast/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingForecast( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_Forecast().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingInventorySupply/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingInventorySupply/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..c63682f
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingInventorySupply/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingInventorySupply( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_InventorySupply().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
index 6d04074..e46efd6 100644
--- a/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingLane/StaticMethod_CreateByAPI.qbl
@@ -36,14 +36,13 @@
                                         );
     }
     
-    globalOTDTable.Global_BrokerExecuteLog( relnew,
-                                            BrokerName      := "",
-                                            ElementTotal    := globalOTDTable.Global_MappingLane( relsize ),
-                                            ErrorMessage    := "",
-                                            IsSuccess       := true,
-                                            Name            := "鎺ュ彛鏁版嵁锛堣溅閬擄級",
-                                            SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                            ErrorNo         := 0
-                                           );
+    
+    gbel := select( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                                       tempGBEL.BrokerName()      = "Lane" );
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( globalOTDTable.Global_MappingLane( relsize ) );
+    gbel.IsSuccess( true );
+    gbel.Name( "鎺ュ彛鏁版嵁锛堣溅閬擄級" );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingLane/StaticMethod_OnException.qbl b/_Main/BL/Type_Global_MappingLane/StaticMethod_OnException.qbl
new file mode 100644
index 0000000..2f719e0
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingLane/StaticMethod_OnException.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnException (
+  Exception e,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody: 'globalOTDTable.SettingFailureDetails( e.ErrorNumber(), e.Message(), "Lane", "杞﹂亾鎺ュ彛鏁版嵁" );'
+}
diff --git a/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
index 20f668b..7899f6e 100644
--- a/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_CreateByAPI.qbl
@@ -37,14 +37,12 @@
                                            );
     }
     
-    globalOTDTable.Global_BrokerExecuteLog( relnew,
-                                            BrokerName      := "",
-                                            ElementTotal    := globalOTDTable.Global_MappingLaneLeg( relsize ),
-                                            ErrorMessage    := "",
-                                            IsSuccess       := true,
-                                            Name            := "鎺ュ彛鏁版嵁锛堣溅閬撴敮鏋讹級",
-                                            SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                            ErrorNo         := 0
-                                           );
+    gbel := select( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                                       tempGBEL.BrokerName()      = "LaneLeg" );
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( globalOTDTable.Global_MappingLaneLeg( relsize ) );
+    gbel.IsSuccess( true );
+    gbel.Name( "鎺ュ彛鏁版嵁锛堣溅閬撴敮鏋讹級" );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_OnException.qbl b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_OnException.qbl
new file mode 100644
index 0000000..25ff0bc
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingLaneLeg/StaticMethod_OnException.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnException (
+  Exception e,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody: 'globalOTDTable.SettingFailureDetails( e.ErrorNumber(), e.Message(), "LaneLeg", "杞﹂亾鏀灦鎺ュ彛鏁版嵁" );'
+}
diff --git a/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFinishedGood.qbl b/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFinishedGood.qbl
new file mode 100644
index 0000000..76d65ba
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFinishedGood.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFinishedGood
+{
+  #keys: '3[157968.0.1145180207][157968.0.1145180206][157968.0.1145180208]'
+  Description: 'Updated procedurally for checking whether this object is used to produce a finished good.'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingOperation/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingOperation/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..2d35ace
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperation/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingOperation( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_Operation().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFinishedGood.qbl b/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFinishedGood.qbl
new file mode 100644
index 0000000..e5ff163
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFinishedGood.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFinishedGood
+{
+  #keys: '3[157968.0.1145180190][157968.0.1145180189][157968.0.1145180191]'
+  Description: 'Updated procedurally for checking whether this object is used to produce a finished good.'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingOperationBOM/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingOperationBOM/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..69c60d3
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperationBOM/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingOperationBOM( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_OperationBOM().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingProductInLane/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingProductInLane/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..f2333f5
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProductInLane/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingProductInLane( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_ProductInLane().AsyncExecute();
+    }
+  *]
+}
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/Attribute_IsLinkedWithFinishedGood.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFinishedGood.qbl
new file mode 100644
index 0000000..d2cec36
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFinishedGood.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFinishedGood
+{
+  #keys: '3[157968.0.1145180168][157968.0.1145180167][157968.0.1145180169]'
+  Description: 'Updated procedurally for checking whether this product is used to produce a finished good.'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
new file mode 100644
index 0000000..f0425fa
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
@@ -0,0 +1,91 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetIsLinkedWithFinishedGoodAttributes_Recursive (
+  Number depth,
+  Number maxdepth,
+  Global_MappingProduct_MPs productspool,
+  Global_MappingOperations operationspool,
+  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.'
+  TextBody:
+  [*
+    if( not this.IsLinkedWithFinishedGood() )
+    {
+      if( this.ProductMajorType() <> "鎴愬搧" )
+      {
+        uniquebomids_o.Add( this.ID() );
+      }
+      
+      depth := depth + 1;
+      this.IsLinkedWithFinishedGood( true );
+      
+      if( depth <= maxdepth )
+      {
+        operations := selectset( operationspool, Elements, operation,
+                                 not operation.IsLinkedWithFinishedGood()
+                                 and operation.BusinessType() = this.BusinessType()
+                                 and operation.ProductID() = this.ID() );
+        operationspool.Remove( operations );
+        
+        traverse( operations, Elements, operation )
+        {
+          operation.IsLinkedWithFinishedGood( true );
+          
+          operationboms := selectset( operationbomspool, Elements, operationbom,
+                                      not operationbom.IsLinkedWithFinishedGood()
+                                      and operationbom.BusinessType() = operation.BusinessType()
+                                      and operationbom.OrganCode() = operation.OrganCode()
+                                      and operationbom.ProcessSection() = operation.ProcessSection()
+                                      and operationbom.ProductCode() = operation.ProductID() );
+          operationbomspool.Remove( operationboms );
+          
+          traverse( operationboms, Elements, operationbom )
+          {
+            operationbom.IsLinkedWithFinishedGood( true );
+            
+            componentproduct := Global_MappingProduct_MP::FindTypeIndexIDAndBusinessType( operationbom.ComponentCode(),
+                                                                                          operationbom.BusinessType() );
+            
+            if( guard( not componentproduct.IsLinkedWithFinishedGood(), false ) )
+            {
+              productspool.Remove( componentproduct );
+              componentproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive( depth,
+                                                                                maxdepth,
+                                                                                productspool,
+                                                                                operationspool,
+                                                                                operationbomspool,
+                                                                                uniquebomids_o );
+            }
+            
+            if( operationbom.AlternativeMaterialCode() <> ""
+                and operationbom.AlternativeMaterialCode() <> operationbom.ComponentCode() )
+            {
+              alternativeproduct := Global_MappingProduct_MP::FindTypeIndexIDAndBusinessType( operationbom.AlternativeMaterialCode(),
+                                                                                              operationbom.BusinessType() );
+              
+              if( guard( not alternativeproduct.IsLinkedWithFinishedGood(), false ) )
+              {
+                productspool.Remove( alternativeproduct );
+                alternativeproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive( depth,
+                                                                                    maxdepth,
+                                                                                    productspool,
+                                                                                    operationspool,
+                                                                                    operationbomspool,
+                                                                                    uniquebomids_o );
+              }
+            }
+          }
+        }
+      }
+      else
+      {
+        debuginfo( "Product:", this.ID(),
+                   "| BusinessType:", this.BusinessType(),
+                   "| Max depth reached, stop searching... (", depth, ")" );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingProduct_MP/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..9728f0f
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingProduct_MP( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_Product_MP().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingSalesSegment_MP/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingSalesSegment_MP/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..76d2c88
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingSalesSegment_MP/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingSalesSegment_MP( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_SalesSegment_MP().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingStockingPointCost/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingStockingPointCost/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..82a30f7
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingStockingPointCost/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingStockingPointCost( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_StockingPointCost().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
index b800ef2..4901d0a 100644
--- a/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
+++ b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_CreateByAPI.qbl
@@ -35,14 +35,12 @@
                                                     );
     }
     
-    globalOTDTable.Global_BrokerExecuteLog( relnew,
-                                            BrokerName      := "",
-                                            ElementTotal    := globalOTDTable.Global_MappingStockingPoint_MP( relsize ),
-                                            ErrorMessage    := "",
-                                            IsSuccess       := true,
-                                            Name            := "鎺ュ彛鏁版嵁锛堝簱瀛樼偣锛�",
-                                            SuccessDateTime := DateTime::ActualTime().Format( "Y-M-D H2:m:s" ),
-                                            ErrorNo         := 0
-                                           );
+    gbel := select( globalOTDTable, Global_BrokerExecuteLog, tempGBEL, tempGBEL.ExecutionStatus() = "InOperation" and
+                                                                       tempGBEL.BrokerName()      = "StockingPoint_MP" );
+    gbel.ExecutionStatus( "Complete" );
+    gbel.ElementTotal( globalOTDTable.Global_MappingStockingPoint_MP( relsize ) );
+    gbel.IsSuccess( true );
+    gbel.Name( "鎺ュ彛鏁版嵁锛堝簱瀛樼偣锛�" );
+    gbel.SuccessDateTime( DateTime::ActualTime().Format( "Y-M-D H2:m:s" ) );
   *]
 }
diff --git a/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_OnException.qbl b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_OnException.qbl
new file mode 100644
index 0000000..2a6d364
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingStockingPoint_MP/StaticMethod_OnException.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnException (
+  Exception e,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody: 'globalOTDTable.SettingFailureDetails( e.ErrorNumber(), e.Message(), "StockingPoint_MP", "搴撳瓨鎺ュ彛鏁版嵁" );'
+}
diff --git a/_Main/BL/Type_Global_MappingUnitCost/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingUnitCost/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..8eab43a
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingUnitCost/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingOperationCost( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_OperationCost().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeInterfaceData.qbl b/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeInterfaceData.qbl
new file mode 100644
index 0000000..a88ea5a
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeInterfaceData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeInterfaceData (
+  GlobalOTDTable globalOTDTable,
+  String executionUser,
+  String brokerName
+)
+{
+  TextBody:
+  [*
+    globalOTDTable.Global_MappingUnitOfMeasure_MP( relflush );
+    isCanRun := Global_BrokerExecuteLog::CanRun( globalOTDTable, brokerName );
+    if ( not isCanRun ) {  
+      Global_BrokerExecuteLog::CreateInOperation( globalOTDTable, brokerName, executionUser );
+      globalOTDTable.GlobalOTDTable_UnitOfMeasure_MP().AsyncExecute();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeMacroPlanData.qbl b/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeMacroPlanData.qbl
new file mode 100644
index 0000000..d31811e
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingUnitOfMeasure_MP/StaticMethod_SynchronizeMacroPlanData.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeMacroPlanData (
+  GlobalOTDTable globalOTDTable,
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    global_BrokerExecuteLog := globalOTDTable.Global_BrokerExecuteLog( relnew,
+                                                                       Name := "鍚屾鍗曚綅鏁版嵁",
+                                                                       IsSuccess := true
+                                                                      );
+                                            
+    try {
+      traverse ( globalOTDTable, Global_MappingUnitOfMeasure_MP, gmuommp ) {
+        unitOfMeasure_MP := select( macroPlan, UnitOfMeasure_MP, tempUOMMP, tempUOMMP.Name() = gmuommp.Name() );
+        if ( isnull( unitOfMeasure_MP ) ) {  
+          unitOfMeasure_MP := UnitOfMeasure_MP::Create( macroPlan, gmuommp.Name(), false, false );
+        }
+        if ( gmuommp.IsDefault() ) {
+          unitOfMeasure_MP.SetAsDefault();
+        }
+      }
+    } onerror {
+      global_BrokerExecuteLog.IsSuccess( false );
+      global_BrokerExecuteLog.ErrorNo( e.ErrorNr() );
+      global_BrokerExecuteLog.ErrorMessage( e.GeneralInformation() );
+    }
+  *]
+}
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_CreateShowData_CustomOrder.qbl b/_Main/BL/Type_Global_ShowCell/StaticMethod_CreateShowData_CustomOrder.qbl
new file mode 100644
index 0000000..6fc41e2
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/StaticMethod_CreateShowData_CustomOrder.qbl
@@ -0,0 +1,58 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateShowData_CustomOrder (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    businessTypeColumn       := Global_ShowColumn::CreateColumn( globalOTDTable, 0, "浜嬩笟閮�" );
+    currencyIDColumn         := Global_ShowColumn::CreateColumn( globalOTDTable, 1, "璐у竵" );
+    customerColumn           := Global_ShowColumn::CreateColumn( globalOTDTable, 2, "瀹㈡埛鍚嶇О" );
+    customerIDColumn         := Global_ShowColumn::CreateColumn( globalOTDTable, 3, "瀹㈡埛ID" );
+    idColumn                 := Global_ShowColumn::CreateColumn( globalOTDTable, 4, "鍞竴鏍囪瘑" );
+    orderDateColumn          := Global_ShowColumn::CreateColumn( globalOTDTable, 5, "璁㈠崟鏃ユ湡" );
+    orderIDColumn            := Global_ShowColumn::CreateColumn( globalOTDTable, 6, "璁㈠崟鍙�" );
+    orderLineIDColumn        := Global_ShowColumn::CreateColumn( globalOTDTable, 7, "璁㈠崟琛屽彿" );
+    priceColumn              := Global_ShowColumn::CreateColumn( globalOTDTable, 8, "鍗曚环" );
+    priorityNameColumn       := Global_ShowColumn::CreateColumn( globalOTDTable, 9, "浼樺厛绾у悕绉�" );
+    productIDColumn          := Global_ShowColumn::CreateColumn( globalOTDTable, 10, "浜у搧缂栫爜" );
+    stockingPointIDColumn    := Global_ShowColumn::CreateColumn( globalOTDTable, 11, "搴撳瓨鐐圭紪鐮�" );
+    salesegmentNameColumn    := Global_ShowColumn::CreateColumn( globalOTDTable, 12, "閿�鍞儴闂ㄥ悕绉�" );
+    quantityColumn           := Global_ShowColumn::CreateColumn( globalOTDTable, 13, "鏁伴噺" );
+    unitofmeasureNameColumn  := Global_ShowColumn::CreateColumn( globalOTDTable, 14, "鍗曚綅" );
+    orderTypeColumn          := Global_ShowColumn::CreateColumn( globalOTDTable, 15, "璁㈠崟绫诲瀷" );
+    isAvailableColumn        := Global_ShowColumn::CreateColumn( globalOTDTable, 16, "鏄惁鍙敤" );
+    productGradeColumn       := Global_ShowColumn::CreateColumn( globalOTDTable, 17, "浜у搧绛夌骇" );
+    segmentPriorityColumn    := Global_ShowColumn::CreateColumn( globalOTDTable, 18, "缁嗗垎甯傚満浼樺厛绾�" );
+    sheetProfitabilityColumn := Global_ShowColumn::CreateColumn( globalOTDTable, 19, "澶у紶鐩堝埄" );
+    orderTimeColumn          := Global_ShowColumn::CreateColumn( globalOTDTable, 20, "璁㈠崟涓嬪崟鏃堕棿" );
+    i := 1;
+    traverse ( globalOTDTable, Global_MappingCustomOrder, gmco ) {
+      gloabal_ShowRow := globalOTDTable.Global_ShowRow( relnew, RowNr := i );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.BusinessType(), businessTypeColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.CurrencyID(), currencyIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.Customer(), customerColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.CustomerID(), customerIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.ID(), idColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, guard( gmco.OrderDate().Format( "Y-M2-D2" ), "鏃堕棿鏍煎紡閿欒" ), orderDateColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.OrderID(), orderIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.OrderLineID(), orderLineIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, [String]gmco.Price(), priceColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.PriorityName(), priorityNameColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.ProductID(), productIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.StockingPointID(), stockingPointIDColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.SalesSegmentName(), salesegmentNameColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, [String]gmco.Quantity(), quantityColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.UnitOfMeasureName(), unitofmeasureNameColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.OrderType(), orderTypeColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, [String]gmco.IsAvailable(), isAvailableColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.ProductGrade(), productGradeColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.SegmentPriority(), segmentPriorityColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, gmco.SheetProfitability(), sheetProfitabilityColumn, gloabal_ShowRow );
+      Global_ShowCell::SetColumnsAndRows( globalOTDTable, guard( gmco.OrderTime().Format( "Y-M2-D2" ), "鏃堕棿鏍煎紡閿欒" ), orderTimeColumn, gloabal_ShowRow );
+           
+      i++;                                                             
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Global_ShowCell/StaticMethod_SetColumnsAndRows.qbl b/_Main/BL/Type_Global_ShowCell/StaticMethod_SetColumnsAndRows.qbl
new file mode 100644
index 0000000..1e31a53
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/StaticMethod_SetColumnsAndRows.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SetColumnsAndRows (
+  GlobalOTDTable globalOTDTable,
+  String value,
+  Global_ShowColumn global_ShowColumn,
+  Global_ShowRow global_ShowRow
+)
+{
+  TextBody:
+  [*
+    global_ShowCell := globalOTDTable.Global_ShowCell( relnew, Value := value );
+    global_ShowCell.Global_ShowColumn( relset, global_ShowColumn );
+    global_ShowCell.Global_ShowRow( relset, global_ShowRow );
+  *]
+}
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..7eebedc
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowCell/StaticMethod_ShowData.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ShowData (
+  GlobalOTDTable globalOTDTable,
+  Global_BrokerExecuteLog global_BrokerExecuteLog
+)
+{
+  TextBody:
+  [*
+    if ( global_BrokerExecuteLog.BrokerName() = "GlobalOTDTable_CustomOrder" ) {
+      Global_ShowCell::CreateShowData_CustomOrder( globalOTDTable );
+    }
+  *]
+}
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/StaticMethod_CreateColumn.qbl b/_Main/BL/Type_Global_ShowColumn/StaticMethod_CreateColumn.qbl
new file mode 100644
index 0000000..2fac7cb
--- /dev/null
+++ b/_Main/BL/Type_Global_ShowColumn/StaticMethod_CreateColumn.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateColumn (
+  GlobalOTDTable globalOTDTable,
+  Number columnIndex,
+  String columnName
+) as Global_ShowColumn
+{
+  TextBody:
+  [*
+    global_ShowColumn := globalOTDTable.Global_ShowColumn( relnew, ColumnIndex := columnIndex, ColumnName := columnName );
+    
+    return global_ShowColumn;
+  *]
+}
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_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl b/_Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl
new file mode 100644
index 0000000..a8c4845
--- /dev/null
+++ b/_Main/BL/Type_H_CustomOrder/_ROOT_Type_H_CustomOrder.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type H_CustomOrder
+{
+  #keys: '5[414724.0.177854646][414724.0.177854644][0.0.0][414724.0.177854645][414724.0.177854647]'
+  BaseType: Object
+  Description: '閲嶅缓鍚庣殑璁㈠崟'
+  StructuredName: 'H_CustomOrders'
+}
diff --git a/_Main/BL/Type_H_Forecast/Attribute_StockingPointID.qbl b/_Main/BL/Type_H_Forecast/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..62a27b5
--- /dev/null
+++ b/_Main/BL/Type_H_Forecast/Attribute_StockingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414724.0.149657552][414724.0.149657551][414724.0.149657553]'
+  Description: '搴撳瓨鐐�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl
deleted file mode 100644
index 7118da1..0000000
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_NewStaticMethod.qbl
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod NewStaticMethod () as owning JSON
-{
-  TextBody:
-  [*
-    jResult := JSON::Object().Add( "A","123");
-    return jResult.Build();
-  *]
-}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetBOMBySKU.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetBOMBySKU.qbl
new file mode 100644
index 0000000..11d0768
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetBOMBySKU.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_GetBOMBySKU (
+  GlobalOTDTable GlobData,
+  String SKU
+) as Global_MappingOperationBOM
+{
+  Description: '鏍规嵁SKU鑾峰彇BOM'
+  TextBody:
+  [*
+    Obj :=null( Global_MappingOperationBOM,constcontent );
+    if( not isnull( GlobData) and SKU.Length()>0)
+    {
+      Obj := select( GlobData,Global_MappingOperationBOM,ObjM,ObjM.ProductCode()=SKU);
+    }
+    return Obj;
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl
new file mode 100644
index 0000000..2f75b5f
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetMaterialData.qbl
@@ -0,0 +1,109 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_GetMaterialData (
+  MacroPlan Owner,
+  String ParentSKU,
+  Number ProductQty,
+  String ForecastId,
+  String VCode,
+  Date NDate,
+  GlobalOTDTable GlobData
+) as owning JSON
+{
+  Description: '鑾峰彇鐗╂枡淇℃伅'
+  TextBody:
+  [*
+    /**********************************鍒濆鍖栫墿鏂欎俊鎭�***************************************
+    *鍒涘缓浜猴細yunying
+    *鍒涘缓鏃ユ湡锛�2023-09-21 
+    *鎻忚堪锛氭牴鎹甋KU鑾峰彇涓嬩竴灞傜墿鏂欐暟鎹�,杩欓噷涓嶆槸閬嶅巻寰楀埌鎵�鏈夛紝鏃惰Е鍙戜竴娆″緱鍒颁竴灞傦紝骞剁疮璁�
+    *鍙傛暟锛�
+    *****************************************************************************************/
+    // 鍒濆鍖栫粨鏋�
+    bStatus := false;
+    strMsg :="";
+    
+    try{
+      if( GlobData.Global_MappingOperationBOM(relsize )>0)
+      {
+        // 寰楀埌涓嬩竴绾ф暟鎹�
+        AllData:= selectset( GlobData, Global_MappingOperationBOM,object,object.ProductCode()=ParentSKU);
+        ObjProduct := null( Product_MP,constcontent );
+        ObjUnit := null( Unit,constcontent );
+        MaterialType:="";
+        MaterialName:="-";
+        StockPoint := "";
+        NRate:=1.0;
+        NComponentsUsed :=0.0;
+        ObjBOM := H_FunctionClass::SM_GetBOMBySKU(GlobData,ParentSKU);
+        if(not isnull( ObjBOM))
+        {
+          NRate := ObjBOM.ComponentOutputRate();
+          NComponentsUsed := ObjBOM.UnitUsageOfComponents();
+          // 浜у嚭姣斿紓甯告寜 100%浜у嚭璁$畻
+          if( NRate <=0.0)
+          {
+            NRate :=1.0;
+          }
+        }
+        if( AllData.Size()>0)
+        {
+          traverse( AllData,Elements,Obj,not isnull( Obj))
+          {
+            // 寰楀埌褰撳墠宸插瓨鍦ㄧ殑鐗╂枡淇℃伅锛堣鍗旾D + SKU锛�
+            ObjMaterial := select( Owner,H_MaterialInfo,ObjM,ObjM.ForecastID()=ForecastId and ObjM.SKU()=Obj.ComponentCode());
+            if( isnull( ObjMaterial))
+            {
+              // 鐗╂枡绫诲瀷
+              MaterialType := Obj.ProductType();
+              // 寰楀埌鐗╂枡淇℃伅
+              ObjProduct:= H_FunctionClass::SM_GetProductInfo(Owner,Obj.ComponentCode());
+              if( not isnull( ObjProduct))
+              {
+                MaterialType:= ObjProduct.ParentID();
+                MaterialName:=ObjProduct.Name();
+              }
+              ObjUnit:= H_FunctionClass::SM_GetUnitBySKU( Owner,Obj.ComponentCode());
+              if( not isnull( ObjUnit))
+              {
+                StockPoint:= ObjUnit.Name();
+              }
+              Owner.H_MaterialInfo(relnew,ParentSKU := ParentSKU,SKU := Obj.ComponentCode(),ForecastID := ForecastId,OrgCode := Obj.OrganCode(),VCode := VCode
+                                    ,ID := H_FunctionClass::SM_GenerateID( "MI"),MaterialType := MaterialType,NeedDate := NDate
+                                    ,NeedQty := [Number](ProductQty/NRate*NComponentsUsed).Round( 0),Unit := Obj.UnitOfMeasureName()
+                                    ,StockPoint :=StockPoint,MaterialName := MaterialName );
+            }
+            else
+            {
+              // 鑰冭檻鏄惁瑕佹洿鏂版暟鎹紝鏆備笉澶勭悊
+            }
+          }
+        }
+      }
+      // 娌℃湁BOM 娣诲姞娴嬭瘯鏁版嵁
+      else
+      {
+        nCount :=Owner.H_MaterialInfo(relsize );
+        Owner.H_MaterialInfo(relnew,ParentSKU := ParentSKU,SKU := "SKU"+ nCount.AsQUILL() ,ForecastID := ForecastId,OrgCode := "ORG_000",VCode := VCode
+                                    ,ID := H_FunctionClass::SM_GenerateID( "MI"),MaterialType := "鍘熸潗鏂�",NeedDate := NDate
+                                    ,NeedQty := [Number](ProductQty*0.8).Round( 0),Unit := "PCS"
+                                    ,StockPoint :="娴嬭瘯",MaterialName := "娴嬭瘯鏁版嵁" );
+        Owner.H_MaterialInfo(relnew,ParentSKU := ParentSKU,SKU := "SKU_M"+ (nCount+1).AsQUILL() ,ForecastID := ForecastId,OrgCode := "ORG_000",VCode := VCode
+                                    ,ID := H_FunctionClass::SM_GenerateID( "MI"),MaterialType := "鍗婃垚鍝�",NeedDate := NDate
+                                    ,NeedQty := [Number](ProductQty*0.8).Round( 0),Unit := "PCS"
+                                    ,StockPoint :="娴嬭瘯",MaterialName := "娴嬭瘯鏁版嵁" );
+      }
+      bStatus := true;
+      strMsg :="";
+    }
+    onerror
+    {
+      strMsg :="鍔犺浇鐗╂枡澶辫触锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
+      Owner.H_ErrorLogs(relnew,EClassName := "H_FunctionClass",EDateTime := DateTime::ActualGMTTime(),EFunctionName := "SM_InitialForcastData",
+                         DeveloperInformation :=  e.DeveloperInformation(),ErrorNr := e.ErrorNr(),DetailedInformation := e.DetailedInformation(),
+                         GeneralInformation := e.GeneralInformation());                
+    }
+    return JSON::Object().Add( "Status",bStatus)
+                         .Add( "Msg",strMsg).Build();
+  *]
+}
diff --git "a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl" "b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl"
new file mode 100644
index 0000000..09e6868
--- /dev/null
+++ "b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetProductInfo\0431.qbl"
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_GetProductInfo (
+  MacroPlan Owner,
+  String SKU
+) as Product_MP
+{
+  Description: '鏍规嵁SKU鑾峰彇鐗╂枡淇℃伅'
+  TextBody:
+  [*
+    // 鏍规嵁SKU鑾峰彇鐗╂枡淇℃伅
+    // 娉ㄦ剰锛氱墿鏂欑被鍨嬪彇 ParentID
+    Obj := null( Product_MP,constcontent );
+    if( not isnull( Owner) and SKU.Length()>0)
+    {
+      Obj:= select( Owner,Product_MP,ObjMP,ObjMP.ID()=SKU);
+    }
+    return Obj;
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetUnitBySKU.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetUnitBySKU.qbl
new file mode 100644
index 0000000..cfa808a
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_GetUnitBySKU.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_GetUnitBySKU (
+  MacroPlan Owner,
+  String SKU
+) as Unit
+{
+  Description: '閫氳繃SKU鑾峰彇搴撳瓨鐐逛俊鎭�'
+  TextBody:
+  [*
+    Obj :=null( Unit,constcontent );
+    if( not isnull( Owner) and SKU.Length()>0)
+    {
+      OrgCode := select( Owner,MappingBOM,ObjM,ObjM.ProductCode()=SKU);
+      if( not isnull( OrgCode))
+      {
+        Obj := select( Owner,Unit,ObjU,ObjU.ID()=  OrgCode.OrganCode());
+      }
+    }
+    return Obj;
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl
deleted file mode 100644
index 5bf028e..0000000
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastData.qbl
+++ /dev/null
@@ -1,71 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod SM_InitialForcastData (
-  MacroPlan Owner
-) as owning JSON
-{
-  Description: '鍒濆鍖栬鍗曢娴嬩俊鎭�'
-  TextBody:
-  [*
-    /**********************************鍒濆鍖栬鍗曢娴嬩俊鎭�***************************************
-    *娉細鏈‘瀹氫笂娓搁娴嬭鍗曟洿鏂伴�昏緫鍜屾暟鎹湁鏁堟�э紝杩欓噷杩涜浜屾澶勭悊锛屾柊鐢熸垚涓�涓垪琛紝閬垮厤涓婃父淇℃伅鍙樺姩涓ラ噸
-    *    褰卞搷鍔熻兘
-    *
-    *****************************************************************************************/
-    // 鍒濆鍖栫粨鏋�
-    bStatus := false;
-    strMsg :="";
-    
-    try{
-      // 棰勬祴鏁版嵁2姝ゅ鐞嗭紙绛涢��+瀹㈡埛鍚嶇О鎻愬彇锛�
-      if(Owner.H_Forecast(relget ).Size()>0)
-      {
-        traverse( Owner,H_Forecast,Obj,not isnull( Obj))
-        {
-          Owner.H_Forecast(reldelete, Obj);
-        }
-      }
-      AllData:= selectset( Owner, Product_MP.SalesDemand.astype( Forecast ),object,object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() 
-                           and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()
-                           and object.Quantity()>0 );
-      
-      CustomName:="";
-      DepartMent:="";
-      idx:=0;
-      traverse( AllData,Elements,Obj,not isnull(Obj))
-      {
-        idx:=Obj.SalesSegmentName().FindString( "-",0);
-        if(idx>0)
-        {
-          DepartMent:=Obj.SalesSegmentName().SubString( 0,idx);
-          CustomName := Obj.SalesSegmentName().SubString( idx+1, Obj.SalesSegmentName().Length() - (idx+1));
-        }
-        else
-        {
-          CustomName :=Obj.SalesSegmentName();
-          DepartMent := Obj.SalesSegmentName();
-        }
-        
-         Owner.H_Forecast(relnew,OrderCode := H_FunctionClass::SM_GenerateID( "OF"),
-                                SKU := Obj.ProductID(),
-                                CustomCode := CustomName,
-                               CustomName := CustomName,
-                               Util:=Obj.UnitOfMeasureName(),
-                               NeedTime:=Obj.EndDate(),
-                               ForecastQty:=[Number]Obj.Quantity().Round( 0),
-                               Department:=DepartMent);
-      }
-      bStatus := true;
-      strMsg :="璁㈠崟棰勬祴鍒濆鍖栨垚鍔�!";
-    }
-    onerror
-    {
-      strMsg :="璁㈠崟棰勬祴鍒濆鍖栧け璐ワ紝鍙兘褰卞搷鍐插噺璁$畻锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
-      Owner.H_ErrorLogs(relnew,EClassName := "H_FunctionClass",EDateTime := DateTime::ActualGMTTime(),EFunctionName := "SM_InitialForcastData",
-                         DeveloperInformation :=  e.DeveloperInformation(),ErrorNr := e.ErrorNr(),DetailedInformation := e.DetailedInformation(),
-                         GeneralInformation := e.GeneralInformation());                
-    }
-    return JSON::Object().Add( "Status",bStatus)
-                         .Add( "Msg",strMsg).Build();
-  *]
-}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl
new file mode 100644
index 0000000..d8870c8
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_InitialForcastDataEx.qbl
@@ -0,0 +1,110 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_InitialForcastDataEx (
+  MacroPlan Owner,
+  Boolean IsNew,
+  String VersionCode
+) as owning JSON
+{
+  Description: '鍒濆鍖栬鍗曢娴嬩俊鎭�'
+  TextBody:
+  [*
+    /**********************************鍒濆鍖栬鍗曢娴嬩俊鎭�***************************************
+    *娉細鏈‘瀹氫笂娓搁娴嬭鍗曟洿鏂伴�昏緫鍜屾暟鎹湁鏁堟�э紝杩欓噷杩涜浜屾澶勭悊锛屾柊鐢熸垚涓�涓垪琛紝閬垮厤涓婃父淇℃伅鍙樺姩涓ラ噸
+    *    褰卞搷鍔熻兘
+    *鍙傛暟锛欼sNew 鏄惁鏃跺叏鏂版暟鎹紝鍏ㄦ柊鏁版嵁浼氬皢鏃х殑鏁版嵁娓呴櫎锛岀劧鍚庨噸鏂板~鍏咃紝涓嶆槸鍏ㄦ柊鏁版嵁锛屽皢绱鍜屾洿鏂�
+    *****************************************************************************************/
+    // 鍒濆鍖栫粨鏋�
+    bStatus := false;
+    strMsg :="";
+    
+    try{
+      // 20230925 浼樺寲鐨勪笟鍔¢�昏緫,濡傛灉鏃舵柊鏁版嵁锛屽垯棰勬祴鏁版嵁鍏ㄩ儴骞叉帀锛岀劧鍚庨噸鏂扮敓鎴�
+      if( IsNew)
+      {
+        if( Owner.H_OrderForecastRealQty(relsize )>0)
+        {
+          traverse( Owner,H_OrderForecastRealQty,Obj,not isnull( Obj))
+          {
+            Owner.H_OrderForecastRealQty(reldelete, Obj);
+          }
+        }
+      }
+      
+      // 鑾峰彇棰勬祴璁㈠崟锛氬綋鏈堝拰涔嬪悗鐨�3涓湀棰勬祴鏁版嵁 涓旈娴嬫暟閲�>0鐨�
+      AllData:= selectset( Owner, Product_MP.SalesDemand.astype( Forecast ),object,
+                           object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() 
+                           // 闇�姹傜粰鏈潵4涓湀鐨勬暟鎹紝浣嗗彲鑳藉苟涓嶅噯纭紝鏆傛椂娉ㄩ噴鎺夛紝鍥涗釜鏈堥檺鍒�
+                           //and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()
+                           and object.Quantity()>0 );
+      
+      CustomName:="";
+      DepartMent:="";
+      idx:=0;
+      RQty:=0;
+      ObjOrderRealQty:=null( H_OrderForecastRealQty,constcontent );
+      SKU:="";
+      SKUName := "";
+    
+      traverse( AllData,Elements,Obj,not isnull(Obj))
+      {
+        // 娌℃湁瀹㈡埛淇℃伅鍜岄儴闂ㄤ俊鎭紝SalesSegmentName=浜嬩笟閮�+鈥�-鈥�+瀹㈡埛鍚嶇О
+        CustomName := Obj.SalesSegmentName();
+        DepartMent := Obj.SalesSegmentName();
+        SKU :=Obj.ProductID();
+        // 杩欓噷鐢ㄦ煡鎵惧悗鎴彇锛屽洜涓轰笉纭畾鏈夊嚑涓í绾匡紝浠ョ涓�涓负鍑�
+        idx:=Obj.SalesSegmentName().FindString( "-",0);
+        if(idx>0)
+        {
+          DepartMent:=Obj.SalesSegmentName().SubString( 0,idx);
+          CustomName := Obj.SalesSegmentName().SubString( idx+1, Obj.SalesSegmentName().Length() - (idx+1));
+        }
+        
+        // 鑾峰彇鐗╂枡淇℃伅
+        ObjMaterial := H_FunctionClass::SM_GetProductInfo( Owner,Obj.ProductID());
+        if(not isnull( ObjMaterial))
+        {
+          SKUName := ObjMaterial.Name();
+        }
+        
+         // 鏇存柊棰勬祴淇℃伅锛岄潪鏂版暟鎹洿鏂颁俊鎭��
+         ObjOrderRealQty := select( Owner,H_OrderForecastRealQty,ObjO,ObjO.CustomCode()=CustomName and ObjO.SKU()=Obj.ProductID() 
+                                    and ObjO.Month().StartOfMonth() = Obj.EndDate().StartOfMonth() )
+         if( IsNew or isnull( ObjOrderRealQty))
+         {
+           Owner.H_OrderForecastRealQty(relnew,CustomCode := CustomName,CustomName := CustomName,ForecastQty := [Number]Obj.Quantity().Round( 0)
+                                         ,ForecatsRealQty := [Number]Obj.Quantity().Round( 0),ID := H_FunctionClass::SM_GenerateID( "OR")
+                                         ,Month := Obj.EndDate(),SKU := Obj.ProductID(),Unit := Obj.UnitOfMeasureName()
+                                         ,Department := DepartMent,VCode := VersionCode,SKUName := SKUName);
+         }
+         else
+         {
+           // 鏇存柊浜嗛娴嬫暟鎹紝鍒欒绠楀疄鏃舵暟鎹鍑�
+            if( [Number]Obj.Quantity().Round( 0)<> ObjOrderRealQty.ForecastQty())
+            {
+                  RQty := [Number]Obj.Quantity().Round( 0) - ObjOrderRealQty.ForecastQty();
+                  RQty := ObjOrderRealQty.ForecatsRealQty() + RQty;
+                  if( RQty<0)
+                  {
+                      RQty :=0;
+                  }
+                  ObjOrderRealQty.ForecastQty([Number]Obj.Quantity().Round( 0));
+                  ObjOrderRealQty.ForecatsRealQty(RQty);
+            }
+         }
+      }
+      
+      bStatus := true;
+      strMsg :="璁㈠崟棰勬祴鍒濆鍖栨垚鍔�!";
+    }
+    onerror
+    {
+      strMsg :="璁㈠崟棰勬祴鍒濆鍖栧け璐ワ紝鍙兘褰卞搷鍐插噺璁$畻锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
+      Owner.H_ErrorLogs(relnew,EClassName := "H_FunctionClass",EDateTime := DateTime::ActualGMTTime(),EFunctionName := "SM_InitialForcastData",
+                         DeveloperInformation :=  e.DeveloperInformation(),ErrorNr := e.ErrorNr(),DetailedInformation := e.DetailedInformation(),
+                         GeneralInformation := e.GeneralInformation());                
+    }
+    return JSON::Object().Add( "Status",bStatus)
+                         .Add( "Msg",strMsg).Build();
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
index d096a87..b044a49 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_MaterialReverse.qbl
@@ -39,7 +39,7 @@
         nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
         // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
         OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = SKU 
-                                              and Obj.CustomID() = CustomerCode 
+                                              and Obj.CustomCode() = CustomerCode 
                                               and Obj.Month().Format( "YM2") = Date::ActualDate().Format( "YM2"));                                   
         if ( not isnull(OrderForecast))
         {
@@ -195,10 +195,9 @@
           {
             Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := SKU,
                                                                                             Month := Date::ActualDate(),
-                                                                                            CustomID := CustomerCode,
+                                                                                            CustomCode := CustomerCode,
                                                                                             CustomName := "瀹㈡埛琛ㄨ幏鍙�",
-                                                                                            OrderCode := "-",
-                                                                                            ForecatsQty :=0,
+                                                                                            ForecastQty := 0,
                                                                                             ForecatsRealQty :=nForecastQtyNew,
                                                                                             Unit := "SKU 鍒扮墿鏂欒〃鑾峰彇");
           } 
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl
new file mode 100644
index 0000000..88c8f1d
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedging.qbl
@@ -0,0 +1,237 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_OrderHedging (
+  MacroPlan Owner,
+  Boolean IsNew,
+  String Operator,
+  String OperatorType
+) as owning JSON
+{
+  Description: '璁㈠崟鍐插噺璋冪敤鍑芥暟'
+  TextBody:
+  [*
+    /************************************璁㈠崟鍐插噺璋冪敤******************************
+    *鍑芥暟鍚嶏細SM_OrderHedging
+    *鍒涘缓浜猴細yunying
+    *鍒涘缓鏃堕棿锛�20230-09-24
+    *鎻忚堪锛氱郴缁熷唴璁㈠崟鍐插噺璋冪敤鍑芥暟锛孖sNew=true鏃讹紝閲嶆柊澶勭悊棰勬祴淇℃伅锛孖sNew=false鏃讹紝鐢ㄩ娴嬬疮璁′俊鎭��
+    *****************************************************************************/
+    // 鍒濆鍖栫粨鏋�
+    bStatus := false;
+    strMsg :="";
+    // 鑾峰彇鐗堟湰鍙�,杩欓噷鏄惁闇�瑕佸拰鐗堟湰鍙峰姛鑳藉鎺�
+    VCode :=H_FunctionClass::SM_GenerateID("VC");
+    
+    try{
+      if( not isnull( Owner))
+      {
+        // 鍒濆鍖栭娴嬩俊鎭�
+        JResult := H_FunctionClass::SM_InitialForcastDataEx( Owner,IsNew,"--");
+        // 棰勬祴鍒濆鍖栧畬鎴�
+        if( JResult.Get( "Status").GetBoolean())
+        {
+          nForecastQtyOld := 0; //鍘熼娴嬫暟閲�
+          nReverseQtyOld :=0;   //鍘熷弽绛炬暟閲�
+          nAuthorizeQtyOld :=0; //鍘熸巿鏉冩暟閲�
+          nForecastQtyNew :=0;  //璁$畻鍚庣殑棰勬祴鏁伴噺
+          nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
+          nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
+          nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
+          nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
+          OrderQuantity := 0;   //鍓╀綑璁㈠崟鏁伴噺
+          traverse( Owner,SalesDemand.astype( CustomerOrder ),ObjOrder)
+          {
+            // 鐩存帴鍒犻櫎鏈湀涔嬪墠鐨勮鍗�
+            if( ObjOrder.EndDate()<Date::ActualDate().StartOfMonth())
+            {
+               ObjOrder.Delete();  
+            }
+            else
+            {
+              //----------------------------------------浠ヤ笅鍚庡幓棰勬祴 鍙嶇 鎺堟潈鏁版嵁淇℃伅----------------
+              nForecastQtyOld := 0; //鍘熼娴嬫暟閲�
+              nReverseQtyOld :=0;   //鍘熷弽绛炬暟閲�
+              nAuthorizeQtyOld :=0; //鍘熸巿鏉冩暟閲�
+              nForecastQtyNew :=0;  //璁$畻鍚庣殑棰勬祴鏁伴噺
+              nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
+              nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
+              nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
+              nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
+              OrderQuantity := 0;   //鍓╀綑璁㈠崟鏁伴噺
+              // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
+              OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
+                                                    and Obj.CustomCode() = ObjOrder.CustomerName() 
+                                                    and Obj.Month().Format( "YM2") =ObjOrder.EndDate().Format( "YM2"));
+              if ( not isnull(OrderForecast))
+              {
+                  nForecastQtyOld := OrderForecast.ForecatsRealQty();
+                  nForecastQtyNew := nForecastQtyOld;
+              }
+              // 鑾峰彇鍙嶇鏁伴噺锛堝彧鍒ゆ柇SKU锛�
+              ObjReverse := select(Owner, H_ReverseRealQty , Obj, Obj.SKU() = ObjOrder.ProductID());
+              if ( not isnull(ObjReverse))
+              {
+                  nReverseQtyOld := ObjReverse.ReverseRealQty();
+                  nReverseQtyNew := nReverseQtyOld;
+              }
+              // 鑾峰彇鎺堟潈鏁伴噺锛堝鎴稩D+SKU锛�
+              ObjAuthorize := select(Owner, H_AuthorizeRealQty , Obj, Obj.SKU() = ObjOrder.ProductID() 
+                                                                      and Obj.CustomID() = ObjOrder.CustomerName());
+              if ( not isnull(ObjAuthorize))
+              {
+                  nAuthorizeQtyOld := ObjAuthorize.AuthorizeRealQty();
+                  nAuthorizeQtyNew :=nAuthorizeQtyOld;
+              }
+              //-----------------------------浠ヤ笅璁㈠崟鍐插噺--------------------
+              // 鎺堟潈璁板綍ID
+              AQID := H_FunctionClass::SM_GenerateID( "AQ");
+              // 璁㈠崟鍓╀綑鏁伴噺
+              OrderQuantity := [Number]ObjOrder.Quantity().Round( 0);
+              // 1 鍏堝啿鎺堟潈
+              if( OrderQuantity>0 and nAuthorizeQtyOld>0)
+              { 
+                 OrderQuantity := OrderQuantity-nAuthorizeQtyOld;
+                 nAuthorizeQtyNew :=0; 
+                 if( OrderQuantity<0)
+                 {
+                   nAuthorizeQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                 }
+              }
+              // 2 鍐嶅啿鍙嶇
+              if( OrderQuantity>0 and nReverseQtyOld>0)
+              { 
+                 OrderQuantity := OrderQuantity-nReverseQtyOld;
+                 nReverseQtyNew :=0; 
+                 if( OrderQuantity<0)
+                 {
+                   nReverseQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                 }
+              }
+              // 3 鏈�鍚庡啿棰勬祴
+              if( OrderQuantity>0)
+              { 
+                 //榛樿璁㈠崟鏁伴噺>棰勬祴鏁伴噺
+                 OrderQuantity := OrderQuantity-nForecastQtyOld;
+                 nForecastQtyNew :=0;
+                 nHaveForecastQty := nForecastQtyOld;
+                 nNoHaveForecastQty := OrderQuantity; 
+                 if( OrderQuantity<0)
+                 {
+                   nForecastQtyNew := abs(OrderQuantity);
+                   OrderQuantity :=0;
+                   nHaveForecastQty := nForecastQtyOld - nForecastQtyNew;
+                   nNoHaveForecastQty := 0;
+                 }
+              }
+              // 璁板綍鍔ㄤ綔
+              Owner.H_OrderRecord(relnew,
+                                     ID := AQID,
+                                     VCode:=VCode,
+                                     SKU:=ObjOrder.ProductID(),
+                                     ReverseQty := nReverseQtyNew,
+                                     CustomerCode := ObjOrder.CustomerName(),
+                                     CustomerName := ObjOrder.CustomerName(),
+                                     ForecastQty := nForecastQtyNew,
+                                     OrderDateTime := ObjOrder.EndDate(),
+                                     OrderQty := [Number]ObjOrder.Quantity().Round( 0),
+                                     OrderCode:=ObjOrder.OrderID(),
+                                     AuthorizeQty := nAuthorizeQtyNew,
+                                     ReverseDeductQty := nReverseQtyOld - nReverseQtyNew,
+                                     AuthorizeDeductQty := 0,
+                                     ForecastHitQty :=nHaveForecastQty,
+                                     ForecastNoHitQty :=nNoHaveForecastQty,
+                                     OperateType := OperatorType,
+                                     Operator := Operator,
+                                     Unit := ObjOrder.UnitOfMeasureName(),
+                                     OperateQty := [Number]ObjOrder.Quantity().Round( 0),
+                                     OperateTime := DateTime::ActualTime());
+              // 绾娴嬭鍗�
+              if( nForecastQtyNew>0)
+              {
+                FOrder := ObjOrder.Copy();
+                FOrder.OrderTag("绾娴�");
+                FOrder.Quantity(nForecastQtyNew);
+              }
+              // 鏈夐娴嬭鍗�
+              if(nHaveForecastQty>0)
+              {
+                HFOrder := ObjOrder.Copy();
+                HFOrder.OrderTag("鏈夐娴�");
+                HFOrder.Quantity(nHaveForecastQty);
+              }
+              // 鏃犻娴�
+              if(nNoHaveForecastQty>0)
+              {
+                NHFOrder := ObjOrder.Copy();
+                NHFOrder.OrderTag("鏃犻娴�");
+                NHFOrder.Quantity(nNoHaveForecastQty);
+              }
+              // ERP鍙嶇鎺堟潈璁㈠崟-鎺ュ彛鏈彁渚�
+             
+              // 鏇存柊褰撳墠鍙嶇鏁伴噺
+              if( not isnull( ObjReverse))
+              {
+                ObjReverse.ReverseRealQty(nReverseQtyNew);
+              }
+              else
+              {
+                Owner.H_ReverseRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "RQ"),SKU := ObjOrder.ProductID(),Unit := ObjOrder.UnitOfMeasureName()
+                                        ,ReverseRealQty := nReverseQtyNew);
+              } 
+              // 鏇存柊鎺堟潈
+              if( not isnull( ObjAuthorize))
+              {
+                ObjAuthorize.AuthorizeRealQty(nAuthorizeQtyNew);
+              }
+              else
+              {
+                Owner.H_AuthorizeRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "AR"),SKU := ObjOrder.ProductID(),
+                                                                                                Month := ObjOrder.EndDate(),
+                                                                                                CustomID := ObjOrder.CustomerName(),
+                                                                                                CustomName := ObjOrder.CustomerName(),
+                                                                                                OrderCode := "-",
+                                                                                                AuthorizeRealQty :=nAuthorizeQtyNew,
+                                                                                                Unit := ObjOrder.UnitOfMeasureName());
+              } 
+              // 鏇存柊棰勬祴
+              if( not isnull( OrderForecast))
+              {
+                OrderForecast.ForecatsRealQty(nForecastQtyNew);
+              }
+              else
+              {
+                Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := ObjOrder.ProductID(),
+                                                                                                Month := ObjOrder.EndDate(),
+                                                                                                CustomCode := ObjOrder.CustomerName(),
+                                                                                                CustomName := ObjOrder.CustomerName(),
+                                                                                                ForecastQty := 0,
+                                                                                                ForecatsRealQty :=nForecastQtyNew,
+                                                                                                Unit := ObjOrder.UnitOfMeasureName());
+              }
+              ObjOrder.Delete();
+            }
+          }
+        }
+        else
+        {
+          strMsg:="棰勬祴璁㈠崟淇℃伅鍔犺浇澶辫触锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
+        }  
+      }
+    }
+    onerror
+    {
+      strMsg :="璁㈠崟鍐插噺鍙戠敓閿欒锛岃鑱旂郴绯荤粺绠$悊鍛橈紒";
+      // 杩欓噷鏄惁瑕佸垹闄ゅ凡鍒涘缓鐨勬暟鎹紵寰呭畾锛屽鏋滄寜鐗堟湰鍙峰彲浠ヤ笉鍒犻櫎
+      
+      // 璁板綍閿欒鏃ュ織
+      Owner.H_ErrorLogs(relnew,EClassName := "H_FunctionClass",EDateTime := DateTime::ActualGMTTime(),EFunctionName := "SM_InitialForcastData",
+                         DeveloperInformation :=  e.DeveloperInformation(),ErrorNr := e.ErrorNr(),DetailedInformation := e.DetailedInformation(),
+                         GeneralInformation := e.GeneralInformation());                
+    }
+    return JSON::Object().Add( "Status",bStatus)
+                         .Add( "VersionCode",VCode)
+                         .Add( "Msg",strMsg).Build();
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedgingEx.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedgingEx.qbl
new file mode 100644
index 0000000..4379bdc
--- /dev/null
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderHedgingEx.qbl
@@ -0,0 +1,181 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SM_OrderHedgingEx (
+  MacroPlan Owner,
+  String Operator
+) as owning JSON
+{
+  Description: '濉骇鍚庡啿鍑�'
+  TextBody:
+  [*
+    /*******************************濉骇鍚庤鍗曞啿鍑�***********************
+    *鍑芥暟鍚嶇О锛歋M_OrderHedgingEx
+    *鍒� 寤� 浜猴細yunying
+    *鍒涘缓鏃堕棿锛�2023-09-27
+    *鎻�    杩帮細濉骇鍚庤鍗曞啿鍑�,濉骇鍚庣殑琛細Owner.FillingCapacityOrder
+    *鍙�    鏁帮細Operator 鎿嶄綔浜�
+    *杩� 鍥� 鍊硷細JSON {Status: true 鎴愬姛/false 澶辫触,Msg:"鎻愮ず娑堟伅",Count: 0锛堝啿鍑忚鍗曠殑鏁伴噺锛墋
+    *******************************************************************/
+    // 鍒濆鍖栫粨鏋�
+    bStatus := false;
+    strMsg :="";
+    // 鍐插噺鎴愬姛鏉℃暟
+    nCount:=0;
+    try
+    {
+      if(not isnull( Owner))
+      {
+        // 鑾峰彇鎿嶄綔璁㈠崟
+        NewOrders := selectset( Owner,FillingCapacityOrder,Obj,Obj.State() = "鏈啿鍑�" or Obj.State() ="");
+        if(NewOrders.Size()>0)
+        {
+          // 鏂拌鍗曚笌鍘熻鍗曞啿鍑�
+          traverse( NewOrders,Elements,Obj)
+          {
+            if( (Obj.OrderType()="鍙嶇" or Obj.OrderType()="鎺堟潈") and Obj.Quantity()>0 )
+            {
+              // 寰楀埌鎿嶄綔鐩稿叧鐨勫弽绛捐鍗�
+              ROrders:= select( Owner,SalesDemand.astype( CustomerOrder ),ObjOrder,
+                                   ObjOrder.CustomerName() = Obj.Customer() 
+                                   and ObjOrder.ProductID()=Obj.ProductID() 
+                                   and ObjOrder.OrderTag() ="鍙嶇"
+                                   );
+              // 鍙嶇鏃犲啿鍑忥紝鐩存帴鍚戣鍗曚腑鍔犲叆鍙嶇鏁版嵁
+              if( Obj.OrderType()="鍙嶇")
+              {
+                if( not isnull( ROrders))
+                {
+                  ROrders.Quantity(ROrders.Quantity()+Obj.Quantity());
+                }
+                else
+                {
+                  // 鏂板璁㈠崟
+                  error( "----------------璇峰疄鐜版柊澧炲弽绛捐鍗曞姛鑳戒唬鐮�---------------------");
+                  // 璁㈠崟蹇呰淇℃伅濡備笅锛�
+                  // OrderTag = "鍙嶇"
+                  // Quantity = Obj.Quantity()
+                  // 鍏朵粬淇℃伅缁ф壙褰撳墠鐨勮鍗�
+                }
+              }
+              else if(Obj.OrderType()="鎺堟潈")
+              {
+                // 寰楀埌鎿嶄綔鐩稿叧鐨勬巿鏉冭鍗�
+                AOrders:= select( Owner,SalesDemand.astype( CustomerOrder ),ObjOrder,
+                                   ObjOrder.CustomerName() = Obj.Customer() 
+                                   and ObjOrder.ProductID()=Obj.ProductID() 
+                                   and ObjOrder.OrderTag() ="鎺堟潈"
+                                   );
+                if( not isnull( ROrders))
+                {
+                  // 褰撳墠鍙嶇鏁伴噺
+                  RQty:=ROrders.Quantity();
+                  // 璁$畻鏂扮殑鎺堟潈鏁伴噺
+                  AQty:= Obj.Quantity() - ROrders.Quantity();
+                  // 鎺堟潈澶т簬0锛屽弽绛捐鍐叉病,鍚﹀垯鎺堟潈琚啿锛屽弽绛剧瓑浜嶢Qty鐨勭粷瀵瑰��
+                  if( AQty>=0)
+                  {
+                    RQty:=0;
+                  }
+                  else
+                  {
+                    RQty :=ROrders.Quantity() - Obj.Quantity();
+                    AQty :=0;
+                  }
+                  // 鏇存柊鍙嶇鏁版嵁
+                  if( RQty>=0)
+                  {
+                    ROrders.Quantity(RQty);
+                  }
+                  else
+                  {
+                    ROrders.Delete();
+                  }
+                  // 鏇存柊鎺堟潈鏁版嵁
+                  if(AQty>0 )
+                  {
+                    if( not isnull( AOrders))
+                    {
+                      AOrders.Quantity(AOrders.Quantity()+AQty);
+                    }
+                    // 鏂板鎺堟潈璁㈠崟
+                    // error( "----------------璇峰疄鐜版柊澧炴巿鏉冭鍗曞姛鑳戒唬鐮�---------------------");
+                    customOrder := CustomerOrder::Create( select( Owner, Product_MP, tmepPMP, tmepPMP.ID() = Obj.ProductID() ),
+                                                          select( Owner, StockingPoint_MP, tempSPMP, tempSPMP.ID() = Obj.StockingPointID() ),
+                                                          OS::GenerateGUIDAsString(),
+                                                          Obj.OrderDate(),
+                                                          AQty,
+                                                          0.0,
+                                                          "Normal",
+                                                          Obj.SalesSegmentName(),
+                                                          Obj.CurrencyID(),
+                                                          Obj.UnitOfMeasureName(),
+                                                          false,
+                                                          Obj.Customer(),
+                                                          Obj.CustomerID(),
+                                                          "",
+                                                          "",
+                                                          true,
+                                                          true,
+                                                          false
+                                                         );
+                    customOrder.OrderTag( "鎺堟潈" );
+                    // 璁㈠崟蹇呰淇℃伅濡備笅锛�
+                    // OrderTag = "鎺堟潈"
+                    // Quantity = AQty
+                    // 鍏朵粬淇℃伅缁ф壙褰撳墠鐨勮鍗�  
+                  }
+                }
+                else
+                {
+                  // 灏嗘柊鎺堟潈鏁版嵁绱姞鍒拌鍗曚腑
+                  if( not isnull( AOrders))
+                  {
+                    AOrders.Quantity(AOrders.Quantity()+Obj.Quantity());
+                  }
+                  else
+                  {
+                    // 鏂板鎺堟潈璁㈠崟
+                    error( "----------------璇峰疄鐜版柊澧炴巿鏉冭鍗曞姛鑳戒唬鐮�---------------------");
+                    // 璁㈠崟蹇呰淇℃伅濡備笅锛�
+                    // OrderTag = "鎺堟潈"
+                    // Quantity = Obj.Quantity()
+                    // 鍏朵粬淇℃伅缁ф壙褰撳墠鐨勮鍗�
+                  }
+                }
+              }
+              // 鏇存柊鍐插噺鐘舵��
+              Obj.State("宸插啿鍑�");
+              nCount++;
+            }
+            else
+            {
+              // 鏃犳硶璇嗗埆鐨勭被鍨嬶紝鎴栨暟閲忎负0鏃舵殏涓嶅鐞�
+              //strMsg :="璁㈠崟绫诲瀷锛�" + Obj.OrderType() + "鏃犳硶鍐插噺锛�";
+            }
+          }
+          bStatus:=true;
+          strMsg :="濉骇鍚庡啿鍑忓畬鎴愶紒";
+        }
+        else
+        {
+          strMsg :="鏃犲彲鍐插噺鐨勬暟鎹紒";
+        }
+      }
+      else
+      {
+        strMsg :="鍔犺浇鏁版嵁澶辫触锛岃鍒涘缓鎴栭�夋嫨鍦烘櫙鍚庡啀鎿嶄綔锛�";
+      }
+    }
+    onerror
+    {
+      strMsg :="濉骇鍚庤鍗曞啿鍑忓彂鐢熼敊璇紝璇疯仈绯荤郴缁熺鐞嗗憳锛�";
+      // 璁板綍閿欒鏃ュ織
+    //  Owner.H_ErrorLogs(relnew,EClassName := "H_FunctionClass",EDateTime := DateTime::ActualGMTTime(),EFunctionName := "SM_OrderHedgingEx",
+    //                     DeveloperInformation :=  e.DeveloperInformation(),ErrorNr := e.ErrorNr(),DetailedInformation := e.DetailedInformation(),
+    //                     GeneralInformation := e.GeneralInformation());                
+    }
+    return JSON::Object().Add( "Status",bStatus)
+                         .Add( "Count",nCount)
+                         .Add( "Msg",strMsg).Build();
+  *]
+}
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
index 72a96c0..2b201ca 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_SM_OrderReverseOrAuthorize.qbl
@@ -39,10 +39,10 @@
         nReverseQtyNew :=0;   //璁$畻鍚庣殑鍙嶇鏁伴噺
         nAuthorizeQtyNew :=0; //璁$畻鍚庣殑鎺堟潈鏁伴噺
         nHaveForecastQty :=0; //鏈夐娴嬫暟閲�
-        nNoHaveForecastQty:=0;//浜旈娴嬫暟閲�
+        nNoHaveForecastQty:=0;//鏃犻娴嬫暟閲�
         // 鑾峰彇棰勬祴鏁伴噺锛堝鎴�+SKU+鏈堜唤 鐞嗚鏄病鏈夌墿鏂欓娴嬶級
         OrderForecast := select(Owner, H_OrderForecastRealQty , Obj, Obj.SKU() = SKU 
-                                              and Obj.CustomID() = CustomerCode 
+                                              and Obj.CustomCode() = CustomerCode 
                                               and Obj.Month().Format( "YM2") = Date::ActualDate().Format( "YM2"));
         if ( not isnull(OrderForecast))
         {
@@ -189,10 +189,9 @@
           {
             Owner.H_OrderForecastRealQty(relnew,ID := H_FunctionClass::SM_GenerateID( "OF"),SKU := SKU,
                                                                                             Month := Date::ActualDate(),
-                                                                                            CustomID := CustomerCode,
+                                                                                            CustomCode := CustomerCode,
                                                                                             CustomName := CustomName,
-                                                                                            OrderCode := "-",
-                                                                                            ForecatsQty :=0,
+                                                                                            ForecastQty := 0,
                                                                                             ForecatsRealQty :=nForecastQtyNew,
                                                                                             Unit := Unit);
           } 
diff --git a/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl b/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
index 988d53e..4a0d857 100644
--- a/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
+++ b/_Main/BL/Type_H_FunctionClass/StaticMethod_UpdateOrderForecastRealQty.qbl
@@ -24,7 +24,7 @@
         for ( x := 1; x <= 10; x := x + 1 )
         {
             Owner.H_OrderForecastRealQty(relnew,ID := "AAAAA_"+ x.AsQUILL(),SKU := "OTN-01-ACC-00"+ x.AsQUILL() , Month := Date::ActualDate(),CustomName := "灏忕背",
-                                          CustomID := "XM0001",OrderCode:="OD0001",ForecatsQty:=1000,ForecatsRealQty:=1000, Unit := "PCS");
+                                          CustomCode := "XM0001",ForecastQty := 1000,ForecatsRealQty:=1000, Unit := "PCS");
         }
       }
       //H_FunctionClass := Owner.H_FunctionClass(relnew,VCode_Material := VCode,UpdateTime_Material := Date::ActualDate());
diff --git a/_Main/BL/Type_H_FunctionClass/_ROOT_Type_H_FunctionClass.qbl b/_Main/BL/Type_H_FunctionClass/_ROOT_Type_H_FunctionClass.qbl
index 6cb0560..b6727c8 100644
--- a/_Main/BL/Type_H_FunctionClass/_ROOT_Type_H_FunctionClass.qbl
+++ b/_Main/BL/Type_H_FunctionClass/_ROOT_Type_H_FunctionClass.qbl
@@ -5,6 +5,6 @@
 {
   #keys: '5[414724.0.53669729][414724.0.53669727][0.0.0][414724.0.53669728][414724.0.53669730]'
   BaseType: Object
-  Description: '鍐插噺鎿嶄綔绫�'
+  Description: '鍐插噺鎿嶄綔鍏敤绫�'
   StructuredName: 'H_FunctionClasss'
 }
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_ForecastID.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_ForecastID.qbl
new file mode 100644
index 0000000..5c39ed3
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_ForecastID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ForecastID
+{
+  #keys: '3[414724.0.150662643][414724.0.150662642][414724.0.150662644]'
+  Description: '棰勬祴ID'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_ID.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_ID.qbl
new file mode 100644
index 0000000..4115813
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[414724.0.142347495][414724.0.142347494][414724.0.142347496]'
+  Description: '涓婚敭ID'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialName.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialName.qbl
new file mode 100644
index 0000000..90613a7
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaterialName
+{
+  #keys: '3[414724.0.142347535][414724.0.142347534][414724.0.142347536]'
+  Description: '鐗╂枡鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialType.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialType.qbl
new file mode 100644
index 0000000..908d0f3
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_MaterialType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaterialType
+{
+  #keys: '3[414724.0.142347525][414724.0.142347524][414724.0.142347526]'
+  Description: '鐗╂枡绫诲瀷锛氭垚鍝併�佸崐鎴愬搧銆佸師鏉愭枡锛燂紵锛燂紵'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_NeedDate.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_NeedDate.qbl
new file mode 100644
index 0000000..8be7117
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_NeedDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute NeedDate
+{
+  #keys: '3[414724.0.143344655][414724.0.143344654][414724.0.143344656]'
+  Description: '闇�姹傛椂闂�'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_NeedQty.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_NeedQty.qbl
new file mode 100644
index 0000000..e0c3a06
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_NeedQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute NeedQty
+{
+  #keys: '3[414724.0.142347555][414724.0.142347554][414724.0.142347556]'
+  Description: '闇�姹傛暟閲�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_OrgCode.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_OrgCode.qbl
new file mode 100644
index 0000000..f8a06f0
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_OrgCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrgCode
+{
+  #keys: '3[414724.0.142347565][414724.0.142347564][414724.0.142347566]'
+  Description: '缁勭粐浠g爜'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_ParentSKU.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_ParentSKU.qbl
new file mode 100644
index 0000000..9c6d50d
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_ParentSKU.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ParentSKU
+{
+  #keys: '3[414724.0.142347515][414724.0.142347514][414724.0.142347516]'
+  Description: '鐖剁墿鏂橲KU'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_SKU.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_SKU.qbl
new file mode 100644
index 0000000..2299346
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_SKU.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SKU
+{
+  #keys: '3[414724.0.142347505][414724.0.142347504][414724.0.142347506]'
+  Description: 'SKU(浜у搧銆佸崐鎴愬搧銆佺墿鏂欙級'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_StockPoint.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_StockPoint.qbl
new file mode 100644
index 0000000..1a3655c
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_StockPoint.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockPoint
+{
+  #keys: '3[414724.0.142347575][414724.0.142347574][414724.0.142347576]'
+  Description: '搴撳瓨鐐�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_Unit.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_Unit.qbl
new file mode 100644
index 0000000..2ec2674
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[414724.0.142347545][414724.0.142347544][414724.0.142347546]'
+  Description: '鍗曚綅'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/Attribute_VCode.qbl b/_Main/BL/Type_H_MaterialInfo/Attribute_VCode.qbl
new file mode 100644
index 0000000..66f81ea
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/Attribute_VCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VCode
+{
+  #keys: '3[414724.0.142347585][414724.0.142347584][414724.0.142347586]'
+  Description: '鐗堟湰鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_MaterialInfo/_ROOT_Type_H_MaterialInfo.qbl b/_Main/BL/Type_H_MaterialInfo/_ROOT_Type_H_MaterialInfo.qbl
new file mode 100644
index 0000000..d2309be
--- /dev/null
+++ b/_Main/BL/Type_H_MaterialInfo/_ROOT_Type_H_MaterialInfo.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type H_MaterialInfo
+{
+  #keys: '5[414724.0.142347475][414724.0.142347473][0.0.0][414724.0.142347474][414724.0.142347476]'
+  BaseType: Object
+  Description: '鐗╂枡淇℃伅'
+  StructuredName: 'H_MaterialInfos'
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl
new file mode 100644
index 0000000..9cb80f6
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomCode
+{
+  #keys: '3[414724.0.174571651][414724.0.174571650][414724.0.174571652]'
+  Description: '瀹㈡埛ID锛屽敮涓�寤轰箣涓�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl
deleted file mode 100644
index f0cb7e7..0000000
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_CustomID.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute CustomID
-{
-  #keys: '3[414724.0.46380328][414724.0.46380327][414724.0.46380329]'
-  Description: '瀹㈡埛ID'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl
new file mode 100644
index 0000000..efe5e78
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Department.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Department
+{
+  #keys: '3[414724.0.174571661][414724.0.174571660][414724.0.174571662]'
+  Description: '閮ㄩ棬锛屾病鏈変环鍊硷紝鏄剧ず浣跨敤'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl
new file mode 100644
index 0000000..bdc2eb0
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecastQty.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ForecastQty
+{
+  #keys: '3[414724.0.46380358][414724.0.46380357][414724.0.46380359]'
+  Description: '棰勬祴鏁伴噺'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl
deleted file mode 100644
index 2edd0bc..0000000
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_ForecatsQty.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute ForecatsQty
-{
-  #keys: '3[414724.0.46380358][414724.0.46380357][414724.0.46380359]'
-  Description: '棰勬祴鏁伴噺'
-  ValueType: Number
-}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
index cc1224e..8e83213 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Month.qbl
@@ -3,6 +3,6 @@
 Attribute Month
 {
   #keys: '3[414724.0.46380308][414724.0.46380307][414724.0.46380309]'
-  Description: '鏈堜唤'
+  Description: '鏈堜唤锛屽敮涓�閿箣涓�'
   ValueType: Date
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl
deleted file mode 100644
index 66e08c7..0000000
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_OrderCode.qbl
+++ /dev/null
@@ -1,8 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Attribute OrderCode
-{
-  #keys: '3[414724.0.46380338][414724.0.46380337][414724.0.46380339]'
-  Description: '璁㈠崟缂栧彿'
-  ValueType: String
-}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
index a9eab85..5f2e17f 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKU.qbl
@@ -3,6 +3,6 @@
 Attribute SKU
 {
   #keys: '3[414724.0.46380348][414724.0.46380347][414724.0.46380349]'
-  Description: 'SKU缂栫爜'
+  Description: 'SKU缂栫爜锛屽敮涓�閿箣涓�'
   ValueType: String
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl
new file mode 100644
index 0000000..ddbce61
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_SKUName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SKUName
+{
+  #keys: '3[414724.0.174572228][414724.0.174572227][414724.0.174572229]'
+  Description: 'SKU鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl
new file mode 100644
index 0000000..ebf027f
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_StockingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StockingPointID
+{
+  #keys: '3[414724.0.174571671][414724.0.174571670][414724.0.174571672]'
+  Description: '搴撳瓨鐐癸紝娌℃湁浠峰�硷紝鏄剧ず浣跨敤'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
index 6569ece..eb7052c 100644
--- a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_Unit.qbl
@@ -3,6 +3,6 @@
 Attribute Unit
 {
   #keys: '3[414724.0.46380378][414724.0.46380377][414724.0.46380379]'
-  Description: '鍗曚綅'
+  Description: '鍗曚綅锛屾病鏈変环鍊硷紝鏄剧ず浣跨敤'
   ValueType: String
 }
diff --git a/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl
new file mode 100644
index 0000000..fb94eeb
--- /dev/null
+++ b/_Main/BL/Type_H_OrderForecastRealQty/Attribute_VCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VCode
+{
+  #keys: '3[414724.0.174571641][414724.0.174571640][414724.0.174571642]'
+  Description: '鐗堟湰鍙凤紝鏆傛椂涓嶉�傜敤锛岄粯璁�-'
+  ValueType: String
+}
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_CapacityAndSaleBudgeExport.qbl b/_Main/BL/Type_MPSync/Method_CapacityAndSaleBudgeExport.qbl
new file mode 100644
index 0000000..0048b94
--- /dev/null
+++ b/_Main/BL/Type_MPSync/Method_CapacityAndSaleBudgeExport.qbl
@@ -0,0 +1,143 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityAndSaleBudgeExport () as BinaryValue
+{
+  Description: '瀵煎嚭姣旇緝缁撴灉'
+  TextBody:
+  [*
+    // generate by generate_export.py
+    info( "export start" );
+    text:= '<?xml version="1.0" encoding="utf-8" standalone="yes"?><table><name>骞村害浜ч攢棰勭畻</name>
+    <column><name>鍒犻櫎鏍囪</name><type>String</type></column>
+    <column><name>骞翠唤</name><type>Number</type></column>
+    <column><name>涓氬姟閮ㄩ棬</name><type>String</type></column>
+    <column><name>鏄剧ず鎶�鏈垎绫�</name><type>String</type></column>
+    <column><name>涓氬姟鍒嗙被</name><type>String</type></column>
+    <column><name>浜у搧绾�/浜у搧瑙勬牸</name><type>String</type></column>
+    <column><name>浜у搧鏂欏彿</name><type>String</type></column>
+    <column><name>Array浜у湴</name><type>String</type></column>
+    <column><name>钂搁晙浜у湴</name><type>String</type></column>
+    <column><name>鍒嗚鲸鐜�</name><type>String</type></column>
+    <column><name>鍑鸿揣褰㈡��</name><type>String</type></column>
+    <column><name>鍒囧壊鏁�</name><type>String</type></column>
+    <column><name>浜ц兘褰撻噺</name><type>String</type></column>
+    <column><name>mask鏁�</name><type>String</type></column>
+    <column><name>1鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>2鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>3鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>4鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>5鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>6鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>7鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>8鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>9鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>10鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>11鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>12鏈堜骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>骞翠骇鑳�(PCS)</name><type>Real</type></column>
+    <column><name>1鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>2鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>3鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>4鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>5鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>6鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>7鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>8鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>9鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>10鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>11鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>12鏈堜骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>骞翠骇鑳�(瀹炴暟澶у紶)</name><type>Real</type></column>
+    <column><name>1鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>2鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>3鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>4鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>5鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>6鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>7鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>8鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>9鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>10鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>11鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>12鏈堥攢鍞(W)</name><type>Real</type></column>
+    <column><name>骞撮攢鍞(W)</name><type>Real</type></column>
+    </table>';
+    xmlDOMImplementation := XMLDOMImplementation::Create();
+    xmlDOMDocument := xmlDOMImplementation.CreateDocumentFromString( text );
+    
+    tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
+    
+    toExportList := selectsortedset( this, MappingCapacityAndSaleBudge, item, true, item.OrgCode() + "_" + item.PlaceOfProductionOfArray() );
+    info( "export size : " + [String]toExportList.Size() );
+    nowNo := 1;
+    traverse ( toExportList, Elements, toExport ) {
+      info( "nowNo : " + [String]nowNo );
+      nowNo := nowNo + 1;
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, ifexpr( toExport.Deleted(), "Y", "N"), "鍒犻櫎鏍囪" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.YearNo(), "骞翠唤" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.OrgCode(), "涓氬姟閮ㄩ棬" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.DisplayTechnology(), "鏄剧ず鎶�鏈垎绫�" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.BusinessType(), "涓氬姟鍒嗙被" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.LineAndSpecification(), "浜у搧绾�/浜у搧瑙勬牸" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.ProductCode(), "浜у搧鏂欏彿" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.PlaceOfProductionOfArray(), "Array浜у湴" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.PlaceOfProductionOfEvaporation(), "钂搁晙浜у湴" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.Resolution(), "鍒嗚鲸鐜�" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.ShippingForm(), "鍑鸿揣褰㈡��" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.NumberOfCut(), "鍒囧壊鏁�" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.CapacityEquivalent(), "浜ц兘褰撻噺" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, toExport.NumberOfMask(), "mask鏁�" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth1(), "1鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth2(), "2鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth3(), "3鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth4(), "4鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth5(), "5鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth6(), "6鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth7(), "7鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth8(), "8鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth9(), "9鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth10(), "10鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth11(), "11鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSInMonth12(), "12鏈堜骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInPCSTotal(), "骞翠骇鑳�(PCS)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth1(), "1鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth2(), "2鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth3(), "3鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth4(), "4鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth5(), "5鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth6(), "6鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth7(), "7鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth8(), "8鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth9(), "9鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth10(), "10鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth11(), "11鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetInMonth12(), "12鏈堜骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.CapacityInSheetTotal(), "骞翠骇鑳�(瀹炴暟澶у紶)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth1(), "1鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth2(), "2鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth3(), "3鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth5(), "4鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth4(), "5鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth6(), "6鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth7(), "7鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth8(), "8鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth9(), "9鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth10(), "10鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth11(), "11鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountInMonth12(), "12鏈堥攢鍞(W)" );
+      ScenarioManager::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]toExport.SaleAmountTotal(), "骞撮攢鍞(W)" );
+    }
+    
+    xmlDOMSerializer := xmlDOMImplementation.CreateSerializer();
+    xmlTableString := xmlDOMSerializer.WriteToString( xmlDOMDocument );
+    
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTableString ) );
+    tableGroupHandle := TableGroupHandle::Create( "骞村害浜ч攢棰勭畻" );
+    tableGroupHandle.Add( tableHandle );
+    tableBinaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    info( "export end" );
+    
+    return tableBinaryData.AsBinaryValue();
+  *]
+}
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_MPSync/StaticMethod_TestData.qbl b/_Main/BL/Type_MPSync/StaticMethod_TestData.qbl
index 87c2b27..541ab96 100644
--- a/_Main/BL/Type_MPSync/StaticMethod_TestData.qbl
+++ b/_Main/BL/Type_MPSync/StaticMethod_TestData.qbl
@@ -15,7 +15,7 @@
     info( "productCodeList : " + [String]productCodeList.Size() );
     
     mpSync.MappingCapacityAndSaleBudge( relflush );
-    for( year := Date::ActualDate().Year() - 10; year <= Date::ActualDate().Year(); year := year + 1 ) {
+    for( year := Date::ActualDate().Year() - 10; year <= Date::ActualDate().Year() + 5; year := year + 1 ) {
       for( i := 1; i <= productCodeList.Size(); i := i + 1 ) {
         productCode := productCodeList.Element( i - 1 );
         mappingCapacityAndSaleBudge := mpSync.MappingCapacityAndSaleBudge( relnew, 
@@ -41,7 +41,7 @@
     info( "test MappingCapacityAndSaleBudge size : " + [String]result1.Size() );
     
     mpSync.MappingAnnualBudget( relflush );
-    for( year := Date::ActualDate().Year() - 10; year <= Date::ActualDate().Year(); year := year + 1 ) {
+    for( year := Date::ActualDate().Year() - 10; year <= Date::ActualDate().Year() + 5; year := year + 1 ) {
       for( i := 1; i <= productCodeList.Size(); i := i + 1 ) {
         productCode := productCodeList.Element( i - 1 );
         mappingAnnualBudget := mpSync.MappingAnnualBudget( relnew, 
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_MappingActualPISPIPData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
index c6520fb..9385366 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingActualPISPIPData.qbl
@@ -3,13 +3,18 @@
 Method MappingActualPISPIPData (
   Strings businessTypes,
   GlobalOTDTable globalOTDTable,
-  Boolean nuclear
+  Boolean nuclear,
+  Strings organcodelist
 )
 {
   TextBody:
   [*
     // renhao Aug-14-2023 (created)
-    listtodeal := selectset( globalOTDTable,Global_MappingActualProductInStockingPointInPeriod,actual,actual.ActualInventoryLevelEnd() > 0 );
+    listtodeal := selectset( globalOTDTable,
+                             Global_MappingActualProductInStockingPointInPeriod,
+                             actual,
+                             ( actual.ActualInventoryLevelEnd() > 0 ) and 
+                             ( organcodelist.Find( actual.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
     totalcount := listtodeal.Size();
     info( "ActualPISPIP has " + totalcount.AsQUILL() + " rows in total" );
     
@@ -24,7 +29,7 @@
       if( not isnull(businessTypes)){
       
         for( i :=0 ;i < businessTypes.Size();i++ ){
-          businessType := businessTypes.Element( i);
+          businessType := businessTypes.Element( i );
           if( product.BusinessType() = businessType and not product.IsCommon()){
             ActualProductInStockingPointInPeriod::CreateOrUpdate( this,
                                                                   actual.ProductID(),
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
index bee6304..da901cc 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingCustomerOrderData.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 Method MappingCustomerOrderData (
   Strings businessTypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   Description: 'ETL璁㈠崟棰勬祴'
@@ -14,7 +15,11 @@
     if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
         listToDeal := selectset( globalOTDTable, Global_MappingCustomOrder, item, true );
     } else {
-        listToDeal := selectset( globalOTDTable, Global_MappingCustomOrder, item, businessTypes.Find( item.BusinessType() ) <> -1 );
+        listToDeal := selectset( globalOTDTable, 
+                                 Global_MappingCustomOrder, 
+                                 item, 
+                                 ( businessTypes.Find( item.BusinessType() ) <> -1 ) and 
+                                 ( organcodelist.Find( item.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
     }
     queryStartDate := guard( min( this, Period_MP, item, true, item.StartDate() ) - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
     queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
@@ -33,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_MappingExternalSupplyData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
index c6a2bcf..4db0d6c 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingExternalSupplyData.qbl
@@ -3,7 +3,8 @@
 Method MappingExternalSupplyData (
   Strings businessTypes,
   Boolean nuclear,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   TextBody:
@@ -11,7 +12,12 @@
     // renhao Aug-14-2023 (created)
     queryStartDate := guard( min( this, Period_MP, item, true, item.StartDate() ) - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
     queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
-    listtodeal := selectset( globalOTDTable,Global_MappingInventorySupply,externalSupply, externalSupply.UserQuantity()>0 and externalSupply.Date() >= queryStartDate /*and externalSupply.Date() <= queryEndDate*/);
+    listtodeal := selectset( globalOTDTable,
+                             Global_MappingInventorySupply,
+                             externalSupply, 
+                             ( externalSupply.UserQuantity()>0 ) and 
+                             ( externalSupply.Date() >= queryStartDate ) and 
+                             ( organcodelist.Find( externalSupply.StockingPointID().SubString( 0, 3 ) ) >= 0 )/*and externalSupply.Date() <= queryEndDate*/);
     totalcount := listtodeal.Size();
     description := "鍦ㄩ�斿湪鍒�";
     info( "ExternalSupply has " + totalcount.AsQUILL() + " rows in total" );
@@ -32,7 +38,7 @@
         if( not isnull(businessTypes)){
         
           for( i :=0 ;i < businessTypes.Size();i++ ){
-            businessType := businessTypes.Element( i);
+            businessType := businessTypes.Element( i );
             if( product.BusinessType() = businessType and not product.IsCommon()){
               InventorySupply::CreateOrUpdate( externalSupply.ID(),
                                                productMP,
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
index 21b752b..1c79534 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingForecastData.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 Method MappingForecastData (
   Strings businessTypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   Description: 'ETL璁㈠崟棰勬祴'
@@ -14,7 +15,12 @@
     if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
         listToDeal := selectset( globalOTDTable, Global_MappingForecast, item, item.Quantity() > 0 );
     } else {
-        listToDeal := selectset( globalOTDTable, Global_MappingForecast, item, businessTypes.Find( item.BusinessType() ) <> -1 and item.Quantity()>0 );
+        listToDeal := selectset( globalOTDTable, 
+                                 Global_MappingForecast, 
+                                 item, 
+                                 ( businessTypes.Find( item.BusinessType() ) <> -1 ) and 
+                                 ( item.Quantity()>0 ) and 
+                                 ( organcodelist.Find( item.StockingPointID().SubString( 0, 3 ) ) >= 0 ) );
     }
     queryStartDate := guard( min( this, Period_MP, item, true, item.StartDate() ) - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
     queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
index ca35281..208a5e8 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationBOMData.qbl
@@ -4,13 +4,13 @@
   Strings businessTypes,
   Boolean isKeyProduct,
   Boolean createPurchaseSupplyMaterial,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   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() );
@@ -19,7 +19,8 @@
                                  ifexpr( isnull( businessTypes ) or businessTypes.Size() = 0, 
                                          true, 
     //                                     businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0 )
-                                         businessTypes.Find( item.BusinessType() ) >= 0 )
+                                         ( businessTypes.Find( item.BusinessType() ) >= 0 ) and 
+                                         ( organcodelist.Find( item.OrganCode() ) >= 0 ) )
     //                             and ifexpr( isKeyProduct, 
     //                                         keyProductList.Size() > 0 and keyProductList.Find( item.ComponentCode() ) >= 0,
     //                                         true )
@@ -59,6 +60,7 @@
                   // ========鍒嗙粍澶勭悊杈撳叆========
                   
                 }
+                
                 if( not isnull( stockingPoint)){
                   if( isKeyProduct){
                       keyRows := selectset( routingRows,Elements,routingrow,keyProductList.Find( routingrow.ComponentCode())>=0);
@@ -81,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_MacroPlan/Method_MappingOperationCostData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
index 3713cc9..cdcd7f1 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationCostData.qbl
@@ -1,7 +1,9 @@
 Quintiq file version 2.0
 #parent: #root
 Method MappingOperationCostData (
-  Strings businesstypes
+  GlobalOTDTable globalOTDTable,
+  Strings businesstypes,
+  Strings organcodelist
 )
 {
   Description: 'Get operation cost data from operation mapping'
@@ -9,19 +11,21 @@
   [*
     // Administrator Aug-21-2023 (created)
     // list to deal
-    listtodeal := construct( structured[MappingOperation] );
+    listtodeal := construct( structured[Global_MappingOperation] );
     
     if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
-        listtodeal := selectset( this, MappingOperation, item, true );
+        listtodeal := selectset( globalOTDTable, Global_MappingOperation, item, true );
     } else {
-        listtodeal := selectset( this, MappingOperation, item, businesstypes.Find( item.BusinessType() ) <> -1 );
+        listtodeal := selectset( globalOTDTable, Global_MappingOperation, 
+                                 item, 
+                                 ( businesstypes.Find( item.BusinessType() ) <> -1 ) and 
+                                 ( organcodelist.Find( item.OrganCode() ) >= 0 ) );
     }
     
     // Get the list to deal with max sequence number
-    listtodealwithmaxsn := construct( structured[MappingOperation] );
+    listtodealwithmaxsn := construct( structured[Global_MappingOperation] );
     traverse( listtodeal, Elements, item ){
-      maxsn := maxselect( this, 
-                          MappingOperation, 
+      maxsn := maxselect( globalOTDTable, Global_MappingOperation, 
                           moperation, 
                           moperation.OrganCode() = item.OrganCode(), 
                           moperation.ProductID() = item.ProductID(), 
@@ -41,23 +45,31 @@
       if( count - [Number](count/1000) * 1000 = 0 or count = totalcount ){
         info( "Now is dealing with the " + count.AsQUILL() + "OperationCost " + "( " + count.AsQUILL() + "/" + totalcount.AsQUILL() + " ) " + (count/totalcount*100).Round( 1 ).AsQUILL() + "%" );
         }
-      id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection() + "_" + item.Line();
-      operation := Operation::FindOperationTypeIndex( id );
-      account := Account_MP::FindByName( this, "Operation cost" );
-      isfromdb := false;
-      existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
-      if( isnull( existoperationcost ) ){
-        connecteditem := select( this, 
-                                 MappingOperationCost, 
-                                 moperationcost, 
-                                 moperationcost.OrgCode() = item.OrganCode(), 
-                                 moperationcost.ProductID() = item.ProductID() );
-        cost := connecteditem.Cost();
-        lengthoftime := connecteditem.LengthOfTime();
-        start := connecteditem.Start();
-        timeunit := connecteditem.TimeUnit();
-        OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
+      id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection()+"_" + [String]item.SequenceNumber();
+      if( guard( item.Line(), "" ).Length() > 0 ) {
+          id := id + "_" + item.Line();
         }
+      operation := Operation::FindOperationTypeIndex( id );
+      if(not isnull(operation)){
+            account := Account_MP::FindByName( this, "Operating cost" );
+            isfromdb := false;
+            existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
+            if( isnull( existoperationcost ) ){
+              connecteditem := select( globalOTDTable,
+                                       Global_MappingOperationCost,
+                                       moperationcost,
+                                       moperationcost.OrgCode() = item.OrganCode(),
+                                       moperationcost.ProductID() = item.ProductID() );
+              if( not isnull( connecteditem)){
+                  cost := connecteditem.Cost();
+                  lengthoftime := connecteditem.LengthOfTime();
+                  start := connecteditem.Start();
+                  timeunit := connecteditem.TimeUnit();
+                  OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
+                }
+    
+              }
       }
+    }
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
index 397d6d4..21238e0 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingOperationData.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 Method MappingOperationData (
   Strings businessTypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   TextBody:
@@ -12,7 +13,8 @@
     toDealList := construct( Global_MappingOperations ) ;
     if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
         toDealList := selectsortedset( globalOTDTable, Global_MappingOperation, item, 
-                                       businessTypes.Find( item.BusinessType() ) >= 0, 
+                                       ( businessTypes.Find( item.BusinessType() ) >= 0 ) and 
+                                       ( organcodelist.Find( item.OrganCode() ) >= 0 ), 
     //                                   businessTypes.Difference( businessTypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0, 
                                        item.SequenceNumber() );
     } else {
@@ -77,7 +79,7 @@
                                         0.0, 0.0, false, true );
         }
         
-        ManufactureLTProcessSection::CreateOrUpdate( op );
+    //    ManufactureLTProcessSection::CreateOrUpdate( op );
     }
     info( "========" )
     // 閬嶅巻routing锛岃繘琛宭ink
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
index ab7398e..1e0929e 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingProductData.qbl
@@ -23,10 +23,10 @@
           }
     } else {
         if( iskeyproduct = true ){
-          listToDeal := selectset( globalOTDTable, Global_MappingProduct_MP, item, item.KeyProduct() = true and businesstypes.Find(  item.BusinessType()) >= 0 );
+          listToDeal := selectset( globalOTDTable, Global_MappingProduct_MP, item, item.KeyProduct() = true and businesstypes.Find( item.BusinessType() ) >= 0 );
          }
         else{
-          listToDeal := selectset( globalOTDTable, Global_MappingProduct_MP, item, businesstypes.Find(  item.BusinessType()) >= 0 );
+          listToDeal := selectset( globalOTDTable, Global_MappingProduct_MP, item, businesstypes.Find( item.BusinessType() ) >= 0 );
         }
     }
     totalcount := listToDeal.Size();
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
index cf459b5..d7f21c2 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingSalesSegmentData.qbl
@@ -14,7 +14,10 @@
     if( isnull( businessTypes ) or businessTypes.Size() = 0 ) {
         listToDeal := selectset( globalOTDTable, Global_MappingSalesSegment_MP, item, true );
     } else {
-        listToDeal := selectset( globalOTDTable, Global_MappingSalesSegment_MP, item, businessTypes.Find( item.BusinessType() ) <> -1 );
+        listToDeal := selectset( globalOTDTable, 
+                                 Global_MappingSalesSegment_MP, 
+                                 item, 
+                                 businessTypes.Find( item.BusinessType() ) <> -1 );
     }
     //nameList := construct( structured[String] );
     //nameList := selectvalues( listToDeal, Elements, item, true, item.Name() );
diff --git a/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl b/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
index eeb6a49..712b51b 100644
--- a/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
+++ b/_Main/BL/Type_MacroPlan/Method_MappingUnitData.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 Method MappingUnitData (
   Strings businesstypes,
-  GlobalOTDTable globalOTDTable
+  GlobalOTDTable globalOTDTable,
+  Strings organcodelist
 )
 {
   Description: 'Get unit data from operation mapping'
@@ -17,7 +18,8 @@
     } else {
         listtodeal := selectset( globalOTDTable, Global_MappingOperation, item, 
     //                             businesstypes.Difference( businesstypes.Difference( item.BusinessType().Tokenize( ", " ) ) ).Size() > 0
-                                 businesstypes.Find( item.BusinessType() ) >= 0
+                                 ( businesstypes.Find( item.BusinessType() ) >= 0 ) and 
+                                 ( organcodelist.Find( item.OrganCode() ) >= 0 )
                                 );
     }
     
@@ -42,12 +44,13 @@
                           infinite, 
                           unitofmeasurename );
     
-    Unit::CreateOrUpdate( this, 
+    supplyunit := Unit::CreateOrUpdate( this, 
                           "渚涘簲鍟�", 
                           "渚涘簲鍟�", 
                           "澶╅┈闆嗗洟", 
                           infinite, 
                           unitofmeasurename );
+    supplyunit.IsSupplier(true);
     
     Unit::CreateOrUpdate( this, 
                           "鏁磋溅杩愯緭", 
diff --git a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl b/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl
index 45c9fec..5178d37 100644
--- a/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl
+++ b/_Main/BL/Type_MacroPlan/StaticMethod_DoSync0.qbl
@@ -15,11 +15,26 @@
     // 甯佺鍜屽竵绉嶆眹鐜�
     //Currency_MP::CreateCurrencyFromJson( macroPlan, jsonDataRow );
     info( "Prepare to do sync" )
+    info( "Get organ code list" )
+    organcodelist := selectvalues( globalOTDTable, Global_MappingOperationBOM, bom,true, bom.OrganCode() );
     if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
         traverse( businessTypes, Elements, item ) {
             info( "Business type : " + item )  
         }
+        organcodelist := selectvalues( globalOTDTable, BusinessType.OrganCode, organ, businessTypes.Find( organ.BusinessType().BusinessTypeName() ) <> -1, organ.OrganCodeName() );
     }
+    else{
+      if( businessTypes.Size() = 0 ){
+        if( not isnull( selectset( globalOTDTable, BusinessType, b, b.BusinessTypeName() = "" ) ) ){
+          organcodelist := selectvalues( globalOTDTable, BusinessType.OrganCode, organ, organ.BusinessType().BusinessTypeName() = "", organ.OrganCodeName() );
+          }
+        }
+      }
+    
+    if( organcodelist.Size() = 0 ){
+      organcodelist := selectvalues( globalOTDTable, Global_MappingOperationBOM, bom,true, bom.OrganCode() );
+      }
+    
     info( "KeyProduct : " + [String]isKeyProduct )
     info( "Create purchase supply material : " + [String]createPurchaseSupplyMaterial )
     
@@ -38,7 +53,7 @@
     //info( "BaseConversionFactor Finished, Start Operation Data Broker" );
     //macroPlan.Broker_OTD_Operation().Execute();
     info( "Operation Data Broker Finished, Start Unit Mapping" );
-    macroPlan.MappingUnitData( businessTypes ,globalOTDTable);
+    macroPlan.MappingUnitData( businessTypes ,globalOTDTable, organcodelist);
     
     // 搴撳瓨鐐�-3
     info( "Sales Segment Finished, Start Get StockingPoint From Api" )
@@ -82,11 +97,11 @@
     
     // 宸ヨ壓璺嚎 + BOM-9
     info( "Unit Finished, Start Operation Mapping" );
-    macroPlan.MappingOperationData( businessTypes ,globalOTDTable);  
+    macroPlan.MappingOperationData( businessTypes ,globalOTDTable, organcodelist );  
     //info( "Operation Finished, Start BOM Data Broker" );
     //macroPlan.Broker_OTD_BOM().Execute();
     info( "BOM Data Broker Finished, Start BOM Mapping" );
-    macroPlan.MappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial,globalOTDTable );
+    macroPlan.MappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial,globalOTDTable, organcodelist );
     
     //杞﹂亾淇℃伅-10
     info( "BOM Finished, Start Get Lanes From Api" );
@@ -118,26 +133,26 @@
     //info( "ProductInLane Finished, Start ActualPISPIP Data Broker" );
     //macroPlan.Broker_OTD_ActualPISPIP().Execute();
     info( "ActualPISPIP Data Broker Finished, Start ActualPISPIP Mapping" );
-    macroPlan.MappingActualPISPIPData( businessTypes, globalOTDTable,isKeyProduct );
+    macroPlan.MappingActualPISPIPData( businessTypes, globalOTDTable,isKeyProduct, organcodelist );
     
     // 鍦ㄩ�斿簱瀛�-14
     //info( "ActualPISPIP Finished, Start ExternalSupply Data Broker" );
     //macroPlan.Broker_OTD_ExternalSupply().Execute();
     info( "ExternalSupply Data Broker Finished, Start ExternalSupply Mapping" );
-    macroPlan.MappingExternalSupplyData( businessTypes, isKeyProduct ,globalOTDTable);
+    macroPlan.MappingExternalSupplyData( businessTypes, isKeyProduct ,globalOTDTable, organcodelist );
     
     // 搴撳瓨鎴愭湰-15
     InventoryValueAndCost::DoSync( macroPlan,globalOTDTable );
     
     // todo 鍒堕�犳垚鏈�-16
     info( "InventoryCost Finished, Start OperationCost Mapping" );
-    //macroPlan.MappingOperationCostData( businessTypes );
+    macroPlan.MappingOperationCostData( globalOTDTable, businessTypes, organcodelist );
     
     // 璁㈠崟棰勬祴-17
-    Forecast::DoSync( macroPlan, businessTypes ,globalOTDTable);
+    Forecast::DoSync( macroPlan, businessTypes, globalOTDTable, organcodelist );
     
     // 璁㈠崟闇�姹�-18
-    CustomerOrder::DoSync( macroPlan, businessTypes,globalOTDTable);
+    CustomerOrder::DoSync( macroPlan, businessTypes, globalOTDTable, organcodelist );
     
     //鍒犻櫎澶氫綑鎶ラ敊鏁版嵁-19
     macroPlan.DeleteSnaityCheck();
diff --git a/_Main/BL/Type_ManufactureLTImputation/StaticMethod_Transfer.qbl b/_Main/BL/Type_ManufactureLTImputation/StaticMethod_Transfer.qbl
index 650b697..ae70b83 100644
--- a/_Main/BL/Type_ManufactureLTImputation/StaticMethod_Transfer.qbl
+++ b/_Main/BL/Type_ManufactureLTImputation/StaticMethod_Transfer.qbl
@@ -8,26 +8,26 @@
   Description: '绉讳氦鎺у埗鏉�'
   TextBody:
   [*
-    // yypsybs Aug-25-2023 (created)
-    if( isnull( oldMP ) ) {
-        info( "========transfer ManufactureLTImputations to macroPlan " + [String]newMP.MDSID() + "========" );
-    } else {
-        info( "========transfer ManufactureLTImputations from macroPlan " + [String]oldMP.MDSID() + " to macroPlan " + [String]newMP.MDSID() + "========" );
-    }
-    // 娓呯┖鏂扮殑锛岃�佺殑澶嶅埗鍒版柊鐨勶紝娓呯┖鑰佺殑
-    if( not isnull( oldMP ) and not isnull( newMP ) ) {
-        info( "old ManufactureLTImputation size : " + [String]oldMP.ManufactureLTImputation( relsize ) )
-        traverse( oldMP, ManufactureLTImputation, parent, true ) {
-            traverse( parent, ManufactureLTProcessSection, child, true ) {
-                  ManufactureLTProcessSection::CreateOrUpdate( newMP, parent.OrgCode(), parent.SkuID(), parent.Describe(), 
-                                                                child.ProcessSection(), child.Sequence(), child.Line(), child.SystemLT(),
-                                                               child.Edited(), child.EditLT(), child.Describe() );
-            }
-        }  
-    }
-    // 澶勭悊鏂扮殑鐨刼peration
-    traverse( newMP, Routing.RoutingStep.Operation, item ) {
-         ManufactureLTProcessSection::CreateOrUpdate( item );
-    }
+    //// yypsybs Aug-25-2023 (created)
+    //if( isnull( oldMP ) ) {
+    //    info( "========transfer ManufactureLTImputations to macroPlan " + [String]newMP.MDSID() + "========" );
+    //} else {
+    //    info( "========transfer ManufactureLTImputations from macroPlan " + [String]oldMP.MDSID() + " to macroPlan " + [String]newMP.MDSID() + "========" );
+    //}
+    //// 娓呯┖鏂扮殑锛岃�佺殑澶嶅埗鍒版柊鐨勶紝娓呯┖鑰佺殑
+    //if( not isnull( oldMP ) and not isnull( newMP ) ) {
+    //    info( "old ManufactureLTImputation size : " + [String]oldMP.ManufactureLTImputation( relsize ) )
+    //    traverse( oldMP, ManufactureLTImputation, parent, true ) {
+    //        traverse( parent, ManufactureLTProcessSection, child, true ) {
+    //              ManufactureLTProcessSection::CreateOrUpdate( newMP, parent.OrgCode(), parent.SkuID(), parent.Describe(), 
+    //                                                            child.ProcessSection(), child.Sequence(), child.Line(), child.SystemLT(),
+    //                                                           child.Edited(), child.EditLT(), child.Describe() );
+    //        }
+    //    }  
+    //}
+    //// 澶勭悊鏂扮殑鐨刼peration
+    //traverse( newMP, Routing.RoutingStep.Operation, item ) {
+    //     ManufactureLTProcessSection::CreateOrUpdate( item );
+    //}
   *]
 }
diff --git a/_Main/BL/Type_ManufactureLTProcessSection/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_ManufactureLTProcessSection/StaticMethod_CreateOrUpdate.qbl
index 8d40621..fe55479 100644
--- a/_Main/BL/Type_ManufactureLTProcessSection/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_ManufactureLTProcessSection/StaticMethod_CreateOrUpdate.qbl
@@ -30,11 +30,11 @@
         line := operationNameSplit.Element( 2 );
     }
     child := null( ManufactureLTProcessSection );
-    if( orgCode <> "" and productId <> "" and processStep <> "" and sequence <> "" ) {
-        parent := ManufactureLTImputation::CreateOrUpdate( op.RoutingStep().Routing().MacroPlan(), orgCode, productId, "" );
-        info( "DaysAsReal : " + [String]op.UserLeadTime().DaysAsReal() );
-        child := ManufactureLTProcessSection::CreateOrUpdate( parent, processStep, false, sequence, line, op.UserLeadTime().DaysAsReal(), 0.0, "" );
-    }
+    //if( orgCode <> "" and productId <> "" and processStep <> "" and sequence <> "" ) {
+    //    parent := ManufactureLTImputation::CreateOrUpdate( op.RoutingStep().Routing().MacroPlan(), orgCode, productId, "" );
+    //    info( "DaysAsReal : " + [String]op.UserLeadTime().DaysAsReal() );
+    //    child := ManufactureLTProcessSection::CreateOrUpdate( parent, processStep, false, sequence, line, op.UserLeadTime().DaysAsReal(), 0.0, "" );
+    //}
     return child;
   *]
 }
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_ExpectedHeaders.qbl b/_Main/BL/Type_MappingSaleBudge/StaticMethod_ExpectedHeaders.qbl
new file mode 100644
index 0000000..d7275ba
--- /dev/null
+++ b/_Main/BL/Type_MappingSaleBudge/StaticMethod_ExpectedHeaders.qbl
@@ -0,0 +1,64 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExpectedHeaders () as owning Strings
+{
+  TextBody:
+  [*
+    // yypsybs Jun-30-2023 (created)
+    value := construct( structured[String] );
+    value.Add( "鍒犻櫎鏍囪" );
+    value.Add( "骞翠唤" );
+    value.Add( "涓氬姟閮ㄩ棬" );
+    value.Add( "鏄剧ず鎶�鏈垎绫�" );
+    value.Add( "涓氬姟鍒嗙被" );
+    value.Add( "浜у搧绾�/浜у搧瑙勬牸" );
+    value.Add( "浜у搧鏂欏彿" );
+    value.Add( "Array浜у湴" );
+    value.Add( "钂搁晙浜у湴" );
+    value.Add( "鍒嗚鲸鐜�" );
+    value.Add( "鍑鸿揣褰㈡��" );
+    value.Add( "鍒囧壊鏁�" );
+    value.Add( "浜ц兘褰撻噺" );
+    value.Add( "mask鏁�" );
+    value.Add( "1鏈堜骇鑳�(PCS)" );
+    value.Add( "2鏈堜骇鑳�(PCS)" );
+    value.Add( "3鏈堜骇鑳�(PCS)" );
+    value.Add( "4鏈堜骇鑳�(PCS)" );
+    value.Add( "5鏈堜骇鑳�(PCS)" );
+    value.Add( "6鏈堜骇鑳�(PCS)" );
+    value.Add( "7鏈堜骇鑳�(PCS)" );
+    value.Add( "8鏈堜骇鑳�(PCS)" );
+    value.Add( "9鏈堜骇鑳�(PCS)" );
+    value.Add( "10鏈堜骇鑳�(PCS)" );
+    value.Add( "11鏈堜骇鑳�(PCS)" );
+    value.Add( "12鏈堜骇鑳�(PCS)" );
+    value.Add( "骞翠骇鑳�(PCS)" );
+    value.Add( "1鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "2鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "3鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "4鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "5鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "6鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "7鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "8鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "9鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "10鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "11鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "12鏈堜骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "骞翠骇鑳�(瀹炴暟澶у紶)" );
+    value.Add( "1鏈堥攢鍞(W)" );
+    value.Add( "2鏈堥攢鍞(W)" );
+    value.Add( "3鏈堥攢鍞(W)" );
+    value.Add( "4鏈堥攢鍞(W)" );
+    value.Add( "5鏈堥攢鍞(W)" );
+    value.Add( "6鏈堥攢鍞(W)" );
+    value.Add( "7鏈堥攢鍞(W)" );
+    value.Add( "8鏈堥攢鍞(W)" );
+    value.Add( "9鏈堥攢鍞(W)" );
+    value.Add( "10鏈堥攢鍞(W)" );
+    value.Add( "11鏈堥攢鍞(W)" );
+    value.Add( "12鏈堥攢鍞(W)" );
+    value.Add( "骞撮攢鍞(W)" );
+    return &value;
+  *]
+}
diff --git a/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
new file mode 100644
index 0000000..c75f124
--- /dev/null
+++ b/_Main/BL/Type_MappingSaleBudge/StaticMethod_Export.qbl
@@ -0,0 +1,73 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  MPSync parent
+) as String
+{
+  TextBody:
+  [*
+    // yypsybs Jul-1-2023 (created)
+    xmlTemplate := '<?xml version="1.0" encoding="UTF-16"?>
+    <table>
+      <name>MappingCapacityAndSaleBudge</name>
+    ';
+    //---------------------------------------------------------------------------------------------
+    exportFields := MappingCapacityAndSaleBudge::ExportFields();
+    exportHeaders := MappingCapacityAndSaleBudge::ExpectedHeaders();
+    if( exportFields.Size() <> exportHeaders.Size() ) {
+      error( "fields and headers not match" );  
+    }
+    info( "export start" );
+    for( i := 0; i < exportFields.Size() ; i++ ) {
+      header := exportHeaders.Element( i );
+      fieldName := exportFields.Element( i );
+      info( "header : " + header )
+      info( "fieldName : " + fieldName )
+      columnStr := "<column><name>" + header + "</name><type>String</type>";
+      traverse( parent, MappingCapacityAndSaleBudge, oldRecord ) {
+        field := Reflection::FindAttribute( "MappingCapacityAndSaleBudge", fieldName);
+        if( not isnull( field ) ) {
+          fieldValue := "";
+          if( fieldValue = "" ) {
+            fieldValue := guard( field.GetString( oldRecord ), "" );
+          }
+          if( fieldValue = "" ) {
+            fieldValue := guard( [String]field.GetNumber( oldRecord ), "" );
+          }
+          if( fieldValue = "" ) {
+            fieldValue := guard( [String]field.GetReal( oldRecord ), "" );
+          }
+          if( fieldValue = "" ) {
+            fieldValue := guard( ifexpr( field.GetBoolean( oldRecord ), "Y", "N" ), "" );
+          }
+          if( fieldValue = "" ) {
+            fileDateValue := guard( field.GetDate( oldRecord ), Date::MinDate() );
+            if( fileDateValue <> Date::MinDate() ) {
+              conv := DateTimeToString::StandardConverter();
+              conv.SetCustomConversion();
+              conv.CustomFormatString( 'yyyyMMdd' );
+              fieldValue := conv.Convert( fileDateValue.DateTime() );
+            }
+          }
+          cellStr := '<cell value="' + fieldValue + '"/>';
+          
+          columnStr := columnStr + cellStr;
+        } else {
+          error( "no field " + fieldName + " in type MappingCapacityAndSaleBudge");
+        }
+      }
+      columnStr := columnStr + "</column>";
+      xmlTemplate := xmlTemplate + columnStr;
+    }
+    //---------------------------------------------------------------------------------------------
+    xmlTemplate := xmlTemplate + "</table>";
+    //info( xmlTemplate );
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
+    XLS::SaveTable( tableHandle, OS::TempPath() + "MappingCapacityAndSaleBudge.xlsx" );
+    file := OSFile::Construct();
+    file.Open( OS::TempPath() + "MappingCapacityAndSaleBudge.xlsx", "Read", true );
+    data := file.ReadBinary()
+    info( "export end" );
+    return data.AsBase64EncodedString();
+  *]
+}
diff --git a/_Main/BL/Type_MappingSaleBudge/StaticMethod_ExportFields.qbl b/_Main/BL/Type_MappingSaleBudge/StaticMethod_ExportFields.qbl
new file mode 100644
index 0000000..58b6447
--- /dev/null
+++ b/_Main/BL/Type_MappingSaleBudge/StaticMethod_ExportFields.qbl
@@ -0,0 +1,64 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportFields () as owning Strings
+{
+  TextBody:
+  [*
+    // yypsybs Jun-30-2023 (created)
+    value := construct( structured[String] );
+    value.Add( "Deleted" );
+    value.Add( "YearNo" );
+    value.Add( "OrgCode" );
+    value.Add( "DisplayTechnology" );
+    value.Add( "BusinessType" );
+    value.Add( "LineAndSpecification" );
+    value.Add( "ProductCode" );
+    value.Add( "PlaceOfProductionOfArray" );
+    value.Add( "PlaceOfProductionOfEvaporation" );
+    value.Add( "Resolution" );
+    value.Add( "ShippingForm" );
+    value.Add( "NumberOfCut" );
+    value.Add( "CapacityEquivalent" );
+    value.Add( "NumberOfMask" );
+    value.Add( "CapacityInPCSInMonth1" );
+    value.Add( "CapacityInPCSInMonth2" );
+    value.Add( "CapacityInPCSInMonth3" );
+    value.Add( "CapacityInPCSInMonth4" );
+    value.Add( "CapacityInPCSInMonth5" );
+    value.Add( "CapacityInPCSInMonth6" );
+    value.Add( "CapacityInPCSInMonth7" );
+    value.Add( "CapacityInPCSInMonth8" );
+    value.Add( "CapacityInPCSInMonth9" );
+    value.Add( "CapacityInPCSInMonth10" );
+    value.Add( "CapacityInPCSInMonth11" );
+    value.Add( "CapacityInPCSInMonth12" );
+    value.Add( "CapacityInPCSTotal" );
+    value.Add( "CapacityInSheetInMonth1" );
+    value.Add( "CapacityInSheetInMonth2" );
+    value.Add( "CapacityInSheetInMonth3" );
+    value.Add( "CapacityInSheetInMonth4" );
+    value.Add( "CapacityInSheetInMonth5" );
+    value.Add( "CapacityInSheetInMonth6" );
+    value.Add( "CapacityInSheetInMonth7" );
+    value.Add( "CapacityInSheetInMonth8" );
+    value.Add( "CapacityInSheetInMonth9" );
+    value.Add( "CapacityInSheetInMonth10" );
+    value.Add( "CapacityInSheetInMonth11" );
+    value.Add( "CapacityInSheetInMonth12" );
+    value.Add( "CapacityInSheetTotal" );
+    value.Add( "SaleAmountInMonth1" );
+    value.Add( "SaleAmountInMonth2" );
+    value.Add( "SaleAmountInMonth3" );
+    value.Add( "SaleAmountInMonth5" );
+    value.Add( "SaleAmountInMonth4" );
+    value.Add( "SaleAmountInMonth6" );
+    value.Add( "SaleAmountInMonth7" );
+    value.Add( "SaleAmountInMonth8" );
+    value.Add( "SaleAmountInMonth9" );
+    value.Add( "SaleAmountInMonth10" );
+    value.Add( "SaleAmountInMonth11" );
+    value.Add( "SaleAmountInMonth12" );
+    value.Add( "SaleAmountTotal" );
+    return &value;
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl
index 4b41017..6e0539c 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl
@@ -31,7 +31,7 @@
     
     xmlDOMSerializer := xmlDOMImplementation.CreateSerializer();
     xmlTableString := xmlDOMSerializer.WriteToString( xmlDOMDocument );
-    
+    info( xmlTableString );
     tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTableString ) );
     tableGroupHandle := TableGroupHandle::Create( "鐗╂枡鏍囩" );
     tableGroupHandle.Add( tableHandle );
diff --git a/_Main/BL/Type_Operation/Method_OnCommitCustom.qbl b/_Main/BL/Type_Operation/Method_OnCommitCustom.qbl
index b714ef0..650047b 100644
--- a/_Main/BL/Type_Operation/Method_OnCommitCustom.qbl
+++ b/_Main/BL/Type_Operation/Method_OnCommitCustom.qbl
@@ -5,7 +5,7 @@
   TextBody:
   [*
     // yypsybs Aug-25-2023 (created)
-    info( "Operation::OnCommitCustom" )
-    ManufactureLTProcessSection::CreateOrUpdate( this );
+    //info( "Operation::OnCommitCustom" )
+    //ManufactureLTProcessSection::CreateOrUpdate( this );
   *]
 }
diff --git a/_Main/BL/Type_OrganCode/Attribute_OrganCodeName.qbl b/_Main/BL/Type_OrganCode/Attribute_OrganCodeName.qbl
new file mode 100644
index 0000000..bdf1f0e
--- /dev/null
+++ b/_Main/BL/Type_OrganCode/Attribute_OrganCodeName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OrganCodeName
+{
+  #keys: '3[412960.0.276650052][412960.0.276650051][412960.0.276650053]'
+  Description: '缁勭粐缂栫爜鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OrganCode/_ROOT_Type_OrganCode.qbl b/_Main/BL/Type_OrganCode/_ROOT_Type_OrganCode.qbl
new file mode 100644
index 0000000..3a16e43
--- /dev/null
+++ b/_Main/BL/Type_OrganCode/_ROOT_Type_OrganCode.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type OrganCode
+{
+  #keys: '5[412960.0.276650035][412960.0.276650033][0.0.0][412960.0.276650034][412960.0.276650036]'
+  BaseType: Object
+  Description: '浜嬩笟閮ㄥ搴旂殑缁勭粐缂栫爜闆嗗悎'
+  StructuredName: 'OrganCodes'
+}
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_PriorityFactor/StaticMethod_CheckNameValid.qbl b/_Main/BL/Type_PriorityFactor/StaticMethod_CheckNameValid.qbl
new file mode 100644
index 0000000..4fa81fb
--- /dev/null
+++ b/_Main/BL/Type_PriorityFactor/StaticMethod_CheckNameValid.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CheckNameValid (
+  MacroPlan owner,
+  String businessType,
+  Real coefficient,
+  String desc,
+  String name
+) as Boolean
+{
+  TextBody:
+  [*
+    // NBoTk Sep-22-2023 (created)
+    
+    value := true;
+    
+    // 鍚嶇О鐩稿悓璺宠繃
+    obj := selectobject( owner,PriorityFactor,p,
+                        p.BusinessType() = businessType and p.Coefficient() = coefficient and p.Name() = name and p.Desc() = desc
+                        );
+    
+    if(not isnull( obj) )
+    {
+        value := false;
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityFactor/StaticMethod_GetCoeffcientByName.qbl b/_Main/BL/Type_PriorityFactor/StaticMethod_GetCoeffcientByName.qbl
index 9434404..d935ad9 100644
--- a/_Main/BL/Type_PriorityFactor/StaticMethod_GetCoeffcientByName.qbl
+++ b/_Main/BL/Type_PriorityFactor/StaticMethod_GetCoeffcientByName.qbl
@@ -11,7 +11,7 @@
     // NBoTk Sep-21-2023 (created)
     
     data := selectobject( owner,PriorityFactor,p,
-                          p.BusinessType() = businessType and p.Name() = name
+                           p.Name() = name
                           )
     
     return data.Coefficient();
diff --git a/_Main/BL/Type_PriorityFactor/StaticMethod_GetNameList.qbl b/_Main/BL/Type_PriorityFactor/StaticMethod_GetNameList.qbl
index 98115c4..05489f2 100644
--- a/_Main/BL/Type_PriorityFactor/StaticMethod_GetNameList.qbl
+++ b/_Main/BL/Type_PriorityFactor/StaticMethod_GetNameList.qbl
@@ -11,7 +11,6 @@
     value := "";
     
     strList := selectuniquevalues(  owner,PriorityFactor,p,
-                                   p.BusinessType() = businessType,
                                     p.Name()
                                    );
     
diff --git a/_Main/BL/Type_PriorityFactor/StaticMethod_InitData.qbl b/_Main/BL/Type_PriorityFactor/StaticMethod_InitData.qbl
index 1d5ff08..a2be846 100644
--- a/_Main/BL/Type_PriorityFactor/StaticMethod_InitData.qbl
+++ b/_Main/BL/Type_PriorityFactor/StaticMethod_InitData.qbl
@@ -7,35 +7,37 @@
   TextBody:
   [*
     // NBoTk Sep-15-2023 (created)
-    
-    info(" init PriorutyFactor");
-    
     // businessType
     // result := "闆嗗洟闈㈡澘;涓撲笟鏄剧ず浜嬩笟閮�;澶栧崠CELL;闈炴樉;杩愬姩鍋ュ悍;杩愬姩鍋ュ悍浜嬩笟閮�;鎵嬫満浜嬩笟閮�;鐗圭鏄剧ず;姹借溅鐢靛瓙浜嬩笟閮�;杞﹁浇鏄剧ず浜嬩笟閮�;IT浜嬩笟閮�";
-    businessTypeList := construct( structured[String]);
-    businessTypeList.Add( "闆嗗洟闈㈡澘");
-    businessTypeList.Add( "涓撲笟鏄剧ず浜嬩笟閮�");
-    businessTypeList.Add( "澶栧崠CELL");
-    businessTypeList.Add( "闈炴樉");
-    businessTypeList.Add( "杩愬姩鍋ュ悍");
-    businessTypeList.Add( "杩愬姩鍋ュ悍浜嬩笟閮�");
-    businessTypeList.Add( "鎵嬫満浜嬩笟閮ㄩ潰鏉�");
-    businessTypeList.Add( "鐗圭鏄剧ず");
-    businessTypeList.Add( "姹借溅鐢靛瓙浜嬩笟閮ㄩ潰鏉�");
-    businessTypeList.Add( "杞﹁浇鏄剧ず浜嬩笟閮�");
-    businessTypeList.Add( "IT浜嬩笟閮�");
     
-    traverse( businessTypeList,Elements,b)
+    businessType := "";
+    
+    // 濡傛灉宸茬粡瀛樺湪浼樺厛绾ф暟鎹� 鍒欎笉鍋氬鐞�
+    list := selectset( owner,PriorityFactor,p,true);
+    if( list.Size() = 0 )
     {
-        owner.PriorityFactor(relnew,Name := "瀹㈡埛绛栫暐" ,Desc := "灏嗕簨涓氶儴璁$畻鐨勪紭鍏堢骇锛屾寜璇ョ粏鍒嗛」姣斾緥闃舵纭畾璇ラ」寰楀垎銆傚锛�81%鈮鈮�100% 5鍒嗭紝61%鈮鈮�80% 4鍒�", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "瀹㈡埛绛夌骇" ,Desc := "鏍规嵁闇�姹傛暟鎹腑瀹㈡埛锛屽尮閰嶅鎴风瓑绾�",BusinessType := b);
-        owner.PriorityFactor(relnew,Name := "澶у紶鐩堝埄姘村钩" ,Desc := "1銆佽幏鍙栧鎴�*SKU澶у紶鐩堝埄鏁� 2銆佸畾涔夊鎴�*SKU澶у紶鐩堝埄鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "缁嗗垎甯傚満绛夌骇" ,Desc := "1銆佽幏鍙栧鎴�*SKU瀵瑰簲缁嗗垎甯傚満绛夌骇 2銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU瀵瑰簲缁嗗垎甯傚満璇勫垎绛夌骇锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "闇�姹傜被鍨�" ,Desc := "鍖归厤涓嶅悓闇�姹傜绫伙紝寰楀埌瀵瑰簲寰楀垎", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "璁㈠崟涓嬪崟鏃堕棿" ,Desc := "鏍规嵁闇�姹傝鍗曚腑涓嬪崟鏃堕棿涓庨渶姹傛椂闂村樊鍊硷紝鍖归厤闃舵寰楀垎", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "浜у搧绛夌骇" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "DOI" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := b );
-        owner.PriorityFactor(relnew,Name := "DSI" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := b );
+          
+          // 娣诲姞浜嬩笟閮ㄥ搴旂殑棰勫埗浼樺厛绾у洜瀛愭暟鎹�
+          owner.PriorityFactor(relnew,Name := "瀹㈡埛绛栫暐" ,Desc := "灏嗕簨涓氶儴璁$畻鐨勪紭鍏堢骇锛屾寜璇ョ粏鍒嗛」姣斾緥闃舵纭畾璇ラ」寰楀垎銆傚锛�81%鈮鈮�100% 5鍒嗭紝61%鈮鈮�80% 4鍒�", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "瀹㈡埛绛夌骇" ,Desc := "鏍规嵁闇�姹傛暟鎹腑瀹㈡埛锛屽尮閰嶅鎴风瓑绾�",BusinessType := businessType, Coefficient := 100);
+          owner.PriorityFactor(relnew,Name := "澶у紶鐩堝埄姘村钩" ,Desc := "1銆佽幏鍙栧鎴�*SKU澶у紶鐩堝埄鏁� 2銆佸畾涔夊鎴�*SKU澶у紶鐩堝埄鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "缁嗗垎甯傚満绛夌骇" ,Desc := "1銆佽幏鍙栧鎴�*SKU瀵瑰簲缁嗗垎甯傚満绛夌骇 2銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU瀵瑰簲缁嗗垎甯傚満璇勫垎绛夌骇锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "闇�姹傜被鍨�" ,Desc := "鍖归厤涓嶅悓闇�姹傜绫伙紝寰楀埌瀵瑰簲寰楀垎", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "璁㈠崟涓嬪崟鏃堕棿" ,Desc := "鏍规嵁闇�姹傝鍗曚腑涓嬪崟鏃堕棿涓庨渶姹傛椂闂村樊鍊硷紝鍖归厤闃舵寰楀垎", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "浜у搧绛夌骇" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "DOI" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := businessType, Coefficient := 100 );
+          owner.PriorityFactor(relnew,Name := "DSI" ,Desc := "1銆佽幏鍙栧鎴�*SKU DOI&DSI鏁� 2銆佸畾涔夊鎴�*SKUDOI&DSI鏁伴樁姊緱鍒� 3銆佸尮閰嶉渶姹傛暟鎹腑瀹㈡埛鍙奡KU鏁版嵁锛屽緱鍒板搴旈樁姊緱鍒�", BusinessType := businessType, Coefficient := 100 );
+          
+          // 浼樺厛绾у洜瀛愮粏鍒�
+          priorityFactorList := selectset( owner,PriorityFactor,p,
+                                           p.BusinessType() = businessType
+                                           );
+          
+          traverse( priorityFactorList,Elements,e)
+          {
+              PriorityFactorDetails::InitData( owner,e); 
+          }
+    
     }
   *]
 }
diff --git a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_CreateTestData.qbl b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_CreateTestData.qbl
deleted file mode 100644
index 4954d67..0000000
--- a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_CreateTestData.qbl
+++ /dev/null
@@ -1,15 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod CreateTestData (
-  MacroPlan owner
-)
-{
-  TextBody:
-  [*
-    // NBoTk Sep-18-2023 (created)
-    
-    info( "init data" );
-    PriorityFactor::InitData( owner);
-    PriorityFactorDetails::InitData( owner);
-  *]
-}
diff --git a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
index 9327dbe..1449c61 100644
--- a/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
+++ b/_Main/BL/Type_PriorityFactorDetails/StaticMethod_InitData.qbl
@@ -1,35 +1,102 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod InitData (
-  MacroPlan owner
+  MacroPlan owner,
+  PriorityFactor priorityFactor
 )
 {
   TextBody:
   [*
     // NBoTk Sep-17-2023 (created)
     
-    info(" init PriorutyFactorDetails" );
-    
-    
-    
-    traverse( owner, PriorityFactor , p) 
+    isBusinessType := false;
+    if( priorityFactor.BusinessType() <> "闆嗗洟闈㈡澘" )
     {
-        isBusinessType := false;
-        if( p.BusinessType() <> "闆嗗洟闈㈡澘" )
-        {
-            isBusinessType := true; 
-        }
-      
-        p.PriorityFactorDetails(relnew,BusinessType := p.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 5,
-                                     IsRange := false,GradingName := "澶х泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := p.Name());
-        p.PriorityFactorDetails(relnew,BusinessType := p.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 3,
-                                     IsRange := false,GradingName := "灏忕泩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := p.Name());
-        p.PriorityFactorDetails(relnew,BusinessType := p.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := 0,
-                                     IsRange := false,GradingName := "鎸佸钩",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := p.Name());
-        p.PriorityFactorDetails(relnew,BusinessType := p.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -3,
-                                     IsRange := false,GradingName := "灏忎簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := p.Name());
-        p.PriorityFactorDetails(relnew,BusinessType := p.BusinessType(), IsBusinessType := isBusinessType,GradeTarget := -5,
-                                     IsRange := false,GradingName := "澶т簭",RangeMin := 0.0,RangeMax := 0.0,PriorityFactorName := p.Name());
+        isBusinessType := true; 
+    }
+    
+    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());
+    }
+    
+    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_PriorityPolicy/StaticMethod_GetCalcFormula.qbl b/_Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcFormula.qbl
new file mode 100644
index 0000000..c76e0a0
--- /dev/null
+++ b/_Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcFormula.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetCalcFormula (
+  MacroPlan macroPlan,
+  String formula
+) as String
+{
+  TextBody:
+  [*
+    // NBoTk Oct-7-2023 (created)
+    priorityFactor := null( PriorityFactor);
+    traverse( macroPlan,PriorityFactor,p)
+    {   
+         if( formula.StartsWith( p.Name()) )
+         {
+            priorityFactor := p;
+         }
+    }
+    value := priorityFactor.Name() + "[" + [String]priorityFactor.Coefficient() +"*L]";
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcStr.qbl b/_Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcStr.qbl
new file mode 100644
index 0000000..2095877
--- /dev/null
+++ b/_Main/BL/Type_PriorityPolicy/StaticMethod_GetCalcStr.qbl
@@ -0,0 +1,94 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetCalcStr (
+  MacroPlan macroPlan,
+  String formula,
+  String lastCalcStr
+) as String
+{
+  TextBody:
+  [*
+    // NBoTk Oct-7-2023 (created)
+    
+    calcStr := "";
+    remindFormula := formula;
+    
+    // 閬嶅巻浼樺厛绾у洜瀛愰厤缃�
+    if( not remindFormula = '' )
+    {
+                  // 浠庤捣濮嬩綅缃紑濮嬪尮閰� 
+            if(remindFormula.StartsWith( "+" ))
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + "+" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else if( remindFormula.StartsWith( "-" ))
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + "-" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else if( remindFormula.StartsWith( "*" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + "*" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else if( remindFormula.StartsWith( "/" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + "/" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else if( remindFormula.StartsWith( "(" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + "{" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else if( remindFormula.StartsWith( ")" ) )
+            {
+                remindFormula := remindFormula.SubString( 1,remindFormula.Length()-1);
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                calcStr := lastCalcStr + ")" + calcStr;
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+            else
+            {
+                // 涓嶆槸绗﹀彿 鐩存帴鑾峰彇璁$畻鍚庣殑鏁板��
+                calcStr := PriorityPolicy::GetCalcFormula(macroPlan,remindFormula);
+                
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityPolicy::GetCalcStr(  macroPlan,remindFormula,calcStr);
+            }
+      
+    }
+    
+    return calcStr;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackCalcStr.qbl b/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackCalcStr.qbl
new file mode 100644
index 0000000..122b53c
--- /dev/null
+++ b/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackCalcStr.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod RollBackCalcStr (
+  MacroPlan owner,
+  String businessType,
+  String stringData
+) as String
+{
+  TextBody:
+  [*
+    // NBoTk Sep-21-2023 (created)
+    value := stringData;
+    
+    symbolList := construct( structured[String]);
+    symbolList.Add( "+")
+    symbolList.Add( "-")
+    symbolList.Add( "x")
+    symbolList.Add( "/")
+    symbolList.Add( "(")
+    symbolList.Add( ")")
+    
+    traverse( symbolList,Elements,e)
+    {
+        if( stringData.EndsWith( e ))
+        {
+             end := stringData.Length() - e.Length();
+             value := stringData.SubString( 0,end);
+        } 
+    }
+    
+    nameList := PriorityFactor::GetDataByBusinessType(  owner,"");       
+    traverse( nameList,Elements,e)
+    {
+        nameText := e.Name() + "[" + [String]e.Coefficient() + "*L]"
+        if( stringData.EndsWith( nameText))
+        {
+             end := stringData.Length() - nameText.Length();
+             value := stringData.SubString( 0,end);
+        } 
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackStr.qbl b/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackStr.qbl
index 55e5bd0..129f7d7 100644
--- a/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackStr.qbl
+++ b/_Main/BL/Type_PriorityPolicy/StaticMethod_RollBackStr.qbl
@@ -10,7 +10,6 @@
   [*
     // NBoTk Sep-21-2023 (created)
     value := stringData;
-    
     symbolList := construct( structured[String]);
     symbolList.Add( "+")
     symbolList.Add( "-")
@@ -28,7 +27,7 @@
         } 
     }
     
-    nameList := PriorityFactor::GetDataByBusinessType(  owner,businessType);       
+    nameList := PriorityFactor::GetDataByBusinessType(  owner,"");       
     traverse( nameList,Elements,e)
     {
         if( stringData.EndsWith( e.Name()))
@@ -37,7 +36,6 @@
              value := stringData.SubString( 0,end);
         } 
     }
-    
     return value;
   *]
 }
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..7b59176
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_CalculateScore.qbl
@@ -0,0 +1,87 @@
+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()-1);
+            }
+            else
+            {
+                // 涓嶆槸绗﹀彿 鐩存帴鑾峰彇璁$畻鍚庣殑鏁板��
+                score := PriorityResult::GetDetailsValue( customerOrder,remindFormula,macroPlan,globalOTDTable);
+                // 鎴彇鎺夊凡缁忚绠楃殑浼樺厛绾у洜瀛� 閫掑綊璁$畻
+                remindFormula := PriorityResult::GetRemindFormula( remindFormula,macroPlan);
+                PriorityResult::CalculateScore( remindFormula,customerOrder,businessType,macroPlan,score,globalOTDTable);
+            }
+    }
+    
+    // 娌℃湁鍖归厤 鍏紡璁$畻瀹屾垚
+    return score;
+  *]
+}
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..3033476
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_GetRemindFormula.qbl
@@ -0,0 +1,32 @@
+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());
+              }
+         }
+    }
+    
+    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..83fc44e
--- /dev/null
+++ b/_Main/BL/Type_PriorityResult/StaticMethod_calculatePriorityResult.qbl
@@ -0,0 +1,132 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CalculatePriorityResult (
+  String priorityPolicyName,
+  MacroPlan macroPlan,
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    // NBoTk Sep-26-2023 (created)
+    
+    // 鍏堝垹闄ゅ巻鍙茬殑璺戝垎璇︽儏
+    traverse( macroPlan,PriorityResult,p)
+    {
+          p.PriorityResultBusinessTypeDetail(relflush );
+          p.Delete(); 
+    }
+    
+    // 璁$畻瀹㈡埛璁㈠崟鐨勪紭鍏堢骇寰楀垎 鍥炲~鏉冮噸鏁版嵁 鐢熸垚鏂扮殑Priority鏄庣粏鏁版嵁
+    traverse( macroPlan,SalesDemand.astype( CustomerOrder ),e)
+    {
+         // 浜嬩笟閮ㄤ俊鎭�
+         businessType := e.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()
+                                   )
+    
+    // Quintiq浼樺厛绾у垎10绾� 闇�瑕佸垎娈佃绠� 鍚戜笂鍙栨暣
+    subLevel := round( resultList.Size() div 10);
+    subLevelCount := 0;
+    
+    priorityValue := 1;
+    if( resultList.Size() <= 10 )
+    {
+        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() = [String]priorityValue);
+                  if(isnull( oldPriority ) )
+                  {
+                        macroPlan.Priority(relnew,Weight := priorityValue,Name := [String]priorityValue);
+                  }        
+            }
+            
+            // 鍒ゆ柇璁$畻鍒嗘鏁伴噺涓嶲uintiq鍘熷浼樺厛绾�
+            //浼樺厛绾�+1
+            priorityValue := priorityValue + 1;
+        }
+    }
+    else
+    {
+        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() = [String]priorityValue);
+                  if(isnull( oldPriority ) )
+                  {
+                        macroPlan.Priority(relnew,Weight := priorityValue,Name := [String]priorityValue);
+                  }        
+            }
+        
+            // 鍒ゆ柇璁$畻鍒嗘鏁伴噺涓嶲uintiq鍘熷浼樺厛绾�
+            subLevelCount := subLevelCount + 1;
+            if( subLevelCount = subLevel )
+            {
+                // 褰撳埌杈惧垎娈垫暟閲忓悗 浼樺厛绾�+1 鍒嗘璁℃暟浠�0寮�濮�
+                if( priorityValue < 10 )
+                {
+                      priorityValue := priorityValue + 1;
+                }
+                subLevelCount := 0;
+            }
+        }
+    
+    }
+  *]
+}
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_Routing/Method_DoSanityCheckData.qbl b/_Main/BL/Type_Routing/Method_DoSanityCheckData.qbl
new file mode 100644
index 0000000..c23a63b
--- /dev/null
+++ b/_Main/BL/Type_Routing/Method_DoSanityCheckData.qbl
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: #root
+Method DoSanityCheckData (
+  output Strings feedback_o,
+  output Strings sanitycheckfeedback_o
+) declarative remote #extension
+{
+  TextBody:
+  [*
+    // Adhi Feb-10-2016 (created)
+    
+    isvalid := true;
+    
+    isvalid := this.GetHasValidInput( feedback_o, sanitycheckfeedback_o ) and isvalid;
+    
+    isvalid := this.GetHasTianmaNonSupplierOperationWithNoInput( feedback_o, sanitycheckfeedback_o ) and isvalid;
+    
+    return isvalid;
+  *]
+}
diff --git a/_Main/BL/Type_Routing/Method_GetHasTianmaNonSupplierOperationWithNoInput.qbl b/_Main/BL/Type_Routing/Method_GetHasTianmaNonSupplierOperationWithNoInput.qbl
new file mode 100644
index 0000000..ec4ca3e
--- /dev/null
+++ b/_Main/BL/Type_Routing/Method_GetHasTianmaNonSupplierOperationWithNoInput.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetHasTianmaNonSupplierOperationWithNoInput (
+  output Strings feedback_o,
+  output Strings sanitycheckfeedback_o
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    // Tianma change 20230925: If the unit is not a supplier, raise a data issue if there's no input
+    value := forall( this, RoutingStep.Operation, operation,
+                     guard( operation.Unit().IsSupplier(), false )
+                     or operation.OperationInput( relsize ) > 0 );
+    
+    if( not value )
+    {
+      // Add instance text
+      routingname := MacroPlan::GetSubstituteName( this.Name() );
+      instance := Translations::MP_Routing_Instance( routingname );
+      feedback := SanityCheckMessage::GetFormattedMessage( instance,
+                                                           "闈炰緵搴斿晢鎿嶄綔娌℃湁鎶曞叆鏂欍��" );
+      feedback_o.Add( feedback );
+      sanitycheckfeedback_o.Add( SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning() );
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_Scenario/Attribute_ScenarioName.qbl b/_Main/BL/Type_Scenario/Attribute_ScenarioName.qbl
new file mode 100644
index 0000000..d40aac3
--- /dev/null
+++ b/_Main/BL/Type_Scenario/Attribute_ScenarioName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ScenarioName
+{
+  #keys: '3[412960.0.288500040][412960.0.288500039][412960.0.288500041]'
+  Description: '鍦烘櫙鍚嶇О锛屽搴斾簨涓氶儴&缁勭粐缂栫爜缁存姢涓淮鎶ょ殑鍦烘櫙鍚嶇О'
+  ValueType: String
+}
diff --git "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl" "b/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
deleted file mode 100644
index 2c07b9d..0000000
--- "a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart\04395.qbl"
+++ /dev/null
@@ -1,301 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method CapacityAndSaleBudgeChart (
-  MacroPlans macroPlans,
-  Boolean isCapacity,
-  String groupBy,
-  String byBusinessTypeOrByOrgCode,
-  CapacityAndSaleBudgeFilterBusinessTypes businessTypes,
-  CapacityAndSaleBudgeFilterPlaceOfProductionOfArrays placeOfProductionOfArrays,
-  CapacityAndSaleBudgeFilterYears years,
-  CapacityAndSaleBudgeFilterMonths months,
-  MPSync mpSync,
-  GlobalOTDTable otdTable,
-  MacroPlan mappingParent
-)
-{
-  Description: '鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement'
-  TextBody:
-  [*
-    // yypsybs Sep-19-2023 (created)
-    // true, false
-    info( isCapacity );
-    // 鏈�;瀛e害;鍗婂勾;骞�
-    info( groupBy );
-    // 闈㈡澘鍩哄湴;浜嬩笟閮�
-    info( byBusinessTypeOrByOrgCode );
-    traverse( businessTypes, Elements, businessType ) {
-      info( "businessType : " + businessType.BusinessType() );
-    }
-    traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-      info( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
-    }
-    traverse( macroPlans, Elements, macroPlan ) {
-      info( "macroPlan : " + macroPlan.ScenarioName() );  
-    }
-    // 骞翠唤涓嶉�夋椂鍏ㄩ��
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
-    }
-    traverse( years, Elements, year ) {
-      info( "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() );
-    }
-    
-    // ====娓呯悊鏃ф暟鎹�====
-    this.CapacityAndSaleBudgeChartRow( relflush );
-    this.CapacityAndSaleBudgeChartElement( relflush );
-    
-    // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
-    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
-    if( businessTypes.Size() > 0 ) {
-      businessTypeStrings := selectuniquevalues( businessTypes, Elements, item, true, item.BusinessType() );
-      historyData := selectset( historyData, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
-    }
-    if( placeOfProductionOfArrays.Size() > 0 ) {
-      placeOfProductionOfArrayStrings := selectuniquevalues( placeOfProductionOfArrays, Elements, item, true, item.PlaceOfProductionOfArray() );
-      historyData := selectset( historyData, Elements, item, placeOfProductionOfArrayStrings.Find( item.PlaceOfProductionOfArray() ) > -1 );
-    }
-    //info( "historyData : " + [String]historyData.Size() );
-    traverse( historyData, Elements, item ) {
-      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.PlaceOfProductionOfArray() );
-      // 璁板綍姣忚鍖呭惈鍝簺product
-      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductCode() );
-    }
-    rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
-    //info( "rows : " + [String]rows.Size() );
-    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.PlaceOfProductionOfArray() );
-    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
-    // 鐢熸垚鍥捐〃鍏冪礌
-    traverse( years, Elements, year ) {
-      info( "process year start : " + [String]year.YearNo() );
-      if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
-        // 鐩爣
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, year.YearNo() ),
-                                                                     MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, year.YearNo() ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ),
-                                                                       MappingCustomerOrder::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ) 
-                                                                       )
-                                                   ); 
-          }                    
-        }
-      } 
-      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鍗婂勾" ) {
-        for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
-          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ),
-                                                                       MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ) )
-                                                   );  
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ),
-                                                                         MappingCustomerOrder::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ) 
-                                                                         )
-                                                     ); 
-            }                    
-          }
-        }
-      }
-      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "瀛e害" ) {
-        for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-      //      info( "productCodeList : " + [String]productCodeList.Size() );
-      //      info( "MappingCapacityAndSaleBudge::GetSheetBySeason : " + [String]MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) );
-      //      info( "seasonNo : " + [String]seasonNo );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ),
-                                                                       MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ) )
-                                                   );  
-      //      info( "productCodeList : " + [String]productCodeList.Size() );
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ),
-                                                                         MappingCustomerOrder::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ) 
-                                                                         )
-                                                     ); 
-            }                    
-          }
-        }
-      }
-      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鏈�" ) {
-        traverse( months, Elements, month ) {
-          info( "process month start : " + [String]month.MonthNo() );
-          monthNoString := ifexpr( month.MonthNo() <= 9, "0" + [String]month.MonthNo(), [String]month.MonthNo() );
-          traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ),
-                                                                       MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ) )
-                                                   );  
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ),
-                                                                         MappingCustomerOrder::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ) 
-                                                                         )
-                                                     ); 
-            }
-          }
-          info( "process month end : " + [String]month.MonthNo() );
-        }
-      }
-      if( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "骞�" ) {
-        // 鐩爣
-        traverse( businessTypeList, Elements, businessType ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, year.YearNo() ),
-                                                                     MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, year.YearNo() ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ),
-                                                                       MappingCustomerOrder::GetNewSupplyByYear( productCodeList, macroPlan, year.YearNo() ) 
-                                                                       )
-                                                   ); 
-          }                    
-        }
-      } 
-      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鍗婂勾" ) {
-        for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
-          traverse( businessTypeList, Elements, businessType ) {
-            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ),
-                                                                       MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, year.YearNo(), halfNo ) )
-                                                   );  
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ),
-                                                                         MappingCustomerOrder::GetNewSupplyByHalfYear( productCodeList, macroPlan, year.YearNo(), halfNo ) 
-                                                                         )
-                                                     ); 
-            }                    
-          }
-        }
-      }
-      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
-        for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-          info( "process season start : " + [String]seasonNo );
-          traverse( businessTypeList, Elements, businessType ) {
-            productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ),
-                                                                       MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, year.YearNo(), seasonNo ) )
-                                                   );  
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ),
-                                                                         MappingCustomerOrder::GetNewSupplyBySeason( productCodeList, macroPlan, year.YearNo(), seasonNo ) 
-                                                                         )
-                                                     ); 
-            }                    
-          }
-          info( "process season end : " + [String]seasonNo );
-        }
-      }
-      if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
-        traverse( months, Elements, month ) {
-          info( "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 );
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ),
-                                                                       MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, year.YearNo(), month.MonthNo() ) )
-                                                   );  
-            // S&OP
-            traverse( macroPlans, Elements, macroPlan ) {
-              this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                     TimeStringAndScenarioName := [String]year.YearNo() + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
-                                                     BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                     Quantity := ifexpr( isCapacity,
-                                                                         Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ),
-                                                                         MappingCustomerOrder::GetNewSupplyByMonth( productCodeList, macroPlan, year.YearNo(), month.MonthNo() ) 
-                                                                         )
-                                                     ); 
-            }            
-          }
-          info( "process month end : " + [String]month.MonthNo() );
-        }
-      }
-      info( "process year end : " + [String]year.YearNo() )
-    }
-    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
-    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
-    //  info( "==鈫�==" );
-    //  info( row.BusinessType() );
-    //  info( row.PlaceOfProductionOfArray() );
-    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
-    //  info( elements.Size() );
-    //  info( row.GetProductCodes().Concatenate( " | " ) );
-    //  info( "==鈫�==" );
-    //}
-  *]
-}
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl
deleted file mode 100644
index 2f62201..0000000
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeChart.qbl
+++ /dev/null
@@ -1,266 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method CapacityAndSaleBudgeChart (
-  MacroPlans macroPlans,
-  Boolean isCapacity,
-  String groupBy,
-  String byBusinessTypeOrByOrgCode,
-  String businessTypeChosen,
-  String placeOfProductionOfArrayChosen,
-  String year,
-  MPSync mpSync,
-  GlobalOTDTable otdTable,
-  MacroPlan mappingParent
-)
-{
-  Description:
-  [*
-    鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement
-    锛侊紒锛侊紒搴熷純锛侊紒锛侊紒
-  *]
-  TextBody:
-  [*
-    // yypsybs Sep-19-2023 (created)
-    // true, false
-    info( isCapacity );
-    // 鏈�;瀛e害;鍗婂勾;骞�
-    info( groupBy );
-    // 闈㈡澘鍩哄湴;浜嬩笟閮�
-    info( byBusinessTypeOrByOrgCode );
-    info( businessTypeChosen );
-    info( placeOfProductionOfArrayChosen );
-    info( year );
-    
-    // ====娓呯悊鏃ф暟鎹�====
-    this.CapacityAndSaleBudgeChartRow( relflush );
-    this.CapacityAndSaleBudgeChartElement( relflush );
-    
-    // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
-    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
-    if( placeOfProductionOfArrayChosen <> "" ) {
-      historyData := selectset( historyData, Elements, item, item.PlaceOfProductionOfArray() = placeOfProductionOfArrayChosen );
-    }
-    if( businessTypeChosen <> "" ) {
-      historyData := selectset( historyData, Elements, item, item.BusinessType() = businessTypeChosen );
-    }
-    //info( "historyData : " + [String]historyData.Size() );
-    traverse( historyData, Elements, item ) {
-      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.PlaceOfProductionOfArray() );
-      // 璁板綍姣忚鍖呭惈鍝簺product
-      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductCode() );
-    }
-    rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
-    //info( "rows : " + [String]rows.Size() );
-    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.PlaceOfProductionOfArray() );
-    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
-    // 鐢熸垚鍥捐〃鍏冪礌
-    if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
-      // 鐩爣
-      traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-        productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-        this.CapacityAndSaleBudgeChartElement( relnew, 
-                                               TimeStringAndScenarioName := [String]year + "骞�-鐩爣",
-                                               BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                               Quantity := ifexpr( isCapacity,
-                                                                   MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, [Number]year ),
-                                                                   // todo QID 23
-                                                                   MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, [Number]year ) )
-                                               );  
-        // S&OP
-        traverse( macroPlans, Elements, macroPlan ) {
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-" + macroPlan.ScenarioName(),
-                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, [Number]year ),
-                                                                     // todo
-                                                                     0.0 )
-                                                 ); 
-        }                    
-      }
-    } 
-    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鍗婂勾" ) {
-      for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ),
-                                                                     MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, [Number]year, halfNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "瀛e害" ) {
-      for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-    //      info( "productCodeList : " + [String]productCodeList.Size() );
-    //      info( "MappingCapacityAndSaleBudge::GetSheetBySeason : " + [String]MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) );
-    //      info( "seasonNo : " + [String]seasonNo );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ),
-                                                                     MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) )
-                                                 );  
-    //      info( "productCodeList : " + [String]productCodeList.Size() );
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, [Number]year, seasonNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "鏈�" ) {
-      for( monthNo := 1; monthNo <= 12; monthNo := monthNo + 1 ) {
-        monthNoString := ifexpr( monthNo <= 9, "0" + [String]monthNo, [String]monthNo );
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ),
-                                                                     MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, [Number]year, monthNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    if( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "骞�" ) {
-      // 鐩爣
-      traverse( businessTypeList, Elements, businessType ) {
-        productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-        this.CapacityAndSaleBudgeChartElement( relnew, 
-                                               TimeStringAndScenarioName := [String]year + "骞�-鐩爣",
-                                               BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                               Quantity := ifexpr( isCapacity,
-                                                                   MappingCapacityAndSaleBudge::GetSheetByYear( productCodeList, mpSync, [Number]year ),
-                                                                   MappingAnnualBudget::GetSheetByYear( productCodeList, mpSync, [Number]year ) )
-                                               );  
-        // S&OP
-        traverse( macroPlans, Elements, macroPlan ) {
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-" + macroPlan.ScenarioName(),
-                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     Product_MP::GetNewSupplyByYear( productCodeList, macroPlan, [Number]year ),
-                                                                     0.0 )
-                                                 ); 
-        }                    
-      }
-    } 
-    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鍗婂勾" ) {
-      for( halfNo := 1; halfNo <= 2; halfNo := halfNo + 1 ) {
-        traverse( businessTypeList, Elements, businessType ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ),
-                                                                     MappingAnnualBudget::GetSheetByHalfYear( productCodeList, mpSync, [Number]year, halfNo ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-" + ifexpr( halfNo = 1, "涓�", "涓�" ) + "鍗婂勾-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByHalfYear( productCodeList, macroPlan, [Number]year, halfNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "瀛e害" ) {
-      for( seasonNo := 1; seasonNo <= 4; seasonNo := seasonNo + 1 ) {
-        traverse( businessTypeList, Elements, businessType ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ),
-                                                                     MappingAnnualBudget::GetSheetBySeason( productCodeList, mpSync, [Number]year, seasonNo ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + [String]seasonNo + "瀛e害-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyBySeason( productCodeList, macroPlan, [Number]year, seasonNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    if ( byBusinessTypeOrByOrgCode = "浜嬩笟閮�" and groupBy = "鏈�" ) {
-      for( monthNo := 1; monthNo <= 12; monthNo := monthNo + 1 ) {
-        monthNoString := ifexpr( monthNo <= 9, "0" + [String]monthNo, [String]monthNo );
-        traverse( businessTypeList, Elements, businessType ) {
-          productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByBusinessType( rows, businessType );
-          this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                 TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-鐩爣",
-                                                 BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                 Quantity := ifexpr( isCapacity,
-                                                                     MappingCapacityAndSaleBudge::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ),
-                                                                     MappingAnnualBudget::GetSheetByMonth( productCodeList, mpSync, [Number]year, monthNo ) )
-                                                 );  
-          // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
-            this.CapacityAndSaleBudgeChartElement( relnew, 
-                                                   TimeStringAndScenarioName := [String]year + "骞�-绗�" + monthNoString + "鏈�-" + macroPlan.ScenarioName(),
-                                                   BusinessTypeOrPlaceOfProductionOfArray := businessType, 
-                                                   Quantity := ifexpr( isCapacity,
-                                                                       Product_MP::GetNewSupplyByMonth( productCodeList, macroPlan, [Number]year, monthNo ),
-                                                                       0.0 )
-                                                   ); 
-          }                    
-        }
-      }
-    }
-    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
-    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
-    //  info( "==鈫�==" );
-    //  info( row.BusinessType() );
-    //  info( row.PlaceOfProductionOfArray() );
-    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
-    //  info( elements.Size() );
-    //  info( row.GetProductCodes().Concatenate( " | " ) );
-    //  info( "==鈫�==" );
-    //}
-  *]
-}
diff --git a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
deleted file mode 100644
index a441cd3..0000000
--- a/_Main/BL/Type_ScenarioManager/Method_CapacityAndSaleBudgeCompare.qbl
+++ /dev/null
@@ -1,207 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method CapacityAndSaleBudgeCompare (
-  MacroPlans macroPlans,
-  CapacityAndSaleBudgeFilterItems items,
-  CapacityAndSaleBudgeFilterYears years,
-  CapacityAndSaleBudgeFilterMonths months,
-  MPSync mpSync,
-  GlobalOTDTable otdTable,
-  MacroPlan mappingParent
-)
-{
-  Description: 'todo : mappingParent鏀逛负mpSync, random鍒犱簡'
-  TextBody:
-  [*
-    // yypsybs Sep-18-2023 (created)
-    // ====涓嶉�夋椂榛樿鍏ㄩ��====
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
-    }
-    if( months.Size() = 0 ) {
-      months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
-    }
-    traverse( macroPlans, Elements, item ) {
-      info( "scenario : " + item.ScenarioName() );
-    }
-    traverse( items, Elements, item ) {
-      info( "item : " + item.ItemName() );
-    }
-    traverse( years, Elements, item ) {
-      info( "year : " + [String]item.YearNo() );
-    }
-    traverse( months, Elements, item ) {
-      info( "month : " + [String]item.MonthNo() );
-    }
-    // ====娓呯悊鏃ф暟鎹�====
-    this.CapacityAndSaleBudgeCompareItemRow( relflush );
-    this.CapacityAndSaleBudgeCompareItemColumn( relflush );
-    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
-    historyData := selectset( mpSync, MappingCapacityAndSaleBudge, item, true );
-    info( "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 );
-      boms := selectset( mappingParent, MappingBOM, bom, bom.ProductCode() = productCode );
-      if( boms.Size() > 0 ) {
-        bom := boms.First();
-        businessType := bom.BusinessType();
-        placeOfProductionOfArray := one.PlaceOfProductionOfArray();
-        // 鐩稿悓闈㈡澘鍩哄湴鍜屼簨涓氶儴鐨勬斁涓�琛�
-        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, businessType, placeOfProductionOfArray );
-        // 璁板綍姣忚鍖呭惈鍝簺product
-        CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
-      } else {
-        info( "no boms for product : " + productCode );
-      }
-    }
-    info( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
-    // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
-    // 浜嬩笟閮紝缁勭粐
-    info( "dealing businessType and placeOfProductionOfArray" )
-    columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
-    columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
-    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-      cell := columnBusinessType.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.BusinessType() );
-      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-      cell := columnPlaceOfProductionOfArray.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.PlaceOfProductionOfArray() );
-      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-    }
-    // 闈㈡澘鍒嗛厤閲� - 骞村害棰勭畻 (sheets)
-    // 鏍煎紡锛� 闈㈡澘鍒嗛厤閲� - 骞� - 鏈堬紙1-12 & total锛� - 骞村害棰勭畻/scenarioName
-    info( "dealing 闈㈡澘鍒嗛厤閲�" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
-      traverse( years, Elements, year ) {
-        // 鍘嗗彶鏁版嵁
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := MappingCapacityAndSaleBudge::GetSheetByMonth( row.GetProductCodes(), mpSync, DateTime::Now().Year(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-          }
-        }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := MappingCapacityAndSaleBudge::GetSheetByYear( row.GetProductCodes(), mpSync, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                    "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-            }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                 "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-          }
-        }
-      }
-    }
-    // 骞村害閿�鍞
-    info( "dealing 閿�鍞" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
-      traverse( years, Elements, year ) {
-        // 鍘嗗彶鏁版嵁
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := MappingCapacityAndSaleBudge::GetSaleByMonth( row.GetProductCodes(), mpSync, year.YearNo(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-          }
-        }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := MappingCapacityAndSaleBudge::GetSaleByYear( row.GetProductCodes(), mpSync, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := MappingAnnualBudget::GetSaleByMonth( row.GetProductCodes(), mpSync, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-            }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            // QID 23
-            cellReal := MappingAnnualBudget::GetSaleByYear( row.GetProductCodes(), mpSync, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-          }
-        }
-      }
-    }
-    // 澶у紶鐩堝埄棰�
-    info( "dealing 澶у紶鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
-      // 鍘嗗彶鏁版嵁
-      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo 
-        // QID 23
-        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
-        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-      }
-      // S&OP鏁版嵁
-      traverse( macroPlans, Elements, macroPlan ) {
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-      }
-    }
-    // 浜у搧鐩堝埄棰�
-    info( "dealing 浜у搧鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
-      // 鍘嗗彶鏁版嵁
-      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo
-        // QID 23
-        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
-        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-      }
-      // S&OP鏁版嵁
-      traverse( macroPlans, Elements, macroPlan ) {
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          // todo
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-      }
-    }
-    
-    // 璁剧疆rowNo鍜宑olumnNo
-    info( "set rowNo and columnNo" );
-    rowNo := 1;
-    rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
-    traverse( rowSorted, Elements, item ) {
-      item.RowNo( rowNo );
-      rowNo := rowNo + 1;
-    }
-    columnNo := 1;
-    traverse( this, CapacityAndSaleBudgeCompareItemColumn, item ) {
-      item.ColumnNo( columnNo );
-      columnNo := columnNo + 1;
-    }
-    info( "done" );
-  *]
-}
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_ScenarioManager/StaticMethod_AvailableBusinessTypes.qbl b/_Main/BL/Type_ScenarioManager/StaticMethod_AvailableBusinessTypes.qbl
deleted file mode 100644
index 64f7bc4..0000000
--- a/_Main/BL/Type_ScenarioManager/StaticMethod_AvailableBusinessTypes.qbl
+++ /dev/null
@@ -1,18 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod AvailableBusinessTypes () as String
-{
-  TextBody:
-  [*
-    // yypsybs Aug-23-2023 (created)
-    strings := "闆嗗洟闈㈡澘;涓撲笟鏄剧ず浜嬩笟閮�;澶栧崠CELL;闈炴樉;杩愬姩鍋ュ悍;杩愬姩鍋ュ悍浜嬩笟閮�;鎵嬫満浜嬩笟閮�;鐗圭鏄剧ず;姹借溅鐢靛瓙浜嬩笟閮�;杞﹁浇鏄剧ず浜嬩笟閮�;IT浜嬩笟閮�;";
-    
-    //table := KB_BusinessTypesTable;
-    
-    if( strings.EndsWith( ";" ) ) {
-        strings := strings.SubString( 0, strings.Length() - 1 );  
-    }
-    
-    return strings;
-  *]
-}
diff --git a/_Main/BL/Type_ScenarioManager/StaticMethod_AvailableScenarioNames.qbl b/_Main/BL/Type_ScenarioManager/StaticMethod_AvailableScenarioNames.qbl
new file mode 100644
index 0000000..4956f3d
--- /dev/null
+++ b/_Main/BL/Type_ScenarioManager/StaticMethod_AvailableScenarioNames.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AvailableScenarioNames (
+  GlobalOTDTable globalOTDTable
+) as String
+{
+  TextBody:
+  [*
+    // yypsybs Aug-23-2023 (created)
+    //strings := "闆嗗洟闈㈡澘;涓撲笟鏄剧ず浜嬩笟閮�;澶栧崠CELL;闈炴樉;杩愬姩鍋ュ悍;杩愬姩鍋ュ悍浜嬩笟閮�;鎵嬫満浜嬩笟閮�;鐗圭鏄剧ず;姹借溅鐢靛瓙浜嬩笟閮�;杞﹁浇鏄剧ず浜嬩笟閮�;IT浜嬩笟閮�;";
+    
+    //table := KB_BusinessTypesTable;
+    //
+    //if( strings.EndsWith( ";" ) ) {
+    //    strings := strings.SubString( 0, strings.Length() - 1 );  
+    //}
+    
+    // 浣跨敤businessType鑾峰彇鏁版嵁
+    strings := BusinessType::GetScenarioNamesStr( globalOTDTable);
+    
+    return strings;
+  *]
+}
diff --git a/_Main/BL/Type_ScenarioManager/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl b/_Main/BL/Type_ScenarioManager/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl
new file mode 100644
index 0000000..f40c634
--- /dev/null
+++ b/_Main/BL/Type_ScenarioManager/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GeneratesTheSpecifiedXMLColumn (
+  XMLDOMDocument xmlDOMDocument,
+  XMLDOMElement tableElement,
+  String value,
+  String columnName
+)
+{
+  TextBody:
+  [*
+    columnElements := tableElement.GetElementsByTagName( "column" );
+    
+    traverse ( columnElements, Elements, ce ) {
+      nameElement := ce.GetElementByTagName( "name", 0 );
+      if ( nameElement.TextContent() = columnName ) {
+        cell := xmlDOMDocument.CreateElement( "cell" );
+        cell.SetAttribute( "value", value );
+        ce.AppendChild( cell );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Unit/StaticMethod_CreateOrUpdate.qbl b/_Main/BL/Type_Unit/StaticMethod_CreateOrUpdate.qbl
index df72958..5806f00 100644
--- a/_Main/BL/Type_Unit/StaticMethod_CreateOrUpdate.qbl
+++ b/_Main/BL/Type_Unit/StaticMethod_CreateOrUpdate.qbl
@@ -7,7 +7,7 @@
   String parentunitid,
   String capacitytype,
   String unitofmeasurename
-)
+) as Unit
 {
   TextBody:
   [*
@@ -21,7 +21,7 @@
     unit := Unit::FindById( owner, id );
     
     if( id="澶╅┈闆嗗洟" and isnull( unit ) ){
-      owner.Unit( relnew, 
+      unit := owner.Unit( relnew, 
                  ID := id, 
                  Name := name, 
                  UnitOfMeasureName := unitofmeasurename, 
@@ -31,7 +31,7 @@
                  CapacityType := capacitytype );
       }else{
       if( isnull( unit ) ){
-        owner.Unit( relnew, ID := id, 
+        unit := owner.Unit( relnew, ID := id, 
                    Name := name, 
                    ParentUnitID := parentunitid, 
                    CapacityType := capacitytype, 
@@ -46,5 +46,7 @@
           unit.UnitOfMeasureName( unitofmeasurename );
           }
         }
+    
+    return unit;
   *]
 }
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/Sys/ImgAttr/Global_BrokerExecuteLog.dme b/_Main/Sys/ImgAttr/Global_BrokerExecuteLog.dme
new file mode 100644
index 0000000..b3263a6
--- /dev/null
+++ b/_Main/Sys/ImgAttr/Global_BrokerExecuteLog.dme
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+TypeDataInterface Global_BrokerExecuteLog
+{
+  TypeKey: '[414702.0.265587041]'
+  ImageDataMember ImageExecutionStatus
+  {
+    #keys: '1[414702.0.496052017]'
+    ImageSpecifications:
+    [
+      ImageDataMemberImageSpecification
+      {
+        Image: 'MEDIA_PLAY_GREEN'
+        Quill: 'object.ExecutionStatus() = "InOperation"'
+        Value: 'InOperation'
+      }
+      ImageDataMemberImageSpecification
+      {
+        Image: 'CHECK'
+        Quill: 'object.ExecutionStatus() = "Complete"'
+        Value: 'ImageExecutionStatus2'
+      }
+    ]
+  }
+}
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/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
index 7b1da32..e164af9 100644
--- a/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
+++ b/_Main/UI/MacroPlanner/Component_FormTestButtonCollection/Response_Button398_OnClick.def
@@ -5,7 +5,7 @@
   #keys: '[414702.0.340554926]'
   Body:
   [*
-    CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan );
+    CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan, SelectionScenario.Data() );
   *]
   CanBindMultiple: false
   DefinitionID: 'Responsedef_GUIButtonBase_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_ContextMenuSalesFillingCapacity.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuSalesFillingCapacity.def
index 4e6377b..0aae48c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuSalesFillingCapacity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuSalesFillingCapacity.def
@@ -14,7 +14,7 @@
         Image: 'ELEMENT_BLUE'
         Taborder: 0
         Title: '澶栧崠CELL'
-        Tooltip: 'Filling Capacity Scheme List'
+        Tooltip: '澶栧崠CELL'
       ]
     }
     Component MenuSalesFillingSchemeDetail
@@ -26,6 +26,7 @@
         Image: 'ELEMENT_ORANGE'
         Taborder: 1
         Title: '濉骇鏂规鍒楄〃'
+        Tooltip: '濉骇鏂规鍒楄〃'
       ]
     }
     Component MenuSalesFillingSchemeHistorical
@@ -37,6 +38,7 @@
         Image: 'ELEMENT_ORANGE'
         Taborder: 2
         Title: '濉骇鍘嗗彶璁㈠崟鍒楄〃'
+        Tooltip: '濉骇鍘嗗彶璁㈠崟鍒楄〃'
       ]
     }
   ]
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_abgTest.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgTest.def
new file mode 100644
index 0000000..a28e4bb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgTest.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component abgTest
+{
+  #keys: '[414702.0.358311816]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component btnTestAttempt
+    {
+      #keys: '[414502.0.409422371]'
+      BaseType: 'WebButton'
+      Children:
+      [
+        #child: cmTestAttempt
+      ]
+      Properties:
+      [
+        Image: 'ANTENNA'
+        Label: '娴嬭瘯瑙嗗浘'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 4
+    Title: 'TestView'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
new file mode 100644
index 0000000..7966b9e
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+Component applicationDevelopmentActionBarPageDef id:applicationDevelopmentActionBarPageDef_1 #extension
+{
+  Children:
+  [
+    #child: abgTest
+    #child: abgInterfaceTest
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
new file mode 100644
index 0000000..884eba9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component cmTestAttempt
+{
+  #keys: '[414502.0.409457922]'
+  BaseType: 'WebContextMenu'
+  Children:
+  [
+    Component mnCapacityAllocationAndProductionFilling
+    {
+      #keys: '[414502.0.409457923]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'WATER_FISH'
+        Taborder: 0
+        Title: '浜ц兘鍒嗛厤&濉骇'
+      ]
+    }
+    Component mnAnnualProductionAndSalesReview
+    {
+      #keys: '[414502.0.409488417]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'PIG'
+        Taborder: 1
+        Title: '骞村害浜ч攢澶嶇洏'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
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_ContextMenuSalesFillingCapacity_MenuSalesFillingCapac.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingCapac.def
index 3bd914f..73a0e05 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingCapac.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingCapac.def
@@ -10,9 +10,8 @@
     Body:
     [*
       // Open view
-      //ApplicationMacroPlanner.OpenView( 'Filling Capacity Scheme List',ButtonSalesFillingCapacity);
-      
-      ApplicationMacroPlanner.OpenView( 'FillingCapacityOrder', ButtonSalesFillingCapacity );
+      //ApplicationMacroPlanner.OpenView( 'FillingCapacityOrder', ButtonSalesFillingCapacity );
+      ApplicationScope.ViewManager().ResetUserViewById( "FillingCapacityOrder",true);
     *]
     GroupServerCalls: false
   }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingS\043360.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingS\043360.def"
index 2d1e1f4..067c423 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingS\043360.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingS\043360.def"
@@ -10,8 +10,7 @@
     Body:
     [*
       // Open view
-      //ApplicationMacroPlanner.OpenView( "FillingCapacitySchemeList",ButtonSalesFillingCapacity);
-      ApplicationMacroPlanner.OpenView( "FillingCapacityOrderHistorical");
+      ApplicationScope.ViewManager().ResetUserViewById( "FillingCapacityOrderHistorical",true);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingSchem.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingSchem.def
index 0ad306d..22b6bc7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingSchem.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ContextMenuSalesFillingCapacity_MenuSalesFillingSchem.def
@@ -10,8 +10,7 @@
     Body:
     [*
       // Open view
-      //ApplicationMacroPlanner.OpenView( "FillingCapacitySchemeList",ButtonSalesFillingCapacity);
-      ApplicationMacroPlanner.OpenView( "FillingCapacitySchemeList");
+      ApplicationScope.ViewManager().ResetUserViewById( "FillingCapacitySchemeList",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_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnAnnualProductionAndSalesReview_OnClic.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnAnnualProductionAndSalesReview_OnClic.def
new file mode 100644
index 0000000..aa266a1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnAnnualProductionAndSalesReview_OnClic.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: cmTestAttempt/mnAnnualProductionAndSalesReview
+Response OnClick () id:Response_TIANMA_JITUAN_cmTestAttempt_mnAnnualProductionAndSalesReview_OnClick
+{
+  #keys: '[414502.0.409488583]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "骞村害浜ч攢澶嶇洏", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnCapacityAllocationAndProductionFillin.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnCapacityAllocationAndProductionFillin.def
new file mode 100644
index 0000000..f2aaa6f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_cmTestAttempt_mnCapacityAllocationAndProductionFillin.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: cmTestAttempt/mnCapacityAllocationAndProductionFilling
+Response OnClick () id:Response_TIANMA_JITUAN_cmTestAttempt_mnCapacityAllocationAndProductionFilling_OnClick
+{
+  #keys: '[414502.0.409488282]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Test", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 2ee31ab..b0bcb6e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -11,6 +11,7 @@
       [
         #child: ActionBarPageData
         #child: ActionBarPageSales
+        #child: applicationDevelopmentActionBarPageDef_1
       ]
     }
     Component DataHolderCapacityAndSaleBudgeFilterItem
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Component_pnlContent.def
index b6cdcbb..07b8549 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Component_pnlContent.def
@@ -12,10 +12,35 @@
       Properties:
       [
         DataBinding: 'DataHolderBusinessType.Data.BusinessTypeName'
-        Label: 'Business Type Name'
+        Description: '浜嬩笟閮ㄥ悕绉拌緭鍏�'
+        Label: '浜嬩笟閮ㄥ悕绉�'
         Taborder: 0
       ]
     }
+    Component editScenarioName
+    {
+      #keys: '[412960.0.275480603]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderBusinessType.Data.ScenarioName'
+        Description: '鍦烘櫙鍚嶇О缂栬緫'
+        Label: '鍦烘櫙鍚嶇О'
+        Taborder: 1
+      ]
+    }
+    Component editDisplayType
+    {
+      #keys: '[412960.0.278321833]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderBusinessType.Data.DisplayType'
+        Description: '鏄剧ず绫诲瀷缂栬緫'
+        Label: '鏄剧ず绫诲瀷'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
index 54a2fe2..9f099b0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogBusinessType/Method_ClickBtnOk.def
@@ -11,14 +11,7 @@
     
     // OnOk
     this.ApplyChanges();
-    
     DataHolderBusinessType.Data().Commit();
-    
-    //if( not isnull( DataHolderForm.Data() ) )
-    //{
-    //  // Access the form, select the new assumption
-    //  DataHolderForm.Data().ListAssumptions().SelectByKey( DataHolderDialogData.Data().WrappedInstance().Key() );
-    //}
     
     this.Close();
   *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlActions.def
new file mode 100644
index 0000000..0e13477
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[414702.0.373821470]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[414702.0.373821474]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[414702.0.373821476]'
+      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_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def
new file mode 100644
index 0000000..f885a86
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Component_pnlContent.def
@@ -0,0 +1,58 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[414702.0.373821468]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efPanelMaterialCode
+    {
+      #keys: '[414702.0.375722232]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.PanelMaterialCode'
+        Label: '闈㈡澘鐗╂枡缂栫爜'
+        Taborder: 0
+      ]
+    }
+    Component efModuleMaterialCode
+    {
+      #keys: '[414702.0.375722245]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ModuleMaterialCode'
+        Label: '妯℃澘浜ф垚鍝両D'
+        Taborder: 1
+      ]
+    }
+    Component efDivision
+    {
+      #keys: '[414702.0.375722257]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.Division'
+        Label: '浜嬩笟閮�'
+        Taborder: 2
+      ]
+    }
+    Component efStockingPointID
+    {
+      #keys: '[414702.0.375874061]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.StockingPointID'
+        Label: '妯$粍浜ф垚鍝佸簱瀛樼偣ID'
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_Edit.def
new file mode 100644
index 0000000..77662e1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_Edit.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  CapacityAllocationResultsRuleConfiguration selection
+) id:Method_DialogCreateEditCapacityAllocationResultsRuleConfiguration_Edit
+{
+  #keys: '[414702.0.375759040]'
+  Body:
+  [*
+    // Edits assumption
+    data := shadow( selection );
+    
+    DataHolderDialogData.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_New.def
new file mode 100644
index 0000000..fa8fb18
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Method_New.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method New () id:Method_DialogCreateEditCapacityAllocationResultsRuleConfiguration_New
+{
+  #keys: '[414702.0.375317354]'
+  Body:
+  [*
+    capacityAllocationResultsRuleConfiguration := GlobalOTDTable.CapacityAllocationResultsRuleConfiguration( relshadow );
+    
+    DataHolderDialogData.Data( &capacityAllocationResultsRuleConfiguration );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..057d12d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/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: '[414702.0.373821480]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..336e9a8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[414702.0.373821479]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ApplyChanges();
+      
+      data := DataHolderDialogData.Data().WrappedInstance();
+      if ( isnull( data ) ) {
+        GlobalOTDTable.CapacityAllocationResultsRuleConfiguration( relnew,
+                                                                   PanelMaterialCode  := efPanelMaterialCode.Text(),
+                                                                   ModuleMaterialCode := efModuleMaterialCode.Text(),
+                                                                   Division           := efDivision.Text(),
+                                                                   StockingPointID    := efStockingPointID.Text()
+                                                                  );
+      } else {
+        DataHolderDialogData.Data().PanelMaterialCode( efPanelMaterialCode.Text() );
+        DataHolderDialogData.Data().ModuleMaterialCode( efModuleMaterialCode.Text() );
+        DataHolderDialogData.Data().Division( efDivision.Text() );
+        DataHolderDialogData.Data().StockingPointID( efStockingPointID.Text() );
+        DataHolderDialogData.Data().Commit();
+      }
+      
+      
+      Form.Close();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/_ROOT_Component_DialogCreateEditCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/_ROOT_Component_DialogCreateEditCapacityAllocationResultsRuleConfiguration.def
new file mode 100644
index 0000000..76da375
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCapacityAllocationResultsRuleConfiguration/_ROOT_Component_DialogCreateEditCapacityAllocationResultsRuleConfiguration.def
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '[414702.0.373821466]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderDialogData
+    {
+      #keys: '[414702.0.375413793]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[CapacityAllocationResultsRuleConfiguration]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Image: 'BEAR'
+    Padding: 'false'
+  ]
+}
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..f9cb868
--- /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);
+      Form.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_DialogCreateEditIssueWorkOrder/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditIssueWorkOrder/Response_pnlActions_btnOk_OnClick.def
index 4e08b41..76530fa 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditIssueWorkOrder/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditIssueWorkOrder/Response_pnlActions_btnOk_OnClick.def
@@ -4,6 +4,16 @@
 {
   #keys: '[414702.0.223820978]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := guard( [Real]efPlannedQuantity.Text() > 0.0, false ) or DataHolderDialogDatas.Data().Size() > 1;
+    
+    if ( not flag ) {
+      feedback := "璇疯緭鍏ヤ竴涓ぇ浜�0鐨勬暟瀛�";
+    }
+    
+    return flag;
+  *]
   QuillAction
   {
     Body:
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
index f8a1684..158887f 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Component_PanelGeneral\043549.def"
@@ -46,8 +46,8 @@
       Properties:
       [
         AllowEmpty: true
-        DataBinding: 'DataHolderDialogData.Data.BusinessType'
-        Label: 'BusinessType'
+        DataBinding: 'DataHolderDialogData.Data.ScenarioName'
+        Label: 'Scenario Name'
         Taborder: 4
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
index 5d283ea..b488de3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditScenario/Method_OnOk.def
@@ -32,6 +32,13 @@
       data.Name( versionname );
       }
     
+    // Get Business Type from Scenario Name
+    businesstype := select( globalotdtable, 
+                            BusinessType, 
+                            b, 
+                            b.ScenarioName()=data.ScenarioName() ).BusinessTypeName();
+    data.BusinessType( businesstype );
+    
     // Copy scenario
     if( isnull( data.WrappedInstance() ) )
     {
@@ -108,7 +115,7 @@
     // sync data
     if( data.EnableSync() ) {
         MacroPlan::DoSync( macroPlanNew, 
-                           data.BusinessType(), data.IsKeyProduct(), data.CreatePurchaseSupplyMaterial() );
+                           data.BusinessType(), data.IsKeyProduct(), data.CreatePurchaseSupplyMaterial() ,GlobalOTDTable);
     }
     
     this.Close();
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_DialogEditPriorityFactor/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Method_New.def
new file mode 100644
index 0000000..a0e37ff
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Method_New.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method New (
+  MacroPlan owner,
+  String businessType
+) id:Method_DialogEditPriorityFactor_New
+{
+  #keys: '[414382.0.593002251]'
+  Body:
+  [*
+    data := owner.PriorityFactor(relshadow);
+    data.BusinessType(businessType);
+    
+    DataHolderEditPriorityFactor.Data(&data);
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Response_pnlActions_btnOk_OnClick.def
index ba900bc..8d24e23 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactor/Response_pnlActions_btnOk_OnClick.def
@@ -7,10 +7,17 @@
   Precondition:
   [*
     feedback := Translations::FilllingCapacity_ValidateInput();
-    
     checkValue := not Coefficient.Text() = ''
     
-    return checkValue;
+    if(not checkValue )
+    {
+      feedback := Translations::PriorityFactor_CheckNameValid();
+      editData := DataHolderEditPriorityFactor.Data();
+      checkValue := not PriorityFactor::CheckNameValid( MacroPlan,editData.BusinessType(),[Real]Coefficient.Text(),PriorityFactorName.Text(),Desc.Text());
+    
+    }
+    
+    return checkValue
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Component_pnlContent.def
index 1a52538..8f09095 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Component_pnlContent.def
@@ -36,6 +36,7 @@
         DataBinding: 'DataHolderEditPriorityFactorDetails.Data.RangeMax'
         Label: '鏈�澶у��'
         Taborder: 4
+        Visible: false
       ]
     }
     Component RangeMin
@@ -46,7 +47,8 @@
       [
         DataBinding: 'DataHolderEditPriorityFactorDetails.Data.RangeMin'
         Label: '鏈�灏忓��'
-        Taborder: 5
+        ReadOnly: true
+        Taborder: 6
       ]
     }
     Component GradeDesc
@@ -59,7 +61,7 @@
         FixedSize: false
         Label: '鎻忚堪'
         SizeRatio: 3
-        Taborder: 6
+        Taborder: 8
       ]
     }
     Component PriorityFactorName
@@ -84,6 +86,27 @@
         Taborder: 1
       ]
     }
+    Component RangeMaxTest
+    {
+      #keys: '[414382.0.523235618]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        Label: '鏈�澶у��'
+        Taborder: 5
+        Visible: false
+      ]
+    }
+    Component RangeMinText
+    {
+      #keys: '[414382.0.523361009]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        Label: '鏈�灏忓��'
+        Taborder: 7
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlActions_btnOk_OnClick.def
index 14d65cd..09b6252 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlActions_btnOk_OnClick.def
@@ -12,7 +12,7 @@
     
     if( isRange.Checked() )
     {
-       checkValue := not RangeMax.Text() = '' and not RangeMin.Text() = '';
+       checkValue := not RangeMax.Text() = '' and not RangeMin.Text() = '' and RangeMax.Text() > RangeMin.Text();
     }
     
     return checkValue;
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnChanged.def
index 91202b9..06616ab 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnChanged.def
@@ -11,12 +11,18 @@
     [*
       if( this.Checked())
       {
-          RangeMax.ReadOnly(false);
-          RangeMin.ReadOnly(false) 
+          RangeMax.Visible(true);
+          RangeMin.Visible(true);
+          RangeMaxTest.Visible(false); 
+          RangeMinText.Visible(false);
       }
       else{
-          RangeMax.ReadOnly(true);
-          RangeMin.ReadOnly(true) 
+          RangeMax.Visible(false);
+          RangeMin.Visible(false);
+          RangeMaxTest.Visible(true) 
+          RangeMaxTest.Text([String]DataHolderEditPriorityFactorDetails.Data().RangeMax());
+          RangeMinText.Visible(true) 
+          RangeMinText.Text([String]DataHolderEditPriorityFactorDetails.Data().RangeMin());
       }
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnCreated.def
new file mode 100644
index 0000000..ad0f874
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogEditPriorityFactorDetails/Response_pnlContent_isRange_OnCreated.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: pnlContent/isRange
+Response OnCreated () id:Response_pnlContent_isRange_OnCreated
+{
+  #keys: '[414382.0.523105450]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Checked())
+      {
+          RangeMax.Visible(true);
+          RangeMin.Visible(true);
+          RangeMaxTest.Visible(false); 
+          RangeMinText.Visible(false);
+      }
+      else{
+          RangeMax.Visible(false);
+          RangeMin.Visible(false);
+          RangeMaxTest.Visible(true) 
+          RangeMaxTest.Text([String]DataHolderEditPriorityFactorDetails.Data().RangeMax());
+          RangeMinText.Visible(true) 
+          RangeMinText.Text([String]DataHolderEditPriorityFactorDetails.Data().RangeMin());
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Component_pnlContent.def
index 63e6384..f2ee867 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Component_pnlContent.def
@@ -13,9 +13,10 @@
       [
         AllowEmpty: true
         DataBinding: 'DataHolderFillingCapacityOrder.Data.ProductID'
-        Label: 'ProductID'
-        Strings: 'productID'
+        Enabled: false
+        Label: '鍟嗗搧缂栫爜'
         Taborder: 0
+        Visible: false
       ]
     }
     Component dropDownStringListSalesSegmentName id:dropDownStringListSalesSegmentName_325
@@ -26,9 +27,10 @@
       [
         AllowEmpty: true
         DataBinding: 'DataHolderFillingCapacityOrder.Data.SalesSegmentName'
-        Label: 'SalesSegmentName'
-        Strings: 'SalesSagmentName'
+        Enabled: false
+        Label: '閿�鍞儴闂�'
         Taborder: 1
+        Visible: false
       ]
     }
     Component dropDownStringListStockPointID id:dropDownStringListStockPointID_801
@@ -39,9 +41,10 @@
       [
         AllowEmpty: true
         DataBinding: 'DataHolderFillingCapacityOrder.Data.StockingPointID'
-        Label: 'StockPointID'
-        Strings: 'StockPointID'
+        Enabled: false
+        Label: '搴撳瓨鐐�'
         Taborder: 2
+        Visible: false
       ]
     }
     Component dropDownStringListCustomer id:dropDownStringListCustomer_957
@@ -52,9 +55,10 @@
       [
         AllowEmpty: true
         DataBinding: 'DataHolderFillingCapacityOrder.Data.Customer'
-        Label: 'Customer'
-        Strings: 'Customer'
+        Enabled: false
+        Label: '瀹㈡埛'
         Taborder: 3
+        Visible: false
       ]
     }
     Component edtQuantity id:edtQuantity_995
@@ -64,9 +68,9 @@
       Properties:
       [
         DataBinding: 'DataHolderFillingCapacityOrder.Data.Quantity'
-        Label: 'Quantity'
+        Label: '鏁伴噺'
         Mask: 'REAL'
-        Taborder: 4
+        Taborder: 13
       ]
     }
     Component dropDownStringListUnitOfMeasureName id:dropDownStringListUnitOfMeasureName_750
@@ -77,9 +81,11 @@
       [
         AllowEmpty: true
         DataBinding: 'DataHolderFillingCapacityOrder.Data.UnitOfMeasureName'
-        Label: 'UnitOfMeasureName'
+        Enabled: false
+        Label: '鏁伴噺鍗曚綅'
         Strings: 'UnitName'
-        Taborder: 5
+        Taborder: 4
+        Visible: false
       ]
     }
     Component edtSalesAmount id:edtSalesAmount_608
@@ -89,9 +95,9 @@
       Properties:
       [
         DataBinding: 'DataHolderFillingCapacityOrder.Data.SalesAmount'
-        Label: 'SalesAmount'
+        Label: '閿�鍞'
         Mask: 'NUMBER'
-        Taborder: 6
+        Taborder: 14
       ]
     }
     Component dsDemandDate
@@ -101,8 +107,8 @@
       Properties:
       [
         DataBinding: 'DataHolderFillingCapacityOrder.Data.DemandDate'
-        Label: 'Demand Date'
-        Taborder: 8
+        Label: '闇�姹傛棩鏈�'
+        Taborder: 16
       ]
     }
     Component dsForecastDemandDate
@@ -112,10 +118,208 @@
       Properties:
       [
         DataBinding: 'DataHolderFillingCapacityOrder.Data.ForecastDemandDate'
-        Label: 'Forecast Demand Date'
+        Label: '棰勬湡闇�姹傛棩鏈�'
+        Taborder: 15
+      ]
+    }
+    Component ddlSalesSegment
+    {
+      #keys: '[414702.0.525040441]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'SalesSegment_MP'
+      Children:
+      [
+        Component deSalesSegment
+        {
+          #keys: '[414702.0.525040443]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[SalesSegment_MP]'
+            FixedFilter: 'object.Child(relsize)=0'
+            Source: 'ApplicationMacroPlanner.DataHolderSalesSegment'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '閿�鍞儴闂�'
+        Taborder: 5
+      ]
+    }
+    Component ddlProduct_MP
+    {
+      #keys: '[414702.0.525462899]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Product_MP'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[414702.0.525462901]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Product_MP]'
+            FixedFilter: 'not object.IsSystem()'
+            Source: 'ApplicationMacroPlanner.DataHolderProduct'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '浜у搧'
+        Taborder: 6
+      ]
+    }
+    Component ddlStockingPoint_MP
+    {
+      #keys: '[414702.0.525462922]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'StockingPoint_MP'
+      Children:
+      [
+        Component deContent345
+        {
+          #keys: '[414702.0.525462924]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[StockingPoint_MP]'
+            FixedFilter: 'not object.IsSystem()'
+            Source: 'ApplicationMacroPlanner.DataHolderStockingPoint'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '搴撳瓨鐐�'
         Taborder: 7
       ]
     }
+    Component ddlBusinessType
+    {
+      #keys: '[414702.0.525012300]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'BusinessType'
+      Children:
+      [
+        Component deContent989
+        {
+          #keys: '[414702.0.525012302]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'GlobalOTDTable'
+            Source: 'GlobalOTDTable'
+            Taborder: 0
+            Transformation: 'BusinessType'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'BusinessTypeName'
+        Label: '浜嬩笟閮�'
+        Taborder: 8
+      ]
+    }
+    Component ddlUnitOfMeasure_MP
+    {
+      #keys: '[414702.0.525669735]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'UnitOfMeasure_MP'
+      Children:
+      [
+        Component deContent703
+        {
+          #keys: '[414702.0.525669737]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'UnitOfMeasure_MP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '鍗曚綅'
+        Taborder: 9
+      ]
+    }
+    Component efCustomerName
+    {
+      #keys: '[414702.0.525734924]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderFillingCapacityOrder.Data.Customer'
+        Label: 'Customer name'
+        Taborder: 11
+      ]
+    }
+    Component efCustomID
+    {
+      #keys: '[414702.0.525734943]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        Label: 'Customer ID'
+        Taborder: 12
+      ]
+    }
+    Component ddslOrderType
+    {
+      #keys: '[414702.0.526239841]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        DataBinding: 'DataHolderFillingCapacityOrder.Data.OrderType'
+        Label: '璁㈠崟绫诲瀷'
+        Strings: '鍙嶇;鎺堟潈'
+        Taborder: 17
+      ]
+    }
+    Component ddlCurrency_MP
+    {
+      #keys: '[414502.0.395021898]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Currency_MP'
+      Children:
+      [
+        Component deContent593
+        {
+          #keys: '[414502.0.395021900]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'Currency_MP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '璐у竵'
+        Taborder: 10
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_ClickBtnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_ClickBtnOk.def
index c345b5c..446efca 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_ClickBtnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_ClickBtnOk.def
@@ -7,12 +7,12 @@
   [*
     // Disabled button to prevent the possibility of multiple firing
     
-    btnOk.Enabled(false,'');
+    //btnOk.Enabled(false,'');
     
     // OnOk
     this.ApplyChanges();
     
-    DataHolderFillingCapacityOrder.Data().Commit();
+    //DataHolderFillingCapacityOrder.Data().Commit();
     
     //if( not isnull( DataHolderForm.Data() ) )
     //{
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_Edit.def
index 2d5dc2d..f217f0d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_Edit.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_Edit.def
@@ -12,6 +12,21 @@
     
     DataHolderFillingCapacityOrder.Data( &data );
     
+    salesSegment_MP := select( MacroPlan, SalesSegment_MP, tempSSMP, tempSSMP.Name() = selection.SalesSegmentName() );
+    ddlSalesSegment.Data( salesSegment_MP );
+    
+    product_MP := select( MacroPlan, Product_MP, tempPMP, tempPMP.ID() = selection.ProductID() );
+    ddlProduct_MP.Data( product_MP );
+    
+    stockingPoint_MP := select( MacroPlan, StockingPoint_MP, tempSPMP, tempSPMP.ID() = selection.StockingPointID() );
+    ddlStockingPoint_MP.Data( stockingPoint_MP );
+    
+    businessType := select( GlobalOTDTable, BusinessType, tempBT, tempBT.BusinessTypeName() = selection.BusinessType() );
+    ddlBusinessType.Data( businessType );
+    
+    unitOfMeasure_MP := select( MacroPlan, UnitOfMeasure_MP, tempUOMMP, tempUOMMP.Name() = selection.UnitOfMeasureName() );
+    ddlUnitOfMeasure_MP.Data( unitOfMeasure_MP );
+    
     ApplicationMacroPlanner.ShowFormModal( this );
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_New.def
index 4170b61..658d008 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_New.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Method_New.def
@@ -8,10 +8,10 @@
   Body:
   [*
     
-    data := owner.FillingCapacityOrder(relshadow);
-    data.OrderType("鎻愭媺")
+    data := owner.FillingCapacityOrder( relshadow );
+    //data.OrderType("鎻愭媺")
     
-    DataHolderFillingCapacityOrder.Data(&data);
+    DataHolderFillingCapacityOrder.Data( &data );
     
     ApplicationMacroPlanner.ShowFormModal( this );
   *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Response_pnlActions_btnOk_OnClick.def
index 89f4bc2..bf61706 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCapacityOrder/Response_pnlActions_btnOk_OnClick.def
@@ -6,20 +6,54 @@
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
   [*
-    feedback := Translations::FilllingCapacity_ValidateInput();
-    
-    checkValue := not dropDownStringListProductID.Text() = '' and not dropDownStringListSalesSegmentName.Text() = ''
-                  and not dropDownStringListStockPointID.Text() = '' and not dropDownStringListCustomer.Text() = ''
-                  and not edtQuantity.Text() = '' and not dropDownStringListUnitOfMeasureName.Text() = ''
-                  and not edtSalesAmount.Text() = ''
-    
-    return checkValue;
+    //feedback := Translations::FilllingCapacity_ValidateInput();
+    //
+    //checkValue := not dropDownStringListProductID.Text() = '' and not dropDownStringListSalesSegmentName.Text() = ''
+    //              and not dropDownStringListStockPointID.Text() = '' and not dropDownStringListCustomer.Text() = ''
+    //              and not edtQuantity.Text() = '' and not dropDownStringListUnitOfMeasureName.Text() = ''
+    //              and not edtSalesAmount.Text() = ''
+    //
+    //return checkValue;
   *]
   QuillAction
   {
     Body:
     [*
-      Form.ClickBtnOk()
+      Form.ApplyChanges();
+      
+      data := guard( DataHolderFillingCapacityOrder.Data().WrappedInstance(), null( FillingCapacityOrder ) );;
+      if ( isnull( data ) ) {
+        MacroPlan.FillingCapacityOrder( relnew,
+                                        ID                 := OS::GenerateGUIDAsString(),
+                                        ProductID          := guard( ddlProduct_MP.Data().ID(), "null" ),
+                                        BusinessType       := guard( ddlBusinessType.Data().BusinessTypeName(), "null" ),
+                                        SalesSegmentName   := guard( ddlSalesSegment.Data().Name(), "null" ),
+                                        StockingPointID    := guard( ddlStockingPoint_MP.Data().ID(), "null" ),
+                                        Customer           := efCustomerName.Text(),
+                                        Quantity           := [Real]edtQuantity.Text(),
+                                        UnitOfMeasureName  := ddlUnitOfMeasure_MP.Data().Name(),
+                                        ForecastDemandDate := dsForecastDemandDate.Date(),
+                                        DemandDate         := dsDemandDate.Date(),
+                                        OrderType          := ddslOrderType.Text(),
+                                        SalesAmount        := [Number]edtSalesAmount.Text(),
+                                        CurrencyID         := ddlCurrency_MP.Data().ID()
+                                       );
+      } else {
+        data.ProductID( guard( ddlProduct_MP.Data().ID(), "null" ) );
+        data.BusinessType( guard( ddlBusinessType.Data().BusinessTypeName(), "null" ) );
+        data.SalesSegmentName( guard( ddlSalesSegment.Data().Name(), "null" ) );
+        data.StockingPointID( guard( ddlStockingPoint_MP.Data().ID(), "null" ) );
+        data.Customer( efCustomerName.Text() );
+        data.Quantity( [Real]edtQuantity.Text() );
+        data.UnitOfMeasureName( ddlUnitOfMeasure_MP.Data().Name() );
+        data.ForecastDemandDate( dsForecastDemandDate.Date() );
+        data.DemandDate( dsDemandDate.Date() );
+        data.OrderType( ddslOrderType.Text() );
+        data.SalesAmount( [Number]edtSalesAmount.Text() );
+        data.CurrencyID( ddlCurrency_MP.Data().ID() );
+      }
+      
+      Form.Close();
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCustomerAndForecast/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCustomerAndForecast/Component_pnlContent.def
index 488be7e..3c4dba9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCustomerAndForecast/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogFillingCustomerAndForecast/Component_pnlContent.def
@@ -12,7 +12,7 @@
       Properties:
       [
         DataBinding: 'DataHolderFilling.Data.VerNo'
-        Label: 'VerNo'
+        Label: '鐗堟湰鍙�'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogNewPriorityPolicy/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogNewPriorityPolicy/Method_Edit.def
new file mode 100644
index 0000000..1962e28
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogNewPriorityPolicy/Method_Edit.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  PriorityPolicy selection
+) id:Method_DialogNewPriorityPolicy_Edit
+{
+  #keys: '[414382.0.603040472]'
+  Body:
+  [*
+    data := shadow( selection );
+    
+    DataHolderNewPriorityPolicy.Data( &data);
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlActions.def
new file mode 100644
index 0000000..262d308
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[412960.0.278371059]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[412960.0.278371063]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[412960.0.278371065]'
+      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_DialogOrganCode/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlContent.def
new file mode 100644
index 0000000..459a754
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Component_pnlContent.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412960.0.278371057]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component editOrganCodeName
+    {
+      #keys: '[412960.0.280135212]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderOrganCode.Data.OrganCodeName'
+        Description: '缁勭粐缂栫爜鍚嶇О缂栬緫'
+        Label: '缁勭粐缂栫爜'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_ClickBtnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_ClickBtnOk.def
new file mode 100644
index 0000000..4e90d83
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_ClickBtnOk.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method ClickBtnOk () id:Method_DialogOrganCode_ClickBtnOk
+{
+  #keys: '[412960.0.279955432]'
+  Body:
+  [*
+    // Disabled button to prevent the possibility of multiple firing
+    
+    btnOk.Enabled(false,'');
+    
+    // OnOk
+    this.ApplyChanges();
+    
+    DataHolderOrganCode.Data().Commit();
+    
+    this.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_Edit.def
new file mode 100644
index 0000000..299bad9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_Edit.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  OrganCode selection
+) id:Method_DialogOrganCode_Edit
+{
+  #keys: '[412960.0.279955433]'
+  Body:
+  [*
+    // Edits assumption
+    data := shadow( selection );
+    
+    DataHolderOrganCode.Data( &data );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_New.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_New.def
new file mode 100644
index 0000000..b312c1c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Method_New.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method New (
+  BusinessType owner
+) id:Method_DialogOrganCode_New
+{
+  #keys: '[412960.0.279955435]'
+  Body:
+  [*
+    data := owner.OrganCode(relshadow);
+    DataHolderOrganCode.Data( &data);
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..fb27680
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/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: '[412960.0.278371069]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..3ac7bbe
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/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: '[412960.0.278371068]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ClickBtnOk()
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/_ROOT_Component_DialogOrganCode.def b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/_ROOT_Component_DialogOrganCode.def
new file mode 100644
index 0000000..c681a1b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogOrganCode/_ROOT_Component_DialogOrganCode.def
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogOrganCode
+{
+  #keys: '[412960.0.278371055]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DataHolderOrganCode
+    {
+      #keys: '[412960.0.279955517]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'shadow[OrganCode]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Description: '缁勭粐缂栫爜杈圭晫寮圭獥'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+    Title: '缁勭粐缂栫爜缂栬緫'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form234/Component_List174.def b/_Main/UI/MacroPlannerWebApp/Component_Form234/Component_List174.def
index 66db189..4b16da7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form234/Component_List174.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form234/Component_List174.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"OrderCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderDateTime","title":"OrderDateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderDateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderQty","title":"OrderQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastHitQty","title":"ForecastHitQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastNoHitQty","title":"ForecastNoHitQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastNoHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"Unit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerCode","title":"CustomerCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerCode"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"璁㈠崟缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderQty","title":"鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderDateTime","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderDateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastHitQty","title":"鏈夐娴�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastNoHitQty","title":"鏃犻娴�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastNoHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerCode","title":"瀹㈡埛ID","subtotals":"","tooltip":"","width":-1,"display":"hidden","editable":false,"attribute":"CustomerCode"}}]'
         ContextMenu: 'listContextMenu108'
         SortCriteria: 'OperateTime'
         Taborder: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListBusinessType.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListBusinessType.def
index b0713d9..c7e5490 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListBusinessType.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListBusinessType.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessTypeName","title":"BusinessTypeName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessTypeName"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessTypeName","title":"BusinessTypeName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessTypeName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayType","title":"DisplayType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DisplayType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ScenarioName","title":"ScenarioName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ScenarioName"}}]'
         ContextMenu: 'listContextMenuBusinessType655'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListOrganCode.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListOrganCode.def
new file mode 100644
index 0000000..055b426
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_ListOrganCode.def
@@ -0,0 +1,62 @@
+Quintiq file version 2.0
+Component ListOrganCode
+{
+  #keys: '[412960.0.278370451]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorOrganCode
+    {
+      #keys: '[412960.0.278370452]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'BusinessType'
+        Description: '缁勭粐缂栫爜'
+        ExtractionMode: 'Selected'
+        Source: 'ListBusinessType'
+        Taborder: 0
+        Transformation: 'OrganCode'
+      ]
+    }
+    #child: listActionBarPageOrganCode
+    Component DataSetLevelOrganCode
+    {
+      #keys: '[412960.0.278370457]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuBusinessType
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrganCodeName","title":"OrganCodeName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrganCodeName"}}]'
+        ContextMenu: 'listContextMenuBusinessType'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Description: '缁勭粐缂栫爜'
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListOrganCode_WebMenu_OnClick
+    {
+      #keys: '[412960.0.280046014]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[507.0.16811226]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_PanelBusinessType.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_PanelBusinessType.def
new file mode 100644
index 0000000..9e8ac81
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_PanelBusinessType.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelBusinessType
+{
+  #keys: '[412960.0.278370440]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListOrganCode
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listActionBarPageOrganCode.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listActionBarPageOrganCode.def
new file mode 100644
index 0000000..cc122e0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listActionBarPageOrganCode.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageOrganCode
+{
+  #keys: '[412960.0.278370454]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType.def
new file mode 100644
index 0000000..d8d6b3c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component listContextMenuBusinessType
+{
+  #keys: '[412960.0.278370459]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuEdit526
+    {
+      #keys: '[412960.0.278370780]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'PENCIL'
+        Taborder: 3
+        Title: 'Edit'
+      ]
+    }
+    Component MenuDelete267
+    {
+      #keys: '[412960.0.278370833]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 4
+        Title: 'Delete'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType655.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType655.def
index 30edf41..6d6b098 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType655.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Component_listContextMenuBusinessType655.def
@@ -38,6 +38,18 @@
         Title: 'Delete'
       ]
     }
+    Component MenuNewOrganCode
+    {
+      #keys: '[412960.0.280077335]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Description: '鏂板缓缁勭粐缂栫爜'
+        Image: 'EARTH_ADD'
+        Taborder: 6
+        Title: 'Add Organ Code'
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNewOrganCode_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNewOrganCode_OnClick.def
new file mode 100644
index 0000000..fbc8746
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListBusinessType_MenuNewOrganCode_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListBusinessType
+Response OnClick (
+  BusinessType selection
+) id:Response_ListBusinessType_MenuNewOrganCode_OnClick
+{
+  #keys: '[412960.0.280105097]'
+  CanBindMultiple: false
+  DefinitionID => /ListBusinessType/Responsedef_ListBusinessType_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuNewOrganCode'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogOrganCode );
+      dlg.New( selection );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuDelete267_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuDelete267_OnClick.def
new file mode 100644
index 0000000..cb47729
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuDelete267_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListOrganCode
+Response OnClick (
+  OrganCode selection
+) id:Response_ListOrganCode_MenuDelete267_OnClick
+{
+  #keys: '[412960.0.280046423]'
+  CanBindMultiple: false
+  DefinitionID => /ListOrganCode/Responsedef_ListOrganCode_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuDelete267'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuEdit526_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuEdit526_OnClick.def
new file mode 100644
index 0000000..1cbf4e6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form367/Response_ListOrganCode_MenuEdit526_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListOrganCode
+Response OnClick (
+  OrganCode selection
+) id:Response_ListOrganCode_MenuEdit526_OnClick
+{
+  #keys: '[412960.0.280046170]'
+  CanBindMultiple: false
+  DefinitionID => /ListOrganCode/Responsedef_ListOrganCode_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuEdit526'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogOrganCode );
+      dlg.Edit(  selection );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form367/_ROOT_Component_FormBusinessType\043367.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form367/_ROOT_Component_FormBusinessType\043367.def"
index e23342a..d9814cb 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form367/_ROOT_Component_FormBusinessType\043367.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form367/_ROOT_Component_FormBusinessType\043367.def"
@@ -8,9 +8,10 @@
   Children:
   [
     #child: ListBusinessType
+    #child: PanelBusinessType
   ]
   Properties:
   [
-    Title: 'Business Type'
+    Title: '浜嬩笟閮�&缁勭粐缂栫爜缁存姢'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
index c07b922..27d0374 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_ListCapacityAllocationResults.def
@@ -1,26 +1,26 @@
 Quintiq file version 2.0
 Component ListCapacityAllocationResults
 {
-  #keys: '[414702.0.338762075]'
+  #keys: '[414702.0.390053833]'
   BaseType: 'WebList'
   Children:
   [
     Component DataExtractorCapacityAllocationResults
     {
-      #keys: '[414702.0.338762076]'
+      #keys: '[414702.0.390053834]'
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'GlobalOTDTable'
-        Source: 'GlobalOTDTable'
+        DataType: 'structured[CapacityAllocationResultsRuleConfiguration]'
+        Source: 'FormCapacityAllocationResultsRuleConfiguration.DataHolderSelectCapacityAllocationResultsRuleConfiguration'
         Taborder: 0
-        Transformation: 'CapacityAllocationResults'
+        Transformation: 'Elements.CapacityAllocationResults'
       ]
     }
     #child: listActionBarPageCapacityAllocationResults
     Component DataSetLevelCapacityAllocationResults
     {
-      #keys: '[414702.0.338762081]'
+      #keys: '[414702.0.390053839]'
       BaseType: 'WebDataSetLevel'
       Children:
       [
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VersionNumber","title":"VersionNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VersionNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMeasurementUnit","title":"PanelMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMaterialCode","title":"PanelMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NumberOfPanels","title":"NumberOfPanels","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NumberOfPanels"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMeasurementUnit","title":"PanelMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMaterialCode","title":"ModuleMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NumberOfModules","title":"NumberOfModules","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NumberOfModules"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMeasurementUnit","title":"ModuleMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMeasurementUnit","title":"ModuleMeasurementUnit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMeasurementUnit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Division","title":"Division","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Division"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"RequirementDate","title":"RequirementDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"RequirementDate"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Date","title":"Date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Date"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Description","title":"Description","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Description"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UserQuantity","title":"UserQuantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UserQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ManufacturedDate","title":"ManufacturedDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ManufacturedDate"}}]'
         ContextMenu: 'listContextMenuCapacityAllocationResults'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def
new file mode 100644
index 0000000..a916ec0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_PanelCapacityAllocationResults.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component PanelCapacityAllocationResults
+{
+  #keys: '[414702.0.391687385]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonGenerateCapacityAllocationResults id:ButtonGenerateCapacityAllocationResults_570
+    {
+      #keys: '[414702.0.391717497]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'PROCESS'
+        Label: '鐢熸垚鏁版嵁'
+        Taborder: 0
+      ]
+    }
+    Component Export id:Export_398
+    {
+      #keys: '[414702.0.392048461]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
index 5384f4a..81f7ddb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listActionBarPageCapacityAllocationResults.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 Component listActionBarPageCapacityAllocationResults
 {
-  #keys: '[414702.0.338762078]'
+  #keys: '[414702.0.390053836]'
   BaseType: 'listActionBarPage'
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
index 62d4067..b7e995a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Component_listContextMenuCapacityAllocationResults.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 Component listContextMenuCapacityAllocationResults
 {
-  #keys: '[414702.0.338762083]'
+  #keys: '[414702.0.390053841]'
   BaseType: 'listContextMenu'
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def
deleted file mode 100644
index 2d97d02..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_ButtonGenerateCapacityAllocationResults_OnClick.def
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonGenerateCapacityAllocationResults
-Response OnClick () id:Response_FormCapacityAllocationResults_ButtonGenerateCapacityAllocationResults_OnClick
-{
-  #keys: '[414702.0.340111671]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def"
new file mode 100644
index 0000000..6a4fd16
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_ButtonGenerateCapacityAllocationR\04339.def"
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelCapacityAllocationResults/ButtonGenerateCapacityAllocationResults_570
+Response OnClick () id:Response_FormCapacityAllocationResults_ButtonGenerateCapacityAllocationResults_OnClick_39
+{
+  #keys: '[414702.0.391717496]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      CapacityAllocationResults::CreateDate( GlobalOTDTable, MacroPlan, DataHolderActiveScenario.Data() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def
new file mode 100644
index 0000000..4428575
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/Response_PanelCapacityAllocationResults_Export_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelCapacityAllocationResults/Export_398
+Response OnClick () id:Response_PanelCapacityAllocationResults_Export_OnClick
+{
+  #keys: '[414702.0.391791234]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Application.Download( "浜ц兘鍒嗛厤缁撴灉.xlsx", CapacityAllocationResults::Export( GlobalOTDTable ).AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
index 432fdfa..983e0ed 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResults/_ROOT_Component_FormCapacityAllocationResults.def
@@ -8,17 +8,7 @@
   Children:
   [
     #child: ListCapacityAllocationResults
-    Component ButtonGenerateCapacityAllocationResults
-    {
-      #keys: '[414702.0.340677556]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'PROCESS'
-        Label: '鐢熸垚鏁版嵁'
-        Taborder: 0
-      ]
-    }
+    #child: PanelCapacityAllocationResults
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def
new file mode 100644
index 0000000..add7c86
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_ListCapacityAllocationResultsRuleConfiguration.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component ListCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '[414702.0.375255758]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorCapacityAllocationResultsRuleConfiguration
+    {
+      #keys: '[414702.0.375255759]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
+        Taborder: 0
+        Transformation: 'CapacityAllocationResultsRuleConfiguration'
+      ]
+    }
+    #child: listActionBarPageCapacityAllocationResultsRuleConfiguration
+    Component DataSetLevelCapacityAllocationResultsRuleConfiguration
+    {
+      #keys: '[414702.0.375255764]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuCapacityAllocationResultsRuleConfiguration
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PanelMaterialCode","title":"PanelMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PanelMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ModuleMaterialCode","title":"ModuleMaterialCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ModuleMaterialCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Division","title":"Division","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Division"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}}]'
+        ContextMenu: 'listContextMenuCapacityAllocationResultsRuleConfiguration'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListCapacityAllocationResultsRuleConfiguration_WebMenu_OnClick
+    {
+      #keys: '[414702.0.373845107]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[811.0.13515064]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def
new file mode 100644
index 0000000..367ca52
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_PanelImportAndExport.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component PanelImportAndExport
+{
+  #keys: '[414702.0.391512140]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component Import
+    {
+      #keys: '[414702.0.390081531]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '瀵煎叆'
+        Taborder: 0
+      ]
+    }
+    Component Export
+    {
+      #keys: '[414702.0.391512453]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listActionBarPageCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listActionBarPageCapacityAllocationResultsRuleConfiguration.def
new file mode 100644
index 0000000..cc72a32
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listActionBarPageCapacityAllocationResultsRuleConfiguration.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '[414702.0.375255761]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listContextMenuCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listContextMenuCapacityAllocationResultsRuleConfiguration.def
new file mode 100644
index 0000000..597ad1b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Component_listContextMenuCapacityAllocationResultsRuleConfiguration.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component listContextMenuCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '[414702.0.375255766]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuNew
+    {
+      #keys: '[414702.0.373851234]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'BEAR'
+        Taborder: 3
+        Title: '鍒涘缓瑙勫垯'
+      ]
+    }
+    Component MenuEdit
+    {
+      #keys: '[414702.0.376312130]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        BindOnDoubleClick: true
+        Image: 'MESSAGE_EDIT'
+        Taborder: 4
+        Title: '缂栬緫'
+      ]
+    }
+    Component MenuDelete
+    {
+      #keys: '[414702.0.382537902]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 5
+        Title: '鍒犻櫎'
+      ]
+    }
+    Component MenuSelectAll
+    {
+      #keys: '[414702.0.382602953]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DOCUMENT_SELECTION'
+        Shortcut: 'Ctrl+A'
+        Taborder: 6
+        Title: '鍏ㄩ��'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def
new file mode 100644
index 0000000..1c99357
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataCh.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: DataHolderSelectCapacityAllocationResultsRuleConfiguration
+Response OnDataChanged () id:Response_FormCapacityAllocationResultsRuleConfiguration_DataHolderSelectCapacityAllocationResultsRuleConfiguration_OnDataChanged
+{
+  #keys: '[414702.0.391379706]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      traverse ( this.Data(), Elements, e ) {
+        info( "闈㈡澘鐗╂枡ID锛�", e.PanelMaterialCode() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuDelete_OnClick.def
new file mode 100644
index 0000000..ecf8b8c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuDelete_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListCapacityAllocationResultsRuleConfiguration
+Response OnClick (
+  CapacityAllocationResultsRuleConfiguration selection
+) id:Response_ListCapacityAllocationResultsRuleConfiguration_MenuDelete_OnClick
+{
+  #keys: '[414702.0.381071285]'
+  DefinitionID => /ListCapacityAllocationResultsRuleConfiguration/Responsedef_ListCapacityAllocationResultsRuleConfiguration_WebMenu_OnClick
+  Initiator: 'MenuDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuEdit_OnClick.def
new file mode 100644
index 0000000..01a7ffa
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListCapacityAllocationResultsRuleConfiguration
+Response OnClick (
+  CapacityAllocationResultsRuleConfiguration selection
+) id:Response_ListCapacityAllocationResultsRuleConfiguration_MenuEdit_OnClick
+{
+  #keys: '[414702.0.376349145]'
+  CanBindMultiple: false
+  DefinitionID => /ListCapacityAllocationResultsRuleConfiguration/Responsedef_ListCapacityAllocationResultsRuleConfiguration_WebMenu_OnClick
+  Initiator: 'MenuEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditCapacityAllocationResultsRuleConfiguration );
+      
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuNew_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuNew_OnClick.def
new file mode 100644
index 0000000..76e0cd1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuNew_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListCapacityAllocationResultsRuleConfiguration
+Response OnClick () id:Response_ListCapacityAllocationResultsRuleConfiguration_MenuNew_OnClick
+{
+  #keys: '[414702.0.375256192]'
+  CanBindMultiple: false
+  DefinitionID => /ListCapacityAllocationResultsRuleConfiguration/Responsedef_ListCapacityAllocationResultsRuleConfiguration_WebMenu_OnClick
+  Initiator: 'MenuNew'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditCapacityAllocationResultsRuleConfiguration );
+      
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuSelectAll_OnClic.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuSelectAll_OnClic.def
new file mode 100644
index 0000000..720300e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_ListCapacityAllocationResultsRuleConfiguration_MenuSelectAll_OnClic.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListCapacityAllocationResultsRuleConfiguration
+Response OnClick () id:Response_ListCapacityAllocationResultsRuleConfiguration_MenuSelectAll_OnClick
+{
+  #keys: '[414702.0.381011855]'
+  CanBindMultiple: false
+  DefinitionID => /ListCapacityAllocationResultsRuleConfiguration/Responsedef_ListCapacityAllocationResultsRuleConfiguration_WebMenu_OnClick
+  Initiator: 'MenuSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def
new file mode 100644
index 0000000..602baba
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Export_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelImportAndExport/Export
+Response OnClick () id:Response_PanelImportAndExport_Export_OnClick
+{
+  #keys: '[414702.0.391658465]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Application.Download( "浜ц兘鍒嗛厤缁撴灉瑙勫垯.xlsx", CapacityAllocationResultsRuleConfiguration::Export( GlobalOTDTable ).AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def
new file mode 100644
index 0000000..3e90d91
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/Response_PanelImportAndExport_Import_OnClick.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: PanelImportAndExport/Import
+Response OnClick () id:Response_PanelImportAndExport_Import_OnClick
+{
+  #keys: '[414702.0.391899822]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+          CapacityAllocationResultsRuleConfiguration::Import( GlobalOTDTable, base64String );
+          
+          WebMessageBox::Success( "涓婁紶鎴愬姛", true );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation(), true );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def
new file mode 100644
index 0000000..436ef69
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAllocationResultsRuleConfiguration/_ROOT_Component_FormCapacityAllocationResultsRuleConfiguration.def
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormCapacityAllocationResultsRuleConfiguration
+{
+  #keys: '[414702.0.373844315]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListCapacityAllocationResultsRuleConfiguration
+    Component DataHolderSelectCapacityAllocationResultsRuleConfiguration
+    {
+      #keys: '[414702.0.390054479]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[CapacityAllocationResultsRuleConfiguration]*'
+      Children:
+      [
+        Component DataExtractorSelectCapacityAllocationResultsRuleConfiguration
+        {
+          #keys: '[414702.0.391186862]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'CapacityAllocationResultsRuleConfiguration'
+            ExtractionMode: 'Selected'
+            Source: 'ListCapacityAllocationResultsRuleConfiguration'
+            Taborder: 0
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    #child: PanelImportAndExport
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CHECKS'
+    Title: '浜ц兘鍒嗛厤缁撴灉鎶ヨ〃-瑙勫垯缁存姢'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
index 1e5e82c..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: 0
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
new file mode 100644
index 0000000..4f195d5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: ButtonExportDetail
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportDetail_OnClick
+{
+  #keys: '[414384.0.887310502]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MPSync );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      //Application.Download( "骞村害浜ч攢棰勭畻璇︽儏.xlsx", MPSync.CapacityAndSaleBudgeExport().AsBinaryData() );
+      
+      base64 := MappingCapacityAndSaleBudge::Export( MPSync );
+      Application.Download( "骞村害浜ч攢棰勭畻璇︽儏.xlsx", base64 );
+    *]
+    GroupServerCalls: false
+  }
+}
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 2b3f638..9458d5d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_OnCreated.def
@@ -12,6 +12,7 @@
     [*
       MPSync::TestData( MPSync, MacroPlan );
       GlobalOTDTable.InitTestData();
+      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 168d51b..c2687d8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
@@ -8,6 +8,29 @@
   Children:
   [
     #child: ListCapacityAndSaleBudge
+    Component ButtonExportDetail
+    {
+      #keys: '[414384.0.887310503]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        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 ccb0ea2..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(), 
-                                                 CheckboxIsCapacity.Checked(),
-                                                 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_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
index 3684ed8..237e0c6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
@@ -53,16 +53,6 @@
         Visible: false
       ]
     }
-    Component CheckboxIsCapacity
-    {
-      #keys: '[414384.0.857770765]'
-      BaseType: 'WebCheckbox'
-      Properties:
-      [
-        Label: '浜ц兘'
-        Taborder: 5
-      ]
-    }
     Component DropDownTimeGroup
     {
       #keys: '[414384.0.857771238]'
@@ -87,6 +77,18 @@
         Taborder: 0
       ]
     }
+    Component DropDownSaleOrCapacity
+    {
+      #keys: '[414384.0.886240556]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        InitialValue: '閿�鍞'
+        Label: '閿�鍞/浜ц兘'
+        Strings: '閿�鍞;浜ц兘'
+        Taborder: 5
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
index db394b0..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'
           ]
@@ -93,6 +93,6 @@
     ContextMenu: 'matrixeditorContextMenuCapacityAndSaleBudgeCompare'
     Editable: false
     Rows: 'MatrixEditorRowsCapacityAndSaleBudgeCompare'
-    Taborder: 1
+    Taborder: 2
   ]
 }
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
new file mode 100644
index 0000000..a01173d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ButtonExportCompare
+Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonExportCompare_OnClick
+{
+  #keys: '[414384.0.881345276]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      tableBinaryData := GlobalOTDTable.CapacityAndSaleBudgeCompareExport().AsBinaryData();
+      Application.Download( "骞村害浜ч攢棰勭畻瀵规瘮.xlsx", tableBinaryData );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
index 9602b8e..d44643f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
@@ -18,6 +18,17 @@
         Taborder: 0
       ]
     }
+    Component ButtonExportCompare
+    {
+      #keys: '[414384.0.881345277]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
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
new file mode 100644
index 0000000..54be6e2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_ListSalesDemands.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component ListSalesDemands #extension
+{
+  Children:
+  [
+    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_PanelAllSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def
new file mode 100644
index 0000000..b6550d1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelAllSalesDemands.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component PanelAllSalesDemands #extension
+{
+  Children:
+  [
+    #child: ListSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def
new file mode 100644
index 0000000..14acdde
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/Component_PanelSalesDemands.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component PanelSalesDemands #extension
+{
+  Children:
+  [
+    #child: PanelAllSalesDemands
+  ]
+}
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_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def
new file mode 100644
index 0000000..040c94f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders/_ROOT_Component_FormCustomerOrders.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: LibMacroPlannerWebUI
+OrphanComponent FormCustomerOrders #extension
+{
+  Children:
+  [
+    #child: PanelSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def
new file mode 100644
index 0000000..b0cbc0a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSDIP.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component ListSDIP
+{
+  #keys: '[134266.1.1970512356]'
+  BaseType: 'ListSDIP'
+  IsDerived: true
+  Children:
+  [
+    Component DataSetLevelSDIP
+    {
+      #keys: '[134266.1.1970512358]'
+      BaseType: 'DataSetLevelSDIP'
+      IsDerived: true
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsRestricted","title":"ImgIsRestricted","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsRestricted"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MasterSalesDemand.UnitOfMeasureName","title":"UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MasterSalesDemand.UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"QuantityInSalesDemandUOM","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"QuantityInSalesDemandUOM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantityInSalesDemandUOM","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantityInSalesDemandUOM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"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)"}},{"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)"}}]}}]'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def
new file mode 100644
index 0000000..0abeb62
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_ListSalesDemands.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+Component ListSalesDemands
+{
+  #keys: '[134266.1.1970507083]'
+  BaseType: 'ListSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    Component DataExtractorSalesDemands
+    {
+      #keys: '[134266.1.1970507084]'
+      BaseType: 'DataExtractorSalesDemands'
+      IsDerived: true
+      Properties:
+      [
+        Transformation: 'Elements.astype(CustomerOrder)'
+      ]
+    }
+    Component DataSetLevelSalesDemands
+    {
+      #keys: '[134266.1.1970507085]'
+      BaseType: 'DataSetLevelSalesDemands'
+      IsDerived: true
+      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"}}]'
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def
new file mode 100644
index 0000000..60db013
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelAllSalesDemands.def
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+Component PanelAllSalesDemands
+{
+  #keys: '[134266.1.1970497658]'
+  BaseType: 'PanelAllSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    #child: ListSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def
new file mode 100644
index 0000000..6ddf675
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSDIP.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelSDIP
+{
+  #keys: '[134266.1.1970511019]'
+  BaseType: 'PanelSDIP'
+  IsDerived: true
+  Children:
+  [
+    #child: ListSDIP
+  ]
+  Properties:
+  [
+    Title: 'Customer orders at planning level'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def
new file mode 100644
index 0000000..e90068d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Component_PanelSalesDemands.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+Component PanelSalesDemands
+{
+  #keys: '[134266.1.1970506995]'
+  BaseType: 'PanelSalesDemands'
+  IsDerived: true
+  Children:
+  [
+    #child: PanelSDIP
+    #child: PanelAllSalesDemands
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def
new file mode 100644
index 0000000..e6db580
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCopy_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuCopy_OnClick
+{
+  #keys: '[136682.1.799924425]'
+  BaseType: 'Response_ListSalesDemands_MenuCopy_OnClick'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuCopy'
+  QuillAction
+  {
+    Body:
+    [*
+      // Copy sales demand
+      data := selectset( selection, Elements.astype( CustomerOrder ), co, true, true );
+      CustomerOrder::Copy( data );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
new file mode 100644
index 0000000..85a98aa
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuCreate_OnClick_715
+{
+  #keys: '[136682.1.803262814]'
+  BaseType: 'Response_ListSalesDemands_MenuCreate_OnClick_715'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuCreate'
+  QuillAction
+  {
+    Body:
+    [*
+      //Create new sales demand
+      dlg := construct( DialogCreateEditCustomerOrder );
+      dlg.New();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def
new file mode 100644
index 0000000..edf9a16
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/Response_ListSalesDemands_MenuEdit_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListSalesDemands
+Response OnClick () inherited id:Response_ListSalesDemands_MenuEdit_OnClick
+{
+  #keys: '[136682.1.803135245]'
+  BaseType: 'Response_ListSalesDemands_MenuEdit_OnClick'
+  DefinitionID: 'Responsedef_ListSalesDemands_WebMenu_OnClick'
+  Initiator: 'MenuEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      //Edit sales demand
+      dlg := construct( DialogCreateEditCustomerOrder );
+      
+      data := selectset( selection, Elements.astype( CustomerOrder ), f, true, true );
+      dlg.Edit( data );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def
new file mode 100644
index 0000000..4e72e24
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCustomerOrders226/_ROOT_Component_FormCustomerOrders226.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormCustomerOrders226
+{
+  #keys: '[414724.0.179160850]'
+  Accessibility: 'Extensible'
+  BaseType: 'FormSalesDemands'
+  Children:
+  [
+    #child: PanelSalesDemands
+  ]
+  Properties:
+  [
+    Image: 'SALES_QUOTATION'
+    Title: 'Customer orders'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_ListFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_ListFillingCapacityOrder.def
index 7ff6bcd..a3801b2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_ListFillingCapacityOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_ListFillingCapacityOrder.def
@@ -37,7 +37,7 @@
   ]
   Properties:
   [
-    Taborder: 0
+    Taborder: 1
   ]
   ResponseDefinitions:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_PanelFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_PanelFillingCapacityOrder.def
new file mode 100644
index 0000000..57a3abe
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_PanelFillingCapacityOrder.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelFillingCapacityOrder
+{
+  #keys: '[414702.0.526129526]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonDeduct
+    {
+      #keys: '[414702.0.523642357]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EDITOR_ACCESSIBILITY_LOCAL'
+        Label: '鍐插噺'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_listContextMenuFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_listContextMenuFillingCapacityOrder.def
index 42e181a..7db97cc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_listContextMenuFillingCapacityOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Component_listContextMenuFillingCapacityOrder.def
@@ -22,6 +22,7 @@
       BaseType: 'WebMenu'
       Properties:
       [
+        BindOnDoubleClick: true
         Image: 'PENCIL'
         Taborder: 4
         Title: 'Edit'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Response_PanelFillingCapacityOrder_ButtonDeduct_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Response_PanelFillingCapacityOrder_ButtonDeduct_OnClick.def
new file mode 100644
index 0000000..12efac1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/Response_PanelFillingCapacityOrder_ButtonDeduct_OnClick.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelFillingCapacityOrder/ButtonDeduct
+Response OnClick () id:Response_PanelFillingCapacityOrder_ButtonDeduct_OnClick
+{
+  #keys: '[414502.0.395021805]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      //H_FunctionClass::SM_OrderHedgingEx( MacroPlan, ApplicationMacroPlanner.GetUserName() );
+      
+      FillingCapacityOrder::OrderOffset( MacroPlan );
+      
+      WebMessageBox::Success( "鍐插噺鎴愬姛锛侊紒锛�", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/_ROOT_Component_FormFillingCapacityOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/_ROOT_Component_FormFillingCapacityOrder.def
index 594ffdc..da0e3a5 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/_ROOT_Component_FormFillingCapacityOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityOrder/_ROOT_Component_FormFillingCapacityOrder.def
@@ -8,6 +8,7 @@
   Children:
   [
     #child: ListFillingCapacityOrder
+    #child: PanelFillingCapacityOrder
   ]
   Properties:
   [
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_MenuRefresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def
new file mode 100644
index 0000000..aba413a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListCustomerAndFillingCapacityOrder
+Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuRefresh_OnClick
+{
+  #keys: '[414382.0.415724061]'
+  CanBindMultiple: false
+  DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
+  Initiator: 'MenuRefresh'
+  QuillAction
+  {
+    Body:
+    [*
+      CustomerAndForecastOrder::RefreshData(  MacroPlan,GlobalOTDTable);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def
new file mode 100644
index 0000000..95443c6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListCustomerAndFillingCapacityOrder
+Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuSelectAll_OnClick
+{
+  #keys: '[414702.0.474548365]'
+  CanBindMultiple: false
+  DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
+  Initiator: 'MenuSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
deleted file mode 100644
index f292299..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingCapacityScheme/Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: ListCustomerAndFillingCapacityOrder
-Response OnClick () id:Response_ListCustomerAndFillingCapacityOrder_MenuTest_OnClick
-{
-  #keys: '[414382.0.415724061]'
-  CanBindMultiple: false
-  DefinitionID => /ListCustomerAndFillingCapacityOrder/Responsedef_ListCustomerAndFillingCapacityOrder_WebMenu_OnClick
-  GroupServerCalls: true
-  Initiator: 'MenuTest'
-  QuillAction
-  {
-    Body:
-    [*
-      CustomerAndForecastOrder::CreateTestData( MacroPlan);
-    *]
-  }
-}
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_FormFillingScheme/Response_ListFillingScheme_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_MenuDelete_OnClick.def
index 92f2bb9..f103e1b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_MenuDelete_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_MenuDelete_OnClick.def
@@ -21,7 +21,8 @@
   {
     Body:
     [*
-      selection.Delete()
+      FilllingCapacityOrderScheme::DeleteDetails( MacroPlan,selection.SchemeName());
+      selection.Delete();
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_OnSelectionChanged.def
new file mode 100644
index 0000000..7986675
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFillingScheme/Response_ListFillingScheme_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListFillingScheme
+Response OnSelectionChanged (
+  FilllingCapacityOrderScheme selection
+) id:Response_ListFillingScheme_OnSelectionChanged
+{
+  #keys: '[414382.0.532640606]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      schemeName := selection.SchemeName();
+      list := selectset( MacroPlan,FillingCapacityOrder,order,order.SchemeName() = selection.SchemeName());
+      DataHolderFillingScheme.Data(&list);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_ListHedgingOfLog.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_ListHedgingOfLog.def
index 6795199..c7d0922 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_ListHedgingOfLog.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_ListHedgingOfLog.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Serial","title":"Serial","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Serial"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"ForecastQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"ReverseQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"AuthorizeQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateQty","title":"OperateQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateType","title":"OperateType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Operator","title":"Operator","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Operator"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateTime","title":"OperateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateTime"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Serial","title":"搴忓彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Serial"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"鍙嶇鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"鎺堟潈鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateQty","title":"鍔ㄤ綔鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateType","title":"鍔ㄤ綔绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Operator","title":"鎿嶄綔浜�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Operator"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OperateTime","title":"鎿嶄綔鏃堕棿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OperateTime"}}]'
         ContextMenu: 'listContextMenuHedgingOfLog'
         Taborder: 2
       ]
@@ -36,6 +36,6 @@
   ]
   Properties:
   [
-    Taborder: 3
+    Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog.def
index ed7d295..b86fdcd 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog.def
@@ -27,15 +27,13 @@
       ]
       Properties:
       [
-        Taborder: 2
+        Taborder: 0
       ]
     }
     #child: ListHedgingOfLog
-    #child: PanelHedgingOfLog761
-    #child: PanelHedgingOfLog593
   ]
   Properties:
   [
-    Taborder: 0
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog221.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog221.def
new file mode 100644
index 0000000..655b205
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog221.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelHedgingOfLog221
+{
+  #keys: '[414724.0.149787927]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component LabelHedgingOfLog id:LabelHedgingOfLog_298
+    {
+      #keys: '[414724.0.149788086]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        FixedSize: false
+        Taborder: 0
+        Text: '鏃ュ織椤甸潰'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593\04393.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593\04393.def"
new file mode 100644
index 0000000..e38df06
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593\04393.def"
@@ -0,0 +1,38 @@
+Quintiq file version 2.0
+Component PanelHedgingOfLog593 id:PanelHedgingOfLog593_93
+{
+  #keys: '[414724.0.152989129]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component txt_QueryContent_FHO
+    {
+      #keys: '[414724.0.152989222]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        PlaceHolder: '妯$硦鎼滅储'
+        Taborder: 0
+      ]
+    }
+    Component btn_Query_FHO
+    {
+      #keys: '[414724.0.152920619]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        ButtonSize: 'compact'
+        Image: 'VIEW'
+        Label: '鏌ヨ'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593.def
deleted file mode 100644
index 58cf03b..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog593.def
+++ /dev/null
@@ -1,24 +0,0 @@
-Quintiq file version 2.0
-Component PanelHedgingOfLog593
-{
-  #keys: '[414724.0.32210907]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component lb_SKUCode
-    {
-      #keys: '[414724.0.32210935]'
-      BaseType: 'WebLabel'
-      Properties:
-      [
-        Taborder: 0
-        Text: 'SKU缂栫爜锛欰AAAAAAAA'
-      ]
-    }
-  ]
-  Properties:
-  [
-    FixedSize: true
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog761.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog761.def
deleted file mode 100644
index dded053..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Component_PanelHedgingOfLog761.def
+++ /dev/null
@@ -1,28 +0,0 @@
-Quintiq file version 2.0
-Component PanelHedgingOfLog761
-{
-  #keys: '[414724.0.26973497]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component LabelHedgingOfLog
-    {
-      #keys: '[414724.0.26973515]'
-      BaseType: 'WebLabel'
-      Properties:
-      [
-        FixedSize: false
-        Taborder: 0
-        Text: '鏃ュ織椤甸潰'
-      ]
-    }
-  ]
-  Properties:
-  [
-    FixedSize: true
-    Orientation: 'horizontal'
-    Padding: 'true'
-    Style: 'content'
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Response_PanelHedgingOfLog593_93_btn_Query_FHO_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Response_PanelHedgingOfLog593_93_btn_Query_FHO_OnClick.def
new file mode 100644
index 0000000..4bc548f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/Response_PanelHedgingOfLog593_93_btn_Query_FHO_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelHedgingOfLog593_93/btn_Query_FHO
+Response OnClick () id:Response_PanelHedgingOfLog593_93_btn_Query_FHO_OnClick
+{
+  #keys: '[414724.0.152920798]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      DataExtractorHedgingOfLog.FixedFilter(  "object.SKU().LikeUserLocale( " + txt_QueryContent_FHO.Text().AsQUILL() + " )" 
+                                               + " or " + "object.OperateType().LikeUserLocale( " + txt_QueryContent_FHO.Text().AsQUILL() + " )" 
+                                               + " or " + "object.Operator().LikeUserLocale( " + txt_QueryContent_FHO.Text().AsQUILL() + " )" 
+                                           );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/_ROOT_Component_FormHedgingOfLog.def b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/_ROOT_Component_FormHedgingOfLog.def
index 1e88a95..f7142b9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/_ROOT_Component_FormHedgingOfLog.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormHedgingOfLog/_ROOT_Component_FormHedgingOfLog.def
@@ -8,16 +8,8 @@
   Children:
   [
     #child: PanelHedgingOfLog
-    Component lb_ForecastQty
-    {
-      #keys: '[414724.0.31031550]'
-      BaseType: 'WebLabel'
-      Properties:
-      [
-        Taborder: 1
-        Text: '鍘熸潗鏂欑殑棰勬祴鏁伴噺锛�0'
-      ]
-    }
+    #child: PanelHedgingOfLog221
+    #child: PanelHedgingOfLog593_93
   ]
   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..57d4c51
--- /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":"ImageExecutionStatus","title":"杩愯鐘舵��","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImageExecutionStatus"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ExecuteUser","title":"鎵ц鐢ㄦ埛","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ExecuteUser"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsSuccess","title":"鏄惁鎴愬姛","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsSuccess"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BrokerName","title":"Broker鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BrokerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ElementTotal","title":"鏁版嵁澶у皬","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ElementTotal"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorDateTime","title":"閿欒鏃堕棿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorDateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorMessage","title":"閿欒娑堟伅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorMessage"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ErrorNo","title":"閿欒鍙�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ErrorNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Name","title":"鏃ュ織鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SuccessDateTime","title":"鎴愬姛鏃堕棿","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_PanelInterfaceGlobal_BrokerExecuteLog\043981.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceGlobal_BrokerExecuteLog\043981.def"
new file mode 100644
index 0000000..5c28e5e
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceGlobal_BrokerExecuteLog\043981.def"
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelInterfaceGlobal_BrokerExecuteLog
+{
+  #keys: '[414702.0.459917264]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListInterfaceTest
+  ]
+  Properties:
+  [
+    Taborder: 5
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption1.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption1.def
new file mode 100644
index 0000000..da696e8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption1.def
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component PanelInterfaceOption1
+{
+  #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 CheckboxUnitOfMeasure_MP
+    {
+      #keys: '[414702.0.500042972]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'UnitOfMeasure_MP'
+        Taborder: 2
+      ]
+    }
+    Component CheckboxSalesSegment_MP
+    {
+      #keys: '[414702.0.498882706]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'SalesSegment_MP'
+        Taborder: 3
+      ]
+    }
+    Component CheckboxProduct_MP
+    {
+      #keys: '[414702.0.500281942]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Product_MP'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption2\043456.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption2\043456.def"
new file mode 100644
index 0000000..a089baa
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption2\043456.def"
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component PanelInterfaceOption2
+{
+  #keys: '[414702.0.500233382]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component CheckboxConversionFactor
+    {
+      #keys: '[414702.0.501770364]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'ConversionFactor'
+        Taborder: 0
+      ]
+    }
+    Component CheckboxOperation
+    {
+      #keys: '[414702.0.501791718]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Operation'
+        Taborder: 1
+      ]
+    }
+    Component CheckboxOperationBOM
+    {
+      #keys: '[414702.0.501742364]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'OperationBOM'
+        Taborder: 2
+      ]
+    }
+    Component CheckboxProductInLane
+    {
+      #keys: '[414702.0.501792106]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'ProductInLane'
+        Taborder: 3
+      ]
+    }
+    Component CheckboxAIPISPIP
+    {
+      #keys: '[414702.0.503110868]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'AIPISPIP'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption3.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption3.def
new file mode 100644
index 0000000..f48dbeb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption3.def
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component PanelInterfaceOption3
+{
+  #keys: '[414702.0.501742781]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component CheckboxInventorySupply
+    {
+      #keys: '[414702.0.503576372]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'InventorySupply'
+        Taborder: 0
+      ]
+    }
+    Component CheckboxStockingPointCost
+    {
+      #keys: '[414702.0.503748797]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'StockingPointCost'
+        Taborder: 1
+      ]
+    }
+    Component CheckboxOperationCost
+    {
+      #keys: '[414702.0.503158219]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'OperationCost'
+        Taborder: 2
+      ]
+    }
+    Component CheckboxDOI_DSI
+    {
+      #keys: '[414702.0.503158880]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'DOI_DSI'
+        Taborder: 3
+      ]
+    }
+    Component CheckboxCustomerGrade
+    {
+      #keys: '[414702.0.503159013]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'CustomerGrade'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 2
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption4.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption4.def
new file mode 100644
index 0000000..f708ac7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_PanelInterfaceOption4.def
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component PanelInterfaceOption4
+{
+  #keys: '[414702.0.504229568]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component CheckboxStockingPoint_MP
+    {
+      #keys: '[414702.0.501794917]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'StockingPoint_MP'
+        Taborder: 0
+      ]
+    }
+    Component CheckboxCurrency_MP
+    {
+      #keys: '[414702.0.504229987]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Currency_MP'
+        Taborder: 1
+      ]
+    }
+    Component CheckboxCurrencyRate_MP
+    {
+      #keys: '[414702.0.503787453]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'CurrencyRate_MP'
+        Taborder: 2
+      ]
+    }
+    Component CheckboxLane
+    {
+      #keys: '[414702.0.503787560]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'Lane'
+        Taborder: 3
+      ]
+    }
+    Component CheckboxLaneLeg
+    {
+      #keys: '[414702.0.503787710]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        Label: 'LaneLeg'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 3
+  ]
+}
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..b8719b3
--- /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: 4
+  ]
+}
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..c678ea7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Component_listContextMenuInterfaceTest.def
@@ -0,0 +1,47 @@
+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: '鏄剧ず鏁版嵁'
+      ]
+    }
+    Component MenuDelete
+    {
+      #keys: '[414702.0.495675965]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 4
+        Title: '鍒犻櫎'
+      ]
+    }
+    Component MenuSelectionAll
+    {
+      #keys: '[414702.0.494390825]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION'
+        Shortcut: 'Ctrl+A'
+        Taborder: 5
+        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..afeef73
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuCreateShowData_OnClick.def
@@ -0,0 +1,33 @@
+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'
+  Precondition:
+  [*
+    flag := selection.BrokerName() = "GlobalOTDTable_CustomOrder"
+    
+    if ( not flag ) {
+      feedback := "鏆備笉鏀寔锛侊紒锛�";
+    }
+      
+    return flag;
+  *]
+  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_ListInterfaceTest_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuDelete_OnClick.def
new file mode 100644
index 0000000..3f1219b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuDelete_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListInterfaceTest
+Response OnClick (
+  Global_BrokerExecuteLog selection
+) id:Response_ListInterfaceTest_MenuDelete_OnClick
+{
+  #keys: '[414702.0.494333825]'
+  DefinitionID => /ListInterfaceTest/Responsedef_ListInterfaceTest_WebMenu_OnClick
+  Initiator: 'MenuDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuSelectionAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuSelectionAll_OnClick.def
new file mode 100644
index 0000000..da04728
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_ListInterfaceTest_MenuSelectionAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListInterfaceTest
+Response OnClick () id:Response_ListInterfaceTest_MenuSelectionAll_OnClick
+{
+  #keys: '[414702.0.494351350]'
+  CanBindMultiple: false
+  DefinitionID => /ListInterfaceTest/Responsedef_ListInterfaceTest_WebMenu_OnClick
+  Initiator: 'MenuSelectionAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    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..6dfbdbe
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonPullInterfaceDataToIntermediateTable_OnCli.def
@@ -0,0 +1,42 @@
+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( ApplicationMacroPlanner.GetUserName(),
+                                                                    CheckboxCustomOrder.Checked(),
+                                                                    CheckboxForecast.Checked(),
+                                                                    CheckboxUnitOfMeasure_MP.Checked(),
+                                                                    CheckboxSalesSegment_MP.Checked(),
+                                                                    CheckboxProduct_MP.Checked(),
+                                                                    CheckboxConversionFactor.Checked(),
+                                                                    CheckboxOperation.Checked(),
+                                                                    CheckboxOperationBOM.Checked(),
+                                                                    CheckboxProductInLane.Checked(),
+                                                                    CheckboxAIPISPIP.Checked(),
+                                                                    CheckboxInventorySupply.Checked(),
+                                                                    CheckboxStockingPointCost.Checked(),
+                                                                    CheckboxOperationCost.Checked(),
+                                                                    CheckboxDOI_DSI.Checked(),
+                                                                    CheckboxCustomerGrade.Checked(),
+                                                                    CheckboxStockingPoint_MP.Checked(),
+                                                                    CheckboxCurrency_MP.Checked(),
+                                                                    CheckboxCurrencyRate_MP.Checked(),
+                                                                    CheckboxLane.Checked(),
+                                                                    CheckboxLaneLeg.Checked() );
+      
+      WebMessageBox::Information( "鏁版嵁寮�濮嬫媺鍙栦腑锛侊紙浠呴檺涓�浜烘搷浣滐級", 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..4596f3c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/Response_PanelInterfaceTest_ButtonSynchronizeDataToMacroPlan_OnClick.def
@@ -0,0 +1,26 @@
+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:
+    [*
+      GlobalOTDTable.SynchronizeDataToMacroPlan( MacroPlan, 
+                                                 ApplicationMacroPlanner.GetUserName(),
+                                                 CheckboxUnitOfMeasure_MP.Checked(),
+                                                 CheckboxCustomOrder.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..a50ad14
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceTest/_ROOT_Component_FormInterfaceTest.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormInterfaceTest
+{
+  #keys: '[414702.0.459670964]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelInterfaceOption1
+    #child: PanelInterfaceTest
+    #child: PanelInterfaceGlobal_BrokerExecuteLog
+    #child: PanelInterfaceOption2
+    #child: PanelInterfaceOption3
+    #child: PanelInterfaceOption4
+  ]
+  Properties:
+  [
+    Image: 'BACON'
+    Title: '鎺ュ彛娴嬭瘯'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Component_ListIssueWorkOrder.def b/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Component_ListIssueWorkOrder.def
index 23d2fcb..c3f47fb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Component_ListIssueWorkOrder.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Component_ListIssueWorkOrder.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductionWorkOrderNumber","title":"ProductionWorkOrderNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductionWorkOrderNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductModel","title":"ProductModel","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductModel"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialDescription","title":"MaterialDescription","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialDescription"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlannedQuantity","title":"PlannedQuantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PlannedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WorkOrderType","title":"WorkOrderType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WorkOrderType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WorkOrderStatus","title":"WorkOrderStatus","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WorkOrderStatus"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductionWorkOrderNumber","title":"ProductionWorkOrderNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductionWorkOrderNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductModel","title":"Product ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductModel"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialDescription","title":"MaterialDescription","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialDescription"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlannedQuantity","title":"PlannedQuantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PlannedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WorkOrderType","title":"WorkOrderType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WorkOrderType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WorkOrderStatus","title":"WorkOrderStatus","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WorkOrderStatus"}}]'
         ContextMenu: 'MenuIssueEdit'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Response_ListIssueWorkOrder_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Response_ListIssueWorkOrder_MenuEdit_OnClick.def
index f516650..d9366a0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Response_ListIssueWorkOrder_MenuEdit_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormIssueWorkOrder/Response_ListIssueWorkOrder_MenuEdit_OnClick.def
@@ -8,13 +8,23 @@
   CanBindMultiple: false
   DefinitionID => /ListIssueWorkOrder/Responsedef_ListIssueWorkOrder_WebMenu_OnClick
   Initiator: 'MenuEdit'
+  Precondition:
+  [*
+    flag := DataHolderCheckedMasterPlanReleaseWorkOrderTabulation.Data().Size() > 0;
+    
+    if ( not flag ) {
+     feedback := "鏈�夋嫨鏁版嵁";
+    }
+    
+    return flag;
+  *]
   QuillAction
   {
     Body:
     [*
       dlg := construct( DialogCreateEditIssueWorkOrder );
       
-      dlg.Edit( selection );
+      dlg.Edit( DataHolderCheckedMasterPlanReleaseWorkOrderTabulation.Data() );
     *]
     GroupServerCalls: false
   }
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_FormMaterialPurchase/Component_ListMaterialPurchase.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_ListMaterialPurchase.def
index a9fc454..2d1eebd 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_ListMaterialPurchase.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_ListMaterialPurchase.def
@@ -12,6 +12,7 @@
       Properties:
       [
         DataType: 'structured[H_MaterialPurchase]'
+        FixedFilter: 'object.Status()="鏈彂甯�"'
         Source: 'DataHolderMaterialPurchase'
         Taborder: 0
         Transformation: 'Elements'
@@ -28,7 +29,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductSubclassType","title":"ProductSubclassType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductSubclassType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Qty","title":"Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Qty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"Unit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCode","title":"OrgCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WarehouseCode","title":"WarehouseCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WarehouseCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandTime","title":"DemandTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandTime"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductSubclassType","title":"绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductSubclassType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Qty","title":"鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Qty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCode","title":"缁勭粐浠g爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WarehouseCode","title":"浠撳簱浠g爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WarehouseCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandTime","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandTime"}}]'
         ContextMenu: 'listContextMenuMaterialPurchase'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase.def
index 228bfb8..5e51ffa 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase.def
@@ -11,15 +11,17 @@
       BaseType: 'WebLabel'
       Properties:
       [
-        NumberOfColumns: 50
+        NumberOfColumns: 30
         Taborder: 0
         Text: '寮�濮嬫椂闂达細2023-03-26 12:24:46'
+        Visible: false
       ]
     }
     #child: PanelMaterialPurchase613
   ]
   Properties:
   [
+    Alignment: 'trailing'
     FixedSize: true
     Orientation: 'horizontal'
     Taborder: 1
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase354.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase354.def
new file mode 100644
index 0000000..043567d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/Component_PanelMaterialPurchase354.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelMaterialPurchase354
+{
+  #keys: '[414724.0.149784759]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component lb_Title208
+    {
+      #keys: '[414724.0.149784840]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        Description: '鎺堟潈/鍙嶇鐗╂枡閲囪喘鏄庣粏閲婃斁'
+        Taborder: 0
+        Text: '鎺堟潈/鍙嶇鐗╂枡閲囪喘鏄庣粏閲婃斁'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/_ROOT_Component_FormMaterialPurchase.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/_ROOT_Component_FormMaterialPurchase.def
index 88640ec..a2af624 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/_ROOT_Component_FormMaterialPurchase.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialPurchase/_ROOT_Component_FormMaterialPurchase.def
@@ -7,17 +7,6 @@
   BaseType: 'WebForm'
   Children:
   [
-    Component lb_Title
-    {
-      #keys: '[414724.0.32644779]'
-      BaseType: 'WebLabel'
-      Properties:
-      [
-        Description: '鎺堟潈/鍙嶇鐗╂枡閲囪喘鏄庣粏閲婃斁'
-        Taborder: 0
-        Text: '鎺堟潈/鍙嶇鐗╂枡閲囪喘鏄庣粏閲婃斁'
-      ]
-    }
     #child: PanelMaterialPurchase
     Component DataHolderMaterialPurchase
     {
@@ -45,6 +34,7 @@
       ]
     }
     #child: ListMaterialPurchase
+    #child: PanelMaterialPurchase354
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
index 899294d..4aa7065 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_ListOrderLock\043844.def"
@@ -29,7 +29,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"OrderID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"SalesSegmentName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasureName","title":"UnitOfMeasureName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"EndDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsLocked","title":"IsLocked","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsLocked"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"First.AsPlanningBaseSalesDemandInPeriod.End","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"First.AsPlanningBaseSalesDemandInPeriod.End"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModify","title":"LastModify","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModify"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModifyTime","title":"LastModifyTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModifyTime"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderID","title":"OrderID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegmentName","title":"SalesSegmentName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SalesSegmentName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPointID","title":"StockingPointID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockingPointID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasureName","title":"UnitOfMeasureName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UnitOfMeasureName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsLocked","title":"IsLocked","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IsLocked"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"First.AsPlanningBaseSalesDemandInPeriod.End","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"First.AsPlanningBaseSalesDemandInPeriod.End"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModify","title":"LastModify","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModify"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LastModifyTime","title":"LastModifyTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LastModifyTime"}}]'
         ContextMenu: 'listContextMenuOrderLock'
         Taborder: 2
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
index 4ff0600..26dee9c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Component_PanelOrderLockHeader\043545.def"
@@ -87,7 +87,7 @@
         ButtonSize: 'compact'
         Description: '璁㈠崟閿佸畾'
         Label: '閿佸畾'
-        Taborder: 7
+        Taborder: 8
       ]
     }
     Component ButtonOrderLockHeaderUnlock
@@ -99,7 +99,7 @@
         ButtonSize: 'compact'
         Description: '璁㈠崟瑙i攣'
         Label: '瑙i攣'
-        Taborder: 8
+        Taborder: 9
       ]
     }
     Component ButtonOrderLockHeaderClear
@@ -114,6 +114,18 @@
         Taborder: 6
       ]
     }
+    Component ButtonOrderLockHeaderFresh
+    {
+      #keys: '[412960.0.259721852]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        ButtonSize: 'compact'
+        Description: '浠庢暟鎹簮鍒锋柊璁㈠崟鏁版嵁'
+        Label: '閲嶆柊鑾峰彇璁㈠崟'
+        Taborder: 7
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def
new file mode 100644
index 0000000..c4faffb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelOrderLockHeader_545/ButtonOrderLockHeaderFresh
+Response OnClick () id:Response_PanelOrderLockHeader_545_ButtonOrderLockHeaderFresh_OnClick
+{
+  #keys: '[412960.0.259721886]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      macroplan := MacroPlan;
+      global := GlobalOTDTable;
+      businesstypes := DataHolderOrderLockGlobal.Data().BusinessType().Tokenize( ',' );
+      organcodelist := selectvalues( global, BusinessType.OrganCode, organ, businesstypes.Find( organ.BusinessType().BusinessTypeName() ) <> -1, organ.OrganCodeName() );
+      CustomerOrder::DoSync( macroplan, businesstypes, global, organcodelist );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
index 5fa0f71..bef1aa1 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderCustomerOrder_O.def
@@ -19,11 +19,11 @@
       newfilter := "";
       findcount := 0;
       traverse( existfilterlist, Elements, filter ){
-        if( filter.FindString( "EndDate()", 0 ) >= 0 ){
+        if( filter.FindString( "StartDate()", 0 ) >= 0 ){
           if( newfilter = "" ){
-            newfilter := "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+            newfilter := "( object.StartDate() = " + this.Date().AsQUILL() + " )";
             }else{
-              newfilter := newfilter + " and " + "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+              newfilter := newfilter + " and " + "( object.StartDate() = " + this.Date().AsQUILL() + " )";
               }
           findcount := 1;
           }else{
@@ -37,9 +37,9 @@
       
       if( findcount = 0 ){
         if( newfilter = "" ){
-          newfilter := "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+          newfilter := "( object.StartDate() = " + this.Date().AsQUILL() + " )";
           }else{
-            newfilter := newfilter + " and " + "( object.EndDate() = " + this.Date().AsQUILL() + " )";
+            newfilter := newfilter + " and " + "( object.StartDate() = " + this.Date().AsQUILL() + " )";
             }
         }
       
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
index a5fda9c..4680617 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOrderLock/Response_PanelOrderLockHeader_545_DateSelectorOrderLockHeaderPlanDeliver_OnC.def
@@ -19,7 +19,7 @@
       newfilter := "";
       findcount := 0;
       traverse( existfilterlist, Elements, filter ){
-        if( filter.FindString( "End()", 0 ) >= 0 and filter.FindString( "EndDate()", 0 ) < 0 ){
+        if( filter.FindString( "End()", 0 ) >= 0 ){
           if( newfilter = "" ){
             newfilter := "( object.First().AsPlanningBaseSalesDemandInPeriod().End().Date() = " + this.Date().AsQUILL() + " )";
             }else{
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPanelMaterialTianHua/_ROOT_Component_FormPanelMaterialTianHua.def b/_Main/UI/MacroPlannerWebApp/Component_FormPanelMaterialTianHua/_ROOT_Component_FormPanelMaterialTianHua.def
index 31b93b5..08db4f3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPanelMaterialTianHua/_ROOT_Component_FormPanelMaterialTianHua.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPanelMaterialTianHua/_ROOT_Component_FormPanelMaterialTianHua.def
@@ -32,8 +32,8 @@
   ]
   Properties:
   [
-    Description: '澶╄姳'
+    Description: '澶╁崕'
     Image: 'CANDLE'
-    Title: '澶╄姳'
+    Title: '澶╁崕'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Component_listContextMenuPriorityFactor.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Component_listContextMenuPriorityFactor.def
index c6dd966..7d29277 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Component_listContextMenuPriorityFactor.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Component_listContextMenuPriorityFactor.def
@@ -5,26 +5,15 @@
   BaseType: 'listContextMenu'
   Children:
   [
-    Component MenuInitData
+    Component MenuInit
     {
-      #keys: '[414382.0.482890505]'
+      #keys: '[414382.0.600301960]'
       BaseType: 'WebMenu'
       Properties:
       [
-        Image: 'GEAR'
+        Image: 'GEAR_NEW'
         Taborder: 3
-        Title: 'Init Data'
-      ]
-    }
-    Component MenuEdit
-    {
-      #keys: '[414382.0.485622263]'
-      BaseType: 'WebMenu'
-      Properties:
-      [
-        Image: 'GEAR_EDIT'
-        Taborder: 4
-        Title: '缂栬緫'
+        Title: '鍒濆鍖�'
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def
new file mode 100644
index 0000000..0ba2149
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnCreated.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityFactorBusinessType
+Response OnCreated () id:Response_FormPriorityFactor_DataHolderPriorityFactorBusinessType_OnCreated
+{
+  #keys: '[414382.0.539235155]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      //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
new file mode 100644
index 0000000..c492ed8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorBusinessType_OnDataChanged.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityFactorBusinessType
+Response OnDataChanged () id:Response_FormPriorityFactor_DataHolderPriorityFactorBusinessType_OnDataChanged
+{
+  #keys: '[414382.0.539235291]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //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_DataHolderPriorityFactorSelect_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorSelect_OnDataChanged.def
new file mode 100644
index 0000000..e005ec6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DataHolderPriorityFactorSelect_OnDataChanged.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityFactorSelect
+Response OnDataChanged () id:Response_FormPriorityFactor_DataHolderPriorityFactorSelect_OnDataChanged
+{
+  #keys: '[414382.0.593010798]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //data := selectset( MacroPlan,PriorityFactor,p,true);
+      //this.Data(&data);
+    *]
+    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 338425b..267db8a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnCreated.def
@@ -2,15 +2,15 @@
 #parent: DropDownStringListBusinessType
 Response OnCreated () id:Response_FormPriorityFactor_DropDownStringListBusinessType_OnCreated
 {
-  #keys: '[414382.0.461201807]'
+  #keys: '[414382.0.539375553]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebComponent_OnCreated'
   QuillAction
   {
     Body:
     [*
-      strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
-      this.Strings(strings);
+      //list := PriorityFactor::GetDataByBusinessType( MacroPlan, DropDownStringListBusinessType.Text());
+      //DataHolderPriorityFactorSelect.Data(&list);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnSelectionChanged.def
index 1018d65..cbab0ed 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnSelectionChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_DropDownStringListBusinessType_OnSelectionChanged.def
@@ -9,8 +9,8 @@
   {
     Body:
     [*
-      list := PriorityFactor::GetDataByBusinessType( MacroPlan, DropDownStringListBusinessType.Text());
-      DataHolderPriorityFactorSelect.Data(&list);
+      //list := PriorityFactor::GetDataByBusinessType( MacroPlan, DropDownStringListBusinessType.Text());
+      //DataHolderPriorityFactorSelect.Data(&list);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuEdit_OnClick.def
deleted file mode 100644
index c054fc1..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuEdit_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: ListPriorityFactor
-Response OnClick (
-  PriorityFactor selection
-) id:Response_ListPriorityFactor_MenuEdit_OnClick
-{
-  #keys: '[414382.0.485894605]'
-  CanBindMultiple: false
-  DefinitionID => /ListPriorityFactor/Responsedef_ListPriorityFactor_WebMenu_OnClick
-  Initiator: 'MenuEdit'
-  QuillAction
-  {
-    Body:
-    [*
-      dlg := construct( DialogEditPriorityFactor );
-      dlg.Edit( selection);
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInitData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInitData_OnClick.def
deleted file mode 100644
index f165c1b..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInitData_OnClick.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: ListPriorityFactor
-Response OnClick () id:Response_ListPriorityFactor_MenuInitData_OnClick
-{
-  #keys: '[414382.0.482802120]'
-  CanBindMultiple: false
-  DefinitionID => /ListPriorityFactor/Responsedef_ListPriorityFactor_WebMenu_OnClick
-  Initiator: 'MenuInitData'
-  QuillAction
-  {
-    Body:
-    [*
-      PriorityFactorDetails::CreateTestData(  MacroPlan);
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInit_OnClick.def
new file mode 100644
index 0000000..83c36b1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_MenuInit_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListPriorityFactor
+Response OnClick () id:Response_ListPriorityFactor_MenuInit_OnClick
+{
+  #keys: '[414382.0.600302015]'
+  CanBindMultiple: false
+  DefinitionID => /ListPriorityFactor/Responsedef_ListPriorityFactor_WebMenu_OnClick
+  Initiator: 'MenuInit'
+  QuillAction
+  {
+    Body:
+    [*
+      // 鍒濆鍖栦紭鍏堢骇鍥犲瓙
+      PriorityFactor::InitData( MacroPlan);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnClick\043106.def"
similarity index 100%
rename from _Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnClick\043106.def"
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnSelectionChanged.def
new file mode 100644
index 0000000..235a322
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/Response_ListPriorityFactor_OnSelectionChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListPriorityFactor
+Response OnSelectionChanged (
+  PriorityFactor selection
+) id:Response_ListPriorityFactor_OnSelectionChanged
+{
+  #keys: '[414382.0.541275298]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      info( "selecion change" );
+      detaisls := PriorityFactorDetails::GetDataByPriorityFactor( selection, MacroPlan);
+      DataHolderPriorityFactorDetailsSelect.Data(&detaisls);
+    *]
+    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 f6e060e..7c5dda8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactor/_ROOT_Component_FormPriorityFactor.def
@@ -12,6 +12,21 @@
       #keys: '[414382.0.453562359]'
       BaseType: 'WebDataHolder'
       Databinding: 'structured[PriorityFactor]*'
+      Children:
+      [
+        Component DataExtractorPriorityFactorSelect
+        {
+          #keys: '[414382.0.608512605]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'PriorityFactor'
+          ]
+        }
+      ]
       Properties:
       [
         Taborder: 1
@@ -25,6 +40,7 @@
       [
         Label: '浜嬩笟閮�:'
         Taborder: 0
+        Visible: false
       ]
     }
     #child: ListPriorityFactor
@@ -38,5 +54,34 @@
         Taborder: 3
       ]
     }
+    Component DataHolderPriorityFactorBusinessType
+    {
+      #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
+      ]
+    }
+  ]
+  Properties:
+  [
+    Title: '浼樺厛绾у洜瀛�'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Component_listContextMenuPriorityFactorGrading.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Component_listContextMenuPriorityFactorGrading.def
index 39fe40c..33b6aa3 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Component_listContextMenuPriorityFactorGrading.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Component_listContextMenuPriorityFactorGrading.def
@@ -3,20 +3,6 @@
 {
   #keys: '[414382.0.479530873]'
   BaseType: 'listContextMenu'
-  Children:
-  [
-    Component MenuEdit
-    {
-      #keys: '[414382.0.478491125]'
-      BaseType: 'WebMenu'
-      Properties:
-      [
-        Image: 'GEAR_EDIT'
-        Taborder: 3
-        Title: '缂栬緫'
-      ]
-    }
-  ]
   Properties:
   [
     Taborder: 0
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Response_ListPriorityFactorGrading_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Response_ListPriorityFactorGrading_MenuEdit_OnClick.def
deleted file mode 100644
index b9822f6..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/Response_ListPriorityFactorGrading_MenuEdit_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: ListPriorityFactorGrading
-Response OnClick (
-  PriorityFactorDetails selction
-) id:Response_ListPriorityFactorGrading_MenuEdit_OnClick
-{
-  #keys: '[414382.0.479531766]'
-  CanBindMultiple: false
-  DefinitionID => /ListPriorityFactorGrading/Responsedef_ListPriorityFactorGrading_WebMenu_OnClick
-  Initiator: 'MenuEdit'
-  QuillAction
-  {
-    Body:
-    [*
-      dlg := construct( DialogEditPriorityFactorDetails);
-      dlg.Edit( selction);
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/_ROOT_Component_FormPriorityFactorGrading.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/_ROOT_Component_FormPriorityFactorGrading.def
index bef2ddb..b9ab15b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/_ROOT_Component_FormPriorityFactorGrading.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityFactorGrading/_ROOT_Component_FormPriorityFactorGrading.def
@@ -33,4 +33,8 @@
     }
     #child: ListPriorityFactorGrading
   ]
+  Properties:
+  [
+    Title: '浼樺厛绾у洜瀛愮粏鍒�'
+  ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_ListPriorityPolicy.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_ListPriorityPolicy.def
index b5d4a7b..33cfc53 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_ListPriorityPolicy.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_ListPriorityPolicy.def
@@ -12,7 +12,7 @@
       Properties:
       [
         DataType: 'structured[PriorityPolicy]'
-        Source: 'DataHolderPriorityPolicy'
+        Source: 'DataHolderPriorityPolicyShowList'
         Taborder: 0
         Transformation: 'Elements'
       ]
@@ -36,7 +36,7 @@
   ]
   Properties:
   [
-    Taborder: 2
+    Taborder: 3
   ]
   ResponseDefinitions:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyCoefficient\043902.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyCoefficient\043902.def"
index e2c6e2f..62b4cb9 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyCoefficient\043902.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyCoefficient\043902.def"
@@ -21,7 +21,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: '瀹屾垚'
+        Label: '淇濆瓨'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperation.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperation.def
index 1923a0f..297e8db 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperation.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperation.def
@@ -40,7 +40,7 @@
   ]
   Properties:
   [
-    Taborder: 3
+    Taborder: 4
     Title: '浼樺厛绾х瓥鐣ラ厤缃�'
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
index 9c91139..571a83c 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Component_PanelPriorityPolicyOperationButton\043713.def"
@@ -11,7 +11,7 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: '娣诲姞鍥犲瓙'
+        Label: '娣诲姞'
         Taborder: 1
       ]
     }
@@ -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_DataHolderPriorityPolicySelectBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicySelectBusinessType_OnCreated.def
deleted file mode 100644
index d3d9c4a..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicySelectBusinessType_OnCreated.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: DataHolderPriorityPolicySelectBusinessType
-Response OnCreated () id:Response_FormPriorityPolicy_DataHolderPriorityPolicySelectBusinessType_OnCreated
-{
-  #keys: '[414382.0.493813692]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebComponent_OnCreated'
-  QuillAction
-  {
-    Body:
-    [*
-      this.Data(PriorityPolicyBusinessType.Text());
-    *]
-    GroupServerCalls: false
-  }
-}
-
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnCreated.def
new file mode 100644
index 0000000..237513d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnCreated.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: DataHolderPriorityPolicy
+Response OnCreated () id:Response_FormPriorityPolicy_DataHolderPriorityPolicy_OnCreated
+{
+  #keys: '[414382.0.594152096]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      data := this.Data();
+      businessType := PriorityPolicyBusinessType.Text();
+      list := selectset( data,Elements,e,e.BusinessType() = businessType);
+      DataHolderPriorityPolicyShowList.Data(&list);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnDataChanged.def
index 89b9c11..3388972 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnDataChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_DataHolderPriorityPolicy_OnDataChanged.def
@@ -2,15 +2,17 @@
 #parent: DataHolderPriorityPolicy
 Response OnDataChanged () id:Response_FormPriorityPolicy_DataHolderPriorityPolicy_OnDataChanged
 {
-  #keys: '[414382.0.502145694]'
+  #keys: '[414382.0.595379026]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
   QuillAction
   {
     Body:
     [*
-      list := PriorityPolicy::GetDataByBusinessType( MacroPlan, PriorityPolicyBusinessType.Text());
-      this.Data(&list);
+      data := this.Data();
+      businessType := PriorityPolicyBusinessType.Text();
+      list := selectset( data,Elements,e,e.BusinessType() = businessType);
+      DataHolderPriorityPolicyShowList.Data(&list);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuDelete_OnClick.def
index 5517113..96d7545 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuDelete_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuDelete_OnClick.def
@@ -12,6 +12,7 @@
   {
     Body:
     [*
+      
       selection.Delete();
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuEdit_OnClick.def
index b956173..e5eb7a8 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuEdit_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_MenuEdit_OnClick.def
@@ -12,8 +12,21 @@
   {
     Body:
     [*
-      PanelPriorityPolicyOperation.Visible(true);
+      dlg := construct( DialogNewPriorityPolicy );
+      businessType := PriorityPolicyBusinessType.Text();
+      dlg.Edit( selection);
+      
       PanelPriorityPolicyOperationName.Text(selection.Name());
+      
+      businessType := PriorityPolicyBusinessType.Text();
+      str := PriorityFactor::GetNameList( MacroPlan, businessType);
+      DropDownStringList.Strings(str);
+      
+      LabelFormula.Text(selection.Formula());
+      LabelCalculateValue.Text(selection.CalculateValue());
+      
+      data := shadow( selection );
+      DataHolderEditPriorityPolicy.Data( &data );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_OnUserSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_OnUserSelectionChanged.def
index e16df3d..09c165d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_OnUserSelectionChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_ListPriorityPolicy_OnUserSelectionChanged.def
@@ -17,11 +17,11 @@
       str := PriorityFactor::GetNameList( MacroPlan, businessType);
       DropDownStringList.Strings(str);
       
+      LabelFormula.Text(selection.Formula());
+      LabelCalculateValue.Text(selection.CalculateValue());
+      
       data := shadow( selection );
       DataHolderEditPriorityPolicy.Data( &data );
-      
-      //coefficient := PriorityFactor::GetCoeffcientByName( MacroPlan,businessType,DropDownStringList.Text());
-      //LabelPriorityPolicyCoefficient.Text([String]coefficient);
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyCoefficient_902_ButtonCommit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyCoefficient_902_ButtonCommit_OnClick.def
index d645e29..ed5c423 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyCoefficient_902_ButtonCommit_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyCoefficient_902_ButtonCommit_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.506250033]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonAddPriorityPolicy_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonAddPriorityPolicy_OnClick.def
index 3b56ae5..466bd70 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonAddPriorityPolicy_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonAddPriorityPolicy_OnClick.def
@@ -5,6 +5,21 @@
   #keys: '[414382.0.502145449]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    
+    if( not check)
+    {
+        // 鍒ゆ柇璇ヤ紭鍏堢骇鍥犲瓙鏄惁宸茬粡琚�夋嫨
+        check := LabelFormula.Text() ~ DropDownStringList.Text();
+        feedback := "璇ヤ紭鍏堢骇鍥犲瓙宸茶閫夋嫨."
+    }
+    
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonDivide_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonDivide_OnClick.def
index 11b1352..ef82cb9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonDivide_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonDivide_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261587]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonLeftParenthesis_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonLeftParenthesis_OnClick.def
index f4eb5c3..ee84b06 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonLeftParenthesis_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonLeftParenthesis_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261667]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonMultiply_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonMultiply_OnClick.def
index 2f09779..32f03c0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonMultiply_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonMultiply_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261507]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRightParenthesis_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRightParenthesis_OnClick.def
index 292ba04..5cede1f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRightParenthesis_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRightParenthesis_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261748]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRollBack_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRollBack_OnClick.def
index f8952da..d54ce72 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRollBack_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonRollBack_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.506055261]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
@@ -13,7 +20,7 @@
       formulaText := PriorityPolicy::RollBackStr( MacroPlan,businessType,LabelFormula.Text());
       LabelFormula.Text(formulaText);
       
-      calculateTest := PriorityPolicy::RollBackStr( MacroPlan,businessType,LabelCalculateValue.Text());
+      calculateTest := PriorityPolicy::RollBackCalcStr( MacroPlan,businessType,LabelCalculateValue.Text());
       LabelCalculateValue.Text(calculateTest);
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonSubtract_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonSubtract_OnClick.def
index 77d6f0a..e9fd780 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonSubtract_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_ButtonSubtract_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261427]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_Buttonplus_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_Buttonplus_OnClick.def
index 926a7be..ab192c7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_Buttonplus_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_Buttonplus_OnClick.def
@@ -5,6 +5,13 @@
   #keys: '[414382.0.500261347]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    // 褰撳墠鏄惁鏈夐�変腑鐨勪紭鍏堢骇绛栫暐
+    feedback := "璇峰厛閫夋嫨涓�鏉′紭鍏堢骇绛栫暐鍚庡啀杩涜缂栬緫鍏紡";
+    check := PanelPriorityPolicyOperationName.Text() = "";
+    return not check;
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def
new file mode 100644
index 0000000..992b235
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelPriorityPolicyOperationButton/DropDownStringList
+Response OnCreated () id:Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnCreated
+{
+  #keys: '[414382.0.539822108]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      //strs := PriorityFactor::GetNameList( MacroPlan,DropDownStringList.Text());
+      //this.Strings(strs);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnSelectionCh.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnSelectionCh.def
index 9debaba..9fc4b38 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnSelectionCh.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PanelPriorityPolicyOperationButton_DropDownStringList_OnSelectionCh.def
@@ -9,11 +9,9 @@
   {
     Body:
     [*
-      info( "select changeed" );
       businessType := PriorityPolicyBusinessType.Text();
       coefficient := PriorityFactor::GetCoeffcientByName( MacroPlan,businessType,DropDownStringList.Text());
       LabelPriorityPolicyCoefficient.Text([String]coefficient);
-      info("coefficient := " + [String]coefficient  );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnCreated.def
index 4fd7821..ff9a42e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnCreated.def
@@ -9,8 +9,11 @@
   {
     Body:
     [*
-      strings := BusinessType::GetBusinessNameStr( GlobalOTDTable );
+      strings := BusinessType::GetScenarioNamesStr( GlobalOTDTable );
       this.Strings(strings);
+      
+      list := PriorityPolicy::GetDataByBusinessType( MacroPlan, PriorityPolicyBusinessType.Text());
+      DataHolderPriorityPolicyShowList.Data(&list);
     *]
     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..a5937da 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/Response_PriorityPolicyBusinessType_OnSelectionChanged.def
@@ -10,7 +10,13 @@
     Body:
     [*
       list := PriorityPolicy::GetDataByBusinessType( MacroPlan, PriorityPolicyBusinessType.Text());
-      DataHolderPriorityPolicy.Data(&list);
+      DataHolderPriorityPolicyShowList.Data(&list);
+      
+      PanelPriorityPolicyOperationName.Text("");
+      LabelFormula.Text("");
+      LabelCalculateValue.Text("");
+      data := shadow( null( PriorityPolicy ) );
+      DataHolderEditPriorityPolicy.Data( &data );
     *]
     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..12068c1 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityPolicy/_ROOT_Component_FormPriorityPolicy.def
@@ -22,9 +22,24 @@
       #keys: '[414382.0.487792124]'
       BaseType: 'WebDataHolder'
       Databinding: 'structured[PriorityPolicy]*'
+      Children:
+      [
+        Component DataExtractorPriorityPolicy216
+        {
+          #keys: '[414382.0.593061574]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'PriorityPolicy'
+          ]
+        }
+      ]
       Properties:
       [
-        Taborder: 1
+        Taborder: 2
       ]
     }
     #child: ListPriorityPolicy
@@ -36,7 +51,67 @@
       Databinding: 'shadow[PriorityPolicy]*'
       Properties:
       [
-        Taborder: 4
+        Taborder: 5
+      ]
+    }
+    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: 6
+      ]
+    }
+    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: 7
+      ]
+    }
+    Component DataHolderPriorityPolicyShowList
+    {
+      #keys: '[414382.0.593062135]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[PriorityPolicy]*'
+      Properties:
+      [
+        Taborder: 1
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityResult/_ROOT_Component_FormPriorityResult.def b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityResult/_ROOT_Component_FormPriorityResult.def
index 99f642d..aeac56e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormPriorityResult/_ROOT_Component_FormPriorityResult.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormPriorityResult/_ROOT_Component_FormPriorityResult.def
@@ -30,4 +30,8 @@
       ]
     }
   ]
+  Properties:
+  [
+    Title: '浼樺厛绾х粨鏋滈〉闈�'
+  ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_ListProduct\043844.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_ListProduct\043844.def"
new file mode 100644
index 0000000..92f21a9
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_ListProduct\043844.def"
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component ListProduct id:ListProduct_844 #extension
+{
+  Children:
+  [
+    Component DataSetLevelRootProduct #extension
+    {
+      Children:
+      [
+        #child: listContextMenuProduct_1
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_PanelList.def b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_PanelList.def
new file mode 100644
index 0000000..907c5e6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_PanelList.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component PanelList #extension
+{
+  Children:
+  [
+    #child: ListProduct_844
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_listContextMenuProduct\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_listContextMenuProduct\0431.def"
new file mode 100644
index 0000000..7a70a33
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Component_listContextMenuProduct\0431.def"
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+Component listContextMenuProduct id:listContextMenuProduct_1 #extension
+{
+  Children:
+  [
+    Component MenuMarkingPanelMaterial
+    {
+      #keys: '[414502.0.406261865]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'EARTH2'
+        Taborder: 11
+        Title: '鏍囪闈㈡澘鐗╂枡'
+      ]
+    }
+    Component Menu860
+    {
+      #keys: '[414502.0.406252405]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Separator: true
+        Taborder: 10
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Response_TIANMA_JITUAN_ListProduct_844_MenuMarkingPanelMaterial_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Response_TIANMA_JITUAN_ListProduct_844_MenuMarkingPanelMaterial_OnClick.def
new file mode 100644
index 0000000..33228b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/Response_TIANMA_JITUAN_ListProduct_844_MenuMarkingPanelMaterial_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListProduct_844
+Response OnClick (
+  Product_MP selection
+) id:Response_ListProduct_844_MenuMarkingPanelMaterial_OnClick
+{
+  #keys: '[414502.0.406201138]'
+  CanBindMultiple: false
+  DefinitionID => /ListProduct_844/Responsedef_ListProduct_844_WebMenu_OnClick
+  Initiator: 'MenuMarkingPanelMaterial'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.IsPanelMaterial( not selection.IsPanelMaterial() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProducts/_ROOT_Component_FormProducts.def b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/_ROOT_Component_FormProducts.def
new file mode 100644
index 0000000..c44a756
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProducts/_ROOT_Component_FormProducts.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: LibMacroPlannerWebUI
+OrphanComponent FormProducts #extension
+{
+  Children:
+  [
+    #child: PanelList
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord.def
index fbb5054..ab6d309 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Issuer","title":"Issuer","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Issuer"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IssuingDate","title":"IssuingDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IssuingDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FinishDate","title":"FinishDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FinishDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Status","title":"Status","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Status"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VCode","title":"VCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Serial","title":"Serial","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Serial"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"hidden","editable":false,"attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Serial","title":"搴忓彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Serial"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IssuingDate","title":"鍙戝竷鏃堕棿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IssuingDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FinishDate","title":"缁撴潫鏃堕棿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FinishDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Issuer","title":"鍙戝竷浜�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Issuer"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Status","title":"鐘舵��","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Status"}}]'
         ContextMenu: 'listContextMenuReleaseRecord'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord243.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord243.def
index 6ef25a7..4f4cedb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord243.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_ListReleaseRecord243.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"H_ReleaseRecord_ID","title":"H_ReleaseRecord_ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"H_ReleaseRecord_ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"H_HedgingRecord_ID","title":"H_HedgingRecord_ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"H_HedgingRecord_ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Qty","title":"Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Qty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Status","title":"Status","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Status"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IssuingDate","title":"IssuingDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IssuingDate"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"鐗╂枡缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductSubclassType","title":"绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductSubclassType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Qty","title":"鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Qty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCode","title":"缁勭粐浠g爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"WarehouseCode","title":"浠撳簱浠g爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"WarehouseCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandTime","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IssuingDate","title":"鍙戝竷鏃堕棿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"IssuingDate"}}]'
         ContextMenu: 'listContextMenuReleaseRecord690'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_PanelReleaseRecord423.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_PanelReleaseRecord423.def
new file mode 100644
index 0000000..6d2fc94
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Component_PanelReleaseRecord423.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelReleaseRecord423
+{
+  #keys: '[414724.0.149784904]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component LabelReleaseRecord id:LabelReleaseRecord_296
+    {
+      #keys: '[414724.0.149784974]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        NumberOfColumns: 20
+        Taborder: 0
+        Text: '鍙嶇/鎺堟潈鐗╂枡鍙戝竷鐗堟湰鏄庣粏'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_ListReleaseRecord_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_ListReleaseRecord_OnSelectionChanged.def
index f4cc29c..9e293a9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_ListReleaseRecord_OnSelectionChanged.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_ListReleaseRecord_OnSelectionChanged.def
@@ -11,7 +11,15 @@
   {
     Body:
     [*
-      DataExtractorReleaseRecord661.FixedFilter( "object.H_ReleaseRecord_ID() = " + selection.ID().AsQUILL());
+      // 鍙戝竷ID
+      H_ReleaseRecord_ID := "-1";
+      H_Status:="宸插彂甯�";
+      if( not isnull( selection))
+      {
+        H_ReleaseRecord_ID :=  selection.ID();
+      }
+      DataExtractorReleaseRecord661.FixedFilter( "object.H_ReleaseRecord_ID() = " + H_ReleaseRecord_ID.AsQUILL()
+                                                 + " and " + "object.Status() = " + H_Status.AsQUILL());
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_OnCreated.def
index 5fc1173..75b080a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/Response_OnCreated.def
@@ -5,12 +5,12 @@
   #keys: '[414724.0.37110847]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebComponent_OnCreated'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
       dtMonth.Date(Date::Today());
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/_ROOT_Component_FormReleaseRecord.def b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/_ROOT_Component_FormReleaseRecord.def
index 9a61137..675a452 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/_ROOT_Component_FormReleaseRecord.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormReleaseRecord/_ROOT_Component_FormReleaseRecord.def
@@ -7,20 +7,10 @@
   BaseType: 'WebForm'
   Children:
   [
-    Component LabelReleaseRecord
-    {
-      #keys: '[414724.0.36933216]'
-      BaseType: 'WebLabel'
-      Properties:
-      [
-        NumberOfColumns: 20
-        Taborder: 0
-        Text: '鍙嶇/鎺堟潈鐗╂枡鍙戝竷鐗堟湰鏄庣粏'
-      ]
-    }
     #child: PanelReleaseRecord
     #child: PanelReleaseRecord108
     #child: PanelReleaseRecord527
+    #child: PanelReleaseRecord423
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick\043545.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick\043545.def"
index 5140232..8e69dc4 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick\043545.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick\043545.def"
@@ -16,7 +16,7 @@
       dlg := construct( DialogCreateEditScenario );
       dlg.checkboxEnableSync().Visible( true );
       dlg.dropDownStringListGeneral().Visible( true );
-      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableBusinessTypes() );
+      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableScenarioNames( GlobalOTDTable ) );
       dlg.checkboxIsKeyProduct().Visible( true );
       dlg.checkboxCreatePurchaseSupplyProduct().Visible( true );
       dlg.NewScenario( ScenarioManager, selection, true );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick.def
index 126a965..4c3b7f0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenarioAndDoSync_OnClick.def
@@ -17,7 +17,7 @@
       dlg := construct( DialogCreateEditScenario );
       dlg.checkboxEnableSync().Visible( true );
       dlg.dropDownStringListGeneral().Visible( true );
-      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableBusinessTypes() );
+      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableScenarioNames( GlobalOTDTable ) );
       dlg.checkboxIsKeyProduct().Visible( true );
       dlg.checkboxCreatePurchaseSupplyProduct().Visible( true );
       parent := selection.Element( 0 ).Parent();
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick\043549.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick\043549.def"
index b9fdf28..607ae7d 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick\043549.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick\043549.def"
@@ -17,7 +17,7 @@
       dlg.checkboxEnableSync().Checked( false );
       dlg.checkboxEnableSync().Visible( false );
       dlg.dropDownStringListGeneral().Visible( false );
-      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableBusinessTypes() );
+      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableScenarioNames( GlobalOTDTable ) );
       dlg.checkboxIsKeyProduct().Visible( false );
       dlg.checkboxCreatePurchaseSupplyProduct().Visible( false );
       dlg.NewScenario( ScenarioManager, selection );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick.def
index 913510e..55945ed 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuCreateScenario_OnClick.def
@@ -18,7 +18,7 @@
       dlg.checkboxEnableSync().Checked( false );
       dlg.checkboxEnableSync().Visible( false );
       dlg.dropDownStringListGeneral().Visible( false );
-      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableBusinessTypes() );
+      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableScenarioNames( GlobalOTDTable ) );
       dlg.checkboxIsKeyProduct().Visible( false );
       dlg.checkboxCreatePurchaseSupplyProduct().Visible( false );
       parent := selection.Element( 0 ).Parent();
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuEdit_OnClick.def
index fd08942..9c2d77f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuEdit_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormScenarioManager/Response_ListScenario_MenuEdit_OnClick.def
@@ -18,7 +18,7 @@
       // Edit scenario
       dlg := construct( DialogCreateEditScenario );
       dlg.dropDownStringListGeneral().Visible( selection.EnableSync() );
-      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableBusinessTypes() );
+      dlg.dropDownStringListGeneral().Strings( ScenarioManager::AvailableScenarioNames( GlobalOTDTable ) );
       dlg.checkboxIsKeyProduct().Visible( selection.EnableSync() );
       dlg.checkboxCreatePurchaseSupplyProduct().Visible( selection.EnableSync() );
       
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_FrmAuthorizeAndCountersign_Material/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Material/Response_OnCreated.def
index a76472b..0b8df6f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Material/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Material/Response_OnCreated.def
@@ -17,22 +17,19 @@
       SelectItem := select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmMaterial" and Obj.ItemKey()="ListSelect");
       if(not isnull( SelectItem))
       {
-        if(SelectItem.Value().Length()>0)
+        if(SelectItem.ValueJsonString().Length()>0)
         {
-          StrValue := SelectItem.Value().Tokenize( ";");
-          lb_SUK_FAACM.Text(StrValue.Element( 0));
-          lb_MaterialCode_FAACM.Text(StrValue.Element( 1));
-          lb_Unit_FAACM.Text(StrValue.Element( 2));
+          JInfo := JSON::Parse( SelectItem.ValueJsonString());
+          lb_SUK_FAACM.Text(JInfo.Get( "ParentSKU").GetString());
+          lb_SKUName_FAACM.Text(JInfo.Get( "ParentSKUName").GetString());
+          lb_MaterialCode_FAACM.Text(JInfo.Get( "SKU").GetString());
+          lb_MaterialName.Text(JInfo.Get( "MaterialName").GetString());
+          lb_Unit_FAACM.Text(JInfo.Get( "Unit").GetString());
           lb_Operator_FAACM.Text(ApplicationMacroPlanner.GetUserName());
+          lb_MaterialType_FAACM.Text(JInfo.Get( "MaterialType").GetString());
+          txt_CustomID_FAACM.Text(JInfo.Get( "CustomCode").GetString());
+          txt_CustomName_FAACM.Text(JInfo.Get( "CustomName").GetString());
         }
-      }
-      // 鑾峰彇閫夋嫨鍚庣殑SKU
-      SelectItem := select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if(not isnull( SelectItem) and SelectItem.Value().Length()>0)
-      {
-        StrValue := SelectItem.Value().Tokenize( ";");
-        txt_CustomID_FAACM.Text(StrValue.Element( 2));
-        txt_CustomName_FAACM.Text(StrValue.Element( 3));
       }
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Order/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Order/Response_OnCreated.def
index 7c4d5f5..76d2c45 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Order/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmAuthorizeAndCountersign_Order/Response_OnCreated.def
@@ -23,18 +23,10 @@
           lb_SKUCode_FAAC.Text(SelForecast.Get( "SKU").GetString());
           lb_SKUName_FAAC.Text("浜у搧");
           lb_Util_FAAC.Text(SelForecast.Get( "Util").GetString());
+          lb_SKUName_FAAC.Text(SelForecast.Get( "SKUName").GetString());
           txt_CustomID_FAAC.Text(SelForecast.Get( "CustomCode").GetString());
           txt_CustomName_FAAC.Text(SelForecast.Get( "CustomName").GetString());
           lb_Operator_FAAC.Text(ApplicationMacroPlanner.GetUserName());
-          
-      //    StrValue := SelectItem.Value().Tokenize( ";");
-      //    lb_SKUCode_FAAC.Text(StrValue.Element( 0));
-      //    lb_SKUName_FAAC.Text("浜у搧");
-      //    lb_Operator_FAAC.Text("");
-      //    lb_Util_FAAC.Text(StrValue.Element( 1));
-      //    txt_CustomID_FAAC.Text(StrValue.Element( 2));
-      //    txt_CustomName_FAAC.Text(StrValue.Element( 3));
-      //    lb_Operator_FAAC.Text(ApplicationMacroPlanner.GetUserName());
         }
       }
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_List710.def b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_List710.def
index 975cea9..bd6d61d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_List710.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_List710.def
@@ -36,6 +36,6 @@
   ]
   Properties:
   [
-    Taborder: 1
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_Panel391.def b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_Panel391.def
new file mode 100644
index 0000000..c27e0ed
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Component_Panel391.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component Panel391
+{
+  #keys: '[414724.0.193860534]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component Button655
+    {
+      #keys: '[414724.0.193860558]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BULL'
+        Label: '濉骇鍐插噺'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Response_Panel391_Button655_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Response_Panel391_Button655_OnClick.def
new file mode 100644
index 0000000..821d8ed
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/Response_Panel391_Button655_OnClick.def
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: Panel391/Button655
+Response OnClick () id:Response_Panel391_Button655_OnClick
+{
+  #keys: '[414724.0.194975663]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan);
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      HResult := H_FunctionClass::SM_OrderHedgingEx( MacroPlan,"娴嬭瘯鐢ㄦ埛" );
+      Msg := HResult.Get( "Msg").GetString();
+      if( HResult.Get( "Status").GetBoolean())
+      {
+        if( Msg.Length()>0)
+        {
+          WebMessageBox::Information(Msg); 
+        }
+      }
+      else
+      {
+        if( Msg.Length()>0)
+        {
+          WebMessageBox::Warning(Msg);
+        }
+        else
+        {
+          WebMessageBox::Information("杩愯閿欒锛�"); 
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/_ROOT_Component_FrmErrorLogs.def b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/_ROOT_Component_FrmErrorLogs.def
index 23776ce..81eec9c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/_ROOT_Component_FrmErrorLogs.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmErrorLogs/_ROOT_Component_FrmErrorLogs.def
@@ -30,9 +30,10 @@
       ]
       Properties:
       [
-        Taborder: 0
+        Taborder: 1
       ]
     }
+    #child: Panel391
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_List832.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_List832.def
index f24ffbd..f4e6b0e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_List832.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_List832.def
@@ -11,7 +11,7 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'structured[Product_MP]'
+        DataType: 'structured[H_MaterialInfo]'
         Source: 'dh_FM_PruductMP'
         Taborder: 0
         Transformation: 'Elements'
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"TotalInventoryLevels","title":"TotalInventoryLevels","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"TotalInventoryLevels"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Level","title":"Level","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Level"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"IsProductCategory","title":"IsProductCategory","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"IsProductCategory"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"鐗╂枡缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialType","title":"鐗╂枡绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialName","title":"鐗╂枡鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NeedQty","title":"闇�姹傛暟閲�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NeedQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NeedDate","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NeedDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCode","title":"缁勭粐浠g爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockPoint","title":"搴撳瓨鐐�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockPoint"}}]'
         ContextMenu: 'listContextMenu892'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_Panel418.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_Panel418.def
index efb0178..a9de040 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_Panel418.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Component_Panel418.def
@@ -24,7 +24,7 @@
       [
         NumberOfColumns: 15
         PlaceHolder: '妯$硦鎼滅储'
-        Taborder: 1
+        Taborder: 2
       ]
     }
     Component btn_Query_FM
@@ -35,7 +35,7 @@
       [
         Image: 'VIEW'
         Label: '鏌ヨ'
-        Taborder: 2
+        Taborder: 3
       ]
     }
     Component btn_Add_FM
@@ -46,7 +46,7 @@
       [
         Image: 'ADD2'
         Label: '鏂板鍙嶇/鎺堟潈'
-        Taborder: 3
+        Taborder: 4
       ]
       ResponseDefinitions:
       [
@@ -66,6 +66,16 @@
         }
       ]
     }
+    Component ds_Month_FM
+    {
+      #keys: '[414724.0.148121614]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DateFormat: 'YMM'
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def
new file mode 100644
index 0000000..b2a673b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnDoubleClick.def
@@ -0,0 +1,79 @@
+Quintiq file version 2.0
+#parent: List832
+Response OnDoubleClick (
+  H_MaterialInfo selection
+) id:Response_List832_OnDoubleClick
+{
+  #keys: '[414724.0.160542461]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnDoubleClick'
+  QuillAction
+  {
+    Body:
+    [*
+      if( not isnull( selection))
+      {
+        // 棰勬祴璁㈠崟鍩烘湰淇℃伅
+        CustomCode:="";
+        CustomName:="";
+        SKUName:="";
+        SValueJsonString:="";
+        // 鑾峰彇瀹㈡埛鍚嶇О鍜屽鎴稩D
+        if(txtSaveForecastData_FM.Text().Length()>0)
+        {
+           jForecast := JSON::Parse( txtSaveForecastData_FM.Text());
+           CustomCode := jForecast.Get( "CustomCode").GetString();
+           CustomName := jForecast.Get( "CustomName").GetString();
+           SKUName := jForecast.Get( "SKUName").GetString();
+        }
+        
+        if(selection.MaterialType()="鍗婃垚鍝�")
+        {
+          ForecastID:="";
+          if( txtSaveForecastData_FM.Text().Length()>0)
+          {
+            JForecast := JSON::Parse(txtSaveForecastData_FM.Text());
+            ForecastID := JForecast.Get( "ForecastID").GetString();
+          }
+         jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.NeedQty(), ForecastID,"-",selection.NeedDate(),GlobalOTDTable);
+          if(jResult.Get( "Status").GetBoolean())
+          {
+                de_dh_FM_ProductMP.FixedFilter( "object.ParentSKU() = " +  selection.SKU().AsQUILL()
+                                                + " and object.ForecastID() = " + ForecastID.AsQUILL()
+                                                );
+          }
+          else
+          {
+            WebMessageBox::Warning( jResult.Get( "Msg").GetString());
+          }
+        }
+        else
+        {
+          SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmMaterial" and Obj.ItemKey()="ListSelect");
+          if(not isnull(selection))
+          {
+            SValueJsonString:= JSON::Object().Add( "SKU",selection.SKU())
+                        .Add( "MaterialName",selection.MaterialName())
+                        .Add( "MaterialType",selection.MaterialType())
+                        .Add( "OrgCode",selection.OrgCode())
+                        .Add( "Unit",selection.Unit())
+                        .Add( "CustomCode",CustomCode)
+                        .Add( "ParentSKU",lb_SUK_FM.Text())
+                        .Add( "ParentSKUName",SKUName)
+                        .Add( "CustomName",CustomName).Build().AsString();
+          }
+          if(isnull( SelectItem))
+          {
+            MacroPlan.H_MessagePassing(relnew,FKey := "FrmMaterial",ItemKey := "ListSelect", ValueJsonString:=SValueJsonString);
+          }
+          else
+          {
+            SelectItem.ValueJsonString( SValueJsonString);
+          }
+          Application.OpenForm( "FrmAuthorizeAndCountersign_Material","modal");
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnSelectionChanged.def
deleted file mode 100644
index 4b24dec..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_List832_OnSelectionChanged.def
+++ /dev/null
@@ -1,23 +0,0 @@
-Quintiq file version 2.0
-#parent: List832
-Response OnSelectionChanged (
-  Product_MP selection
-) id:Response_List832_OnSelectionChanged
-{
-  #keys: '[414724.0.113297034]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmMaterial" and Obj.ItemKey()="ListSelect");
-      if( isnull( SelectItem))
-      {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmMaterial",ItemKey := "ListSelect",Value := "");
-      }
-      SelectItem.Value(lb_SUK_FM.Text()+";"+ selection.ID() +";"+selection.UnitOfMeasureName()+";");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
index 04a54ea..4529905 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_OnCreated.def
@@ -9,6 +9,7 @@
   {
     Body:
     [*
+      ds_Month_FM.Date(Date::ActualDate());
       txtSaveForecastData_FM.Text("");
       // 鑾峰彇閫夋嫨鍚庣殑SKU
       SelectItem := select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
@@ -16,10 +17,12 @@
       {
         if( SelectItem.ValueJsonString().Length()>0)
         {
-          txtSaveForecastData_FM.Text(  SelectItem.ValueJsonString());
-          JSelect := JSON::Parse( SelectItem.ValueJsonString());
+          txtSaveForecastData_FM.Text(SelectItem.ValueJsonString());
+          JSelect := JSON::Parse(SelectItem.ValueJsonString());
           lb_SUK_FM.Text(JSelect.Get( "SKU").GetString());
-          de_dh_FM_ProductMP.FixedFilter( "object.ID() = " + JSelect.Get( "SKU").GetString().AsQUILL());
+          de_dh_FM_ProductMP.FixedFilter( "object.ParentSKU() = " + JSelect.Get( "SKU").GetString().AsQUILL()
+                                          + " and object.ForecastID() = " + JSelect.Get( "ForecastID").GetString().AsQUILL()
+                                          );
         }
       }
     *]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick\043975.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick\043975.def"
index 0912867..45e0871 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick\043975.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick\043975.def"
@@ -1,6 +1,8 @@
 Quintiq file version 2.0
 #parent: Panel418/btn_Add_FM
-Response OnClick () id:Response_Panel418_btn_Add_FM_OnClick_975
+Response OnClick (
+  H_MaterialInfo selection
+) id:Response_Panel418_btn_Add_FM_OnClick_975
 {
   #keys: '[414724.0.145238844]'
   CanBindMultiple: false
@@ -14,14 +16,41 @@
     Body:
     [*
       SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmMaterial" and Obj.ItemKey()="ListSelect");
+      CustomCode:="";
+      CustomName:="";
+      SValue:="";
+      SValueJsonString:="";
+      SKUName:="";
+      // 鑾峰彇瀹㈡埛鍚嶇О鍜屽鎴稩D
+      if(txtSaveForecastData_FM.Text().Length()>0)
+      {
+         jForecast := JSON::Parse( txtSaveForecastData_FM.Text());
+         CustomCode := jForecast.Get( "CustomCode").GetString();
+         CustomName := jForecast.Get( "CustomName").GetString();
+         SKUName := jForecast.Get( "SKUName").GetString();
+      }
+      if(not isnull(selection))
+      {
+        SValueJsonString:= JSON::Object().Add( "SKU",selection.SKU())
+                    .Add( "MaterialName",selection.MaterialName())
+                    .Add( "MaterialType",selection.MaterialType())
+                    .Add( "OrgCode",selection.OrgCode())
+                    .Add( "Unit",selection.Unit())
+                    .Add( "CustomCode",CustomCode)
+                    .Add( "ParentSKU",lb_SUK_FM.Text())
+                    .Add( "ParentSKUName",SKUName)
+                    .Add( "CustomName",CustomName).Build().AsString();
+      }
       if( isnull( SelectItem))
       {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmMaterial",ItemKey := "ListSelect",Value := "");
+        MacroPlan.H_MessagePassing(relnew,FKey := "FrmMaterial",ItemKey := "ListSelect", Value:=SValue,ValueJsonString:=SValueJsonString);
       }
       else
       {
-        //SelectItem.ValueJsonString()
+        SelectItem.Value(SValue);
+        SelectItem.ValueJsonString( SValueJsonString);
       }
+      Application.OpenForm( "FrmAuthorizeAndCountersign_Material","modal");
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick.def
deleted file mode 100644
index 75a8322..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Add_FM_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel418/btn_Add_FM
-Response OnClick () id:Response_Panel418_btn_Add_FM_OnClick
-{
-  #keys: '[414724.0.93205915]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      Application.OpenForm( "FrmAuthorizeAndCountersign_Material","modal");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Query_FM_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Query_FM_OnClick.def
index 822a47c..d0ec30d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Query_FM_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/Response_Panel418_btn_Query_FM_OnClick.def
@@ -9,10 +9,17 @@
   {
     Body:
     [*
-      de_dh_FM_ProductMP.FixedFilter( "object.ID().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" );
-      //                                             + " or " + "object.SKU().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )"  
-      //                                             + " or " + "object.CustomerCode().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" 
-      //                                             + " or " + "object.CustomerName().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" );
+      de_dh_FM_ProductMP.FixedFilter( "( object.SKU().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )"
+                                                   + " or " + "object.MaterialType().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )"  
+                                                   + " or " + "object.MaterialName().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.Unit().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.OrgCode().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.StockPoint().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.Unit().LikeUserLocale( " + txt_QueryContent_FM.Text().AsQUILL() + " ))" 
+                                                   + " and " + "( object.NeedDate() < " + ds_Month_FM.Date().StartOfNextMonth().AsQUILL()  
+                                                   + " and " + "object.NeedDate() >= " + ds_Month_FM.Date().StartOfMonth().AsQUILL() + " )"
+                                      
+                                      );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/_ROOT_Component_FrmMaterial.def b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/_ROOT_Component_FrmMaterial.def
index a356ac2..d1b24d6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/_ROOT_Component_FrmMaterial.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmMaterial/_ROOT_Component_FrmMaterial.def
@@ -14,7 +14,7 @@
     {
       #keys: '[414724.0.53475285]'
       BaseType: 'WebDataHolder'
-      Databinding: 'structured[Product_MP]*'
+      Databinding: 'structured[H_MaterialInfo]*'
       Children:
       [
         Component de_dh_FM_ProductMP
@@ -26,7 +26,7 @@
             DataType: 'MacroPlan'
             Source: 'MacroPlan'
             Taborder: 0
-            Transformation: 'Product_MP'
+            Transformation: 'H_MaterialInfo'
           ]
         }
       ]
@@ -53,7 +53,8 @@
   [
     Description: '鍘熸枡鍒楄〃椤�'
     Image: 'NAV_REDO_LIGHT_BLUE'
-    MinimumRows: 50
+    MinimumColumns: 80
+    MinimumRows: 40
     Title: '鍘熸枡鍒楄〃椤�'
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
index 8801397..2d6bd11 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel351.def
@@ -11,9 +11,10 @@
       BaseType: 'WebButton'
       Properties:
       [
+        ButtonSize: 'compact'
         Description: '璁㈠崟鏂板鍙嶇/鎺堟潈'
         Label: '璁㈠崟鏂板鍙嶇/鎺堟潈'
-        Taborder: 1
+        Taborder: 0
       ]
       ResponseDefinitions:
       [
@@ -39,9 +40,10 @@
       BaseType: 'WebButton'
       Properties:
       [
+        ButtonSize: 'compact'
         Description: '鍘熸枡鏂板鍙嶇/鎺堟潈'
         Label: '鍘熸枡鏂板鍙嶇/鎺堟潈'
-        Taborder: 2
+        Taborder: 1
       ]
       ResponseDefinitions:
       [
@@ -61,16 +63,40 @@
         }
       ]
     }
-    Component btn_InitialData778
+    Component btn_OrderH_FOF
     {
-      #keys: '[414724.0.115504406]'
+      #keys: '[414724.0.165490408]'
       BaseType: 'WebButton'
       Properties:
       [
-        Description: '鍔犺浇鏁版嵁锛堝亣鐨勶紝鍚庣画闇�瑕佸鎺ユ暟鎹級'
-        Label: '鍔犺浇棰勬祴璁㈠崟鏁版嵁'
-        Taborder: 0
-        Visible: false
+        ButtonSize: 'compact'
+        Description: 'ERO璁㈠崟鍐插噺'
+        Image: 'AMMUNITION_BOX_CLOSED'
+        Label: 'ERP璁㈠崟鍐插噺'
+        Taborder: 2
+      ]
+    }
+    Component txt_QueryContent_FOF
+    {
+      #keys: '[414724.0.172390935]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        PlaceHolder: '妯$硦鎼滅储'
+        Taborder: 3
+      ]
+    }
+    Component btn_Query_FOF
+    {
+      #keys: '[414724.0.172390951]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        ButtonSize: 'compact'
+        Description: '鏌ヨ'
+        Image: 'VIEW'
+        Label: '鏌ヨ'
+        Taborder: 4
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def
deleted file mode 100644
index ff6b8ad..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel383.def
+++ /dev/null
@@ -1,53 +0,0 @@
-Quintiq file version 2.0
-Component Panel383
-{
-  #keys: '[414724.0.86151558]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component ds_Month_FOF
-    {
-      #keys: '[414724.0.86151747]'
-      BaseType: 'WebDateSelector'
-      Properties:
-      [
-        DateFormat: 'YMM'
-        Label: '鏈堜唤'
-        Taborder: 0
-        Visible: false
-      ]
-    }
-    Component txt_QueryContent_FOF
-    {
-      #keys: '[414724.0.86151766]'
-      BaseType: 'WebEditField'
-      Properties:
-      [
-        PlaceHolder: '妯$硦鎼滅储'
-        Taborder: 1
-        Visible: false
-      ]
-    }
-    Component btn_Query_FOF
-    {
-      #keys: '[414724.0.88914059]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鏌ヨ'
-        Image: 'VIEW'
-        Label: '鏌ヨ'
-        Taborder: 2
-        Visible: false
-      ]
-    }
-  ]
-  Properties:
-  [
-    FixedSize: true
-    MinimumColumns: 80
-    Orientation: 'horizontal'
-    Taborder: 0
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def
deleted file mode 100644
index 7b147ac..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel647.def
+++ /dev/null
@@ -1,50 +0,0 @@
-Quintiq file version 2.0
-Component Panel647
-{
-  #keys: '[414724.0.86151576]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component btn_Add_Order_FOF
-    {
-      #keys: '[414724.0.87342042]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '璁㈠崟鏂板鍙嶇/鎺堟潈'
-        Label: '璁㈠崟鏂板鍙嶇/鎺堟潈'
-        Taborder: 1
-      ]
-    }
-    Component btn_Add_Material_FOF
-    {
-      #keys: '[414724.0.86151707]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鍘熸枡鏂板鍙嶇/鎺堟潈'
-        Label: '鍘熸枡鏂板鍙嶇/鎺堟潈'
-        Taborder: 2
-      ]
-    }
-    Component btn_InitialData
-    {
-      #keys: '[414724.0.93657921]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Description: '鍔犺浇鏁版嵁锛堝亣鐨勶紝鍚庣画闇�瑕佸鎺ユ暟鎹級'
-        Label: '鍔犺浇棰勬祴璁㈠崟鏁版嵁'
-        Taborder: 0
-        Visible: false
-      ]
-    }
-  ]
-  Properties:
-  [
-    Alignment: 'trailing'
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def
deleted file mode 100644
index 35b07f6..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_Panel849.def
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-Component Panel849
-{
-  #keys: '[414724.0.87341748]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    #child: Panel383
-    #child: Panel647
-  ]
-  Properties:
-  [
-    Description: '宸茬粡闅愯棌锛屾殏鏈娇鐢�'
-    FixedSize: true
-    Orientation: 'horizontal'
-    Taborder: 2
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
index e056848..67ab89e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_liH_Forecast.def
@@ -11,8 +11,8 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'structured[H_Forecast]'
-        Source: 'dh_FOF_H_Forecast'
+        DataType: 'structured[H_OrderForecastRealQty]'
+        Source: 'dh_FOF_H_OrderForecastRealQty'
         Taborder: 0
         Transformation: 'Elements'
       ]
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"璁㈠崟缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NeedTime","title":"闇�姹傛椂闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"NeedTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Util","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Util"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Department","title":"閿�鍞儴闂�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Department"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Month","title":"鏈堜唤","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Month"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecatsQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecatsQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecatsRealQty","title":"绾娴嬫暟閲�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecatsRealQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Department","title":"閮ㄩ棬","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Department"}}]'
         ContextMenu: 'listContextMenu367'
         Taborder: 2
       ]
@@ -36,6 +36,6 @@
   ]
   Properties:
   [
-    Taborder: 7
+    Taborder: 3
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def
deleted file mode 100644
index 320820a..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listActionBarPage963.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listActionBarPage963
-{
-  #keys: '[414724.0.86151897]'
-  BaseType: 'listActionBarPage'
-  Properties:
-  [
-    Taborder: 1
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def
deleted file mode 100644
index 5f3683c..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_listContextMenu687.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listContextMenu687
-{
-  #keys: '[414724.0.86151902]'
-  BaseType: 'listContextMenu'
-  Properties:
-  [
-    Taborder: 0
-  ]
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def"
deleted file mode 100644
index 0c21175..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Component_list_ForecastView_FOF\043670.def"
+++ /dev/null
@@ -1,43 +0,0 @@
-Quintiq file version 2.0
-Component list_ForecastView_FOF
-{
-  #keys: '[414724.0.86151894]'
-  BaseType: 'WebList'
-  Children:
-  [
-    Component de_list_ForecastView_FOF
-    {
-      #keys: '[414724.0.86151895]'
-      BaseType: 'WebDataExtractor'
-      Properties:
-      [
-        DataType: 'structured[SalesDemandBase]'
-        Source: 'dh_FOF_Data'
-        Taborder: 0
-        Transformation: 'Elements.astype(Forecast)'
-      ]
-    }
-    #child: listActionBarPage963
-    Component DataSetLevel191
-    {
-      #keys: '[414724.0.86151900]'
-      BaseType: 'WebDataSetLevel'
-      Children:
-      [
-        #child: listContextMenu687
-      ]
-      Properties:
-      [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgNotLinkedToPeriod","title":"ImgNotLinkedToPeriod","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgNotLinkedToPeriod"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsPostponed","title":"ImgIsPostponed","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsPostponed"}},{"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":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"Quantity UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Original Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NettedQuantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"NettedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment Illustration","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfillment","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round(2)"}},{"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.NettedQuantity()-object.FulfilledQuantity(),0.0).Round(2)"}}]}},{"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":"Priority.Name","title":"Priority","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Priority.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandUncertaintyPercentage","title":"Uncertainty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandUncertaintyPercentage"}}]'
-        ContextMenu: 'listContextMenu687'
-        FixedFilter: 'object.EndDate().DateTime().Date() >= Date::ActualDate().StartOfMonth() and object.EndDate().DateTime().Date() <= Date::ActualDate().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth().StartOfNextMonth()'
-        Taborder: 2
-      ]
-    }
-  ]
-  Properties:
-  [
-    Taborder: 5
-    Visible: false
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
index 5cb899a..700b61d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_OnCreated.def
@@ -9,13 +9,15 @@
   {
     Body:
     [*
-      // 鍒濆鍖栨煡璇㈠弬鏁版湀浠�
-      ds_Month_FOF.Date(Date::ActualDate());
       // 鍒濆鍖栭娴嬫暟鎹�
-      JResult := H_FunctionClass::SM_InitialForcastData( MacroPlan);
+      JResult := H_FunctionClass::SM_InitialForcastDataEx( MacroPlan,true,"-");
       if(not JResult.Get( "Status").GetBoolean())
       {
-          WebMessageBox::Warning( JResult.Get( "Msg").GetString());
+        WebMessageBox::Warning( JResult.Get( "Msg").GetString());
+      }
+      else
+      {
+        WebMessageBox::Information( JResult.Get( "Msg").GetString());
       }
     *]
     GroupServerCalls: false
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
index 7f7d6a1..67308a0 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Material_FOF503_OnClick\043222.def"
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: Panel351/btn_Add_Material_FOF503
 Response OnClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_Panel351_btn_Add_Material_FOF503_OnClick_222
 {
   #keys: '[414724.0.145178766]'
@@ -17,21 +17,36 @@
         if( isnull( SelectItem))
         {
            MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                       Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
                                        ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                         .Add( "Util",selection.Util())
-                                                                         .Add( "CustomCode",selection.CustomCode())
-                                                                         .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                                       .Add( "SKUName",selection.SKUName())
+                                                                       .Add( "Util",selection.Unit())
+                                                                       .Add( "CustomCode",selection.CustomCode())
+                                                                       .Add( "CustomName",selection.CustomName())
+                                                                       .Add( "ForecastQty",selection.ForecastQty())
+                                                                       .Add( "ForecastID",selection.ID())
+                                                                       .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
         }
         else
         {
-          SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
           SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                   .Add( "Util",selection.Util())
-                                   .Add( "CustomCode",selection.CustomCode())
-                                   .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                   .Add( "SKUName",selection.SKUName())
+                                                   .Add( "Util",selection.Unit())
+                                                   .Add( "CustomCode",selection.CustomCode())
+                                                   .Add( "CustomName",selection.CustomName())
+                                                   .Add( "ForecastQty",selection.ForecastQty())
+                                                   .Add( "ForecastID",selection.ID())
+                                                   .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
         }
-        Application.OpenForm( "FrmMaterial","popout");
+        
+        jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.ID(),"-",selection.Month(),GlobalOTDTable);
+        if(jResult.Get( "Status").GetBoolean())
+        {
+            Application.OpenForm( "FrmMaterial","popout");
+        }
+        else
+        {
+          WebMessageBox::Warning( jResult.Get( "Msg").GetString());
+        }
       }
       else
       {
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
index bf1f99c..7432121 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Add_Order_FOF449_OnClick\043880.def"
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: Panel351/btn_Add_Order_FOF449
 Response OnClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_Panel351_btn_Add_Order_FOF449_OnClick_880
 {
   #keys: '[414724.0.141244111]'
@@ -16,20 +16,21 @@
         SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
         if( isnull( SelectItem))
         {
+          
            MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                       Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
-                                       ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                         .Add( "Util",selection.Util())
-                                                                         .Add( "CustomCode",selection.CustomCode())
-                                                                         .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                      ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
+                                                                       .Add( "Util",selection.Unit())
+                                                                       .Add( "CustomCode",selection.CustomCode())
+                                                                       .Add( "SKUName",selection.SKUName())
+                                                                       .Add( "CustomName",selection.CustomName()).Build().AsString());
         }
         else
         {
-          SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
           SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                   .Add( "Util",selection.Util())
-                                   .Add( "CustomCode",selection.CustomCode())
-                                   .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                   .Add( "Util",selection.Unit())
+                                                   .Add( "CustomCode",selection.CustomCode())
+                                                   .Add( "SKUName",selection.SKUName())
+                                                   .Add( "CustomName",selection.CustomName()).Build().AsString());
         }
         Application.OpenForm( "FrmAuthorizeAndCountersign_Order","modal");  
       }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_InitialData778_OnClick\043971.def" "b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_InitialData778_OnClick\043971.def"
deleted file mode 100644
index 7ec4937..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_InitialData778_OnClick\043971.def"
+++ /dev/null
@@ -1,35 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel351/btn_InitialData778
-Response OnClick () id:Response_Panel351_btn_InitialData778_OnClick_971
-{
-  #keys: '[414724.0.141222418]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      //// 娌℃湁鐢ㄧ殑鎸夐挳鍜屽嚱鏁帮紝鍙负浜嗘祴璇曠敓鎴愬亣鏁版嵁銆�
-      //StrCustoms:="XM_2023,灏忕背;HW_2023,鍗庝负;OV_2023,VIVO;OP_2023,OPPO;HX_2023,娴蜂俊;YJ_2023,涓�鍔�;HE_2023,娴峰皵;GL_2023,鏍煎姏;";
-      //ArrayCustom := StrCustoms.Tokenize( ";"); //8涓鎴�
-      //idx :=0;
-      //for( i:=0;i<20;i:=i+1)
-      //{
-      //  idx :=Number::Random( 0,7);
-      //  arrCustomInfo := ArrayCustom.Element( idx).Tokenize( ",");
-      //  MacroPlan.H_Forecast(relnew, CustomName := arrCustomInfo.Element( 1),CustomCode := arrCustomInfo.Element( 0),ForecastQty := Number::Random( 100,5000),
-      //                        Department := "閿�鍞�1閮�",NeedTime := Date::ActualDate(),OrderCode := H_FunctionClass::SM_GenerateID( "OF") ,SKU := "SKU-CP-2023-N"+(Number::Random( 1000,9999)).AsQUILL(),Util := "PCS");  
-      //  
-      //}
-      //// 鐢熸垚棰勬祴 瀹炴椂鏁版嵁锛屽弽绛炬暟鎹紝鎺堟潈鏁版嵁锛堝弽绛� 鎺堟潈榛樿涓�0锛屽鑷姩鍒涘缓锛岃繖閲屼笉鍐嶆坊鍔狅級
-      // traverse(MacroPlan,H_Forecast ,Obj,not isnull(Obj) )
-      //{
-      //  MacroPlan.H_OrderForecastRealQty(relnew,CustomID := Obj.CustomCode(),CustomName := Obj.CustomName(),ForecatsQty := Obj.ForecastQty(),
-      //                                    ForecatsRealQty := Obj.ForecastQty(),ID := H_FunctionClass::SM_GenerateID( "OF"),Month := Date::ActualDate(),
-      //                                    OrderCode := Obj.OrderCode(),SKU := Obj.SKU(),Unit := Obj.Util());
-      //                                    
-      //}
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_OrderH_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_OrderH_FOF_OnClick.def
new file mode 100644
index 0000000..4aa4c40
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_OrderH_FOF_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: Panel351/btn_OrderH_FOF
+Response OnClick () id:Response_Panel351_btn_OrderH_FOF_OnClick
+{
+  #keys: '[414724.0.166610329]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      H_FunctionClass::SM_OrderHedging( MacroPlan,true,"System","ERP璁㈠崟");
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def
new file mode 100644
index 0000000..1b95a1a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel351_btn_Query_FOF_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: Panel351/btn_Query_FOF
+Response OnClick () id:Response_Panel351_btn_Query_FOF_OnClick
+{
+  #keys: '[414724.0.172390950]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      de_dh_FOF_H_Foecast.FixedFilter( "object.SKU().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"
+                                                   + " or " + "object.CustomName().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"  
+                                                   + " or " + "object.Unit().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.Department().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )" 
+                                                   + " or " + "object.StockingPointID().LikeUserLocale( " + txt_QueryContent_FOF.Text().AsQUILL() + " )"
+                                      );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def
deleted file mode 100644
index 41a29a8..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel383_btn_Query_FOF_OnClick.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel383/btn_Query_FOF
-Response OnClick () id:Response_Panel383_btn_Query_FOF_OnClick
-{
-  #keys: '[414724.0.91472695]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      MacroPlan.H_Forecast(relnew, CustomName := "灏忕背",CustomCode := "XM001",ForecastQty := 100,Department := "閿�鍞�1閮�",
-                                         NeedTime := Date::ActualDate(),OrderCode := "00010101",SKU := "ANNDDSSSS",Util := "PCS");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def
deleted file mode 100644
index b54e053..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Material_FOF_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_Add_Material_FOF
-Response OnClick () id:Response_Panel647_btn_Add_Material_FOF_OnClick
-{
-  #keys: '[414724.0.86152486]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      Application.OpenForm( "FrmMaterial","popout");
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def
deleted file mode 100644
index 82c16f5..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_Add_Order_FOF_OnClick.def
+++ /dev/null
@@ -1,28 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_Add_Order_FOF
-Response OnClick () id:Response_Panel647_btn_Add_Order_FOF_OnClick
-{
-  #keys: '[414724.0.86152095]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem := select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if(not isnull( SelectItem) and SelectItem.Value().Length()>0)
-      {
-        Application.OpenForm( "FrmAuthorizeAndCountersign_Order","popout");
-      }
-      else
-      {
-        WebMessageBox::Information( "璇烽�夋嫨涓�椤归娴嬪悗鍐嶇偣鍑绘寜閽紒");  
-      }
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def
deleted file mode 100644
index 1804c2e..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_Panel647_btn_InitialData_OnClick.def
+++ /dev/null
@@ -1,39 +0,0 @@
-Quintiq file version 2.0
-#parent: Panel647/btn_InitialData
-Response OnClick () id:Response_Panel647_btn_InitialData_OnClick
-{
-  #keys: '[414724.0.93657952]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      // 娌℃湁鐢ㄧ殑鎸夐挳鍜屽嚱鏁帮紝鍙负浜嗘祴璇曠敓鎴愬亣鏁版嵁銆�
-      StrCustoms:="XM_2023,灏忕背;HW_2023,鍗庝负;OV_2023,VIVO;OP_2023,OPPO;HX_2023,娴蜂俊;YJ_2023,涓�鍔�;HE_2023,娴峰皵;GL_2023,鏍煎姏;";
-      ArrayCustom := StrCustoms.Tokenize( ";"); //8涓鎴�
-      idx :=0;
-      for( i:=0;i<20;i:=i+1)
-      {
-        idx :=Number::Random( 0,7);
-        arrCustomInfo := ArrayCustom.Element( idx).Tokenize( ",");
-        MacroPlan.H_Forecast(relnew, CustomName := arrCustomInfo.Element( 1),CustomCode := arrCustomInfo.Element( 0),ForecastQty := Number::Random( 100,5000),
-                              Department := "閿�鍞�1閮�",NeedTime := Date::ActualDate(),OrderCode := H_FunctionClass::SM_GenerateID( "OF") ,SKU := "SKU-CP-2023-N"+(Number::Random( 1000,9999)).AsQUILL(),Util := "PCS");  
-        
-      }
-      // 鐢熸垚棰勬祴 瀹炴椂鏁版嵁锛屽弽绛炬暟鎹紝鎺堟潈鏁版嵁锛堝弽绛� 鎺堟潈榛樿涓�0锛屽鑷姩鍒涘缓锛岃繖閲屼笉鍐嶆坊鍔狅級
-       traverse(MacroPlan,H_Forecast ,Obj,not isnull(Obj) )
-      {
-        MacroPlan.H_OrderForecastRealQty(relnew,CustomID := Obj.CustomCode(),CustomName := Obj.CustomName(),ForecatsQty := Obj.ForecastQty(),
-                                          ForecatsRealQty := Obj.ForecastQty(),ID := H_FunctionClass::SM_GenerateID( "OF"),Month := Date::ActualDate(),
-                                          OrderCode := Obj.OrderCode(),SKU := Obj.SKU(),Unit := Obj.Util());
-                                          
-      }
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
index 4333154..ac7e8b0 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_liH_Forecast_OnDoubleClick.def
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: liH_Forecast
 Response OnDoubleClick (
-  H_Forecast selection
+  H_OrderForecastRealQty selection
 ) id:Response_liH_Forecast_OnDoubleClick
 {
   #keys: '[414724.0.111761136]'
@@ -15,21 +15,36 @@
       if( isnull( SelectItem))
       {
          MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",
-                                     Value := selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName(),
                                      ValueJsonString := JSON::Object().Add( "SKU",selection.SKU())
-                                                                       .Add( "Util",selection.Util())
+                                                                       .Add( "SKUName",selection.SKUName())
+                                                                       .Add( "Util",selection.Unit())
                                                                        .Add( "CustomCode",selection.CustomCode())
-                                                                       .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                                       .Add( "CustomName",selection.CustomName())
+                                                                       .Add( "ForecastQty",selection.ForecastQty())
+                                                                       .Add( "ForecastID",selection.ID())
+                                                                       .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
       }
       else
       {
-        SelectItem.Value(selection.SKU()+";"+selection.Util()+";"+selection.CustomCode()+";"+selection.CustomName());
         SelectItem.ValueJsonString(JSON::Object().Add( "SKU",selection.SKU())
-                                 .Add( "Util",selection.Util())
-                                 .Add( "CustomCode",selection.CustomCode())
-                                 .Add( "CustomName",selection.CustomName()).Build().AsString());
+                                                 .Add( "SKUName",selection.SKUName())
+                                                 .Add( "Util",selection.Unit())
+                                                 .Add( "CustomCode",selection.CustomCode())
+                                                 .Add( "CustomName",selection.CustomName())
+                                                 .Add( "ForecastQty",selection.ForecastQty())
+                                                 .Add( "ForecastID",selection.ID())
+                                                 .Add( "NeedTime",selection.Month().AsQUILL()).Build().AsString());
       }
-      Application.OpenForm( "FrmMaterial","popout");
+      
+      jResult := H_FunctionClass::SM_GetMaterialData( MacroPlan,selection.SKU(),selection.ForecastQty(),selection.ID(),"-",selection.Month(),GlobalOTDTable );
+      if(jResult.Get( "Status").GetBoolean())
+      {
+        Application.OpenForm( "FrmMaterial","popout");
+      }
+      else
+      {
+        WebMessageBox::Warning( jResult.Get( "Msg").GetString());
+      }
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def
deleted file mode 100644
index 3d85f54..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnDoubleClick.def
+++ /dev/null
@@ -1,30 +0,0 @@
-Quintiq file version 2.0
-#parent: list_ForecastView_FOF
-Response OnDoubleClick (
-  Forecast selection
-) id:Response_list_ForecastView_FOF_OnDoubleClick
-{
-  #keys: '[414724.0.92081867]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebList_OnDoubleClick'
-  GroupServerCalls: true
-  Precondition:
-  [*
-    return not isnull( MacroPlan);
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if( isnull( SelectItem))
-      {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",Value := "");
-      }
-      CustomID := "NO";
-      CustonName :="鏈姄鍙栧埌";
-      SelectItem.Value(selection.ProductID()+";"+selection.UnitOfMeasureName()+";"+CustomID+";"+CustonName);
-      Application.OpenForm( "FrmMaterial","popout");
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def
deleted file mode 100644
index 582090d..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/Response_list_ForecastView_FOF_OnSelectionChanged.def
+++ /dev/null
@@ -1,25 +0,0 @@
-Quintiq file version 2.0
-#parent: list_ForecastView_FOF
-Response OnSelectionChanged (
-  Forecast selection
-) id:Response_list_ForecastView_FOF_OnSelectionChanged
-{
-  #keys: '[414724.0.91684287]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebList_OnSelectionChanged'
-  QuillAction
-  {
-    Body:
-    [*
-      SelectItem :=  select( MacroPlan,H_MessagePassing,Obj,Obj.FKey()="FrmOrderForecast" and Obj.ItemKey()="ListSelect");
-      if( isnull( SelectItem))
-      {
-         MacroPlan.H_MessagePassing(relnew,FKey :="FrmOrderForecast",ItemKey := "ListSelect",Value := "");
-      }
-      CustomID := "NO";
-      CustonName :="鏈姄鍙栧埌";
-      SelectItem.Value(selection.ProductID()+";"+selection.UnitOfMeasureName()+";"+CustomID+";"+CustonName);
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
index d6e1cad..3d07f93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderForecast/_ROOT_Component_FrmOrderForecast.def
@@ -7,100 +7,12 @@
   BaseType: 'WebForm'
   Children:
   [
-    #child: Panel849
-    #child: list_ForecastView_FOF
-    Component dh_FOF_Data
-    {
-      #keys: '[414724.0.86151860]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'structured[SalesDemandBase]*'
-      Children:
-      [
-        Component de_dh_FOF_Data
-        {
-          #keys: '[414724.0.86151875]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[SalesDemandBase]'
-            Source: 'dh_FOF_ChildrenData'
-            Taborder: 0
-            Transformation: 'Elements'
-          ]
-        }
-        Component DataExtractor819
-        {
-          #keys: '[414724.0.107645127]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'MacroPlan'
-            Source: 'MacroPlan'
-            Taborder: 1
-            Transformation: 'SalesDemand'
-          ]
-        }
-      ]
-      Properties:
-      [
-        Taborder: 4
-      ]
-    }
     #child: Panel961
-    Component dh_FOF_ChildrenData
-    {
-      #keys: '[414724.0.106541535]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'structured[SalesDemandBase]*'
-      Children:
-      [
-        Component de_FOF_ChildrenData_0
-        {
-          #keys: '[414724.0.106541577]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[Product_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderProduct'
-            Taborder: 0
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-        Component de_FOF_ChildrenData_1
-        {
-          #keys: '[414724.0.106541594]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[StockingPoint_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderStockingPoint'
-            Taborder: 1
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-        Component de_FOF_ChildrenData_2
-        {
-          #keys: '[414724.0.106541611]'
-          BaseType: 'WebDataExtractor'
-          Properties:
-          [
-            DataType: 'structured[SalesSegment_MP]'
-            Source: 'ApplicationMacroPlanner.DataHolderSalesSegment'
-            Taborder: 2
-            Transformation: 'Elements.SalesDemand'
-          ]
-        }
-      ]
-      Properties:
-      [
-        Taborder: 3
-      ]
-    }
-    Component dh_FOF_H_Forecast
+    Component dh_FOF_H_OrderForecastRealQty
     {
       #keys: '[414724.0.109053093]'
       BaseType: 'WebDataHolder'
-      Databinding: 'structured[H_Forecast]*'
+      Databinding: 'structured[H_OrderForecastRealQty]*'
       Children:
       [
         Component de_dh_FOF_H_Foecast
@@ -112,13 +24,13 @@
             DataType: 'MacroPlan'
             Source: 'MacroPlan'
             Taborder: 0
-            Transformation: 'H_Forecast'
+            Transformation: 'H_OrderForecastRealQty'
           ]
         }
       ]
       Properties:
       [
-        Taborder: 6
+        Taborder: 2
       ]
     }
     #child: liH_Forecast
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderResult/Component_List782.def b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderResult/Component_List782.def
index 8a9e630..915ae2c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmOrderResult/Component_List782.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmOrderResult/Component_List782.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"OrderCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderQty","title":"OrderQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"ReverseQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"AuthorizeQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"ForecastQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastHitQty","title":"ForecastHitQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastNoHitQty","title":"ForecastNoHitQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastNoHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerCode","title":"CustomerCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerCode"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderCode","title":"璁㈠崟缂栧彿","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrderQty","title":"鏂板璁㈠崟","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrderQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"鍙嶇","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"鎺堟潈","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastQty","title":"棰勬祴","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastHitQty","title":"鏈夐娴�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ForecastNoHitQty","title":"鏃犻娴�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ForecastNoHitQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerCode","title":"瀹㈡埛ID","subtotals":"","tooltip":"","width":-1,"display":"hidden","editable":false,"attribute":"CustomerCode"}}]'
         ContextMenu: 'listContextMenu526'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_List696.def b/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_List696.def
index 8ba9e27..efcc861 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_List696.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_List696.def
@@ -28,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MType","title":"MType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"ReverseQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"AuthorizeQty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"Unit","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"CustomerName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SKU","title":"SKU缂栫爜","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SKU"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MType","title":"绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReverseQty","title":"棰勬祴鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReverseQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AuthorizeQty","title":"鎺堟潈鏁伴噺","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AuthorizeQty"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit","title":"鍗曚綅","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CustomerName","title":"瀹㈡埛鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CustomerName"}}]'
         ContextMenu: 'listContextMenu660'
         Taborder: 2
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_Panel224.def b/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_Panel224.def
index 652ca4c..f95c042 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_Panel224.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FrmRAShow/Component_Panel224.def
@@ -32,6 +32,7 @@
       BaseType: 'WebButton'
       Properties:
       [
+        ButtonSize: 'compact'
         Image: 'VIEW'
         Label: '鏌ヨ'
         Taborder: 2
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/Business_Type_Maintain.vw b/_Main/UI/MacroPlannerWebApp/Views/Business_Type_Maintain.vw
new file mode 100644
index 0000000..7903c23
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Business_Type_Maintain.vw
@@ -0,0 +1,351 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_legacy_1
+      {
+        title: 'Scenario manager'
+        shown: true
+        componentID: 'FormScenarioManager'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 5
+        }
+        components
+        {
+          FormScenarioManager_ListScenario
+          {
+          }
+          FormScenarioManager_DataSetLevelScenario
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 90
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 277
+            }
+            column_ChangedBy
+            {
+              columnId: 'ChangedBy'
+              dataPath: 'ChangedBy'
+              dataType: 'string'
+              title: 'Changed by'
+              index: 2
+              subtotals: ''
+              width: 106
+            }
+            column_ChangedOn
+            {
+              columnId: 'ChangedOn'
+              dataPath: 'ChangedOn'
+              dataType: 'datetime'
+              title: 'Changed on'
+              index: 3
+              subtotals: ''
+              width: 99
+            }
+            column_StorageMode
+            {
+              columnId: 'StorageMode'
+              dataPath: 'StorageMode'
+              dataType: 'string'
+              title: 'StorageMode'
+              index: 4
+              subtotals: ''
+              width: 40
+            }
+          }
+        }
+      }
+      form_legacy_2
+      {
+        title: 'Assumptions'
+        shown: true
+        componentID: 'FormAssumptions'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 9
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 5
+        }
+        components
+        {
+          FormAssumptions_ListAssumptions
+          {
+          }
+          FormAssumptions_DataSetLevelAssumptions
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              title: '绫诲埆'
+              index: 1
+              subtotals: ''
+              width: 108
+            }
+            column_Importance
+            {
+              columnId: 'Importance'
+              dataPath: 'Importance'
+              dataType: 'string'
+              title: '閲嶈鎬�'
+              index: 2
+              subtotals: ''
+              width: 110
+            }
+            column_Title
+            {
+              columnId: 'Title'
+              dataPath: 'Title'
+              dataType: 'string'
+              title: '鏍囬'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_ChangedBy
+            {
+              columnId: 'ChangedBy'
+              dataPath: 'ChangedBy'
+              dataType: 'string'
+              title: 'Changed by'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_CreatedOn
+            {
+              columnId: 'CreatedOn'
+              dataPath: 'CreatedOn'
+              dataType: 'datetime'
+              title: 'Created on'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormScenariosKPIsComparison
+      {
+        title: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        shown: true
+        componentID: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 16
+          columnPosition: 6
+          columnSpan: 7
+        }
+        components
+        {
+          FormScenariosKPIsComparison_MatrixEditorFinancialKPIs
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison.MatrixEditorFinancialKPIs'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_DisplayValue
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DisplayValue'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: ''
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'KPISetting.DisplayIndex'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      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: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: '鍚嶇О'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    index: 3
+    image: 'ELEMENTS_TREE_EDIT'
+    page: 'applicationDevelopmentActionBarPageDef'
+    group: ''
+    description: ''
+  }
+  formatversion: 2
+  id: 'Business_Type_Maintain'
+  name: 'Business Type Maintain'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrder.vw b/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrder.vw
index 21e8b5a..274be38 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrder.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrder.vw
@@ -180,10 +180,10 @@
     userconfigurableinformation
     {
     }
+    image: ''
     page: ''
     group: ''
-    index: 14
-    image: ''
+    index: 0
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw b/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
index e8b9ad7..f322040 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
@@ -2,10 +2,10 @@
 {
   viewcontents
   {
+    image: ''
     page: ''
     group: ''
     index: 0
-    image: ''
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw b/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
index 0cae0ba..a309668 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/OrderLock.vw
@@ -4,204 +4,403 @@
   {
     forms
     {
-      form_legacy_1
+      form_FormOrderLockLog
       {
-        title: 'Scenario manager'
+        title: 'QTIANMA_JITUAN::FormOrderLockLog'
         shown: true
-        componentID: 'FormScenarioManager'
+        componentID: 'QTIANMA_JITUAN::FormOrderLockLog'
         layout
         {
           mode: 'open'
-          rowPosition: 1
+          rowPosition: 14
           rowSpan: 8
           columnPosition: 1
-          columnSpan: 5
+          columnSpan: 12
         }
         components
         {
-          FormScenarioManager_ListScenario
+          FormOrderLockLog_PanelOrderLockLog
+          {
+            sizeRatio: 1
+          }
+          FormOrderLockLog_ListOrderLockLog
           {
           }
-          FormScenarioManager_DataSetLevelScenario
+          FormOrderLockLog_DataSetLevelOrderLockLog
           {
             groupDepth: -1
-            column_All_constraints
+            sort: 'DESC:Notes'
+            column_OrderID
             {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
+              columnId: 'OrderID'
+              dataPath: 'OrderID'
               dataType: 'string'
-              title: 'All constraints'
+              title: '璁㈠崟鍙�'
               index: 0
               subtotals: ''
-              width: 90
+              width: 150
             }
-            column_Name
+            column_ProductID
             {
-              columnId: 'Name'
-              dataPath: 'Name'
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
               dataType: 'string'
-              title: '鍚嶇О'
+              title: '鐗╂枡鍙�'
               index: 1
               subtotals: ''
-              width: 277
+              width: 150
             }
-            column_ChangedBy
+            column_SalesSegmentName
             {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
               dataType: 'string'
-              title: 'Changed by'
+              title: '閿�鍞儴闂�'
               index: 2
               subtotals: ''
-              width: 106
+              width: 150
             }
-            column_ChangedOn
+            column_StockingPointID
             {
-              columnId: 'ChangedOn'
-              dataPath: 'ChangedOn'
-              dataType: 'datetime'
-              title: 'Changed on'
-              index: 3
-              subtotals: ''
-              width: 99
-            }
-            column_StorageMode
-            {
-              columnId: 'StorageMode'
-              dataPath: 'StorageMode'
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
               dataType: 'string'
-              title: 'StorageMode'
-              index: 4
-              subtotals: ''
-              width: 40
-            }
-          }
-        }
-      }
-      form_legacy_2
-      {
-        title: 'Assumptions'
-        shown: true
-        componentID: 'FormAssumptions'
-        layout
-        {
-          mode: 'open'
-          rowPosition: 9
-          rowSpan: 8
-          columnPosition: 1
-          columnSpan: 5
-        }
-        components
-        {
-          FormAssumptions_ListAssumptions
-          {
-          }
-          FormAssumptions_DataSetLevelAssumptions
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 32
-            }
-            column_Category
-            {
-              columnId: 'Category'
-              dataPath: 'Category'
-              dataType: 'string'
-              title: '绫诲埆'
-              index: 1
-              subtotals: ''
-              width: 108
-            }
-            column_Importance
-            {
-              columnId: 'Importance'
-              dataPath: 'Importance'
-              dataType: 'string'
-              title: '閲嶈鎬�'
-              index: 2
-              subtotals: ''
-              width: 110
-            }
-            column_Title
-            {
-              columnId: 'Title'
-              dataPath: 'Title'
-              dataType: 'string'
-              title: '鏍囬'
+              title: '搴撳瓨鐐�'
               index: 3
               subtotals: ''
               width: 150
             }
-            column_ChangedBy
+            column_CustomerName
             {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
+              columnId: 'CustomerName'
+              dataPath: 'CustomerName'
               dataType: 'string'
-              title: 'Changed by'
+              title: '瀹㈡埛鍚嶇О'
               index: 4
               subtotals: ''
               width: 150
             }
-            column_CreatedOn
+            column_Quantity
             {
-              columnId: 'CreatedOn'
-              dataPath: 'CreatedOn'
-              dataType: 'datetime'
-              title: 'Created on'
+              columnId: 'Quantity'
+              dataPath: 'Quantity'
+              dataType: 'real'
               index: 5
               subtotals: ''
               width: 150
             }
+            column_UnitOfMeasureName
+            {
+              columnId: 'UnitOfMeasureName'
+              dataPath: 'UnitOfMeasureName'
+              dataType: 'string'
+              title: '鍗曚綅'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_Price
+            {
+              columnId: 'Price'
+              dataPath: 'Price'
+              dataType: 'real'
+              title: '閿�鍞'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_EndDate
+            {
+              columnId: 'EndDate'
+              dataPath: 'EndDate'
+              dataType: 'date'
+              title: '瀹㈡埛闇�姹傛椂闂�'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_IsLocked
+            {
+              columnId: 'IsLocked'
+              dataPath: 'IsLocked'
+              dataType: 'boolean'
+              title: '鐘舵��'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_End
+            {
+              columnId: 'End'
+              dataPath: 'End'
+              dataType: 'date'
+              title: '璁″垝浜や粯鏃堕棿'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_LastModify
+            {
+              columnId: 'LastModify'
+              dataPath: 'LastModify'
+              dataType: 'string'
+              title: '鏈�鍚庢搷浣滀汉'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_LastModifyTime
+            {
+              columnId: 'LastModifyTime'
+              dataPath: 'LastModifyTime'
+              dataType: 'datetime'
+              title: '鏈�鍚庢搷浣滄椂闂�'
+              index: 12
+              subtotals: ''
+              width: 145
+            }
+            column_Notes
+            {
+              columnId: 'Notes'
+              dataPath: 'Notes'
+              dataType: 'string'
+              title: '鎿嶄綔璇︽儏'
+              index: 13
+              subtotals: ''
+              width: 150
+            }
           }
         }
       }
-      form_FormScenariosKPIsComparison
+      form_FormOrderLock
       {
-        title: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        title: 'QTIANMA_JITUAN::FormOrderLock'
         shown: true
-        componentID: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison'
+        componentID: 'QTIANMA_JITUAN::FormOrderLock'
         layout
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 16
-          columnPosition: 6
-          columnSpan: 7
+          rowSpan: 13
+          columnPosition: 1
+          columnSpan: 12
         }
         components
         {
-          FormScenariosKPIsComparison_MatrixEditorFinancialKPIs
+          FormOrderLock_PanelOrderLock
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelOrderLockHeader
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelOrderLockOrder
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_ListOrderLock
+          {
+          }
+          FormOrderLock_DataSetLevelOrderLock
+          {
+            groupDepth: -1
+            sort: 'StartDate'
+            column_OrderID
+            {
+              columnId: 'OrderID'
+              dataPath: 'OrderID'
+              dataType: 'string'
+              title: '璁㈠崟鍙�'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              title: '鐗╂枡鍙�'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_SalesSegmentName
+            {
+              columnId: 'SalesSegmentName'
+              dataPath: 'SalesSegmentName'
+              dataType: 'string'
+              title: '閿�鍞儴闂�'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              title: '搴撳瓨鐐�'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_CustomerName
+            {
+              columnId: 'CustomerName'
+              dataPath: 'CustomerName'
+              dataType: 'string'
+              title: '瀹㈡埛鍚嶇О'
+              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'
+              title: '鍗曚綅'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_Price
+            {
+              columnId: 'Price'
+              dataPath: 'Price'
+              dataType: 'real'
+              title: '閿�鍞'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_StartDate
+            {
+              columnId: 'StartDate'
+              dataPath: 'StartDate'
+              dataType: 'date'
+              title: '瀹㈡埛闇�姹傛椂闂�'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_IsLocked
+            {
+              columnId: 'IsLocked'
+              dataPath: 'IsLocked'
+              dataType: 'boolean'
+              title: '鐘舵��'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_First_AsPlanningBaseSalesDemandInPeriod_End
+            {
+              columnId: 'First.AsPlanningBaseSalesDemandInPeriod.End'
+              dataPath: 'First.AsPlanningBaseSalesDemandInPeriod.End'
+              dataType: 'datetime'
+              title: '璁″垝浜や粯鏃堕棿'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_LastModify
+            {
+              columnId: 'LastModify'
+              dataPath: 'LastModify'
+              dataType: 'string'
+              title: '鏈�鍚庢搷浣滀汉'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_LastModifyTime
+            {
+              columnId: 'LastModifyTime'
+              dataPath: 'LastModifyTime'
+              dataType: 'datetime'
+              title: '鏈�鍚庢搷浣滄椂闂�'
+              index: 12
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormOrderLock_PanelOrderLockPlanning
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_PanelMatrix
+          {
+            sizeRatio: 1
+          }
+          FormOrderLock_MatrixEditorProductPlanning
           {
             gridColor: '#c4c4c4'
-            totalHeaderWidth: 200
-            attributeHeaderWidthRatio: 0.6
-            nameHeaderWidthRatio: 0.4
+            totalHeaderWidth: 427
+            attributeHeaderWidthRatio: 0.325989701966572
+            nameHeaderWidthRatio: 0.674010298033429
             columnWidth: 100
             horizontalGrid: true
             verticalGrid: true
             backendState
             {
-              componentId: 'QLibMacroPlannerWebUI::FormScenariosKPIsComparison.MatrixEditorFinancialKPIs'
+              componentId: 'QTIANMA_JITUAN::FormOrderLock.MatrixEditorProductPlanning'
               state
               {
                 cells
                 {
                   attributes
                   {
-                    attribute_DisplayValue
+                    attribute_DisplaySupplyQuantity
                     {
                       type: 'MatrixEditorWebApiCellDataModelInterest'
                       index: 0
                       rowsubtotal: ''
                       columnsubtotal: ''
-                      attribute: 'DisplayValue'
+                      attribute: 'DisplaySupplyQuantity'
+                    }
+                    attribute_DependentDemandAndSalesDemandQuantity
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'DependentDemandAndSalesDemandQuantity'
+                    }
+                    attribute_TargetInventoryLevel
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 2
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'TargetInventoryLevel'
+                    }
+                    attribute_InventoryLevelEnd
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 3
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'InventoryLevelEnd'
+                    }
+                    attribute_StockLevelInDays
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 4
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'StockLevelInDays'
                     }
                   }
                 }
@@ -209,14 +408,14 @@
                 {
                   sorting
                   {
-                    criteria: ''
+                    criteria: "datamember:'Start'"
                   }
                 }
                 rows
                 {
                   sorting
                   {
-                    criteria: "datamember:'KPISetting.DisplayIndex'"
+                    criteria: "datamember:'Product_MP.DisplayIndex';datamember:'Name'"
                   }
                 }
               }
@@ -337,10 +536,10 @@
     userconfigurableinformation
     {
     }
-    index: 2
-    image: 'DOCUMENT_LOCK'
     page: 'applicationDevelopmentActionBarPageDef'
     group: ''
+    index: 2
+    image: 'DOCUMENT_LOCK'
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/PriorityResults.vw b/_Main/UI/MacroPlannerWebApp/Views/PriorityResults.vw
index 3489b0c..e0e823a 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/PriorityResults.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/PriorityResults.vw
@@ -2244,10 +2244,10 @@
     userconfigurableinformation
     {
     }
+    image: ''
     page: ''
     group: ''
-    index: 15
-    image: ''
+    index: 0
     description: ''
   }
   formatversion: 2
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
new file mode 100644
index 0000000..1a6fe97
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Test.vw
@@ -0,0 +1,458 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormCapacityAllocationResultsRuleConfiguration
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAllocationResultsRuleConfiguration'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAllocationResultsRuleConfiguration'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormCapacityAllocationResultsRuleConfiguration_PanelImportAndExport
+          {
+            sizeRatio: 1
+          }
+          FormCapacityAllocationResultsRuleConfiguration_ListCapacityAllocationResultsRuleConfiguration
+          {
+          }
+          FormCapacityAllocationResultsRuleConfiguration_DataSetLevelCapacityAllocationResultsRuleConfiguration
+          {
+            groupDepth: -1
+            column_PanelMaterialCode
+            {
+              columnId: 'PanelMaterialCode'
+              dataPath: 'PanelMaterialCode'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ModuleMaterialCode
+            {
+              columnId: 'ModuleMaterialCode'
+              dataPath: 'ModuleMaterialCode'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Division
+            {
+              columnId: 'Division'
+              dataPath: 'Division'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAllocationResults
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAllocationResults'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAllocationResults'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 5
+          columnSpan: 8
+        }
+        components
+        {
+          FormCapacityAllocationResults_PanelCapacityAllocationResults
+          {
+            sizeRatio: 1
+          }
+          FormCapacityAllocationResults_ListCapacityAllocationResults
+          {
+          }
+          FormCapacityAllocationResults_DataSetLevelCapacityAllocationResults
+          {
+            groupDepth: -1
+            column_Date
+            {
+              columnId: 'Date'
+              dataPath: 'Date'
+              dataType: 'date'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_ID
+            {
+              columnId: 'ID'
+              dataPath: 'ID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_ProductID
+            {
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_StockingPointID
+            {
+              columnId: 'StockingPointID'
+              dataPath: 'StockingPointID'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_UserQuantity
+            {
+              columnId: 'UserQuantity'
+              dataPath: 'UserQuantity'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_ManufacturedDate
+            {
+              columnId: 'ManufacturedDate'
+              dataPath: 'ManufacturedDate'
+              dataType: 'date'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      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_PanelFillingCapacityOrder
+          {
+            sizeRatio: 1
+          }
+          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
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'BEAR'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: 'Test'
+  name: 'Test'
+  isglobal: false
+  isroot: true
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\345\241\253\344\272\247\346\226\271\346\241\210\345\210\227\350\241\250.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\345\241\253\344\272\247\346\226\271\346\241\210\345\210\227\350\241\250.vw"
index 359d913..9f88591 100644
--- "a/_Main/UI/MacroPlannerWebApp/Views/\345\241\253\344\272\247\346\226\271\346\241\210\345\210\227\350\241\250.vw"
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\345\241\253\344\272\247\346\226\271\346\241\210\345\210\227\350\241\250.vw"
@@ -180,10 +180,10 @@
     userconfigurableinformation
     {
     }
+    group: ''
     index: 0
     image: ''
     page: ''
-    group: ''
     description: ''
   }
   formatversion: 2
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
new file mode 100644
index 0000000..64db9ed
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
@@ -0,0 +1,777 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormCapacityAndSaleBudge
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudge'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudge'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 1
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudge_ListCapacityAndSaleBudge
+          {
+          }
+          FormCapacityAndSaleBudge_DataSetLevelCapacityAndSaleBudge
+          {
+            groupDepth: -1
+            column_Deleted
+            {
+              columnId: 'Deleted'
+              dataPath: 'Deleted'
+              dataType: 'boolean'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_YearNo
+            {
+              columnId: 'YearNo'
+              dataPath: 'YearNo'
+              dataType: 'number'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_OrgCode
+            {
+              columnId: 'OrgCode'
+              dataPath: 'OrgCode'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_DisplayTechnology
+            {
+              columnId: 'DisplayTechnology'
+              dataPath: 'DisplayTechnology'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_LineAndSpecification
+            {
+              columnId: 'LineAndSpecification'
+              dataPath: 'LineAndSpecification'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_ProductCode
+            {
+              columnId: 'ProductCode'
+              dataPath: 'ProductCode'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_PlaceOfProductionOfArray
+            {
+              columnId: 'PlaceOfProductionOfArray'
+              dataPath: 'PlaceOfProductionOfArray'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_PlaceOfProductionOfEvaporation
+            {
+              columnId: 'PlaceOfProductionOfEvaporation'
+              dataPath: 'PlaceOfProductionOfEvaporation'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_Resolution
+            {
+              columnId: 'Resolution'
+              dataPath: 'Resolution'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_ShippingForm
+            {
+              columnId: 'ShippingForm'
+              dataPath: 'ShippingForm'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_NumberOfCut
+            {
+              columnId: 'NumberOfCut'
+              dataPath: 'NumberOfCut'
+              dataType: 'string'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityEquivalent
+            {
+              columnId: 'CapacityEquivalent'
+              dataPath: 'CapacityEquivalent'
+              dataType: 'string'
+              index: 12
+              subtotals: ''
+              width: 150
+            }
+            column_NumberOfMask
+            {
+              columnId: 'NumberOfMask'
+              dataPath: 'NumberOfMask'
+              dataType: 'string'
+              index: 13
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth1
+            {
+              columnId: 'CapacityInPCSInMonth1'
+              dataPath: 'CapacityInPCSInMonth1'
+              dataType: 'real'
+              index: 14
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth2
+            {
+              columnId: 'CapacityInPCSInMonth2'
+              dataPath: 'CapacityInPCSInMonth2'
+              dataType: 'real'
+              index: 15
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth3
+            {
+              columnId: 'CapacityInPCSInMonth3'
+              dataPath: 'CapacityInPCSInMonth3'
+              dataType: 'real'
+              index: 16
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth4
+            {
+              columnId: 'CapacityInPCSInMonth4'
+              dataPath: 'CapacityInPCSInMonth4'
+              dataType: 'real'
+              index: 17
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth5
+            {
+              columnId: 'CapacityInPCSInMonth5'
+              dataPath: 'CapacityInPCSInMonth5'
+              dataType: 'real'
+              index: 18
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth6
+            {
+              columnId: 'CapacityInPCSInMonth6'
+              dataPath: 'CapacityInPCSInMonth6'
+              dataType: 'real'
+              index: 19
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth7
+            {
+              columnId: 'CapacityInPCSInMonth7'
+              dataPath: 'CapacityInPCSInMonth7'
+              dataType: 'real'
+              index: 20
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth8
+            {
+              columnId: 'CapacityInPCSInMonth8'
+              dataPath: 'CapacityInPCSInMonth8'
+              dataType: 'real'
+              index: 21
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth9
+            {
+              columnId: 'CapacityInPCSInMonth9'
+              dataPath: 'CapacityInPCSInMonth9'
+              dataType: 'real'
+              index: 22
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth10
+            {
+              columnId: 'CapacityInPCSInMonth10'
+              dataPath: 'CapacityInPCSInMonth10'
+              dataType: 'real'
+              index: 23
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth11
+            {
+              columnId: 'CapacityInPCSInMonth11'
+              dataPath: 'CapacityInPCSInMonth11'
+              dataType: 'real'
+              index: 24
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSInMonth12
+            {
+              columnId: 'CapacityInPCSInMonth12'
+              dataPath: 'CapacityInPCSInMonth12'
+              dataType: 'real'
+              index: 25
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInPCSTotal
+            {
+              columnId: 'CapacityInPCSTotal'
+              dataPath: 'CapacityInPCSTotal'
+              dataType: 'real'
+              index: 26
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth1
+            {
+              columnId: 'CapacityInSheetInMonth1'
+              dataPath: 'CapacityInSheetInMonth1'
+              dataType: 'real'
+              index: 27
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth2
+            {
+              columnId: 'CapacityInSheetInMonth2'
+              dataPath: 'CapacityInSheetInMonth2'
+              dataType: 'real'
+              index: 28
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth3
+            {
+              columnId: 'CapacityInSheetInMonth3'
+              dataPath: 'CapacityInSheetInMonth3'
+              dataType: 'real'
+              index: 29
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth4
+            {
+              columnId: 'CapacityInSheetInMonth4'
+              dataPath: 'CapacityInSheetInMonth4'
+              dataType: 'real'
+              index: 30
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth5
+            {
+              columnId: 'CapacityInSheetInMonth5'
+              dataPath: 'CapacityInSheetInMonth5'
+              dataType: 'real'
+              index: 31
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth6
+            {
+              columnId: 'CapacityInSheetInMonth6'
+              dataPath: 'CapacityInSheetInMonth6'
+              dataType: 'real'
+              index: 32
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth7
+            {
+              columnId: 'CapacityInSheetInMonth7'
+              dataPath: 'CapacityInSheetInMonth7'
+              dataType: 'real'
+              index: 33
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth8
+            {
+              columnId: 'CapacityInSheetInMonth8'
+              dataPath: 'CapacityInSheetInMonth8'
+              dataType: 'real'
+              index: 34
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth9
+            {
+              columnId: 'CapacityInSheetInMonth9'
+              dataPath: 'CapacityInSheetInMonth9'
+              dataType: 'real'
+              index: 35
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth10
+            {
+              columnId: 'CapacityInSheetInMonth10'
+              dataPath: 'CapacityInSheetInMonth10'
+              dataType: 'real'
+              index: 36
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth11
+            {
+              columnId: 'CapacityInSheetInMonth11'
+              dataPath: 'CapacityInSheetInMonth11'
+              dataType: 'real'
+              index: 37
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetInMonth12
+            {
+              columnId: 'CapacityInSheetInMonth12'
+              dataPath: 'CapacityInSheetInMonth12'
+              dataType: 'real'
+              index: 38
+              subtotals: ''
+              width: 150
+            }
+            column_CapacityInSheetTotal
+            {
+              columnId: 'CapacityInSheetTotal'
+              dataPath: 'CapacityInSheetTotal'
+              dataType: 'real'
+              index: 39
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth1
+            {
+              columnId: 'SaleAmountInMonth1'
+              dataPath: 'SaleAmountInMonth1'
+              dataType: 'real'
+              index: 40
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth2
+            {
+              columnId: 'SaleAmountInMonth2'
+              dataPath: 'SaleAmountInMonth2'
+              dataType: 'real'
+              index: 41
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth3
+            {
+              columnId: 'SaleAmountInMonth3'
+              dataPath: 'SaleAmountInMonth3'
+              dataType: 'real'
+              index: 42
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth5
+            {
+              columnId: 'SaleAmountInMonth5'
+              dataPath: 'SaleAmountInMonth5'
+              dataType: 'real'
+              index: 43
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth4
+            {
+              columnId: 'SaleAmountInMonth4'
+              dataPath: 'SaleAmountInMonth4'
+              dataType: 'real'
+              index: 44
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth6
+            {
+              columnId: 'SaleAmountInMonth6'
+              dataPath: 'SaleAmountInMonth6'
+              dataType: 'real'
+              index: 45
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth7
+            {
+              columnId: 'SaleAmountInMonth7'
+              dataPath: 'SaleAmountInMonth7'
+              dataType: 'real'
+              index: 46
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth8
+            {
+              columnId: 'SaleAmountInMonth8'
+              dataPath: 'SaleAmountInMonth8'
+              dataType: 'real'
+              index: 47
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth9
+            {
+              columnId: 'SaleAmountInMonth9'
+              dataPath: 'SaleAmountInMonth9'
+              dataType: 'real'
+              index: 48
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth10
+            {
+              columnId: 'SaleAmountInMonth10'
+              dataPath: 'SaleAmountInMonth10'
+              dataType: 'real'
+              index: 49
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth11
+            {
+              columnId: 'SaleAmountInMonth11'
+              dataPath: 'SaleAmountInMonth11'
+              dataType: 'real'
+              index: 50
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountInMonth12
+            {
+              columnId: 'SaleAmountInMonth12'
+              dataPath: 'SaleAmountInMonth12'
+              dataType: 'real'
+              index: 51
+              subtotals: ''
+              width: 150
+            }
+            column_SaleAmountTotal
+            {
+              columnId: 'SaleAmountTotal'
+              dataPath: 'SaleAmountTotal'
+              dataType: 'real'
+              index: 52
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeCompare
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeCompare'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeCompare'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 5
+          rowSpan: 10
+          columnPosition: 5
+          columnSpan: 8
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeCompare_MatrixEditorCapacityAndSaleBudgeCompare
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeCompare.MatrixEditorCapacityAndSaleBudgeCompare'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_CellContent
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'CellContent'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'ColumnNo'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNo'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeFilterItem
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterItem'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterItem'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 3
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeFilterItem_ListCapacityAndSaleBudgeFilterItem
+          {
+          }
+          FormCapacityAndSaleBudgeFilterItem_DataSetLevelCapacityAndSaleBudgeFilterItem
+          {
+            groupDepth: -1
+            column_ItemName
+            {
+              columnId: 'ItemName'
+              dataPath: 'ItemName'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeChart
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeChart'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeChart'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 5
+          rowSpan: 11
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeChart_ChartCapacityAndSaleBudgeChart
+          {
+            SynchronizationGroup: ''
+          }
+          FormCapacityAndSaleBudgeChart_ChartCapacityAndSaleBudgeChart_legend
+          {
+            LegendItems:
+            [
+            ]
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 5
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+          {
+          }
+          FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_DataSetLevelCapacityAndSaleBudgeFilterPlaceOfProductionOfArray
+          {
+            groupDepth: -1
+            column_PlaceOfProductionOfArray
+            {
+              columnId: 'PlaceOfProductionOfArray'
+              dataPath: 'PlaceOfProductionOfArray'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeFilterYear
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterYear'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterYear'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 7
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeFilterYear_ListCapacityAndSaleBudgeFilterYear
+          {
+          }
+          FormCapacityAndSaleBudgeFilterYear_DataSetLevelCapacityAndSaleBudgeFilterYear
+          {
+            groupDepth: -1
+            column_YearNo
+            {
+              columnId: 'YearNo'
+              dataPath: 'YearNo'
+              dataType: 'number'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeFilterBusinessType
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterBusinessType'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterBusinessType'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 11
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeFilterBusinessType_ListCapacityAndSaleBudgeFilterBusinessType
+          {
+          }
+          FormCapacityAndSaleBudgeFilterBusinessType_DataSetLevelCapacityAndSaleBudgeFilterBusinessType
+          {
+            groupDepth: -1
+            column_BusinessType
+            {
+              columnId: 'BusinessType'
+              dataPath: 'BusinessType'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormCapacityAndSaleBudgeFilterMonth
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterMonth'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAndSaleBudgeFilterMonth'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 4
+          columnPosition: 9
+          columnSpan: 2
+        }
+        components
+        {
+          FormCapacityAndSaleBudgeFilterMonth_ListCapacityAndSaleBudgeFilterMonth
+          {
+          }
+          FormCapacityAndSaleBudgeFilterMonth_DataSetLevelCapacityAndSaleBudgeFilterMonth
+          {
+            groupDepth: -1
+            column_MonthNo
+            {
+              columnId: 'MonthNo'
+              dataPath: 'MonthNo'
+              dataType: 'number'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'PIG'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: '骞村害浜ч攢澶嶇洏'
+  name: '骞村害浜ч攢澶嶇洏'
+  isglobal: false
+  isroot: true
+}
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..d4e8c6a
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\346\216\245\345\217\243\346\265\213\350\257\225.vw"
@@ -0,0 +1,223 @@
+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: 16
+          columnPosition: 1
+          columnSpan: 6
+        }
+        components
+        {
+          FormInterfaceTest_PanelInterfaceOption1
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceOption2
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceOption3
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceOption4
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceTest
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_PanelInterfaceGlobal_BrokerExecuteLog
+          {
+            sizeRatio: 1
+          }
+          FormInterfaceTest_ListInterfaceTest
+          {
+          }
+          FormInterfaceTest_DataSetLevelInterfaceTest
+          {
+            groupDepth: -1
+            sort: 'IsSuccess'
+            column_ImageExecutionStatus
+            {
+              columnId: 'ImageExecutionStatus'
+              dataPath: 'ImageExecutionStatus'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 37
+            }
+            column_ExecuteUser
+            {
+              columnId: 'ExecuteUser'
+              dataPath: 'ExecuteUser'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 110
+            }
+            column_IsSuccess
+            {
+              columnId: 'IsSuccess'
+              dataPath: 'IsSuccess'
+              dataType: 'boolean'
+              index: 2
+              subtotals: ''
+              width: 96
+            }
+            column_BrokerName
+            {
+              columnId: 'BrokerName'
+              dataPath: 'BrokerName'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 229
+            }
+            column_ElementTotal
+            {
+              columnId: 'ElementTotal'
+              dataPath: 'ElementTotal'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 87
+            }
+            column_ErrorDateTime
+            {
+              columnId: 'ErrorDateTime'
+              dataPath: 'ErrorDateTime'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 121
+            }
+            column_ErrorMessage
+            {
+              columnId: 'ErrorMessage'
+              dataPath: 'ErrorMessage'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 86
+            }
+            column_ErrorNo
+            {
+              columnId: 'ErrorNo'
+              dataPath: 'ErrorNo'
+              dataType: 'number'
+              index: 7
+              subtotals: ''
+              width: 86
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_SuccessDateTime
+            {
+              columnId: 'SuccessDateTime'
+              dataPath: 'SuccessDateTime'
+              dataType: 'string'
+              index: 9
+              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
+        {
+          FormShowInterfaceData_MatrixEditorShowInterfaceData
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QTIANMA_JITUAN::FormShowInterfaceData.MatrixEditorShowInterfaceData'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Value
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Value'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'ColumnIndex'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'SKIN_TIGER'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: '鎺ュ彛娴嬭瘯'
+  name: '鎺ュ彛娴嬭瘯'
+  isglobal: false
+  isroot: true
+}
diff --git a/_var/_Main/ModelSettings/Common/Dev-21/_ROOT_Role_Dev-21.properties b/_var/_Main/ModelSettings/Common/Dev-21/_ROOT_Role_Dev-21.properties
index 89de4e7..bb46e43 100644
--- a/_var/_Main/ModelSettings/Common/Dev-21/_ROOT_Role_Dev-21.properties
+++ b/_var/_Main/ModelSettings/Common/Dev-21/_ROOT_Role_Dev-21.properties
@@ -501,7 +501,7 @@
 domainmodel.mdsstoragedefinitionmanager=template:domainmodel.mdsstoragedefinitionmanager
 domainmodel.mdsstoragedefinitionmanager.audittrailenabled=false
 domainmodel.mdsstoragedefinitionmanager.audittraillocation=
-domainmodel.mdsstoragedefinitionmanager.databaseenabled=false
+domainmodel.mdsstoragedefinitionmanager.databaseenabled=true
 domainmodel.mdsstoragedefinitionmanager.datasetstoredatasource=MacroPlanner
 domainmodel.mdsstoragedefinitionmanager.datasetstoreenabled=false
 domainmodel.mdsstoragedefinitionmanager.datasetstoreislocal=false
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc b/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc
new file mode 100644
index 0000000..9fe1031
--- /dev/null
+++ b/_var/_Main/ProjSettings/MacroPlannerWebApp/TypeConfigs/CustomerOrder.qtc
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+{
+  SelectableAttributes
+  {
+    ID
+    {
+      attribute: 'ID'
+      isactive: true
+    }
+    IsLocked
+    {
+      attribute: 'IsLocked'
+      isactive: true
+    }
+  }
+  meta_
+  {
+    type: 'CustomerOrder'
+  }
+}
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrder.vw b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrder.vw
deleted file mode 100644
index e143a99..0000000
--- a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrder.vw
+++ /dev/null
@@ -1,12 +0,0 @@
-Quintiq file version 2.0
-{
-  viewcontents
-  {
-    index: 0
-  }
-  formatversion: 2
-  id: 'FillingCapacityOrder'
-  name: 'FillingCapacityOrder'
-  isglobal: false
-  isroot: false
-}
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
index 1323ac5..5dd155f 100644
--- a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
+++ b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/FillingCapacityOrderHistorical.vw
@@ -2,6 +2,9 @@
 {
   viewcontents
   {
+    userconfigurableinformation
+    {
+    }
     forms
     {
       form_FormCustomerAndForecastOrder
@@ -417,18 +420,11 @@
         }
       }
     }
-    userconfigurableinformation
-    {
-    }
-    page: ''
-    group: ''
-    index: 15
-    image: ''
-    description: ''
+    index: 0
   }
   formatversion: 2
   id: 'FillingCapacityOrderHistorical'
   name: 'FillingCapacityOrderHistorical'
   isglobal: false
-  isroot: true
+  isroot: false
 }
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Test.vw b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Test.vw
new file mode 100644
index 0000000..1571655
--- /dev/null
+++ b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Test.vw
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormCapacityAllocationResults
+      {
+        layout
+        {
+          rowSpan: 15
+          columnPosition: 5
+          columnSpan: 8
+        }
+      }
+      form_FormCapacityAllocationResultsRuleConfiguration
+      {
+        title: 'QTIANMA_JITUAN::FormCapacityAllocationResultsRuleConfiguration'
+        shown: true
+        componentID: 'QTIANMA_JITUAN::FormCapacityAllocationResultsRuleConfiguration'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 4
+        }
+        components: null
+      }
+      form_FormPanelPullPlanReport
+      {
+        _removed: true
+      }
+    }
+  }
+  formatversion: 2
+  id: 'Test'
+  name: 'Test'
+  isglobal: false
+  isroot: false
+}

--
Gitblit v1.9.3