From 597f8e8f284b7494fceabaeb2c96e4496cfd2435 Mon Sep 17 00:00:00 2001
From: lihongji <3117313295@qq.com>
Date: 星期二, 18 六月 2024 17:31:51 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlActions.def                                             |   40 +
 _Main/BL/InfoMessages.qbl                                                                                                                |    4 
 _Main/BL/Type_LockPeriod/Attribute_LockDate.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_SetDefaultValue.def                                       |    4 
 _Main/BL/Type_UphillRouting/Attribute_Type.qbl                                                                                           |    7 
 _Main/BL/Type_LocalTool/_ROOT_Type_LocalTool.qbl                                                                                         |    9 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_npPercentage_OnCreated.def                       |   18 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupRestraint_ButtonLockPeriod_OnClick.def |   17 
 _Main/BL/Type_UphillRouting/Attribute_StartDate.qbl                                                                                      |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listContextMenuUphillRouting#1.def                        |   24 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnOk_OnClick.def                                       |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/_ROOT_Component_DialogCreateEditUphillRouting.def                    |   43 ++
 _Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl                                                                                       |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlContent.def                                                    |   52 ++
 _Main/BL/Type_UphillRouting/StaticMethod_Create.qbl                                                                                      |   17 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Method_SetLockPeriod.def                                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_PanelButtons_ButtonSetUnitUphillRouting_OnClick.def             |   18 
 _Main/BL/Type_UphillRouting/StaticMethod_Create#793.qbl                                                                                  |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create.def                                                    |   12 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/_ROOT_Component_DialogCreateEditUphillRoutings.def                  |   22 +
 LibMacroPlanner/BL/Type_Routing/_ROOT_Type_Routing.qbl                                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupRestraint.def                                      |   11 
 _Main/BL/Type_StockingPoint_MP/StaticMethod_FindCreateUpdate.qbl                                                                         |   60 ++
 _Main/BL/Relations/Relation_UphillRouting_CopyRouting_Routing_CopyUphillRouting.qbl                                                      |   23 +
 _Main/BL/Type_UphillRouting/Attribute_Percentage.qbl                                                                                     |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_ListUphillRouting#943.def                                 |   60 ++
 _Main/BL/Type_UphillRouting/Attribute_EndDate.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_ListRoutings.def                                                            |    4 
 _Main/BL/Type_UphillRouting/StaticMethod_Create#90.qbl                                                                                   |   34 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRouting.def                                         |   17 
 _Main/BL/Type_LockPeriod/StaticMethod_Create.qbl                                                                                         |   13 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlContent.def                                             |   76 +++
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/_ROOT_Component_FormRoutings.def                                                      |   29 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlActions.def                                                    |   40 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsStartDate_OnCreated.def                        |   18 
 LibMacroPlanner/BL/Type_Routing/Method_OnDelete.qbl                                                                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_pnlContent.def                                            |   25 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Response_ListUphillRouting_943_MenuCreate_OnClick.def               |   19 
 _Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_PanelButtons.def                                                            |   26 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create#680.def                                                |   18 
 _Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl                                                                                 |   19 
 _Main/BL/Type_UphillRouting/_ROOT_Type_UphillRouting.qbl                                                                                 |    9 
 _Main/BL/Relations/Relation_LockPeriod_ProductInStockingPoint_MP_ProductInStockingPoint_MP_Lock.qbl                                      |   23 +
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                                 |    4 
 _Main/BL/Type_Routing/Method_OnDelete.qbl                                                                                                |   12 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def                                        |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Edit.def                                                      |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listActionBarPageUphillRouting#1.def                      |   10 
 _Main/BL/Type_LockPeriod/_ROOT_Type_LockPeriod.qbl                                                                                       |    9 
 _Main/BL/Type_UnitPeriodQuantity/Function_CalcMaxCapacityPerTimeUnit.qbl                                                                 |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsEndDate_OnCreated.def                          |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_MenuSetUphillRouting_OnClick.def                   |   21 +
 _Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl                                                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnOk_OnClick.def                                |   20 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnCancel_OnClick.def                                   |   15 
 _Main/BL/Type_Routing/Method_Copy.qbl                                                                                                    |   39 +
 _Main/BL/Type_StockingPoint_MP/_ROOT_Type_StockingPoint_MP.qbl                                                                           |    6 
 _Main/BL/Type_UnitPeriodQuantity/_ROOT_Type_UnitPeriodQuantity.qbl                                                                       |    6 
 _Main/BL/Type_ProductInStockingPoint_MP/_ROOT_Type_ProductInStockingPoint_MP.qbl                                                         |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Method_CreateEditUphillRoutings.def                                 |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_OnOK.def                                                      |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnCancel_OnClick.def                            |   15 
 _Main/BL/Relations/Relation_UphillRouting_Routing_Routing_UphillRouting.qbl                                                              |   23 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/_ROOT_Component_DialogCreateLockPeriod.def                                  |   21 +
 _Main/BL/Type_Unit/StaticMethod_GetThermalTrial.qbl                                                                                      |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_listContextMenuRoutings.def                                                 |   11 
 69 files changed, 1,229 insertions(+), 19 deletions(-)

diff --git a/LibMacroPlanner/BL/Type_Routing/Method_OnDelete.qbl b/LibMacroPlanner/BL/Type_Routing/Method_OnDelete.qbl
new file mode 100644
index 0000000..c2d4914
--- /dev/null
+++ b/LibMacroPlanner/BL/Type_Routing/Method_OnDelete.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnDelete
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+  *]
+  InterfaceProperties { Accessibility: 'Module' }
+}
diff --git a/LibMacroPlanner/BL/Type_Routing/_ROOT_Type_Routing.qbl b/LibMacroPlanner/BL/Type_Routing/_ROOT_Type_Routing.qbl
index e556be4..5cac4b6 100644
--- a/LibMacroPlanner/BL/Type_Routing/_ROOT_Type_Routing.qbl
+++ b/LibMacroPlanner/BL/Type_Routing/_ROOT_Type_Routing.qbl
@@ -6,6 +6,7 @@
   #keys: '5[113694.1.1906651361][113694.1.1906651359][0.0.0][113694.1.1906651360][113694.1.1906651362]'
   BaseType: Object
   OnCommit: 'this.IsManuallyConfigured( true )'
+  OnDelete: 'this.OnDelete();'
   StructuredName: 'Routings'
   InterfaceProperties { Accessibility: 'Extensible' }
 }
diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index ee5f15b..c2762b7 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -106,6 +106,10 @@
   {
     DefaultText: 'The Event type of binding Event exists.'
   }
+  InfoMessage MP_Routing_IllegalDateRange
+  {
+    DefaultText: 'The start date cannot be longer than the end date.'
+  }
   InfoMessage MP_Routing_RequiredField
   {
     DefaultText: 'All fields Required This parameter is mandatory.'
diff --git a/_Main/BL/Relations/Relation_LockPeriod_ProductInStockingPoint_MP_ProductInStockingPoint_MP_Lock.qbl b/_Main/BL/Relations/Relation_LockPeriod_ProductInStockingPoint_MP_ProductInStockingPoint_MP_Lock.qbl
new file mode 100644
index 0000000..eecf123
--- /dev/null
+++ b/_Main/BL/Relations/Relation_LockPeriod_ProductInStockingPoint_MP_ProductInStockingPoint_MP_Lock.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation LockPeriod_ProductInStockingPoint_MP_ProductInStockingPoint_MP_LockPeriod
+{
+  #keys: '1[412672.0.1036852419]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ProductInStockingPoint_MP
+  {
+    #keys: '3[412672.0.1036852421][412672.0.1036852420][412672.0.1036852422]'
+    Cardinality: '0to1'
+    ObjectDefinition: LockPeriod
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide LockPeriod
+  {
+    #keys: '3[412672.0.1036852424][412672.0.1036852423][412672.0.1036852425]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductInStockingPoint_MP
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_UphillRouting_CopyRouting_Routing_CopyUphillRouting.qbl b/_Main/BL/Relations/Relation_UphillRouting_CopyRouting_Routing_CopyUphillRouting.qbl
new file mode 100644
index 0000000..b8e100e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_UphillRouting_CopyRouting_Routing_CopyUphillRouting.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation UphillRouting_CopyRouting_Routing_CopyUphillRouting
+{
+  #keys: '1[412672.0.1042903929]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide CopyRouting
+  {
+    #keys: '3[412672.0.1042903931][412672.0.1042903930][412672.0.1042903932]'
+    Cardinality: '0to1'
+    ObjectDefinition: UphillRouting
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide CopyUphillRouting
+  {
+    #keys: '3[412672.0.1042903934][412672.0.1042903933][412672.0.1042903935]'
+    Cardinality: '0to1'
+    ObjectDefinition: Routing
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_UphillRouting_Routing_Routing_UphillRouting.qbl b/_Main/BL/Relations/Relation_UphillRouting_Routing_Routing_UphillRouting.qbl
new file mode 100644
index 0000000..1f66f35
--- /dev/null
+++ b/_Main/BL/Relations/Relation_UphillRouting_Routing_Routing_UphillRouting.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation UphillRouting_Routing_Routing_UphillRouting
+{
+  #keys: '1[412672.0.1042903717]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Routing
+  {
+    #keys: '3[412672.0.1042903719][412672.0.1042903718][412672.0.1042903720]'
+    Cardinality: '0to1'
+    ObjectDefinition: UphillRouting
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide UphillRouting
+  {
+    #keys: '3[412672.0.1042903722][412672.0.1042903721][412672.0.1042903723]'
+    Cardinality: '1toN'
+    ObjectDefinition: Routing
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
new file mode 100644
index 0000000..e4d6bb3
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod IsOverlap (
+  Date start1,
+  Date end1,
+  Date start2,
+  Date end2
+) const declarative as Boolean
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    return start1 < end2 and start2 < end1 ;
+  *]
+}
diff --git a/_Main/BL/Type_LocalTool/_ROOT_Type_LocalTool.qbl b/_Main/BL/Type_LocalTool/_ROOT_Type_LocalTool.qbl
new file mode 100644
index 0000000..b840ecf
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/_ROOT_Type_LocalTool.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LocalTool
+{
+  #keys: '5[412672.0.1042354674][412672.0.1042354672][0.0.0][412672.0.1042354673][412672.0.1042354675]'
+  BaseType: Object
+  StructuredName: 'LocalTools'
+}
diff --git a/_Main/BL/Type_LockPeriod/Attribute_LockDate.qbl b/_Main/BL/Type_LockPeriod/Attribute_LockDate.qbl
new file mode 100644
index 0000000..d5954be
--- /dev/null
+++ b/_Main/BL/Type_LockPeriod/Attribute_LockDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute LockDate
+{
+  #keys: '3[412672.0.1036852403][412672.0.1036852402][412672.0.1036852404]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_LockPeriod/StaticMethod_Create.qbl b/_Main/BL/Type_LockPeriod/StaticMethod_Create.qbl
new file mode 100644
index 0000000..4aa7e39
--- /dev/null
+++ b/_Main/BL/Type_LockPeriod/StaticMethod_Create.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  ProductInStockingPoint_MP owner,
+  Date lockDate
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-13-2024 (created)
+    owner.LockPeriod( relnew, LockDate := lockDate );
+  *]
+}
diff --git a/_Main/BL/Type_LockPeriod/_ROOT_Type_LockPeriod.qbl b/_Main/BL/Type_LockPeriod/_ROOT_Type_LockPeriod.qbl
new file mode 100644
index 0000000..5e442ac
--- /dev/null
+++ b/_Main/BL/Type_LockPeriod/_ROOT_Type_LockPeriod.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type LockPeriod
+{
+  #keys: '5[412672.0.1036852386][412672.0.1036852384][0.0.0][412672.0.1036852385][412672.0.1036852387]'
+  BaseType: Object
+  StructuredName: 'LockPeriods'
+}
diff --git a/_Main/BL/Type_ProductInStockingPoint_MP/_ROOT_Type_ProductInStockingPoint_MP.qbl b/_Main/BL/Type_ProductInStockingPoint_MP/_ROOT_Type_ProductInStockingPoint_MP.qbl
new file mode 100644
index 0000000..f9eb53e
--- /dev/null
+++ b/_Main/BL/Type_ProductInStockingPoint_MP/_ROOT_Type_ProductInStockingPoint_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ProductInStockingPoint_MP #extension
+{
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl
index 0226cbe..bf02abd 100644
--- a/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl
@@ -12,7 +12,7 @@
     //锛�3锛�  鍚屼竴鏃堕棿锛屼竴鏉′骇绾夸笉鍙互鍜屽鏉′骇绾胯疆鎹㈢敓浜э紝濡傛灉浜х嚎1ZKG鍜屼骇绾�2ZK鐨勮疆鎹㈢彮娆″凡缁忓湪4/29/2024鐢熸晥锛岄偅涔堜骇绾�1ZKG鍜屽叾浠栦骇绾跨殑杞崲鐝鏃犳硶鍦ㄥ悓涓�鏃堕棿鐢熸晥锛屾鏃躲�怑nable銆戞寜閽鐢�
     verifyData := select( owner,ProductionLineBatchData,plbd, plbd <> this and plbd.IsEnable() and 
                           ( plbd.Unit1() = this.Unit1() or plbd.Unit2() = this.Unit2() or plbd.Unit1() = this.Unit2() or plbd.Unit2() = this.Unit1()) and
-                          ( plbd.StartDate() <= this.EndDate() or plbd.EndDate() >= this.StartDate() ));
+                          LocalTool::IsOverlap( plbd.StartDate(),plbd.EndDate(),this.StartDate(),this.EndDate()));
     
     if( not isnull( verifyData )){
       feeback := "銆�" + verifyData.Unit1().Name() + "銆戙��" + verifyData.Unit2().Name() + "銆戝凡浜�" + verifyData.StartDate().Format( "Y-M2-D2" ) +"鐢熸晥銆�";
diff --git a/_Main/BL/Type_Routing/Method_Copy.qbl b/_Main/BL/Type_Routing/Method_Copy.qbl
new file mode 100644
index 0000000..b1c6498
--- /dev/null
+++ b/_Main/BL/Type_Routing/Method_Copy.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+Method Copy (
+  String suffix
+) as Routing
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    
+    routingname := this.MacroPlan().GetUniqueRoutingName( this.Name() + suffix );
+    
+    newrouting := Routing::Create( this.MacroPlan(),
+                                   routingname,
+                                   routingname,
+                                   this.Start(),
+                                   this.End(),
+                                   this.AllowWIPInventory(),
+                                   false 
+                                   );
+    
+    // Copy rouitng step with operations
+    traverse( this, RoutingStep, rs )
+    {
+      rs.Copy( newrouting );
+    }
+    
+    // Propagated all Operation-Step-Routing relation before copy operation link
+    Transaction::Transaction().Propagate();
+    
+    traverse( this, RoutingStep.Operation.SourceOperationLink, ol )
+    {
+      ol.Copy( newrouting );
+    }
+    
+    
+    return newrouting;
+  *]
+}
diff --git a/_Main/BL/Type_Routing/Method_OnDelete.qbl b/_Main/BL/Type_Routing/Method_OnDelete.qbl
new file mode 100644
index 0000000..8a470f9
--- /dev/null
+++ b/_Main/BL/Type_Routing/Method_OnDelete.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnDelete #extension
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    if( not isnull( this.CopyUphillRouting())){
+      this.CopyUphillRouting().Delete();
+    }
+  *]
+}
diff --git a/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
index 54256b2..63d74ca 100644
--- a/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
+++ b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
@@ -2,6 +2,7 @@
 #parent: #root
 StaticMethod ThermalTrialRatio (
   Routing routing,
+  Unit unit,
   Number capacity,
   Date start,
   Date end,
@@ -12,10 +13,24 @@
   TextBody:
   [*
     // Adhi Feb-10-2016 (created)
-    thermaltrial := '鐑紡';
+    thermaltrial := Unit::GetThermalTrial();
     newroutings := construct( Routings );
-    unit := selectobject( routing.MacroPlan(), Unit, unit, unit.ID() = thermaltrial and unit.HasCapacityTypeQuantity() );
+    
+    for( starttime := start; starttime <= end; starttime := starttime + 1 ){
+      uc := selectobject( unit, UnitCapacity, uc, uc.Start().Date() = starttime );
+      if( isnull( uc ) ){
+        uc := UnitCapacity::Create( unit, starttime.DateTime(), 'Day', 0.0, [Real]capacity, 100.0, 1, false );
+      }
+      uc.MaxCapacity( [Real]capacity * ratio );
+    }
+    
     newrouting := routing.Copy();
+    name := newrouting.Name().ReplaceAll( 'Copy', thermaltrial );
+    newrouting.Name( name );
+    newrouting.UpdateTypeIndex( name );
+    routing.Start( start );
+    routing.End( end );
+    
     routingstep := newrouting.LastStep();
     //info( '------------------', routingstep.Tool(), ',', unit.ID() );
     newroutingstep := RoutingStep::Create( newrouting, thermaltrial, routingstep.Tool(), false );
diff --git a/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
index ad8089d..9884441 100644
--- a/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
+++ b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
@@ -2,7 +2,7 @@
 #parent: #root
 StaticMethod ValidateThermalTrialRatio (
   output String feedback_o,
-  Routing routing,
+  Unit unit,
   Number capacity,
   Date start,
   Date end,
@@ -15,10 +15,13 @@
     // Adhi Feb-10-2016 (created)
     feedback_o := '';
     
-    if( isnull( routing ) or capacity < 1 or start = Date::MinDate() or end = Date::MinDate() or ratio < 1 ){
+    if( isnull( unit ) or capacity < 1 or start = Date::MinDate() or end = Date::MinDate() or ratio < 1 ){
       feedback_o := Translations::MP_Routing_RequiredField();
     }
     
+    if( start > end ){
+      feedback_o := Translations::MP_Routing_IllegalDateRange();
+    }
     
     return feedback_o = '';
   *]
diff --git a/_Main/BL/Type_StockingPoint_MP/StaticMethod_FindCreateUpdate.qbl b/_Main/BL/Type_StockingPoint_MP/StaticMethod_FindCreateUpdate.qbl
new file mode 100644
index 0000000..28cea4d
--- /dev/null
+++ b/_Main/BL/Type_StockingPoint_MP/StaticMethod_FindCreateUpdate.qbl
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FindCreateUpdate (
+  MacroPlan owner,
+  String spid,
+  Unit sourceunit,
+  Routing routing,
+  Boolean isfromdb
+) #extension
+{
+  TextBody:
+  [*
+    stockingpoint := owner.FindStockingPoint( spid );
+    parentunit := guard( owner.FindUnit( sourceunit.ParentUnitID() ), null( Unit ) );
+    if( sourceunit.Name().FindString( Unit::GetThermalTrial(), 0 ) >= 0 ){
+      parentunit := sourceunit;
+    }
+    uom := guard( owner.FindUnitOfMeasure( sourceunit.UnitOfMeasureName() ), null( UnitOfMeasure_MP ) );
+    currency := guard( owner.FindCurrency( sourceunit.CurrencyID() ), null( Currency_MP ) );
+    
+    if( isnull( stockingpoint ) )
+    {
+      stockingpoint := StockingPoint_MP::Create( spid,
+                                                 owner,
+                                                 parentunit,
+                                                 spid,
+                                                 '', //iconname
+                                                 uom,
+                                                 currency,
+                                                 routing.AllowWIPInventory(),
+                                                 sourceunit.StartDate(),
+                                                 sourceunit.EndDate(),
+                                                 null( Group ),
+                                                 '', //giscountrycode
+                                                 '', //giscity
+                                                 '', //gispostalcode,
+                                                 '',
+                                                 isfromdb ); 
+    }
+    else
+    {
+      stockingpoint.Update( parentunit,
+                            spid,
+                            spid,
+                            uom,
+                            currency,
+                            stockingpoint.IconName(),
+                            routing.AllowWIPInventory(),
+                            sourceunit.StartDate(),
+                            sourceunit.EndDate(),
+                            stockingpoint.Group(),
+                            stockingpoint.GISCountryCode(),
+                            stockingpoint.GISCity(),
+                            stockingpoint.GISPostalCode(),
+                            stockingpoint.Notes(),
+                            isfromdb );
+    }
+    return stockingpoint
+  *]
+}
diff --git a/_Main/BL/Type_StockingPoint_MP/_ROOT_Type_StockingPoint_MP.qbl b/_Main/BL/Type_StockingPoint_MP/_ROOT_Type_StockingPoint_MP.qbl
new file mode 100644
index 0000000..98f0942
--- /dev/null
+++ b/_Main/BL/Type_StockingPoint_MP/_ROOT_Type_StockingPoint_MP.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization StockingPoint_MP #extension
+{
+}
diff --git a/_Main/BL/Type_Test/StaticMethod_Test.qbl b/_Main/BL/Type_Test/StaticMethod_Test.qbl
index 6504f53..5a0ddf8 100644
--- a/_Main/BL/Type_Test/StaticMethod_Test.qbl
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -9,5 +9,9 @@
   TextBody:
   [*
     // rislai Jun-9-2024 (created)
+    
+    traverse( macroPlan,Routing,rt ){
+      rt.UphillRouting( relflush ); 
+    }
   *]
 }
diff --git a/_Main/BL/Type_Unit/StaticMethod_GetThermalTrial.qbl b/_Main/BL/Type_Unit/StaticMethod_GetThermalTrial.qbl
new file mode 100644
index 0000000..86c6133
--- /dev/null
+++ b/_Main/BL/Type_Unit/StaticMethod_GetThermalTrial.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetThermalTrial () const declarative as String
+{
+  TextBody:
+  [*
+    // 鐢勫叞楦� Jun-14-2024 (created)
+    return '鐑瘯';
+  *]
+}
diff --git a/_Main/BL/Type_UnitPeriodQuantity/Function_CalcMaxCapacityPerTimeUnit.qbl b/_Main/BL/Type_UnitPeriodQuantity/Function_CalcMaxCapacityPerTimeUnit.qbl
new file mode 100644
index 0000000..26f12e4
--- /dev/null
+++ b/_Main/BL/Type_UnitPeriodQuantity/Function_CalcMaxCapacityPerTimeUnit.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcMaxCapacityPerTimeUnit #extension
+{
+  TextBody:
+  [*
+    value := ifexpr( this.HasUnitCapacity(), this.UnitCapacity().MaxCapacity(), this.MacroPlan().GlobalParameters_MP().DefaultMaxCapacityPerDayForUnit() );
+    
+    if( this.Unit().Name().FindString( Unit::GetThermalTrial(), 0 ) >= 0 ){
+      value := ifexpr( this.HasUnitCapacity() and this.Unit().Name().FindString( '鍓嶆壒閲忕儹璇�', 0 ) >= 0 and this.UnitCapacity().Start() = this.Start(), this.UnitCapacity().MaxCapacity(), this.MacroPlan().GlobalParameters_MP().DefaultMaxCapacityPerDayForUnit() );
+    }
+    this.MaxCapacityPerTimeUnit( value );
+  *]
+}
diff --git a/_Main/BL/Type_UnitPeriodQuantity/_ROOT_Type_UnitPeriodQuantity.qbl b/_Main/BL/Type_UnitPeriodQuantity/_ROOT_Type_UnitPeriodQuantity.qbl
new file mode 100644
index 0000000..c6e12ac
--- /dev/null
+++ b/_Main/BL/Type_UnitPeriodQuantity/_ROOT_Type_UnitPeriodQuantity.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization UnitPeriodQuantity #extension
+{
+}
diff --git a/_Main/BL/Type_UphillRouting/Attribute_EndDate.qbl b/_Main/BL/Type_UphillRouting/Attribute_EndDate.qbl
new file mode 100644
index 0000000..2eb2902
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/Attribute_EndDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndDate
+{
+  #keys: '3[412672.0.1042903765][412672.0.1042903764][412672.0.1042903766]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_UphillRouting/Attribute_Percentage.qbl b/_Main/BL/Type_UphillRouting/Attribute_Percentage.qbl
new file mode 100644
index 0000000..24b7a34
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/Attribute_Percentage.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Percentage
+{
+  #keys: '3[412672.0.1042903775][412672.0.1042903774][412672.0.1042903776]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_UphillRouting/Attribute_StartDate.qbl b/_Main/BL/Type_UphillRouting/Attribute_StartDate.qbl
new file mode 100644
index 0000000..f751b43
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/Attribute_StartDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[412672.0.1042903755][412672.0.1042903754][412672.0.1042903756]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_UphillRouting/Attribute_Type.qbl b/_Main/BL/Type_UphillRouting/Attribute_Type.qbl
new file mode 100644
index 0000000..d2929c0
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/Attribute_Type.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Type
+{
+  #keys: '3[412672.0.1047812165][412672.0.1047812164][412672.0.1047812166]'
+  ValueType: String
+}
diff --git "a/_Main/BL/Type_UphillRouting/StaticMethod_Create\043793.qbl" "b/_Main/BL/Type_UphillRouting/StaticMethod_Create\043793.qbl"
new file mode 100644
index 0000000..33715d1
--- /dev/null
+++ "b/_Main/BL/Type_UphillRouting/StaticMethod_Create\043793.qbl"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  Routing owner,
+  Date startDate,
+  Date endDate,
+  Real percentage
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    UphillRouting::Create( owner,startDate,endDate,percentage,"_浜у搧鐖潯_");
+  *]
+}
diff --git "a/_Main/BL/Type_UphillRouting/StaticMethod_Create\04390.qbl" "b/_Main/BL/Type_UphillRouting/StaticMethod_Create\04390.qbl"
new file mode 100644
index 0000000..ce2b5af
--- /dev/null
+++ "b/_Main/BL/Type_UphillRouting/StaticMethod_Create\04390.qbl"
@@ -0,0 +1,34 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  Routing owner,
+  Date startDate,
+  Date endDate,
+  Real percentage,
+  String suffix
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    
+    verifyData := select( owner,UphillRouting,ur,ur.Type() = suffix and LocalTool::IsOverlap( ur.StartDate(),ur.EndDate(),startDate,endDate ));
+    if( not isnull( verifyData )){
+      error( "璁剧疆鐨凷tart鍜孍nd涓嶅彲涓庡凡鏈夋暟鎹殑鏃堕棿鍖洪棿閲嶅彔銆�" ); 
+    }
+    
+    data := owner.UphillRouting( relnew,StartDate := startDate, EndDate := endDate,Percentage := percentage,Type := suffix );
+    
+    copy_routing := owner.Copy( suffix + startDate.Format( "Y-M2-D2") );
+    
+    copy_routing.Start( startDate );
+    
+    copy_routing.End( endDate );
+    
+    traverse( copy_routing,OperationForPlanningMatrix,op){
+      op.Throughput( op.Throughput() * ( percentage / 100) );
+    }
+    
+    copy_routing.CopyUphillRouting( relset, data );
+  *]
+}
diff --git a/_Main/BL/Type_UphillRouting/StaticMethod_Create.qbl b/_Main/BL/Type_UphillRouting/StaticMethod_Create.qbl
new file mode 100644
index 0000000..91d1b68
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/StaticMethod_Create.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  Unit unit,
+  Date startDate,
+  Date endDate,
+  Real percentage
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-14-2024 (created)
+    traverse( unit,Operation.RoutingForPlanningMatrix,routing , routing.IsEnabled() and LocalTool::IsOverlap( startDate,endDate,routing.Start(),routing.End())){
+      UphillRouting::Create( routing,startDate,endDate,percentage,"_浜х嚎鐖潯_" );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_UphillRouting/_ROOT_Type_UphillRouting.qbl b/_Main/BL/Type_UphillRouting/_ROOT_Type_UphillRouting.qbl
new file mode 100644
index 0000000..5688008
--- /dev/null
+++ b/_Main/BL/Type_UphillRouting/_ROOT_Type_UphillRouting.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type UphillRouting
+{
+  #keys: '5[412672.0.1042903701][412672.0.1042903699][0.0.0][412672.0.1042903700][412672.0.1042903702]'
+  BaseType: Object
+  StructuredName: 'UphillRoutings'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupRestraint.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupRestraint.def
index 77a368c..3fde688 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupRestraint.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupRestraint.def
@@ -16,6 +16,17 @@
         Taborder: 0
       ]
     }
+    Component ButtonLockPeriod
+    {
+      #keys: '[412672.0.1039433722]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'GEAR_LOCK'
+        Label: 'Lock period'
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupRestraint_ButtonLockPeriod_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupRestraint_ButtonLockPeriod_OnClick.def
new file mode 100644
index 0000000..c15f2e5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupRestraint_ButtonLockPeriod_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupRestraint/ButtonLockPeriod
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupRestraint_ButtonLockPeriod_OnClick
+{
+  #keys: '[412672.0.1039465447]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateLockPeriod );
+      dlg.SetLockPeriod();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRouting.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRouting.def
index 0ebdb18..733da60 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRouting.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRouting.def
@@ -5,21 +5,21 @@
   BaseType: 'WebPanel'
   Children:
   [
-    Component ddlRouting
+    Component ddlUnit
     {
       #keys: '[415136.0.756140276]'
       BaseType: 'WebDropDownList'
-      Databinding: 'Routing'
+      Databinding: 'Unit'
       Children:
       [
-        Component DataExtractorRouting
+        Component DataExtractorUnit
         {
           #keys: '[415136.0.756140277]'
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'structured[Routing]'
-            Source: 'dhRoutingSelection'
+            DataType: 'structured[Unit]'
+            Source: 'dhUnitSelection'
             Taborder: 0
             Transformation: 'Elements'
           ]
@@ -28,18 +28,17 @@
       Properties:
       [
         AllowEmpty: true
-        DataBinding: 'dhDialogData.Data'
         DisplayField: 'Name'
         FixedSize: false
-        Label: 'Routing'
+        Label: 'Unit'
         Taborder: 1
       ]
     }
-    Component dhRoutingSelection
+    Component dhUnitSelection
     {
       #keys: '[415136.0.756140424]'
       BaseType: 'WebDataHolder'
-      Databinding: 'structured[Routing]*'
+      Databinding: 'structured[Unit]*'
       Properties:
       [
         MergeStyle: 'Union'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
index 352eda7..0c62b57 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
@@ -12,8 +12,11 @@
     
     data := dhDialogData.Data();
     
-    newroutings := Routing::ThermalTrialRatio( data, [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
-    
+    newroutings := Routing::ThermalTrialRatio( data, ddlUnit.Data(), [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+    info( '------------web---------------' );
+    traverse( newroutings, Elements, e ){
+      info( e.Key(), e.Name() );
+    }
     ApplicationMacroPlanner.SelectListObjects( dhForm.Data().ListRoutings(), newroutings );
     
     this.Close();
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_SetDefaultValue.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_SetDefaultValue.def
index 331efba..3930cf2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_SetDefaultValue.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_SetDefaultValue.def
@@ -7,8 +7,8 @@
   [*
     // Set default + init dialog
     
-    routings := selectset( MacroPlan, Routing, routing , true );
+    units := selectset( MacroPlan, Unit, unit , unit.HasCapacityTypeQuantity() and unit.Name().FindString( Unit::GetThermalTrial(), 0 ) >= 0 );
     
-    dhRoutingSelection.Data( routings.Copy() );
+    dhUnitSelection.Data( units.Copy() );
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
index 94cd36f..20dc8c9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
@@ -7,7 +7,7 @@
   GroupServerCalls: true
   Precondition:
   [*
-    return Routing::ValidateThermalTrialRatio( feedback, ddlRouting.Data(), [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+    return Routing::ValidateThermalTrialRatio( feedback, ddlUnit.Data(), [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
   *]
   QuillAction
   {
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlActions.def
new file mode 100644
index 0000000..63e070b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[412672.0.1042452873]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[412672.0.1042452877]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[412672.0.1042452879]'
+      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_DialogCreateEditUphillRouting/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlContent.def
new file mode 100644
index 0000000..b421616
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Component_pnlContent.def
@@ -0,0 +1,76 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412672.0.1042452871]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlUnit
+    {
+      #keys: '[412672.0.1040101442]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Unit'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[412672.0.1040101444]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Unit]'
+            Source: 'ApplicationMacroPlanner.DataHolderUnit'
+            Taborder: 0
+            Transformation: 'Elements.astype(Unit)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '浜х嚎'
+        Taborder: 0
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.0.1040102174]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'dhDialogData.Data.StartDate'
+        Label: '寮�濮嬫椂闂�'
+        Taborder: 1
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.0.1040102187]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'dhDialogData.Data.EndDate'
+        Label: '缁撴潫鏃堕棿'
+        Taborder: 2
+      ]
+    }
+    Component npPercentage
+    {
+      #keys: '[412672.0.1040102201]'
+      BaseType: 'WebNumberPicker'
+      Properties:
+      [
+        DataBinding: 'dhDialogData.Data.Percentage'
+        Label: 'Percentage'
+        Max: '100'
+        Min: '0'
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create\043680.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create\043680.def"
new file mode 100644
index 0000000..9bbedc8
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create\043680.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method Create (
+  Routing routing
+) id:Method_DialogCreateEditUphillRouting_Create_680
+{
+  #keys: '[412672.0.1040101362]'
+  Body:
+  [*
+    ddlUnit.Visible( false );
+    
+    ddlUnit.Enabled( false,"" );
+    
+    dhRouting.Data( routing );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create.def
new file mode 100644
index 0000000..2407a27
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Create.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Method Create () id:Method_DialogCreateEditUphillRouting_Create
+{
+  #keys: '[412672.0.1040101310]'
+  Body:
+  [*
+    this.Title( ddlUnit.Label() + this.Title().SubString( 2,6) );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Edit.def
new file mode 100644
index 0000000..470aca2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_Edit.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  UphillRouting uphillRouting
+) id:Method_DialogCreateEditUphillRouting_Edit
+{
+  #keys: '[412672.0.1040130863]'
+  Body:
+  [*
+    dhDialogData.Data( uphillRouting );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_OnOK.def
new file mode 100644
index 0000000..c276ae9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Method_OnOK.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK () id:Method_DialogCreateEditUphillRouting_OnOK
+{
+  #keys: '[412672.0.1040102043]'
+  Body:
+  [*
+    if( isnull( dhDialogData.Data( ) )){
+      if( ddlUnit.Visible() ){
+        UphillRouting::Create( ddlUnit.Data(), dsStartDate.Date(),dsEndDate.Date(),npPercentage.Number() );
+      }else{
+        UphillRouting::Create( dhRouting.Data(), dsStartDate.Date(),dsEndDate.Date(),npPercentage.Number());
+      } 
+    }else{
+      
+    }
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..dceb8b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[412672.0.1042452883]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..2efb364
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[412672.0.1042452882]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  Precondition:
+  [*
+    return dsStartDate.Date() < dsEndDate.Date();
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      Form.OnOK();
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsEndDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsEndDate_OnCreated.def
new file mode 100644
index 0000000..a3fc5b6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsEndDate_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/dsEndDate
+Response OnCreated () id:Response_pnlContent_dsEndDate_OnCreated
+{
+  #keys: '[412672.0.1049113591]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( isnull( dhDialogData.Data())){
+        this.Date( Date::Today() ); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsStartDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsStartDate_OnCreated.def
new file mode 100644
index 0000000..4cf5147
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_dsStartDate_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/dsStartDate
+Response OnCreated () id:Response_pnlContent_dsStartDate_OnCreated
+{
+  #keys: '[412672.0.1048071931]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( isnull( dhDialogData.Data())){
+        this.Date( Date::Today() ); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_npPercentage_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_npPercentage_OnCreated.def
new file mode 100644
index 0000000..d36b2e9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/Response_pnlContent_npPercentage_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pnlContent/npPercentage
+Response OnCreated () id:Response_pnlContent_npPercentage_OnCreated
+{
+  #keys: '[412672.0.1048031223]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( isnull( dhDialogData.Data() )){
+        this.Number( 100 ); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/_ROOT_Component_DialogCreateEditUphillRouting.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/_ROOT_Component_DialogCreateEditUphillRouting.def
new file mode 100644
index 0000000..bbba53c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRouting/_ROOT_Component_DialogCreateEditUphillRouting.def
@@ -0,0 +1,43 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditUphillRouting
+{
+  #keys: '[412672.0.1042452869]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component dhDialogData
+    {
+      #keys: '[412672.0.1040101484]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'UphillRouting'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhRouting
+    {
+      #keys: '[412672.0.1040101841]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Routing'
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Image: 'ESCALATOR_UP'
+    Padding: 'false'
+    Title: '浜у搧鐖潯宸ヨ壓璺嚎'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_ListUphillRouting\043943.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_ListUphillRouting\043943.def"
new file mode 100644
index 0000000..f203f9c
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_ListUphillRouting\043943.def"
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+Component ListUphillRouting id:ListUphillRouting_943
+{
+  #keys: '[412672.0.1040121798]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorUphillRouting
+    {
+      #keys: '[412672.0.1040121799]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'Routing'
+        FixedFilter: 'object.Type() = "_浜у搧鐖潯_"'
+        Source: 'dhRouting'
+        Taborder: 0
+        Transformation: 'UphillRouting'
+      ]
+    }
+    #child: listActionBarPageUphillRouting_1
+    Component DataSetLevelUphillRouting
+    {
+      #keys: '[412672.0.1040121801]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuUphillRouting_1
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End date","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Percentage","title":"Percentage","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Percentage"}}]'
+        ContextMenu: 'listContextMenuUphillRouting'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListUphillRouting_943_WebMenu_OnClick
+    {
+      #keys: '[412672.0.1042455296]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[2003.0.34277352]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listActionBarPageUphillRouting\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listActionBarPageUphillRouting\0431.def"
new file mode 100644
index 0000000..414c506
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listActionBarPageUphillRouting\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageUphillRouting id:listActionBarPageUphillRouting_1
+{
+  #keys: '[412672.0.1040121800]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listContextMenuUphillRouting\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listContextMenuUphillRouting\0431.def"
new file mode 100644
index 0000000..6a185d5
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_listContextMenuUphillRouting\0431.def"
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component listContextMenuUphillRouting id:listContextMenuUphillRouting_1
+{
+  #keys: '[412672.0.1040121802]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuCreate
+    {
+      #keys: '[412672.0.1043375746]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 3
+        Title: 'Create...'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_pnlContent.def
new file mode 100644
index 0000000..d1a86d4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Component_pnlContent.def
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412672.0.1043138046]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListUphillRouting_943
+    Component dhRouting
+    {
+      #keys: '[412672.0.1040132827]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Routing'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Method_CreateEditUphillRoutings.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Method_CreateEditUphillRoutings.def
new file mode 100644
index 0000000..3e45751
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Method_CreateEditUphillRoutings.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+Method CreateEditUphillRoutings (
+  Routing owner
+) id:Method_DialogCreateEditUphillRoutings_CreateEditUphillRoutings
+{
+  #keys: '[412672.0.1040132851]'
+  Body:
+  [*
+    dhRouting.Data( owner );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Response_ListUphillRouting_943_MenuCreate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Response_ListUphillRouting_943_MenuCreate_OnClick.def
new file mode 100644
index 0000000..d4902bf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/Response_ListUphillRouting_943_MenuCreate_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListUphillRouting_943
+Response OnClick () id:Response_ListUphillRouting_943_MenuCreate_OnClick
+{
+  #keys: '[412672.0.1040123392]'
+  CanBindMultiple: false
+  DefinitionID => /ListUphillRouting_943/Responsedef_ListUphillRouting_943_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuCreate'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditUphillRouting );
+      
+      dlg.Create( dhRouting.Data( ));
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/_ROOT_Component_DialogCreateEditUphillRoutings.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/_ROOT_Component_DialogCreateEditUphillRoutings.def
new file mode 100644
index 0000000..362a310
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditUphillRoutings/_ROOT_Component_DialogCreateEditUphillRoutings.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditUphillRoutings
+{
+  #keys: '[412672.0.1043138044]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    ExcludeFromActiveComponent: true
+    Image: 'ESCALATOR_UP'
+    MinimumColumns: 60
+    MinimumRows: 40
+    Padding: 'false'
+    Title: '浜у搧鐖潯宸ヨ壓璺嚎'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlActions.def
new file mode 100644
index 0000000..e45d1f7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[412672.0.1039310286]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[412672.0.1039310290]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[412672.0.1039310292]'
+      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_DialogCreateLockPeriod/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlContent.def
new file mode 100644
index 0000000..33c5be9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Component_pnlContent.def
@@ -0,0 +1,52 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412672.0.1039310284]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlContent
+    {
+      #keys: '[412672.0.1039372244]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ProductInStockingPoint_MP'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[412672.0.1039372246]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'Product_MP.ProductInStockingPoint_MP'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'Name'
+        Label: '浜у搧'
+        Taborder: 0
+      ]
+    }
+    Component dsContent
+    {
+      #keys: '[412672.0.1039341942]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'ddlContent.Data.LockPeriod.LockDate'
+        Label: '閿佸畾鏈熻嚦锛�'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Method_SetLockPeriod.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Method_SetLockPeriod.def
new file mode 100644
index 0000000..48fab63
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Method_SetLockPeriod.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetLockPeriod () id:Method_DialogCreateLockPeriod_SetLockPeriod
+{
+  #keys: '[412672.0.1039433775]'
+  Body:
+  [*
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..4d5cb33
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[412672.0.1039310296]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..6cc46ec
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[412672.0.1039310295]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      LockPeriod::Create( ddlContent.Data(),dsContent.Date() );
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/_ROOT_Component_DialogCreateLockPeriod.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/_ROOT_Component_DialogCreateLockPeriod.def
new file mode 100644
index 0000000..ddaf02c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateLockPeriod/_ROOT_Component_DialogCreateLockPeriod.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateLockPeriod
+{
+  #keys: '[412672.0.1039310282]'
+  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_FormRoutings/Component_ListRoutings.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_ListRoutings.def
index 87a19d7..cd10dd9 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_ListRoutings.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_ListRoutings.def
@@ -11,4 +11,8 @@
       ]
     }
   ]
+  Properties:
+  [
+    Taborder: 1
+  ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_PanelButtons.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_PanelButtons.def
new file mode 100644
index 0000000..349fb2b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_PanelButtons.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelButtons
+{
+  #keys: '[412672.0.1049243119]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonSetUnitUphillRouting
+    {
+      #keys: '[412672.0.1048002676]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ESCALATOR_UP'
+        Label: '璁剧疆浜х嚎鐖潯宸ヨ壓璺嚎'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_listContextMenuRoutings.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_listContextMenuRoutings.def
index 1eb358f..edcc552 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_listContextMenuRoutings.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Component_listContextMenuRoutings.def
@@ -24,5 +24,16 @@
         Title: 'Thermal trial ratio'
       ]
     }
+    Component MenuSetUphillRouting
+    {
+      #keys: '[412672.0.1040131623]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'ESCALATOR_UP'
+        Taborder: 13
+        Title: '璁剧疆浜у搧鐖潯宸ヨ壓璺嚎'
+      ]
+    }
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_MenuSetUphillRouting_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_MenuSetUphillRouting_OnClick.def
new file mode 100644
index 0000000..83f6154
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_MenuSetUphillRouting_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListRoutings
+Response OnClick (
+  Routing selection
+) id:Response_ListRoutings_MenuSetUphillRouting_OnClick
+{
+  #keys: '[412672.0.1040131705]'
+  CanBindMultiple: false
+  DefinitionID => /ListRoutings/Responsedef_ListRoutings_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'MenuSetUphillRouting'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditUphillRoutings );
+      
+      dlg.CreateEditUphillRoutings( selection );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def
new file mode 100644
index 0000000..48c0ca9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_ListRoutings_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListRoutings
+Response OnClick () id:Response_ListRoutings_MenuSetUnitUphillRouting_OnClick
+{
+  #keys: '[412672.0.1040131205]'
+  CanBindMultiple: false
+  DefinitionID => /ListRoutings/Responsedef_ListRoutings_WebMenu_OnClick
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditUphillRouting );
+      
+      dlg.Create( );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_PanelButtons_ButtonSetUnitUphillRouting_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_PanelButtons_ButtonSetUnitUphillRouting_OnClick.def
new file mode 100644
index 0000000..2de2a66
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/Response_MacroPlanner_PanelButtons_ButtonSetUnitUphillRouting_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelButtons/ButtonSetUnitUphillRouting
+Response OnClick () id:Response_MacroPlanner_PanelButtons_ButtonSetUnitUphillRouting_OnClick
+{
+  #keys: '[412672.0.1049304924]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditUphillRouting );
+      
+      dlg.Create( );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/_ROOT_Component_FormRoutings.def b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/_ROOT_Component_FormRoutings.def
index 226312e..2d4b4d7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/_ROOT_Component_FormRoutings.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormRoutings/_ROOT_Component_FormRoutings.def
@@ -6,5 +6,34 @@
   Children:
   [
     #child: ListRoutings
+    #child: PanelButtons
+    Component DataHolderFilteredRoutings #extension
+    {
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component DataHolderRoutingsFromNavigationSelection #extension
+    {
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component DataHolderRoutingsFromProducts #extension
+    {
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+    Component DataHolderRoutingsFromUnits #extension
+    {
+      Properties:
+      [
+        Taborder: 5
+      ]
+    }
   ]
 }

--
Gitblit v1.9.3