From b8e189bb0717177f36b35b961e58c26470b5aceb Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期二, 18 六月 2024 17:31:37 +0800
Subject: [PATCH] 产线整班

---
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def                                                          |   14 
 _Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl                                                         |   71 +++
 _Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl                                                                             |   23 +
 _Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl                                                                                    |    9 
 _Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl                                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902#1.def                                       |   22 +
 _Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl                                                                              |    9 
 _Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl                                                                                      |    8 
 _Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl                                                                     |    7 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                   |    4 
 _Main/Sys/ImgAttr/Entity.dme                                                                                                          |   25 +
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def                |   16 
 _Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl                                                       |    7 
 _Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl                                                                          |    7 
 _Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl                                                                                     |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick#836.def                   |   15 
 _Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl                                                                         |  100 +++++
 _Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def                                          |   40 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def         |   22 +
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def                                                 |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def                             |    2 
 _Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl                                                                                    |    8 
 _Main/BL/Type_WholeShift/Method_CapacityRounding.qbl                                                                                  |  114 ++++++
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def                         |    2 
 _Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl                                                                                   |    3 
 _Main/BL/Type_WholeShift/Method_PostProcessing2.qbl                                                                                   |   55 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def                                 |   18 
 _Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl                                              |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def                                          |   69 +++
 _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def                 |   21 +
 _Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl                                                                  |    7 
 _Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl                                                             |   42 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def                               |    4 
 _Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl                                   |   23 +
 _Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl                                                                  |   40 ++
 _Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl                                                            |   40 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick#393.def                       |   15 
 _Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl                                                                       |  103 +++++
 _Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl                                                                          |   22 +
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def                                                 |   23 -
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft#522.def                                         |   24 +
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def                                  |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight#106.def                                        |   36 +
 _Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl                                                                                   |    8 
 46 files changed, 1,109 insertions(+), 27 deletions(-)

diff --git a/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl b/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl
new file mode 100644
index 0000000..0d68045
--- /dev/null
+++ b/_Main/BL/Dataset_WholeShift/_ROOT_Dataset_WholeShift.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Dataset WholeShift
+{
+  #keys: '2[413988.0.1256611421][413988.0.1256611420]'
+  DefaultMDSName: 'WholeShift'
+  InstanceType: WholeShift
+}
diff --git a/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl b/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl
new file mode 100644
index 0000000..b7a175e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDema.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation TempDependentDemandInputGroup_MacroPlan_MacroPlan_TempDependentDemandInputGroup
+{
+  #keys: '1[413988.0.1270630140]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.0.1270630142][413988.0.1270630141][413988.0.1270630143]'
+    Cardinality: '0to1'
+    ObjectDefinition: TempDependentDemandInputGroup
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide TempDependentDemandInputGroup
+  {
+    #keys: '3[413988.0.1270630145][413988.0.1270630144][413988.0.1270630146]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
index 2ef99c2..1a87719 100644
--- a/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
+++ b/_Main/BL/Type_DMF_CustomLogic/Method_OnFinished.qbl
@@ -21,6 +21,9 @@
     // 鍒涘缓鎺ュ彛鏁版嵁闆�
     InterfaceDataset::OnServerStartup();
     
+    // 鏁寸彮鏁版嵁闆�
+    WholeShift::OnServerStartup();
+    
     // Create MPDomainHandler
     MPDomainHandler::OnServerStartup();
     
diff --git a/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl b/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl
new file mode 100644
index 0000000..da143c4
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_BalanceAxis.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BalanceAxis
+{
+  #keys: '3[413988.0.1273364842][413988.0.1273364841][413988.0.1273364843]'
+  Description: '骞宠 杞�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl b/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl
new file mode 100644
index 0000000..4c7e78b
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_ConnectingRod.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ConnectingRod
+{
+  #keys: '3[413988.0.1273364822][413988.0.1273364821][413988.0.1273364823]'
+  Description: '杩炴潌'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl b/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl
new file mode 100644
index 0000000..2daaf0d
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_Crankshaft.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Crankshaft
+{
+  #keys: '3[413988.0.1273364832][413988.0.1273364831][413988.0.1273364833]'
+  Description: '鏇茶酱'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl b/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl
new file mode 100644
index 0000000..5ab0fea
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_CylinderBlock.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CylinderBlock
+{
+  #keys: '3[413988.0.1273381359][413988.0.1273381358][413988.0.1273381360]'
+  Description: '缂镐綋'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl b/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl
new file mode 100644
index 0000000..a820e46
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/Attribute_CylinderHead.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CylinderHead
+{
+  #keys: '3[413988.0.1273364812][413988.0.1273364811][413988.0.1273364813]'
+  Description: '缂哥洊'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl
new file mode 100644
index 0000000..e07f7b0
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_Divisor.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Divisor
+{
+  #keys: '3[413988.0.1270554768][413988.0.1270554767][413988.0.1270554769]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl
new file mode 100644
index 0000000..7ff3131
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_PeriodTask.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute PeriodTask
+{
+  #keys: '3[413988.0.1270554778][413988.0.1270554777][413988.0.1270554779]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl
new file mode 100644
index 0000000..befbf6a
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_ProductInStockingName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ProductInStockingName
+{
+  #keys: '3[413988.0.1270630162][413988.0.1270630161][413988.0.1270630163]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl
new file mode 100644
index 0000000..2c318be
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_UnitID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UnitID
+{
+  #keys: '3[413988.0.1270630172][413988.0.1270630171][413988.0.1270630173]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl
new file mode 100644
index 0000000..288e978
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/Attribute_id.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[413988.0.1270554752][413988.0.1270554751][413988.0.1270554753]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl b/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl
new file mode 100644
index 0000000..c115f06
--- /dev/null
+++ b/_Main/BL/Type_TempDependentDemandInputGroup/_ROOT_Type_TempDependentDemandInputGroup.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type TempDependentDemandInputGroup
+{
+  #keys: '5[413988.0.1270630137][413988.0.1270630135][0.0.0][413988.0.1270630136][413988.0.1270630138]'
+  BaseType: Object
+  StructuredName: 'TempDependentDemandInputGroups'
+}
diff --git a/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl b/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl
new file mode 100644
index 0000000..a795b24
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_CapacityRounding.qbl
@@ -0,0 +1,114 @@
+Quintiq file version 2.0
+#parent: #root
+Method CapacityRounding (
+  MacroPlan macroPlan,
+  Real timeDifference,
+  UnitPeriodTimeBase uptb,
+  UnitPeriodTimeBases uptbs
+)
+{
+  TextBody:
+  [*
+    debuginfo( "闇�瑕佸渾鏁寸殑鏃堕棿锛堝崟浣嶏細灏忔椂锛�", timeDifference, "    闇�瑕佸渾鏁寸殑浜ц兘鍛ㄦ湡鐨勫紑濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ) );
+    nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+    //debuginfo( "鑰冭檻搴撳瓨鍜宭otsize" );
+    //while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) ) {
+    //  debuginfo( "寮�濮嬪悜鏃堕棿涓猴細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), "鐨勪骇鑳藉懆鏈熷��" );
+    //      
+    //  traverse ( nextUnitPeriodTimeBase, PeriodTaskOperation, pto, guard( pto.Operation().RoutingStep().Routing().Start(), uptb.StartDate() ) <= uptb.StartDate() and
+    //                                                               guard( pto.Operation().RoutingStep().Routing().End(), uptb.End().Date() ) >= uptb.End().Date() and
+    //                                                               timeDifference > 0 ) {         
+    //    minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+    //    minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+    //    traverse ( pto, NewSupply, ns, true ) {
+    //      targetBorrowSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+    //                                                                                                       tempSSLL.productID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() and
+    //                                                                                                       tempSSLL.startTime() <= ns.Start().Date() and
+    //                                                                                                       tempSSLL.endTime() >= ns.End().Date() );
+    //      minimumQuantityThatCanBeBorrowed := minvalue( 
+    //                                                    minvalue( ifexpr( not isnull( targetBorrowSplitShiftLotsizeLimit ) and targetBorrowSplitShiftLotsizeLimit.lotsize() < ns.Quantity(), 
+    //                                                                      ns.Quantity() - targetBorrowSplitShiftLotsizeLimit.lotsize(), 
+    //                                                                      Real::MaxReal() ),
+    //                                                              minvalue( 
+    //                                                                        ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, 
+    //                                                                                  ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 
+    //                                                                                  0.0 
+    //                                                                               ), 
+    //                                                                        ns.Quantity()    
+    //                                                                       ) 
+    //                                                             ),
+    //                                                    minimumCapacityThatCanBeBorrowed 
+    //                                                   );
+    //      debuginfo( "nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旂殑浜у搧鍚嶏細", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), String::Tab(),
+    //                 "鏈�灏忓簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), String::Tab(),
+    //                 "鐜版湁搴撳瓨锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd(), String::Tab(),
+    //                 "渚涘簲鏁伴噺锛�", ns.Quantity(), String::Tab(),
+    //                 "鏄惁瀛樺湪lotsize锛�", ifexpr( isnull( targetBorrowSplitShiftLotsizeLimit ), "涓嶅瓨鍦�", "瀛樺湪" ), String::Tab(),
+    //                 "lotsize鏁伴噺锛�", ifexpr( isnull( targetBorrowSplitShiftLotsizeLimit ), -1, targetBorrowSplitShiftLotsizeLimit.lotsize() )
+    //                );
+    //                    
+    //      sourceProductInStockingPointInPeriodPlanningLeaf := select( ns, ProductInStockingPointInPeriodPlanningLeaf.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), tempPISPIPPL, tempPISPIPPL.Start() = unitPeriodTimeBase.Start() );
+    //      sourceNewSupply := select( sourceProductInStockingPointInPeriodPlanningLeaf, NewSupply, tempNS, tempNS.Process_MP().AsProcess_MP().ID() = unitPeriodTimeBase.UnitID() );
+    //      targetReturnSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+    //                                                                                                       tempSSLL.productID() = sourceProductInStockingPointInPeriodPlanningLeaf.ProductInStockingPoint_MP().ProductID() and
+    //                                                                                                       tempSSLL.startTime() <= sourceProductInStockingPointInPeriodPlanningLeaf.Start().Date() and
+    //                                                                                                       tempSSLL.endTime() >= sourceProductInStockingPointInPeriodPlanningLeaf.End().Date() );
+    //      minimumAcceptableQuantity := minvalue( ifexpr( not isnull( targetReturnSplitShiftLotsizeLimit ) and not isnull( sourceNewSupply ) and targetReturnSplitShiftLotsizeLimit.lotsize() > sourceNewSupply.Quantity(), 
+    //                                                     targetReturnSplitShiftLotsizeLimit.lotsize() - sourceNewSupply.Quantity(), 
+    //                                                     Real::MaxReal() 
+    //                                                    ),
+    //                                             ifexpr( ( sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel() - sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd() ) > 0, 
+    //                                                       sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel() - sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd(), 
+    //                                                       0.0 
+    //                                                    )
+    //                                            );                                            
+    //      debuginfo( "瑕佸渾鏁寸殑鏃堕棿锛�", sourceProductInStockingPointInPeriodPlanningLeaf.Start().Date().Format( "Y-M2-D2" ), String::Tab(),
+    //                 "瑕佸渾鏁寸殑鏈�澶у簱瀛橈細", sourceProductInStockingPointInPeriodPlanningLeaf.MaxInventoryLevel(), String::Tab(),
+    //                 "瑕佸渾鏁寸殑鐜版湁搴撳瓨锛�", sourceProductInStockingPointInPeriodPlanningLeaf.InventoryLevelEnd(), String::Tab(),
+    //                 "瑕佸渾鏁寸殑渚涘簲鏁伴噺锛�", guard( sourceNewSupply.Quantity(), 0 ), String::Tab(),
+    //                 "鏄惁瀛樺湪lotsize锛�", ifexpr( isnull( targetReturnSplitShiftLotsizeLimit ), "涓嶅瓨鍦�", "瀛樺湪" ), String::Tab(),
+    //                 "lotsize鏁伴噺锛�", ifexpr( isnull( targetReturnSplitShiftLotsizeLimit ), -1, targetReturnSplitShiftLotsizeLimit.lotsize() ), String::Tab(),
+    //                 "瑕佸渾鏁寸殑鏈�灏忔帴绾虫暟閲忥細", minimumAcceptableQuantity
+    //                );
+    //        
+    //      minimumQuantityThatCanBeBorrowed := minvalue( minimumQuantityThatCanBeBorrowed, minimumAcceptableQuantity );
+    //    }
+    //    debuginfo( "nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), "    鍛ㄦ湡浠诲姟鑳藉�熺殑鏈�浣庢暟閲忥細", minimumQuantityThatCanBeBorrowed );                                                     
+    //      
+    //    minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+    //    unifiedProcessingTimeOfRounding := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed ); 
+    //    debuginfo( "鍓╀綑鍦嗘暣鐨勪骇鑳斤細", timeDifference, "    nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), "    鑳藉�熺殑浜ц兘锛�", minimumCapacityThatCanBeBorrowed, " 缁熶竴鍊熺殑浜ц兘锛�", unifiedProcessingTimeOfRounding ); 
+    //    this.A_unifiedProcessingOfRoundingLogic( unifiedProcessingTimeOfRounding, unitPeriodTimeBase, pto, macroPlan );  
+    //    timeDifference := timeDifference - unifiedProcessingTimeOfRounding;  
+    //  }
+    //     
+    //  if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+    //    nextUnitPeriodTimeBase := select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+    //  } else {
+    //    nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+    //  }
+    //  debuginfo( "銆傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘��" );
+    //}
+        
+    debuginfo( "涓嶈�冭檻浠讳綍鏉′欢鍦嗘暣浣垮叾鍒拌揪鏁寸彮" );
+    nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+    while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) ) {
+      debuginfo( "寮�濮嬪悜鏃堕棿涓猴細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), "鐨勪骇鑳藉懆鏈熷��" );
+      traverse ( nextUnitPeriodTimeBase, PeriodTaskOperation, pto, guard( pto.Operation().RoutingStep().Routing().Start(), uptb.StartDate() ) <= uptb.StartDate() and
+                                                                   guard( pto.Operation().RoutingStep().Routing().End(), uptb.End().Date() ) >= uptb.End().Date() and
+                                                                   timeDifference > 0 ) {
+        minimumCapacityThatCanBeBorrowed := pto.Quantity() / pto.Operation().Throughput();
+        unifiedProcessingTimeOfRounding := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed ); 
+        debuginfo( "鍓╀綑鍦嗘暣鐨勪骇鑳斤細", timeDifference, "    nextUnitPeriodTimeBase鐨勫綋鍓嶅懆鏈熶换鍔′緵搴旀暟閲忥細", pto.Quantity(), "    鑳藉�熺殑浜ц兘锛�", minimumCapacityThatCanBeBorrowed, " 缁熶竴鍊熺殑浜ц兘锛�", unifiedProcessingTimeOfRounding ); 
+        this.UnifiedProcessingOfRoundingLogic( unifiedProcessingTimeOfRounding, uptb, pto, macroPlan );  
+        timeDifference := timeDifference - unifiedProcessingTimeOfRounding;                                                 
+      }
+         
+      if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+        nextUnitPeriodTimeBase := select( uptbs, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+      } else {
+        nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl b/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl
new file mode 100644
index 0000000..54c3e30
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_IsRoundingOrZeroFilling3.qbl
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: #root
+Method IsRoundingOrZeroFilling3 (
+  MacroPlan macroPlan,
+  UnitPeriodTimeBases uptbs
+)
+{
+  TextBody:
+  [*
+    traverse ( uptbs, Elements, uptb, true ) {
+      if ( ( uptb.End().Date() - uptb.StartDate() ) > 1 ) {  
+        debuginfo( "寮�濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ), "    缁撴潫鏃堕棿锛�", uptb.End().Date().Format( "Y-M2-D2" ), "    鏃堕棿鍖洪棿锛�", ( uptb.End().Date() - uptb.StartDate() ) );
+        this.ProcessingTimeIntervalIsGreaterThanOneDay( macroPlan, uptb, uptbs );
+      } else if ( ( uptb.End().Date() - uptb.StartDate() ) = 1 ) {
+        debuginfo( "寮�濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ), "    缁撴潫鏃堕棿锛�", uptb.End().Date().Format( "Y-M2-D2" ), "    鏃堕棿鍖洪棿锛�", ( uptb.End().Date() - uptb.StartDate() ) );
+        this.ProcessingTimeIntervalIsEqualToOneDay( macroPlan, uptb, uptbs );
+      }
+      debuginfo( "--------------------------------------------------------------------------------" );
+      Transaction::Transaction().Propagate();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl b/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl
new file mode 100644
index 0000000..d1b5969
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_PostProcessing2.qbl
@@ -0,0 +1,55 @@
+Quintiq file version 2.0
+#parent: #root
+Method PostProcessing2 (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    // 浜х嚎鏁寸彮
+    traverse ( macroPlan, Unit, unit, unit.IsToFill() and unit.HasCapacityTypeTime() ) {
+      unitName := unit.Name();
+      debuginfo( "鏁寸彮浜х嚎: ", unitName );
+      
+      // 鎸夋椂闂寸粰UnitPeriodTimeBase鎺掑簭
+      uptbs    := selectsortedset( unit, UnitPeriod.astype( UnitPeriodTimeBase ), tempUPTB, not tempUPTB.IsPeriodFrozen() and tempUPTB.IsPlanning(), tempUPTB.Start() );
+          
+      // 鍦嗘暣鎴栬ˉ闆跺綋鍓嶄骇绾夸笅鎵�鐢熶骇鐨勪骇鍝�
+      this.IsRoundingOrZeroFilling3( macroPlan, uptbs ); // 鍊熻繕閫昏緫
+      Transaction::Transaction().Propagate();
+            
+    //        // 骞宠 褰撳墠浜х嚎涓嬫墍鐢熶骇鐨勪骇鍝佸簱瀛橈紙搴撳瓨 < 鏈�澶у簱瀛橈級
+    //        // this.A_balanceInventory( macroPlan, unitPeriodTimeBases );
+    //        // Transaction::Transaction().Propagate();
+    //       
+    //        // 璁剧疆褰撳墠浜х嚎鍦ㄦ湡闂翠负鏃ョ殑璁″垝涓瘡澶╁彧鐢熶骇涓�绫讳骇鍝�
+    //        // this.A_produceAProductForAPeriodOfTime( macroPlan, unitPeriodTimeBases );
+    //        
+    //        // Lotsize閫昏緫澶勭悊
+    //        // this.A_lotsize( macroPlan, scenarioManager, unitPeriodTimeBases );
+    //        info( "閫昏緫涓�==>鎷嗘垚鐝-----------------------------------------------------------------------------------------------------------------------" );
+    //        
+    //        // 鎷嗘垚鐝
+    //        this.A_processingShift( macroPlan, unitPeriodTimeBases, unitPeriodTimeBases.Element( 0 ).StartDate(), true );
+    //        Transaction::Transaction().Propagate();
+    //        
+    //        info( "閫昏緫鍥�=>澶勭悊鐝锛屽疄鐜颁竴涓彮娆″彧鐢熶骇涓�绫讳骇鍝�-----------------------------------------------------------------------------------------------------------------------" );
+    //        
+    //        // 澶勭悊鐝锛屽疄鐜颁竴涓彮娆″彧鐢熶骇涓�绫讳骇鍝�
+    //    //    this.A_processingShiftToProduceClassProducts( macroPlan, unitPeriodTimeBases, unitName );
+    //        this.A_processingShiftToProduceClassProducts2( macroPlan, unitPeriodTimeBases, unitName );
+    //        Transaction::Transaction().Propagate();
+    //      
+    //        // 閲嶇疆闇�姹�
+    //        this.A_generateRequirements( macroPlan, unit.ID() );
+    //        Transaction::Transaction().Propagate();
+    //      }
+    }
+    
+    // 杞﹂亾鏁寸彮
+    traverse ( macroPlan, Unit, unit, unit.IsToFill() and unit.HasCapacityTypeTransportQuantity() ) {
+      unitName := unit.Name();
+      debuginfo( "杞﹂亾浜х嚎: ", unitName );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl
new file mode 100644
index 0000000..f1d0a8c
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsEqualToOneDay.qbl
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+#parent: #root
+Method ProcessingTimeIntervalIsEqualToOneDay (
+  MacroPlan macroPlan,
+  UnitPeriodTimeBase uptb,
+  UnitPeriodTimeBases uptbs
+)
+{
+  Description: '澶勭悊鏃堕棿鍖洪棿绛変簬1澶�'
+  TextBody:
+  [*
+    if ( uptb.UsedCapacity() = uptb.TotalAvailableCapacity() ) { 
+      debuginfo( "澶╁凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊锛堜娇鐢ㄤ骇鑳界瓑浜庡彲鐢ㄤ骇鑳斤級" );
+    } else if ( uptb.UsedCapacity().HoursAsReal() = 0 ) {
+      debuginfo( "澶╁凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊锛堜娇鐢ㄤ骇鑳界瓑浜�0锛�" );
+    } else if ( uptb.UsedCapacity() < uptb.TotalAvailableCapacity() and uptb.UsedCapacity().HoursAsReal() > 0 ) {
+      whetherToFillInZero := true; // 鍒濆鍖栭粯璁よˉ闆舵潯浠�
+      debuginfo( "澶╀笉鏄暣鐝紝闇�瑕佸鐞�" );
+      traverse ( uptb, PeriodTaskOperation, pto, whetherToFillInZero ) {
+        debuginfo( "褰撳墠鍛ㄦ湡浠诲姟杈撳嚭鐨勪骇鍝佷釜鏁帮細", pto.NewSupply( relsize ) );
+        traverse( pto, NewSupply, ns, whetherToFillInZero ) {
+          debuginfo( "褰撳墠渚涘簲鐨勪骇鍝侊細", ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID(), "    褰撳墠渚涘簲鐨勪骇鍝佺殑鍓╀綑搴撳瓨锛�", ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd(), "    褰撳墠渚涘簲鐨勪骇鍝佺殑鏈�灏忓簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), "    褰撳墠渚涘簲鐨勪骇鍝佺殑鏈�澶у簱瀛橈細", ns.ProductInStockingPointInPeriodPlanningLeaf().MaxInventoryLevel(),"    褰撳墠浜у搧鍦ㄨ鍛ㄦ湡浠诲姟鐨勪緵搴旈噺锛�", ns.Quantity() );
+          if ( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.Quantity() ) < ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) {
+            debuginfo( "褰撳墠鍛ㄦ湡浠诲姟涓嶈兘琛ラ浂" );
+            whetherToFillInZero := false;
+          }
+        }
+        debuginfo( ".........." );             
+      }
+      //  whetherToFillInZero := false;
+      if ( whetherToFillInZero ) {
+        debuginfo( "鎵ц琛ラ浂" );
+        this.ZeroCapacityReplenishment( macroPlan, uptb.UsedCapacity().HoursAsReal(), uptb, uptbs ); 
+      } else {
+        debuginfo( "鎵ц鍦嗘暣" );
+        this.CapacityRounding( macroPlan, uptb.TotalAvailableCapacity().HoursAsReal() - uptb.UsedCapacity().HoursAsReal(), uptb, uptbs );
+      }
+    } else {
+      debuginfo( "澶╁嚭鐜板紓甯�" );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl
new file mode 100644
index 0000000..64c9e94
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ProcessingTimeIntervalIsGreaterThanOneDay.qbl
@@ -0,0 +1,71 @@
+Quintiq file version 2.0
+#parent: #root
+Method ProcessingTimeIntervalIsGreaterThanOneDay (
+  MacroPlan macroPlan,
+  UnitPeriodTimeBase uptb,
+  UnitPeriodTimeBases uptbs
+)
+{
+  Description: '澶勭悊鏃堕棿鍖洪棿澶т簬1澶�'
+  TextBody:
+  [*
+    if ( uptb.UsedCapacity() = uptb.TotalAvailableCapacity() ) { 
+      debuginfo( "鍛ㄥ凡缁忔槸鏁寸彮锛屾棤闇�澶勭悊" );
+    } else if ( uptb.UsedCapacity() < uptb.TotalAvailableCapacity() and uptb.UsedCapacity().HoursAsReal() > 0 ) {
+      roundedCapacity             := 0.0;
+      capacityForZeroCompensation := 0.0;
+      indexStartTime              := uptb.StartDate();
+      indexEndTime                := uptb.End().Date();
+      remainingCapacity           := uptb.UsedCapacity().HoursAsReal();
+      debuginfo( "浣跨敤鐨勪骇鑳斤細", remainingCapacity );
+      while ( indexStartTime < indexEndTime and roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
+        indexStartTimeAvailableCapacity := WholeShift::GenerateDailyCapacity( macroPlan, indexStartTime, uptb.UnitID() ).HoursAsReal();
+        if ( ( remainingCapacity - indexStartTimeAvailableCapacity ) < 0 ) {
+          roundedCapacity := abs( remainingCapacity - indexStartTimeAvailableCapacity );
+          capacityForZeroCompensation := remainingCapacity;
+          remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
+        } else {
+          remainingCapacity := remainingCapacity - indexStartTimeAvailableCapacity;
+        }
+        debuginfo( "绱㈠紩寮�濮嬫椂闂达細", indexStartTime, "    鍙敤浜ц兘锛�", indexStartTimeAvailableCapacity, "    浣跨敤鐨勪骇鑳�-鍙敤浜ц兘锛堝墿浣欎骇鑳斤級锛�", remainingCapacity );
+        indexStartTime := indexStartTime + 1;
+      }
+          
+      debuginfo( "鍦嗘暣浜ц兘锛�", roundedCapacity, "    琛ラ浂浜ц兘锛�", capacityForZeroCompensation );
+          
+      if ( roundedCapacity = 0 and capacityForZeroCompensation = 0 ) {
+        debuginfo( "宸插埌杈炬暣鐝晥鏋�" );
+      } else {
+        whetherToFillInZero := true;
+        tempCapacityForZeroCompensation := capacityForZeroCompensation;
+        traverse ( uptb, PeriodTaskOperation, pto, whetherToFillInZero ) { 
+          quantityOfMinimumSupplyRound := Real::MaxReal();
+          traverse ( pto, NewSupply, ns, whetherToFillInZero ) {
+            quantityOfMinimumSupplyRound := minvalue( minvalue( ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 0.0 ), 
+                                                                        ns.Quantity()    
+                                                               ) / pto.Operation().Throughput(), 
+                                                      quantityOfMinimumSupplyRound 
+                                                     );
+          }
+          tempCapacityForZeroCompensation := tempCapacityForZeroCompensation - quantityOfMinimumSupplyRound;
+          if ( tempCapacityForZeroCompensation  < 0 ) {
+            whetherToFillInZero := false;
+          }
+          debuginfo( "褰撳墠鍛ㄦ湡浠诲姟渚涘簲鏁伴噺锛�", pto.Quantity(), "    鏈�灏忚ˉ闆朵骇鑳斤細", quantityOfMinimumSupplyRound, "    琛ラ浂鍚庤繕鍓╋細", tempCapacityForZeroCompensation );
+        }
+        
+        //    whetherToFillInZero := true;
+        
+        if ( not whetherToFillInZero ) {
+          debuginfo( "鎵ц琛ラ浂" );
+          this.ZeroCapacityReplenishment( macroPlan, capacityForZeroCompensation, uptb, uptbs ); 
+        } else {
+          debuginfo( "鎵ц鍦嗘暣" );
+          this.CapacityRounding( macroPlan, roundedCapacity, uptb, uptbs );
+        }
+      }
+    } else {
+      debuginfo( "鍛ㄥ嚭鐜板紓甯�" );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl
new file mode 100644
index 0000000..14f7911
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfComplementZeroLogic.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method UnifiedProcessingOfComplementZeroLogic (
+  Real unifiedProcessingTimeOfRounding,
+  PeriodTaskOperation sourcePeriodTaskOperation,
+  UnitPeriodTimeBase targetUnitPeriodTimeBase,
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    targetPeriodTaskOperation := select( targetUnitPeriodTimeBase, PeriodTaskOperation, tempOTO, tempOTO.Operation() = sourcePeriodTaskOperation.Operation() );
+        
+    if ( isnull( targetPeriodTaskOperation ) ) {
+      debuginfo( "鐩爣浜ц兘鍛ㄦ湡涓嶅瓨鍦ㄧ洰鏍囧懆鏈熶换鍔�" );
+      sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() - ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      targetPeriodTaskOperation := PeriodTaskOperation::Create( sourcePeriodTaskOperation.Operation(), targetUnitPeriodTimeBase, sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding, false );
+      Transaction::Transaction().Propagate();
+          
+    //  info( "鏂板垱寤虹殑鍛ㄦ湡浠诲姟鏈夊嚑涓渶姹傦細", targetPeriodTaskOperation.DependentDemand( relsize ), "    鍛ㄦ湡浠诲姟ID涓猴細", targetPeriodTaskOperation.Key().AsQUILL() );
+      traverse ( targetPeriodTaskOperation, DependentDemand, dd, true ) {
+        targetDependentDemand := select( sourcePeriodTaskOperation, DependentDemand, tempDD, tempDD.ProcessInput().astype( OperationInput ).Name() = dd.ProcessInput().astype( OperationInput ).Name() );
+        targetTempDependentDemandInputGroup := select( macroPlan, TempDependentDemandInputGroup, tempTDDIG, tempTDDIG.ID() = guard( targetDependentDemand.Key().AsQUILL(), "" ) );
+        if ( not isnull( targetTempDependentDemandInputGroup ) ) {
+    //      info( "鍒涘缓浜嗕緷璧栭渶姹傦紝ID涓猴細", dd.Key().AsQUILL() );
+          macroPlan.TempDependentDemandInputGroup( relnew, ID                    := dd.Key().AsQUILL(),
+                                                           Divisor               := targetTempDependentDemandInputGroup.Divisor(),
+                                                           UnitID                := targetTempDependentDemandInputGroup.UnitID(),
+                                                           ProductInStockingName := targetTempDependentDemandInputGroup.ProductInStockingName() );
+        }
+      }
+      Transaction::Transaction().Propagate();
+    } else {
+      debuginfo( "鐩爣浜ц兘鍛ㄦ湡瀛樺湪鐩爣鍛ㄦ湡浠诲姟" );
+      sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() - ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      targetPeriodTaskOperation.Update( targetPeriodTaskOperation.Quantity() + ( targetPeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      Transaction::Transaction().Propagate();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl
new file mode 100644
index 0000000..1924b71
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_UnifiedProcessingOfRoundingLogic.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method UnifiedProcessingOfRoundingLogic (
+  Real unifiedProcessingTimeOfRounding,
+  UnitPeriodTimeBase sourceUnitPeriodTimeBase,
+  PeriodTaskOperation periodTaskOperation,
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    sourcePeriodTaskOperation := select( sourceUnitPeriodTimeBase, PeriodTaskOperation, tempOTO, tempOTO.Operation() = periodTaskOperation.Operation() );
+        
+    if ( isnull( sourcePeriodTaskOperation ) ) {
+      debuginfo( "婧愪骇鑳藉懆鏈熶笉瀛樺湪鐩爣鍛ㄦ湡浠诲姟" );
+      periodTaskOperation.Update( periodTaskOperation.Quantity() - ( periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      sourcePeriodTaskOperation := PeriodTaskOperation::Create( periodTaskOperation.Operation(), sourceUnitPeriodTimeBase, periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding, false );
+      Transaction::Transaction().Propagate();
+          
+    //  info( "鏂板垱寤虹殑鍛ㄦ湡浠诲姟鏈夊嚑涓渶姹傦細", sourcePeriodTaskOperation.DependentDemand( relsize ), "    鍛ㄦ湡浠诲姟ID涓猴細", sourcePeriodTaskOperation.Key().AsQUILL() );
+      traverse ( sourcePeriodTaskOperation, DependentDemand, dd, true ) {
+        targetDependentDemand := select( periodTaskOperation, DependentDemand, tempDD, tempDD.ProcessInput().astype( OperationInput ).Name() = dd.ProcessInput().astype( OperationInput ).Name() );
+        targetTempDependentDemandInputGroup := select( macroPlan, TempDependentDemandInputGroup, tempTDDIG, tempTDDIG.ID() = guard( targetDependentDemand.Key().AsQUILL(), "" ) );
+        if ( not isnull( targetTempDependentDemandInputGroup ) ) {
+    //      info( "鍒涘缓浜嗕緷璧栭渶姹傦紝ID涓猴細", dd.Key().AsQUILL() );
+          macroPlan.TempDependentDemandInputGroup( relnew, ID                    := dd.Key().AsQUILL(),
+                                                           Divisor               := targetTempDependentDemandInputGroup.Divisor(),
+                                                           UnitID                := targetTempDependentDemandInputGroup.UnitID(),
+                                                           ProductInStockingName := targetTempDependentDemandInputGroup.ProductInStockingName() );
+        }
+      }
+      Transaction::Transaction().Propagate();
+    } else {
+      debuginfo( "婧愪骇鑳藉懆鏈熷瓨鍦ㄧ洰鏍囧懆鏈熶换鍔�" );
+      periodTaskOperation.Update( periodTaskOperation.Quantity() - ( periodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      sourcePeriodTaskOperation.Update( sourcePeriodTaskOperation.Quantity() + ( sourcePeriodTaskOperation.Operation().Throughput() * unifiedProcessingTimeOfRounding ), false );
+      Transaction::Transaction().Propagate();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl b/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl
new file mode 100644
index 0000000..e0b7ee9
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/Method_ZeroCapacityReplenishment.qbl
@@ -0,0 +1,100 @@
+Quintiq file version 2.0
+#parent: #root
+Method ZeroCapacityReplenishment (
+  MacroPlan macroPlan,
+  Real timeDifference,
+  UnitPeriodTimeBase uptb,
+  UnitPeriodTimeBases uptbs
+)
+{
+  TextBody:
+  [*
+    debuginfo( "闇�瑕佽ˉ闆剁殑鏃堕棿锛堝崟浣嶏細灏忔椂锛�", timeDifference, "    闇�瑕佽ˉ闆剁殑浜ц兘鍛ㄦ湡鐨勫紑濮嬫椂闂达細", uptb.StartDate().Format( "Y-M2-D2" ) );
+        
+    //debuginfo( "鑰冭檻搴撳瓨銆乴otsize" );
+    //traverse ( unitPeriodTimeBase, PeriodTaskOperation, pto, timeDifference > 0 ) { 
+    //  minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+    //  minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+    //  traverse ( pto, NewSupply, ns, true ) {
+    //    targetBorrowSplitShiftLotsizeLimit := select( scenarioManager, SplitShiftLotsizeLimit, tempSSLL, tempSSLL.unitID() = unitPeriodTimeBase.UnitID() and
+    //                                                                                                     tempSSLL.productID() = ns.ProductInStockingPointInPeriodPlanningLeaf().ProductInStockingPoint_MP().ProductID() and
+    //                                                                                                     tempSSLL.startTime() <= ns.Start().Date() and
+    //                                                                                                     tempSSLL.endTime() >= ns.End().Date() );
+    //    minimumQuantityThatCanBeBorrowed := minvalue(
+    //                                                  minvalue( ifexpr( not isnull( targetBorrowSplitShiftLotsizeLimit ) and targetBorrowSplitShiftLotsizeLimit.lotsize() < ns.Quantity(), 
+    //                                                                    ns.Quantity() - targetBorrowSplitShiftLotsizeLimit.lotsize(), 
+    //                                                                    Real::MaxReal() ),
+    //                                                            minvalue( 
+    //                                                                      ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, 
+    //                                                                                ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 
+    //                                                                                0.0 
+    //                                                                             ), 
+    //                                                                      ns.Quantity()    
+    //                                                                     ) 
+    //                                                           ),
+    //                                                  minimumQuantityThatCanBeBorrowed 
+    //                                                 );
+    //  }
+    //  minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+    //  nextUnitPeriodTimeBase := ifexpr( isnull( unitPeriodTimeBase.Next().astype( UnitPeriodTimeBase ) ), select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = unitPeriodTimeBase.End() ), unitPeriodTimeBase.Next().astype( UnitPeriodTimeBase ) );
+    //  while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) and minimumCapacityThatCanBeBorrowed > 0 ) {
+    //    acceptableCapacity := ifexpr( ( nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal() ) > 0,
+    //                                    nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal(),
+    //                                    0.0 );
+    //    unifiedProcessingTimeOfComplementZero := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed, acceptableCapacity );
+    //    debuginfo( "鎺ョ撼鐨勫懆鏈熸椂闂达細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), String::Tab(), 
+    //               "鎺ョ撼鐨勫懆鏈熻兘鎺ュ彈鐨勪骇鑳斤細", acceptableCapacity, String::Tab(),
+    //               "鍓╀綑琛ラ浂鐨勪骇鑳斤細", timeDifference, String::Tab(),
+    //               "缁熶竴杞Щ鐨勪骇鑳斤細", unifiedProcessingTimeOfComplementZero, String::Tab()
+    //              );
+    //    this.A_unifiedProcessingOfComplementZeroLogic( unifiedProcessingTimeOfComplementZero, pto, nextUnitPeriodTimeBase, macroPlan );
+    //    minimumCapacityThatCanBeBorrowed := minimumCapacityThatCanBeBorrowed - unifiedProcessingTimeOfComplementZero;
+    //    timeDifference := timeDifference - unifiedProcessingTimeOfComplementZero;
+    //    if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+    //      nextUnitPeriodTimeBase := select( unitPeriodTimeBases, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+    //    } else {
+    //      nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+    //    }
+    //  }
+    //}
+        
+    debuginfo( "涓嶈�冭檻搴撳瓨銆乴otsize浣垮叾杈惧埌鏁寸彮" );
+    traverse ( uptb, PeriodTaskOperation, pto, timeDifference > 0 ) { 
+      minimumQuantityThatCanBeBorrowed := Real::MaxReal();
+      minimumCapacityThatCanBeBorrowed := Real::MaxReal();
+      traverse ( pto, NewSupply, ns, true ) {
+        minimumQuantityThatCanBeBorrowed := minvalue( 
+                                                      minvalue( 
+                                                                ifexpr( ( ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel() ) > 0, 
+                                                                          ns.ProductInStockingPointInPeriodPlanningLeaf().InventoryLevelEnd() - ns.ProductInStockingPointInPeriodPlanningLeaf().MinInventoryLevel(), 
+                                                                          0.0 
+                                                                       ), 
+                                                                ns.Quantity()    
+                                                               ), 
+                                                      minimumQuantityThatCanBeBorrowed 
+                                                     );
+      }
+      minimumCapacityThatCanBeBorrowed := minimumQuantityThatCanBeBorrowed / pto.Operation().Throughput();
+      nextUnitPeriodTimeBase := ifexpr( isnull( uptb.Next().astype( UnitPeriodTimeBase ) ), select( uptbs, Elements, tempUPTB, tempUPTB.Start() = uptb.End() ), uptb.Next().astype( UnitPeriodTimeBase ) );
+      while ( timeDifference > 0 and not isnull( nextUnitPeriodTimeBase ) and minimumCapacityThatCanBeBorrowed > 0 ) {
+        acceptableCapacity := ifexpr( ( nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal() ) > 0,
+                                        nextUnitPeriodTimeBase.TotalAvailableCapacity().HoursAsReal() - nextUnitPeriodTimeBase.UsedCapacity().HoursAsReal(),
+                                        0.0 );
+        unifiedProcessingTimeOfComplementZero := minvalue( timeDifference, minimumCapacityThatCanBeBorrowed, acceptableCapacity );
+        debuginfo( "鎺ョ撼鐨勫懆鏈熸椂闂达細", nextUnitPeriodTimeBase.StartDate().Format( "Y-M2-D2" ), String::Tab(), 
+                   "鎺ョ撼鐨勫懆鏈熻兘鎺ュ彈鐨勪骇鑳斤細", acceptableCapacity, String::Tab(),
+                   "鍓╀綑琛ラ浂鐨勪骇鑳斤細", timeDifference, String::Tab(),
+                   "缁熶竴杞Щ鐨勪骇鑳斤細", unifiedProcessingTimeOfComplementZero, String::Tab()
+                  );
+        this.UnifiedProcessingOfComplementZeroLogic( unifiedProcessingTimeOfComplementZero, pto, uptb, macroPlan );
+        minimumCapacityThatCanBeBorrowed := minimumCapacityThatCanBeBorrowed - unifiedProcessingTimeOfComplementZero;
+        timeDifference := timeDifference - unifiedProcessingTimeOfComplementZero;
+        if ( isnull( nextUnitPeriodTimeBase.Next() ) ) {
+          nextUnitPeriodTimeBase := select( uptbs, Elements, tempUPTB, tempUPTB.Start() = nextUnitPeriodTimeBase.End() );
+        } else {
+          nextUnitPeriodTimeBase := nextUnitPeriodTimeBase.Next().astype( UnitPeriodTimeBase );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl b/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl
new file mode 100644
index 0000000..6354ee7
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/StaticMethod_GenerateDailyCapacity.qbl
@@ -0,0 +1,103 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateDailyCapacity (
+  MacroPlan macroPlan,
+  Date indexDate,
+  String unitID
+) as Duration
+{
+  TextBody:
+  [*
+    returnCapacity := Duration::Zero();
+        
+    traverse ( macroPlan, Unit.UnitPeriod.astype( UnitPeriodTimeBase ), this, this.UnitID() = unitID and 
+                                                                              this.StartDate() <= indexDate and 
+                                                                              this.End().Date() > indexDate and
+                                                                              /*this.IsBase() and*/
+                                                                              this.IsPlanning() ) {
+      // Determined by the used shift pattern, the efficiency rate, maintenance considering its maintenance factor, allocation, max load percentage and calendar elements.
+      //  debuginfo( "閬嶅巻鐨勬椂闂磋妭鐐癸紙寮�濮嬫椂闂达級锛�", this.StartDate(), "    缁撴潫鏃堕棿锛�", this.End() );
+      value := Duration::Zero();
+          
+      datetimevector := DateTimeVector::Construct();
+      durationvector := RealVector::Construct();
+          
+      if( this.IsPlanning() or this.IsBase() )
+      {
+        planningup := ifexpr( this.IsPlanning(), 
+                              this,                                             // Case 1: planning UnitPeriod: aggregate values from associated period tasks 
+                              this.PlanningUP().astype( UnitPeriodTimeBase ) ); // Case 2: base, non planning UnitPeriod: disaggregate value from planning UnitPeriod
+                                 
+        if( not isnull( planningup ) )
+        {
+          if( not isnull( planningup.Period_MP() ) 
+              and not isnull( planningup.ShiftPattern() ) 
+              and not planningup.Period_MP().IsInHour() ) //gdn1 HourlyPeriod is not applicable for ShiftPattern
+          {
+             lastshiftday := planningup.StartDate() - planningup.Period_MP().Start().StartOfWeek().Date() + 1
+                
+             nrdaysinthisperiod := planningup.Duration().DaysAsReal();
+                  
+             firstday := planningup.Period_MP().Start();
+             numberofshiftday := planningup.ShiftPattern().ShiftDay( relsize );
+             
+             if( not isnull( planningup.Previous() ) )
+             {
+               lastshiftday := planningup.Previous().astype( UnitPeriodTimeBase ).PreviousPeriodLastShiftDay() + 1;
+                
+             }
+            
+             for( i := 0; i < nrdaysinthisperiod and firstday + Duration::Days( i ) >= planningup.Unit().StartDate().DateTime() ; i++ )
+             {
+               shiftday := lastshiftday + i;
+            
+               if( shiftday > numberofshiftday )
+               {
+                 shiftday := shiftday mod numberofshiftday;
+            
+                 if( shiftday = 0 )
+                 {
+                   shiftday := numberofshiftday;
+                 }
+               }
+            
+               shift := select( planningup.ShiftPattern(), ShiftDay, shift, shift.Day() = shiftday, true );
+               unavailable := planningup.Unit().UnavailableTime( firstday + Duration::Days( i ), firstday + Duration::Days( i + 1 ) );
+            
+               if( not isnull( shift ) )
+               {
+                 shiftduration := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
+                 //value := value + shiftduration;
+                 datetimevector.Append( firstday + Duration ::Days( i ) );
+                 durationvector.Append( shiftduration.HoursAsReal() );
+               }
+               if ( /*this.UnitID() = unitID and this.IsBase() and this.IsPlanning() and*/ ( this.StartDate() + i ) = indexDate ) {
+          //          debuginfo( "褰撳墠寮�濮嬫椂闂达細", this.StartDate() + i, "    褰撳墠浜ц兘锛�", maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
+          //          this.MacroPlan().UnitPeriodTimeBaseDailyCapacity( relnew, startDate := this.StartDate() + i,
+          //                                                                    capacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() ) );
+                    returnCapacity := maxvalue( ( shift.Capacity() - unavailable ), Duration::Zero() );
+                }
+             } // for 
+               
+             value := this.GetPlanningCapacity( datetimevector, durationvector );
+       }// if planning period not in hour
+       else if ( planningup.Period_MP().DurationInDays() < 1 )   //gdn1 HourlyPeriod is always same as PeriodDuration 
+              {
+                value := planningup.Unit().UnitCalendar().AvailableTime( planningup.Start(), planningup.End(), 0.00000001 ); // Check calendar to make hourly period work with the calendar
+              }
+              
+              value := maxvalue( ( value * planningup.Efficiency() * planningup.Allocation()  -  ( planningup.Maintenance() * this.PlanningSystemRatio() ) )* planningup.NrOfOpen(), Duration::Zero() );   
+        }
+      }
+      else
+      {
+            
+        value := sum( this.GetChildrenOfPeriodDimension(), Elements.astype( UnitPeriodTimeBase ), e, e.BaseAvailableCapacity() );
+      }
+          
+      //  this.BaseAvailableCapacity( value );  
+    }
+        
+    return returnCapacity;
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl b/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl
new file mode 100644
index 0000000..a93edca
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/StaticMethod_OnServerStartup.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod OnServerStartup
+{
+  TextBody:
+  [*
+    // lihongji May-15-2024 (created)
+    folder := DomainModel::Domain().MDSFolderDefinitions().FindFolder( "/root" );
+    
+    datasetName := typeof( WholeShift ).Name();
+    
+    oinfo := MDSEditor::Editor().ObjectInfos( datasetName, folder.FolderID(), datasetName );
+    
+    o := select( oinfo, Elements, o, not o.IsLoaded() );
+    emptydataset := isnull( o );
+    
+    if ( emptydataset ) {
+      MDSWholeShift::CreateMDS( datasetName, DMF_Utility::GetStorageState() );
+    } else {
+      MDSWholeShift::LoadMDSAndConvert( o.MDSID(), DMF_Utility::GetStorageState() );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl b/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl
new file mode 100644
index 0000000..ffcf9a2
--- /dev/null
+++ b/_Main/BL/Type_WholeShift/_ROOT_Type_WholeShift.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type WholeShift
+{
+  #keys: '5[413988.0.1256611417][413988.0.1256611415][0.0.0][413988.0.1256611416][413988.0.1256611418]'
+  BaseType: Object
+  StructuredName: 'WholeShifts'
+}
diff --git a/_Main/Sys/ImgAttr/Entity.dme b/_Main/Sys/ImgAttr/Entity.dme
new file mode 100644
index 0000000..48992f1
--- /dev/null
+++ b/_Main/Sys/ImgAttr/Entity.dme
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+TypeDataInterface Entity
+{
+  TypeKey: '[127710.1.1013709077]'
+  ImageDataMember ImgIsToFill
+  {
+    #keys: '1[413988.0.1254350815]'
+    ImageSpecifications:
+    [
+      ImageDataMemberImageSpecification
+      {
+        Image: 'CHECKEDCHECKBOX'
+        Quill: "( object.DisplayCapacityType() = 'Time' or object.DisplayCapacityType() = 'Transport quantity' ) and object.IsToFill()"
+        Value: 'Fill'
+      }
+      ImageDataMemberImageSpecification
+      {
+        Image: 'EMPTYCHECKBOX'
+        Quill: "( object.DisplayCapacityType() = 'Time' or object.DisplayCapacityType() = 'Transport quantity' ) and not object.IsToFill()"
+        Value: 'NotFill'
+      }
+    ]
+  }
+}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 899ebeb..07043ad 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -83,6 +83,8 @@
         Component ComponentMenu347 { #keys: '[413988.0.1172464302]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'FormTest1' Text: '' ] }
         Component ComponentMenu357 { #keys: '[414996.0.395684386]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis589' Text: 'Archive Execution Status' ] }
         Component ComponentMenu702 { #keys: '[413988.0.1234424010]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis822' Text: 'Interface Dataset' ] }
+        Component menuSeparator891 { #keys: '[413988.0.1263894630]' BaseType: 'Menu' Properties: [ Separator: true ] }
+        Component MenuWholeShift { #keys: '[413988.0.1263894682]' BaseType: 'Menu' Properties: [ Image: 'FISH_BOWL' Text: '娴嬭瘯鏁寸彮' ] }
       ]
       Properties:
       [
@@ -104,6 +106,8 @@
           c: ComponentMenu702
           c: menuSeparator222
           c: ComponentMenu347
+          c: menuSeparator891
+          c: MenuWholeShift
         }
       ]
     }
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def
new file mode 100644
index 0000000..565378a
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: mbMainMenu/MenuWholeShift
+Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuWholeShift_OnClick
+{
+  #keys: '[413988.0.1263894734]'
+  Body:
+  [*
+    WholeShift.PostProcessing2( MacroPlan );
+  *]
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_Menu_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and not isnull( WholeShift );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
index 520564f..9c15e93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
@@ -5,6 +5,10 @@
   #keys: '[414702.2.1843141002]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and not isnull( WholeShift );
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def
new file mode 100644
index 0000000..65e113f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[413988.0.1274023099]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[413988.0.1274023103]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[413988.0.1274023105]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
new file mode 100644
index 0000000..3ff0626
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Component_pnlContent.def
@@ -0,0 +1,69 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[413988.0.1274023097]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component npCylinderBlock
+    {
+      #keys: '[413988.0.1273522242]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.CylinderBlock'
+        Label: '缂镐綋(pcs)'
+        Taborder: 0
+      ]
+    }
+    Component npCylinderHead
+    {
+      #keys: '[413988.0.1273522255]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.CylinderHead'
+        Label: '缂哥洊(pcs)'
+        Taborder: 1
+      ]
+    }
+    Component npConnectingRod
+    {
+      #keys: '[413988.0.1273522267]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.ConnectingRod'
+        Label: '杩炴潌(pcs)'
+        Taborder: 2
+      ]
+    }
+    Component npCrankshaft
+    {
+      #keys: '[413988.0.1273522280]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.Crankshaft'
+        Label: '鏇茶酱(pcs)'
+        Taborder: 3
+      ]
+    }
+    Component npBalanceAxis
+    {
+      #keys: '[413988.0.1273522292]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'MacroPlan.BalanceAxis'
+        Label: '骞宠 杞�(pcs)'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
similarity index 88%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
index ac96ffa..fc240d4 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnCancel_OnClick.def
@@ -2,7 +2,7 @@
 #parent: pnlActions/btnCancel
 Response OnClick () id:Response_pnlActions_btnCancel_OnClick
 {
-  #keys: '[414702.2.1844994368]'
+  #keys: '[413988.0.1274023109]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
   QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
similarity index 89%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
index f6a3c38..c62760b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/Response_pnlActions_btnOk_OnClick.def
@@ -2,7 +2,7 @@
 #parent: pnlActions/btnOk
 Response OnClick () id:Response_pnlActions_btnOk_OnClick
 {
-  #keys: '[414702.2.1844994367]'
+  #keys: '[413988.0.1274023108]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
   QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
new file mode 100644
index 0000000..b2f9f0d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogTransferMinimumQuantity/_ROOT_Component_DialogTransferMinimumQuantity.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogTransferMinimumQuantity
+{
+  #keys: '[413988.0.1274023095]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
index 650c732..9993e10 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
@@ -31,7 +31,7 @@
           BaseType: 'WebDataSetLevel'
           Properties:
           [
-            Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}}]'
+            Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
             ContextMenu: 'listContextMenu902'
             FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
             RelationFromParent: 'ChildEntity'
@@ -43,7 +43,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":-1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayName","title":"Name","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayCapacityType","title":"Capacity type","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"DisplayCapacityType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsToFill","title":"ImgIsToFill","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsToFill"}}]'
         ContextMenu: 'listContextMenu902'
         RelationFromParent: 'ChildEntity'
         SortCriteria: 'DisplayIndex'
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
index 7874133..b97df8e 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
@@ -27,6 +27,28 @@
         Title: 'Select all'
       ]
     }
+    Component mEnable
+    {
+      #keys: '[413988.0.1257262758]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'CHECKEDCHECKBOX'
+        Taborder: 4
+        Title: 'Enable'
+      ]
+    }
+    Component mDisable
+    {
+      #keys: '[413988.0.1254331512]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'EMPTYCHECKBOX'
+        Taborder: 5
+        Title: 'Disable'
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
index 42d8211..f12a696 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
@@ -5,30 +5,11 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component btnOk
-    {
-      #keys: '[414702.2.1844994362]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'OK'
-        Taborder: 0
-      ]
-    }
-    Component btnCancel
-    {
-      #keys: '[414702.2.1844994364]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: 'Cancel'
-        Taborder: 1
-      ]
-    }
+    #child: pnlActionsRight_106
+    #child: pnlActionsLeft_522
   ]
   Properties:
   [
-    Alignment: 'trailing'
     Border: true
     ExcludeFromActiveComponent: true
     FixedSize: true
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def"
new file mode 100644
index 0000000..3355e3f
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsLeft\043522.def"
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component pnlActionsLeft id:pnlActionsLeft_522
+{
+  #keys: '[413988.0.1271132689]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bTransferMinimumQuantity
+    {
+      #keys: '[413988.0.1271132690]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '璋冩嫧鏈�灏忓寘瑁呮暟閲�'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def"
new file mode 100644
index 0000000..452bc14
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActionsRight\043106.def"
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component pnlActionsRight id:pnlActionsRight_106
+{
+  #keys: '[413988.0.1271132759]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk id:btnOk_568
+    {
+      #keys: '[413988.0.1273560747]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel id:btnCancel_925
+    {
+      #keys: '[413988.0.1273560814]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Cancel'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def
new file mode 100644
index 0000000..0d98356
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Method_OnOK.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogWholeShiftSystem_OnOK
+{
+  #keys: '[413988.0.1261831139]'
+  Body:
+  [*
+    Form.ApplyChanges();
+    
+    WholeShift.PostProcessing2( MacroPlan );
+    
+    Form.Close();
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def
new file mode 100644
index 0000000..b8c335a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mDisable_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnClick (
+  Entity selection
+) id:Response_ListEntity_mDisable_OnClick
+{
+  #keys: '[413988.0.1254381266]'
+  DefinitionID => /ListEntity/Responsedef_ListEntity_WebMenu_OnClick
+  Initiator: 'mDisable'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.IsToFill( false );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def
new file mode 100644
index 0000000..01c4b2e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_mEnable_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnClick (
+  Entity selection
+) id:Response_ListEntity_mEnable_OnClick
+{
+  #keys: '[413988.0.1256872893]'
+  DefinitionID => /ListEntity/Responsedef_ListEntity_WebMenu_OnClick
+  Initiator: 'mEnable'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.IsToFill( true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def
new file mode 100644
index 0000000..e0b4a75
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pnlActionsLeft_522/bTransferMinimumQuantity
+Response OnClick () id:Response_pnlActionsLeft_522_bTransferMinimumQuantity_OnClick
+{
+  #keys: '[413988.0.1271132688]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogTransferMinimumQuantity );
+      
+      ApplicationMacroPlanner.ShowFormModal( dlg );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def"
new file mode 100644
index 0000000..c4f0249
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnCancel_OnClick\043836.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActionsRight_106/btnCancel_925
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick_836
+{
+  #keys: '[413988.0.1273560813]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def"
new file mode 100644
index 0000000..74cc4c6
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActionsRight_106_btnOk_OnClick\043393.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActionsRight_106/btnOk_568
+Response OnClick () id:Response_pnlActions_btnOk_OnClick_393
+{
+  #keys: '[413988.0.1273560746]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Form.OnOK();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
index e89d0ad..2f27cb6 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
@@ -16,8 +16,8 @@
     EnterButton: 'btnOk'
     EscapeButton: 'btnCancel'
     ExcludeFromActiveComponent: true
-    MinimumColumns: 100
-    MinimumRows: 100
+    MinimumColumns: 110
+    MinimumRows: 35
     Padding: 'false'
     Title: 'WholeShiftSystem'
   ]

--
Gitblit v1.9.3