From 56e177a01ebbaba93ec77e704bc15222332dece5 Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期三, 27 十一月 2024 17:14:29 +0800
Subject: [PATCH] 添加单班次计划配置,修复一些bug

---
 _Main/UI/MacroPlannerWebApp/Views/MaintenanceSingleShiftConfig.vw                                                                              |  199 ++++++++++++++
 _Main/BL/Type_SingleShiftConfig/Attribute_StandardYield.qbl                                                                                    |    7 
 _Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl                                                                                      |   17 
 _Main/BL/Type_SingleShiftConfig/Attribute_ShiftName.qbl                                                                                        |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishPDM.def                                              |   35 ++
 _Main/BL/Type_SingleShiftConfig/Attribute_SingleShiftName.qbl                                                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuMaintenanceSingleShiftConfig.def |   17 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelOrigin.def                                                       |    2 
 _Main/BL/EDI/Broker_MP_ExportSingleShiftConfigBroker.qbl                                                                                       |   48 +++
 _var/_Main/Data/MP_SingleShiftConfig.xlsx                                                                                                      |    0 
 _Main/BL/Type_SingleShiftConfig/Attribute_ID.qbl                                                                                               |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPublish.def                                              |   26 +
 _Main/BL/Type_Archive/StaticMethod_GenerateForecast.qbl                                                                                        |   30 +
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Response_MacroPlanner_pnlActions_bSplitUsingCurve_OnClick.def                   |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bExport_OnClick.def                                |   16 +
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listContextMenuSingleShiftConfig.def                                     |   10 
 _Main/BL/Type_SingleShiftConfig/StaticMethod_Export.qbl                                                                                        |   14 +
 _Main/BL/Type_SingleShiftConfig/StaticMethod_Import.qbl                                                                                        |   70 +++++
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig497.def                                            |   14 +
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/_ROOT_Component_FormSingleShiftConfig.def                                          |   17 +
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_ListSingleShiftConfig.def                                                |   41 ++
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig.def                                               |   35 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelCurve.def                                                        |    1 
 _Main/BL/Relations/Relation_SingleShiftConfig_Unit_Unit_SingleShiftConfig.qbl                                                                  |   23 +
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listActionBarPageSingleShiftConfig.def                                   |   10 
 /dev/null                                                                                                                                      |   17 -
 _Main/BL/Type_SingleShiftConfig/_ROOT_Type_SingleShiftConfig.qbl                                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bImport_OnClick.def                                |   45 +++
 _Main/BL/Type_SingleShiftConfig/Function_CalcUnitID.qbl                                                                                        |   13 
 _Main/BL/Type_SingleShiftConfig/TypeIndex_SingleShiftConfigTypeIndex.qbl                                                                       |   12 
 _Main/BL/Type_SingleShiftConfig/Attribute_UnitID.qbl                                                                                           |    7 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupArchiveReport.def                                        |    6 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuPublishShiftSchedulingInform.def |   21 +
 33 files changed, 736 insertions(+), 53 deletions(-)

diff --git a/_Main/BL/EDI/Broker_MP_ExportSingleShiftConfigBroker.qbl b/_Main/BL/EDI/Broker_MP_ExportSingleShiftConfigBroker.qbl
new file mode 100644
index 0000000..d68eddd
--- /dev/null
+++ b/_Main/BL/EDI/Broker_MP_ExportSingleShiftConfigBroker.qbl
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+#parent: #root
+EDIBroker MP_ExportSingleShiftConfigBroker
+{
+  MDSDefinition: MacroPlan
+  TimeZone: 'ACT'
+  UseOSTimeZone: false
+  EDIModelLink.Source SingleShiftConfigSource
+  {
+    EDIMLTable SingleShiftConfig
+    {
+      TargetType: SingleShiftConfig
+      EDIMLColumn ID { Attribute: ID ValueType: String }
+      EDIMLColumn ShiftName { Attribute: ShiftName ValueType: String }
+      EDIMLColumn SingleShiftName { Attribute: SingleShiftName ValueType: String }
+      EDIMLColumn StandardYield { Attribute: StandardYield ValueType: Real }
+      EDIMLColumn UnitID { Attribute: UnitID ValueType: String }
+    }
+  }
+  EDITransformation.Transformation SingleShiftConfigTransformation
+  {
+    EDITableTransformation
+    {
+      InputTable: SingleShiftConfig
+      OutputTable: SingleShiftConfig
+      EDIColumnMatch { InputColumn: ID OutputColumn: ID }
+      EDIColumnMatch { InputColumn: ShiftName OutputColumn: ShiftName }
+      EDIColumnMatch { InputColumn: SingleShiftName OutputColumn: SingleShiftName }
+      EDIColumnMatch { InputColumn: StandardYield OutputColumn: StandardYield }
+      EDIColumnMatch { InputColumn: UnitID OutputColumn: UnitID }
+    }
+  }
+  EDIXLSLink.Destination SingleShiftConfigDestination
+  {
+    FileName: 'MP_SingleShiftConfig'
+    EDIXLSLinkTable SingleShiftConfig
+    {
+      Columns:
+      [
+        EDIXLSLinkColumn ID { ValueType: String }
+        EDIXLSLinkColumn ShiftName { ValueType: String }
+        EDIXLSLinkColumn SingleShiftName { ValueType: String }
+        EDIXLSLinkColumn StandardYield { ValueType: Real }
+        EDIXLSLinkColumn UnitID { ValueType: String }
+      ]
+    }
+  }
+}
diff --git a/_Main/BL/Relations/Relation_SingleShiftConfig_Unit_Unit_SingleShiftConfig.qbl b/_Main/BL/Relations/Relation_SingleShiftConfig_Unit_Unit_SingleShiftConfig.qbl
new file mode 100644
index 0000000..5700a68
--- /dev/null
+++ b/_Main/BL/Relations/Relation_SingleShiftConfig_Unit_Unit_SingleShiftConfig.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation SingleShiftConfig_Unit_Unit_SingleShiftConfig
+{
+  #keys: '1[414996.1.251280077]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide Unit
+  {
+    #keys: '3[414996.1.251280079][414996.1.251280078][414996.1.251280080]'
+    Cardinality: '0to1'
+    ObjectDefinition: SingleShiftConfig
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide SingleShiftConfig
+  {
+    #keys: '3[414996.1.251280082][414996.1.251280081][414996.1.251280083]'
+    Cardinality: '1toN'
+    ObjectDefinition: Unit
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_Archive/StaticMethod_GenerateForecast.qbl b/_Main/BL/Type_Archive/StaticMethod_GenerateForecast.qbl
index 6e3196f..00e9c16 100644
--- a/_Main/BL/Type_Archive/StaticMethod_GenerateForecast.qbl
+++ b/_Main/BL/Type_Archive/StaticMethod_GenerateForecast.qbl
@@ -36,6 +36,10 @@
     }
     
     traverse ( archiveExecutionStatus, TemporaryDemandData, tdd ,tdd.Origin() = "" or tdd.StartDate() >= macroPlan.StartOfPlanning().Date()) {
+      if( tdd.ProductID() = "6914" or tdd.ProductID() = "6916" or tdd.ProductID() = "6917" or tdd.ProductID() = "06S100010R" or tdd.ProductID() = "06S100010M" or tdd.ProductID() = "06S100010N" ){
+        tdd.StockingPointID( "澶ц繛鍙戝姩鏈虹殑闀挎槬澶栫搴�" );
+      }
+      
       targetProduct_MP := null( Product_MP );
       
       productMPHandleNotes := productMPIndexTreeNotes.GetHandle( tdd.ProductID());
@@ -62,19 +66,19 @@
       // info( tdd.SalesSegmentName() );
       if ( not isnull( targetProduct_MP ) and not isnull( targetStockingPoint_MP ) ) {
         forcest := Forecast::Create( targetProduct_MP,
-                          targetStockingPoint_MP,
-                          IDHolder::GetGUID(),
-                          tdd.StartDate(),
-                          tdd.EndDate(),
-                          tdd.Quantity(),
-                          [Real]tdd.Price(),
-                          tdd.PriorityName(),
-                          tdd.SalesSegmentName(),
-                          tdd.CurrencyID(),
-                          tdd.UnitOfMeasureName(),
-                          0.0,
-                          false,
-                          false );
+                                     targetStockingPoint_MP,
+                                     IDHolder::GetGUID(),
+                                     tdd.StartDate(),
+                                     tdd.EndDate(),
+                                     tdd.Quantity(),
+                                     [Real]tdd.Price(),
+                                     tdd.PriorityName(),
+                                     tdd.SalesSegmentName(),
+                                     tdd.CurrencyID(),
+                                     tdd.UnitOfMeasureName(),
+                                     0.0,
+                                     false,
+                                     false );
         forcest.Origin( tdd.Origin() );
       }
       if( isnull( targetProduct_MP )){
diff --git a/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl b/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
index c672705..8d7561a 100644
--- a/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
+++ b/_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
@@ -51,15 +51,16 @@
          dispatchShiftPlan.InterfaceTime( now );
        }else{
          if( archiveShiftPlan.Outcome() <> "" ){
-           interfaceLoginfo.DispatchShiftPlan( relnew,ID := OS:: GenerateGUIDAsString(),
-                                               ProductLine := productLine,
-                                               FactoryName := factoryName,
-                                               ShiftQty := archiveShiftPlan.Outcome(),
+           dispatchShiftPlan := interfaceLoginfo.DispatchShiftPlan( relnew,ID := OS:: GenerateGUIDAsString(),
+                                                                    ProductLine := productLine,
+                                                                    FactoryName := factoryName,
+                                                                    ShiftQty := archiveShiftPlan.Outcome(),
                                   
-                                               ShiftDate := shiftDate,
-                                               Tips := archiveShiftPlan.Remark(),
-                                               VersionName := archiveShiftPlan.MacroPlanName(),
-                                               InterfaceTime := now );
+                                                                    ShiftDate := shiftDate,
+                                                                    Tips := archiveShiftPlan.Remark(),
+                                                                    VersionName := archiveShiftPlan.MacroPlanName(),
+                                                                    InterfaceTime := now );
+           dispatchShiftPlan.CalcFac();
          }
        }
     }
diff --git a/_Main/BL/Type_SingleShiftConfig/Attribute_ID.qbl b/_Main/BL/Type_SingleShiftConfig/Attribute_ID.qbl
new file mode 100644
index 0000000..d63d57c
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Attribute_ID.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ID
+{
+  #keys: '3[414996.1.253601321][414996.1.253601320][414996.1.253601322]'
+  IsReadOnly: true
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/Attribute_ShiftName.qbl b/_Main/BL/Type_SingleShiftConfig/Attribute_ShiftName.qbl
new file mode 100644
index 0000000..83db221
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Attribute_ShiftName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute ShiftName
+{
+  #keys: '3[414996.1.251280091][414996.1.251280090][414996.1.251280092]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/Attribute_SingleShiftName.qbl b/_Main/BL/Type_SingleShiftConfig/Attribute_SingleShiftName.qbl
new file mode 100644
index 0000000..d5ea020
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Attribute_SingleShiftName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SingleShiftName
+{
+  #keys: '3[414996.1.251280114][414996.1.251280113][414996.1.251280115]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/Attribute_StandardYield.qbl b/_Main/BL/Type_SingleShiftConfig/Attribute_StandardYield.qbl
new file mode 100644
index 0000000..962b480
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Attribute_StandardYield.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StandardYield
+{
+  #keys: '3[414996.1.251280101][414996.1.251280100][414996.1.251280102]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/Attribute_UnitID.qbl b/_Main/BL/Type_SingleShiftConfig/Attribute_UnitID.qbl
new file mode 100644
index 0000000..4701dc9
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Attribute_UnitID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute UnitID
+{
+  #keys: '3[414996.1.253602237][414996.1.253602236][414996.1.253602238]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/Function_CalcUnitID.qbl b/_Main/BL/Type_SingleShiftConfig/Function_CalcUnitID.qbl
new file mode 100644
index 0000000..9991cc0
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/Function_CalcUnitID.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcUnitID
+{
+  TextBody:
+  [*
+    // Akari Nov-27-2024 (created)
+    
+    value := this.Unit().ID();
+    
+    this.UnitID( value );
+  *]
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/StaticMethod_Export.qbl b/_Main/BL/Type_SingleShiftConfig/StaticMethod_Export.qbl
new file mode 100644
index 0000000..d819173
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/StaticMethod_Export.qbl
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    // Akari Nov-27-2024 (created)
+    binaryData := macroPlan.MP_ExportSingleShiftConfigBroker().ExecuteToXLS( true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/StaticMethod_Import.qbl b/_Main/BL/Type_SingleShiftConfig/StaticMethod_Import.qbl
new file mode 100644
index 0000000..c3d4983
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/StaticMethod_Import.qbl
@@ -0,0 +1,70 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  MacroPlan macroPlan,
+  GeneralExcelImportAndExportDataTable table
+)
+{
+  TextBody:
+  [*
+    // 娓呯┖鍘熷鏁版嵁
+    units := selectset( macroPlan,Unit,unit,true );
+    unitIndexTree := NamedValueTree::Create();
+    for( i := 0; i< units.Size(); i++ ){
+      unit := units.Element( i );
+      unit.SingleShiftConfig( relflush );
+      
+      unitHandle := unitIndexTree.GetHandle( unit.ID() );
+      unitIndexTree.Root().AddChild( unitHandle,i );
+    }
+    
+    // 鏍¢獙鏂囦欢鍚�
+    //if ( table.GeneralExcelImportAndExportDataSource().Name() <> "鍙戝姩鏈哄尮閰�-鍏綅鐮�.xlsx" ) {
+    //  error( Translations::A_VWED_GeneralExcelImportAndExportDataSource_UploadError2() );
+    //}
+    
+    // 鐢熸垚鏁版嵁
+    rows := selectsortedset( table,GeneralExcelImportAndExportDataRow,row,row.RowNr());
+    
+    traverse( rows,Elements,row ){
+      
+      // idCell             := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDC, tempGEIAEDC.GeneralExcelImportAndExportDataColumn().ColumnIndex() = 0 );
+      shiftNameCell            := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDC, tempGEIAEDC.GeneralExcelImportAndExportDataColumn().ColumnIndex() = 1 );
+      singleShiftNameCell     := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDC, tempGEIAEDC.GeneralExcelImportAndExportDataColumn().ColumnIndex() = 2 );
+      standardYieldCell           := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDC, tempGEIAEDC.GeneralExcelImportAndExportDataColumn().ColumnIndex() = 3 );
+      unitIDCell            := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDC, tempGEIAEDC.GeneralExcelImportAndExportDataColumn().ColumnIndex() = 4 );
+      
+      unitID := guard( unitIDCell.Value(), "" );
+      if( unitID = "" ){
+        error( "Unit ID 涓哄繀濉」銆�" );
+      }
+      unitHandle := unitIndexTree.GetHandle( unitID );
+      unitIndex := guard( unitIndexTree.Root().Child( unitHandle ),null( NamedValue ));
+      if( not isnull( unitIndex )){
+        unit := units.Element( unitIndex.GetValueAsNumber() );
+        unit.SingleShiftConfig( relnew,
+                                ID := IDHolder::GetGUID(),
+                                ShiftName := guard( shiftNameCell.Value(), "" ),
+                                SingleShiftName := guard( singleShiftNameCell.Value(), "" ),
+                                StandardYield := [Real]guard( standardYieldCell.Value(), "0" ));
+      }else{
+        error( "鏃犳硶鍦ㄣ��" + macroPlan.MDSMacroPlan().Description() + "銆戝唴鎵惧埌浜х嚎銆�" + unitID + "銆戙��");
+      }
+    }
+    
+    //// 鏍¢獙鏁版嵁
+    //feedback            := "";
+    //sanitycheckfeedback := "";
+    //flag                := true;
+    //
+    //traverse ( macroPlan, SixDigitCode, sdc, flag ) {
+    //  SixDigitCode::ValidateInput( feedback, sanitycheckfeedback, macroPlan, sdc.Code(), sdc.Curve(), sdc.VehicleModel(), sdc.ProducingArea(), sdc.Engine(), sdc.Power(), sdc.EnginePartNumber(), 
+    //                               sdc.EngineFourDigitCode(), sdc.Remarks(), sdc );
+    //  flag := feedback = "";
+    //}
+    //
+    //if ( not flag ) {
+    //  error( feedback );
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/TypeIndex_SingleShiftConfigTypeIndex.qbl b/_Main/BL/Type_SingleShiftConfig/TypeIndex_SingleShiftConfigTypeIndex.qbl
new file mode 100644
index 0000000..16985db
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/TypeIndex_SingleShiftConfigTypeIndex.qbl
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+TypeIndex SingleShiftConfigTypeIndex
+{
+  Attributes:
+  [
+    TypeIndexAttribute
+    {
+      ModelElement: ID
+    }
+  ]
+}
diff --git a/_Main/BL/Type_SingleShiftConfig/_ROOT_Type_SingleShiftConfig.qbl b/_Main/BL/Type_SingleShiftConfig/_ROOT_Type_SingleShiftConfig.qbl
new file mode 100644
index 0000000..7fad944
--- /dev/null
+++ b/_Main/BL/Type_SingleShiftConfig/_ROOT_Type_SingleShiftConfig.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type SingleShiftConfig
+{
+  #keys: '5[414996.1.251280060][414996.1.251280058][0.0.0][414996.1.251280059][414996.1.251280061]'
+  BaseType: Object
+  Description: '鍗曠彮娆¢厤缃�'
+  StructuredName: 'SingleShiftConfigs'
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupArchiveReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupArchiveReport.def
index 6d2c76c..75c4c04 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupArchiveReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupArchiveReport.def
@@ -56,7 +56,7 @@
       Properties:
       [
         Image: 'PRODUCT'
-        Label: 'Archive packaging plan'
+        Label: '鍖呰璁″垝瀛樻。'
         Taborder: 4
       ]
     }
@@ -67,7 +67,7 @@
       Properties:
       [
         Image: 'TRUCK2_BLUE'
-        Label: 'Archive transfer plan'
+        Label: '杩愯緭璁″垝瀛樻。'
         Taborder: 5
       ]
     }
@@ -89,7 +89,7 @@
       Properties:
       [
         Image: 'KEYBOARD_KEY_SHIFT'
-        Label: 'Archive shift plan'
+        Label: '鐝璁″垝瀛樻。'
         Taborder: 6
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPublish.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPublish.def
index 5bd332f..2aea670 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPublish.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupPublish.def
@@ -16,17 +16,6 @@
         Taborder: 0
       ]
     }
-    Component ButtonDispatchShiftSchedulingInformation
-    {
-      #keys: '[414996.1.173765219]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'SKIN_TIGER'
-        Label: '涓嬪彂鐝璁″垝淇℃伅'
-        Taborder: 2
-      ]
-    }
     Component ButtonPublishSAP
     {
       #keys: '[415136.0.1332920231]'
@@ -42,6 +31,21 @@
         Taborder: 1
       ]
     }
+    Component ButtonPublishPDM
+    {
+      #keys: '[414996.1.253210336]'
+      BaseType: 'WebButton'
+      Children:
+      [
+        #child: ContextMenuPublishPDM
+      ]
+      Properties:
+      [
+        Image: 'DATA_OUT'
+        Label: 'PDM 鎺ュ彛鏁版嵁鎺ㄩ��'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishPDM.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishPDM.def
new file mode 100644
index 0000000..5480ace
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishPDM.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component ContextMenuPublishPDM
+{
+  #keys: '[414996.1.253210337]'
+  BaseType: 'WebContextMenu'
+  Children:
+  [
+    Component MenuPublishShiftSchedulingInformation
+    {
+      #keys: '[414996.1.253210338]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'SKIN_TIGER'
+        Taborder: 0
+        Title: '涓嬪彂鐝璁″垝淇℃伅'
+      ]
+    }
+    Component MenuMaintenanceSingleShiftConfig
+    {
+      #keys: '[414996.1.253210339]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'GEAR'
+        Taborder: 1
+        Title: '鍗曠彮娆℃爣鍑嗕骇閲忛厤缃�'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPublish_ButtonDispatchShiftSchedulingInf.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPublish_ButtonDispatchShiftSchedulingInf.def
deleted file mode 100644
index db679ee..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupPublish_ButtonDispatchShiftSchedulingInf.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: ActionBarGroupPublish/ButtonDispatchShiftSchedulingInformation
-Response OnClick () id:Response_MacroPlanner_ActionBarGroupPublish_ButtonDispatchShiftSchedulingInformation_OnClick
-{
-  #keys: '[414996.1.173765218]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      // Open view
-      ApplicationMacroPlanner.OpenView( 'DispatchShiftSchedulingInformation', this );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuMaintenanceSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuMaintenanceSingleShiftConfig.def
new file mode 100644
index 0000000..6e23ee3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuMaintenanceSingleShiftConfig.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ContextMenuPublishPDM/MenuMaintenanceSingleShiftConfig
+Response OnClick () id:Response_MacroPlanner_ContextMenuPublishPDM_MenuMaintenanceSingleShiftConfig_OnClick
+{
+  #keys: '[414996.1.253400687]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'MaintenanceSingleShiftConfig' );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuPublishShiftSchedulingInform.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuPublishShiftSchedulingInform.def
new file mode 100644
index 0000000..0fbcbca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishPDM_MenuPublishShiftSchedulingInform.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ContextMenuPublishPDM/MenuPublishShiftSchedulingInformation
+Response OnClick () id:Response_MacroPlanner_ContextMenuPublishPDM_MenuPublishShiftSchedulingInformation_OnClick
+{
+  #keys: '[414996.1.253210335]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  Precondition:
+  [*
+    
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'DispatchShiftSchedulingInformation' );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelCurve.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelCurve.def
index 48a8a79..299ec48 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelCurve.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelCurve.def
@@ -11,6 +11,7 @@
       BaseType: 'WebDropDownStringList'
       Properties:
       [
+        AllowEmpty: true
         Label: 'Curve'
         Taborder: 0
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelOrigin.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelOrigin.def
index 36444d4..8fb9e2d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelOrigin.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Component_PanelOrigin.def
@@ -14,7 +14,7 @@
         AllowEmpty: true
         DataBinding: 'DataHolderDialogData.Data.Origin'
         Label: 'Origin'
-        Strings: ';CC-TRC;DL-TRC;PPA;IDS'
+        Strings: 'CC-TRC;DL-TRC;PPA;IDS'
         Taborder: 0
       ]
     }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Response_MacroPlanner_pnlActions_bSplitUsingCurve_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Response_MacroPlanner_pnlActions_bSplitUsingCurve_OnClick.def
index 1995cc8..b27e508 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Response_MacroPlanner_pnlActions_bSplitUsingCurve_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditForecast/Response_MacroPlanner_pnlActions_bSplitUsingCurve_OnClick.def
@@ -6,6 +6,10 @@
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
+  Precondition:
+  [*
+    return DropDownStringListCurve.Text() <> "";
+  *]
   QuillAction
   {
     Body:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_ListSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_ListSingleShiftConfig.def
new file mode 100644
index 0000000..2a9fd54
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_ListSingleShiftConfig.def
@@ -0,0 +1,41 @@
+Quintiq file version 2.0
+Component ListSingleShiftConfig
+{
+  #keys: '[414996.1.249001923]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorSingleShiftConfig
+    {
+      #keys: '[414996.1.249001924]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'Unit.SingleShiftConfig'
+      ]
+    }
+    #child: listActionBarPageSingleShiftConfig
+    Component DataSetLevelSingleShiftConfig
+    {
+      #keys: '[414996.1.249001929]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuSingleShiftConfig
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Unit.ID","title":"浜х嚎","subtotals":"","tooltip":"","width":-1,"display":"always","attribute":"Unit.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShiftName","title":"鐝鍚嶇О","subtotals":"","tooltip":"","width":-1,"display":"always","editable":false,"attribute":"ShiftName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SingleShiftName","title":"鍗曠彮娆″悕绉�","subtotals":"","tooltip":"","width":-1,"display":"always","editable":false,"attribute":"SingleShiftName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StandardYield","title":"鏍囧噯浜ч噺","subtotals":"","tooltip":"","width":-1,"display":"always","editable":false,"attribute":"StandardYield"}}]'
+        ContextMenu: 'listContextMenuSingleShiftConfig'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig.def
new file mode 100644
index 0000000..e58eff1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig.def
@@ -0,0 +1,35 @@
+Quintiq file version 2.0
+Component PanelSingleShiftConfig
+{
+  #keys: '[414996.1.249001892]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bImport
+    {
+      #keys: '[414996.1.249002496]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Taborder: 0
+      ]
+    }
+    Component bExport
+    {
+      #keys: '[414996.1.249002508]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig497.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig497.def
new file mode 100644
index 0000000..5d7f263
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_PanelSingleShiftConfig497.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelSingleShiftConfig497
+{
+  #keys: '[414996.1.249001910]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListSingleShiftConfig
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listActionBarPageSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listActionBarPageSingleShiftConfig.def
new file mode 100644
index 0000000..8419785
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listActionBarPageSingleShiftConfig.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageSingleShiftConfig
+{
+  #keys: '[414996.1.249001926]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listContextMenuSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listContextMenuSingleShiftConfig.def
new file mode 100644
index 0000000..ff13d40
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Component_listContextMenuSingleShiftConfig.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuSingleShiftConfig
+{
+  #keys: '[414996.1.249001931]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bExport_OnClick.def
new file mode 100644
index 0000000..01f7739
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bExport_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelSingleShiftConfig/bExport
+Response OnClick () id:Response_PanelSingleShiftConfig_bExport_OnClick
+{
+  #keys: '[414996.1.253440400]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      Application.Download( "MP_SingleShiftConfig.xlsx",SingleShiftConfig::Export( MacroPlan ).AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bImport_OnClick.def
new file mode 100644
index 0000000..d94275e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/Response_PanelSingleShiftConfig_bImport_OnClick.def
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: PanelSingleShiftConfig/bImport
+Response OnClick () id:Response_PanelSingleShiftConfig_bImport_OnClick
+{
+  #keys: '[414996.1.253361016]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          Archive::VerifyTheFileName( uploadJson );
+                
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+              
+          webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
+          
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource.ReadStructure();
+          
+          selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "SingleShiftConfig" );
+          
+          SingleShiftConfig::Import( MacroPlan, selection );
+          
+          // 鍚庣画鍒犻櫎
+          generalExcelImportAndExportDataSource.Delete();
+          
+          WebMessageBox::Success( Translations::A_VWED_Success() );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/_ROOT_Component_FormSingleShiftConfig.def b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/_ROOT_Component_FormSingleShiftConfig.def
new file mode 100644
index 0000000..e57e3ff
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSingleShiftConfig/_ROOT_Component_FormSingleShiftConfig.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormSingleShiftConfig
+{
+  #keys: '[414996.1.249001853]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelSingleShiftConfig497
+    #child: PanelSingleShiftConfig
+  ]
+  Properties:
+  [
+    Title: '鍗曠彮娆¢厤缃�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/MaintenanceSingleShiftConfig.vw b/_Main/UI/MacroPlannerWebApp/Views/MaintenanceSingleShiftConfig.vw
new file mode 100644
index 0000000..38d8938
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/MaintenanceSingleShiftConfig.vw
@@ -0,0 +1,199 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormSingleShiftConfig
+      {
+        title: 'QMacroPlanner::FormSingleShiftConfig'
+        shown: true
+        componentID: 'QMacroPlanner::FormSingleShiftConfig'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 25
+          columnPosition: 1
+          columnSpan: 9
+        }
+        components
+        {
+          FormSingleShiftConfig_PanelSingleShiftConfig
+          {
+            sizeRatio: 1
+          }
+          FormSingleShiftConfig_PanelSingleShiftConfig497
+          {
+            sizeRatio: 1
+          }
+          FormSingleShiftConfig_ListSingleShiftConfig
+          {
+          }
+          FormSingleShiftConfig_DataSetLevelSingleShiftConfig
+          {
+            groupDepth: -1
+            column_Unit_ID
+            {
+              columnId: 'Unit.ID'
+              dataPath: 'Unit.ID'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 150
+            }
+            column_ShiftName
+            {
+              columnId: 'ShiftName'
+              dataPath: 'ShiftName'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 150
+            }
+            column_SingleShiftName
+            {
+              columnId: 'SingleShiftName'
+              dataPath: 'SingleShiftName'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 150
+            }
+            column_StandardYield
+            {
+              columnId: 'StandardYield'
+              dataPath: 'StandardYield'
+              dataType: 'real'
+              index: 3
+              subtotals: ''
+              width: 150
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    image: 'GEAR'
+    page: ''
+    group: ''
+    index: 0
+    description: ''
+  }
+  formatversion: 2
+  id: 'MaintenanceSingleShiftConfig'
+  name: 'MaintenanceSingleShiftConfig'
+  isglobal: false
+  isroot: true
+}
diff --git a/_var/_Main/Data/MP_SingleShiftConfig.xlsx b/_var/_Main/Data/MP_SingleShiftConfig.xlsx
new file mode 100644
index 0000000..cceb81c
--- /dev/null
+++ b/_var/_Main/Data/MP_SingleShiftConfig.xlsx
Binary files differ

--
Gitblit v1.9.3