EN · DE · RU · FR · ES

#3073: PersonalStatisticsPage.java

projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java Java-Klasse, projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java 121 Zeilen · 88 Code · 22 Kommentare · 11 leer
Zweck: Quelldatei: projectforge/web/statistics/PersonalStatisticsPage.java. PersonalStatisticsPage.java ist Teil der Open-Source-Projektmanagement-Anwendung ProjectForge.

Quellcode (erste 100 Zeilen)

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2026 Micromata GmbH, Germany (www.micromata.com)
//
// ProjectForge ist dual-lizenziert.
//
// Diese Community-Edition ist freie Software; Sie können sie weitergeben und/oder
// modifizieren unter den Bedingungen der GNU General Public License, wie sie von
// der Free Software Foundation veröffentlicht wurde; Version 3 der Lizenz.
//
// Diese Community-Edition wird in der Hoffnung verbreitet, dass sie nützlich sein wird,
// aber OHNE JEDE GEWÄHRLEISTUNG; ohne sogar die stillschweigende Gewährleistung der
// MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU General
// Public License für weitere Details.
//
// Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
// Programm erhalten haben; falls nicht, siehe http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.web.statistics;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jfree.chart.JFreeChart;
import org.projectforge.business.fibu.EmployeeCache;
import org.projectforge.business.fibu.EmployeeDO;
import org.projectforge.business.timesheet.TimesheetDao;
import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext;
import org.projectforge.framework.utils.NumberHelper;
import org.projectforge.statistics.TimesheetDisciplineChartBuilder;
import org.projectforge.web.WicketSupport;
import org.projectforge.web.wicket.AbstractSecuredPage;
import org.projectforge.web.wicket.JFreeChartImage;

import java.math.BigDecimal;
import java.text.NumberFormat;

public class PersonalStatisticsPage extends AbstractSecuredPage {
    private static final long serialVersionUID = 5957430109012640203L;

    private static final short LAST_N_DAYS = 45;

    private static final int IMAGE_WIDTH = 500;

    private static final int IMAGE_HEIGHT = 400;

    public PersonalStatisticsPage(final PageParameters parameters) {
        super(parameters);
        final TimesheetDao timesheetDao = WicketSupport.get(TimesheetDao.class);
        final Label timesheetDisciplineChartTitle = new Label("timesheetDisciplineChartTitle",
                getString("personal.statistics.timesheetDisciplineChart.title"));
        body.add(timesheetDisciplineChartTitle);
        final EmployeeDO employee = EmployeeCache.getInstance().getEmployeeByUserId(ThreadLocalUserContext.getLoggedInUserId());
        double workingHoursPerDay = 8;
        if (employee != null && NumberHelper.isGreaterZero(employee.getWeeklyWorkingHours())) {
            workingHoursPerDay = employee.getWeeklyWorkingHours().doubleValue() / 5;
        }
        final TimesheetDisciplineChartBuilder chartBuilder = new TimesheetDisciplineChartBuilder();
        final double innerWorkingDaysPerDay = workingHoursPerDay;
        IModel<JFreeChart> chart1 = new LoadableDetachableModel<>() {
            @Override
            protected JFreeChart load() {
                return chartBuilder.create(timesheetDao, getUser().getId(), innerWorkingDaysPerDay, LAST_N_DAYS, true);
            }
        };
        JFreeChartImage image = new JFreeChartImage("timesheetStatisticsImage1", chart1, IMAGE_WIDTH, IMAGE_HEIGHT);
        image.add(AttributeModifier.replace("width", String.valueOf(IMAGE_WIDTH)));
        image.add(AttributeModifier.replace("height", String.valueOf(IMAGE_HEIGHT)));
        body.add(image);
        final NumberFormat format = NumberFormat.getNumberInstance(ThreadLocalUserContext.getLocale());
        final String planHours = "<span style=\"color: #DE1821; font-weight: bold;\">"
                + format.format(chartBuilder.getPlanWorkingHours())
                + "</span>";
        final String actualHours = "<span style=\"color: #40A93B; font-weight: bold;\">"
                + format.format(chartBuilder.getActualWorkingHours())
                + "</span>";
        final String numberOfDays = String.valueOf(LAST_N_DAYS);
        final Label timesheetDisciplineChart1Legend = new Label("timesheetDisciplineChart1Legend", getLocalizedMessage(
                "personal.statistics.timesheetDisciplineChart1.legend", numberOfDays, planHours, actualHours));
        timesheetDisciplineChart1Legend.setEscapeModelStrings(false);
        body.add(timesheetDisciplineChart1Legend);

        IModel<JFreeChart> chart2 = new LoadableDetachableModel<>() {
            @Override
            protected JFreeChart load() {
                return chartBuilder.create(timesheetDao, getUser().getId(), 0, LAST_N_DAYS, false);
            }
        };
        image = new JFreeChartImage("timesheetStatisticsImage2", chart2, IMAGE_WIDTH, IMAGE_HEIGHT);
        image.add(AttributeModifier.replace("width", String.valueOf(IMAGE_WIDTH)));
        image.add(AttributeModifier.replace("height", String.valueOf(IMAGE_HEIGHT)));
        body.add(image);
        BigDecimal averageBetweenBookings = chartBuilder.getAverageDifferenceBetweenTimesheetAndBooking();

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelldatei-Header: 2024 -> 2025.
3785f8347 Migration läuft...
c14b18a48 Migration läuft... (alle Tests aller Pakete: OK).
67805f2fc ThreadLocalUserContext.user -> ThreadLocalUserContext.loggedInUser (umbenannt, um Missverständnisse im Code zu vermeiden).

868d6abb7

2025 -> 2026
868d6abb75cd191a892911ac8e45058932cf9074
diff --git a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
index 4b64aace9..7ff379f38 100644
--- a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
+++ b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
@@ -3,7 +3,7 @@
 // Project ProjectForge Community Edition
 //         www.projectforge.org
 //
-// Copyright (C) 2001-2025 Micromata GmbH, Germany (www.micromata.com)
+// Copyright (C) 2001-2026 Micromata GmbH, Germany (www.micromata.com)
 //
 // ProjectForge is dual-licensed.
 //

63081666f

Quelldatei-Header: 2024 -> 2025.
63081666f620fb87315f01b817e560e0b2f6a33a
diff --git a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
index ff02d49c9..4b64aace9 100644
--- a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
+++ b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
@@ -3,7 +3,7 @@
 // Project ProjectForge Community Edition
 //         www.projectforge.org
 //
-// Copyright (C) 2001-2024 Micromata GmbH, Germany (www.micromata.com)
+// Copyright (C) 2001-2025 Micromata GmbH, Germany (www.micromata.com)
 //
 // ProjectForge is dual-licensed.
 //

3785f8347

Migration läuft...
3785f83479d2e37e6410950c957b0848c19f30ea
diff --git a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
index f0aeca364..ff02d49c9 100644
--- a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
+++ b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
@@ -25,6 +25,8 @@ package org.projectforge.web.statistics;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.jfree.chart.JFreeChart;
 import org.projectforge.business.fibu.EmployeeCache;
@@ -37,6 +39,7 @@ import org.projectforge.web.WicketSupport;
 import org.projectforge.web.wicket.AbstractSecuredPage;
 import org.projectforge.web.wicket.JFreeChartImage;
 
+import java.math.BigDecimal;
 import java.text.NumberFormat;
 
 public class PersonalStatisticsPage extends AbstractSecuredPage {
@@ -60,7 +63,13 @@ public class PersonalStatisticsPage extends AbstractSecuredPage {
             workingHoursPerDay = employee.getWeeklyWorkingHours().doubleValue() / 5;
         }
         final TimesheetDisciplineChartBuilder chartBuilder = new TimesheetDisciplineChartBuilder();
-        final JFreeChart chart1 = chartBuilder.create(timesheetDao, getUser().getId(), workingHoursPerDay, LAST_N_DAYS, true);
+        final double innerWorkingDaysPerDay = workingHoursPerDay;
+        IModel<JFreeChart> chart1 = new LoadableDetachableModel<>() {
+            @Override
+            protected JFreeChart load() {
+                return chartBuilder.create(timesheetDao, getUser().getId(), innerWorkingDaysPerDay, LAST_N_DAYS, true);
+            }
+        };
         JFreeChartImage image = new JFreeChartImage("timesheetStatisticsImage1", chart1, IMAGE_WIDTH, IMAGE_HEIGHT);
         image.add(AttributeModifier.replace("width", String.valueOf(IMAGE_WIDTH)));
         image.add(AttributeModifier.replace("height", String.valueOf(IMAGE_HEIGHT)));
@@ -78,13 +87,22 @@ public class PersonalStatisticsPage extends AbstractSecuredPage {
         timesheetDisciplineChart1Legend.setEscapeModelStrings(false);
         body.add(timesheetDisciplineChart1Legend);
 
-        final JFreeChart chart2 = chartBuilder.create(timesheetDao, getUser().getId(), 0, LAST_N_DAYS, false);
+        IModel<JFreeChart> chart2 = new LoadableDetachableModel<>() {
+            @Override
+            protected JFreeChart load() {
+                return chartBuilder.create(timesheetDao, getUser().getId(), 0, LAST_N_DAYS, false);
+            }
+        };
         image = new JFreeChartImage("timesheetStatisticsImage2", chart2, IMAGE_WIDTH, IMAGE_HEIGHT);
         image.add(AttributeModifier.replace("width", String.valueOf(IMAGE_WIDTH)));
         image.add(AttributeModifier.replace("height", String.valueOf(IMAGE_HEIGHT)));
         body.add(image);
+        BigDecimal averageBetweenBookings = chartBuilder.getAverageDifferenceBetweenTimesheetAndBooking();
+        if (averageBetweenBookings == null) {
+            averageBetweenBookings = BigDecimal.ZERO;
+        }
         final String averageDifference = "<span style=\"color: #DE1821; font-weight: bold;\">"
-                + format.format(chartBuilder.getAverageDifferenceBetweenTimesheetAndBooking())
+                + format.format(averageBetweenBookings)
                 + "</span>";

c14b18a48

Migration läuft... (alle Tests aller Pakete: OK).
c14b18a481323a2c60c10d0f7358e7b503b662c9
diff --git a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
index bf11890e8..f0aeca364 100644
--- a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
+++ b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
@@ -27,8 +27,8 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.jfree.chart.JFreeChart;
+import org.projectforge.business.fibu.EmployeeCache;
 import org.projectforge.business.fibu.EmployeeDO;
-import org.projectforge.business.fibu.EmployeeDao;
 import org.projectforge.business.timesheet.TimesheetDao;
 import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext;
 import org.projectforge.framework.utils.NumberHelper;
@@ -39,69 +39,65 @@ import org.projectforge.web.wicket.JFreeChartImage;
 
 import java.text.NumberFormat;
 
-public class PersonalStatisticsPage extends AbstractSecuredPage
-{
-  private static final long serialVersionUID = 5957430109012640203L;
+public class PersonalStatisticsPage extends AbstractSecuredPage {
+    private static final long serialVersionUID = 5957430109012640203L;
 
-  private static final short LAST_N_DAYS = 45;
+    private static final short LAST_N_DAYS = 45;
 
-  private static final int IMAGE_WIDTH = 500;
+    private static final int IMAGE_WIDTH = 500;
 
-  private static final int IMAGE_HEIGHT = 400;
+    private static final int IMAGE_HEIGHT = 400;
 
-  public PersonalStatisticsPage(final PageParameters parameters)
-  {
-    super(parameters);
-    final EmployeeDao employeeDao = WicketSupport.get(EmployeeDao.class);
-    final TimesheetDao timesheetDao = WicketSupport.get(TimesheetDao.class);
-    final Label timesheetDisciplineChartTitle = new Label("timesheetDisciplineChartTitle",
-        getString("personal.statistics.timesheetDisciplineChart.title"));
-    body.add(timesheetDisciplineChartTitle);
-    final EmployeeDO employee = employeeDao.findByUserId(ThreadLocalUserContext.getLoggedInUserId());
-    double workingHoursPerDay = 8;
-    if (employee != null && NumberHelper.isGreaterZero(employee.getWeeklyWorkingHours())) {
-      workingHoursPerDay = employee.getWeeklyWorkingHours().doubleValue() / 5;
-    }
-    final TimesheetDisciplineChartBuilder chartBuilder = new TimesheetDisciplineChartBuilder();
-    final JFreeChart chart1 = chartBuilder.create(timesheetDao, getUser().getId(), workingHoursPerDay, LAST_N_DAYS, true);
-    JFreeChartImage image = new JFreeChartImage("timesheetStatisticsImage1", chart1, IMAGE_WIDTH, IMAGE_HEIGHT);
-    image.add(AttributeModifier.replace("width", String.valueOf(IMAGE_WIDTH)));
-    image.add(AttributeModifier.replace("height", String.valueOf(IMAGE_HEIGHT)));
-    body.add(image);
-    final NumberFormat format = NumberFormat.getNumberInstance(ThreadLocalUserContext.getLocale());
-    final String planHours = "<span style=\"color: #DE1821; font-weight: bold;\">"
-        + format.format(chartBuilder.getPlanWorkingHours())
-        + "</span>";
-    final String actualHours = "<span style=\"color: #40A93B; font-weight: bold;\">"
-        + format.format(chartBuilder.getActualWorkingHours())
-        + "</span>";

67805f2fc

ThreadLocalUserContext.user -> ThreadLocalUserContext.loggedInUser (umbenannt, um Missverständnisse im Code zu vermeiden).
67805f2fc1f3e6a6393accb4a757a8f4049b001c
diff --git a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
index 00bd41a14..bf11890e8 100644
--- a/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
+++ b/projectforge-wicket/src/main/java/org/projectforge/web/statistics/PersonalStatisticsPage.java
@@ -57,7 +57,7 @@ public class PersonalStatisticsPage extends AbstractSecuredPage
     final Label timesheetDisciplineChartTitle = new Label("timesheetDisciplineChartTitle",
         getString("personal.statistics.timesheetDisciplineChart.title"));
     body.add(timesheetDisciplineChartTitle);
-    final EmployeeDO employee = employeeDao.findByUserId(ThreadLocalUserContext.getUserId());
+    final EmployeeDO employee = employeeDao.findByUserId(ThreadLocalUserContext.getLoggedInUserId());
     double workingHoursPerDay = 8;
     if (employee != null && NumberHelper.isGreaterZero(employee.getWeeklyWorkingHours())) {
       workingHoursPerDay = employee.getWeeklyWorkingHours().doubleValue() / 5;