From d05336a8c9f4aefa7f8230093700f508b2bc95cf Mon Sep 17 00:00:00 2001
From: rislai <risheng.lai@capgemini.com>
Date: 星期一, 10 六月 2024 23:27:59 +0800
Subject: [PATCH] 添加批量设置shift pattern功能

---
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def                                           |   25 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/_ROOT_Component_DialogCreateEditProductionLineBatchData.def |   31 +
 _Main/BL/Type_ProductionLineBatchData/Attribute_IsEnable.qbl                                                                              |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDelete_OnClick.def               |   21 +
 _Main/BL/Relations/Relation_ProductionLineBatchData_Unit2_Unit_ProductionLineBatchData2.qbl                                               |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEdit_OnClick.def                 |   20 +
 _Main/BL/Type_ProductionLineBatchData/Method_OnOK.qbl                                                                                     |   88 ++++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_CreateEdit.def                                       |   18 
 _Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern2_ShiftPattern_ProductionLineBa.qbl                                       |   23 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlContent.def                                    |  148 +++++++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEnable_OnClick.def               |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_ListProductionLineBatchData.def                               |   59 ++
 _Main/BL/Relations/Relation_ProductionLineBatchData_MacroPlan_MacroPlan_ProductionLineBatchData.qbl                                       |   23 +
 _Main/UI/MacroPlannerWebApp/Views/Time_Capacities.vw                                                                                      |   70 +++
 _Main/BL/Type_ProductionLineBatchData/DefaultValue_IsEnable.qbl                                                                           |    7 
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                                  |   13 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                                 |    1 
 _Main/BL/Type_ProductionLineBatchData/Method_Update.qbl                                                                                   |   40 ++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_PanelProductionLineBatchData.def                              |   14 
 _Main/BL/Type_ProductionLineBatchData/_ROOT_Type_ProductionLineBatchData.qbl                                                              |    9 
 _Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern1_ShiftPattern_ProductionLineBa.qbl                                       |   23 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef#1.def                      |    8 
 _Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl                                                                                   |   68 +++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listContextMenuProductionLineBatchData.def                    |   78 +++
 _Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl                                                                             |   26 +
 _Main/BL/Relations/Relation_ProductionLineBatchData_Unit1_Unit_ProductionLineBatchData1.qbl                                               |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/_ROOT_Component_FormProductionLineBatchData.def                         |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Edit.def                                             |   15 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnOk_OnClick.def                       |   37 +
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnCreate_OnClick.def               |   18 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Create.def                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def            |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listActionBarPageProductionLineBatchData.def                  |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDisable_OnClick.def              |   26 +
 _Main/BL/Type_ProductionLineBatchData/Method_Disable.qbl                                                                                  |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnCancel_OnClick.def                   |   15 
 _Main/BL/Type_ProductionLineBatchData/Attribute_EndDate.qbl                                                                               |    7 
 _Main/BL/Type_ProductionLineBatchData/StaticMethod_Create.qbl                                                                             |   40 ++
 _Main/BL/Type_ProductionLineBatchData/Attribute_StartDate.qbl                                                                             |    7 
 _Main/BL/Type_ShiftPattern/_ROOT_Type_ShiftPattern.qbl                                                                                    |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlActions.def                                    |   40 ++
 41 files changed, 1,162 insertions(+), 0 deletions(-)

diff --git a/_Main/BL/Relations/Relation_ProductionLineBatchData_MacroPlan_MacroPlan_ProductionLineBatchData.qbl b/_Main/BL/Relations/Relation_ProductionLineBatchData_MacroPlan_MacroPlan_ProductionLineBatchData.qbl
new file mode 100644
index 0000000..5174b44
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ProductionLineBatchData_MacroPlan_MacroPlan_ProductionLineBatchData.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ProductionLineBatchData_MacroPlan_MacroPlan_ProductionLineBatchData
+{
+  #keys: '1[412672.0.998406961]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[412672.0.998406963][412672.0.998406962][412672.0.998406964]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductionLineBatchData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ProductionLineBatchData
+  {
+    #keys: '3[412672.0.998406966][412672.0.998406965][412672.0.998406967]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern1_ShiftPattern_ProductionLineBa.qbl b/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern1_ShiftPattern_ProductionLineBa.qbl
new file mode 100644
index 0000000..d823b68
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern1_ShiftPattern_ProductionLineBa.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ProductionLineBatchData_ShiftPattern1_ShiftPattern_ProductionLineBatchData1
+{
+  #keys: '1[412672.0.998377419]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ShiftPattern1
+  {
+    #keys: '3[412672.0.998377421][412672.0.998377420][412672.0.998377422]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductionLineBatchData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ProductionLineBatchData1
+  {
+    #keys: '3[412672.0.998377424][412672.0.998377423][412672.0.998377425]'
+    Cardinality: '1toN'
+    ObjectDefinition: ShiftPattern
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern2_ShiftPattern_ProductionLineBa.qbl b/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern2_ShiftPattern_ProductionLineBa.qbl
new file mode 100644
index 0000000..5691f4e
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ProductionLineBatchData_ShiftPattern2_ShiftPattern_ProductionLineBa.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ProductionLineBatchData_ShiftPattern2_ShiftPattern_ProductionLineBatchData2
+{
+  #keys: '1[412672.0.998377443]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide ShiftPattern2
+  {
+    #keys: '3[412672.0.998377445][412672.0.998377444][412672.0.998377446]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductionLineBatchData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ProductionLineBatchData2
+  {
+    #keys: '3[412672.0.998377448][412672.0.998377447][412672.0.998377449]'
+    Cardinality: '1toN'
+    ObjectDefinition: ShiftPattern
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit1_Unit_ProductionLineBatchData1.qbl b/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit1_Unit_ProductionLineBatchData1.qbl
new file mode 100644
index 0000000..329bd12
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit1_Unit_ProductionLineBatchData1.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ProductionLineBatchData_Unit1_Unit_ProductionLineBatchData1
+{
+  #keys: '1[412672.0.998377384]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Unit1
+  {
+    #keys: '3[412672.0.998377386][412672.0.998377385][412672.0.998377387]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductionLineBatchData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ProductionLineBatchData1
+  {
+    #keys: '3[412672.0.998377389][412672.0.998377388][412672.0.998377390]'
+    Cardinality: '1toN'
+    ObjectDefinition: Unit
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit2_Unit_ProductionLineBatchData2.qbl b/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit2_Unit_ProductionLineBatchData2.qbl
new file mode 100644
index 0000000..8125946
--- /dev/null
+++ b/_Main/BL/Relations/Relation_ProductionLineBatchData_Unit2_Unit_ProductionLineBatchData2.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation ProductionLineBatchData_Unit2_Unit_ProductionLineBatchData2
+{
+  #keys: '1[412672.0.998377400]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Unit2
+  {
+    #keys: '3[412672.0.998377402][412672.0.998377401][412672.0.998377403]'
+    Cardinality: '0to1'
+    ObjectDefinition: ProductionLineBatchData
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide ProductionLineBatchData2
+  {
+    #keys: '3[412672.0.998377405][412672.0.998377404][412672.0.998377406]'
+    Cardinality: '1toN'
+    ObjectDefinition: Unit
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Attribute_EndDate.qbl b/_Main/BL/Type_ProductionLineBatchData/Attribute_EndDate.qbl
new file mode 100644
index 0000000..84e3048
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Attribute_EndDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute EndDate
+{
+  #keys: '3[412672.0.998407025][412672.0.998407024][412672.0.998407026]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Attribute_IsEnable.qbl b/_Main/BL/Type_ProductionLineBatchData/Attribute_IsEnable.qbl
new file mode 100644
index 0000000..f2f8d37
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Attribute_IsEnable.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsEnable
+{
+  #keys: '3[412672.0.1013479637][412672.0.1013479636][412672.0.1013479638]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Attribute_StartDate.qbl b/_Main/BL/Type_ProductionLineBatchData/Attribute_StartDate.qbl
new file mode 100644
index 0000000..a9e97b7
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Attribute_StartDate.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[412672.0.998407015][412672.0.998407014][412672.0.998407016]'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/DefaultValue_IsEnable.qbl b/_Main/BL/Type_ProductionLineBatchData/DefaultValue_IsEnable.qbl
new file mode 100644
index 0000000..69fa188
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/DefaultValue_IsEnable.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: 'false'
+  TargetAttribute: IsEnable
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_Disable.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_Disable.qbl
new file mode 100644
index 0000000..3aa9270
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_Disable.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method Disable
+{
+  TextBody:
+  [*
+    // rislai Jun-10-2024 (created)
+    this.IsEnable( false );
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl
new file mode 100644
index 0000000..3dd7f3e
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl
@@ -0,0 +1,68 @@
+Quintiq file version 2.0
+#parent: #root
+Method Enable
+{
+  TextBody:
+  [*
+    // rislai Jun-7-2024 (created)
+    owner := this.MacroPlan();
+    
+    // 杞崲鐝缂撳瓨
+    shiftPattern1 := this.ShiftPattern1();
+    shiftPattern2 := this.ShiftPattern2();
+    tempShiftPattern := shiftPattern1;
+    
+    dayPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, period_MP.TimeUnit() = 'Day' and period_MP.StartDate() >= this.StartDate() and period_MP.EndDate() < this.EndDate() ,period_MP.StartDate());
+    weekPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, period_MP.TimeUnit() = 'Week' and period_MP.StartDate() >= this.StartDate() and period_MP.EndDate() < this.EndDate() ,period_MP.StartDate());
+    
+    // period_MPs := selectsortedset( owner,Period_MP,period_MP, period_MP.StartDate() >= this.StartDate() and period_MP.EndDate() <= this.EndDate() ,period_MP.StartDate());
+    if( dayPeriod_MPs.Size() > 0 ){
+      
+      startDate := dayPeriod_MPs.Element( 0 ).StartDate();
+      endDate := dayPeriod_MPs.Element( dayPeriod_MPs.Size() - 1 ).EndDate();
+      
+      // 姣忎竷澶╄疆鎹㈢彮娆�
+      for( i := startDate.StartOfWeek(); i < (endDate.StartOfWeek() - 1).StartOfNextWeek(); i := i.StartOfNextWeek()){
+        tempStartDate := i;
+        tempEndDate := i.StartOfNextWeek();
+        
+        tempPeriod_MPs := selectset( dayPeriod_MPs,Elements,period_MP,period_MP.StartDate() >= tempStartDate and period_MP.EndDate() <= tempEndDate );
+        
+        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+        
+        if( unitPeriodTimes1.Size() > 0 ){
+          this.OnOK( unitPeriodTimes1,shiftPattern1 ); 
+        }
+        if( unitPeriodTimes2.Size() > 0 ){
+          this.OnOK( unitPeriodTimes2,shiftPattern2 );
+        }
+        
+        // 鎹㈢彮娆�
+        tempShiftPattern := shiftPattern1;
+        shiftPattern1 := shiftPattern2;
+        shiftPattern2 := tempShiftPattern;
+      }
+    }
+    if( weekPeriod_MPs.Size() <> 0 ){
+      traverse( weekPeriod_MPs,Elements,period_MP ){
+        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP());
+        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP());
+        
+        if( unitPeriodTimes1.Size() > 0 ){
+          this.OnOK( unitPeriodTimes1,shiftPattern1 ); 
+        }
+        if( unitPeriodTimes2.Size() > 0 ){
+          this.OnOK( unitPeriodTimes2,shiftPattern2 );
+        }
+    
+        // 鎹㈢彮娆�
+        tempShiftPattern := shiftPattern1;
+        shiftPattern1 := shiftPattern2;
+        shiftPattern2 := tempShiftPattern;
+      } 
+    }
+    
+    this.IsEnable( true );
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_OnOK.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_OnOK.qbl
new file mode 100644
index 0000000..943b78d
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_OnOK.qbl
@@ -0,0 +1,88 @@
+Quintiq file version 2.0
+#parent: #root
+Method OnOK (
+  UnitPeriodTimes unitPeriodTimes,
+  ShiftPattern shiftPattern
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-9-2024 (created)
+    firstElement := minselect( unitPeriodTimes, Elements, e, true, e.Start() );
+    
+    start := this.MacroPlan().Start();
+    timeunit := this.MacroPlan().StartOfPlanningPeriod().TimeUnit();
+    maintenance := Duration::Zero();
+    efficiency := 1.0;
+    allocation := 1.0;
+    
+    maxloadpercentage := this.MacroPlan().GlobalParameters_MP().DefaultMaxLoadPercentage();
+    nrofunitopen := 1;
+    minloadthreshold := 0.0;
+    
+    if( not isnull( firstElement ) ){
+      // To inherit the value from last unit availability while creating a new unit availability
+      unitavailability := firstElement.UnitAvailability();
+      start := firstElement.Start();
+    
+      if( not isnull( unitavailability ) ){
+        timeunit := unitavailability.TimeUnit();
+        maintenance := unitavailability.Maintenance();
+        efficiency := unitavailability.Efficiency();
+        allocation := unitavailability.Allocation();
+    
+        maxloadpercentage := unitavailability.MaximumLoadPercentage();
+        nrofunitopen := unitavailability.NrOfUnitsOpen();
+        minloadthreshold := unitavailability.MinimumLoadThreshold();
+      }else{
+        timeunit := firstElement.Period_MP().TimeUnit();
+        maintenance := firstElement.Maintenance();
+        efficiency := firstElement.Efficiency();
+        allocation := firstElement.Allocation();
+    
+        maxloadpercentage := firstElement.MaximumLoadPercentage();
+        nrofunitopen := firstElement.NrOfOpen();
+        minloadthreshold := firstElement.MinimumLoadThreshold();
+      }
+    }
+    isbatchedit := unitPeriodTimes.Size() > 1;
+    
+    UnitAvailability::CreateOrUpdateForUnitPeriodTimes( unitPeriodTimes,
+                                                        not isbatchedit or false,
+                                                        timeunit,
+                                                        maintenance,
+                                                        not isbatchedit or false,
+                                                        efficiency,
+                                                        false,
+                                                        allocation,
+                                                        not isbatchedit or true,
+                                                        shiftPattern,
+                                                        not isbatchedit or false,
+                                                        maxloadpercentage,
+                                                        not isbatchedit or false,
+                                                        nrofunitopen,
+                                                        false,
+                                                        not isbatchedit or false,
+                                                        minloadthreshold
+                                                       );
+    
+    //UnitAvailability::CreateOrUpdateForUnitPeriodTimes( unitPeriodTimes,
+    //                                                    not isbatchedit or CheckBoxBatchEditMaintenance.Checked(),
+    //                                                    data.TimeUnit(),
+    //                                                    data.Maintenance(),
+    //                                                    not isbatchedit or CheckBoxBatchEditEfficiency.Checked(),
+    //                                                    data.Efficiency(),
+    //                                                    false,
+    //                                                    data.Allocation(),
+    //                                                    not isbatchedit or CheckBoxBatchEditShiftPattern.Checked(),
+    //                                                    data.ShiftPattern(),
+    //                                                    not isbatchedit or CheckBoxBatchEditMaxLoadPercentage.Checked(),
+    //                                                    data.MaximumLoadPercentage(),
+    //                                                    not isbatchedit or CheckBoxBatchEditNrOfUnitsOpen.Checked(),
+    //                                                    data.NrOfUnitsOpen(),
+    //                                                    DataHolderFromThisPeriodOnward.Data(),
+    //                                                    not isbatchedit or CheckBoxBatchEditMinimumLoadThreshold.Checked(),
+    //                                                    data.MinimumLoadThreshold()
+    //                                                   );
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_Update.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_Update.qbl
new file mode 100644
index 0000000..68b817c
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_Update.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+Method Update (
+  Unit line1,
+  Unit line2,
+  ShiftPattern shiftPattern1,
+  ShiftPattern shiftPattern2,
+  Date startDate,
+  Date endDate
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-7-2024 (created)
+    owner := this.MacroPlan();
+    
+    if( isnull( shiftPattern1 ) or isnull( shiftPattern2 ) or isnull( line1 ) or isnull( line2 )){
+      error( "鏁版嵁涓嶈兘涓虹┖锛�" ); 
+    }
+    // 锛�1锛� 鏂板浜х嚎1鍜屼骇绾�2鐩稿悓鏃舵姤閿欌�滅浉鍚屼骇绾挎棤娉曟柊澧炩�濓紱
+    if( line1 = line2 ){
+       error( "鐩稿悓浜х嚎鏃犳硶鏂板" );
+    }
+    
+    // 锛�2锛� 鐩稿悓鐨勪骇绾跨彮娆★紝鐢熸晥鏃堕棿鍙互缁存姢澶氫釜锛屼絾鏄敓鏁堟椂闂撮噸澶嶆椂鎶ラ敊鈥滆鏁版嵁宸茬淮鎶も�濓紱
+    verifyData := select( owner,ProductionLineBatchData,data,data.Unit1() = line1 and data.Unit2() = line2 and
+                          data.ShiftPattern1() = shiftPattern1 and data.ShiftPattern2() = shiftPattern2 and 
+                          data.StartDate() = startDate and data.EndDate() = endDate and data <> this );
+    if( not isnull( verifyData )){
+      error( "璇ユ暟鎹凡缁存姢" );
+    }
+    
+    this.ShiftPattern1( relset, shiftPattern1 );
+    this.ShiftPattern2( relset, shiftPattern2 );
+    this.Unit1( relset, line1 );
+    this.Unit2( relset, line2 );
+    this.StartDate( startDate );
+    this.EndDate( endDate );
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl
new file mode 100644
index 0000000..0226cbe
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_verifyEnable.qbl
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: #root
+Method VerifyEnable (
+  String feeback
+) const declarative as Boolean
+{
+  TextBody:
+  [*
+    // rislai Jun-6-2024 (created)
+    owner := this.MacroPlan();
+    value := true;
+    //锛�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() ));
+    
+    if( not isnull( verifyData )){
+      feeback := "銆�" + verifyData.Unit1().Name() + "銆戙��" + verifyData.Unit2().Name() + "銆戝凡浜�" + verifyData.StartDate().Format( "Y-M2-D2" ) +"鐢熸晥銆�";
+      value := false; 
+    }else{
+      feeback := ""; 
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/StaticMethod_Create.qbl b/_Main/BL/Type_ProductionLineBatchData/StaticMethod_Create.qbl
new file mode 100644
index 0000000..fc86ab1
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/StaticMethod_Create.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  MacroPlan owner,
+  Unit line1,
+  Unit line2,
+  ShiftPattern shiftPattern1,
+  ShiftPattern shiftPattern2,
+  Date startDate,
+  Date endDate
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-7-2024 (created)
+    if( isnull( shiftPattern1 ) or isnull( shiftPattern2 ) or isnull( line1 ) or isnull( line2 )){
+      error( "鏁版嵁涓嶈兘涓虹┖锛�" ); 
+    }
+    // 锛�1锛� 鏂板浜х嚎1鍜屼骇绾�2鐩稿悓鏃舵姤閿欌�滅浉鍚屼骇绾挎棤娉曟柊澧炩�濓紱
+    if( line1 = line2 ){
+       error( "鐩稿悓浜х嚎鏃犳硶鏂板" );
+    }
+    
+    // 锛�2锛� 鐩稿悓鐨勪骇绾跨彮娆★紝鐢熸晥鏃堕棿鍙互缁存姢澶氫釜锛屼絾鏄敓鏁堟椂闂撮噸澶嶆椂鎶ラ敊鈥滆鏁版嵁宸茬淮鎶も�濓紱
+    verifyData := select( owner,ProductionLineBatchData,data,data.Unit1() = line1 and data.Unit2() = line2 and
+                          data.ShiftPattern1() = shiftPattern1 and data.ShiftPattern2() = shiftPattern2 and 
+                          data.StartDate() = startDate and data.EndDate() = endDate );
+    if( not isnull( verifyData )){
+      error( "璇ユ暟鎹凡缁存姢" );
+    }
+    
+    data := owner.ProductionLineBatchData( relnew,
+                                           ShiftPattern1 := shiftPattern1,
+                                           ShiftPattern2 := shiftPattern2,
+                                           Unit1 := line1,
+                                           Unit2 := line2,
+                                           StartDate := startDate,
+                                           EndDate := endDate );
+  *]
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/_ROOT_Type_ProductionLineBatchData.qbl b/_Main/BL/Type_ProductionLineBatchData/_ROOT_Type_ProductionLineBatchData.qbl
new file mode 100644
index 0000000..113e470
--- /dev/null
+++ b/_Main/BL/Type_ProductionLineBatchData/_ROOT_Type_ProductionLineBatchData.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ProductionLineBatchData
+{
+  #keys: '5[412672.0.998406958][412672.0.998406956][0.0.0][412672.0.998406957][412672.0.998406959]'
+  BaseType: Object
+  StructuredName: 'ProductionLineBatchDatas'
+}
diff --git a/_Main/BL/Type_ShiftPattern/_ROOT_Type_ShiftPattern.qbl b/_Main/BL/Type_ShiftPattern/_ROOT_Type_ShiftPattern.qbl
new file mode 100644
index 0000000..092313d
--- /dev/null
+++ b/_Main/BL/Type_ShiftPattern/_ROOT_Type_ShiftPattern.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type ShiftPattern #extension
+{
+}
diff --git a/_Main/BL/Type_Test/StaticMethod_Test.qbl b/_Main/BL/Type_Test/StaticMethod_Test.qbl
new file mode 100644
index 0000000..6504f53
--- /dev/null
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Test (
+  ScenarioManager scenarioManager,
+  MacroPlan macroPlan,
+  Archive archive
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-9-2024 (created)
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def
new file mode 100644
index 0000000..3069a9f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupDebug.def
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component ActionBarGroupDebug
+{
+  #keys: '[412672.0.1024432948]'
+  BaseType: 'WebActionBarGroup'
+  Children:
+  [
+    Component ButtonTest
+    {
+      #keys: '[412672.0.1024433059]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'BUG'
+        Label: 'Test'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 4
+    Title: 'Debug'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
new file mode 100644
index 0000000..a02fe8a
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_applicationDevelopmentActionBarPageDef\0431.def"
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component applicationDevelopmentActionBarPageDef id:applicationDevelopmentActionBarPageDef_1 #extension
+{
+  Children:
+  [
+    #child: ActionBarGroupDebug
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def
new file mode 100644
index 0000000..563d822
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupDebug/ButtonTest
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupDebug_ButtonTest_OnClick
+{
+  #keys: '[412672.0.1024433074]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Test::Test( ScenarioManager,MacroPlan,Archive );
+    *]
+    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 3816dc4..2bab744 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -13,6 +13,7 @@
         #child: ActionBarPageSales
         #child: applicationConfigureActionBarPageDef
         #child: ActionBarPageInventory
+        #child: applicationDevelopmentActionBarPageDef_1
       ]
     }
     Component dhBinaryDataPR id:dhBinaryDataPR_688
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlActions.def
new file mode 100644
index 0000000..9756698
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlActions.def
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+Component pnlActions
+{
+  #keys: '[412672.0.996751937]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component btnOk
+    {
+      #keys: '[412672.0.996751941]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'OK'
+        Taborder: 0
+      ]
+    }
+    Component btnCancel
+    {
+      #keys: '[412672.0.996751943]'
+      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_DialogCreateEditProductionLineBatchData/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlContent.def
new file mode 100644
index 0000000..896cf38
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Component_pnlContent.def
@@ -0,0 +1,148 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[412672.0.996751935]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlLine1
+    {
+      #keys: '[412672.0.996752425]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Unit'
+      Children:
+      [
+        Component deContent
+        {
+          #keys: '[412672.0.996752427]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Unit]'
+            Source: 'ApplicationMacroPlanner.DataHolderUnit'
+            Taborder: 0
+            Transformation: 'Elements.astype(Unit)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.Unit1'
+        DisplayField: 'Name'
+        Label: 'Line 1'
+        Taborder: 0
+      ]
+    }
+    Component ddlLine2
+    {
+      #keys: '[412672.0.996752441]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'Unit'
+      Children:
+      [
+        Component deContent568
+        {
+          #keys: '[412672.0.996752443]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Unit]'
+            Source: 'ApplicationMacroPlanner.DataHolderUnit'
+            Taborder: 0
+            Transformation: 'Elements.astype(Unit)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.Unit2'
+        DisplayField: 'Name'
+        Label: 'Line 2'
+        Taborder: 1
+      ]
+    }
+    Component ddlShiftPattern1
+    {
+      #keys: '[412672.0.996752456]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ShiftPattern'
+      Children:
+      [
+        Component deContent710
+        {
+          #keys: '[412672.0.996752458]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'ShiftPattern'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.ShiftPattern1'
+        DisplayField: 'Name'
+        Label: 'Shift pattern 1'
+        Taborder: 2
+      ]
+    }
+    Component ddlShiftPattern2
+    {
+      #keys: '[412672.0.996752472]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'ShiftPattern'
+      Children:
+      [
+        Component deContent748
+        {
+          #keys: '[412672.0.996752474]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'ShiftPattern'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.ShiftPattern2'
+        DisplayField: 'Name'
+        Label: 'Shift pattern 2'
+        Taborder: 3
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.0.996752488]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.StartDate'
+        Label: 'Start date'
+        Taborder: 4
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.0.996752501]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        DataBinding: 'DialogData.Data.EndDate'
+        Label: 'End date'
+        Taborder: 5
+      ]
+    }
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Create.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Create.def
new file mode 100644
index 0000000..46ebb8e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Create.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#parent: #root
+Method Create () id:Method_DialogCreateEditProductionLineBatchData_Create
+{
+  #keys: '[412672.0.996752047]'
+  Body:
+  [*
+    this.CreateEdit( false );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_CreateEdit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_CreateEdit.def
new file mode 100644
index 0000000..8f04b67
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_CreateEdit.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method CreateEdit (
+  Boolean isEdit
+) id:Method_DialogCreateEditProductionLineBatchData_CreateEdit
+{
+  #keys: '[412672.0.996751977]'
+  Body:
+  [*
+    if( isEdit ){
+      this.Title( "Edit"); 
+    }else{
+      this.Title( "Create"); 
+    }
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Edit.def
new file mode 100644
index 0000000..ec9476a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Method_Edit.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  ProductionLineBatchData data
+) id:Method_DialogCreateEditProductionLineBatchData_Edit
+{
+  #keys: '[412672.0.996752095]'
+  Body:
+  [*
+    if( not isnull( data )){
+      DialogData.Data( data );
+      this.CreateEdit( true );
+    }
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnCancel_OnClick.def
new file mode 100644
index 0000000..bdc88b8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/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.996751947]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      Form.Close();
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnOk_OnClick.def
new file mode 100644
index 0000000..b22731d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/Response_pnlActions_btnOk_OnClick.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+#parent: pnlActions/btnOk
+Response OnClick () id:Response_pnlActions_btnOk_OnClick
+{
+  #keys: '[412672.0.996751946]'
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return ddlLine1.Data() <> ddlLine2.Data() and dsEndDate.Date() > dsStartDate.Date();
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      if( not isnull( DialogData.Data( ))){
+        DialogData.Data( ).Update( ddlLine1.Data(),
+                                   ddlLine2.Data(),
+                                   ddlShiftPattern1.Data(),
+                                   ddlShiftPattern2.Data(),
+                                   dsStartDate.Date(),
+                                   dsEndDate.Date());
+      }else{
+        ProductionLineBatchData::Create( MacroPlan,
+                                         ddlLine1.Data(),
+                                         ddlLine2.Data(),
+                                         ddlShiftPattern1.Data(),
+                                         ddlShiftPattern2.Data(),
+                                         dsStartDate.Date(),
+                                         dsEndDate.Date()); 
+      }
+      
+      // Form.ApplyChanges();
+      Form.Close();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/_ROOT_Component_DialogCreateEditProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/_ROOT_Component_DialogCreateEditProductionLineBatchData.def
new file mode 100644
index 0000000..f3e450c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditProductionLineBatchData/_ROOT_Component_DialogCreateEditProductionLineBatchData.def
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent DialogCreateEditProductionLineBatchData
+{
+  #keys: '[412672.0.996751933]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pnlContent
+    #child: pnlActions
+    Component DialogData
+    {
+      #keys: '[412672.0.996752601]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'ProductionLineBatchData'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    EnterButton: 'btnOk'
+    EscapeButton: 'btnCancel'
+    ExcludeFromActiveComponent: true
+    Padding: 'false'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_ListProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_ListProductionLineBatchData.def
new file mode 100644
index 0000000..ed4224a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_ListProductionLineBatchData.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component ListProductionLineBatchData
+{
+  #keys: '[412672.0.996750714]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorProductionLineBatchData
+    {
+      #keys: '[412672.0.996750715]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'ProductionLineBatchData'
+      ]
+    }
+    #child: listActionBarPageProductionLineBatchData
+    Component DataSetLevelProductionLineBatchData
+    {
+      #keys: '[412672.0.996750720]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuProductionLineBatchData
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit1.Name","title":"Unit1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit1.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit2.Name","title":"Unit2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Unit2.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShiftPattern1.Name","title":"Shift pattern 1","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ShiftPattern1.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShiftPattern2.Name","title":"Shift pattern 2","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ShiftPattern2.Name"}},{"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"}}]'
+        ContextMenu: 'listContextMenuProductionLineBatchData'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+    {
+      #keys: '[412672.0.996751570]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[1917.0.7571120]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_PanelProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_PanelProductionLineBatchData.def
new file mode 100644
index 0000000..00ed921
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_PanelProductionLineBatchData.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelProductionLineBatchData
+{
+  #keys: '[412672.0.996750698]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListProductionLineBatchData
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listActionBarPageProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listActionBarPageProductionLineBatchData.def
new file mode 100644
index 0000000..afb0f02
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listActionBarPageProductionLineBatchData.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageProductionLineBatchData
+{
+  #keys: '[412672.0.996750717]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listContextMenuProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listContextMenuProductionLineBatchData.def
new file mode 100644
index 0000000..df4e814
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Component_listContextMenuProductionLineBatchData.def
@@ -0,0 +1,78 @@
+Quintiq file version 2.0
+Component listContextMenuProductionLineBatchData
+{
+  #keys: '[412672.0.996750722]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component mnCreate
+    {
+      #keys: '[412672.0.996751159]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'NEW'
+        Taborder: 3
+        Title: 'Create...'
+      ]
+    }
+    Component mnEdit
+    {
+      #keys: '[412672.0.996751186]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'NOTEBOOK_EDIT'
+        Taborder: 4
+        Title: 'Edit...'
+      ]
+    }
+    Component mnDelete
+    {
+      #keys: '[412672.0.996751251]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 5
+        Title: 'Delete'
+      ]
+    }
+    Component MenuSeparator1
+    {
+      #keys: '[412672.0.996751270]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Separator: true
+        Taborder: 6
+      ]
+    }
+    Component mnEnable
+    {
+      #keys: '[412672.0.996751332]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'CHECKEDCHECKBOX'
+        Taborder: 7
+        Title: 'Enable'
+      ]
+    }
+    Component mnDisable
+    {
+      #keys: '[412672.0.1026802848]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'EMPTYCHECKBOX'
+        Taborder: 8
+        Title: 'Disable'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnCreate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnCreate_OnClick.def
new file mode 100644
index 0000000..eb25821
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnCreate_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListProductionLineBatchData
+Response OnClick () id:Response_ListProductionLineBatchData_mnCreate_OnClick
+{
+  #keys: '[412672.0.1000011939]'
+  CanBindMultiple: false
+  DefinitionID => /ListProductionLineBatchData/Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+  Initiator: 'mnCreate'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditProductionLineBatchData );
+      dlg.Create();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDelete_OnClick.def
new file mode 100644
index 0000000..2c59888
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDelete_OnClick.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListProductionLineBatchData
+Response OnClick (
+  structured[ProductionLineBatchData] selection
+) id:Response_ListProductionLineBatchData_mnDelete_OnClick
+{
+  #keys: '[412672.0.996751681]'
+  CanBindMultiple: false
+  DefinitionID => /ListProductionLineBatchData/Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+  Initiator: 'mnDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      traverse( selection,Elements,element){
+        element.Delete(); 
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDisable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDisable_OnClick.def
new file mode 100644
index 0000000..de3788b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnDisable_OnClick.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: ListProductionLineBatchData
+Response OnClick (
+  structured[ProductionLineBatchData] selection
+) id:Response_ListProductionLineBatchData_mnDisable_OnClick
+{
+  #keys: '[412672.0.1024491799]'
+  CanBindMultiple: false
+  DefinitionID => /ListProductionLineBatchData/Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+  GroupServerCalls: true
+  Initiator: 'mnDisable'
+  Precondition:
+  [*
+    value := select( selection,Elements,element,not element.IsEnable() );
+    return isnull( value );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      traverse( selection,Elements,element ){
+        element.Disable(); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEdit_OnClick.def
new file mode 100644
index 0000000..a074291
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEdit_OnClick.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ListProductionLineBatchData
+Response OnClick (
+  ProductionLineBatchData selection
+) id:Response_ListProductionLineBatchData_mnEdit_OnClick
+{
+  #keys: '[412672.0.1000012043]'
+  CanBindMultiple: false
+  DefinitionID => /ListProductionLineBatchData/Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+  Initiator: 'mnEdit'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditProductionLineBatchData );
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEnable_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEnable_OnClick.def
new file mode 100644
index 0000000..4036fac
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/Response_ListProductionLineBatchData_mnEnable_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: ListProductionLineBatchData
+Response OnClick (
+  ProductionLineBatchData selection
+) id:Response_ListProductionLineBatchData_mnEnable_OnClick
+{
+  #keys: '[412672.0.1018421769]'
+  CanBindMultiple: false
+  DefinitionID => /ListProductionLineBatchData/Responsedef_ListProductionLineBatchData_WebMenu_OnClick
+  Initiator: 'mnEnable'
+  Precondition:
+  [*
+    return selection.VerifyEnable( feedback );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Enable();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/_ROOT_Component_FormProductionLineBatchData.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/_ROOT_Component_FormProductionLineBatchData.def
new file mode 100644
index 0000000..3980757
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchData/_ROOT_Component_FormProductionLineBatchData.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormProductionLineBatchData
+{
+  #keys: '[412672.0.996750644]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelProductionLineBatchData
+  ]
+  Properties:
+  [
+    Title: '鎵归噺缁存姢浜х嚎鐝'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Time_Capacities.vw b/_Main/UI/MacroPlannerWebApp/Views/Time_Capacities.vw
new file mode 100644
index 0000000..819a968
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/Time_Capacities.vw
@@ -0,0 +1,70 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_legacy_2
+      {
+        components
+        {
+          FormTimeCapacities_MatrixEditorTimeCapacities
+          {
+            totalHeaderWidth: 293
+          }
+        }
+      }
+      form_FormProductionLineBatchData
+      {
+        title: 'QMacroPlanner::FormProductionLineBatchData'
+        shown: true
+        componentID: 'QMacroPlanner::FormProductionLineBatchData'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 18
+          rowSpan: 9
+          columnPosition: 1
+          columnSpan: 8
+        }
+        components
+        {
+          FormProductionLineBatchData_PanelProductionLineBatchData
+          {
+            sizeRatio: 1
+          }
+          FormProductionLineBatchData_ListProductionLineBatchData
+          {
+          }
+          FormProductionLineBatchData_DataSetLevelProductionLineBatchData
+          {
+            groupDepth: -1
+            column_StartDate
+            {
+              columnId: 'StartDate'
+              dataPath: 'StartDate'
+              dataType: 'date'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_EndDate
+            {
+              columnId: 'EndDate'
+              dataPath: 'EndDate'
+              dataType: 'date'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+    }
+  }
+  formatversion: 2
+  id: 'Time Capacities'
+  name: 'Time Capacities'
+  isglobal: false
+  isroot: false
+}

--
Gitblit v1.9.3