From 23f7cd51d607dead573dfa5b251d402d502111a2 Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期五, 26 七月 2024 16:44:14 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_ListInterfaceLoginfo.def                                                  |   42 
 _Main/BL/Type_FinishedEngineInventory/Attribute_Price.qbl                                                                                      |    8 
 Calendars/BL/Type_LibCal_Participation/Method_CreateTimeInterval.qbl                                                                           |    1 
 _Main/BL/Type_FinishedEngineInventory/Attribute_VehicleType.qbl                                                                                |    8 
 _Main/BL/Type_LibCal_Subscription/_ROOT_Type_LibCal_Subscription.qbl                                                                           |    6 
 _Main/BL/Type_InterfaceLoginfo/Attribute_ReturnMsg.qbl                                                                                         |    8 
 _Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl                                                                     |    6 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl                                                                     |   97 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def                               |   20 
 _Main/BL/Type_InterfaceLoginfo/Attribute_ExecuteUser.qbl                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def                          |   20 
 _Main/BL/Type_ShippingActualData/Attribute_CreateTime.qbl                                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuInterface_OnClick.def             |   16 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl                                                                 |    7 
 _Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterface.qbl                                                                                  |   86 
 _Main/BL/Type_LibCal_SubscriberEventRow/Method_InitializeDate.qbl                                                                              |   76 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl                                                                       |    5 
 _Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_ListFinishedEngineInventory.def                                    |   42 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def          |   20 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl                                                                              |    7 
 _Main/BL/Type_FinishedEngineInventory/Attribute_FullName.qbl                                                                                   |    8 
 _Main/BL/Type_FinishedEngineInventory/Attribute_SpellName.qbl                                                                                  |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl                                                                    |    7 
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl                                                                  |    2 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuDelete_OnClick.def                                         |   19 
 _Main/BL/Type_FinishedEngineInventory/Attribute_Amount.qbl                                                                                     |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl                                                                     |   44 
 _Main/BL/Type_FinishedEngineInventory/Attribute_BIPlace.qbl                                                                                    |    8 
 _Main/BL/Type_InterfaceLoginfo/DefaultValue_Name.qbl                                                                                           |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def                                                   |   72 
 _Main/BL/Type_InterfaceLoginfo/Attribute_Message.qbl                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def                                  |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison#1.def                      |   10 
 _Main/BL/Relations/Relation_ShippingActualCell_ShippingActualColumn_ShippingActualColumn_Shippi.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def                                                      |   16 
 _Main/UI/MacroPlannerWebApp/Views/Finished_engine_inventory.vw                                                                                 |  200 ++
 _Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl                                                                              |   13 
 _Main/BL/Type_MachineStockData/StaticMethod_GetRequestBody.qbl                                                                                 |   15 
 _Main/BL/Type_FinishedEngineInventory/Attribute_Fac.qbl                                                                                        |    8 
 _Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl                                                                             |   16 
 Calendars/BL/Type_LibCal_Participation/Method_UpdateRecurrencePeriod.qbl                                                                       |    2 
 _Main/BL/Type_ShippingActualColumn/Attribute_Index.qbl                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixeditorContextMenuTable.def                                        |   10 
 _Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl                                                     |    9 
 Calendars/BL/Type_LibCal_LeadingParticipation/Method_UpdateCalendarWhenChanged.qbl                                                             |    2 
 _Main/BL/Type_FinishedEngineInventory/Attribute_Total.qbl                                                                                      |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl                                                                         |   36 
 Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences.qbl                                                                               |    2 
 _Main/BL/Type_ShippingActualData/Attribute_FourCode.qbl                                                                                        |    8 
 _Main/BL/Type_MachineStockData/Attribute_MaterialName.qbl                                                                                      |    8 
 _Main/BL/Type_LibCal_SubscriberEventRow/Function_CalcName.qbl                                                                                  |   13 
 _Main/BL/Type_ActualDailyProductionReport/Attribute_Product.qbl                                                                                |    8 
 _Main/BL/Type_MachineStockData/Attribute_Inventory.qbl                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bShippingActualData_OnClick.def   |   16 
 _Main/BL/Type_FinishedEngineInventory/Attribute_Brand.qbl                                                                                      |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl                                                                |   16 
 _Main/BL/Type_ShippingActualData/_ROOT_Type_ShippingActualData.qbl                                                                             |   10 
 Calendars/BL/Relations/Relation_LibCal_ExplicitTimeInterval_LeadingETI_LibCal_ExplicitTimeInterval_.qbl                                        |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listContextMenuMachineStockData.def                                       |   10 
 _Main/BL/Type_MachineStockData/StaticMethod_GenerateData.qbl                                                                                   |   32 
 _Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl                                                                                 |   75 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl                                                                         |  118 +
 _Main/BL/Type_FinishedEngineInventory/DefaultValue_Fac.qbl                                                                                     |    6 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl                                                                      |   32 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_dsEndDate_OnChanged.def                                 |   30 
 _Main/BL/Type_ShippingActualCell/_ROOT_Type_ShippingActualCell.qbl                                                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/_ROOT_Component_FormMachineStockData.def                                            |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def                              |   26 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateEvent#778.def                                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def                                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuEdit_OnClick.def                                           |   21 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                               |   11 
 _Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw                                                                           |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def                                                     |   14 
 _Main/BL/Relations/Relation_ActualDailyProductionData_MacroPlan_MacroPlan_ActualDailyProduction.qbl                                            |   23 
 _Main/BL/Type_ShippingActualRow/_ROOT_Type_ShippingActualRow.qbl                                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def                               |   16 
 _Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI0.qbl                                                                                |   94 +
 _Main/BL/Type_LibCal_SubscriberEventRow/Method_GetTimeByTimeUnit.qbl                                                                           |   22 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateUpdateEventAndParticipation.def                                     |    4 
 _Main/UI/MacroPlannerWebApp/Views/Machine_stock_data.vw                                                                                        |  119 +
 _Main/BL/Type_InterfaceLoginfo/Attribute_Name.qbl                                                                                              |    8 
 _Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_Export.qbl                                                                              |  107 
 _Main/BL/Type_ActualDailyProductionReport/Attribute_ProductLine.qbl                                                                            |    8 
 _Main/BL/Type_ShippingActualData/StaticMethod_GetRequestBody.qbl                                                                               |   15 
 _Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl                                                                                            |    7 
 _Main/BL/Relations/Relation_FinishedEngineInventory_InterfaceLoginfo_InterfaceLoginfo_FinishedE.qbl                                            |   23 
 _Main/BL/Type_InterfaceLoginfo/DefaultValue_Response.qbl                                                                                       |    6 
 Calendars/BL/Type_LibCal_LeadingParticipation/Method_SetSubscribers.qbl                                                                        |    2 
 _Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl                                                                                           |   62 
 _Main/BL/Type_InterfaceLoginfo/Attribute_TotalRow.qbl                                                                                          |    8 
 _Main/BL/Type_MachineStockData/Attribute_Total.qbl                                                                                             |    7 
 _Main/BL/Type_ShippingActualData/Attribute_DDay.qbl                                                                                            |    8 
 _Main/BL/Type_MachineStockData/Attribute_FacName.qbl                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_CreateEvent#791.def                                                               |    7 
 _Main/BL/Type_LibCal_Subscription/Method_CopyOccurrences#486.qbl                                                                               |   33 
 _Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftSequence.qbl                                                                          |    8 
 _Main/BL/Type_InterfaceLoginfo/Attribute_ReturnSuccess.qbl                                                                                     |    7 
 _Main/BL/Type_ActualDailyProductionReport/Attribute_ProductionVolume.qbl                                                                       |    8 
 _Main/BL/Relations/Relation_InterfaceLoginfo_InterfaceDataset_InterfaceDataset_InterfaceLoginfo.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter#119.def                                                  |   96 +
 _Main/BL/Type_ActualDailyProductionReport/Attribute_Shift.qbl                                                                                  |    8 
 _Main/BL/Type_LibCal_ExplicitTimeInterval/StaticMethod_Delete.qbl                                                                              |   26 
 _Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl                                                                           |   16 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_PanelHeader#144.def                                                    |   69 
 _Main/BL/Type_InterfaceLoginfo/Attribute_Success.qbl                                                                                           |    7 
 _Main/BL/Type_InterfaceLoginfo/Attribute_Last.qbl                                                                                              |    8 
 Calendars/BL/Type_LibCal_LeadingParticipation/Method_AddSubscribers.qbl                                                                        |    1 
 _Main/BL/Relations/Relation_MachineStockData_InterfaceLoginfo_InterfaceLoginfo_MachineStockData.qbl                                            |   23 
 _Main/BL/Type_FinishedEngineInventory/StaticMethod_GenerateData.qbl                                                                            |   50 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison#1.def                        |   10 
 _Main/BL/Type_FinishedEngineInventory/Attribute_EngineModularPlatform.qbl                                                                      |    8 
 _Main/BL/InfoMessages.qbl                                                                                                                      |   68 
 _Main/BL/Type_InterfaceLoginfo/StaticMethod_CallToken.qbl                                                                                      |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick#613.def                            |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_ButtonRibbon_OnClick.def                               |   16 
 _Main/BL/Type_FinishedEngineInventory/_ROOT_Type_FinishedEngineInventory.qbl                                                                   |   10 
 _Main/BL/Type_InterfaceLoginfo/_ROOT_Type_InterfaceLoginfo.qbl                                                                                 |    9 
 Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences#486.qbl                                                                           |    2 
 _Main/BL/Type_InterfaceDataset/StaticMethod_GetResponseJsonData.qbl                                                                            |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listActionBarPageFinishedEngineInventory.def                       |   10 
 _Main/BL/Type_FinishedEngineInventory/Attribute_DType.qbl                                                                                      |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listContextMenuFinishedEngineInventory.def                         |   10 
 _Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_GetDefaultName.qbl                                                                      |   10 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl                                                              |   39 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def                             |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def                                                  |    1 
 _Main/BL/Type_MachineStockData/Attribute_Unit.qbl                                                                                              |    8 
 _Main/BL/Type_MachineStockData/Attribute_AllTotal.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuMachineStockData_OnClick.def      |   16 
 _Main/BL/Type_MachineStockData/Attribute_DDay.qbl                                                                                              |    8 
 _Main/BL/Type_ShippingActualData/Attribute_ID.qbl                                                                                              |    8 
 _Main/BL/Type_ShippingActualColumn/Attribute_StartDate.qbl                                                                                     |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listActionBarPageMachineStockData.def                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_MatrixEditorTable.def                                                   |   97 +
 _Main/BL/Type_FinishedEngineInventory/Attribute_EngineType.qbl                                                                                 |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelTable.def                                                          |   14 
 _Main/BL/Type_FinishedEngineInventory/Attribute_ReceiptPlace.qbl                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def                                           |   13 
 _Main/BL/Type_InterfaceLoginfo/Attribute_RequestBody.qbl                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Response_PanelButton_ButtonButton_OnClick.def                                     |   24 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/_ROOT_Component_FormInterfaceLoginfo.def                                            |   17 
 _Main/BL/Type_MachineStockData/Attribute_LineType.qbl                                                                                          |    8 
 _Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw                                                                               |  116 +
 _Main/BL/Type_LibCal_SubscriberEventColumn/Method_GetCellByTimeUnit.qbl                                                                        |   19 
 _Main/BL/Type_ShippingActualData/StaticMethod_Synchronize.qbl                                                                                  |   74 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison#634.def                                        |   84 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl                                                                                 |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def                |   16 
 _Main/BL/Type_InterfaceLoginfo/DefaultValue_Message.qbl                                                                                        |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def                             |   16 
 _Main/BL/Type_MachineStockData/Attribute_Fac.qbl                                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Component_pnlEventType.def                                                               |    3 
 _Main/BL/Type_FinishedEngineInventory/StaticMethod_GetRequestBody.qbl                                                                          |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/_ROOT_Component_FormFinishedEngineInventory.def                              |   17 
 _Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_ListMachineStockData.def                                                  |   42 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_EditEvent.def                                                                     |    9 
 _Main/BL/Type_ShippingActualRow/Attribute_Name.qbl                                                                                             |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl                                                                        |   30 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor#988.def                                                 |  102 +
 _Main/BL/Type_LibCal_Event/StaticMethod_ValidDate.qbl                                                                                          |   26 
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl                                                                           |   34 
 _Main/BL/Type_MachineStockData/Attribute_Product.qbl                                                                                           |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/_ROOT_Component_FormShippingActualData.def                                        |   18 
 _Main/BL/Type_ShippingActualRow/Attribute_RowNr.qbl                                                                                            |    7 
 _Main/BL/Type_FinishedEngineInventory/Attribute_DWeek.qbl                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def                                                |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelButton.def                                                         |   25 
 _Main/BL/Type_ShippingActualData/StaticMethod_Export.qbl                                                                                       |   64 
 _Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftProductionVolume.qbl                                                                  |    8 
 _Main/BL/Relations/Relation_ShippingActualCell_ShippingActualRow_ShippingActualRow_ShippingActu.qbl                                            |   23 
 _Main/BL/Type_FinishedEngineInventory/Attribute_DDay.qbl                                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonSearch_OnClick.def                               |   26 
 _Main/BL/Type_ShippingActualData/StaticMethod_GenerateData.qbl                                                                                 |   29 
 _Main/BL/Type_MachineStockData/Attribute_MaterialNo.qbl                                                                                        |    8 
 _Main/BL/Type_FinishedEngineInventory/StaticMethod_Synchronize.qbl                                                                             |   33 
 _Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Name.qbl                                                                                     |    8 
 _Main/BL/Type_LibCal_ExplicitTimeInterval/_ROOT_Type_LibCal_ExplicitTimeInterval.qbl                                                           |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def     |   21 
 _Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixEditorActionBarPageTable.def                                      |   10 
 _Main/BL/Relations/Relation_ShippingActualColumn_InterfaceDataset_InterfaceDataset_ShippingActu.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ckbIsAllDay_OnChanged.def                               |   17 
 _Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_TimeUnit.qbl                                                                              |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl                                                                 |    6 
 _Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw                                                                                               |  175 ++
 _Main/BL/Type_ActualDailyProductionReport/_ROOT_Type_ActualDailyProductionData.qbl                                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listContextMenuInterfaceLoginfo.def                                       |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def                                             |   28 
 _Main/BL/Type_LocalColumn/Function_CalcDate.qbl                                                                                                |    2 
 _Main/BL/Type_InterfaceLoginfo/Attribute_InterfaceDateTime.qbl                                                                                 |    8 
 _Main/BL/Relations/Relation_ShippingActualRow_InterfaceDataset_InterfaceDataset_ShippingActualR.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuFinishedEngineInventory_OnCli.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_listContextMenu967.def                                                 |   25 
 Calendars/BL/Type_LibCal_Participation/Attribute_EndTime.qbl                                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Views/Interface_loginfo_view.vw                                                                                    |  146 +
 _Main/BL/Type_ActualDailyProductionReport/Attribute_Date.qbl                                                                                   |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl                                                              |    6 
 _Main/BL/Type_ShippingActualColumn/_ROOT_Type_ShippingActualColumn.qbl                                                                         |   10 
 _Main/BL/Type_MachineStockData/Attribute_Date.qbl                                                                                              |    7 
 _Main/BL/Type_MachineStockData/StaticMethod_Synchronize.qbl                                                                                    |   33 
 _Main/BL/Type_ShippingActualData/Attribute_Fac.qbl                                                                                             |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def                                                   |   14 
 Calendars/BL/Type_LibCal_LeadingParticipation/Method_Update.qbl                                                                                |    2 
 Calendars/BL/Type_LibCal_Event/Method_UpdateRecurrencePattern.qbl                                                                              |    2 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_ShowAllDay.def                                                            |   63 
 _Main/BL/Type_MachineStockData/_ROOT_Type_MachineStockData.qbl                                                                                 |   10 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ButtonCreate_OnClick.def                                |    4 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_SetParticipationData.def                                                  |    1 
 _Main/BL/Type_LocalColumn/Function_CalcIndex.qbl                                                                                               |   25 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def          |   16 
 _Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def                                                           |   23 
 _Main/BL/Type_ActualDailyProductionReport/StaticMethod_Synchronize.qbl                                                                         |   31 
 _Main/BL/Type_FinishedEngineInventory/Attribute_FourCode.qbl                                                                                   |    8 
 _Main/BL/Type_LocalColumn/Attribute_CustomDate.qbl                                                                                             |    7 
 _Main/BL/Type_ActualDailyProductionReport/StaticMethod_GetRequestBody.qbl                                                                      |   15 
 _Main/BL/Type_ShippingActualData/Attribute_Quantity.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def                              |   20 
 _Main/BL/Type_InterfaceLoginfo/Attribute_FinishTime.qbl                                                                                        |    8 
 _Main/BL/Relations/Relation_InterfaceLoginfo_ShippingActualData_ShippingActualData_InterfaceLog.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuInterface.def                                               |   46 
 _Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def                               |    4 
 _Main/BL/Type_ShippingActualCell/Attribute_Quantity.qbl                                                                                        |    7 
 _Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl                                                                                         |    7 
 _Main/BL/Type_InterfaceLoginfo/Method_UpdateLast.qbl                                                                                           |   15 
 _Main/UI/MacroPlannerWebApp/Views/Shipping_actual_data_view.vw                                                                                 |   92 +
 _Main/BL/Type_LibCal_Event/Attribute_IsMultiple.qbl                                                                                            |    8 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                                                            |   14 
 _Main/BL/Type_LibCal_SubscriberEventTable/Method_GetColumnByTimeUnit.qbl                                                                       |   18 
 _Main/BL/Type_FinishedEngineInventory/Attribute_DMonth.qbl                                                                                     |    7 
 /dev/null                                                                                                                                      |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listActionBarPageInterfaceLoginfo.def                                     |   10 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                                                   |   22 
 _Main/BL/Type_InterfaceLoginfo/Attribute_Response.qbl                                                                                          |    8 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl                                                                                |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def                               |   16 
 _Main/BL/Type_ShippingActualData/StaticMethod_GetDefalutName.qbl                                                                               |   10 
 237 files changed, 4,974 insertions(+), 234 deletions(-)

diff --git a/Calendars/BL/Relations/Relation_LibCal_ExplicitTimeInterval_LeadingETI_LibCal_ExplicitTimeInterval_.qbl b/Calendars/BL/Relations/Relation_LibCal_ExplicitTimeInterval_LeadingETI_LibCal_ExplicitTimeInterval_.qbl
index cbcdcd6..a4b389d 100644
--- a/Calendars/BL/Relations/Relation_LibCal_ExplicitTimeInterval_LeadingETI_LibCal_ExplicitTimeInterval_.qbl
+++ b/Calendars/BL/Relations/Relation_LibCal_ExplicitTimeInterval_LeadingETI_LibCal_ExplicitTimeInterval_.qbl
@@ -12,7 +12,6 @@
     Cardinality: '0to1'
     ObjectDefinition: LibCal_ExplicitTimeInterval
     OwningSide: 'Reference'
-    InterfaceProperties { Accessibility: 'Module' }
   }
   RelationSide.RightSide SubscribingETI
   {
@@ -20,6 +19,5 @@
     Cardinality: '1toN'
     ObjectDefinition: LibCal_ExplicitTimeInterval
     OwningSide: 'Reference'
-    InterfaceProperties { Accessibility: 'Module' }
   }
 }
diff --git a/Calendars/BL/Type_LibCal_Event/Method_UpdateRecurrencePattern.qbl b/Calendars/BL/Type_LibCal_Event/Method_UpdateRecurrencePattern.qbl
index d6a1681..b7ff364 100644
--- a/Calendars/BL/Type_LibCal_Event/Method_UpdateRecurrencePattern.qbl
+++ b/Calendars/BL/Type_LibCal_Event/Method_UpdateRecurrencePattern.qbl
@@ -74,5 +74,5 @@
     // Directly update the relation from the Participations to the RecurrencePattern.
     Transaction::Transaction().Propagate( relation( LibCal_Participation, RecurrencePattern ) );
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_AddSubscribers.qbl b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_AddSubscribers.qbl
index f4cb80f..3b07e04 100644
--- a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_AddSubscribers.qbl
+++ b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_AddSubscribers.qbl
@@ -14,5 +14,4 @@
       this.AddSubscriber( subscriber, useLeadingPeriod_i );
     }
   *]
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_SetSubscribers.qbl b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_SetSubscribers.qbl
index 4071c7b..5ca83a8 100644
--- a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_SetSubscribers.qbl
+++ b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_SetSubscribers.qbl
@@ -11,5 +11,5 @@
     
     this.SetSubscribers( subscribers_i, useLeadingPeriod );
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_Update.qbl b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_Update.qbl
index ebecee3..4b6137d 100644
--- a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_Update.qbl
+++ b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_Update.qbl
@@ -36,5 +36,5 @@
       subscription.EndDate(   endDate_i   );
     }
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_UpdateCalendarWhenChanged.qbl b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_UpdateCalendarWhenChanged.qbl
index ec75609..d62346e 100644
--- a/Calendars/BL/Type_LibCal_LeadingParticipation/Method_UpdateCalendarWhenChanged.qbl
+++ b/Calendars/BL/Type_LibCal_LeadingParticipation/Method_UpdateCalendarWhenChanged.qbl
@@ -9,5 +9,5 @@
     onlyWhenChanged := true;
     this.UpdateCalendar( onlyWhenChanged );
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/Calendars/BL/Type_LibCal_Participation/Attribute_EndTime.qbl b/Calendars/BL/Type_LibCal_Participation/Attribute_EndTime.qbl
index 845cbc7..1b2a5c7 100644
--- a/Calendars/BL/Type_LibCal_Participation/Attribute_EndTime.qbl
+++ b/Calendars/BL/Type_LibCal_Participation/Attribute_EndTime.qbl
@@ -5,5 +5,4 @@
   #keys: '3[131094.0.1190114209][131094.0.1190114208][131094.0.1190114210]'
   Description: 'EndTime of the event. Is only relevant for non-recurring events.'
   ValueType: DateTime
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/Calendars/BL/Type_LibCal_Participation/Method_CreateTimeInterval.qbl b/Calendars/BL/Type_LibCal_Participation/Method_CreateTimeInterval.qbl
index 17e54df..462efa6 100644
--- a/Calendars/BL/Type_LibCal_Participation/Method_CreateTimeInterval.qbl
+++ b/Calendars/BL/Type_LibCal_Participation/Method_CreateTimeInterval.qbl
@@ -19,5 +19,4 @@
     
     return timeInterval;
   *]
-  InterfaceProperties { Accessibility: 'Module' }
 }
diff --git a/Calendars/BL/Type_LibCal_Participation/Method_UpdateRecurrencePeriod.qbl b/Calendars/BL/Type_LibCal_Participation/Method_UpdateRecurrencePeriod.qbl
index 603dca4..ce015ce 100644
--- a/Calendars/BL/Type_LibCal_Participation/Method_UpdateRecurrencePeriod.qbl
+++ b/Calendars/BL/Type_LibCal_Participation/Method_UpdateRecurrencePeriod.qbl
@@ -50,5 +50,5 @@
     // this.CalcIsRecurring(); is not good enough here, explicit propagation is required.
     Transaction::Transaction().Propagate( attribute( LibCal_Participation, IsRecurring ) );
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git "a/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl" "b/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl"
index 12a9e5e..909a395 100644
--- "a/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl"
+++ "b/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl"
@@ -31,5 +31,5 @@
       }
     }
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences.qbl b/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences.qbl
index 5a597dd..baaaa38 100644
--- a/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences.qbl
+++ b/Calendars/BL/Type_LibCal_Subscription/Method_CopyOccurrences.qbl
@@ -28,5 +28,5 @@
       }            
     }
   *]
-  InterfaceProperties { Accessibility: 'Module' }
+  InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl b/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl
new file mode 100644
index 0000000..066ff70
--- /dev/null
+++ b/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Daemon MachineStockInterface
+{
+  Frequency: P1DT0H0M0S
+  Priority: 'Default'
+  StartDate: 2024-07-19
+  StartTimeOfDay: P0DT9H0M0S
+  Text:
+  [*
+    options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
+    mdskey := DatasetController::FindUnique( options );
+    
+    MDSInterfaceDataset::Root( mdskey ) -> MachineStockData::Synchronize( "Administrator" );
+  *]
+}
diff --git a/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl b/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl
new file mode 100644
index 0000000..d62eedf
--- /dev/null
+++ b/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+Daemon ShippingActualInterface
+{
+  Frequency: P1DT0H0M0S
+  Priority: 'Default'
+  StartDate: 2024-07-19
+  StartTimeOfDay: P0DT23H30M0S
+  Text:
+  [*
+    options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
+    mdskey := DatasetController::FindUnique( options );
+    
+    MDSInterfaceDataset::Root( mdskey ) -> ShippingActualData::Synchronize( "Administrator" );
+  *]
+}
diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index 2e0fc10..9e8ee99 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -86,6 +86,66 @@
   {
     DefaultText: 'There are duplicate three digit codes present'
   }
+  InfoMessage InterfaceDataset_ActualDailyProductionData_Name
+  {
+    DefaultText: 'Actual daily production data'
+  }
+  InfoMessage InterfaceDataset_ActualDailyProductionData_Secret
+  {
+    DefaultText: '527086842571391021'
+  }
+  InfoMessage InterfaceDataset_ActualDailyProductionData_URL
+  {
+    DefaultText: '/data-service/api/service/post-data/V1.101/e014325a6be14dab818303ef90c2968a'
+  }
+  InfoMessage InterfaceDataset_Address
+  {
+    DefaultText: 'ds-yunrong-gw.dmp.vwfawedl.mobi'
+  }
+  InfoMessage InterfaceDataset_ContentType
+  {
+    DefaultText: 'application/json'
+  }
+  InfoMessage InterfaceDataset_FinishedEngineInventory_Name
+  {
+    DefaultText: 'Finished engine inventory'
+  }
+  InfoMessage InterfaceDataset_FinishedEngineInventory_Secret
+  {
+    DefaultText: '527100497300029474'
+  }
+  InfoMessage InterfaceDataset_FinishedEngineInventory_URL
+  {
+    DefaultText: '/data-service/api/service/post-data/V1.101/f084aa52d19c48d090416936a94f1dab'
+  }
+  InfoMessage InterfaceDataset_MachineStockData_Name
+  {
+    DefaultText: 'Machine stock data'
+  }
+  InfoMessage InterfaceDataset_MachineStockData_Secret
+  {
+    DefaultText: '527077575449641087'
+  }
+  InfoMessage InterfaceDataset_MachineStockData_URL
+  {
+    DefaultText: '/data-service/api/service/post-data/V1.101/2f6c42fe895c45bdb2e8e1ca8489b5a2'
+  }
+  InfoMessage InterfaceDataset_ShippingActualData_Name
+  {
+    DefaultText: 'Shipping actual data'
+  }
+  InfoMessage InterfaceDataset_ShippingActualData_Secret
+  {
+    DefaultText: '527088907855069215'
+  }
+  InfoMessage InterfaceDataset_ShippingActualData_URL
+  {
+    DefaultText: '/data-service/api/service/post-data/V1.101/f4f94c47c1a2440898b5e1e2c0c5cbc8'
+  }
+  InfoMessage InterfaceDataset_Token_URL
+  {
+    DefaultText: '/authorization/token/api/open/token/generateToken?grant_type=client_credentials&client_id=19KxoxPF25cy96K8TL&client_secret='
+  }
   InfoMessage MP_ChangeLossSetting_CheckNull
   {
     DefaultText: 'The required field is blank.'
@@ -142,6 +202,14 @@
   {
     DefaultText: 'The Event type of binding Event exists.'
   }
+  InfoMessage MP_LibCal_Event_ValidDate
+  {
+    DefaultText: 'This date is not within the planned cycle!'
+  }
+  InfoMessage MP_LibCal_Event_ValidDatePeriod
+  {
+    DefaultText: 'The start date must be less than the end date!'
+  }
   InfoMessage MP_Routing_IllegalDateRange
   {
     DefaultText: 'The start date cannot be longer than the end date.'
diff --git a/_Main/BL/Relations/Relation_ActualDailyProductionData_MacroPlan_MacroPlan_ActualDailyProduction.qbl b/_Main/BL/Relations/Relation_ActualDailyProductionData_MacroPlan_MacroPlan_ActualDailyProduction.qbl
new file mode 100644
index 0000000..02387dc
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ActualDailyProductionData_MacroPlan_MacroPlan_ActualDailyProduction.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ActualDailyProductionData_MacroPlan_MacroPlan_ActualDailyProductionData
+{
+  #keys: '1[412672.1.61744699]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[412672.1.61744701][412672.1.61744700][412672.1.61744702]'
+    Cardinality: '0to1'
+    ObjectDefinition: ActualDailyProductionData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ActualDailyProductionData
+  {
+    #keys: '3[412672.1.61744704][412672.1.61744703][412672.1.61744705]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_FinishedEngineInventory_InterfaceLoginfo_InterfaceLoginfo_FinishedE.qbl b/_Main/BL/Relations/Relation_FinishedEngineInventory_InterfaceLoginfo_InterfaceLoginfo_FinishedE.qbl
new file mode 100644
index 0000000..4a1f713
--- /dev/null
+++ b/_Main/BL/Relations/Relation_FinishedEngineInventory_InterfaceLoginfo_InterfaceLoginfo_FinishedE.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation FinishedEngineInventory_InterfaceLoginfo_InterfaceLoginfo_FinishedEngineInventory
+{
+  #keys: '1[415136.0.932110028]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceLoginfo
+  {
+    #keys: '3[415136.0.932110030][415136.0.932110029][415136.0.932110031]'
+    Cardinality: '0to1'
+    ObjectDefinition: FinishedEngineInventory
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide FinishedEngineInventory
+  {
+    #keys: '3[415136.0.932110033][415136.0.932110032][415136.0.932110034]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceLoginfo
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InterfaceLoginfo_InterfaceDataset_InterfaceDataset_InterfaceLoginfo.qbl b/_Main/BL/Relations/Relation_InterfaceLoginfo_InterfaceDataset_InterfaceDataset_InterfaceLoginfo.qbl
new file mode 100644
index 0000000..c164a29
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InterfaceLoginfo_InterfaceDataset_InterfaceDataset_InterfaceLoginfo.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InterfaceLoginfo_InterfaceDataset_InterfaceDataset_InterfaceLoginfo
+{
+  #keys: '1[415136.0.917964687]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[415136.0.917964689][415136.0.917964688][415136.0.917964690]'
+    Cardinality: '0to1'
+    ObjectDefinition: InterfaceLoginfo
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide InterfaceLoginfo
+  {
+    #keys: '3[415136.0.917964692][415136.0.917964691][415136.0.917964693]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_InterfaceLoginfo_ShippingActualData_ShippingActualData_InterfaceLog.qbl b/_Main/BL/Relations/Relation_InterfaceLoginfo_ShippingActualData_ShippingActualData_InterfaceLog.qbl
new file mode 100644
index 0000000..8de99d2
--- /dev/null
+++ b/_Main/BL/Relations/Relation_InterfaceLoginfo_ShippingActualData_ShippingActualData_InterfaceLog.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation InterfaceLoginfo_ShippingActualData_ShippingActualData_InterfaceLoginfo
+{
+  #keys: '1[415136.0.917964760]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ShippingActualData
+  {
+    #keys: '3[415136.0.917964762][415136.0.917964761][415136.0.917964763]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceLoginfo
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide InterfaceLoginfo
+  {
+    #keys: '3[415136.0.917964765][415136.0.917964764][415136.0.917964766]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShippingActualData
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MachineStockData_InterfaceLoginfo_InterfaceLoginfo_MachineStockData.qbl b/_Main/BL/Relations/Relation_MachineStockData_InterfaceLoginfo_InterfaceLoginfo_MachineStockData.qbl
new file mode 100644
index 0000000..178bddd
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MachineStockData_InterfaceLoginfo_InterfaceLoginfo_MachineStockData.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MachineStockData_InterfaceLoginfo_InterfaceLoginfo_MachineStockData
+{
+  #keys: '1[415136.0.931886865]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceLoginfo
+  {
+    #keys: '3[415136.0.931886867][415136.0.931886866][415136.0.931886868]'
+    Cardinality: '0to1'
+    ObjectDefinition: MachineStockData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MachineStockData
+  {
+    #keys: '3[415136.0.931886870][415136.0.931886869][415136.0.931886871]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceLoginfo
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualColumn_ShippingActualColumn_Shippi.qbl b/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualColumn_ShippingActualColumn_Shippi.qbl
new file mode 100644
index 0000000..66cccdd
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualColumn_ShippingActualColumn_Shippi.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ShippingActualCell_ShippingActualColumn_ShippingActualColumn_ShippingActualCell
+{
+  #keys: '1[415136.0.904040097]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ShippingActualColumn
+  {
+    #keys: '3[415136.0.904040099][415136.0.904040098][415136.0.904040100]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShippingActualCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ShippingActualCell
+  {
+    #keys: '3[415136.0.904040102][415136.0.904040101][415136.0.904040103]'
+    Cardinality: '1toN'
+    ObjectDefinition: ShippingActualColumn
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualRow_ShippingActualRow_ShippingActu.qbl b/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualRow_ShippingActualRow_ShippingActu.qbl
new file mode 100644
index 0000000..a39c361
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ShippingActualCell_ShippingActualRow_ShippingActualRow_ShippingActu.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ShippingActualCell_ShippingActualRow_ShippingActualRow_ShippingActualCell
+{
+  #keys: '1[415136.0.904040084]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ShippingActualRow
+  {
+    #keys: '3[415136.0.904040086][415136.0.904040085][415136.0.904040087]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShippingActualCell
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ShippingActualCell
+  {
+    #keys: '3[415136.0.904040089][415136.0.904040088][415136.0.904040090]'
+    Cardinality: '1toN'
+    ObjectDefinition: ShippingActualRow
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ShippingActualColumn_InterfaceDataset_InterfaceDataset_ShippingActu.qbl b/_Main/BL/Relations/Relation_ShippingActualColumn_InterfaceDataset_InterfaceDataset_ShippingActu.qbl
new file mode 100644
index 0000000..775e3fb
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ShippingActualColumn_InterfaceDataset_InterfaceDataset_ShippingActu.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ShippingActualColumn_InterfaceDataset_InterfaceDataset_ShippingActualColumn
+{
+  #keys: '1[415136.0.904040009]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[415136.0.904040011][415136.0.904040010][415136.0.904040012]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShippingActualColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ShippingActualColumn
+  {
+    #keys: '3[415136.0.904040014][415136.0.904040013][415136.0.904040015]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ShippingActualRow_InterfaceDataset_InterfaceDataset_ShippingActualR.qbl b/_Main/BL/Relations/Relation_ShippingActualRow_InterfaceDataset_InterfaceDataset_ShippingActualR.qbl
new file mode 100644
index 0000000..5bef969
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ShippingActualRow_InterfaceDataset_InterfaceDataset_ShippingActualR.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ShippingActualRow_InterfaceDataset_InterfaceDataset_ShippingActualRow
+{
+  #keys: '1[415136.0.904040037]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[415136.0.904040039][415136.0.904040038][415136.0.904040040]'
+    Cardinality: '0to1'
+    ObjectDefinition: ShippingActualRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ShippingActualRow
+  {
+    #keys: '3[415136.0.904040042][415136.0.904040041][415136.0.904040043]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_Date.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Date.qbl
new file mode 100644
index 0000000..10b9ec4
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Date.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Date
+{
+  #keys: '3[412672.1.61744627][412672.1.61744626][412672.1.61744628]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_Product.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Product.qbl
new file mode 100644
index 0000000..0ce86d2
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Product.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Product
+{
+  #keys: '3[412672.1.61744620][412672.1.61744619][412672.1.61744621]'
+  Description: '鐗╂枡鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductLine.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductLine.qbl
new file mode 100644
index 0000000..9424897
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductLine.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductLine
+{
+  #keys: '3[412672.1.61744610][412672.1.61744609][412672.1.61744611]'
+  Description: '浜х嚎'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductionVolume.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductionVolume.qbl
new file mode 100644
index 0000000..9c9a7fa
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ProductionVolume.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductionVolume
+{
+  #keys: '3[412672.1.61744637][412672.1.61744636][412672.1.61744638]'
+  Description: '瀵瑰簲鏃ユ湡鐨勫疄闄呯敓浜ф暟閲�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_Shift.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Shift.qbl
new file mode 100644
index 0000000..84de969
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_Shift.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Shift
+{
+  #keys: '3[412672.1.61744647][412672.1.61744646][412672.1.61744648]'
+  Description: '瀵瑰簲鏃ユ湡鐨勫疄闄呯敓浜х彮娆�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftProductionVolume.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftProductionVolume.qbl
new file mode 100644
index 0000000..f4cffb9
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftProductionVolume.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ShiftProductionVolume
+{
+  #keys: '3[412672.1.61744657][412672.1.61744656][412672.1.61744658]'
+  Description: '瀵瑰簲鐝鐨勫疄闄呯敓浜ф暟閲�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftSequence.qbl b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftSequence.qbl
new file mode 100644
index 0000000..77091ca
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/Attribute_ShiftSequence.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ShiftSequence
+{
+  #keys: '3[412672.1.61744667][412672.1.61744666][412672.1.61744668]'
+  Description: '鐝椤哄簭'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_GetRequestBody.qbl b/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_GetRequestBody.qbl
new file mode 100644
index 0000000..c717647
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_GetRequestBody.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetRequestBody (
+  Date date
+) as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-19-2024 (created)
+    json := JSON::Object()
+                  .Add( "inParam", JSON::Object().Add( "productiondate", date.Format( "Y-M2-D2" ) ) ).Build();
+    requestbody := json.AsString();
+    return requestbody
+  *]
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_Synchronize.qbl b/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_Synchronize.qbl
new file mode 100644
index 0000000..9b78c60
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/StaticMethod_Synchronize.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Synchronize (
+  MacroPlan owner,
+  InterfaceDataset interfaceDataset
+)
+{
+  TextBody:
+  [*
+    // rislai Jul-23-2024 (created)
+    date    := Date::ActualDate();
+    loginfo := interfaceDataset.InterfaceLoginfo( relnew, ExecuteUser := QuintiqUser::CurrentUser().ShortName()
+                                       , Name := Translations::InterfaceDataset_ActualDailyProductionData_Name()
+                                       , InterfaceDateTime := DateTime::ActualTime()
+                                       , Message := '鐢熶骇瀹為檯鏁版嵁'
+                                       , RequestBody := ActualDailyProductionData::GetRequestBody( date ) );
+    
+    data := InterfaceLoginfo::CallInterface( interfaceDataset,loginfo );
+    if( not isnull( data ) ){
+      cnv1 := StringToDateTime::StandardConverter();
+      cnv1.SetCustomConversion();
+      cnv1.CustomFormatString( 'yyyy-MM-dd HH:mm:ss' );
+      
+      cnv2 := StringToDate::StandardConverter();
+      cnv2.SetCustomConversion();
+      cnv2.CustomFormatString( 'yyyy-MM-dd' );
+      
+      info( data.AsString() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ActualDailyProductionReport/_ROOT_Type_ActualDailyProductionData.qbl b/_Main/BL/Type_ActualDailyProductionReport/_ROOT_Type_ActualDailyProductionData.qbl
new file mode 100644
index 0000000..8cb3806
--- /dev/null
+++ b/_Main/BL/Type_ActualDailyProductionReport/_ROOT_Type_ActualDailyProductionData.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ActualDailyProductionData
+{
+  #keys: '5[412672.1.61744606][412672.1.61744604][0.0.0][412672.1.61744605][412672.1.61744607]'
+  BaseType: Object
+  Description: 'Actual daily production report'
+  StructuredName: 'ActualDailyProductionDatas'
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_Amount.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_Amount.qbl
new file mode 100644
index 0000000..f702624
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_Amount.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Amount
+{
+  #keys: '3[415136.0.931887050][415136.0.931887049][415136.0.931887051]'
+  Description: '閲戦'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_BIPlace.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_BIPlace.qbl
new file mode 100644
index 0000000..d86e9fa
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_BIPlace.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BIPlace
+{
+  #keys: '3[415136.0.931887027][415136.0.931887026][415136.0.931887028]'
+  Description: '缁熻鍒嗘瀽鐨勫簱瀛樺湴鐐�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_Brand.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_Brand.qbl
new file mode 100644
index 0000000..6c02621
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_Brand.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Brand
+{
+  #keys: '3[415136.0.932110085][415136.0.932110084][415136.0.932110086]'
+  Description: '鍝佺墝'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_DDay.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_DDay.qbl
new file mode 100644
index 0000000..a778cc4
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_DDay.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DDay
+{
+  #keys: '3[415136.0.931887060][415136.0.931887059][415136.0.931887061]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_DMonth.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_DMonth.qbl
new file mode 100644
index 0000000..bbe7e1b
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_DMonth.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DMonth
+{
+  #keys: '3[415136.0.932110115][415136.0.932110114][415136.0.932110116]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_DType.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_DType.qbl
new file mode 100644
index 0000000..03dce5c
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_DType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DType
+{
+  #keys: '3[415136.0.932110105][415136.0.932110104][415136.0.932110106]'
+  Description: 'SAP\\WZK\\ZT锛汼AP绯荤粺 闀挎槬澶栨棌搴� 澶ц繛鍦ㄩ��'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_DWeek.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_DWeek.qbl
new file mode 100644
index 0000000..3988a7f
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_DWeek.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DWeek
+{
+  #keys: '3[415136.0.931887068][415136.0.931887067][415136.0.931887069]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineModularPlatform.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineModularPlatform.qbl
new file mode 100644
index 0000000..9911d58
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineModularPlatform.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineModularPlatform
+{
+  #keys: '3[415136.0.931887017][415136.0.931887016][415136.0.931887018]'
+  Description: '鍙戝姩鏈烘ā鍧楀寲骞冲彴'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineType.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineType.qbl
new file mode 100644
index 0000000..0c7c09d
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_EngineType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EngineType
+{
+  #keys: '3[415136.0.932110075][415136.0.932110074][415136.0.932110076]'
+  Description: '鍙戝姩鏈虹被鍨嬶紝妯疆銆佺旱缃�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_Fac.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_Fac.qbl
new file mode 100644
index 0000000..2bb8850
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_Fac.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Fac
+{
+  #keys: '3[415136.0.931887064][415136.0.931887063][415136.0.931887065]'
+  Description: '宸ュ巶code'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_FourCode.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_FourCode.qbl
new file mode 100644
index 0000000..50524f4
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_FourCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FourCode
+{
+  #keys: '3[415136.0.932110043][415136.0.932110042][415136.0.932110044]'
+  Description: '鍥涗綅鐮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_FullName.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_FullName.qbl
new file mode 100644
index 0000000..cc62e9b
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_FullName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FullName
+{
+  #keys: '3[415136.0.932110063][415136.0.932110062][415136.0.932110064]'
+  Description: '瀹屾暣鍨嬪彿鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_Price.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_Price.qbl
new file mode 100644
index 0000000..99767d8
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_Price.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Price
+{
+  #keys: '3[415136.0.931887037][415136.0.931887036][415136.0.931887038]'
+  Description: '鍗曚环'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_ReceiptPlace.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_ReceiptPlace.qbl
new file mode 100644
index 0000000..9f56ef6
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_ReceiptPlace.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ReceiptPlace
+{
+  #keys: '3[415136.0.931886999][415136.0.931886998][415136.0.931887000]'
+  Description: '鏀惰揣鍦扮偣'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_SpellName.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_SpellName.qbl
new file mode 100644
index 0000000..2add113
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_SpellName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SpellName
+{
+  #keys: '3[415136.0.931887007][415136.0.931887006][415136.0.931887008]'
+  Description: '绠�鍐欏瀷鍙峰悕绉�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_Total.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_Total.qbl
new file mode 100644
index 0000000..adceff1
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_Total.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Total
+{
+  #keys: '3[415136.0.932110095][415136.0.932110094][415136.0.932110096]'
+  Description: '搴撳瓨閲�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/Attribute_VehicleType.qbl b/_Main/BL/Type_FinishedEngineInventory/Attribute_VehicleType.qbl
new file mode 100644
index 0000000..26d0cec
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/Attribute_VehicleType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute VehicleType
+{
+  #keys: '3[415136.0.932110053][415136.0.932110052][415136.0.932110054]'
+  Description: '鍙戝姩鏈鸿溅鍨�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/DefaultValue_Fac.qbl b/_Main/BL/Type_FinishedEngineInventory/DefaultValue_Fac.qbl
new file mode 100644
index 0000000..386d17b
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/DefaultValue_Fac.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Fac
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GenerateData.qbl b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GenerateData.qbl
new file mode 100644
index 0000000..ca6915a
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GenerateData.qbl
@@ -0,0 +1,50 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateData (
+  InterfaceLoginfo owner,
+  StringToDate cnv,
+  JSON item
+) as FinishedEngineInventory
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-17-2024 (created)
+    four_code                  := guard( item.Get( "four_code").GetString(),"");
+    vehicle_type               := guard( item.Get( "vehicle_type").GetString(),"");
+    receipt_place              := guard( item.Get( "receipt_place").GetString(),"");
+    full_name                  := guard( item.Get( "full_name").GetString(),"");
+    spell_name                 := guard( item.Get( "spell_name").GetString(),"");
+    engine_type                := guard( item.Get( "engine_type").GetString(),"");
+    engine_modular_platform    := guard( item.Get( "engine_modular_platform").GetString(),"");
+    brand                      := guard( item.Get( "brand").GetString(),"");
+    bi_place                   := guard( item.Get( "bi_place").GetString(),"");
+    price                      := guard( item.Get( "price").GetString(),"");
+    total                      := guard( item.Get( "total").GetReal(),0);
+    amount                     := guard( item.Get( "amount").GetReal(),0);
+    dtype                      := guard( item.Get( "dtype").GetString(),"");
+    fac                        := guard( item.Get( "fac").GetString(),"");
+    dday                       := guard( item.Get( "dday").GetString(),"");
+    dweek                      := guard( item.Get( "dweek").GetString(),"");
+    dmonth                     := guard( item.Get( "dmonth").GetString(),"");
+    
+    msdata           := owner.FinishedEngineInventory( relnew, FourCode := four_code
+                                                       , VehicleType := vehicle_type
+                                                       , ReceiptPlace := receipt_place
+                                                       , FullName := full_name
+                                                       , SpellName := spell_name
+                                                       , EngineType := engine_type
+                                                       , EngineModularPlatform := engine_modular_platform
+                                                       , Brand := brand
+                                                       , BIPlace := bi_place
+                                                       , Price := price
+                                                       , Total := total
+                                                       , Amount := amount
+                                                       , DType := dtype
+                                                       , Fac := fac
+                                                       , DDay := cnv.Convert( dday )
+                                                       , DWeek := dweek
+                                                       , DMonth := dmonth );
+    
+    return msdata;
+  *]
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GetRequestBody.qbl b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GetRequestBody.qbl
new file mode 100644
index 0000000..d122b01
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_GetRequestBody.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetRequestBody (
+  Date date
+) as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-19-2024 (created)
+    json := JSON::Object()
+                  .Add( "inParam", JSON::Object().Add( "dday", date.Format( "Y-M2-D2" ) ) ).Build();
+    requestbody := json.AsString();
+    return requestbody
+  *]
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/StaticMethod_Synchronize.qbl b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_Synchronize.qbl
new file mode 100644
index 0000000..184e857
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/StaticMethod_Synchronize.qbl
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Synchronize (
+  InterfaceDataset owner,
+  String executor
+)
+{
+  TextBody:
+  [*
+    //// 鐢勫叞楦� Jul-17-2024 (created)
+    date    := Date::ActualDate();
+    loginfo := owner.InterfaceLoginfo( relnew, ExecuteUser := executor
+                                       , Name := Translations::InterfaceDataset_FinishedEngineInventory_Name()
+                                       , InterfaceDateTime := DateTime::ActualTime()
+                                       , Message := '搴撳瓨鏁版嵁锛堝彂鍔ㄦ満鎴愬搧搴撳瓨锛�'
+                                       , RequestBody := FinishedEngineInventory::GetRequestBody( date ) );
+    
+    data := InterfaceLoginfo::CallInterface( owner, loginfo );
+    if( not isnull( data ) ){
+      
+      cnv2 := StringToDate::StandardConverter();
+      cnv2.SetCustomConversion();
+      cnv2.CustomFormatString( 'yyyy-MM-dd' );
+      
+    //  sadatalist := construct( ShippingActualDatas );
+      for( seq := 0;seq < data.Size();seq++){
+        item := data.Get(seq);
+        FinishedEngineInventory::GenerateData( loginfo, cnv2, item );
+    //    sadatalist.Add( sadata );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_FinishedEngineInventory/_ROOT_Type_FinishedEngineInventory.qbl b/_Main/BL/Type_FinishedEngineInventory/_ROOT_Type_FinishedEngineInventory.qbl
new file mode 100644
index 0000000..8ad556c
--- /dev/null
+++ b/_Main/BL/Type_FinishedEngineInventory/_ROOT_Type_FinishedEngineInventory.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type FinishedEngineInventory
+{
+  #keys: '5[415136.0.932110025][415136.0.932110023][0.0.0][415136.0.932110024][415136.0.932110026]'
+  BaseType: Object
+  Description: '搴撳瓨鏁版嵁锛堝彂鍔ㄦ満鎴愬搧搴撳瓨锛�'
+  StructuredName: 'FinishedEngineInventorys'
+}
diff --git a/_Main/BL/Type_InterfaceDataset/StaticMethod_GetResponseJsonData.qbl b/_Main/BL/Type_InterfaceDataset/StaticMethod_GetResponseJsonData.qbl
new file mode 100644
index 0000000..776c99f
--- /dev/null
+++ b/_Main/BL/Type_InterfaceDataset/StaticMethod_GetResponseJsonData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetResponseJsonData (
+  String result
+) as owning JSON
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-17-2024 (created)
+    resultJson     := JSON::Parse( result );
+    //returnsuccess  := resultJson.Get( "success");
+    //msg            := resultJson.Get( "msg");
+    data           := resultJson.Get( "data");
+    return &data;
+  *]
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_ExecuteUser.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_ExecuteUser.qbl
new file mode 100644
index 0000000..a135da8
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_ExecuteUser.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ExecuteUser
+{
+  #keys: '3[415136.0.917964722][415136.0.917964721][415136.0.917964723]'
+  Description: '鎵ц浜�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_FinishTime.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_FinishTime.qbl
new file mode 100644
index 0000000..5676651
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_FinishTime.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FinishTime
+{
+  #keys: '3[415136.0.917964701][415136.0.917964700][415136.0.917964702]'
+  Description: '瀹屾垚鏃堕棿'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_InterfaceDateTime.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_InterfaceDateTime.qbl
new file mode 100644
index 0000000..633bf52
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_InterfaceDateTime.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute InterfaceDateTime
+{
+  #keys: '3[415136.0.917964734][415136.0.917964733][415136.0.917964735]'
+  Description: '瑙﹀彂鏃堕棿'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_Last.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_Last.qbl
new file mode 100644
index 0000000..b8c5118
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_Last.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Last
+{
+  #keys: '3[415136.0.917964713][415136.0.917964712][415136.0.917964714]'
+  Description: '鏄惁鏄渶鏂扮殑鎺ュ彛鏁版嵁'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_Message.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_Message.qbl
new file mode 100644
index 0000000..2e4c000
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_Message.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Message
+{
+  #keys: '3[415136.0.917964728][415136.0.917964727][415136.0.917964729]'
+  Description: '鎺ュ彛淇℃伅'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_Name.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_Name.qbl
new file mode 100644
index 0000000..f10995a
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.917964704][415136.0.917964703][415136.0.917964705]'
+  Description: '鎺ュ彛鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_RequestBody.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_RequestBody.qbl
new file mode 100644
index 0000000..c682c01
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_RequestBody.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RequestBody
+{
+  #keys: '3[415136.0.917964731][415136.0.917964730][415136.0.917964732]'
+  Description: '鎺ュ彛鍏ュ弬'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_Response.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_Response.qbl
new file mode 100644
index 0000000..29af7df
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_Response.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Response
+{
+  #keys: '3[415136.0.917964710][415136.0.917964709][415136.0.917964711]'
+  Description: '鎺ュ彛杩斿洖鏁版嵁'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnMsg.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnMsg.qbl
new file mode 100644
index 0000000..d388c1d
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnMsg.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ReturnMsg
+{
+  #keys: '3[415136.0.917964719][415136.0.917964718][415136.0.917964720]'
+  Description: '杩斿洖淇℃伅'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnSuccess.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnSuccess.qbl
new file mode 100644
index 0000000..35a6def
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_ReturnSuccess.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ReturnSuccess
+{
+  #keys: '3[415136.0.917964737][415136.0.917964736][415136.0.917964738]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_Success.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_Success.qbl
new file mode 100644
index 0000000..e6e0fe2
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_Success.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Success
+{
+  #keys: '3[415136.0.917964716][415136.0.917964715][415136.0.917964717]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Attribute_TotalRow.qbl b/_Main/BL/Type_InterfaceLoginfo/Attribute_TotalRow.qbl
new file mode 100644
index 0000000..96970b8
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Attribute_TotalRow.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TotalRow
+{
+  #keys: '3[415136.0.917964725][415136.0.917964724][415136.0.917964726]'
+  Description: '鎬昏鏁�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Message.qbl b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Message.qbl
new file mode 100644
index 0000000..54c7886
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Message.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Message
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Name.qbl b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Response.qbl b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Response.qbl
new file mode 100644
index 0000000..daf5a1a
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/DefaultValue_Response.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Response
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/Method_UpdateLast.qbl b/_Main/BL/Type_InterfaceLoginfo/Method_UpdateLast.qbl
new file mode 100644
index 0000000..413a98d
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/Method_UpdateLast.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method UpdateLast
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-22-2024 (created)
+    if( this.Success() and this.ReturnSuccess() ){
+      traverse( this,InterfaceDataset.InterfaceLoginfo,item,item.Last() = true and item.Name() = this.Name()){
+        item.Last(false);
+      }
+      this.Last(true);
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterface.qbl b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterface.qbl
new file mode 100644
index 0000000..7d86e89
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterface.qbl
@@ -0,0 +1,86 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CallInterface (
+  InterfaceDataset owner,
+  InterfaceLoginfo loginfo
+) as owning JSON
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-22-2024 (created)
+    address       := Translations::InterfaceDataset_Address(); 
+    httpinterface := HTTPInterface::Create( address,80);
+    try{
+      if( loginfo.Name() = Translations::InterfaceDataset_ShippingActualData_Name() ){//鍙戣繍瀹為檯鏁版嵁
+        
+        httpinterface.URL( Translations::InterfaceDataset_ShippingActualData_URL() );
+        httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
+        httpinterface.PostMethod( true ); 
+        httpinterface.AddHeader("Authorization",InterfaceLoginfo::CallToken( Translations::InterfaceDataset_ShippingActualData_Secret() ))
+        
+        httpinterface.Call( loginfo.RequestBody() );
+        
+        result := httpinterface.Result();
+        loginfo.Response( result );
+        loginfo.Success( true );
+      } else if ( loginfo.Name() = Translations::InterfaceDataset_MachineStockData_Name() ){//搴撳瓨鏁版嵁锛堟満鍔犲簱瀛橈級
+        httpinterface.URL( Translations::InterfaceDataset_MachineStockData_URL() );
+        httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
+        httpinterface.PostMethod( true ); 
+        httpinterface.AddHeader("Authorization",InterfaceLoginfo::CallToken( Translations::InterfaceDataset_MachineStockData_Secret() ))
+        
+        httpinterface.Call( loginfo.RequestBody() );
+        
+        result := httpinterface.Result();
+        loginfo.Response( result );
+        loginfo.Success( true );
+      } else if ( loginfo.Name() = Translations::InterfaceDataset_FinishedEngineInventory_Name() ){//搴撳瓨鏁版嵁锛堝彂鍔ㄦ満鎴愬搧搴撳瓨锛�
+        httpinterface.URL( Translations::InterfaceDataset_FinishedEngineInventory_URL() );
+        httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
+        httpinterface.PostMethod( true ); 
+        httpinterface.AddHeader("Authorization",InterfaceLoginfo::CallToken( Translations::InterfaceDataset_FinishedEngineInventory_Secret() ))
+        
+        httpinterface.Call( loginfo.RequestBody() );
+        
+        result := httpinterface.Result();
+        loginfo.Response( result );
+        loginfo.Success( true );
+      } else if( loginfo.Name() = Translations::InterfaceDataset_ActualDailyProductionData_Name() ){//鐢熶骇瀹為檯鏁版嵁
+        httpinterface.URL( Translations::InterfaceDataset_ActualDailyProductionData_URL() );
+        httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
+        httpinterface.PostMethod( true ); 
+    
+        httpinterface.AddHeader("Authorization",InterfaceLoginfo::CallToken( Translations::InterfaceDataset_ActualDailyProductionData_Secret() ))
+        
+        httpinterface.Call( loginfo.RequestBody() );
+        
+        result := httpinterface.Result();
+        loginfo.Response( result );
+        loginfo.Success( true );
+      }
+    }onerror{
+      loginfo.ReturnMsg( e.GeneralInformation() );
+    }
+    
+    //鍚庣画鍏叡澶勭悊
+    loginfo.FinishTime( DateTime::ActualTime() );
+    data             := JSON::Null().Build();
+    
+    if( loginfo.Success() ){
+      resultJson     := JSON::Parse( loginfo.Response() );
+      code           := resultJson.Get( "code" ).AsString();
+      msg            := resultJson.Get( "message" ).AsString();
+      data           := resultJson.Get( "data" );
+      
+      loginfo.ReturnMsg( msg );
+      if( code = "200" ){
+        total        := resultJson.Get( "dataSize" ).GetNumber();
+        loginfo.ReturnSuccess( true );
+        loginfo.TotalRow( total );
+        loginfo.UpdateLast();
+      }
+    }
+    
+    return &data;
+  *]
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallToken.qbl b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallToken.qbl
new file mode 100644
index 0000000..a186eae
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallToken.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CallToken (
+  String secret
+) as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-22-2024 (created)
+    address       := Translations::InterfaceDataset_Address(); 
+    httpinterface := HTTPInterface::Create( address,80);
+    
+    httpinterface.URL( Translations::InterfaceDataset_Token_URL() + secret );
+    httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
+    httpinterface.PostMethod( false );
+    httpinterface.Call();
+    result := httpinterface.Result();
+    
+    resultJson     := JSON::Parse( result );
+    token          := resultJson.Get( "access_token" ).GetString();
+    
+    return token;
+  *]
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/_ROOT_Type_InterfaceLoginfo.qbl b/_Main/BL/Type_InterfaceLoginfo/_ROOT_Type_InterfaceLoginfo.qbl
new file mode 100644
index 0000000..6d85661
--- /dev/null
+++ b/_Main/BL/Type_InterfaceLoginfo/_ROOT_Type_InterfaceLoginfo.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type InterfaceLoginfo
+{
+  #keys: '5[415136.0.917964684][415136.0.917964682][0.0.0][415136.0.917964683][415136.0.917964685]'
+  BaseType: Object
+  StructuredName: 'InterfaceLoginfos'
+}
diff --git a/_Main/BL/Type_LibCal_Event/Attribute_IsMultiple.qbl b/_Main/BL/Type_LibCal_Event/Attribute_IsMultiple.qbl
new file mode 100644
index 0000000..959ef87
--- /dev/null
+++ b/_Main/BL/Type_LibCal_Event/Attribute_IsMultiple.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsMultiple
+{
+  #keys: '3[415136.0.918010824][415136.0.918010823][415136.0.918010825]'
+  Description: '鏄惁閫氳繃鎵归噺鐣岄潰鍒涘缓'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl b/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl
index 76e31f8..df18866 100644
--- a/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl
+++ b/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI.qbl
@@ -41,55 +41,39 @@
   TextBody:
   [*
     //浜嬩欢鍒涘缓浜屽紑鏂规硶
-    //info( startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, recurrenceInterval_i, patternType_i
-    //      , patternDaily_IsEveryWeekday_i, periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i );
-    //鏌ヨ鏄惁宸叉湁鍚屽悕浜嬩欢
+    //鏌ヨ鏄惁宸叉湁鍚屽悕鍦ㄦ壒閲忕晫闈㈠垱寤虹殑浜嬩欢s
     event := selectobject( owner_i, Event, event, event.Subject() = subject_i 
-                     and event.StartTimeOfDay() = startTimeOfDay_i 
-                     and event.EndTimeOfDay() = endTimeOfDay_i 
-                     and event.EventType() = eventtype_i );
+                           and event.EventType() = eventtype_i );
+    
     //鍙湁閫氳繃鎵归噺鍒涘缓鐣岄潰涓斿凡鏈夊悓鍚嶄簨浠惰繘鍏ヤ笅闈㈡搷浣�
     if( ismultiple and not isnull( event ) ){
-      startdate := startDate_i;
-      enddate   := startDate_i;
-      dates := construct( Dates );
-      dates.Add( startDate_i );
-      //鑾峰彇鏃т簨浠剁殑寮�濮嬩簨浠跺拰缁撴潫浜嬩欢锛屼互鍙婃墍鏈夋椂闂寸偣
-      traverse( event, Participation.ExplicitTimeInterval, eti ){
-        if( startdate > eti.Start().Date() ){
-          startdate := eti.Start().Date();
-        }
-        if( enddate < eti.Start().Date() ) {
-          enddate := eti.Start().Date();
-        }
-        if( not exists( dates, Elements, e, e = eti.Start().Date() ) ){
-          dates.Add( eti.Start().Date() );
+      event.IsMultiple( true );
+      lp        := event.LeadingParticipation();
+      timezone  := lp.Calendar().GetTimeZone();
+      starttime := startDate_i.DateTime( timezone ).AddAsPeriod( timezone, startTimeOfDay_i );
+      endtime   := endDate_i.DateTime( timezone ).AddAsPeriod( timezone, endTimeOfDay_i );
+      etis      := selectset( lp, Subscription.ExplicitTimeInterval, eti, true );
+    //  startDate := starttime.Date( timezone );
+    //  endDate   := endtime.Date( timezone ) - ifexpr( endtime = endtime.StartOfDay( timezone ), 1, 0 );
+      leadingETI := selectobject( lp, ExplicitTimeInterval, eti, eti.Start() = starttime and eti.End() = endtime );
+    
+      if( isnull( leadingETI ) ){
+        leadingETI := lp.CreateTimeInterval( starttime, endtime, event.Capacity() );
+      }
+      lp.AddSubscribers( subscribers_i, true );
+    
+      if( not isnull( leadingETI ) ){
+        traverse( lp, Subscription, subscription, subscribers_i.Find( subscription.Calendar() ) >= 0 ){
+    
+          traverse( subscription, ExplicitTimeInterval, eti, etis.Find( eti ) < 0 ){
+            eti.Delete();
+          }
+          subscribingETI := subscription.CreateTimeInterval( starttime, endtime, event.Capacity() );
+          if( not isnull( subscribingETI ) ){
+            subscribingETI.LeadingETI( relset, leadingETI );
+          }
         }
       }
-      //淇敼鏃т簨浠剁殑闂撮殧
-      nrOfOccurrences_i := enddate - startdate + 1;
-      startDate_i := startdate;
-      endDate_i   := startdate;
-      periodStartDate_i := startdate;
-      periodEndDate_i := enddate;
-    //  info( startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, recurrenceInterval_i, patternType_i
-    //      , patternDaily_IsEveryWeekday_i, periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i );
-      event := LibCal_Event::CreateUpdateFromUI( owner_i, event.LeadingParticipation(), subject_i, description_i, type_i, capacity_i, category_i, isDefault_i, 
-                                      startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, 
-                                      isRecurring_i, recurrenceInterval_i,
-                                      patternType_i, patternDaily_IsEveryWeekday_i, patternWeekly_Weekdays_i, 
-                                      patternMonthly_IsDay_i, patternMonthly_Day_i, patternMonthly_WeekOfMonth_i, patternMonthly_DayOfWeek_i,
-                                      patternYearly_IsDate_i, patternYearly_Month_i, patternYearly_Day_i, patternYearly_WeekOfMonth_i, patternYearly_DayOfWeek_i,
-                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i );
-      //鍒犳帀涓嶉渶瑕佺殑鏃堕棿鐐�
-      timeIntervals := construct( LibCal_ExplicitTimeIntervals );
-      traverse( event, Participation.ExplicitTimeInterval, eti ){
-    //    info( '------------------------------', eti.Start(), eti.End(), exists( dates, Elements, e, e = eti.Start().Date() ), '------------------', dates.Find( eti.Start().Date() ) );
-        if( dates.Find( eti.Start().Date() ) < 0 ){
-          timeIntervals.Add( eti );
-        }
-      }
-      LibCal_ExplicitTimeInterval::Delete( timeIntervals, true );
     } else {
       event := LibCal_Event::CreateUpdateFromUI( owner_i, participation_i, subject_i, description_i, type_i, capacity_i, category_i, isDefault_i, 
                                       startDate_i, startTimeOfDay_i, endDate_i, endTimeOfDay_i, isAllDay_i, 
@@ -97,8 +81,9 @@
                                       patternType_i, patternDaily_IsEveryWeekday_i, patternWeekly_Weekdays_i, 
                                       patternMonthly_IsDay_i, patternMonthly_Day_i, patternMonthly_WeekOfMonth_i, patternMonthly_DayOfWeek_i,
                                       patternYearly_IsDate_i, patternYearly_Month_i, patternYearly_Day_i, patternYearly_WeekOfMonth_i, patternYearly_DayOfWeek_i,
-                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i );
+                                      periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i, subscribers_i, ismultiple );
     }
+    
     if( not isnull( event ) ){
       event.EventType( relset, eventtype_i );
     }
diff --git a/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI0.qbl b/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI0.qbl
new file mode 100644
index 0000000..a7e3fbe
--- /dev/null
+++ b/_Main/BL/Type_LibCal_Event/StaticMethod_CreateUpdateFromUI0.qbl
@@ -0,0 +1,94 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateUpdateFromUI (
+  LibCal_Calendar owner_i,
+  LibCal_LeadingParticipation participation_i,
+  String subject_i,
+  String description_i,
+  String type_i,
+  Real capacity_i,
+  LibCal_EventCategory category_i,
+  Boolean isDefault_i,
+  Date startDate_i,
+  Duration startTimeOfDay_i,
+  Date endDate_i,
+  Duration endTimeOfDay_i,
+  Boolean isAllDay_i,
+  Boolean isRecurring_i,
+  Number recurrenceInterval_i,
+  String patternType_i,
+  Boolean patternDaily_IsEveryWeekday_i,
+  String patternWeekly_Weekdays_i,
+  Boolean patternMonthly_IsDay_i,
+  Number patternMonthly_Day_i,
+  String patternMonthly_WeekOfMonth_i,
+  String patternMonthly_DayOfWeek_i,
+  Boolean patternYearly_IsDate_i,
+  Number patternYearly_Month_i,
+  Number patternYearly_Day_i,
+  String patternYearly_WeekOfMonth_i,
+  String patternYearly_DayOfWeek_i,
+  String periodType_i,
+  Date periodStartDate_i,
+  Number nrOfOccurrences_i,
+  Date periodEndDate_i,
+  LibCal_Calendars subscribers_i,
+  Boolean is_multiple
+) as LibCal_Event
+{
+  Description: 'Create and/or update an Event and its LeadingParticipation, based on information from the UI.'
+  TextBody:
+  [*
+    event    := null( LibCal_Event );
+    leadPart := participation_i;
+    timezone := owner_i.GetTimeZone();
+    
+    if( isnull( leadPart ) )
+    {
+      // Create a new Event. This also creates a new LeadingParticipation.
+      event    := LibCal_Event::Create( owner_i, "", Date::Today( timezone ), 1 );
+      leadPart := event.LeadingParticipation();
+    }
+    else
+    {
+      // Get the event of the participation.
+      event := leadPart.Event();
+    }
+    
+    if( is_multiple ){
+      event.IsMultiple( is_multiple );
+    }
+    
+    // Update the event...
+    duration := endDate_i.Add( timezone, endTimeOfDay_i ) - startDate_i.Add( timezone, startTimeOfDay_i );
+    isFromUI := true;
+    event.Update( subject_i, description_i, type_i, capacity_i, isDefault_i, startTimeOfDay_i, endTimeOfDay_i, duration, isAllDay_i, isFromUI );
+    
+    // Changing the category is a different kind of change, with no impact on the event itself.
+    event.EventCategory( relset, category_i );
+    
+    // ...and its recurrence pattern.
+    event.UpdateRecurrencePattern( isRecurring_i, patternType_i, recurrenceInterval_i,
+                                   patternDaily_IsEveryWeekday_i,
+                                   patternWeekly_Weekdays_i,
+                                   patternMonthly_IsDay_i, patternMonthly_Day_i,  patternMonthly_WeekOfMonth_i, patternMonthly_DayOfWeek_i,
+                                   patternYearly_IsDate_i, patternYearly_Month_i, patternYearly_Day_i, patternYearly_WeekOfMonth_i, patternYearly_DayOfWeek_i );
+    
+    // Update the participation...
+    leadPart.Update( startDate_i, endDate_i );
+    
+    // ...and its recurrence period.
+    leadPart.UpdateRecurrencePeriod( isRecurring_i, periodType_i, periodStartDate_i, nrOfOccurrences_i, periodEndDate_i );
+    
+    // Effectuate the changes.
+    leadPart.UpdateCalendarWhenChanged();
+    
+    // Set the subscribers. Must be done *after* UpdateCalendar.
+    leadPart.SetSubscribers( subscribers_i );
+    
+    // Call a post-processing method that can be extended to implement additional logic.
+    event.OnCreateUpdateFromUI();
+    
+    return event;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_Event/StaticMethod_ValidDate.qbl b/_Main/BL/Type_LibCal_Event/StaticMethod_ValidDate.qbl
new file mode 100644
index 0000000..5b0cd8e
--- /dev/null
+++ b/_Main/BL/Type_LibCal_Event/StaticMethod_ValidDate.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ValidDate (
+  output String feedback_o,
+  MacroPlan owner,
+  DateTime startdate,
+  DateTime endtime
+) declarative remote as Boolean
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-26-2024 (created)
+    feedback_o := '';
+    if( startdate > endtime ){
+      feedback_o := Translations::MP_LibCal_Event_ValidDatePeriod();
+    }
+    
+    if( not exists( owner, Period_MP, period, not period.IsHistorical() 
+                and period.TimeUnit() = Translations::MP_GlobalParameters_Day() 
+                and period.StartDate() = startdate.Date() 
+                and ( period.EndDate() = endtime.Date() or period.StartDate() = endtime.Date() ) ) ){
+      feedback_o := Translations::MP_LibCal_Event_ValidDate();
+    }
+    return feedback_o = '';
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_ExplicitTimeInterval/StaticMethod_Delete.qbl b/_Main/BL/Type_LibCal_ExplicitTimeInterval/StaticMethod_Delete.qbl
new file mode 100644
index 0000000..b90eafb
--- /dev/null
+++ b/_Main/BL/Type_LibCal_ExplicitTimeInterval/StaticMethod_Delete.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Delete (
+  LibCal_ExplicitTimeIntervals timeIntervals_i
+)
+{
+  TextBody:
+  [*
+    traverse( timeIntervals_i, Elements, eti ){
+      leadingeti := eti.LeadingETI();
+      if( leadingeti.SubscribingETI( relsize ) = 1 ){
+        part     := leadingeti.Participation();
+        if( part.ExplicitTimeInterval( relsize ) = 1 ){
+          part.Event().Delete();
+        }
+        if( not isnull( leadingeti ) ){
+          leadingeti.Delete();
+        }
+      }
+      if( not isnull( leadingeti ) ){
+        eti.Delete();
+      }
+    
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_ExplicitTimeInterval/_ROOT_Type_LibCal_ExplicitTimeInterval.qbl b/_Main/BL/Type_LibCal_ExplicitTimeInterval/_ROOT_Type_LibCal_ExplicitTimeInterval.qbl
new file mode 100644
index 0000000..4dbbf96
--- /dev/null
+++ b/_Main/BL/Type_LibCal_ExplicitTimeInterval/_ROOT_Type_LibCal_ExplicitTimeInterval.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LibCal_ExplicitTimeInterval #extension
+{
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_TimeUnit.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_TimeUnit.qbl
new file mode 100644
index 0000000..f017187
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Attribute_TimeUnit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TimeUnit
+{
+  #keys: '3[415136.0.941300421][415136.0.941300420][415136.0.941300422]'
+  Description: '鏃堕棿绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl
index f0e5182..0bf30d1 100644
--- a/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_FilterByDatePeriod.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 Method FilterByDatePeriod (
   Date start,
-  Date end
+  Date end,
+  String timeunit
 ) declarative remote as Boolean
 {
   TextBody:
@@ -10,7 +11,7 @@
     // 鐢勫叞楦� May-29-2024 (created)
     value := false;
     //info( this.Index(), this.LibCal_SubscriberEventTable().Name(), this.Period(), start, end );
-    if( this.Index() < 2 or ( this.Period() >= start and this.Period() <= end ) ){
+    if( this.Period() >= start and this.Period() <= end and this.TimeUnit() = timeunit ){
         value := true;
     }
     
diff --git a/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_GetCellByTimeUnit.qbl b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_GetCellByTimeUnit.qbl
new file mode 100644
index 0000000..fedb5be
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventColumn/Method_GetCellByTimeUnit.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetCellByTimeUnit (
+  LibCal_SubscriberEventRow row,
+  String desc
+) as LibCal_SubscriberEventCell
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-26-2024 (created)
+    cell := selectobject( this, LibCal_SubscriberEventCell, cell, cell.LibCal_SubscriberEventRow() = row );
+    if( isnull( cell ) ){
+      cell := this.LibCal_SubscriberEventCell( relnew, Value := '0'
+                                                     , Description := desc );
+      row.LibCal_SubscriberEventCell( relinsert, cell );
+    }
+    return cell;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Name.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Name.qbl
new file mode 100644
index 0000000..5a246b9
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Attribute_Name.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.918010439][415136.0.918010438][415136.0.918010440]'
+  Description: '浜х嚎In浜嬩欢'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Function_CalcName.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Function_CalcName.qbl
new file mode 100644
index 0000000..f027aba
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-23-2024 (created)
+    
+    value := this.Subscriber().Concat( " in " ).Concat( this.Event() );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Method_GetTimeByTimeUnit.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_GetTimeByTimeUnit.qbl
new file mode 100644
index 0000000..9d2ad1c
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_GetTimeByTimeUnit.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetTimeByTimeUnit (
+  DateTime starttime,
+  DateTime starttimetmp,
+  String timeunit
+) as Date
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-26-2024 (created)
+    time := starttime.Date();
+    if( starttime = starttimetmp ){
+      if ( timeunit = Translations::MP_GlobalParameters_Week() ){
+        time := starttime.StartOfWeek().Date();
+      } else if ( timeunit = Translations::MP_GlobalParameters_Month() ){
+        time := starttime.StartOfMonth().Date();
+      }
+    }
+    return time;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventRow/Method_InitializeDate.qbl b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_InitializeDate.qbl
new file mode 100644
index 0000000..fdff292
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventRow/Method_InitializeDate.qbl
@@ -0,0 +1,76 @@
+Quintiq file version 2.0
+#parent: #root
+Method InitializeDate (
+  LibCal_SubscriberEventTable table,
+  DateTime starttime,
+  DateTime endtime,
+  String desc
+)
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� May-29-2024 (created)
+    startTime     := starttime;
+    nextweektime  := starttime;
+    nextmonthtime := starttime;
+    while( startTime < endtime ){
+    //for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextDay() ){
+      //澶�
+      daytime         := this.GetTimeByTimeUnit( starttime, startTime, Translations::MP_GlobalParameters_Day() );
+      daycolumn       := table.GetColumnByTimeUnit( table, daytime, Translations::MP_GlobalParameters_Day() );
+      daycell         := daycolumn.GetCellByTimeUnit( this, desc );
+      
+      dayvalue        := [Real]daycell.Value();
+      if( startTime.StartOfNextDay() > endtime ){
+        duration      := endtime - startTime;
+        dayvalue      := dayvalue + duration.HoursAsReal();
+        daycell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
+      }else{
+        duration      := startTime.StartOfNextDay() - startTime;
+        dayvalue      := dayvalue + duration.HoursAsReal();
+        daycell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextDay().Format( 'M/D/Y H:m' ) );
+      }
+      daycell.Value( [String]dayvalue );
+      //鍛�
+      if( nextweektime = startTime ){
+        weektime      := this.GetTimeByTimeUnit( starttime, startTime, Translations::MP_GlobalParameters_Week() );
+        weekcolumn    := table.GetColumnByTimeUnit( table, weektime, Translations::MP_GlobalParameters_Week() );
+        weekcell      := weekcolumn.GetCellByTimeUnit( this, desc );
+        
+        weekvalue     := [Real]weekcell.Value();
+        if( startTime.StartOfNextWeek() > endtime ){
+          duration    := endtime - startTime;
+          weekvalue   := weekvalue + duration.HoursAsReal();
+          weekcell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
+        }else{
+          duration    := startTime.StartOfNextWeek() - startTime;
+          weekvalue   := weekvalue + duration.HoursAsReal();
+          weekcell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextWeek().Format( 'M/D/Y H:m' ) );
+        }
+        weekcell.Value( [String]weekvalue );
+        nextweektime := startTime.StartOfNextWeek();
+      }
+    //  info( '-----------------------------1------------------------', nextmonthtime, startTime, nextweektime );
+      //鏈�
+      if( nextmonthtime = startTime ){
+        monthtime     := this.GetTimeByTimeUnit( starttime, startTime, Translations::MP_GlobalParameters_Month() );
+        monthcolumn   := table.GetColumnByTimeUnit( table, monthtime, Translations::MP_GlobalParameters_Month() );
+        monthcell     := monthcolumn.GetCellByTimeUnit( this, desc );
+        info( nextmonthtime, startTime, monthtime, isnull( monthcolumn ), isnull( monthcell ) );
+        monthvalue    := [Real]monthcell.Value();
+        if( startTime.StartOfNextMonth() > endtime ){
+          duration    := endtime - startTime;
+          monthvalue  := monthvalue + duration.HoursAsReal();
+          monthcell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
+        }else{
+          duration    := startTime.StartOfNextMonth() - startTime;
+          monthvalue  := monthvalue + duration.HoursAsReal();
+          monthcell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextMonth().Format( 'M/D/Y H:m' ) );
+        }
+        monthcell.Value( [String]monthvalue );
+        nextmonthtime := startTime.StartOfNextMonth();
+      }
+      startTime := startTime.StartOfNextDay();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_GetColumnByTimeUnit.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_GetColumnByTimeUnit.qbl
new file mode 100644
index 0000000..757b1d4
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_GetColumnByTimeUnit.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetColumnByTimeUnit (
+  LibCal_SubscriberEventTable table,
+  Date time,
+  String timeunit
+) as LibCal_SubscriberEventColumn
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-26-2024 (created)
+    column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time.Format( 'M/D/Y' ) );
+    if( isnull( column ) ){
+      column := table.LibCal_SubscriberEventColumn( relnew, Name := time.Format( 'M/D/Y' ), Period := time, TimeUnit := timeunit );
+    }
+    return column;
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl
deleted file mode 100644
index 247b3c4..0000000
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeDay.qbl
+++ /dev/null
@@ -1,37 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method InitializeDay (
-  LibCal_SubscriberEventTable table,
-  LibCal_SubscriberEventRow row,
-  DateTime starttime,
-  DateTime endtime,
-  String desc
-)
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� May-29-2024 (created)
-    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextDay() ){
-      time := startTime.Format( 'M/D/Y' );
-      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time );
-      if( isnull( column ) ){
-        column := table.LibCal_SubscriberEventColumn( relnew, Name := time, Period := startTime.Date() );
-      }
-      
-      if( startTime.StartOfNextDay() > endtime ){
-        duration := endtime - startTime;
-        cell := column.LibCal_SubscriberEventCell( relnew, Value := [String]duration.HoursAsReal()
-                                                   , Description := desc );
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
-        row.LibCal_SubscriberEventCell( relinsert, cell );
-      }else{
-        duration := startTime.StartOfNextDay() - startTime;
-        cell := column.LibCal_SubscriberEventCell( relnew, Value := [String]duration.HoursAsReal()
-                                                   , Description := desc );
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextDay().Format( 'M/D/Y H:m' ) );
-        row.LibCal_SubscriberEventCell( relinsert, cell );
-      }
-    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
-    }
-  *]
-}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl
deleted file mode 100644
index 096e9f4..0000000
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeMonth.qbl
+++ /dev/null
@@ -1,45 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method InitializeMonth (
-  LibCal_SubscriberEventTable table,
-  LibCal_SubscriberEventRow row,
-  DateTime starttime,
-  DateTime endtime,
-  String desc
-)
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� May-29-2024 (created)
-    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextMonth() ){
-      time := startTime;
-      if( starttime = startTime ){
-        time := startTime.StartOfMonth();
-      }
-      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time.Format( 'M/D/Y' ) );
-      if( isnull( column ) ){
-        column := table.LibCal_SubscriberEventColumn( relnew, Name := time.Format( 'M/D/Y' ), Period := time.Date() );
-      }
-      
-      cell := selectobject( column, LibCal_SubscriberEventCell, cell, cell.LibCal_SubscriberEventRow() = row );
-      if( isnull( cell ) ){
-        cell := column.LibCal_SubscriberEventCell( relnew, Value := '0'
-                                                     , Description := desc );
-        row.LibCal_SubscriberEventCell( relinsert, cell );
-      }
-      
-      value := [Real]cell.Value();
-      if( startTime.StartOfNextMonth() > endtime ){
-        duration := endtime - startTime;
-        value := value + duration.HoursAsReal();
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
-      }else{
-        duration := startTime.StartOfNextMonth() - startTime;
-        value := value + duration.HoursAsReal();
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextMonth().Format( 'M/D/Y H:m' ) );
-      }
-      cell.Value( [String]value );
-    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
-    }
-  *]
-}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl
index 14023ce..0df1514 100644
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeTable.qbl
@@ -8,20 +8,10 @@
   [*
     // 鐢勫叞楦� May-28-2024 (created)
     rownr                 := this.LibCal_SubscriberEventRow( relsize );
-    subscribercolumn      := selectobject( this, LibCal_SubscriberEventColumn, column, column.RowName() = 'Line' );
-    if( isnull( subscribercolumn ) ){
-      subscribercolumn := this.LibCal_SubscriberEventColumn( relnew, RowName := 'Line' );
-    }
-    eventcolumn := selectobject( this, LibCal_SubscriberEventColumn, column, column.RowName() = 'Event' );
-    if( isnull( eventcolumn ) ){
-      eventcolumn := this.LibCal_SubscriberEventColumn( relnew, RowName := 'Event' );
-    }
     
     traverse( subscribers, Elements, subscriber ){
-    //  info( '------------------------', subscriber.CalendarID(), subscriber.CalendarType() );
-    //  traverse( subscriber,Participation.astype( LibCal_Subscription ).LeadingParticipation, participation ){
+    
       traverse( subscriber,Participation.astype( LibCal_Subscription ).LeadingParticipation, participation, participation.Event().EventCategory().Name() = 'Unavailable' ){
-    //    info( '---------------1---------', participation.Event().Subject(), '------', participation.Event().EventCategory().Name() );
         event := participation.Event();
         
         row := selectobject( this, LibCal_SubscriberEventRow, row, row.Subscriber() = subscriber.CalendarID() 
@@ -34,32 +24,12 @@
                                                  Event := event.Subject(), 
                                                  EventType := event.EventType().Name() );
           
-          subscribercell := subscribercolumn.LibCal_SubscriberEventCell( relnew, Value := row.Subscriber() );
-          if( counter( this, LibCal_SubscriberEventRow, linerow, linerow.Subscriber() = row.Subscriber() ) <> 1 ){
-            subscribercell.Value( '' );
-          }
-          row.LibCal_SubscriberEventCell( relinsert, subscribercell );
-          
-          eventcell := eventcolumn.LibCal_SubscriberEventCell( relnew, Value := row.Event() );
-          row.LibCal_SubscriberEventCell( relinsert, eventcell );
           rownr := rownr + 1;
         }
         
         traverse( participation, ExplicitTimeInterval, eti ){
-          info( eti.Start(), eti.End(), eti.DefinitionName() );
-          if( this.ID() = 'Day' ){
-            this.InitializeDay( this, row, eti.Start(), eti.End(), event.Description() );
-          }else if( this.ID() = 'Week' ){
-            this.InitializeWeek( this, row, eti.Start(), eti.End(), event.Description() );
-          }else{
-            this.InitializeMonth( this, row, eti.Start(), eti.End(), event.Description() );
-          }
+          row.InitializeDate( this, eti.Start(), eti.End(), event.Description() );
         }
-        
-        
-    //
-    //    endTime     := participation.EndDate().DateTime( timezone ).AddAsPeriod( timezone, event.EndTimeOfDay() );
-    //    startTime   := participation.StartDate().DateTime( timezone ).AddAsPeriod( timezone, event.StartTimeOfDay() );
     
       }
     }
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl
deleted file mode 100644
index e543a38..0000000
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/Method_InitializeWeek.qbl
+++ /dev/null
@@ -1,46 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method InitializeWeek (
-  LibCal_SubscriberEventTable table,
-  LibCal_SubscriberEventRow row,
-  DateTime starttime,
-  DateTime endtime,
-  String desc
-)
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� May-29-2024 (created)
-    for(  startTime := starttime; startTime < endtime; startTime := startTime.StartOfNextWeek() ){
-      time := startTime;
-      if( starttime = startTime ){
-        time := startTime.StartOfWeek();
-      }
-      column := selectobject( table, LibCal_SubscriberEventColumn, column, column.Name() = time.Format( 'M/D/Y' ) );
-      if( isnull( column ) ){
-        column := table.LibCal_SubscriberEventColumn( relnew, Name := time.Format( 'M/D/Y' ), Period := time.Date() );
-      }
-      
-      cell := selectobject( column, LibCal_SubscriberEventCell, cell, cell.LibCal_SubscriberEventRow() = row );
-      if( isnull( cell ) ){
-        cell := column.LibCal_SubscriberEventCell( relnew, Value := '0'
-                                                     , Description := desc );
-        row.LibCal_SubscriberEventCell( relinsert, cell );
-      }
-      
-      value := [Real]cell.Value();
-      if( startTime.StartOfNextWeek() > endtime ){
-        duration := endtime - startTime;
-        value := value + duration.HoursAsReal();
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := endtime.Format( 'M/D/Y H:m' ) );
-      }else{
-        duration := startTime.StartOfNextWeek() - startTime;
-        value := value + duration.HoursAsReal();
-        cell.Period( relnew, Start := startTime.Format( 'M/D/Y H:m' ), End := startTime.StartOfNextWeek().Format( 'M/D/Y H:m' ) );
-      }
-      cell.Value( [String]value );
-      
-    //  info( startTime, column.Name(), duration.AsQUILL(), duration.HoursAsReal() );
-    }
-  *]
-}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_Export.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_Export.qbl
index 77d0846..4cc4cef 100644
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_Export.qbl
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_Export.qbl
@@ -1,66 +1,81 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Export (
-  LibCal_SubscriberEventTable table
+  LibCal_SubscriberEventColumns columns,
+  LibCal_SubscriberEventRows rows
 ) as BinaryValue
 {
   TextBody:
   [*
     // 鐢勫叞楦� May-30-2024 (created)
     // lihongji Jun-8-2023 (created)
-    returnBinaryData := BinaryData::Construct();
-    tableGroupHandle := TableGroupHandle::Create( "" );
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + LibCal_SubscriberEventTable::GetDefaultName() + '</name></table>' );
     
-    xmlImpl := XMLDOMImplementation::Create();
-    xmlDoc := xmlImpl.CreateDocument();
-    xmlSeri := xmlImpl.CreateSerializer();
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    //浜х嚎
+    subscribercolumnelement := xmlDOM.CreateElement( "column" );
+    subscribernameelement   := xmlDOM.CreateElement( "name" );
+    subscribertypeelement   := xmlDOM.CreateElement( "type" );
+    subscribernameelement.TextContent( '浜х嚎' );
+    subscribertypeelement.TextContent( "String" );
+    subscribercolumnelement.AppendChild( subscribernameelement );
+    subscribercolumnelement.AppendChild( subscribertypeelement );
+    //浜嬩欢
+    eventcolumnelement := xmlDOM.CreateElement( "column" );
+    eventnameelement   := xmlDOM.CreateElement( "name" );
+    eventtypeelement   := xmlDOM.CreateElement( "type" );
+    eventnameelement.TextContent( '浜嬩欢' );
+    eventtypeelement.TextContent( "String" );
+    eventcolumnelement.AppendChild( eventnameelement );
+    eventcolumnelement.AppendChild( eventtypeelement );
+    
+    tableElement.AppendChild( subscribercolumnelement ); 
+    tableElement.AppendChild( eventcolumnelement ); 
+    columns := selectsortedset( columns, Elements, column, column.Period() );
+    isfirst := true;
+    traverse ( columns, Elements, column ) {
+      columnelement := xmlDOM.CreateElement( "column" );
+      nameelement   := xmlDOM.CreateElement( "name" );
+      typeelement   := xmlDOM.CreateElement( "type" );
+      nameelement.TextContent( column.Name() );
+      typeelement.TextContent( "String" );
+      columnelement.AppendChild( nameelement );
+      columnelement.AppendChild( typeelement );
       
-    xmlTable := xmlDoc.CreateElement( "table" );
-    xmlTableName := xmlDoc.CreateElement( "name" );
-    xmlTableName.TextContent( table.Name() );
-    xmlTable.AppendChild( xmlTableName );
-      
-    traverse ( table, LibCal_SubscriberEventColumn, column ) {
-      xmlColumn := xmlDoc.CreateElement( "column" );
-      xmlColumnName := xmlDoc.CreateElement( "name" );
-      if( column.Index() = 0 ){
-        xmlColumnName.TextContent( '浜х嚎' );
-      }else if(column.Index() = 1 ){
-        xmlColumnName.TextContent( '浜嬩欢' );
-      }else{
-        xmlColumnName.TextContent( column.Name() );
-      }
-      xmlColumn.AppendChild( xmlColumnName );
-      xmlColumnType := xmlDoc.CreateElement( "type" );
-      xmlColumnType.TextContent( "String" );
-      xmlColumn.AppendChild( xmlColumnType );
-      
-      rowTotal := table.LibCal_SubscriberEventRow( relsize );
-      for ( i := 0; i < rowTotal; i++ ) {
-        cell := select( column, LibCal_SubscriberEventCell, cell, cell.LibCal_SubscriberEventRow().RowNr() = i );
-        row := cell.LibCal_SubscriberEventRow();
-        xmlCell := xmlDoc.CreateElement( "cell" );
-        if( column.Index() = 0 ){
-          xmlCell.SetAttribute( "value", row.Subscriber() );
-        }else if(column.Index() = 1 ){
-          xmlCell.SetAttribute( "value", row.Event() );
-        }else{
-          xmlCell.SetAttribute( "value", cell.Value() );
+      cells := selectsortedset( column, LibCal_SubscriberEventCell, cell, rows.Find( cell.LibCal_SubscriberEventRow() ) > -1, cell.LibCal_SubscriberEventRow().RowNr() );
+    
+      traverse ( cells, Elements, c ) {
+        if( isfirst ){
+          row := c.LibCal_SubscriberEventRow();
+          //subscriber
+          subscribercellElement := xmlDOM.CreateElement( "cell" );
+          subscribercellElement.SetAttribute( "value", row.Subscriber() );
+          subscribercolumnelement.AppendChild( subscribercellElement );
+          //event
+          eventcellElement := xmlDOM.CreateElement( "cell" );
+          eventcellElement.SetAttribute( "value", row.Event() );
+          eventcolumnelement.AppendChild( eventcellElement );
         }
-        xmlColumn.AppendChild( xmlCell );
+        cellElement := xmlDOM.CreateElement( "cell" );
+        cellElement.SetAttribute( "value", c.Value() ); 
+        columnelement.AppendChild( cellElement );
       }
-        
-      xmlTable.AppendChild( xmlColumn );
+      tableElement.AppendChild( columnelement );  
+      isfirst := false;
     }
       
-    xmlDoc.AppendChild( xmlTable );
-    xmlStr := xmlSeri.WriteToString( xmlDoc );
-    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlStr ) );
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( LibCal_SubscriberEventTable::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
     tableGroupHandle.Add( tableHandle );
-    //}
     
-    returnBinaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
     
-    return returnBinaryData.AsBinaryValue();
+    return binaryData.AsBinaryValue();
   *]
 }
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_GetDefaultName.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_GetDefaultName.qbl
new file mode 100644
index 0000000..ab03a51
--- /dev/null
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_GetDefaultName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefaultName () as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-23-2024 (created)
+    return 'Calendar unavailable event';
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl
index f6e41d1..e95dfc4 100644
--- a/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl
+++ b/_Main/BL/Type_LibCal_SubscriberEventTable/StaticMethod_InitializeTable.qbl
@@ -10,11 +10,9 @@
     // 鐢勫叞楦� May-28-2024 (created)
     owner.LibCal_SubscriberEventTable( relflush );
     if( owner.LibCal_SubscriberEventTable( relsize ) < 1 ){
-      owner.LibCal_SubscriberEventTable( relnew, ID := 'Day', Name := 'Day' );
-      owner.LibCal_SubscriberEventTable( relnew, ID := 'Week', Name := 'Week' );
-      owner.LibCal_SubscriberEventTable( relnew, ID := 'Month', Name := 'Month' );
+      owner.LibCal_SubscriberEventTable( relnew, ID := LibCal_SubscriberEventTable::GetDefaultName(), Name := LibCal_SubscriberEventTable::GetDefaultName() );
     }
-    info('-----------------------------', owner.LibCal_SubscriberEventTable( relsize ), subscribers.Size() );
+    
     traverse( owner, LibCal_SubscriberEventTable, table ){
       table.InitializeTable( subscribers );
     }
diff --git "a/_Main/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl" "b/_Main/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl"
new file mode 100644
index 0000000..fd50beb
--- /dev/null
+++ "b/_Main/BL/Type_LibCal_Subscription/Method_CopyOccurrences\043486.qbl"
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: #root
+Method CopyOccurrences #extension
+{
+  TextBody:
+  [*
+    timezone := this.Calendar().GetTimeZone();
+    
+    if( this.IsRecurring() and not this.LeadingParticipation().Event().IsMultiple() )
+    {
+      // If the participation ends at the start of a day, this is the start of the next day.
+      // In that case, one day should be subtracted in order to not take the next day into account. 
+      endDate := this.LeadingParticipation().RecurrencePeriod().EndDate()
+               - ifexpr( this.LeadingParticipation().EndTime() = this.LeadingParticipation().EndTime().StartOfDay( timezone ), 1, 0 );
+    
+      this.CopyOccurrences( this.LeadingParticipation().RecurrencePeriod().StartDate(), endDate );
+    }
+    else
+    {
+      // In case of a non-recurring event, there is only one occurrence (i.e. ExplicitTimeInterval),
+      // with an arbitrary Start and End. The Start and End of this occurrence must be used in order to have it copied to the subscription.
+      leadingETI := select( this.LeadingParticipation(), ExplicitTimeInterval, eti, true, true );
+    
+      if( not isnull( leadingETI ) )
+      {
+        endDate := leadingETI.End().Date( timezone )
+                 - ifexpr( leadingETI.End() = leadingETI.End().StartOfDay( timezone ), 1, 0 );
+        
+        this.CopyOccurrences( leadingETI.Start().Date( timezone ), endDate );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LibCal_Subscription/_ROOT_Type_LibCal_Subscription.qbl b/_Main/BL/Type_LibCal_Subscription/_ROOT_Type_LibCal_Subscription.qbl
new file mode 100644
index 0000000..ba6ae5b
--- /dev/null
+++ b/_Main/BL/Type_LibCal_Subscription/_ROOT_Type_LibCal_Subscription.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LibCal_Subscription #extension
+{
+}
diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
index 19ebdae..ddece8a 100644
--- "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -12,16 +12,16 @@
     // rislai Jul-9-2024 (created)
     table := owner.LocalTable( relnew,Name := "缁煎悎宸ユ椂鍒舵姤琛�");
     
-    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
-    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,CustomIndex := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,CustomIndex := 2);
     
-    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,CustomIndex := 3);
     
-    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,Index := 4);
-    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,CustomIndex := 4);
+    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,CustomIndex := 6);
     
-    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,Index := 8);
-    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,CustomIndex := 8);
+    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,CustomIndex := 10);
     
     units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
     
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
index b88493c..bf0aaa9 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -12,20 +12,20 @@
     // rislai Jul-4-2024 (created)
     table := owner.LocalTable( relnew,Name := "鏍囧噯宸ユ椂鍒舵姤琛�");
     
-    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
-    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,CustomIndex := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,CustomIndex := 2);
     
-    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,CustomIndex := 3);
     
-    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,Index := 4);
-    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,Index := 5);
-    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
-    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,Index := 7);
+    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,CustomIndex := 4);
+    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,CustomIndex := 5);
+    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,CustomIndex := 6);
+    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,CustomIndex := 7);
     
-    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,Index := 8);
-    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,Index := 9);
-    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
-    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,Index := 11);
+    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,CustomIndex := 8);
+    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,CustomIndex := 9);
+    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,CustomIndex := 10);
+    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,CustomIndex := 11);
     
     units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
     
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
index 5bdd4f8..44609af 100644
--- a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
@@ -30,7 +30,7 @@
           // 2023/01/01
           index := [Number]generalColumn.Name().ReplaceAll( "/", "" );
         }
-        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),Index := index );
+        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),CustomIndex := index );
         columns.Add( column );
         columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
       }
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl
new file mode 100644
index 0000000..e46be0b
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Actual
+{
+  #keys: '3[412672.1.64753749][412672.1.64753748][412672.1.64753750]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl
new file mode 100644
index 0000000..7abefbe
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BaseVersionValue
+{
+  #keys: '3[412672.1.64753763][412672.1.64753762][412672.1.64753764]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl
new file mode 100644
index 0000000..8e0d3b4
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CompareVersionValue
+{
+  #keys: '3[412672.1.64753752][412672.1.64753751][412672.1.64753753]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl
new file mode 100644
index 0000000..e066a00
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Gap
+{
+  #keys: '3[412672.1.64753755][412672.1.64753754][412672.1.64753756]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl
new file mode 100644
index 0000000..7592aad
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Plan
+{
+  #keys: '3[412672.1.64753743][412672.1.64753742][412672.1.64753744]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl
new file mode 100644
index 0000000..2f8d5c8
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: BaseVersionValue
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl
new file mode 100644
index 0000000..3f4ebb7
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: CompareVersionValue
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl
new file mode 100644
index 0000000..dcff02a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcGap
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    
+    value := this.Plan() - this.Actual();
+    
+    this.Gap( value );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl
new file mode 100644
index 0000000..f235f04
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetAttributeByName (
+  String attributeName
+) const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    value := "";
+    
+    if( attributeName = "BaseVersion" ){
+       if( not this.LocalColumn().IsAttrbuteColumn() ){
+         value := this.Plan().Format( "N(Dec)" );
+       }
+    }
+    if( attributeName = "CompareVersion" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.Actual().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "Gap" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.Gap().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "BaseVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.BaseVersionValue();
+      }
+    }
+    if( attributeName = "CompareVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.CompareVersionValue();
+      }
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl
new file mode 100644
index 0000000..d19420b
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AsyncExport (
+  RecycleBin recycleBin,
+  const constcontent LocalRows rows,
+  const constcontent LocalColumns columns,
+  const MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    sortColumns := selectsortedset( columns,Elements,column,true,column.Index());
+    
+    attributeNames := LocalCell_DemandComparison::GetAttributeNames();
+    
+    columnstring := emit( "" );
+    flag := true;
+    traverse( sortColumns,Elements,sortColumn ){
+      if( flag ){
+        attributeXML := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames,"attribute",macroPlan );
+        columnstring := columnstring.Merge( attributeXML )
+        flag := false;
+      }
+      
+      cellxml := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames ,"data",macroPlan );
+      columnstring := columnstring.Merge( cellxml);
+    }
+     
+    columnstring -> GroupAll() -> ExportXMLManager::AwaitLocalTableXMLData( recycleBin,guard( rows.Element(0).LocalTable().Name(),"Sheet1") );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl
new file mode 100644
index 0000000..3c0055a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl
@@ -0,0 +1,118 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Compared (
+  RecycleBin recycleBin,
+  String baseVersionPath,
+  String compareVersionPath,
+  String baseVersionName,
+  String compareVersionName
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    localTable := recycleBin.LocalTable( relnew,Name := baseVersionName + "__" + compareVersionName );
+    
+    baseVersionFile := OSFile::Construct();
+    compareVersionFile := OSFile::Construct();
+    
+    try {
+      baseVersionFile.Open( baseVersionPath, "Read", false );
+      baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionFile.ReadBinary(), baseVersionPath );
+      baseVersionDataSource.ReadStructure();
+      
+      compareVersionFile.Open( compareVersionPath, "Read", false );
+      compareVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, compareVersionFile.ReadBinary(), compareVersionPath );
+      compareVersionDataSource.ReadStructure();
+      
+      baseVersionTable := select( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      compareVersionTable := select( compareVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      
+      if( not isnull( baseVersionTable ) and not isnull( compareVersionTable )){
+        
+        //鐢熸垚琛屾暟鎹�
+        rowKeys := construct( Strings );
+        baseVersionRowTree := NamedValueTree::Create();
+        baseVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        compareVersionRowTree := NamedValueTree::Create();
+        compareVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        LocalCell_DemandComparison::FillRows( baseVersionTable,rowKeys,baseVersionRowTree,baseVersionRows );
+        LocalCell_DemandComparison::FillRows( compareVersionTable,rowKeys,compareVersionRowTree,compareVersionRows );
+        
+        // 鐢熸垚鍒楁暟鎹�
+        columnTree := NamedValueTree::Create();
+        columns := construct( LocalColumns );
+        LocalCell_DemandComparison::GenerateColumnIndex( baseVersionTable,localTable,columnTree,columns );
+        LocalCell_DemandComparison::GenerateColumnIndex( compareVersionTable,localTable,columnTree,columns );
+        columnNames := selectvalues( columns,Elements,column,true,column.Name() );
+        
+        // 鐢熸垚鏁版嵁
+        
+        for ( rowIndex := 0; rowIndex < rowKeys.Size(); rowIndex++ ) {
+          rowKey := rowKeys.Element( rowIndex );
+          
+          baseVersionCellTree := NamedValueTree::Create();
+          baseVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          compareVersionCellTree := NamedValueTree::Create();
+          compareVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          LocalCell_DemandComparison::FillCells( rowKey,baseVersionRowTree,baseVersionRows,baseVersionCellTree,baseVersionCells );
+          LocalCell_DemandComparison::FillCells( rowKey,compareVersionRowTree,compareVersionRows,compareVersionCellTree,compareVersionCells );
+          
+          row := localTable.LocalRow( relnew,Index := localTable.GetRowIndexCache()  );
+          
+          traverse( columnNames,Elements,columnName ){
+            columnHandle := columnTree.GetHandle( columnName );
+            columnIndex := columnTree.Root().Child( columnHandle ).GetValueAsNumber();
+            column := columns.Element( columnIndex );
+            
+            baseVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            baseVersionCellHandle := baseVersionCellTree.GetHandle( columnName );
+            try{
+              baseVersionCellIndex := baseVersionCellTree.Root().Child( baseVersionCellHandle ).GetValueAsNumber();
+              baseVersionCell := baseVersionCells.Element( baseVersionCellIndex );
+            }onerror{}
+            
+            compareVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            compareVersionCellHandle := compareVersionCellTree.GetHandle( columnName );
+            try{
+              compareVersionCellIndex := compareVersionCellTree.Root().Child( compareVersionCellHandle ).GetValueAsNumber();
+              compareVersionCell := compareVersionCells.Element( compareVersionCellIndex );
+            }onerror{}
+            
+            if( columnName = "浜у湴" or columnName = "杞﹀瀷" or columnName = "鍙戝姩鏈洪浂浠跺彿" or columnName = "鍙戝姩鏈哄洓浣嶇爜" ){
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersionValue := ifexpr( isnull( baseVersionCell ), "绌�", baseVersionCell.Value()),
+                             CompareVersionValue := ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()));
+              column.IsAttrbuteColumn( true );
+              if( columnName = "鍙戝姩鏈洪浂浠跺彿" ){
+                row.CustomName( ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value()) );
+              }
+            }else{
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersion := ifexpr( isnull( baseVersionCell ),0,[Real]baseVersionCell.Value()),
+                             CompareVersion := ifexpr( isnull( compareVersionCell ), 0 ,[Real]compareVersionCell.Value() ));
+            }
+          }
+        }
+      }
+      // 鍚庣画鍒犻櫎
+      baseVersionDataSource.Delete();
+      compareVersionDataSource.Delete();
+      
+      baseVersionFile.Close();
+      compareVersionFile.Close();
+    } onerror {
+      if( not isnull( baseVersionFile )){
+        baseVersionFile.Close(); 
+      }
+      if( not isnull( compareVersionFile )){
+        compareVersionFile.Close(); 
+      }
+      error( e );
+    }
+    
+    return localTable;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl
new file mode 100644
index 0000000..6aeded1
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillCells (
+  String rowName,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows,
+  NamedValueTree cellTree,
+  constcontent GeneralExcelImportAndExportDataCells cells
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowHandel := rowTree.GetHandle( rowName );
+    try{
+      rowIndex := rowTree.Root().Child( rowHandel ).GetValueAsNumber();
+      row := rows.Element( rowIndex );
+      
+      temp_cells := selectsortedset( row,GeneralExcelImportAndExportDataCell,cell,true,cell.GeneralExcelImportAndExportDataColumn().ColumnIndex() );
+      for( i := 0 ; i<temp_cells.Size();i++ ){
+        cell := temp_cells.Element( i );
+        tempHandle := cellTree.GetHandle( cell.GeneralExcelImportAndExportDataColumn().Name() );
+        
+        cells.Add( cell );
+        cellTree.Root().AddChild( tempHandle,cells.Size() - 1 );
+        
+      }
+    }onerror{}
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl
new file mode 100644
index 0000000..391100a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillRows (
+  const GeneralExcelImportAndExportDataTable general,
+  Strings rowKeys,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowKeyColumn1 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "浜у湴" );
+    rowKeyColumn2 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "杞﹀瀷" );
+    rowKeyColumn3 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈洪浂浠跺彿" );
+    rowKeyColumn4 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈哄洓浣嶇爜" );
+    tempRowKeyCells1 := selectset( rowKeyColumn1,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells2 := selectset( rowKeyColumn2,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells3 := selectset( rowKeyColumn3,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells4 := selectset( rowKeyColumn4,GeneralExcelImportAndExportDataCell,cell,true );
+    
+    for( i := 0; i< tempRowKeyCells1.Size(); i++ ){
+      tempRowKeyCell1 := tempRowKeyCells1.Element( i );
+      tempRowKeyCell2 := tempRowKeyCells2.Element( i );
+      tempRowKeyCell3 := tempRowKeyCells3.Element( i );
+      tempRowKeyCell4 := tempRowKeyCells4.Element( i );
+      
+      rowKey := tempRowKeyCell1.Value() + tempRowKeyCell2.Value() + tempRowKeyCell3.Value() + tempRowKeyCell4.Value();
+      
+      tempHandle := rowTree.GetHandle( rowKey );
+      rowTree.Root().AddChild( tempHandle ,i);
+      rows.Add( tempRowKeyCell1.GeneralExcelImportAndExportDataRow());
+      rowKeys.Add( rowKey );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl
new file mode 100644
index 0000000..44609af
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateColumnIndex (
+  const GeneralExcelImportAndExportDataTable table,
+  LocalTable localTable,
+  NamedValueTree columnTree,
+  LocalColumns columns
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    tableColumns := selectset( table,GeneralExcelImportAndExportDataColumn,column,true );
+    for( i := 0; i< tableColumns.Size(); i++ ){
+      generalColumn := tableColumns.Element( i );
+      tempHandle := columnTree.GetHandle( generalColumn.Name() );
+    
+      nameValue := guard( columnTree.Root().Child( tempHandle ),null( NamedValue )); 
+      if( isnull( nameValue )){
+        index := 999;
+        if( generalColumn.Name() = "浜у湴" ){
+          index := 1;
+        }else if( generalColumn.Name() = "杞﹀瀷" ){
+          index := 2;
+        }else if( generalColumn.Name() = "鍙戝姩鏈洪浂浠跺彿" ){
+          index := 3;
+        }else if( generalColumn.Name() = "鍙戝姩鏈哄洓浣嶇爜" ){
+          index := 4;
+        }else{
+          // 2023/01/01
+          index := [Number]generalColumn.Name().ReplaceAll( "/", "" );
+        }
+        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),CustomIndex := index );
+        columns.Add( column );
+        columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl
new file mode 100644
index 0000000..1072935
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetAttributeNames () const declarative as owning Strings
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    attributeNames := construct( Strings );
+    
+    attributeNames.Add( "BaseVersion" );
+    attributeNames.Add( "CompareVersion" );
+    attributeNames.Add( "Gap" );
+    
+    return &attributeNames;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl
new file mode 100644
index 0000000..6d45dc4
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetColumnXML (
+  const constcontent LocalRows rows,
+  const LocalColumn column,
+  const Strings attributeNames,
+  String type,
+  const MacroPlan macroPlan
+) const as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    // rislai Jun-20-2024 (created)
+    columnXML := "";
+    cells := selectsortedset( column, LocalCell.astype( LocalCell_DemandComparison ), cell,
+                                  exists( rows,Elements,element,element = cell.LocalRow()), cell.LocalRow().Index());
+    if( type = "data" ){
+      columnXML := "";
+      if( column.IsAttrbuteColumn() ){
+        columnXML := "<column><name>" + column.Name() + "</name><type>String</type>"; 
+      }else{
+        columnXML := "<column><name>" + column.Name() + "</name><type>Number</type>"; 
+      }
+      traverse ( cells, Elements, cell ) {
+        traverse( attributeNames ,Elements,e ){
+          cellXML := '<cell value="' + cell.GetAttributeByName( e ) + '"/>'
+          columnXML := columnXML + cellXML;
+        }
+      }
+      columnXML := columnXML + "</column>";
+    }
+    if( type = "attribute" ){
+      columnXML0_1 := "<column><name>Sales Segment</name><type>String</type>";
+      columnXML0_2 := "<column><name>Generation</name><type>String</type>";
+      columnXML0_3 := "<column><name>MQB/MLB</name><type>String</type>";
+      columnXML0_4 := "<column><name>鍔熺巼</name><type>String</type>";
+      
+      columnXML1 := "<column><name>Product ID</name><type>String</type>";
+      columnXML2 := "<column><name>Attribute</name><type>String</type>";
+      
+      traverse ( cells, Elements, cell ) {
+        flag := true;
+        traverse( attributeNames ,Elements,e ){
+          if( flag ){
+            cellXML := '<cell value="' + cell.LocalRow().Name() + '"/>'
+            columnXML1 := columnXML1 + cellXML;
+            
+            salesSegment := select( cell.LocalRow().LocalTable(),LocalColumn.LocalCell.astype( LocalCell_DemandComparison ),temp_cell,temp_cell.LocalRow() = cell.LocalRow() and temp_cell.LocalColumn().Name() = "浜у湴");
+            if( not isnull( salesSegment )){
+              cellXML0_1 := '<cell value="' + ifexpr( salesSegment.BaseVersionValue() <> "绌�",salesSegment.BaseVersionValue(),salesSegment.CompareVersionValue()) + '"/>';
+              columnXML0_1 := columnXML0_1 + cellXML0_1;
+            }else{
+              cellXML0_1 := '<cell value="  "/>'
+              columnXML0_1 := columnXML0_1 + cellXML0_1;
+            }
+            
+            product := select( macroPlan,Product_MP,product,product.ID() = cell.LocalRow().Name() );
+            if( not isnull( product )){
+              cellXML0_2 := '<cell value="' + product.Generation() + '"/>';
+              cellXML0_3 := '<cell value="' + product.MQBMLB() + '"/>';
+              cellXML0_4 := '<cell value="' + product.Power() + '"/>';
+              columnXML0_2 := columnXML0_2 + cellXML0_2;
+              columnXML0_3 := columnXML0_3 + cellXML0_3;
+              columnXML0_4 := columnXML0_4 + cellXML0_4;
+            }else{
+              cellXML0_2 := '<cell value="  "/>';
+              cellXML0_3 := '<cell value="  "/>';
+              cellXML0_4 := '<cell value="  "/>';
+              columnXML0_2 := columnXML0_2 + cellXML0_2;
+              columnXML0_3 := columnXML0_3 + cellXML0_3;
+              columnXML0_4 := columnXML0_4 + cellXML0_4;
+            }
+            
+            flag := false;
+          }else{
+            cellXML := '<cell value="  "/>'
+            columnXML1 := columnXML1 + cellXML;
+            cellXML0_1 := '<cell value="  "/>'
+            cellXML0_2 := '<cell value="  "/>';
+            cellXML0_3 := '<cell value="  "/>';
+            cellXML0_4 := '<cell value="  "/>';
+            columnXML0_1 := columnXML0_1 + cellXML0_1;
+            columnXML0_2 := columnXML0_2 + cellXML0_2;
+            columnXML0_3 := columnXML0_3 + cellXML0_3;
+            columnXML0_4 := columnXML0_4 + cellXML0_4;
+          }
+          cellXML := '<cell value="' + e + '"/>'
+          columnXML2 := columnXML2 + cellXML;
+        }
+      }
+      columnXML := columnXML0_1 + "</column>" + columnXML0_2 + "</column>" + columnXML0_3 + "</column>" + columnXML0_4 + "</column>" + columnXML1 + "</column>" + columnXML2 + "</column>";
+    }
+     
+    return columnXML;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl
new file mode 100644
index 0000000..3271cca
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LocalCell_ProductionComparison
+{
+  #keys: '2[412672.1.64753741][412672.1.64753740]'
+  Parent: LocalCell
+  StructuredName: 'LocalCell_ProductionComparisons'
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_CustomDate.qbl b/_Main/BL/Type_LocalColumn/Attribute_CustomDate.qbl
new file mode 100644
index 0000000..e6fafe9
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_CustomDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomDate
+{
+  #keys: '3[412672.1.50711484][412672.1.50711483][412672.1.50711485]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl b/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl
new file mode 100644
index 0000000..08e7058
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomIndex
+{
+  #keys: '3[412672.1.64721865][412672.1.64721864][412672.1.64721866]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl b/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl
new file mode 100644
index 0000000..d26aba3
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: '-999'
+  TargetAttribute: CustomIndex
+}
diff --git a/_Main/BL/Type_LocalColumn/Function_CalcDate.qbl b/_Main/BL/Type_LocalColumn/Function_CalcDate.qbl
index 2e99838..2f59aa9 100644
--- a/_Main/BL/Type_LocalColumn/Function_CalcDate.qbl
+++ b/_Main/BL/Type_LocalColumn/Function_CalcDate.qbl
@@ -7,7 +7,7 @@
     // rislai Jun-28-2024 (created)
     if( not this.IsAttrbuteColumn() ){
       names := this.Name().Tokenize( "/" );
-      this.Date( guard( Date::Construct( [Number]names.Element( 0 ),[Number]names.Element( 1 ),[Number]names.Element( 2 )),Date::MinDate() ));
+      this.Date( ifexpr( this.CustomDate() <> Date::MinDate(),this.CustomDate(),guard( Date::Construct( [Number]names.Element( 0 ),[Number]names.Element( 1 ),[Number]names.Element( 2 )),Date::MinDate() )));
     }
   *]
 }
diff --git a/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
new file mode 100644
index 0000000..8319f34
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // rislai Jul-24-2024 (created)
+    year := this.Date().Year();
+    month := this.Date().Month();
+    day := this.Date().Day();
+    
+    index := [String]year;
+    if( month < 10 ){
+      index := index + "0" + [String]month; 
+    }
+    if( day < 10 ){
+      index := index + "0" + [String]day; 
+    }
+    
+    
+    value := ifexpr( this.CustomIndex() = -999,[Number]index,this.CustomIndex() );
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_AllTotal.qbl b/_Main/BL/Type_MachineStockData/Attribute_AllTotal.qbl
new file mode 100644
index 0000000..b3eb4eb
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_AllTotal.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute AllTotal
+{
+  #keys: '3[415136.0.931886946][415136.0.931886945][415136.0.931886947]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_DDay.qbl b/_Main/BL/Type_MachineStockData/Attribute_DDay.qbl
new file mode 100644
index 0000000..d1a9eef
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_DDay.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DDay
+{
+  #keys: '3[415136.0.931886953][415136.0.931886952][415136.0.931886954]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Date.qbl b/_Main/BL/Type_MachineStockData/Attribute_Date.qbl
new file mode 100644
index 0000000..4bc883d
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Date.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Date
+{
+  #keys: '3[415136.0.931886848][415136.0.931886847][415136.0.931886849]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Fac.qbl b/_Main/BL/Type_MachineStockData/Attribute_Fac.qbl
new file mode 100644
index 0000000..3330234
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Fac.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Fac
+{
+  #keys: '3[415136.0.931886928][415136.0.931886927][415136.0.931886929]'
+  Description: '宸ュ巶code'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_FacName.qbl b/_Main/BL/Type_MachineStockData/Attribute_FacName.qbl
new file mode 100644
index 0000000..c29b23b
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_FacName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FacName
+{
+  #keys: '3[415136.0.931886918][415136.0.931886917][415136.0.931886919]'
+  Description: '宸ュ巶鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Inventory.qbl b/_Main/BL/Type_MachineStockData/Attribute_Inventory.qbl
new file mode 100644
index 0000000..b983b8f
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Inventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Inventory
+{
+  #keys: '3[415136.0.931886842][415136.0.931886841][415136.0.931886843]'
+  Description: '瀵瑰簲鏃ユ湡鐨勫疄闄呭簱瀛樻暟閲�'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_LineType.qbl b/_Main/BL/Type_MachineStockData/Attribute_LineType.qbl
new file mode 100644
index 0000000..bcae9ae
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_LineType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute LineType
+{
+  #keys: '3[415136.0.931886957][415136.0.931886956][415136.0.931886958]'
+  Description: '浜х嚎绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_MaterialName.qbl b/_Main/BL/Type_MachineStockData/Attribute_MaterialName.qbl
new file mode 100644
index 0000000..f566022
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_MaterialName.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaterialName
+{
+  #keys: '3[415136.0.931886910][415136.0.931886909][415136.0.931886911]'
+  Description: '闆朵欢鍚嶇О'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_MaterialNo.qbl b/_Main/BL/Type_MachineStockData/Attribute_MaterialNo.qbl
new file mode 100644
index 0000000..9da74c7
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_MaterialNo.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaterialNo
+{
+  #keys: '3[415136.0.931886900][415136.0.931886899][415136.0.931886901]'
+  Description: '闆朵欢鍙�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Product.qbl b/_Main/BL/Type_MachineStockData/Attribute_Product.qbl
new file mode 100644
index 0000000..a249e20
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Product.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Product
+{
+  #keys: '3[415136.0.931886845][415136.0.931886844][415136.0.931886846]'
+  Description: '浜у搧'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Total.qbl b/_Main/BL/Type_MachineStockData/Attribute_Total.qbl
new file mode 100644
index 0000000..9691ce7
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Total.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Total
+{
+  #keys: '3[415136.0.931886936][415136.0.931886935][415136.0.931886937]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MachineStockData/Attribute_Unit.qbl b/_Main/BL/Type_MachineStockData/Attribute_Unit.qbl
new file mode 100644
index 0000000..0fb83f7
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/Attribute_Unit.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Unit
+{
+  #keys: '3[415136.0.931886839][415136.0.931886838][415136.0.931886840]'
+  Description: '搴撳瓨鐐逛俊鎭�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MachineStockData/StaticMethod_GenerateData.qbl b/_Main/BL/Type_MachineStockData/StaticMethod_GenerateData.qbl
new file mode 100644
index 0000000..d070932
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/StaticMethod_GenerateData.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateData (
+  InterfaceLoginfo owner,
+  StringToDate cnv,
+  JSON item
+) as MachineStockData
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-17-2024 (created)
+    material_no       := guard( item.Get( "material_no").GetString(),"");
+    material_name     := guard( item.Get( "material_name").GetString(),"");
+    fac_name          := guard( item.Get( "fac_name").GetString(),"");
+    fac               := guard( item.Get( "fac").GetString(),"");
+    total             := guard( item.Get( "total").GetReal(), 0 );
+    all_total         := guard( item.Get( "all_total").GetReal(), 0 );
+    dday              := guard( item.Get( "dday").GetString(),"");
+    line_type         := guard( item.Get( "fac").GetString(),"");
+    
+    msdata           := owner.MachineStockData( relnew, MaterialNo := material_no
+                                                  , MaterialName := material_name
+                                                  , Fac := fac
+                                                  , FacName := fac_name
+                                                  , Total := total
+                                                  , AllTotal := all_total
+                                                  , DDay := cnv.Convert( dday )
+                                                  , LineType := line_type );
+    
+    return msdata;
+  *]
+}
diff --git a/_Main/BL/Type_MachineStockData/StaticMethod_GetRequestBody.qbl b/_Main/BL/Type_MachineStockData/StaticMethod_GetRequestBody.qbl
new file mode 100644
index 0000000..3751bf2
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/StaticMethod_GetRequestBody.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetRequestBody (
+  Date date
+) as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-19-2024 (created)
+    json := JSON::Object()
+                  .Add( "inParam", JSON::Object().Add( "dday", date.Format( "Y-M2-D2" ) ).Add( "fac", "" ) ).Build();
+    requestbody := json.AsString();
+    return requestbody
+  *]
+}
diff --git a/_Main/BL/Type_MachineStockData/StaticMethod_Synchronize.qbl b/_Main/BL/Type_MachineStockData/StaticMethod_Synchronize.qbl
new file mode 100644
index 0000000..6bc9761
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/StaticMethod_Synchronize.qbl
@@ -0,0 +1,33 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Synchronize (
+  InterfaceDataset owner,
+  String executor
+)
+{
+  TextBody:
+  [*
+    //// 鐢勫叞楦� Jul-17-2024 (created)
+    date    := Date::ActualDate();
+    loginfo := owner.InterfaceLoginfo( relnew, ExecuteUser := executor
+                                       , Name := Translations::InterfaceDataset_MachineStockData_Name()
+                                       , InterfaceDateTime := DateTime::ActualTime()
+                                       , Message := '搴撳瓨鏁版嵁锛堟満鍔犲簱瀛橈級'
+                                       , RequestBody := MachineStockData::GetRequestBody( date ) );
+    
+    data := InterfaceLoginfo::CallInterface( owner, loginfo );
+    if( not isnull( data ) ){
+      
+      cnv2 := StringToDate::StandardConverter();
+      cnv2.SetCustomConversion();
+      cnv2.CustomFormatString( 'yyyy-MM-dd' );
+      
+    //  sadatalist := construct( ShippingActualDatas );
+      for( seq := 0;seq < data.Size();seq++){
+        item := data.Get(seq);
+        MachineStockData::GenerateData( loginfo, cnv2, item );
+    //    sadatalist.Add( sadata );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MachineStockData/_ROOT_Type_MachineStockData.qbl b/_Main/BL/Type_MachineStockData/_ROOT_Type_MachineStockData.qbl
new file mode 100644
index 0000000..429b55e
--- /dev/null
+++ b/_Main/BL/Type_MachineStockData/_ROOT_Type_MachineStockData.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MachineStockData
+{
+  #keys: '5[415136.0.931886835][415136.0.931886833][0.0.0][415136.0.931886834][415136.0.931886836]'
+  BaseType: Object
+  Description: '搴撳瓨鏁版嵁锛堟満鍔犲簱瀛橈級'
+  StructuredName: 'MachineStockDatas'
+}
diff --git a/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl b/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl
new file mode 100644
index 0000000..9434ec7
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl
@@ -0,0 +1,62 @@
+Quintiq file version 2.0
+#parent: #root
+Method Comparison (
+  RecycleBin recycleBin
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Jul-17-2024 (created)
+    macroPlan := this.MacroPlan();
+    table := recycleBin.LocalTable( relnew,Name := "浜ч噺瀵规瘮鎶ヨ〃");
+    
+    actualDailyProductionDatas := selectset( macroPlan,ActualDailyProductionData,data,true );
+    actualDailyProductionDataIndexTree := NamedValueTree::Create();
+    for( i := 0; i< actualDailyProductionDatas.Size(); i++ ){
+      actualDailyProductionData := actualDailyProductionDatas.Element( i );
+      actualDailyProductionDataKey := actualDailyProductionData.Product() + actualDailyProductionData.Date().AsQUILL();
+      actualDailyProductionDataHandle := actualDailyProductionDataIndexTree.GetHandle( actualDailyProductionDataKey );
+      actualDailyProductionDataIndexTree.Root().AddChild( actualDailyProductionDataHandle,i ); 
+    }
+    
+    localColumns := construct( LocalColumns );
+    localColumnIndexTree := NamedValueTree::Create();
+    traverse( this,OfflinePlanColumn,column,column.ColumnDate() >=  macroPlan.StartOfPlanning().Date()){
+      localColumn := table.LocalColumn( relnew,CustomDate := column.ColumnDate());
+      localColumnHandle := localColumnIndexTree.GetHandle( column.ColumnDate().AsQUILL() );
+      localColumns.Add( localColumn );
+      localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 );
+    }
+    
+    traverse( this,OfflinePlanRow,row,row.Type() = "1" ){
+      productID := row.ProductID();
+      productLine := row.ProductionLine();
+      localRow := table.LocalRow( relnew,Index := table.GetRowIndexCache(),CustomName := productID );
+      traverse( row,OfflinePlanCell,cell,cell.OfflinePlanColumn().ColumnDate() >= macroPlan.StartOfPlanning().Date() ){
+        localColumnHandle := localColumnIndexTree.GetHandle( cell.OfflinePlanColumn().ColumnDate().AsQUILL() );
+        localColumnIndex := guard( localColumnIndexTree.Root().Child( localColumnHandle ),null( NamedValue ));
+        if( not isnull( localColumnIndex )){
+          actualDailyProductionDataKey := productID + cell.OfflinePlanColumn().ColumnDate().AsQUILL();
+          actualDailyProductionDataHandle := actualDailyProductionDataIndexTree.GetHandle( actualDailyProductionDataKey );
+          actualDailyProductionDataIndex := guard( actualDailyProductionDataIndexTree.Root().Child( actualDailyProductionDataHandle ),null( NamedValue ));
+          
+          actualDailyProductionVolume := 0.0;
+          if( not isnull( actualDailyProductionDataIndex )){
+            actualDailyProductionData := actualDailyProductionDatas.Element( actualDailyProductionDataIndex.GetValueAsNumber() );
+            actualDailyProductionVolume := actualDailyProductionData.ProductionVolume();
+          }
+          localColumn := localColumns.Element( localColumnIndex.GetValueAsNumber() );
+          localRow.LocalCell( relnew,LocalCell_ProductionComparison ,LocalColumn := localColumn,
+                                           Plan := cell.Quantity(),Actual := actualDailyProductionVolume );
+        }
+      }
+    }
+    traverse( table,LocalColumn,column ){
+      if( column.LocalCell( relsize ) = 0 ){
+        column.Delete(); 
+      } 
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualCell/Attribute_Quantity.qbl b/_Main/BL/Type_ShippingActualCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..fc57d0a
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualCell/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[415136.0.904040075][415136.0.904040074][415136.0.904040076]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ShippingActualCell/_ROOT_Type_ShippingActualCell.qbl b/_Main/BL/Type_ShippingActualCell/_ROOT_Type_ShippingActualCell.qbl
new file mode 100644
index 0000000..eea883e
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualCell/_ROOT_Type_ShippingActualCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShippingActualCell
+{
+  #keys: '5[415136.0.904040072][415136.0.904040070][0.0.0][415136.0.904040071][415136.0.904040073]'
+  BaseType: Object
+  Description: '瀹為檯鍙戣繍鏁版嵁鍗曞厓鏍�'
+  StructuredName: 'ShippingActualCells'
+}
diff --git a/_Main/BL/Type_ShippingActualColumn/Attribute_Index.qbl b/_Main/BL/Type_ShippingActualColumn/Attribute_Index.qbl
new file mode 100644
index 0000000..ced89a2
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualColumn/Attribute_Index.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Index
+{
+  #keys: '3[415136.0.904040147][415136.0.904040146][415136.0.904040148]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_ShippingActualColumn/Attribute_StartDate.qbl b/_Main/BL/Type_ShippingActualColumn/Attribute_StartDate.qbl
new file mode 100644
index 0000000..dab5099
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualColumn/Attribute_StartDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[415136.0.904040023][415136.0.904040022][415136.0.904040024]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ShippingActualColumn/_ROOT_Type_ShippingActualColumn.qbl b/_Main/BL/Type_ShippingActualColumn/_ROOT_Type_ShippingActualColumn.qbl
new file mode 100644
index 0000000..da2edb7
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualColumn/_ROOT_Type_ShippingActualColumn.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShippingActualColumn
+{
+  #keys: '5[415136.0.904040006][415136.0.904040004][0.0.0][415136.0.904040005][415136.0.904040007]'
+  BaseType: Object
+  Description: '瀹為檯鍙戣繍鏁版嵁鍒�'
+  StructuredName: 'ShippingActualColumns'
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_CreateTime.qbl b/_Main/BL/Type_ShippingActualData/Attribute_CreateTime.qbl
new file mode 100644
index 0000000..f856ece
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_CreateTime.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CreateTime
+{
+  #keys: '3[415136.0.904000065][415136.0.904000064][415136.0.904000066]'
+  Description: '鏃堕棿'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_DDay.qbl b/_Main/BL/Type_ShippingActualData/Attribute_DDay.qbl
new file mode 100644
index 0000000..e1631e0
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_DDay.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute DDay
+{
+  #keys: '3[415136.0.904000085][415136.0.904000084][415136.0.904000086]'
+  Description: '鏃ユ湡'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_Fac.qbl b/_Main/BL/Type_ShippingActualData/Attribute_Fac.qbl
new file mode 100644
index 0000000..407b39b
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_Fac.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Fac
+{
+  #keys: '3[415136.0.904000115][415136.0.904000114][415136.0.904000116]'
+  Description: '宸ュ巶浠g爜'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_FourCode.qbl b/_Main/BL/Type_ShippingActualData/Attribute_FourCode.qbl
new file mode 100644
index 0000000..cc1e7e5
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_FourCode.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute FourCode
+{
+  #keys: '3[415136.0.904000095][415136.0.904000094][415136.0.904000096]'
+  Description: '鍥涗綅鐮�'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_ID.qbl b/_Main/BL/Type_ShippingActualData/Attribute_ID.qbl
new file mode 100644
index 0000000..9ced94f
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[415136.0.904000125][415136.0.904000124][415136.0.904000126]'
+  Description: '闆朵欢鍚嶇О'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_ShippingActualData/Attribute_Quantity.qbl b/_Main/BL/Type_ShippingActualData/Attribute_Quantity.qbl
new file mode 100644
index 0000000..594b5da
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/Attribute_Quantity.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[415136.0.904000105][415136.0.904000104][415136.0.904000106]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_ShippingActualData/StaticMethod_Export.qbl b/_Main/BL/Type_ShippingActualData/StaticMethod_Export.qbl
new file mode 100644
index 0000000..2a07ff6
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/StaticMethod_Export.qbl
@@ -0,0 +1,64 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  InterfaceDataset owner
+) as BinaryValue
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-18-2024 (created)
+    name := ShippingActualData::GetDefalutName();
+    
+    xmlDOMI := XMLDOMImplementation::Create();
+    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + name + '</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    //Product
+    productcolumnelement := xmlDOM.CreateElement( "column" );
+    productnameelement   := xmlDOM.CreateElement( "name" );
+    producttypeelement   := xmlDOM.CreateElement( "type" );
+    productnameelement.TextContent( 'Product' );
+    producttypeelement.TextContent( "String" );
+    productcolumnelement.AppendChild( productnameelement );
+    productcolumnelement.AppendChild( producttypeelement );
+    
+    tableElement.AppendChild( productcolumnelement ); 
+    traverse ( owner, ShippingActualColumn, column ) {
+      columnelement := xmlDOM.CreateElement( "column" );
+      nameelement   := xmlDOM.CreateElement( "name" );
+      typeelement   := xmlDOM.CreateElement( "type" );
+      nameelement.TextContent( column.StartDate().Format( "M2/D2/Y" ) );
+      typeelement.TextContent( "String" );
+      columnelement.AppendChild( nameelement );
+      columnelement.AppendChild( typeelement );
+      
+      cells := selectsortedset( column, ShippingActualCell, cell, cell.ShippingActualRow().RowNr() );
+    
+      traverse ( cells, Elements, c ) {
+        if( column.Index() = 0 ){
+          row := c.ShippingActualRow();
+          //Product
+          productcellElement := xmlDOM.CreateElement( "cell" );
+          productcellElement.SetAttribute( "value", row.Name() );
+          productcolumnelement.AppendChild( productcellElement );
+        }
+        cellElement := xmlDOM.CreateElement( "cell" );
+        cellElement.SetAttribute( "value", [String]c.Quantity() ); 
+        columnelement.AppendChild( cellElement );
+      }
+      tableElement.AppendChild( columnelement );  
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( FinancialProductionReport::GetDefaultName() );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualData/StaticMethod_GenerateData.qbl b/_Main/BL/Type_ShippingActualData/StaticMethod_GenerateData.qbl
new file mode 100644
index 0000000..12089d6
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/StaticMethod_GenerateData.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateData (
+  InterfaceLoginfo owner,
+  StringToDateTime cnv1,
+  StringToDate cnv,
+  JSON item
+) as ShippingActualData
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-17-2024 (created)
+    createtime       := guard( item.Get( "create_time").GetString(),"");
+    dday             := guard( item.Get( "dday").GetString(),"");
+    fourcode         := guard( item.Get( "four_code").GetString(),"");
+    quantity         := guard( item.Get( "qty").GetReal(), 0);
+    fac              := guard( item.Get( "fac").GetString(),"");
+    id               := guard( item.Get( "id").GetNumber(),0);
+    
+    sadata           := owner.ShippingActualData( relnew, CreateTime := cnv1.Convert( createtime )
+                                                  , Fac := fac
+                                                  , FourCode := fourcode
+                                                  , Quantity := quantity
+                                                  , DDay := cnv.Convert( dday )
+                                                  , ID := id);
+    
+    return sadata;
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualData/StaticMethod_GetDefalutName.qbl b/_Main/BL/Type_ShippingActualData/StaticMethod_GetDefalutName.qbl
new file mode 100644
index 0000000..c593be6
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/StaticMethod_GetDefalutName.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetDefalutName () as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-18-2024 (created)
+    return "Shipping actual";
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualData/StaticMethod_GetRequestBody.qbl b/_Main/BL/Type_ShippingActualData/StaticMethod_GetRequestBody.qbl
new file mode 100644
index 0000000..d122b01
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/StaticMethod_GetRequestBody.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetRequestBody (
+  Date date
+) as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jul-19-2024 (created)
+    json := JSON::Object()
+                  .Add( "inParam", JSON::Object().Add( "dday", date.Format( "Y-M2-D2" ) ) ).Build();
+    requestbody := json.AsString();
+    return requestbody
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualData/StaticMethod_Synchronize.qbl b/_Main/BL/Type_ShippingActualData/StaticMethod_Synchronize.qbl
new file mode 100644
index 0000000..c26a9b3
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/StaticMethod_Synchronize.qbl
@@ -0,0 +1,74 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Synchronize (
+  InterfaceDataset owner,
+  String executor
+)
+{
+  TextBody:
+  [*
+    //// 鐢勫叞楦� Jul-17-2024 (created)
+    date    := Date::ActualDate();
+    loginfo := owner.InterfaceLoginfo( relnew, ExecuteUser := executor
+                                       , Name := Translations::InterfaceDataset_ShippingActualData_Name()
+                                       , InterfaceDateTime := DateTime::ActualTime()
+                                       , Message := '鍙戣繍瀹為檯鏁版嵁'
+                                       , RequestBody := ShippingActualData::GetRequestBody( date ) );
+    // vwedadmin Jul-18-2024 (created)
+    //address := "ds-yunrong-gw.dmp.vwfawedl.mobi"; 
+    //
+    //           /// http://ds-yunrong-gw.dmp.vwfawedl.mobi/data-service/api/service/post-data/V1.101/f4f94c47c1a2440898b5e1e2c0c5cbc8 
+    //httpinterface := HTTPInterface::Create( address,80);
+    //                httpinterface.URL("/data-service/api/service/post-data/V1.101/f4f94c47c1a2440898b5e1e2c0c5cbc8");
+    //httpinterface.MediaType("application/json");
+    ////httpinterface.SSL(true);
+    ////httpinterface.SSLKeystore("MyKeystore");
+    //httpinterface.PostMethod(true); 
+    ////str :='{
+    ////    "inParam":
+    ////        {
+    ////            "dday" : "2024-07-11"
+    ////        }
+    ////}'
+    //httpinterface.AddHeader("Authorization","MTlLeG94UEYyNWN5OTZLOFRMXzUyNzA4ODkwNzg1NTA2OTIxNV9wcml2YXRlS2V5XzE3MjEzMDM4Nzc0NTE=")
+    //httpinterface.Call( ShippingActualData::GetRequestBody( column.StartDate() ) ); //Sends request with the header Authorization: 538baa9045a84c0e889f 鍙互浼犻�掑姩鎬乼oken 鐨勫惂
+    //result := httpinterface.Result();
+    
+    data := InterfaceLoginfo::CallInterface( owner, loginfo );
+    if( not isnull( data ) ){
+      cnv1 := StringToDateTime::StandardConverter();
+      cnv1.SetCustomConversion();
+      cnv1.CustomFormatString( 'yyyy-MM-dd HH:mm:ss' );
+      
+      cnv2 := StringToDate::StandardConverter();
+      cnv2.SetCustomConversion();
+      cnv2.CustomFormatString( 'yyyy-MM-dd' );
+      column  := owner.ShippingActualColumn( relnew, StartDate := date, Index := owner.ShippingActualColumn( relsize ) );
+      
+      sadatalist := construct( ShippingActualDatas );
+      for( seq := 0;seq < data.Size();seq++){
+        item := data.Get(seq);
+        sadata := ShippingActualData::GenerateData( loginfo, cnv1, cnv2, item );
+        sadatalist.Add( sadata );
+      }
+      beforerowsize := owner.ShippingActualRow( relsize );
+      traverse( sadatalist, Elements, e ){
+        row := selectobject( owner, ShippingActualRow, row, row.Name() = e.FourCode() );
+        if( isnull( row ) ){
+          owner.ShippingActualRow( relnew, Name := e.FourCode() );
+        }
+        
+        cell := row.ShippingActualCell( relnew, Quantity := e.Quantity() );
+        column.ShippingActualCell( relinsert, cell );
+      }
+      if( beforerowsize <> owner.ShippingActualRow( relsize ) ){
+        rows := selectsortedset( owner, ShippingActualRow, row, row.Name() );
+        nr    := 0;
+        traverse( rows, Elements, e ){
+          e.RowNr( nr );
+          nr := nr + 1;
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_ShippingActualData/_ROOT_Type_ShippingActualData.qbl b/_Main/BL/Type_ShippingActualData/_ROOT_Type_ShippingActualData.qbl
new file mode 100644
index 0000000..8d74386
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualData/_ROOT_Type_ShippingActualData.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShippingActualData
+{
+  #keys: '5[415136.0.904000038][415136.0.904000036][0.0.0][415136.0.904000037][415136.0.904000039]'
+  BaseType: Object
+  Description: '鍙戣繍瀹為檯鏁版嵁'
+  StructuredName: 'ShippingActualDatas'
+}
diff --git a/_Main/BL/Type_ShippingActualRow/Attribute_Name.qbl b/_Main/BL/Type_ShippingActualRow/Attribute_Name.qbl
new file mode 100644
index 0000000..39f826d
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[415136.0.904040051][415136.0.904040050][415136.0.904040052]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_ShippingActualRow/Attribute_RowNr.qbl b/_Main/BL/Type_ShippingActualRow/Attribute_RowNr.qbl
new file mode 100644
index 0000000..7bbefe5
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualRow/Attribute_RowNr.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute RowNr
+{
+  #keys: '3[415136.0.904040061][415136.0.904040060][415136.0.904040062]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_ShippingActualRow/_ROOT_Type_ShippingActualRow.qbl b/_Main/BL/Type_ShippingActualRow/_ROOT_Type_ShippingActualRow.qbl
new file mode 100644
index 0000000..7b9b84b
--- /dev/null
+++ b/_Main/BL/Type_ShippingActualRow/_ROOT_Type_ShippingActualRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShippingActualRow
+{
+  #keys: '5[415136.0.904040034][415136.0.904040032][0.0.0][415136.0.904040033][415136.0.904040035]'
+  BaseType: Object
+  Description: '瀹為檯鑸硅繍鏁版嵁琛�'
+  StructuredName: 'ShippingActualRows'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def
index 3069a9f..a24dc49 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def
@@ -16,6 +16,21 @@
         Taborder: 0
       ]
     }
+    Component ButtonInterface
+    {
+      #keys: '[415136.0.931576995]'
+      BaseType: 'WebButton'
+      Children:
+      [
+        #child: ContextMenuInterface
+      ]
+      Properties:
+      [
+        Image: 'ARROW_SHUFFLE'
+        Label: 'Interface'
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index 8417130..7f3a077 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -71,6 +71,17 @@
         Taborder: 5
       ]
     }
+    Component ButtonOfflinePlanComparisonReport
+    {
+      #keys: '[412672.1.66051424]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_INFO'
+        Label: '浜ч噺瀵规瘮鎶ヨ〃'
+        Taborder: 6
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuInterface.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuInterface.def
new file mode 100644
index 0000000..ac50d15
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuInterface.def
@@ -0,0 +1,46 @@
+Quintiq file version 2.0
+Component ContextMenuInterface
+{
+  #keys: '[415136.0.931500880]'
+  BaseType: 'WebContextMenu'
+  Children:
+  [
+    Component MenuInterface
+    {
+      #keys: '[415136.0.931500881]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DOCUMENT'
+        Taborder: 0
+        Title: 'Interface loginfo'
+      ]
+    }
+    Component MenuMachineStockData
+    {
+      #keys: '[415136.0.931501127]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SPREADSHEET'
+        Taborder: 1
+        Title: 'Machine stock data'
+      ]
+    }
+    Component MenuFinishedEngineInventory
+    {
+      #keys: '[415136.0.933525462]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SPREADSHEET'
+        Taborder: 2
+        Title: 'Finished engine inventory'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
index 2c89ac6..7221e9b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgSecondDevelopmentPlan.def
@@ -16,7 +16,7 @@
         Taborder: 0
       ]
     }
-    Component bPackagingPlan
+    Component bBlank
     {
       #keys: '[413988.0.1291640400]'
       BaseType: 'WebButton'
@@ -59,6 +59,17 @@
         Taborder: 4
       ]
     }
+    Component bShippingActualData
+    {
+      #keys: '[415136.0.905520117]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'TABLE_CONNECTION'
+        Label: 'Shipping data'
+        Taborder: 5
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def
new file mode 100644
index 0000000..76d3138
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonOfflinePlanComparisonReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport_OnClick
+{
+  #keys: '[412672.1.66051682]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'OfflinePlanComparisonReport', this );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuFinishedEngineInventory_OnCli.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuFinishedEngineInventory_OnCli.def
new file mode 100644
index 0000000..b68285d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuFinishedEngineInventory_OnCli.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ContextMenuInterface/MenuFinishedEngineInventory
+Response OnClick () id:Response_MacroPlanner_ContextMenuInterface_MenuFinishedEngineInventory_OnClick
+{
+  #keys: '[415136.0.933525609]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Finished_engine_inventory", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuInterface_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuInterface_OnClick.def
new file mode 100644
index 0000000..7544bbd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuInterface_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ContextMenuInterface/MenuInterface
+Response OnClick () id:Response_MacroPlanner_ContextMenuInterface_MenuInterface_OnClick
+{
+  #keys: '[415136.0.931500984]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Interface_loginfo_view", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuMachineStockData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuMachineStockData_OnClick.def
new file mode 100644
index 0000000..352d640
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuInterface_MenuMachineStockData_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ContextMenuInterface/MenuMachineStockData
+Response OnClick () id:Response_MacroPlanner_ContextMenuInterface_MenuMachineStockData_OnClick
+{
+  #keys: '[415136.0.932240790]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Machine_stock_data", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bShippingActualData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bShippingActualData_OnClick.def
new file mode 100644
index 0000000..19a4c93
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgSecondDevelopmentPlan_bShippingActualData_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: abgSecondDevelopmentPlan/bShippingActualData
+Response OnClick () id:Response_MacroPlanner_abgSecondDevelopmentPlan_bShippingActualData_OnClick
+{
+  #keys: '[415136.0.905520217]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "Shipping_actual_data_view", true);
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def
index 8b3cfbe..842cdd6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_MatrixEditorTable.def
@@ -17,10 +17,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'LibCal_SubscriberEventTable'
-            Source: 'dhTable'
+            DataType: 'structured[LibCal_SubscriberEventColumn]'
+            Source: 'dhColumns'
             Taborder: 0
-            Transformation: 'LibCal_SubscriberEventColumn.LibCal_SubscriberEventCell'
+            Transformation: 'Elements.LibCal_SubscriberEventCell'
           ]
         }
       ]
@@ -44,18 +44,16 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'LibCal_SubscriberEventTable'
-            FilterArguments: 'subscribers:dhSubscribers;eventtypes:dhEventTypes'
-            FixedFilter: 'object.FilterBySubscriberAndEventType( subscribers, eventtypes )'
-            Source: 'dhTable'
+            DataType: 'structured[LibCal_SubscriberEventRow]'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'LibCal_SubscriberEventRow'
+            Transformation: 'Elements'
           ]
         }
       ]
       Properties:
       [
-        Legend: 'RowNr'
+        Legend: 'Name'
         SortCriteria: 'RowNr'
         Taborder: 1
       ]
@@ -72,20 +70,18 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'LibCal_SubscriberEventTable'
+            DataType: 'structured[LibCal_SubscriberEventColumn]'
             Description: 'object.FilterByDatePeriod( Date::MinDate(), Date::MaxDate() )'
-            FilterArguments: 'period:dhDate'
-            FixedFilter: 'object.FilterByDatePeriod( period.Start(), period.End() )'
-            Source: 'dhTable'
+            Source: 'dhColumns'
             Taborder: 0
-            Transformation: 'LibCal_SubscriberEventColumn'
+            Transformation: 'Elements'
           ]
         }
       ]
       Properties:
       [
         Legend: 'Name'
-        SortCriteria: 'Index'
+        SortCriteria: 'Period'
         Taborder: 2
       ]
     }
@@ -110,6 +106,6 @@
     Columns: 'MatrixEditorTableColumns'
     ContextMenu: 'matrixeditorContextMenuTable'
     Rows: 'MatrixEditorTableRows'
-    Taborder: 1
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def
index 15a8928..4178267 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelExport.def
@@ -12,7 +12,7 @@
       Properties:
       [
         Image: 'EXPORT1'
-        Taborder: 0
+        Taborder: 1
       ]
     }
     Component ButtonInitialize
@@ -22,7 +22,17 @@
       Properties:
       [
         Image: 'ARROW_CIRCLE'
-        Taborder: 1
+        Taborder: 2
+      ]
+    }
+    Component ButtonSearch
+    {
+      #keys: '[415136.0.922435407]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Search'
+        Taborder: 0
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
index 3a1f26f..23f141e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelList.def
@@ -6,14 +6,24 @@
   Children:
   [
     #child: MatrixEditorTable
-    Component dhTable
+    Component dhColumns
     {
       #keys: '[415136.0.672310139]'
       BaseType: 'WebDataHolder'
-      Databinding: 'LibCal_SubscriberEventTable'
+      Databinding: 'structured[LibCal_SubscriberEventColumn]*'
       Properties:
       [
         Description: '琛�'
+        Taborder: 1
+      ]
+    }
+    Component dhRows
+    {
+      #keys: '[415136.0.922436014]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[LibCal_SubscriberEventRow]*'
+      Properties:
+      [
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def
index 2b876f1..8e8390c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Component_PanelPeriods.def
@@ -17,7 +17,6 @@
         Orientation: 'horizontal'
         Taborder: 0
         Title: 'Periods'
-        Tooltip: '<html>Select if the periods are used for planning or merely for visualization.<br>The planning periods define the granularity at which planning is done.<br>In case of overlapping planning periods, the smallest ones are used.<br>The planning periods are shown in the period overview in blue.</html>'
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def
index 04b4ca1..0d64dac 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_OnCreated.def
@@ -11,6 +11,16 @@
     [*
       
       this.InitializeSubscribers();
+      
+      columns     := construct( LibCal_SubscriberEventColumns );
+      rows        := construct( LibCal_SubscriberEventRows );
+      
+      traverse( dhCalendar.Data(), LibCal_SubscriberEventTable, table, table.ID() = RadioButtonGroupUseForPlanning.BoundValue() ){
+        columns  := selectset( table, LibCal_SubscriberEventColumn, column, true );
+        rows     := selectset( table, LibCal_SubscriberEventRow, row, true );
+      }
+      dhColumns.Data( &columns );
+      dhRows.Data( &rows );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def
index 73a9922..63682a2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonHeader_OnClick.def
@@ -9,9 +9,9 @@
   {
     Body:
     [*
-      binaryValue := LibCal_SubscriberEventTable::Export( dhTable.Data() );
+      binaryValue := LibCal_SubscriberEventTable::Export( dhColumns.Data(), dhRows.Data() );
       
-      Application.Download( "Unavailable events.xlsx", binaryValue.AsBinaryData() );
+      Application.Download( LibCal_SubscriberEventTable::GetDefaultName() + ".xlsx", binaryValue.AsBinaryData() );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonSearch_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonSearch_OnClick.def
new file mode 100644
index 0000000..5fc08f4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelExport_ButtonSearch_OnClick.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: PanelExport/ButtonSearch
+Response OnClick () id:Response_PanelExport_ButtonSearch_OnClick
+{
+  #keys: '[415136.0.922435443]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      columns     := construct( LibCal_SubscriberEventColumns );
+      rows        := construct( LibCal_SubscriberEventRows );
+      subscribers := dhSubscribers.Data();
+      eventtypes  := dhEventTypes.Data();
+      date        := dhDate.Data();
+      traverse( dhCalendar.Data(), LibCal_SubscriberEventTable, table ){
+        columns  := selectset( table, LibCal_SubscriberEventColumn, column, column.FilterByDatePeriod( date.Start(), date.End(), RadioButtonGroupUseForPlanning.BoundValue() ) );
+        rows     := selectset( table, LibCal_SubscriberEventRow, row, row.FilterBySubscriberAndEventType( subscribers, eventtypes ) );
+      }
+      dhColumns.Data( &columns );
+      dhRows.Data( &rows );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def
deleted file mode 100644
index 29c6ed7..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCalendarUnavailableEvent/Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged.def
+++ /dev/null
@@ -1,22 +0,0 @@
-Quintiq file version 2.0
-#parent: PanelPeriods/RadioButtonGroupUseForPlanning
-Response OnChanged () id:Response_PanelPeriods_RadioButtonGroupUseForPlanning_OnChanged
-{
-  #keys: '[415136.0.672310167]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebRadioButtonGroup_OnChanged'
-  QuillAction
-  {
-    Body:
-    [*
-      owner_i := dhCalendar.Data();
-      if( owner_i.LibCal_SubscriberEventTable( relsize ) < 1 ){
-        LibCal_SubscriberEventTable::InitializeTable( dhPotentialSubscribers.Data(), dhCalendar.Data() );
-      }
-      table := selectobject( owner_i, LibCal_SubscriberEventTable, table, table.ID() = this.BoundValue() );
-      
-      dhTable.Data( table );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_ListFinishedEngineInventory.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_ListFinishedEngineInventory.def
new file mode 100644
index 0000000..dec6b0f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_ListFinishedEngineInventory.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListFinishedEngineInventory
+{
+  #keys: '[415136.0.933380308]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorFinishedEngineInventory
+    {
+      #keys: '[415136.0.933380309]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'InterfaceDataset'
+        Source: 'InterfaceDataset'
+        Taborder: 0
+        Transformation: 'InterfaceLoginfo.FinishedEngineInventory'
+      ]
+    }
+    #child: listActionBarPageFinishedEngineInventory
+    Component DataSetLevelFinishedEngineInventory
+    {
+      #keys: '[415136.0.933380314]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuFinishedEngineInventory
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FourCode","title":"FourCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FourCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"VehicleType","title":"VehicleType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"VehicleType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReceiptPlace","title":"ReceiptPlace","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReceiptPlace"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FullName","title":"FullName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FullName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SpellName","title":"SpellName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SpellName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineType","title":"EngineType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EngineType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EngineModularPlatform","title":"EngineModularPlatform","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EngineModularPlatform"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Brand","title":"Brand","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Brand"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BIPlace","title":"BIPlace","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BIPlace"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Total","title":"Total","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Total"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Amount","title":"Amount","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Amount"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DType","title":"DType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Fac","title":"Fac","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Fac"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DDay","title":"DDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DWeek","title":"DWeek","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DWeek"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DMonth","title":"DMonth","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DMonth"}}]'
+        ContextMenu: 'listContextMenuFinishedEngineInventory'
+        SortCriteria: 'desc:DDay'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listActionBarPageFinishedEngineInventory.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listActionBarPageFinishedEngineInventory.def
new file mode 100644
index 0000000..182e5cf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listActionBarPageFinishedEngineInventory.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageFinishedEngineInventory
+{
+  #keys: '[415136.0.933380311]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listContextMenuFinishedEngineInventory.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listContextMenuFinishedEngineInventory.def
new file mode 100644
index 0000000..488df4f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/Component_listContextMenuFinishedEngineInventory.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuFinishedEngineInventory
+{
+  #keys: '[415136.0.933380316]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/_ROOT_Component_FormFinishedEngineInventory.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/_ROOT_Component_FormFinishedEngineInventory.def
new file mode 100644
index 0000000..2fa6221
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinishedEngineInventory/_ROOT_Component_FormFinishedEngineInventory.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormFinishedEngineInventory
+{
+  #keys: '[415136.0.933380255]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListFinishedEngineInventory
+  ]
+  Properties:
+  [
+    Image: 'SPREADSHEET'
+    Title: 'Finished engine inventory'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_ListInterfaceLoginfo.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_ListInterfaceLoginfo.def
new file mode 100644
index 0000000..9c5085b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_ListInterfaceLoginfo.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListInterfaceLoginfo
+{
+  #keys: '[415136.0.931545401]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorInterfaceLoginfo
+    {
+      #keys: '[415136.0.931545402]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'external[InterfaceDataset]'
+        Source: 'InterfaceDataset'
+        Taborder: 0
+        Transformation: 'InterfaceLoginfo'
+      ]
+    }
+    #child: listActionBarPageInterfaceLoginfo
+    Component DataSetLevelInterfaceLoginfo
+    {
+      #keys: '[415136.0.931545407]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuInterfaceLoginfo
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Name","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ExecuteUser","title":"ExecuteUser","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ExecuteUser"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"InterfaceDateTime","title":"InterfaceDateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"InterfaceDateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FinishTime","title":"FinishTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FinishTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Message","title":"Message","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Message"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Success","title":"Success","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Success"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReturnSuccess","title":"ReturnSuccess","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReturnSuccess"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ReturnMsg","title":"ReturnMsg","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ReturnMsg"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Last","title":"Last","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Last"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"TotalRow","title":"TotalRow","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"TotalRow"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"RequestBody","title":"RequestBody","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"RequestBody"}}]'
+        ContextMenu: 'listContextMenuInterfaceLoginfo'
+        SortCriteria: 'desc:InterfaceDateTime'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listActionBarPageInterfaceLoginfo.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listActionBarPageInterfaceLoginfo.def
new file mode 100644
index 0000000..5e6a83a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listActionBarPageInterfaceLoginfo.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageInterfaceLoginfo
+{
+  #keys: '[415136.0.931545404]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listContextMenuInterfaceLoginfo.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listContextMenuInterfaceLoginfo.def
new file mode 100644
index 0000000..e02fdda
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/Component_listContextMenuInterfaceLoginfo.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuInterfaceLoginfo
+{
+  #keys: '[415136.0.931545409]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/_ROOT_Component_FormInterfaceLoginfo.def b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/_ROOT_Component_FormInterfaceLoginfo.def
new file mode 100644
index 0000000..884db36
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInterfaceLoginfo/_ROOT_Component_FormInterfaceLoginfo.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormInterfaceLoginfo
+{
+  #keys: '[415136.0.931210186]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListInterfaceLoginfo
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT'
+    Title: 'Interface loginfo'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_ListMachineStockData.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_ListMachineStockData.def
new file mode 100644
index 0000000..f9f1e69
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_ListMachineStockData.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListMachineStockData
+{
+  #keys: '[415136.0.931501240]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorMachineStockData
+    {
+      #keys: '[415136.0.931501241]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'InterfaceDataset'
+        Source: 'InterfaceDataset'
+        Taborder: 0
+        Transformation: 'InterfaceLoginfo.MachineStockData'
+      ]
+    }
+    #child: listActionBarPageMachineStockData
+    Component DataSetLevelMachineStockData
+    {
+      #keys: '[415136.0.931501246]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuMachineStockData
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialNo","title":"MaterialNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaterialName","title":"MaterialName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaterialName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Fac","title":"Fac","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Fac"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FacName","title":"FacName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FacName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"LineType","title":"LineType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"LineType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DDay","title":"DDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Total","title":"Total","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Total"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"AllTotal","title":"AllTotal","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"AllTotal"}}]'
+        ContextMenu: 'listContextMenuMachineStockData'
+        SortCriteria: 'desc:DDay'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listActionBarPageMachineStockData.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listActionBarPageMachineStockData.def
new file mode 100644
index 0000000..b082d74
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listActionBarPageMachineStockData.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageMachineStockData
+{
+  #keys: '[415136.0.931501243]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listContextMenuMachineStockData.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listContextMenuMachineStockData.def
new file mode 100644
index 0000000..e8477ce
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/Component_listContextMenuMachineStockData.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuMachineStockData
+{
+  #keys: '[415136.0.931501248]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/_ROOT_Component_FormMachineStockData.def b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/_ROOT_Component_FormMachineStockData.def
new file mode 100644
index 0000000..5e5e176
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMachineStockData/_ROOT_Component_FormMachineStockData.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMachineStockData
+{
+  #keys: '[415136.0.931501186]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: ListMachineStockData
+  ]
+  Properties:
+  [
+    Image: 'SPREADSHEET'
+    Title: 'Machine stock data'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def"
new file mode 100644
index 0000000..9fe94ea
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def"
@@ -0,0 +1,102 @@
+Quintiq file version 2.0
+Component MatrixEditor id:MatrixEditor_988
+{
+  #keys: '[412672.1.61940674]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell
+    {
+      #keys: '[412672.1.61940675]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCells
+        {
+          #keys: '[412672.1.61940676]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_ProductionComparison)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Plan;Actual;Gap'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows
+    {
+      #keys: '[412672.1.61940677]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRows
+        {
+          #keys: '[412672.1.61940678]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'checkedProduct:QMacroPlanner::FormOfflinePlanComparison.dhFinelProduct'
+            FixedFilter: 'exists( checkedProduct,Elements,product,product.ID() = object.Name() )'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns
+    {
+      #keys: '[412672.1.61940679]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumns
+        {
+          #keys: '[412672.1.61940680]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'startDate:QMacroPlanner::FormOfflinePlanComparison.dhStartDate;endDate:QMacroPlanner::FormOfflinePlanComparison.dhEndDate'
+            FixedFilter: 'not object.IsAttrbuteColumn() and startDate <= object.Date() and endDate > object.Date()'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Date'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageDemandComparison_1
+    #child: matrixeditorContextMenuDemandComparison_1
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumns'
+    ContextMenu: 'matrixeditorContextMenuDemandComparison'
+    Rows: 'MatrixEditorRows'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def"
new file mode 100644
index 0000000..d1923c2
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def"
@@ -0,0 +1,84 @@
+Quintiq file version 2.0
+Component PanelDemandComparison id:PanelDemandComparison_634
+{
+  #keys: '[412672.1.61940673]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor_988
+    Component dhComparisonData
+    {
+      #keys: '[412672.1.61940683]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component dhCheckedProduct
+    {
+      #keys: '[412672.1.61940684]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Children:
+      [
+        Component deCheckedProduct
+        {
+          #keys: '[412672.1.61940685]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Product_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedProduct'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component dhFinelProduct
+    {
+      #keys: '[412672.1.61940686]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhCheckedSalesSegment
+    {
+      #keys: '[412672.1.61940687]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[SalesSegment_MP]*'
+      Children:
+      [
+        Component deCheckedSalesSegment
+        {
+          #keys: '[412672.1.61940688]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[SalesSegment_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedSalesSegment'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def"
new file mode 100644
index 0000000..688487d
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def"
@@ -0,0 +1,96 @@
+Quintiq file version 2.0
+Component PanelFilter id:PanelFilter_119
+{
+  #keys: '[412672.1.61991354]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslGeneration
+    {
+      #keys: '[412672.1.61991355]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'Generation'
+        Taborder: 0
+      ]
+    }
+    Component ddslMQBMLB
+    {
+      #keys: '[412672.1.61991356]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'MQB/MLB'
+        Taborder: 1
+      ]
+    }
+    Component ddslPower
+    {
+      #keys: '[412672.1.61991357]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鍔熺巼'
+        Taborder: 2
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.1.61991358]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start Date'
+        Taborder: 3
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.1.61991359]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End Date'
+        Taborder: 5
+      ]
+    }
+    Component ButtonFilter
+    {
+      #keys: '[412672.1.61991360]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '杩囨护'
+        Taborder: 7
+      ]
+    }
+    Component dhStartDate
+    {
+      #keys: '[412672.1.61991361]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+    Component dhEndDate
+    {
+      #keys: '[412672.1.61991362]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 6
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def
new file mode 100644
index 0000000..8c81a3d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component PanelRibbon
+{
+  #keys: '[412672.1.64210439]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelFilter_119
+    #child: PanelRibbon504
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
new file mode 100644
index 0000000..1350b9a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
@@ -0,0 +1,72 @@
+Quintiq file version 2.0
+Component PanelRibbon504
+{
+  #keys: '[412672.1.64850929]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlOfflinePlanTable
+    {
+      #keys: '[412672.1.64850982]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'OfflinePlanTable'
+      Children:
+      [
+        Component DataExtractorRibbon
+        {
+          #keys: '[412672.1.64850983]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'OfflinePlanTable'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'SaveDateTime'
+        Label: '涓嬬嚎璁″垝:'
+        Taborder: 0
+      ]
+    }
+    Component bComparison
+    {
+      #keys: '[412672.1.64851009]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 1
+      ]
+    }
+    Component LabelRibbon
+    {
+      #keys: '[412672.1.66018113]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        DataBinding: 'ddlOfflinePlanTable.Data.SaveDateTime'
+        Taborder: 2
+      ]
+    }
+    Component ButtonRibbon
+    {
+      #keys: '[415720.0.38711791]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '瀹為檯鐢熶骇鏁版嵁鎺ュ彛鍚屾'
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def"
new file mode 100644
index 0000000..f0083f7
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageDemandComparison id:matrixEditorActionBarPageDemandComparison_1
+{
+  #keys: '[412672.1.61940681]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def"
new file mode 100644
index 0000000..5cd9345
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuDemandComparison id:matrixeditorContextMenuDemandComparison_1
+{
+  #keys: '[412672.1.61940682]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def
new file mode 100644
index 0000000..15c2b22
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhCheckedProduct
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged
+{
+  #keys: '[412672.1.61940669]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        dhFinelProduct.Data( this.Data().Copy() ); 
+      }else{
+        dhFinelProduct.Data( DataHolderProduct.Data().Copy() ); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def
new file mode 100644
index 0000000..48ec71e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhCheckedSalesSegment
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged
+{
+  #keys: '[412672.1.61940667]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        prods := selectset( dhFinelProduct.Data(),Elements,element,exists( this.Data(),Elements.SalesDemand.Product_MP,prod,element = prod ));
+        dhFinelProduct.Data( &prods );
+      }else{
+        dhFinelProduct.Data( DataHolderProduct.Data().Copy() );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def
new file mode 100644
index 0000000..0142a22
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhComparisonData
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged
+{
+  #keys: '[412672.1.61940670]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      PanelDemandComparison.Title( this.Data().Name() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def
new file mode 100644
index 0000000..c3eacc2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhFinelProduct
+Response OnCreated () id:Response_PanelDemandComparison_634_dhFinelProduct_OnCreated
+{
+  #keys: '[412672.1.61940668]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( DataHolderProduct.Data().Copy() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def
new file mode 100644
index 0000000..a4f3788
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ButtonFilter
+Response OnClick () id:Response_PanelFilter_119_ButtonFilter_OnClick
+{
+  #keys: '[412672.1.61991348]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      products := dhCheckedProduct.Data().Copy();
+      if( ddslGeneration.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.Generation() <> ddslGeneration.Text());
+      }
+      if( ddslMQBMLB.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.MQBMLB() <> ddslMQBMLB.Text());
+      }
+      if( ddslPower.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.Power() <> ddslPower.Text());
+      }
+      dhFinelProduct.Data( &products );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def
new file mode 100644
index 0000000..d7286fc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslGeneration
+Response OnCreated () id:Response_PanelFilter_119_ddslGeneration_OnCreated
+{
+  #keys: '[412672.1.61991353]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.Generation() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def
new file mode 100644
index 0000000..3228a00
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslMQBMLB
+Response OnCreated () id:Response_PanelFilter_119_ddslMQBMLB_OnCreated
+{
+  #keys: '[412672.1.61991352]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.MQBMLB() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def
new file mode 100644
index 0000000..7d8370b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslPower
+Response OnCreated () id:Response_PanelFilter_119_ddslPower_OnCreated
+{
+  #keys: '[412672.1.61991351]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.Power() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def
new file mode 100644
index 0000000..2aedb4a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dhEndDate
+Response OnCreated () id:Response_PanelFilter_119_dhEndDate_OnCreated
+{
+  #keys: '[412672.1.61991346]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MaxDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def
new file mode 100644
index 0000000..a2dc135
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dhStartDate
+Response OnCreated () id:Response_PanelFilter_119_dhStartDate_OnCreated
+{
+  #keys: '[412672.1.61991347]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MinDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def
new file mode 100644
index 0000000..79ee881
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dsEndDate
+Response OnChanged () id:Response_PanelFilter_119_dsEndDate_OnChanged
+{
+  #keys: '[412672.1.61991349]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhEndDate.Data( this.Date() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def
new file mode 100644
index 0000000..1b7e133
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dsStartDate
+Response OnChanged () id:Response_PanelFilter_119_dsStartDate_OnChanged
+{
+  #keys: '[412672.1.61991350]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhStartDate.Data( this.Date() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_ButtonRibbon_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_ButtonRibbon_OnClick.def
new file mode 100644
index 0000000..c472499
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_ButtonRibbon_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelRibbon504/ButtonRibbon
+Response OnClick () id:Response_PanelRibbon504_ButtonRibbon_OnClick
+{
+  #keys: '[415720.0.38711805]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ActualDailyProductionData::Synchronize( MacroPlan,InterfaceDataset );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
new file mode 100644
index 0000000..99add2b
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelRibbon504/bComparison
+Response OnClick () id:Response_PanelRibbon504_bComparison_OnClick_613
+{
+  #keys: '[412672.1.64851008]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      opt := ddlOfflinePlanTable.Data();
+      
+      dhComparisonData.Data( opt.Comparison( RecycleBin ));
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def
new file mode 100644
index 0000000..064466f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormOfflinePlanComparison
+{
+  #keys: '[412672.1.61921213]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelRibbon
+    #child: PanelDemandComparison_634
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_INFO'
+    Title: '浜ч噺瀵规瘮鎶ヨ〃'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_MatrixEditorTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_MatrixEditorTable.def
new file mode 100644
index 0000000..82d2baf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_MatrixEditorTable.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditorTable
+{
+  #keys: '[415136.0.904311855]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCellTable
+    {
+      #keys: '[415136.0.904311856]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCell
+        {
+          #keys: '[415136.0.904311857]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InterfaceDataset'
+            Source: 'InterfaceDataset'
+            Taborder: 0
+            Transformation: 'ShippingActualRow.ShippingActualCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Quantity'
+        Column: 'ShippingActualColumn'
+        Row: 'ShippingActualRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRowsTable
+    {
+      #keys: '[415136.0.904311860]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRow
+        {
+          #keys: '[415136.0.904311861]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InterfaceDataset'
+            Source: 'InterfaceDataset'
+            Taborder: 0
+            Transformation: 'ShippingActualRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'RowNr'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumnsTable
+    {
+      #keys: '[415136.0.904311864]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumn
+        {
+          #keys: '[415136.0.904311865]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InterfaceDataset'
+            Source: 'InterfaceDataset'
+            Taborder: 0
+            Transformation: 'ShippingActualColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'StartDate'
+        SortCriteria: 'StartDate'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageTable
+    #child: matrixeditorContextMenuTable
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumnsTable'
+    ContextMenu: 'matrixeditorContextMenuTable'
+    Rows: 'MatrixEditorRowsTable'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelButton.def
new file mode 100644
index 0000000..8178b3f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelButton.def
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component PanelButton
+{
+  #keys: '[415136.0.904311760]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonButton
+    {
+      #keys: '[415136.0.904311805]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelTable.def
new file mode 100644
index 0000000..40e1586
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_PanelTable.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelTable
+{
+  #keys: '[415136.0.904311784]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditorTable
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixEditorActionBarPageTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixEditorActionBarPageTable.def
new file mode 100644
index 0000000..106bbe8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixEditorActionBarPageTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageTable
+{
+  #keys: '[415136.0.904311868]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixeditorContextMenuTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixeditorContextMenuTable.def
new file mode 100644
index 0000000..312fee5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Component_matrixeditorContextMenuTable.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuTable
+{
+  #keys: '[415136.0.904311871]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Response_PanelButton_ButtonButton_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Response_PanelButton_ButtonButton_OnClick.def
new file mode 100644
index 0000000..fe6c193
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/Response_PanelButton_ButtonButton_OnClick.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: PanelButton/ButtonButton
+Response OnClick () id:Response_PanelButton_ButtonButton_OnClick
+{
+  #keys: '[415136.0.904312139]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( InterfaceDataset );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := ShippingActualData::Export( InterfaceDataset );
+      
+      Application.Download( ShippingActualData::GetDefalutName() + '.xlsx', binaryValue.AsBinaryData() );
+      
+      //ShippingActualData::Synchronize( InterfaceDataset );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/_ROOT_Component_FormShippingActualData.def b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/_ROOT_Component_FormShippingActualData.def
new file mode 100644
index 0000000..e9be208
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormShippingActualData/_ROOT_Component_FormShippingActualData.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormShippingActualData
+{
+  #keys: '[415136.0.904311721]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelButton
+    #child: PanelTable
+  ]
+  Properties:
+  [
+    Image: 'TABLE_CONNECTION'
+    Title: 'Shipping data'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Component_pnlEventType.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Component_pnlEventType.def
index 2716134..6568406 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Component_pnlEventType.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Component_pnlEventType.def
@@ -40,7 +40,6 @@
           Properties:
           [
             DataType: 'structured[LibCal_EventType]'
-            FixedFilter: 'object.IsLeaf()'
             Source: 'dhEventTypes'
             Taborder: 0
             Transformation: 'Elements'
@@ -49,6 +48,7 @@
       ]
       Properties:
       [
+        AllowEmpty: true
         Description: 'dhEvent.Data.EventType'
         DisplayField: 'Name'
         NumberOfColumns: 15
@@ -61,5 +61,6 @@
   [
     Orientation: 'horizontal'
     Taborder: 4
+    Visible: false
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_CreateEvent\043791.def" "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_CreateEvent\043791.def"
index a775035..a9d7c68 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_CreateEvent\043791.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_CreateEvent\043791.def"
@@ -29,6 +29,13 @@
     {
       sEvent.Type( LibCal_Event::TYPE_PARTIAL() );
     }
+    if( guard( category_i.Name() = LibCal_Event::TYPE_UNAVAILABLE(), false ) )
+    {
+      pnlEventType.Visible( true );
+    }else
+    {
+      pnlEventType.Visible( false );
+    }
     
     // Set the Event and the related controls...
     // The values are explicitly assigned here 'at the beginning' to the controls,
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_EditEvent.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_EditEvent.def
index c5a9ec4..243a121 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_EditEvent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgEvent/Method_EditEvent.def
@@ -29,7 +29,14 @@
     this.InitializeEventTypes();
     // Must be done here, when done in the OnCreated() the checkmarks are not always set.
     this.InitializeSubscribers();
-    
+    if( guard( sEvent.EventCategory().Name() = LibCal_Event::TYPE_UNAVAILABLE(), false ) )
+    {
+      pnlEventType.Visible( true );
+    }else
+    {
+      pnlEventType.Visible( false );
+    }
+    ddlEventType.Data( sEvent.EventType() );
     // Open the dialog.
     this.Show( "modal" );
   *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
index b212955..15c2afa 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_ListList.def
@@ -12,7 +12,7 @@
       Properties:
       [
         DataType: 'LibCal_EventCategory'
-        FixedFilter: "object.Participation().Calendar().CalendarID() <> 'Common Calendar'"
+        FixedFilter: "object.Participation().Calendar().CalendarID() <> 'Common Calendar' and object.Participation().Event().IsMultiple()"
         Source: 'dhCategory'
         Taborder: 0
         Transformation: 'Event.Participation.ExplicitTimeInterval'
@@ -29,8 +29,9 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":""}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Calendar.CalendarID","title":"CalendarID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Calendar.CalendarID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.EventType.Name","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.EventType.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.Subject","title":"Subject","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.Subject"}},{"attribute":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"StartDate","title":"StartDate","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.Start().Date()"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.StartTimeOfDay","title":"StartTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.StartTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.EndTimeOfDay","title":"EndTimeOfDay","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.EndTimeOfDay"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.Description","title":"Description","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.Description"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Calendar.CalendarID","title":"浜х嚎","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Calendar.CalendarID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.EventType.Name","title":"浜嬩欢绫诲瀷","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.EventType.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.Subject","title":"浜嬩欢","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.Subject"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Start","title":"寮�濮嬫棩鏈�","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Start"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"End","title":"缁撴潫鏃ユ湡","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"End"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Participation.Event.Description","title":"澶囨敞","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Participation.Event.Description"}}]'
         ContextMenu: 'listContextMenu967'
+        SortCriteria: 'desc:Start'
         Taborder: 2
       ]
     }
@@ -39,4 +40,22 @@
   [
     Taborder: 0
   ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListList_WebMenu_OnClick
+    {
+      #keys: '[415136.0.905460388]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[1197.0.10345066]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_PanelHeader\043144.def" "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_PanelHeader\043144.def"
index ba6fd1e..56e3225 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_PanelHeader\043144.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_PanelHeader\043144.def"
@@ -12,7 +12,7 @@
       Properties:
       [
         DataBinding: 'dhEvent.Data.Subject'
-        Label: 'Name'
+        Label: '浜嬩欢'
         PlaceHolder: '<Enter a name>'
         Taborder: 0
       ]
@@ -25,10 +25,11 @@
       [
         CanBeNegative: false
         DurationFormat: 'h:m'
-        Label: 'Start time'
+        Label: '寮�濮嬫棩鏈�'
         MaxDuration: P0DT23H59M0S
         MinDuration: P0DT0H0M0S
-        Taborder: 8
+        ShowLabel: false
+        Taborder: 9
       ]
     }
     Component dhStartTimeOfDay
@@ -38,7 +39,7 @@
       Databinding: 'Duration'
       Properties:
       [
-        Taborder: 9
+        Taborder: 10
       ]
     }
     Component durEndTimeOfDay
@@ -49,10 +50,11 @@
       [
         CanBeNegative: false
         DurationFormat: 'h:m'
-        Label: 'End time'
+        Label: '缁撴潫鏃ユ湡'
         MaxDuration: P0DT23H59M0S
         MinDuration: P0DT0H0M0S
-        Taborder: 10
+        ShowLabel: false
+        Taborder: 13
       ]
     }
     Component dhEndTimeOfDay
@@ -62,7 +64,7 @@
       Databinding: 'Duration'
       Properties:
       [
-        Taborder: 11
+        Taborder: 14
       ]
     }
     Component edtDescription
@@ -77,7 +79,7 @@
         Multiline: true
         NumberOfColumns: 29
         ShowLabel: false
-        Taborder: 13
+        Taborder: 16
       ]
     }
     Component dsStartDate
@@ -87,8 +89,8 @@
       Properties:
       [
         DateFormat: 'DMMY'
-        Label: 'Date'
-        Taborder: 6
+        Label: '寮�濮嬫棩鏈�'
+        Taborder: 7
       ]
     }
     Component dhStartDate
@@ -98,7 +100,7 @@
       Databinding: 'Date'
       Properties:
       [
-        Taborder: 7
+        Taborder: 8
       ]
     }
     Component lblDescription id:lblDescription_456
@@ -107,9 +109,9 @@
       BaseType: 'WebLabel'
       Properties:
       [
-        Label: 'Description'
+        Label: '澶囨敞'
         NumberOfColumns: 0
-        Taborder: 12
+        Taborder: 15
       ]
     }
     Component ButtonCreate
@@ -118,8 +120,8 @@
       BaseType: 'WebButton'
       Properties:
       [
-        Label: '鏂板缓'
-        Taborder: 14
+        Label: '鏂板'
+        Taborder: 17
       ]
     }
     Component ddslType id:ddslType_360
@@ -190,7 +192,6 @@
           Properties:
           [
             DataType: 'structured[LibCal_EventType]'
-            FixedFilter: 'object.IsLeaf()'
             Source: 'dhEventTypes'
             Taborder: 0
             Transformation: 'Elements'
@@ -199,12 +200,46 @@
       ]
       Properties:
       [
+        AllowEmpty: true
         DisplayField: 'Name'
-        Label: 'Event type'
+        Label: '浜嬩欢绫诲瀷'
         NumberOfColumns: 15
         Taborder: 3
       ]
     }
+    Component dsEndDate
+    {
+      #keys: '[415136.0.923680588]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DateFormat: 'DMMY'
+        Label: '缁撴潫鏃ユ湡'
+        Taborder: 11
+      ]
+    }
+    Component dhEndDate
+    {
+      #keys: '[415136.0.923671132]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date'
+      Properties:
+      [
+        Taborder: 12
+      ]
+    }
+    Component ckbIsAllDay id:ckbIsAllDay_812
+    {
+      #keys: '[415136.0.926885762]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        CheckboxType: 'toggle'
+        Label: 'All day'
+        NumberOfColumns: 0
+        Taborder: 6
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_listContextMenu967.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_listContextMenu967.def
index f3a5116..196d498 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_listContextMenu967.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Component_listContextMenu967.def
@@ -3,6 +3,31 @@
 {
   #keys: '[415136.0.657740261]'
   BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuDelete
+    {
+      #keys: '[415136.0.905460274]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 4
+        Title: 'Delete'
+      ]
+    }
+    Component MenuEdit
+    {
+      #keys: '[415136.0.925451472]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'PENCIL'
+        Taborder: 3
+        Title: 'Edit'
+      ]
+    }
+  ]
   Properties:
   [
     Taborder: 0
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateEvent\043778.def" "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateEvent\043778.def"
index a3ed57b..ddcfc95 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateEvent\043778.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateEvent\043778.def"
@@ -48,7 +48,7 @@
     // Set the Participation and the related controls
     // (only the DataHolders, the Date-controls are set later on, after the recurrence has been initialized)
     dhStartDate.Data( sLeadPart.StartDate() );
-    //dhEndDate.Data(   sLeadPart.EndDate()   );
+    dhEndDate.Data(   sLeadPart.EndDate()   );
     dhLeadingParticipation.Data( &sLeadPart );
     dhCategory.Data(category_i);
     //info( '-----------------------', isnull( dhLeadingParticipation.Data() ) );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateUpdateEventAndParticipation.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateUpdateEventAndParticipation.def
index 1b3e681..a3aacd2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateUpdateEventAndParticipation.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_CreateUpdateEventAndParticipation.def
@@ -18,9 +18,9 @@
     isDefault      := ckbApplyToNewResources.Checked();
     startDate      := dsStartDate.Date();
     startTimeOfDay := durStartTimeOfDay.Duration();
-    endDate        := dsStartDate.Date();
+    endDate        := dsEndDate.Date();
     endTimeOfDay   := durEndTimeOfDay.Duration();
-    isAllDay       := false;
+    isAllDay       := ckbIsAllDay.Checked();
     
     eventType := ddslType.Text();
     capacity  := Real::MinReal();  // Always fill the capacity.
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_SetParticipationData.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_SetParticipationData.def
index 12e8065..d57cae5 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_SetParticipationData.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_SetParticipationData.def
@@ -23,6 +23,7 @@
     // the value of the other controls are then set via the responses of these controls.
     //dhEndDate  .Data( sParticipation.EndDate() + delta );
     dsStartDate.Date( startDate );
+    dsEndDate.Date( startDate );
     
     // Directly initialize the Duration
     //this.InitializeDuration();
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_ShowAllDay.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_ShowAllDay.def
new file mode 100644
index 0000000..a3194f3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Method_ShowAllDay.def
@@ -0,0 +1,63 @@
+Quintiq file version 2.0
+#parent: #root
+Method ShowAllDay () id:Method_LibCal_dlgMultipleEvent_ShowAllDay
+{
+  #keys: '[415136.0.926885827]'
+  Body:
+  [*
+    // Show the controls according to the state of ckbAllDay.
+    // Keep as is when running in days only mode.
+    if( not LibCal_Event::USE_ONLY_DAYS() )
+    {
+      if( ckbIsAllDay.Checked() )
+      {
+        // Store the EndDate before updating the StartTime, otherwise setting the StartTime can already have influenced the EndDate.
+        endDate := dsEndDate.Date();
+    
+        // Set to whole day if this is not yet the case.
+        if( durStartTimeOfDay.Duration() <> Duration::Zero() )
+        {
+          durStartTimeOfDay.Duration( Duration::Zero() );
+        }
+    
+        if( durEndTimeOfDay.Duration() <> Duration::Zero() )
+        {
+          durEndTimeOfDay.Duration( Duration::Zero() );
+          dsEndDate.Date( endDate + 1 );
+        }
+    
+        // Disable the controls.
+        durStartTimeOfDay.Enabled( false, "All day is selected" );
+        durEndTimeOfDay  .Enabled( false, "All day is selected" );
+      }
+      else
+      {
+        if( durStartTimeOfDay.Duration() <> dhStartTimeOfDay.Data() )
+        {
+          durStartTimeOfDay.Duration( dhStartTimeOfDay.Data() );
+        }
+    
+        if( durEndTimeOfDay.Duration() <> dhEndTimeOfDay.Data() )
+        {
+          durEndTimeOfDay.Duration( dhEndTimeOfDay.Data() );
+    
+          // During initialization, just take over the value from the DataHolder.
+          endDate := dsEndDate.Date();
+          if( endDate.IsInfinite() )
+          {
+            endDate := dhEndDate.Data();
+          }
+          // See if the EndDate must be corrected.
+          else if( dhEndTimeOfDay.Data() <> Duration::Zero() )
+          {
+            endDate := endDate - 1;
+          }
+          dsEndDate.Date( endDate );
+        }
+    
+        durStartTimeOfDay.Enabled( true, "" );
+        durEndTimeOfDay  .Enabled( true, "" );
+      }
+    }
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuDelete_OnClick.def
new file mode 100644
index 0000000..d401e21
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuDelete_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListList
+Response OnClick (
+  structured[LibCal_ExplicitTimeInterval] selection
+) id:Response_ListList_MenuDelete_OnClick
+{
+  #keys: '[415136.0.905460576]'
+  CanBindMultiple: false
+  DefinitionID => /ListList/Responsedef_ListList_WebMenu_OnClick
+  Initiator: 'MenuDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      LibCal_ExplicitTimeInterval::Delete( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuEdit_OnClick.def
new file mode 100644
index 0000000..f4e9cb1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_ListList_MenuEdit_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListList
+Response OnClick (
+  LibCal_ExplicitTimeInterval selection
+) id:Response_ListList_MenuEdit_OnClick
+{
+  #keys: '[415136.0.925451544]'
+  CanBindMultiple: false
+  DefinitionID => /ListList/Responsedef_ListList_WebMenu_OnClick
+  Initiator: 'MenuEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( LibCal_dlgEditTimeInterval );
+      dlg.edtComment().Visible( false )
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ButtonCreate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ButtonCreate_OnClick.def
index 2490324..910c38b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ButtonCreate_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ButtonCreate_OnClick.def
@@ -6,6 +6,10 @@
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
+  Precondition:
+  [*
+    return LibCal_Event::ValidDate( feedback, MacroPlan, dhStartDate.Data() + durStartTimeOfDay.Duration(), dhEndDate.Data() + durEndTimeOfDay.Duration() );
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ckbIsAllDay_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ckbIsAllDay_OnChanged.def
new file mode 100644
index 0000000..2f86201
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_ckbIsAllDay_OnChanged.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelHeader_144/ckbIsAllDay_812
+Response OnChanged () id:Response_MacroPlanner_pnlStartTime_ckbIsAllDay_OnChanged
+{
+  #keys: '[415136.0.926885761]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //鏄惁鏄竴鏁村ぉ
+      Form.ShowAllDay();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_dsEndDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_dsEndDate_OnChanged.def
new file mode 100644
index 0000000..626e3ed
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_LibCal_dlgMultipleEvent/Response_PanelHeader_144_dsEndDate_OnChanged.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: PanelHeader_144/dsEndDate
+Response OnChanged () id:Response_PanelHeader_144_dsEndDate_OnChanged
+{
+  #keys: '[415136.0.923680587]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      // Adjust the EndDate accordingly.
+      //if( dhStartDate.Data().IsFinite() )
+      //{
+      //  // Use the EndDate of the instance if the value of the control has not been set yet.
+      //  endDate := ifexpr( dsEndDate.Date().IsFinite(), dsEndDate.Date(), dhLeadingParticipation.Data().EndDate() );
+      //
+      //  delta := this.Date() - dhStartDate.Data();
+      //  dsEndDate.Date( endDate + delta );
+      //}
+       
+      // Update the 'memory' for later delta-calculation, and/or setting the time back when AllDay is turned off.
+      dhEndDate.Data( this.Date() );
+      
+      // Also set StartOfPeriod (always, also in case of a non-recurring event).
+      //dsStartOfPeriod.Date( this.Date() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw
index 4b625b8..6ec090a 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Calendar_unavailable_event_view.vw
@@ -107,10 +107,10 @@
           FormCalendarUnavailableEvent_MatrixEditorTable
           {
             gridColor: '#c4c4c4'
-            totalHeaderWidth: 37
+            totalHeaderWidth: 231
             attributeHeaderWidthRatio: 0.6
             nameHeaderWidthRatio: 0.4
-            columnWidth: 238
+            columnWidth: 74
             horizontalGrid: true
             verticalGrid: true
             backendState
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Finished_engine_inventory.vw b/_Main/UI/MacroPlannerWebApp/Views/Finished_engine_inventory.vw
new file mode 100644
index 0000000..5e6e378
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Finished_engine_inventory.vw
@@ -0,0 +1,200 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormFinishedEngineInventory
+      {
+        title: 'QMacroPlanner::FormFinishedEngineInventory'
+        shown: true
+        componentID: 'QMacroPlanner::FormFinishedEngineInventory'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormFinishedEngineInventory_ListFinishedEngineInventory
+          {
+          }
+          FormFinishedEngineInventory_DataSetLevelFinishedEngineInventory
+          {
+            groupDepth: -1
+            sort: 'DESC:DDay'
+            column_FourCode
+            {
+              columnId: 'FourCode'
+              dataPath: 'FourCode'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_VehicleType
+            {
+              columnId: 'VehicleType'
+              dataPath: 'VehicleType'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_ReceiptPlace
+            {
+              columnId: 'ReceiptPlace'
+              dataPath: 'ReceiptPlace'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_FullName
+            {
+              columnId: 'FullName'
+              dataPath: 'FullName'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_SpellName
+            {
+              columnId: 'SpellName'
+              dataPath: 'SpellName'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_EngineType
+            {
+              columnId: 'EngineType'
+              dataPath: 'EngineType'
+              dataType: 'string'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_EngineModularPlatform
+            {
+              columnId: 'EngineModularPlatform'
+              dataPath: 'EngineModularPlatform'
+              dataType: 'string'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_Brand
+            {
+              columnId: 'Brand'
+              dataPath: 'Brand'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_BIPlace
+            {
+              columnId: 'BIPlace'
+              dataPath: 'BIPlace'
+              dataType: 'string'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_Price
+            {
+              columnId: 'Price'
+              dataPath: 'Price'
+              dataType: 'string'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_Total
+            {
+              columnId: 'Total'
+              dataPath: 'Total'
+              dataType: 'real'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+            column_Amount
+            {
+              columnId: 'Amount'
+              dataPath: 'Amount'
+              dataType: 'real'
+              index: 11
+              subtotals: ''
+              width: 150
+            }
+            column_DType
+            {
+              columnId: 'DType'
+              dataPath: 'DType'
+              dataType: 'string'
+              index: 12
+              subtotals: ''
+              width: 150
+            }
+            column_Fac
+            {
+              columnId: 'Fac'
+              dataPath: 'Fac'
+              dataType: 'string'
+              index: 13
+              subtotals: ''
+              width: 150
+            }
+            column_DDay
+            {
+              columnId: 'DDay'
+              dataPath: 'DDay'
+              dataType: 'date'
+              index: 14
+              subtotals: ''
+              width: 150
+            }
+            column_DWeek
+            {
+              columnId: 'DWeek'
+              dataPath: 'DWeek'
+              dataType: 'string'
+              index: 15
+              subtotals: ''
+              width: 150
+            }
+            column_DMonth
+            {
+              columnId: 'DMonth'
+              dataPath: 'DMonth'
+              dataType: 'string'
+              index: 16
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 24
+    image: 'SPREADSHEET'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Finished_engine_inventory'
+  name: 'Finished engine inventory'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Interface_loginfo_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Interface_loginfo_view.vw
new file mode 100644
index 0000000..cc85355
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Interface_loginfo_view.vw
@@ -0,0 +1,146 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormInterfaceLoginfo
+      {
+        title: 'QMacroPlanner::FormInterfaceLoginfo'
+        shown: true
+        componentID: 'QMacroPlanner::FormInterfaceLoginfo'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 16
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormInterfaceLoginfo_ListInterfaceLoginfo
+          {
+          }
+          FormInterfaceLoginfo_DataSetLevelInterfaceLoginfo
+          {
+            groupDepth: -1
+            sort: 'DESC:InterfaceDateTime'
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ExecuteUser
+            {
+              columnId: 'ExecuteUser'
+              dataPath: 'ExecuteUser'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_InterfaceDateTime
+            {
+              columnId: 'InterfaceDateTime'
+              dataPath: 'InterfaceDateTime'
+              dataType: 'datetime'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_FinishTime
+            {
+              columnId: 'FinishTime'
+              dataPath: 'FinishTime'
+              dataType: 'datetime'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_Message
+            {
+              columnId: 'Message'
+              dataPath: 'Message'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_Success
+            {
+              columnId: 'Success'
+              dataPath: 'Success'
+              dataType: 'boolean'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_ReturnSuccess
+            {
+              columnId: 'ReturnSuccess'
+              dataPath: 'ReturnSuccess'
+              dataType: 'boolean'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_ReturnMsg
+            {
+              columnId: 'ReturnMsg'
+              dataPath: 'ReturnMsg'
+              dataType: 'string'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+            column_Last
+            {
+              columnId: 'Last'
+              dataPath: 'Last'
+              dataType: 'boolean'
+              index: 8
+              subtotals: ''
+              width: 150
+            }
+            column_TotalRow
+            {
+              columnId: 'TotalRow'
+              dataPath: 'TotalRow'
+              dataType: 'number'
+              index: 9
+              subtotals: ''
+              width: 150
+            }
+            column_RequestBody
+            {
+              columnId: 'RequestBody'
+              dataPath: 'RequestBody'
+              dataType: 'string'
+              index: 10
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 22
+    image: 'DOCUMENT'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Interface_loginfo_view'
+  name: 'Interface loginfo view'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
index f547af8..4fc1f6f 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
@@ -2,10 +2,183 @@
 {
   viewcontents
   {
-    image: 'MONEY_BILL_FIRE'
+    forms
+    {
+      form_FormEmployeeCost
+      {
+        title: 'QMacroPlanner::FormEmployeeCost'
+        shown: true
+        componentID: 'QMacroPlanner::FormEmployeeCost'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 25
+          columnPosition: 1
+          columnSpan: 10
+        }
+        components
+        {
+          FormEmployeeCost_Panel189
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelEmployeeCost
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelAction
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_ListEmployeeCost
+          {
+          }
+          FormEmployeeCost_DataSetLevel775
+          {
+            groupDepth: -1
+            column_EmployeeType_Name
+            {
+              columnId: 'EmployeeType.Name'
+              dataPath: 'EmployeeType.Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_EmployeeNumber
+            {
+              columnId: 'EmployeeNumber'
+              dataPath: 'EmployeeNumber'
+              dataType: 'number'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Unit_Name
+            {
+              columnId: 'Unit.Name'
+              dataPath: 'Unit.ID'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_StartDate
+            {
+              columnId: 'StartDate'
+              dataPath: 'StartDate'
+              dataType: 'date'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_TimeUnit
+            {
+              columnId: 'TimeUnit'
+              dataPath: 'TimeUnit'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_BaseSalary
+            {
+              columnId: 'BaseSalary'
+              dataPath: 'BaseSalary'
+              dataType: 'real'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormEmployeeCost_Panel972
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_Panel700
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelOvertimeMultiplier
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelEditOvertimeMultiplier
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelActions
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_ListOvertimeMultiplier
+          {
+          }
+          FormEmployeeCost_DataSetLevel613
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_Multiplier
+            {
+              columnId: 'Multiplier'
+              dataPath: 'Multiplier'
+              dataType: 'real'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormEmployeeCost_PanelEmployeeType
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelEditEmployeeType
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_PanelActions526
+          {
+            sizeRatio: 1
+          }
+          FormEmployeeCost_ListEmployeeType
+          {
+          }
+          FormEmployeeCost_DataSetLevel963
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+          }
+          FormEmployeeCost_PanelStandardWorkingDay
+          {
+            sizeRatio: 1
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
     page: ''
     group: ''
     index: 0
+    image: 'MONEY_BILL_FIRE'
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Machine_stock_data.vw b/_Main/UI/MacroPlannerWebApp/Views/Machine_stock_data.vw
new file mode 100644
index 0000000..0c37faa
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Machine_stock_data.vw
@@ -0,0 +1,119 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormMachineStockData
+      {
+        title: 'QMacroPlanner::FormMachineStockData'
+        shown: true
+        componentID: 'QMacroPlanner::FormMachineStockData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormMachineStockData_ListMachineStockData
+          {
+          }
+          FormMachineStockData_DataSetLevelMachineStockData
+          {
+            groupDepth: -1
+            sort: 'DESC:DDay'
+            column_MaterialNo
+            {
+              columnId: 'MaterialNo'
+              dataPath: 'MaterialNo'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_MaterialName
+            {
+              columnId: 'MaterialName'
+              dataPath: 'MaterialName'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_Fac
+            {
+              columnId: 'Fac'
+              dataPath: 'Fac'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_FacName
+            {
+              columnId: 'FacName'
+              dataPath: 'FacName'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+            column_LineType
+            {
+              columnId: 'LineType'
+              dataPath: 'LineType'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 150
+            }
+            column_DDay
+            {
+              columnId: 'DDay'
+              dataPath: 'DDay'
+              dataType: 'date'
+              index: 5
+              subtotals: ''
+              width: 150
+            }
+            column_Total
+            {
+              columnId: 'Total'
+              dataPath: 'Total'
+              dataType: 'real'
+              index: 6
+              subtotals: ''
+              width: 150
+            }
+            column_AllTotal
+            {
+              columnId: 'AllTotal'
+              dataPath: 'AllTotal'
+              dataType: 'real'
+              index: 7
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 23
+    image: 'SPREADSHEET'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Machine_stock_data'
+  name: 'Machine stock data'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw
new file mode 100644
index 0000000..874c68f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw
@@ -0,0 +1,116 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormOfflinePlanComparison
+      {
+        title: 'QMacroPlanner::FormOfflinePlanComparison'
+        shown: true
+        componentID: 'QMacroPlanner::FormOfflinePlanComparison'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 27
+          columnPosition: 1
+          columnSpan: 9
+        }
+        components
+        {
+          FormOfflinePlanComparison_PanelRibbon
+          {
+            sizeRatio: 1
+          }
+          FormOfflinePlanComparison_PanelRibbon504
+          {
+            sizeRatio: 1
+          }
+          FormOfflinePlanComparison_PanelFilter
+          {
+            sizeRatio: 1
+          }
+          FormOfflinePlanComparison_PanelDemandComparison
+          {
+            sizeRatio: 1
+          }
+          FormOfflinePlanComparison_MatrixEditor
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormOfflinePlanComparison.MatrixEditor'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Plan
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Plan'
+                    }
+                    attribute_Actual
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Actual'
+                    }
+                    attribute_Gap
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 2
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Gap'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Index'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'DOCUMENT_INFO'
+    description: ''
+  }
+  formatversion: 2
+  id: 'OfflinePlanComparisonReport'
+  name: 'OfflinePlanComparisonReport'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Shipping_actual_data_view.vw b/_Main/UI/MacroPlannerWebApp/Views/Shipping_actual_data_view.vw
new file mode 100644
index 0000000..56af2c4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Shipping_actual_data_view.vw
@@ -0,0 +1,92 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormShippingActualData
+      {
+        title: 'QMacroPlanner::FormShippingActualData'
+        shown: true
+        componentID: 'QMacroPlanner::FormShippingActualData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 15
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormShippingActualData_PanelButton
+          {
+            sizeRatio: 1
+          }
+          FormShippingActualData_PanelTable
+          {
+            sizeRatio: 1
+          }
+          FormShippingActualData_MatrixEditorTable
+          {
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormShippingActualData.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_Quantity
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'Quantity'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'StartDate'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'RowNr'"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 21
+    image: 'TABLE_CONNECTION'
+    description: ''
+  }
+  formatversion: 2
+  id: 'Shipping_actual_data_view'
+  name: 'Shipping actual data view'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3