From 1d8b8f8f291ad75cbe60fc3652c7954e60244136 Mon Sep 17 00:00:00 2001
From: rislai <risheng.lai@capgemini.com>
Date: 星期五, 14 六月 2024 09:47:01 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationFixedPageActionBarPageDef.def                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listActionBarPageEntities#1.def                                |   10 
 _Main/BL/InfoMessages.qbl                                                                                                             |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902#1.def                                       |   35 +++
 _Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl                                                                      |   25 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_MenuSelectAll_OnClick.def                            |   17 +
 _Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl                                                                                |    6 
 _Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl                                                                           |    8 
 _Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl                                                                              |   53 ++++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def                                  |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def                                               |   15 -
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abpAlgorithmPostProcessing.def                                |   15 +
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def                                    |   16 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                             |    1 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def                                                 |  123 +++++++++++
 _Main/BL/Type_Routing/_ROOT_Type_Routing.qbl                                                                                          |    6 
 _Main/BL/Type_Entity/_ROOT_Type_Entity.qbl                                                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def                                                 |   15 +
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_OnDrawElement.def                                    |   18 +
 _Main/BL/Type_Entity/Attribute_IsToFill.qbl                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def                               |   24 ++
 _Main/BL/Type_Operation/_ROOT_Type_Operation.qbl                                                                                      |    6 
 _Main/BL/Type_Operation/Method_Copy.qbl                                                                                               |   95 ++++++++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgWholeShiftSystem#633.def                                   |   25 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def                                |   15 +
 _Main/BL/Type_Entity/Method_IsUnit.qbl                                                                                                |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def                                                 |   40 +++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def |   18 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def                                        |    1 
 31 files changed, 606 insertions(+), 16 deletions(-)

diff --git a/_Main/BL/InfoMessages.qbl b/_Main/BL/InfoMessages.qbl
index e9d598e..ee5f15b 100644
--- a/_Main/BL/InfoMessages.qbl
+++ b/_Main/BL/InfoMessages.qbl
@@ -106,4 +106,8 @@
   {
     DefaultText: 'The Event type of binding Event exists.'
   }
+  InfoMessage MP_Routing_RequiredField
+  {
+    DefaultText: 'All fields Required This parameter is mandatory.'
+  }
 }
diff --git a/_Main/BL/Type_Entity/Attribute_IsToFill.qbl b/_Main/BL/Type_Entity/Attribute_IsToFill.qbl
new file mode 100644
index 0000000..f28e93b
--- /dev/null
+++ b/_Main/BL/Type_Entity/Attribute_IsToFill.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsToFill
+{
+  #keys: '3[414702.2.1844249287][414702.2.1844249286][414702.2.1844249288]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Entity/Method_IsUnit.qbl b/_Main/BL/Type_Entity/Method_IsUnit.qbl
new file mode 100644
index 0000000..2fbf7aa
--- /dev/null
+++ b/_Main/BL/Type_Entity/Method_IsUnit.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+Method IsUnit () declarative remote as Boolean
+{
+  TextBody: 'return guard( this.istype( Unit ), false );'
+}
diff --git a/_Main/BL/Type_Entity/_ROOT_Type_Entity.qbl b/_Main/BL/Type_Entity/_ROOT_Type_Entity.qbl
new file mode 100644
index 0000000..b253c15
--- /dev/null
+++ b/_Main/BL/Type_Entity/_ROOT_Type_Entity.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Entity #extension
+{
+}
diff --git a/_Main/BL/Type_Operation/Method_Copy.qbl b/_Main/BL/Type_Operation/Method_Copy.qbl
new file mode 100644
index 0000000..738acfd
--- /dev/null
+++ b/_Main/BL/Type_Operation/Method_Copy.qbl
@@ -0,0 +1,95 @@
+Quintiq file version 2.0
+#parent: #root
+Method Copy (
+  RoutingStep newroutingstep,
+  StockingPoint_MP stockingpoint,
+  String id,
+  Unit unit
+) as Operation
+{
+  Description: 'Duplicate the entire operation (including input product groups + input output products + costs)'
+  TextBody:
+  [*
+    idholder := this.MacroPlan().IDHolder();
+    //unit := this.Unit();
+    
+    // Create new Operation with information of this Operation
+    newoperation := Operation::Create( id,
+                                       unit,
+                                       id,
+                                       newroutingstep,
+                                       this.LeadTime(),
+                                       this.StandardDeviationLeadTime(),
+                                       this.Throughput(),
+                                       this.HasUserLotSize(),
+                                       this.UserMinimumQuantity(),
+                                       this.HasUserMaximumQuantity(),
+                                       this.UserMaximumQuantity(),
+                                       this.UserLotSize(),
+                                       this.CO2Emission(),
+                                       false,
+                                       false );
+    
+    // Copy OperationCosts of this Operation to the new Operation
+    traverse( this, OperationCost, operationcost )
+    {
+      // Select UnitAccount
+      accountassignment := select( unit, UnitAccount, ua,
+                                   ua.Account_MP() = operationcost.AccountAssignment().Account_MP()
+                                   and ua.CostDriver() = operationcost.AccountAssignment().CostDriver() );
+    
+      // Create OperationCost for the new Operation if UnitAccount is found
+      if( not isnull( accountassignment ) )
+      {
+        OperationCost::Create( idholder.GetOperationCostID(),
+                               newoperation,
+                               accountassignment.Account_MP(),
+                               accountassignment.CostDriver(),
+                               operationcost.Start(),
+                               operationcost.TimeUnit(),
+                               operationcost.LengthOfTime(),
+                               operationcost.Cost(),
+                               false );
+      }
+    }
+    
+    // Copy OperationBOM from this Operation to the new Operation
+    traverse( this, OperationBOM, ob, not ob.IsInput() )
+    {
+      pisp := ob.PISPNodeInRouting().ProductInStockingPoint_MP();
+      newpisp := pisp.Product_MP().AddToStockingPoint( stockingpoint );
+    //  info( 'last----', ob.IsInput(), ',', ob.OperationID(), ',', ob.ProductID(), ',', ob.StockingPointID(), ',', pisp.ProductID(), ',', pisp.StockingPointID() );
+      OperationBOM::Create( newoperation, newpisp,
+                            not ob.IsInput(),
+                            ob.InputGroupID(),
+                            ob.HasUserInputQuantity(),
+                            ob.Quantity(),
+                            ob.MinQuantityInGroup(),
+                            ob.MaxQuantityInGroup(),
+                            ob.IsExcluded(),
+                            false );
+    //  output.PISPNodeInRouting().Update( pisp.Product_MP(), stockingpoint );
+    //  info( 'new output----', output.IsInput(), ',', output.OperationID(), ',', output.ProductID(), ',', output.StockingPointID() );
+      OperationBOM::Create( newoperation, ob.PISPNodeInRouting().ProductInStockingPoint_MP(),
+                            ob.IsInput(),
+                            ob.InputGroupID(),
+                            ob.HasUserInputQuantity(),
+                            ob.Quantity(),
+                            ob.MinQuantityInGroup(),
+                            ob.MaxQuantityInGroup(),
+                            ob.IsExcluded(),
+                            false );
+    //  input.UpdateTypeIndex( input.OperationID(), input.ProductID(), ob.OldStockingPointID(), false );
+    //  info( 'new input----', input.IsInput(), ',', input.OperationID(), ',', input.ProductID(), ',', input.StockingPointID() );
+    }
+    
+    // Copy OpearationInputGroup of this Operation to the new Operation
+    traverse( this, OperationInputGroup, inputgroup )
+    {
+      inputgroup.Copy( newoperation );
+    }
+    
+    
+    return newoperation;
+  *]
+}
diff --git a/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl b/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl
new file mode 100644
index 0000000..5bb7d3e
--- /dev/null
+++ b/_Main/BL/Type_Operation/_ROOT_Type_Operation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization Operation #extension
+{
+}
diff --git a/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl b/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl
new file mode 100644
index 0000000..68365b3
--- /dev/null
+++ b/_Main/BL/Type_OperationBOM/Attribute_OldStockingPointID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute OldStockingPointID
+{
+  #keys: '3[415136.0.782845096][415136.0.782845095][415136.0.782845097]'
+  Description: '娣诲姞鐑紡涔嬪墠鐨勫簱瀛樼偣'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl b/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl
new file mode 100644
index 0000000..76fbb55
--- /dev/null
+++ b/_Main/BL/Type_OperationBOM/_ROOT_Type_OperationBOM.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization OperationBOM #extension
+{
+}
diff --git a/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
new file mode 100644
index 0000000..54256b2
--- /dev/null
+++ b/_Main/BL/Type_Routing/StaticMethod_ThermalTrialRatio.qbl
@@ -0,0 +1,53 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ThermalTrialRatio (
+  Routing routing,
+  Number capacity,
+  Date start,
+  Date end,
+  Number ratio
+) as owning Routings
+{
+  Description: 'Check input is valid'
+  TextBody:
+  [*
+    // Adhi Feb-10-2016 (created)
+    thermaltrial := '鐑紡';
+    newroutings := construct( Routings );
+    unit := selectobject( routing.MacroPlan(), Unit, unit, unit.ID() = thermaltrial and unit.HasCapacityTypeQuantity() );
+    newrouting := routing.Copy();
+    routingstep := newrouting.LastStep();
+    //info( '------------------', routingstep.Tool(), ',', unit.ID() );
+    newroutingstep := RoutingStep::Create( newrouting, thermaltrial, routingstep.Tool(), false );
+    
+    traverse( routingstep, Operation, operation ){
+      id := Operation::GetConcatenatedID( newrouting.ID(), newroutingstep.Name(), unit.ID() );
+    //  info( '------------------', operation.Name(), routingstep.Name(), newroutingstep.Name() );
+      stockingpoint := StockingPoint_MP::FindCreateUpdate( routing.MacroPlan(), thermaltrial, unit, newrouting, true );
+      
+      traverse( operation, OperationBOM, obom, not obom.IsInput() ){
+        pisp := obom.PISPNodeInRouting().ProductInStockingPoint_MP();
+    //    info( 'before----', ',', obom.StockingPointID(), pisp.StockingPointID(), pisp.ProductID() );
+        obom.OldStockingPointID( obom.StockingPointID() );
+        newpisp := pisp.Product_MP().AddToStockingPoint( stockingpoint );
+    //    obom.PISPNodeInRouting().ProductInStockingPoint_MP( relset, newpisp );
+        obom.PISPNodeInRouting().Update( newpisp.Product_MP(), newpisp.StockingPoint_MP() );
+    //    afterpisp := obom.PISPNodeInRouting().ProductInStockingPoint_MP();
+        obom.UpdateTypeIndex( obom.OperationID(), obom.ProductID(), stockingpoint.ID(), obom.IsInput() );
+    //    info( 'after----', obom.StockingPointID(), afterpisp.StockingPointID(), afterpisp.ProductID() );
+      }
+    //  info( '------------------------------', operation.SourceOperationLink( relsize ) );
+      
+      operation.Copy( newroutingstep, stockingpoint, id, unit );
+    }
+    
+    traverse( newrouting, RoutingStep.Operation.SourceOperationLink, ol )
+    {
+      ol.SynchronizeAll( false );
+    }
+    
+    newroutings.Add( routing );
+    
+    return &newroutings;
+  *]
+}
diff --git a/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
new file mode 100644
index 0000000..ad8089d
--- /dev/null
+++ b/_Main/BL/Type_Routing/StaticMethod_ValidateThermalTrialRatio.qbl
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ValidateThermalTrialRatio (
+  output String feedback_o,
+  Routing routing,
+  Number capacity,
+  Date start,
+  Date end,
+  Number ratio
+) declarative remote as Boolean
+{
+  Description: 'Check input is valid'
+  TextBody:
+  [*
+    // Adhi Feb-10-2016 (created)
+    feedback_o := '';
+    
+    if( isnull( routing ) or capacity < 1 or start = Date::MinDate() or end = Date::MinDate() or ratio < 1 ){
+      feedback_o := Translations::MP_Routing_RequiredField();
+    }
+    
+    
+    return feedback_o = '';
+  *]
+}
diff --git a/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl b/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl
new file mode 100644
index 0000000..9aa44b8
--- /dev/null
+++ b/_Main/BL/Type_Routing/_ROOT_Type_Routing.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type Routing #extension
+{
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
index e918310..534bb0b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
@@ -3,6 +3,6 @@
 {
   Properties:
   [
-    Taborder: 20
+    Taborder: 21
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgWholeShiftSystem\043633.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgWholeShiftSystem\043633.def"
new file mode 100644
index 0000000..9197de0
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abgWholeShiftSystem\043633.def"
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component abgWholeShiftSystem
+{
+  #keys: '[414702.2.1844443226]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component bWholeShiftSystem
+    {
+      #keys: '[414702.2.1843140838]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'WIND_ENGINE'
+        Label: 'Whole shift system'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Category: 'Actions-1'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abpAlgorithmPostProcessing.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abpAlgorithmPostProcessing.def
new file mode 100644
index 0000000..b737917
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_abpAlgorithmPostProcessing.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component abpAlgorithmPostProcessing
+{
+  #keys: '[414702.2.1844443225]'
+  BaseType: 'WebActionBarPage'
+  Children:
+  [
+    #child: abgWholeShiftSystem
+  ]
+  Properties:
+  [
+    Taborder: 20
+    Title: 'Algorithm Post-processing'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationFixedPageActionBarPageDef.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationFixedPageActionBarPageDef.def
index 7c832f3..85ceb93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationFixedPageActionBarPageDef.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationFixedPageActionBarPageDef.def
@@ -3,6 +3,6 @@
 {
   Properties:
   [
-    Taborder: 21
+    Taborder: 22
   ]
 }
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
new file mode 100644
index 0000000..520564f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: abgWholeShiftSystem/bWholeShiftSystem
+Response OnClick () id:Response_MacroPlanner_abgWholeShiftSystem_bWholeShiftSystem_OnClick
+{
+  #keys: '[414702.2.1843141002]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogWholeShiftSystem );
+      
+      ApplicationMacroPlanner.ShowFormModal( dlg );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index db6cb34..576fb69 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -17,6 +17,7 @@
         #child: ActionBarPageScenarioSelection
         #child: applicationFixedPageActionBarPageDef
         #child: applicationDevelopmentActionBarPageDef_1
+        #child: abpAlgorithmPostProcessing
       ]
     }
     Component dhBinaryDataPR id:dhBinaryDataPR_688
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
index 041a710..c4daa9b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlMaxCapacity.def
@@ -12,6 +12,7 @@
       Properties:
       [
         Label: 'Maximum thermal trial capacity'
+        Mask: 'NUMBER'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
index dbad8e2..f236d2a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Component_pnlRatio.def
@@ -22,6 +22,7 @@
       Properties:
       [
         Label: '1:'
+        Mask: 'NUMBER'
         Taborder: 1
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
index 013d36c..352eda7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Method_OnOK.def
@@ -12,18 +12,9 @@
     
     data := dhDialogData.Data();
     
-    //if( isnull( data.WrappedInstance() ) ) // New
-    //{
-    //  // When create product, parent relation must be null (as server method has logic to detect parent change using this relation)
-    //  data.Parent( relflush );
-    //  data.Commit();
-    //  dhForm.Data().ListEventType().SelectByKey( data.WrappedInstance().Key() );
-    //}
-    //else
-    //{
-    //  LibCal_EventType::Update( dhDialogData.Data().WrappedInstance(), efID.Text(), efName.Text()
-    //                            ,guard( selParent.Data(), null(  LibCal_EventType ) ) );
-    //}
+    newroutings := Routing::ThermalTrialRatio( data, [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+    
+    ApplicationMacroPlanner.SelectListObjects( dhForm.Data().ListRoutings(), newroutings );
     
     this.Close();
   *]
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 8fd0a6d..94cd36f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditThermalTrialRatio/Response_pnlActions_btnOk_OnClick.def
@@ -5,12 +5,15 @@
   #keys: '[415136.0.756140039]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
+  Precondition:
+  [*
+    return Routing::ValidateThermalTrialRatio( feedback, ddlRouting.Data(), [Number]efMaxCapacity.Text(), dsStartTime.Date(), dsEndTime.Date(), [Number]efThermalTrialRatio.Text() );
+  *]
   QuillAction
   {
     Body:
     [*
-      Form.ApplyChanges();
-      Form.Close();
+      Form.OnOK();
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
new file mode 100644
index 0000000..650c732
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_ListEntity.def
@@ -0,0 +1,123 @@
+Quintiq file version 2.0
+Component ListEntity
+{
+  #keys: '[414702.2.1845329611]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorEntity
+    {
+      #keys: '[414702.2.1845329612]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'RootEntity'
+      ]
+    }
+    Component DataSetLevelRootEntity
+    {
+      #keys: '[414702.2.1845329613]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenu902_1
+        Component DataSetLevelChildEntity
+        {
+          #keys: '[414702.2.1845329623]'
+          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"}}]'
+            ContextMenu: 'listContextMenu902'
+            FixedFilter: 'not object.GetIsSystem() and object.IsUnit();'
+            RelationFromParent: 'ChildEntity'
+            RelationRepeating: 'ChildEntity'
+            SortCriteria: 'DisplayIndex'
+            Taborder: 0
+          ]
+        }
+      ]
+      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"}}]'
+        ContextMenu: 'listContextMenu902'
+        RelationFromParent: 'ChildEntity'
+        SortCriteria: 'DisplayIndex'
+        Taborder: 1
+      ]
+    }
+    #child: listActionBarPageEntities_1
+  ]
+  Properties:
+  [
+    DefaultExpandLevels: 100
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListEntity_WebMenu_OnClick
+    {
+      #keys: '[414702.2.1845329586]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[293.0.3027433]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+    DelegatedResponseDefinition OnClick id:Responsedef_ListEntity_WebButton_OnClick
+    {
+      #keys: '[414702.2.1845329585]'
+      Initiator: 'WebButton'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[6763.0.8029304]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+    DelegatedResponseDefinition OnClick id:Responsedef_ListEntity_WebMenu_OnClick_360
+    {
+      #keys: '[414702.2.1845329584]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument checked
+        {
+          #keys: '[6763.0.8029349]'
+          Binding: 'this.Checked()'
+        }
+      ]
+    }
+    DelegatedResponseDefinition OnClick id:Responsedef_ListEntity_WebButton_OnClick_613
+    {
+      #keys: '[414702.2.1845329583]'
+      Initiator: 'WebButton'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument checked
+        {
+          #keys: '[6763.0.8029394]'
+          Binding: 'this.Checked()'
+        }
+      ]
+    }
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listActionBarPageEntities\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listActionBarPageEntities\0431.def"
new file mode 100644
index 0000000..a836ae6
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listActionBarPageEntities\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageEntities id:listActionBarPageEntities_1
+{
+  #keys: '[414702.2.1845329624]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 2
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
new file mode 100644
index 0000000..7874133
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_listContextMenu902\0431.def"
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component listContextMenu902 id:listContextMenu902_1
+{
+  #keys: '[414702.2.1845329614]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component MenuSelectAll
+    {
+      #keys: '[414702.2.1845329622]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SELECTION_VIEW'
+        Shortcut: 'Ctrl+A'
+        Taborder: 2
+        Title: 'Select all'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
new file mode 100644
index 0000000..42d8211
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[414702.2.1844994358]'
+  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
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    Border: true
+    ExcludeFromActiveComponent: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Padding: 'true'
+    Style: 'footer'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def
new file mode 100644
index 0000000..0216bca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Component_pnlContent.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[414702.2.1844994356]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListEntity
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_MenuSelectAll_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_MenuSelectAll_OnClick.def
new file mode 100644
index 0000000..e1b2def
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_MenuSelectAll_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnClick () id:Response_ListEntity_MenuSelectAll_OnClick
+{
+  #keys: '[414702.2.1845206151]'
+  CanBindMultiple: false
+  DefinitionID => /ListEntity/Responsedef_ListEntity_WebMenu_OnClick
+  Initiator: 'MenuSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_OnDrawElement.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_OnDrawElement.def
new file mode 100644
index 0000000..3b3abe2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_ListEntity_OnDrawElement.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListEntity
+Response OnDrawElement (
+  Entity element
+) id:Response_ListEntity_OnDrawElement
+{
+  #keys: '[414702.2.1845463150]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnDrawElement'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      drawinfo.Image( 0, element.GetIconName() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..ac96ffa
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnCancel_OnClick.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnCancel
+Response OnClick () id:Response_pnlActions_btnCancel_OnClick
+{
+  #keys: '[414702.2.1844994368]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..f6a3c38
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/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: '[414702.2.1844994367]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.ApplyChanges();
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
new file mode 100644
index 0000000..e89d0ad
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogWholeShiftSystem/_ROOT_Component_DialogWholeShiftSystem.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogWholeShiftSystem
+{
+  #keys: '[414702.2.1844994354]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    MinimumColumns: 100
+    MinimumRows: 100
+    Padding: 'false'
+    Title: 'WholeShiftSystem'
+  ]
+}

--
Gitblit v1.9.3