From 4ea4b773425d7e7a9034c52269e6fb9d30be5904 Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期五, 12 七月 2024 17:38:36 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg

---
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def                                                               |   24 +
 _Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl                                                                                                |    7 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl                                                                                       |    2 
 _Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw                                                                          |   16 +
 _Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl                                                                         |   30 ++
 _Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl                                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def                             |   16 +
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction#633.def                                                        |   65 +++++
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def                                             |   10 
 _Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl                                                                                             |    4 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def                                                        |   97 +++++++
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def                          |   21 +
 _Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw                                                                                               |    2 
 _Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl                                                                                          |   28 ++
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                                                            |  110 ++++++++
 _Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl                                                                                |    2 
 /dev/null                                                                                                                                      |   63 ----
 _Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw                                                                                                 |    2 
 _Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl                                                                                             |   17 +
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def                               |   22 +
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                                                   |  122 +++++++++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                               |   13 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def                                        |   23 +
 _Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl                                                                                 |   30 ++
 _Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def                                                                  |   16 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def |   17 +
 27 files changed, 706 insertions(+), 70 deletions(-)

diff --git a/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl b/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl
new file mode 100644
index 0000000..3d83fd5
--- /dev/null
+++ b/_Main/BL/Type_EmployeeCost/StaticMethod_GetSalary.qbl
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetSalary (
+  const Unit owner,
+  const OvertimeMultiplier overtimeMutiplier,
+  Real overtime
+) const as Real
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    value := 0.0;
+    salaryByEmployeeTypeTree := NamedValueTree::Create();
+    traverse( owner,EmployeeCost,cost ){
+      salaryByEmployeeTypeHandle := salaryByEmployeeTypeTree.GetHandle( cost.EmployeeType().Name() );
+      salary := guard( salaryByEmployeeTypeTree.Root().Child( salaryByEmployeeTypeHandle ),null( NamedValue ));
+      // 浜х嚎浜哄憳绫诲埆1*浜烘暟*鍩烘湰宸ヨ祫1/21.75/8*宸ヤ綔鏃ュ姞鐝椂闀�*鍊嶇巼1
+      temp_salary := cost.EmployeeNumber() * cost.BaseSalary() / owner.MacroPlan().StandardWorkingDay() / 8 * overtime * overtimeMutiplier.Multiplier();
+      if( not isnull( salary )){
+        salary.SetValue( salary.GetValueAsReal() + temp_salary );
+      }else{
+        salaryByEmployeeTypeTree.Root().AddChild( salaryByEmployeeTypeHandle,temp_salary );
+      }
+      value := value + temp_salary;
+    }
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl b/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl
new file mode 100644
index 0000000..4273106
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/Method_SetBreakDayOverTimeDurction.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetBreakDayOverTimeDurction (
+  String outcome
+)
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    overtime := 0.0;
+    nextDayOvertime := 0.0;
+    if( outcome = "涓�鐝�" ){
+      overtime := 8.5;
+      nextDayOvertime := 0.0;
+    }else if( outcome = "浜岀彮" ){
+      overtime := 16;
+      nextDayOvertime := 0.5;
+    }else if(outcome = "9+9"){
+      overtime := 16;
+      nextDayOvertime := 2.5;
+    }else if(outcome = "10+10"){
+      overtime := 16;
+      nextDayOvertime := 4.5;
+    }else if(outcome = "涓夌彮"){
+      overtime := 16;
+      nextDayOvertime := 8;
+    }
+    this.RealValue( this.RealValue() + overtime + nextDayOvertime );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl b/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl
new file mode 100644
index 0000000..a5fb5ae
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/Method_SetOvertimeDurction.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetOvertimeDurction (
+  String outcome
+)
+{
+  TextBody:
+  [*
+    // rislai Jul-10-2024 (created)
+    overtime := 0.0;
+    nextDayOvertime := 0.0;
+    if( outcome = "涓�鐝�" ){
+      overtime := 0.5;
+      nextDayOvertime := 0.0;
+    }else if( outcome = "浜岀彮" ){
+      overtime := 8;
+      nextDayOvertime := 0.5;
+    }else if(outcome = "9+9"){
+      overtime := 8;
+      nextDayOvertime := 2.5;
+    }else if(outcome = "10+10"){
+      overtime := 8;
+      nextDayOvertime := 4.5;
+    }else if(outcome = "涓夌彮"){
+      overtime := 8;
+      nextDayOvertime := 8;
+    }
+    this.RealValue( this.RealValue() + overtime + nextDayOvertime );
+  *]
+}
diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
new file mode 100644
index 0000000..19ebdae
--- /dev/null
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -0,0 +1,110 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateComprehensiveHoursReport (
+  MacroPlan macroPlan,
+  const constcontent ShiftPlans shiftPlans,
+  RecycleBin owner
+) as LocalTable
+{
+  Description: '缁煎悎宸ユ椂鍒舵姤琛�'
+  TextBody:
+  [*
+    // rislai Jul-9-2024 (created)
+    table := owner.LocalTable( relnew,Name := "缁煎悎宸ユ椂鍒舵姤琛�");
+    
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    
+    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,Index := 4);
+    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    
+    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,Index := 8);
+    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    
+    units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
+    
+    rows := construct( LocalRows );
+    rowIndexTree := NamedValueTree::Create();
+    
+    cells := construct( LocalCell_Defaults );
+    cellIndexTree := NamedValueTree::Create();
+    
+    unitIndexTree := NamedValueTree::Create();
+    
+    for( i := 0; i < units.Size(); i++){
+      unit := units.Element( i );
+      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() ,CustomName := unit.ID());
+      rowHandle := rowIndexTree.GetHandle( unit.ID() );
+      rows.Add( row );
+      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
+      
+      unitIndexTree.Root().AddChild( unitIndexTree.GetHandle( unit.ID() ),i );
+    }
+    traverse( shiftPlans,Elements,shiftPlan ){
+      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
+      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+    
+      // gongchangCell := LocalCell_Default::GetCell(  rowKey + column1.Name(), cellIndexTree, cells, row, column1 );
+      // chanxianxCell := LocalCell_Default::GetCell(  rowKey + column2.Name(), cellIndexTree, cells, row, column2 );
+    
+      shengchanCell := LocalCell_Default::GetCell(  rowKey + column3.Name(), cellIndexTree, cells, row, column3 );
+      week := shiftPlan.UnitPeriodTime().Period_MP().StartDate().DayOfWeek();
+      if( shiftPlan.Outcome() <> "" ){
+        shengchanCell.RealValue( shengchanCell.RealValue() + 1 );
+        if( shiftPlan.IsHoliday() ){
+          // 鑺傚亣鏃ュ姞鐝� 
+          jiejiariCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+          jiejiariCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else if( week = 6 or week = 7 ){
+          // 浼戞伅鏃ュ姞鐝� 
+          xiuxiCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          xiuxiCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else{
+          // 骞虫椂鍔犵彮
+          jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          jiabanCell.SetOvertimeDurction( shiftPlan.Outcome() );
+        }
+      }else{
+        if( not shiftPlan.IsHoliday() and not ( week = 6 or week = 7 )){
+          qiangongCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          qiangongCell.RealValue( qiangongCell.RealValue() - 8 );
+        }
+      }
+    }
+    
+    // 骞虫椂鍔犵彮鍊嶇巼
+    defaultMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "骞虫椂鍔犵彮鍊嶇巼" );
+    if( isnull( defaultMultiplier )){
+      defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1 );
+    }
+    
+    // 浼戞伅鏃ュ姞鐝�嶇巼
+    breakDayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "浼戞伅鏃ュ姞鐝�嶇巼");
+    if( isnull( breakDayMultiplier )){
+      breakDayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "浼戞伅鏃ュ姞鐝�嶇巼",Multiplier := 2 );
+    }
+    
+    // 鑺傚亣鏃ュ姞鐝�嶇巼
+    holidayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "鑺傚亣鏃ュ姞鐝�嶇巼");
+    if( isnull( holidayMultiplier )){
+      holidayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "鑺傚亣鏃ュ姞鐝�嶇巼",Multiplier := 3 ); 
+    }
+    
+    traverse( table,LocalRow,row ){
+      rowKey := row.CustomName();
+      unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+      
+      jiejiariCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      
+      qiangongCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
new file mode 100644
index 0000000..b88493c
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -0,0 +1,122 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateStandardHoursReport (
+  MacroPlan macroPlan,
+  const constcontent ShiftPlans shiftPlans,
+  RecycleBin owner
+) as LocalTable
+{
+  Description: '鏍囧噯宸ユ椂鍒舵姤琛�'
+  TextBody:
+  [*
+    // rislai Jul-4-2024 (created)
+    table := owner.LocalTable( relnew,Name := "鏍囧噯宸ユ椂鍒舵姤琛�");
+    
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    
+    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,Index := 4);
+    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,Index := 5);
+    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,Index := 7);
+    
+    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,Index := 8);
+    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,Index := 9);
+    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,Index := 11);
+    
+    units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
+    
+    rows := construct( LocalRows );
+    rowIndexTree := NamedValueTree::Create();
+    
+    cells := construct( LocalCell_Defaults );
+    cellIndexTree := NamedValueTree::Create();
+    
+    unitIndexTree := NamedValueTree::Create();
+    
+    for( i := 0; i < units.Size(); i++){
+      unit := units.Element( i );
+      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() ,CustomName := unit.ID());
+      rowHandle := rowIndexTree.GetHandle( unit.ID() );
+      rows.Add( row );
+      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
+      
+      unitIndexTree.Root().AddChild( unitIndexTree.GetHandle( unit.ID() ),i );
+    }
+    traverse( shiftPlans,Elements,shiftPlan ){
+      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
+      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+    
+      // gongchangCell := LocalCell_Default::GetCell(  rowKey + column1.Name(), cellIndexTree, cells, row, column1 );
+      // chanxianxCell := LocalCell_Default::GetCell(  rowKey + column2.Name(), cellIndexTree, cells, row, column2 );
+    
+      shengchanCell := LocalCell_Default::GetCell(  rowKey + column3.Name(), cellIndexTree, cells, row, column3 );
+      week := shiftPlan.UnitPeriodTime().Period_MP().StartDate().DayOfWeek();
+      if( shiftPlan.Outcome() <> "" ){
+        shengchanCell.RealValue( shengchanCell.RealValue() + 1 );
+        if( shiftPlan.IsHoliday() ){
+          // 鑺傚亣鏃ュ姞鐝� 
+          jiejiariCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+          jiejiariCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else if( week = 6 or week = 7 ){
+          // 浼戞伅鏃ュ姞鐝� 
+          xiuxiCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+          xiuxiCell.SetBreakDayOverTimeDurction( shiftPlan.Outcome() );
+        }else{
+          // 骞虫椂鍔犵彮
+          jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+          jiabanCell.SetOvertimeDurction( shiftPlan.Outcome() );
+        }
+      }else{
+        if( not shiftPlan.IsHoliday() and not ( week = 6 or week = 7 )){
+          qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+          qiangongCell.RealValue( qiangongCell.RealValue() + 8 );
+        }
+      }
+    }
+    
+    // 骞虫椂鍔犵彮鍊嶇巼
+    defaultMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "骞虫椂鍔犵彮鍊嶇巼" );
+    if( isnull( defaultMultiplier )){
+      defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1 );
+    }
+    
+    // 浼戞伅鏃ュ姞鐝�嶇巼
+    breakDayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "浼戞伅鏃ュ姞鐝�嶇巼");
+    if( isnull( breakDayMultiplier )){
+      breakDayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "浼戞伅鏃ュ姞鐝�嶇巼",Multiplier := 2 );
+    }
+    
+    // 鑺傚亣鏃ュ姞鐝�嶇巼
+    holidayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "鑺傚亣鏃ュ姞鐝�嶇巼");
+    if( isnull( holidayMultiplier )){
+      holidayMultiplier := macroPlan.OvertimeMultiplier( relnew, Name := "鑺傚亣鏃ュ姞鐝�嶇巼",Multiplier := 3 ); 
+    }
+    
+    traverse( table,LocalRow,row ){
+      rowKey := row.CustomName();
+      unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
+      
+      jiejiariCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
+      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column10.Name(), cellIndexTree, cells, row, column10 );
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      
+      xiuxiCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
+      xiuxifeiCell := LocalCell_Default::GetCell(  rowKey + column9.Name(), cellIndexTree, cells, row, column9 );
+      xiuxifeiCell.RealValue( EmployeeCost::GetSalary( unit,breakDayMultiplier,xiuxiCell.RealValue()));
+      
+      jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
+      jiabanfeiCell := LocalCell_Default::GetCell(  rowKey + column8.Name(), cellIndexTree, cells, row, column8 );
+      jiabanfeiCell.RealValue( EmployeeCost::GetSalary( unit,holidayMultiplier,jiabanCell.RealValue()));
+      
+      qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column11.Name(), cellIndexTree, cells, row, column11 );
+      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
+    }
+    
+    return table;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
index 27c9816..b8e97f8 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GetCell.qbl
@@ -14,7 +14,7 @@
     cellHandle := cellIndexTree.GetHandle( cellKey );
     cellIndex := guard( cellIndexTree.Root().Child( cellHandle ),null( NamedValue ));
     cell := null( LocalCell_Default );
-    if( isnull( cell )){
+    if( isnull( cellIndex )){
        cell := row.LocalCell( relnew,LocalCell_Default,LocalColumn := column );
        cells.Add( cell );
        cellIndexTree.Root().AddChild( cellHandle,cells.Size() - 1 );
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl
deleted file mode 100644
index c7e6f6a..0000000
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_NewStaticMethod.qbl
+++ /dev/null
@@ -1,63 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod NewStaticMethod (
-  const constcontent ShiftPlans shiftPlans,
-  RecycleBin owner
-)
-{
-  TextBody:
-  [*
-    // rislai Jul-4-2024 (created)
-    table := owner.LocalTable( relnew,Name := "");
-    
-    column1 := table.LocalColumn( relnew,Name := "宸ュ巶" );
-    column2 := table.LocalColumn( relnew,Name := "浜х嚎" );
-    
-    column3 := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" );
-    column4 := table.LocalColumn( relnew,Name := "鍔犵彮鏃堕暱" );
-    column5 := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" );
-    column6 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" );
-    column7 := table.LocalColumn( relnew,Name := "鍔犵彮璐�" );
-    column8 := table.LocalColumn( relnew,Name := "娆犲伐璐�" );
-    column9 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" );
-    
-    unitIDs := selectuniquevalues( shiftPlans,Elements.UnitPeriodTime.Unit,unit,unit.ID() );
-    
-    rows := construct( LocalRows );
-    rowIndexTree := NamedValueTree::Create();
-    
-    cells := construct( LocalCell_Defaults );
-    cellIndexTree := NamedValueTree::Create();
-    
-    traverse( unitIDs,Elements,element ){
-      row := table.LocalRow( relnew,Index := table.GetRowIndexCache() );
-      rowHandle := rowIndexTree.GetHandle( element );
-      rows.Add( row );
-      rowIndexTree.Root().AddChild( rowHandle,rows.Size() - 1 );
-    }
-    
-    traverse( shiftPlans,Elements,shiftPlan ){
-      rowKey := shiftPlan.UnitPeriodTime().Unit().ID();
-      row := rows.Element( rowIndexTree.Root().Child( rowIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
-      
-      gongchangCell := LocalCell_Default::GetCell(  rowKey + "宸ュ巶", cellIndexTree, cells, row, column1 );
-      chanxianxCell := LocalCell_Default::GetCell(  rowKey + "浜х嚎", cellIndexTree, cells, row, column2 );
-      
-      shengchanCell := LocalCell_Default::GetCell(  rowKey + "鐢熶骇澶╂暟", cellIndexTree, cells, row, column3 );
-      jiabanCell := LocalCell_Default::GetCell(  rowKey + "鍔犵彮鏃堕暱", cellIndexTree, cells, row, column4 );
-      qiangongCell := LocalCell_Default::GetCell(  rowKey + "娆犲伐鏃堕暱", cellIndexTree, cells, row, column5 );
-      jiejiariCell := LocalCell_Default::GetCell(  rowKey + "鑺傚亣鏃ュ姞鐝椂闀�", cellIndexTree, cells, row, column6 );
-      
-      jiabanfeiCell := LocalCell_Default::GetCell(  rowKey + "鍔犵彮璐�", cellIndexTree, cells, row, column7 );
-      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + "娆犲伐璐�", cellIndexTree, cells, row, column8 );
-      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + "鑺傚亣鏃ュ姞鐝垂", cellIndexTree, cells, row, column9 );
-      
-      if( shiftPlan.Outcome() <> "" ){
-        
-      }else{
-        
-      }
-      
-    }
-  *]
-}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
index 64f77be..19b7ed7 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsAnyDurationContained.qbl
@@ -5,7 +5,7 @@
   DateTime end1,
   DateTime start2,
   DateTime end2
-) const declarative as Boolean
+) const declarative remote as Boolean
 {
   TextBody:
   [*
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
index e4d6bb3..8ec6afe 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_IsOverlap.qbl
@@ -5,11 +5,11 @@
   Date end1,
   Date start2,
   Date end2
-) const declarative as Boolean
+) const declarative remote as Boolean
 {
   TextBody:
   [*
     // rislai Jun-14-2024 (created)
-    return start1 < end2 and start2 < end1 ;
+    return start1 <= end2 and start2 <= end1 ;
   *]
 }
diff --git a/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl b/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl
new file mode 100644
index 0000000..8e874be
--- /dev/null
+++ b/_Main/BL/Type_MacroPlan/DefaultValue_StandardWorkingDay.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: '21.75'
+  TargetAttribute: StandardWorkingDay
+}
diff --git a/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl b/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl
new file mode 100644
index 0000000..7b96cc3
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Attribute_IsHoliday.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsHoliday
+{
+  #keys: '3[412672.1.34300030][412672.1.34300029][412672.1.34300031]'
+  ValueType: Boolean
+}
diff --git a/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl b/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl
new file mode 100644
index 0000000..64cd9e9
--- /dev/null
+++ b/_Main/BL/Type_ShiftPlan/Function_CalcIsHoliday.qbl
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIsHoliday
+{
+  TextBody:
+  [*
+    // rislai Jul-9-2024 (created)
+    
+    value := false
+    
+    if( this.EventType() = "娉曞畾鑺傚亣鏃�"){
+      value := true;
+    }
+    
+    this.IsHoliday( value );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index 8444a19..8417130 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -49,6 +49,17 @@
         Taborder: 3
       ]
     }
+    Component ButtonComprehensiveStandardHoursReport
+    {
+      #keys: '[412672.1.39734996]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_CHART'
+        Label: '宸ユ椂鍒舵姤琛�'
+        Taborder: 4
+      ]
+    }
     Component ButtonEnginePipelineReport
     {
       #keys: '[415136.0.884991586]'
@@ -57,7 +68,7 @@
       [
         Image: 'DOCUMENT_CONNECTION'
         Label: 'Engine pipeline report'
-        Taborder: 4
+        Taborder: 5
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def
new file mode 100644
index 0000000..611518a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursR.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonComprehensiveStandardHoursReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonComprehensiveStandardHoursReport_OnClick
+{
+  #keys: '[412672.1.36822187]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'ComprehensiveStandardHoursReport', ButtonComprehensiveStandardHoursReport );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
new file mode 100644
index 0000000..915e9ca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_MatrixEditor859.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor859
+{
+  #keys: '[412672.1.33151379]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell642
+    {
+      #keys: '[412672.1.33151380]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor872
+        {
+          #keys: '[412672.1.33151381]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_Default)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'RealValue'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows590
+    {
+      #keys: '[412672.1.33151384]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor862
+        {
+          #keys: '[412672.1.33151385]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns481
+    {
+      #keys: '[412672.1.33151388]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor661
+        {
+          #keys: '[412672.1.33151389]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhTable'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage681
+    #child: matrixeditorContextMenu445
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns481'
+    ContextMenu: 'matrixeditorContextMenu445'
+    Rows: 'MatrixEditorRows590'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
new file mode 100644
index 0000000..8755839
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_Panel743.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component Panel743
+{
+  #keys: '[412672.1.33151321]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor859
+    Component dhTable
+    {
+      #keys: '[412672.1.33151419]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def
new file mode 100644
index 0000000..f28ea9d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixEditorActionBarPage681.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage681
+{
+  #keys: '[412672.1.33151392]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def
new file mode 100644
index 0000000..d3ba7c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_matrixeditorContextMenu445.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu445
+{
+  #keys: '[412672.1.33151395]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def
new file mode 100644
index 0000000..1263073
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pMain.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component pMain
+{
+  #keys: '[412672.1.33151242]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: Panel743
+    #child: pOperaction
+  ]
+  Properties:
+  [
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def" "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
new file mode 100644
index 0000000..8be63c5
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Component_pOperaction\043633.def"
@@ -0,0 +1,65 @@
+Quintiq file version 2.0
+Component pOperaction
+{
+  #keys: '[412672.1.33151285]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component cbStandardHours
+    {
+      #keys: '[412672.1.33151450]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        CheckboxType: 'toggle'
+        Label: '鏍囧噯宸ユ椂鍒�'
+        Taborder: 0
+      ]
+    }
+    Component cbComprehensiveHours
+    {
+      #keys: '[412672.1.33151469]'
+      BaseType: 'WebCheckbox'
+      Properties:
+      [
+        CheckboxType: 'toggle'
+        Label: '缁煎悎宸ユ椂鍒�'
+        Taborder: 1
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.1.33151495]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.1.33151514]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Taborder: 3
+      ]
+    }
+    Component bCalculating
+    {
+      #keys: '[412672.1.33180446]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Calculating'
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def
new file mode 100644
index 0000000..32e7ad6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_bCalculating_OnClick.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: pOperaction/bCalculating
+Response OnClick () id:Response_pOperaction_bCalculating_OnClick
+{
+  #keys: '[412672.1.33160729]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      shiftPlans := selectset( MacroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan,LocalTool::IsOverlap( dsStartDate.Date(),dsEndDate.Date(),shiftPlan.UnitPeriodTime().Period_MP().StartDate(),shiftPlan.UnitPeriodTime().Period_MP().EndDate()));
+      
+      if( cbStandardHours.Checked() ){
+        dhTable.Data( LocalCell_Default::GenerateStandardHoursReport( MacroPlan ,shiftPlans ,RecycleBin )); 
+      }
+      if( cbComprehensiveHours.Checked()){
+        dhTable.Data( LocalCell_Default::GenerateComprehensiveHoursReport( MacroPlan ,shiftPlans ,RecycleBin )); 
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def
new file mode 100644
index 0000000..7f3145b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbComprehensiveHours_OnUserChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: pOperaction/cbComprehensiveHours
+Response OnUserChanged () id:Response_pOperaction_cbComprehensiveHours_OnUserChanged
+{
+  #keys: '[412672.1.33151755]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnUserChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      cbStandardHours.Checked( not this.Checked() );
+      if( this.Checked() ){
+        FormComprehensiveStandardHoursReport.Title( "缁煎悎宸ユ椂鍒舵姤琛�" );
+      }else{
+        FormComprehensiveStandardHoursReport.Title( "鏍囧噯宸ユ椂鍒舵姤琛�" );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def
new file mode 100644
index 0000000..c65fbd7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/Response_pOperaction_cbStandardHours_OnUserChanged.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pOperaction/cbStandardHours
+Response OnUserChanged () id:Response_pOperaction_cbStandardHours_OnUserChanged
+{
+  #keys: '[412672.1.33151672]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebCheckbox_OnUserChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      cbComprehensiveHours.Checked( not this.Checked() );
+      
+      if( this.Checked() ){
+        FormComprehensiveStandardHoursReport.Title( "鏍囧噯宸ユ椂鍒舵姤琛�" );
+      }else{
+        FormComprehensiveStandardHoursReport.Title( "缁煎悎宸ユ椂鍒舵姤琛�" );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def
new file mode 100644
index 0000000..5a8f45a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_StandardHoursReport/_ROOT_Component_FormComprehensiveStandardHoursReport.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormComprehensiveStandardHoursReport
+{
+  #keys: '[412672.1.33151116]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pMain
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_CHART'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw b/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw
new file mode 100644
index 0000000..97583b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/ComprehensiveStandardHoursReport.vw
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    page: ''
+    group: ''
+    index: 0
+    image: 'DOCUMENT_CHART'
+    description: ''
+  }
+  formatversion: 2
+  id: 'ComprehensiveStandardHoursReport'
+  name: 'ComprehensiveStandardHoursReport'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
index 6bec5b0..f547af8 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Labor_Costs.vw
@@ -2,10 +2,10 @@
 {
   viewcontents
   {
+    image: 'MONEY_BILL_FIRE'
     page: ''
     group: ''
     index: 0
-    image: 'MONEY_BILL_FIRE'
     description: ''
   }
   formatversion: 2
diff --git a/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
index 1caecfc..7ecffee 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/ShiftPlan.vw
@@ -2,10 +2,10 @@
 {
   viewcontents
   {
+    image: 'COMPASSES'
     page: ''
     group: ''
     index: 0
-    image: 'COMPASSES'
     description: ''
   }
   formatversion: 2

--
Gitblit v1.9.3