Merge pull request #48 from dgray16/master
Extend LibrePlan statistics.
This commit is contained in:
commit
c21a8346ef
17 changed files with 359 additions and 224 deletions
11
HACKING.rst
11
HACKING.rst
|
|
@ -208,7 +208,7 @@ openSUSE
|
||||||
Microsoft Windows
|
Microsoft Windows
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
* Download and install latest Java Development Kit 7u80 (JDK7u80)::
|
* Download and install latest Java Development Kit 7uXX (JDK7uXX)::
|
||||||
|
|
||||||
# http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
|
# http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
|
||||||
|
|
||||||
|
|
@ -228,8 +228,6 @@ Microsoft Windows
|
||||||
# Copy downloaded *.jar file to JAVA_HOME location: (e.g. C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext)
|
# Copy downloaded *.jar file to JAVA_HOME location: (e.g. C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext)
|
||||||
# Put downloaded *.jar file to Tomcat lib location: (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib)
|
# Put downloaded *.jar file to Tomcat lib location: (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib)
|
||||||
|
|
||||||
# http://sourceforge.net/projects/libreplan/files/LibrePlan/
|
|
||||||
|
|
||||||
* Create database::
|
* Create database::
|
||||||
|
|
||||||
CREATE DATABASE libreplan;
|
CREATE DATABASE libreplan;
|
||||||
|
|
@ -270,7 +268,8 @@ Microsoft Windows
|
||||||
|
|
||||||
* Configure Apache Tomcat Server
|
* Configure Apache Tomcat Server
|
||||||
|
|
||||||
# Go to (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\) and create there libreplan.xml file with this lines of code:
|
* Go to (e.g. C:/Program Files/Apache Software Foundation/Tomcat 6.0/conf/Catalina/localhost/)
|
||||||
|
and create there libreplan.xml file with this lines of code::
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
|
@ -294,9 +293,9 @@ Microsoft Windows
|
||||||
|
|
||||||
# You need to set it to your JDK installed directory (e.g. C:\Program Files\Java\jdk1.7.0_80)
|
# You need to set it to your JDK installed directory (e.g. C:\Program Files\Java\jdk1.7.0_80)
|
||||||
|
|
||||||
* Add path of unpacked distributions bin directory of Maven to 'Path' environment variable
|
* Add path of unpacked distributions bin directory of Maven to 'Path' environment variable
|
||||||
|
|
||||||
# (e.g. C:\Program Files\apache-maven-3.3.3\bin)
|
# (e.g. C:/Program Files/apache-maven-3.3.3/bin)
|
||||||
|
|
||||||
* Compile project::
|
* Compile project::
|
||||||
|
|
||||||
|
|
|
||||||
11
INSTALL.rst
11
INSTALL.rst
|
|
@ -326,7 +326,7 @@ Microsoft Windows
|
||||||
|
|
||||||
Instructions:
|
Instructions:
|
||||||
|
|
||||||
* Download and install latest Java Runtime Environment 7u80 (JRE7u80)::
|
* Download and install latest Java Runtime Environment 7uXX (JRE7uXX)::
|
||||||
|
|
||||||
# http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
|
# http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
|
||||||
|
|
||||||
|
|
@ -375,10 +375,13 @@ Instructions:
|
||||||
|
|
||||||
* Configure Apache Tomcat Server
|
* Configure Apache Tomcat Server
|
||||||
|
|
||||||
# Put libreplan.war file to Apache Tomcat webapps folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\)
|
* Put libreplan.war file to Apache Tomcat webapps folder (e.g. C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/)
|
||||||
# Go to localhost folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\) and create there libreplan.xml file with this lines of code:
|
|
||||||
|
* Go to localhost folder (e.g. C:/Program Files/Apache Software Foundation/Tomcat 6.0/conf/Catalina/localhost/)
|
||||||
|
and create there libreplan.xml file with this lines of code::
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<Context antiJARLocking="true" path="">
|
<Context antiJARLocking="true" path="">
|
||||||
<Resource name="jdbc/libreplan-ds" auth="Container"
|
<Resource name="jdbc/libreplan-ds" auth="Container"
|
||||||
type="javax.sql.DataSource"
|
type="javax.sql.DataSource"
|
||||||
|
|
@ -390,7 +393,7 @@ Instructions:
|
||||||
|
|
||||||
* Start Apache Tomcat server
|
* Start Apache Tomcat server
|
||||||
|
|
||||||
# Example location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe
|
# Example location: C:/Program Files/Apache Software Foundation/Tomcat 6.0/bin/Tomcat6.exe
|
||||||
|
|
||||||
* Go to http://localhost:8080/libreplan
|
* Go to http://localhost:8080/libreplan
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@ How To Start Development With JetBrains Intellij IDEA
|
||||||
:Contact: vova@libreplan-enterprise.com
|
:Contact: vova@libreplan-enterprise.com
|
||||||
:Date: 09/09/2015
|
:Date: 09/09/2015
|
||||||
:Copyright:
|
:Copyright:
|
||||||
Some rights reserved. This document is distributed under the Creative
|
Some rights reserved. This document is distributed under the Creative
|
||||||
Commons Attribution-ShareAlike 3.0 licence, available in
|
Commons Attribution-ShareAlike 3.0 licence, available in
|
||||||
http://creativecommons.org/licenses/by-sa/3.0/.
|
http://creativecommons.org/licenses/by-sa/3.0/.
|
||||||
:Abstract:
|
:Abstract:
|
||||||
Quick guide to start the development of LibrePlan_ using JetBrains Intellij IDEA_ IDE.
|
Quick guide to start the development of LibrePlan_ using JetBrains Intellij IDEA_ IDE.
|
||||||
As this is the most common way of work among LibrePlan developers team.
|
As this is the most common way of work among LibrePlan developers team.
|
||||||
|
|
||||||
.. contents:: Table of Contents
|
.. contents:: Table of Contents
|
||||||
|
|
@ -20,8 +20,7 @@ How To Start Development With JetBrains Intellij IDEA
|
||||||
Download LibrePlan source code
|
Download LibrePlan source code
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
* You need to download LibrePlan_ source code to start hacking on it. You have two
|
* You need to download LibrePlan_ source code to start hacking on it. You have two options:
|
||||||
options:
|
|
||||||
|
|
||||||
a) Clone Git repository (recommended)::
|
a) Clone Git repository (recommended)::
|
||||||
|
|
||||||
|
|
@ -46,7 +45,7 @@ Import LibrePlan project
|
||||||
|
|
||||||
* Select directory with source code of Libreplan
|
* Select directory with source code of Libreplan
|
||||||
|
|
||||||
# e.g. C\Users\PC-User\IdeaProjects\libreplan
|
# e.g. C/Users/PC-User/IdeaProjects/libreplan
|
||||||
|
|
||||||
* Select *Import project from external model* > *Maven* and click *Next*
|
* Select *Import project from external model* > *Maven* and click *Next*
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,7 @@ import org.libreplan.business.workingday.IntraDayDate;
|
||||||
import org.libreplan.business.workreports.daos.IWorkReportLineDAO;
|
import org.libreplan.business.workreports.daos.IWorkReportLineDAO;
|
||||||
import org.libreplan.business.workreports.entities.WorkReportLine;
|
import org.libreplan.business.workreports.entities.WorkReportLine;
|
||||||
|
|
||||||
public abstract class OrderElement extends IntegrationEntity implements
|
public abstract class OrderElement extends IntegrationEntity implements ICriterionRequirable, ITreeNode<OrderElement> {
|
||||||
ICriterionRequirable, ITreeNode<OrderElement> {
|
|
||||||
|
|
||||||
protected InfoComponentWithCode infoComponent = new InfoComponentWithCode();
|
protected InfoComponentWithCode infoComponent = new InfoComponentWithCode();
|
||||||
|
|
||||||
|
|
@ -1119,7 +1118,7 @@ public abstract class OrderElement extends IntegrationEntity implements
|
||||||
}
|
}
|
||||||
|
|
||||||
public Order getOrder() {
|
public Order getOrder() {
|
||||||
if (parent == null) {
|
if ( parent == null ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return parent.getOrder();
|
return parent.getOrder();
|
||||||
|
|
@ -1142,11 +1141,9 @@ public abstract class OrderElement extends IntegrationEntity implements
|
||||||
this.taskQualityForms = taskQualityForms;
|
this.taskQualityForms = taskQualityForms;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TaskQualityForm addTaskQualityForm(QualityForm qualityForm)
|
public TaskQualityForm addTaskQualityForm(QualityForm qualityForm) throws ValidationException {
|
||||||
throws ValidationException {
|
|
||||||
ckeckUniqueQualityForm(qualityForm);
|
ckeckUniqueQualityForm(qualityForm);
|
||||||
TaskQualityForm taskQualityForm = TaskQualityForm.create(this,
|
TaskQualityForm taskQualityForm = TaskQualityForm.create(this, qualityForm);
|
||||||
qualityForm);
|
|
||||||
this.taskQualityForms.add(taskQualityForm);
|
this.taskQualityForms.add(taskQualityForm);
|
||||||
return taskQualityForm;
|
return taskQualityForm;
|
||||||
}
|
}
|
||||||
|
|
@ -1155,14 +1152,15 @@ public abstract class OrderElement extends IntegrationEntity implements
|
||||||
this.taskQualityForms.remove(taskQualityForm);
|
this.taskQualityForms.remove(taskQualityForm);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ckeckUniqueQualityForm(QualityForm qualityForm)
|
private void ckeckUniqueQualityForm(QualityForm qualityForm) throws ValidationException, IllegalArgumentException {
|
||||||
throws ValidationException, IllegalArgumentException {
|
|
||||||
Validate.notNull(qualityForm);
|
Validate.notNull(qualityForm);
|
||||||
for (TaskQualityForm taskQualityForm : getTaskQualityForms()) {
|
for (TaskQualityForm taskQualityForm : getTaskQualityForms()) {
|
||||||
if (qualityForm.equals(taskQualityForm.getQualityForm())) {
|
if ( qualityForm.equals(taskQualityForm.getQualityForm()) ) {
|
||||||
throw new ValidationException(ValidationException.invalidValue(
|
throw new ValidationException(ValidationException.invalidValue(
|
||||||
_("Quality form already exists"), "name",
|
_("Quality form already exists"),
|
||||||
qualityForm.getName(), qualityForm));
|
"name",
|
||||||
|
qualityForm.getName(),
|
||||||
|
qualityForm));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,7 @@ public class TaskQualityFormItem implements INewObject {
|
||||||
public final static String propertyPassed = "passed";
|
public final static String propertyPassed = "passed";
|
||||||
|
|
||||||
static TaskQualityFormItem create(QualityFormItem qualityFormItem) {
|
static TaskQualityFormItem create(QualityFormItem qualityFormItem) {
|
||||||
TaskQualityFormItem taskQualityFormItem = new TaskQualityFormItem(
|
TaskQualityFormItem taskQualityFormItem = new TaskQualityFormItem(qualityFormItem);
|
||||||
qualityFormItem);
|
|
||||||
taskQualityFormItem.setNewObject(true);
|
taskQualityFormItem.setNewObject(true);
|
||||||
return taskQualityFormItem;
|
return taskQualityFormItem;
|
||||||
}
|
}
|
||||||
|
|
@ -125,11 +124,11 @@ public class TaskQualityFormItem implements INewObject {
|
||||||
|
|
||||||
@AssertTrue(message = "percentage should be greater than 0% and less than 100%")
|
@AssertTrue(message = "percentage should be greater than 0% and less than 100%")
|
||||||
public boolean isQualityFormItemPercentageConstraint() {
|
public boolean isQualityFormItemPercentageConstraint() {
|
||||||
if (percentage == null) {
|
if ( percentage == null ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ((percentage.compareTo(new BigDecimal(100).setScale(2)) <= 0)
|
if ( (percentage.compareTo(new BigDecimal(100).setScale(2)) <= 0) &&
|
||||||
&& (percentage.compareTo(new BigDecimal(0).setScale(2)) > 0)) {
|
(percentage.compareTo(new BigDecimal(0).setScale(2)) > 0) ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -137,7 +136,7 @@ public class TaskQualityFormItem implements INewObject {
|
||||||
|
|
||||||
@AssertTrue(message = "date not specified")
|
@AssertTrue(message = "date not specified")
|
||||||
public boolean isIfDateCanBeNullConstraint() {
|
public boolean isIfDateCanBeNullConstraint() {
|
||||||
if ((passed == null) || (!passed)) {
|
if ( (passed == null) || (!passed) ) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return (date != null);
|
return (date != null);
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,14 @@ import org.libreplan.importers.JiraRESTClient;
|
||||||
import org.libreplan.importers.TimSoapClient;
|
import org.libreplan.importers.TimSoapClient;
|
||||||
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
|
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
|
||||||
import org.libreplan.web.orders.IOrderModel;
|
import org.libreplan.web.orders.IOrderModel;
|
||||||
|
import org.libreplan.web.expensesheet.IExpenseSheetModel;
|
||||||
|
import org.libreplan.web.materials.IMaterialsModel;
|
||||||
|
import org.libreplan.web.orders.IAssignedTaskQualityFormsToOrderElementModel;
|
||||||
|
import org.libreplan.web.resources.machine.IMachineModel;
|
||||||
|
import org.libreplan.web.resources.worker.IWorkerModel;
|
||||||
|
import org.libreplan.web.security.SecurityUtils;
|
||||||
|
import org.libreplan.web.workreports.IWorkReportModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.ldap.core.DistinguishedName;
|
import org.springframework.ldap.core.DistinguishedName;
|
||||||
import org.springframework.ldap.core.LdapTemplate;
|
import org.springframework.ldap.core.LdapTemplate;
|
||||||
import org.springframework.ldap.core.support.DefaultDirObjectFactory;
|
import org.springframework.ldap.core.support.DefaultDirObjectFactory;
|
||||||
|
|
@ -115,8 +123,7 @@ import org.zkoss.zul.impl.InputElement;
|
||||||
*/
|
*/
|
||||||
public class ConfigurationController extends GenericForwardComposer {
|
public class ConfigurationController extends GenericForwardComposer {
|
||||||
|
|
||||||
private static final Log LOG = LogFactory
|
private static final Log LOG = LogFactory.getLog(ConfigurationController.class);
|
||||||
.getLog(ConfigurationController.class);
|
|
||||||
|
|
||||||
private final ProgressTypeRenderer progressTypeRenderer = new ProgressTypeRenderer();
|
private final ProgressTypeRenderer progressTypeRenderer = new ProgressTypeRenderer();
|
||||||
|
|
||||||
|
|
@ -134,6 +141,24 @@ public class ConfigurationController extends GenericForwardComposer {
|
||||||
|
|
||||||
private IOrderModel orderModel;
|
private IOrderModel orderModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IWorkReportModel workReportModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IWorkerModel workerModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMachineModel machineModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IExpenseSheetModel expenseSheetModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMaterialsModel materialsModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IAssignedTaskQualityFormsToOrderElementModel assignedQualityFormsModel;
|
||||||
|
|
||||||
private IMessagesForUser messages;
|
private IMessagesForUser messages;
|
||||||
|
|
||||||
private Component messagesContainer;
|
private Component messagesContainer;
|
||||||
|
|
@ -166,8 +191,6 @@ public class ConfigurationController extends GenericForwardComposer {
|
||||||
|
|
||||||
private Textbox emailSenderTextbox;
|
private Textbox emailSenderTextbox;
|
||||||
|
|
||||||
private boolean isGatheredStatsAlreadySent = false;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doAfterCompose(Component comp) throws Exception {
|
public void doAfterCompose(Component comp) throws Exception {
|
||||||
super.doAfterCompose(comp);
|
super.doAfterCompose(comp);
|
||||||
|
|
@ -266,13 +289,9 @@ public class ConfigurationController extends GenericForwardComposer {
|
||||||
messages.showMessage(Level.INFO, _("Changes saved"));
|
messages.showMessage(Level.INFO, _("Changes saved"));
|
||||||
|
|
||||||
// Send data to server
|
// Send data to server
|
||||||
if (!isGatheredStatsAlreadySent && configurationDAO.getConfigurationWithReadOnlyTransaction()
|
if ( !SecurityUtils.isGatheredStatsAlreadySent &&
|
||||||
.isAllowToGatherUsageStatsEnabled()) {
|
configurationDAO.getConfigurationWithReadOnlyTransaction().isAllowToGatherUsageStatsEnabled() )
|
||||||
GatheredUsageStats gatheredUsageStats = new GatheredUsageStats();
|
sendDataToServer();
|
||||||
gatheredUsageStats.setupNotAutowiredClasses(userDAO, orderModel);
|
|
||||||
gatheredUsageStats.sendGatheredUsageStatsToServer();
|
|
||||||
isGatheredStatsAlreadySent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getSelectedConnector() != null
|
if (getSelectedConnector() != null
|
||||||
&& !configurationModel
|
&& !configurationModel
|
||||||
|
|
@ -297,6 +316,16 @@ public class ConfigurationController extends GenericForwardComposer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendDataToServer(){
|
||||||
|
GatheredUsageStats gatheredUsageStats = new GatheredUsageStats();
|
||||||
|
|
||||||
|
gatheredUsageStats.setupNotAutowiredClasses(userDAO, orderModel, workReportModel, workerModel, machineModel,
|
||||||
|
expenseSheetModel, materialsModel, assignedQualityFormsModel);
|
||||||
|
|
||||||
|
gatheredUsageStats.sendGatheredUsageStatsToServer();
|
||||||
|
SecurityUtils.isGatheredStatsAlreadySent = true;
|
||||||
|
}
|
||||||
|
|
||||||
public void cancel() throws InterruptedException {
|
public void cancel() throws InterruptedException {
|
||||||
configurationModel.cancel();
|
configurationModel.cancel();
|
||||||
messages.clearMessages();
|
messages.clearMessages();
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,12 @@ package org.libreplan.web.common;
|
||||||
import org.libreplan.business.common.VersionInformation;
|
import org.libreplan.business.common.VersionInformation;
|
||||||
import org.libreplan.business.users.daos.IUserDAO;
|
import org.libreplan.business.users.daos.IUserDAO;
|
||||||
import org.libreplan.web.orders.IOrderModel;
|
import org.libreplan.web.orders.IOrderModel;
|
||||||
|
import org.libreplan.web.expensesheet.IExpenseSheetModel;
|
||||||
|
import org.libreplan.web.materials.IMaterialsModel;
|
||||||
|
import org.libreplan.web.orders.IAssignedTaskQualityFormsToOrderElementModel;
|
||||||
|
import org.libreplan.web.resources.machine.IMachineModel;
|
||||||
|
import org.libreplan.web.resources.worker.IWorkerModel;
|
||||||
|
import org.libreplan.web.workreports.IWorkReportModel;
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.springframework.security.web.authentication.WebAuthenticationDetails;
|
import org.springframework.security.web.authentication.WebAuthenticationDetails;
|
||||||
import org.zkoss.json.JSONObject;
|
import org.zkoss.json.JSONObject;
|
||||||
|
|
@ -28,7 +34,7 @@ import java.util.Properties;
|
||||||
*
|
*
|
||||||
* Created by
|
* Created by
|
||||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
* on 02/08/2016.
|
* on 02.08.2016.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GatheredUsageStats {
|
public class GatheredUsageStats {
|
||||||
|
|
@ -37,9 +43,22 @@ public class GatheredUsageStats {
|
||||||
|
|
||||||
private IOrderModel orderModel;
|
private IOrderModel orderModel;
|
||||||
|
|
||||||
|
private IWorkReportModel workReportModel;
|
||||||
|
|
||||||
// Version of this statistics implementation
|
private IWorkerModel workerModel;
|
||||||
private int jsonObjectVersion = 1;
|
|
||||||
|
private IMachineModel machineModel;
|
||||||
|
|
||||||
|
private IExpenseSheetModel expenseSheetModel;
|
||||||
|
|
||||||
|
private IMaterialsModel materialsModel;
|
||||||
|
|
||||||
|
private IAssignedTaskQualityFormsToOrderElementModel assignedQualityFormModel;
|
||||||
|
|
||||||
|
|
||||||
|
// Version of this statistics implementation.
|
||||||
|
// Just increment it, if you will change something related to JSON object.
|
||||||
|
private int jsonObjectVersion = 2;
|
||||||
|
|
||||||
// Unique system identifier (MD5 - ip + hostname)
|
// Unique system identifier (MD5 - ip + hostname)
|
||||||
private String id;
|
private String id;
|
||||||
|
|
@ -53,9 +72,24 @@ public class GatheredUsageStats {
|
||||||
// Number of projects in application
|
// Number of projects in application
|
||||||
private int projects;
|
private int projects;
|
||||||
|
|
||||||
private Number getUserRows(){
|
// Number of timesheets in application
|
||||||
return userDAO.getRowCount();
|
private int timesheets;
|
||||||
}
|
|
||||||
|
// Number of workers in application
|
||||||
|
private int workers;
|
||||||
|
|
||||||
|
// Number of machines in application
|
||||||
|
private int machines;
|
||||||
|
|
||||||
|
// Number of expense sheets in application
|
||||||
|
private int expensesheets;
|
||||||
|
|
||||||
|
// Number of materials in application
|
||||||
|
private int materials;
|
||||||
|
|
||||||
|
// Number of assigned quality forms in application
|
||||||
|
private int assignedQualityForms;
|
||||||
|
|
||||||
|
|
||||||
private String generateID(){
|
private String generateID(){
|
||||||
// Make hash of ip + hostname
|
// Make hash of ip + hostname
|
||||||
|
|
@ -77,8 +111,8 @@ public class GatheredUsageStats {
|
||||||
|
|
||||||
// Convert bytes to hex format
|
// Convert bytes to hex format
|
||||||
sb = new StringBuffer();
|
sb = new StringBuffer();
|
||||||
for (int i = 0; i < encoded.length; i++) sb.append(Integer.toString((encoded[i] & 0xff) + 0x100, 16)
|
for (int i = 0; i < encoded.length; i++)
|
||||||
.substring(1));
|
sb.append(Integer.toString((encoded[i] & 0xff) + 0x100, 16).substring(1));
|
||||||
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
@ -93,6 +127,12 @@ public class GatheredUsageStats {
|
||||||
setId(generateID());
|
setId(generateID());
|
||||||
setUsers(getUserRows());
|
setUsers(getUserRows());
|
||||||
setProjects(orderModel.getOrders().size());
|
setProjects(orderModel.getOrders().size());
|
||||||
|
setTimesheets(workReportModel.getWorkReportDTOs().size());
|
||||||
|
setWorkers(workerModel.getWorkers().size());
|
||||||
|
setMachines(machineModel.getMachines().size());
|
||||||
|
setExpensesheets(expenseSheetModel.getExpenseSheets().size());
|
||||||
|
setMaterials(materialsModel.getMaterials().size());
|
||||||
|
setQualityForms(assignedQualityFormModel.getAssignedQualityForms().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendGatheredUsageStatsToServer(){
|
public void sendGatheredUsageStatsToServer(){
|
||||||
|
|
@ -103,6 +143,12 @@ public class GatheredUsageStats {
|
||||||
json.put("version", version);
|
json.put("version", version);
|
||||||
json.put("users", users);
|
json.put("users", users);
|
||||||
json.put("projects", projects);
|
json.put("projects", projects);
|
||||||
|
json.put("timesheets", timesheets);
|
||||||
|
json.put("workers", workers);
|
||||||
|
json.put("machines", machines);
|
||||||
|
json.put("expensesheets", expensesheets);
|
||||||
|
json.put("materials", materials);
|
||||||
|
json.put("assigned-quality-forms", assignedQualityForms);
|
||||||
|
|
||||||
HttpURLConnection connection = null;
|
HttpURLConnection connection = null;
|
||||||
|
|
||||||
|
|
@ -110,6 +156,7 @@ public class GatheredUsageStats {
|
||||||
InputStream inputStream = null;
|
InputStream inputStream = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// You can find it in libreplan-business/src/main/resouces
|
||||||
String filename = "libreplan.properties";
|
String filename = "libreplan.properties";
|
||||||
inputStream = GatheredUsageStats.class.getClassLoader().getResourceAsStream(filename);
|
inputStream = GatheredUsageStats.class.getClassLoader().getResourceAsStream(filename);
|
||||||
properties.load(inputStream);
|
properties.load(inputStream);
|
||||||
|
|
@ -132,7 +179,7 @@ public class GatheredUsageStats {
|
||||||
dataOutputStream.flush();
|
dataOutputStream.flush();
|
||||||
dataOutputStream.close();
|
dataOutputStream.close();
|
||||||
|
|
||||||
// No needed code, but it is not working without id
|
// No needed code, but it is not working without it
|
||||||
connection.getInputStream();
|
connection.getInputStream();
|
||||||
|
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
|
|
@ -147,39 +194,65 @@ public class GatheredUsageStats {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setupNotAutowiredClasses(IUserDAO userDAO, IOrderModel orderModel){
|
public void setupNotAutowiredClasses(
|
||||||
|
IUserDAO userDAO,
|
||||||
|
IOrderModel orderModel,
|
||||||
|
IWorkReportModel workReportModel,
|
||||||
|
IWorkerModel workerModel,
|
||||||
|
IMachineModel machineModel,
|
||||||
|
IExpenseSheetModel expenseSheetModel,
|
||||||
|
IMaterialsModel materialsModel,
|
||||||
|
IAssignedTaskQualityFormsToOrderElementModel assignedQualityFormModel){
|
||||||
|
|
||||||
this.userDAO = userDAO;
|
this.userDAO = userDAO;
|
||||||
this.orderModel = orderModel;
|
this.orderModel = orderModel;
|
||||||
|
this.workReportModel = workReportModel;
|
||||||
|
this.workerModel = workerModel;
|
||||||
|
this.machineModel = machineModel;
|
||||||
|
this.expenseSheetModel = expenseSheetModel;
|
||||||
|
this.materialsModel = materialsModel;
|
||||||
|
this.assignedQualityFormModel = assignedQualityFormModel;
|
||||||
|
|
||||||
myConstructor();
|
myConstructor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getJsonObjectVersion() {
|
private Number getUserRows(){
|
||||||
return jsonObjectVersion;
|
return userDAO.getRowCount();
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getVersion() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Number getUsers() {
|
|
||||||
return users;
|
|
||||||
}
|
|
||||||
public void setUsers(Number users) {
|
public void setUsers(Number users) {
|
||||||
this.users = users;
|
this.users = users;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getProjects() {
|
|
||||||
return projects;
|
|
||||||
}
|
|
||||||
public void setProjects(int projects) {
|
public void setProjects(int projects) {
|
||||||
this.projects = projects;
|
this.projects = projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTimesheets(int timesheets) {
|
||||||
|
this.timesheets = timesheets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorkers(int workers) {
|
||||||
|
this.workers = workers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMachines(int machines) {
|
||||||
|
this.machines = machines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpensesheets(int expensesheets) {
|
||||||
|
this.expensesheets = expensesheets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaterials(int materials) {
|
||||||
|
this.materials = materials;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQualityForms(int qualityForms) {
|
||||||
|
this.assignedQualityForms = qualityForms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,11 +56,14 @@ import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.zkoss.ganttz.util.MutableTreeModel;
|
import org.zkoss.ganttz.util.MutableTreeModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author somebody <who-is-it@.know>
|
||||||
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||||
@OnConcurrentModification(goToPage = "/materials/materials.zul")
|
@OnConcurrentModification(goToPage = "/materials/materials.zul")
|
||||||
public class MaterialsModel extends IntegrationEntityModel implements
|
public class MaterialsModel extends IntegrationEntityModel implements IMaterialsModel {
|
||||||
IMaterialsModel {
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
IMaterialCategoryDAO categoryDAO;
|
IMaterialCategoryDAO categoryDAO;
|
||||||
|
|
@ -77,8 +80,7 @@ public class MaterialsModel extends IntegrationEntityModel implements
|
||||||
@Autowired
|
@Autowired
|
||||||
IMaterialAssignmentDAO materialAssignmentDAO;
|
IMaterialAssignmentDAO materialAssignmentDAO;
|
||||||
|
|
||||||
MutableTreeModel<MaterialCategory> materialCategories = MutableTreeModel
|
MutableTreeModel<MaterialCategory> materialCategories = MutableTreeModel.create(MaterialCategory.class);
|
||||||
.create(MaterialCategory.class);
|
|
||||||
|
|
||||||
private List<UnitType> unitTypes = new ArrayList<UnitType>();
|
private List<UnitType> unitTypes = new ArrayList<UnitType>();
|
||||||
|
|
||||||
|
|
@ -183,10 +185,9 @@ public class MaterialsModel extends IntegrationEntityModel implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private MaterialCategory findMaterialCategory(
|
private MaterialCategory findMaterialCategory(final MaterialCategory category) {
|
||||||
final MaterialCategory category) {
|
|
||||||
for (MaterialCategory mc : materialCategories.asList()) {
|
for (MaterialCategory mc : materialCategories.asList()) {
|
||||||
if (equalsMaterialCategory(mc, category)) {
|
if ( equalsMaterialCategory(mc, category) ) {
|
||||||
return mc;
|
return mc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -250,24 +251,20 @@ public class MaterialsModel extends IntegrationEntityModel implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateMaterialCodesIfIsNecessary(List<MaterialCategory> categories,
|
private void generateMaterialCodesIfIsNecessary(List<MaterialCategory> categories, Integer numberOfDigits) {
|
||||||
Integer numberOfDigits) {
|
|
||||||
for (MaterialCategory category: categories) {
|
for (MaterialCategory category: categories) {
|
||||||
if (category.isCodeAutogenerated()) {
|
if ( category.isCodeAutogenerated() ) {
|
||||||
category.generateMaterialCodes(numberOfDigits);
|
category.generateMaterialCodes(numberOfDigits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkNoCodeRepeatedAtNewMaterials(
|
private void checkNoCodeRepeatedAtNewMaterials(final List<MaterialCategory> categories) throws ValidationException {
|
||||||
final List<MaterialCategory> categories) throws ValidationException {
|
List<Material> allMaterials = MaterialCategory.getAllMaterialsWithoutAutogeneratedCodeFrom(categories);
|
||||||
List<Material> allMaterials = MaterialCategory
|
|
||||||
.getAllMaterialsWithoutAutogeneratedCodeFrom(categories);
|
|
||||||
Map<String, Material> byCode = new HashMap<String, Material>();
|
Map<String, Material> byCode = new HashMap<String, Material>();
|
||||||
for (Material each : allMaterials) {
|
for (Material each : allMaterials) {
|
||||||
if (byCode.containsKey(each.getCode())) {
|
if ( byCode.containsKey(each.getCode()) ) {
|
||||||
throw new ValidationException(sameCodeMessage(each, byCode
|
throw new ValidationException(sameCodeMessage(each, byCode.get(each.getCode())));
|
||||||
.get(each.getCode())));
|
|
||||||
}
|
}
|
||||||
byCode.put(each.getCode(), each);
|
byCode.put(each.getCode(), each);
|
||||||
}
|
}
|
||||||
|
|
@ -295,7 +292,7 @@ public class MaterialsModel extends IntegrationEntityModel implements
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Collection<? extends Material> getMaterials() {
|
public Collection<? extends Material> getMaterials() {
|
||||||
List<Material> result = new ArrayList<Material>();
|
List<Material> result = new ArrayList<Material>();
|
||||||
for (MaterialCategory each: materialCategories.asList()) {
|
for (MaterialCategory each: getMaterialCategories().asList()) {
|
||||||
result.addAll(each.getMaterials());
|
result.addAll(each.getMaterials());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -66,11 +66,10 @@ import com.igalia.java.zk.components.customdetailrowcomponent.Detail;
|
||||||
* Controller for showing OrderElement assigned task quality forms
|
* Controller for showing OrderElement assigned task quality forms
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
*/
|
*/
|
||||||
public class AssignedTaskQualityFormsToOrderElementController extends
|
public class AssignedTaskQualityFormsToOrderElementController extends GenericForwardComposer {
|
||||||
GenericForwardComposer {
|
|
||||||
|
|
||||||
private static final org.apache.commons.logging.Log LOG = LogFactory
|
private static final org.apache.commons.logging.Log LOG =
|
||||||
.getLog(AssignedTaskQualityFormsToOrderElementController.class);
|
LogFactory.getLog(AssignedTaskQualityFormsToOrderElementController.class);
|
||||||
|
|
||||||
private IMessagesForUser messagesForUser;
|
private IMessagesForUser messagesForUser;
|
||||||
|
|
||||||
|
|
@ -123,9 +122,8 @@ public class AssignedTaskQualityFormsToOrderElementController extends
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOrderModel(IOrderModel orderModel) {
|
private void setOrderModel(IOrderModel orderModel) {
|
||||||
if (assignedTaskQualityFormsToOrderElementModel != null) {
|
if ( assignedTaskQualityFormsToOrderElementModel != null ) {
|
||||||
assignedTaskQualityFormsToOrderElementModel
|
assignedTaskQualityFormsToOrderElementModel.setOrderModel(orderModel);
|
||||||
.setOrderModel(orderModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -229,8 +227,7 @@ public class AssignedTaskQualityFormsToOrderElementController extends
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TaskQualityForm> getTaskQualityForms() {
|
public List<TaskQualityForm> getTaskQualityForms() {
|
||||||
return assignedTaskQualityFormsToOrderElementModel
|
return assignedTaskQualityFormsToOrderElementModel.getTaskQualityForms();
|
||||||
.getTaskQualityForms();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<QualityForm> getNotAssignedQualityForms() {
|
public List<QualityForm> getNotAssignedQualityForms() {
|
||||||
|
|
|
||||||
|
|
@ -52,11 +52,11 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||||
public class AssignedTaskQualityFormsToOrderElementModel implements
|
public class AssignedTaskQualityFormsToOrderElementModel implements IAssignedTaskQualityFormsToOrderElementModel {
|
||||||
IAssignedTaskQualityFormsToOrderElementModel {
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOrderElementDAO orderDAO;
|
private IOrderElementDAO orderDAO;
|
||||||
|
|
@ -101,17 +101,14 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeTaskQualityForms(
|
private void initializeTaskQualityForms(Collection<TaskQualityForm> taskQualityForms) {
|
||||||
Collection<TaskQualityForm> taskQualityForms) {
|
|
||||||
for (TaskQualityForm taskQualityForm : taskQualityForms) {
|
for (TaskQualityForm taskQualityForm : taskQualityForms) {
|
||||||
taskQualityForm.getQualityForm().getName();
|
taskQualityForm.getQualityForm().getName();
|
||||||
initializeTaskQualityFormItems(taskQualityForm
|
initializeTaskQualityFormItems(taskQualityForm.getTaskQualityFormItems());
|
||||||
.getTaskQualityFormItems());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializeTaskQualityFormItems(
|
public void initializeTaskQualityFormItems(Collection<TaskQualityFormItem> taskQualityFormItems) {
|
||||||
Collection<TaskQualityFormItem> taskQualityFormItems) {
|
|
||||||
for (TaskQualityFormItem taskQualityFormItem : taskQualityFormItems) {
|
for (TaskQualityFormItem taskQualityFormItem : taskQualityFormItems) {
|
||||||
taskQualityFormItem.getName();
|
taskQualityFormItem.getName();
|
||||||
}
|
}
|
||||||
|
|
@ -120,16 +117,27 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
@Override
|
@Override
|
||||||
public List<QualityForm> getNotAssignedQualityForms() {
|
public List<QualityForm> getNotAssignedQualityForms() {
|
||||||
List<QualityForm> result = new ArrayList<QualityForm>();
|
List<QualityForm> result = new ArrayList<QualityForm>();
|
||||||
if (orderElement != null) {
|
if ( orderElement != null ) {
|
||||||
return getlistNotAssignedQualityForms();
|
return getListNotAssignedQualityForms();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<QualityForm> getlistNotAssignedQualityForms() {
|
private List<QualityForm> getListNotAssignedQualityForms() {
|
||||||
List<QualityForm> result = new ArrayList<QualityForm>();
|
List<QualityForm> result = new ArrayList<QualityForm>();
|
||||||
for (QualityForm qualityForm : orderModel.getQualityForms()) {
|
for (QualityForm qualityForm : orderModel.getQualityForms()) {
|
||||||
if (!isAssigned(qualityForm)) {
|
if ( !isAssigned(qualityForm) ) {
|
||||||
|
result.add(qualityForm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<QualityForm> getAssignedQualityForms() {
|
||||||
|
List<QualityForm> result = new ArrayList<QualityForm>();
|
||||||
|
for (QualityForm qualityForm : qualityFormDAO.getAll()) {
|
||||||
|
if ( isAssigned(qualityForm) ) {
|
||||||
result.add(qualityForm);
|
result.add(qualityForm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -139,7 +147,7 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
@Override
|
@Override
|
||||||
public List<TaskQualityForm> getTaskQualityForms() {
|
public List<TaskQualityForm> getTaskQualityForms() {
|
||||||
List<TaskQualityForm> result = new ArrayList<TaskQualityForm>();
|
List<TaskQualityForm> result = new ArrayList<TaskQualityForm>();
|
||||||
if (orderElement != null) {
|
if ( orderElement != null ) {
|
||||||
result.addAll(orderElement.getTaskQualityForms());
|
result.addAll(orderElement.getTaskQualityForms());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -155,28 +163,37 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
orderElement.removeTaskQualityForm(taskQualityForm);
|
orderElement.removeTaskQualityForm(taskQualityForm);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AdvanceAssignment getAdvanceAssignment(
|
private AdvanceAssignment getAdvanceAssignment(TaskQualityForm taskQualityForm) {
|
||||||
TaskQualityForm taskQualityForm) {
|
AdvanceType advanceType = taskQualityForm.getQualityForm().getAdvanceType();
|
||||||
AdvanceType advanceType = taskQualityForm.getQualityForm()
|
if ( advanceType == null ) {
|
||||||
.getAdvanceType();
|
|
||||||
if (advanceType == null) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
advanceTypeDAO.reattach(advanceType);
|
advanceTypeDAO.reattach(advanceType);
|
||||||
return taskQualityForm.getOrderElement()
|
return taskQualityForm.getOrderElement().getDirectAdvanceAssignmentByType(advanceType);
|
||||||
.getDirectAdvanceAssignmentByType(advanceType);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAssigned(QualityForm qualityForm) {
|
public boolean isAssigned(QualityForm qualityForm) {
|
||||||
for (TaskQualityForm taskQualityForm : orderElement
|
// orderDAO used for gathered data to be sent to LibrePlan server
|
||||||
.getTaskQualityForms()) {
|
// In general case orderElement will be not null and only that part of code will be triggered
|
||||||
if (qualityForm.equals(taskQualityForm.getQualityForm())) {
|
|
||||||
return true;
|
if ( orderElement != null ){
|
||||||
|
for (TaskQualityForm taskQualityForm : orderElement.getTaskQualityForms()) {
|
||||||
|
if ( qualityForm.equals(taskQualityForm.getQualityForm()) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (OrderElement currentElement : orderDAO.getAll()) {
|
||||||
|
for ( TaskQualityForm taskQualityForm : currentElement.getTaskQualityForms() )
|
||||||
|
if ( qualityForm.equals(taskQualityForm.getQualityForm()) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -185,32 +202,28 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
this.orderModel = orderModel;
|
this.orderModel = orderModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDisabledPassedItem(TaskQualityForm taskQualityForm,
|
public boolean isDisabledPassedItem(TaskQualityForm taskQualityForm, TaskQualityFormItem item) {
|
||||||
TaskQualityFormItem item) {
|
if ( (taskQualityForm == null) || ((item == null)) ) {
|
||||||
if ((taskQualityForm == null) || ((item == null))) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!taskQualityForm.isByItems()) {
|
if ( !taskQualityForm.isByItems() ) {
|
||||||
return (!(item.getPassed() || taskQualityForm
|
return (!(item.getPassed() || taskQualityForm.isPassedPreviousItem(item)));
|
||||||
.isPassedPreviousItem(item)));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDisabledDateItem(TaskQualityForm taskQualityForm,
|
public boolean isDisabledDateItem(TaskQualityForm taskQualityForm, TaskQualityFormItem item) {
|
||||||
TaskQualityFormItem item) {
|
if ( (taskQualityForm == null) || ((item == null)) ) {
|
||||||
if ((taskQualityForm == null) || ((item == null))) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return (!taskQualityForm.isByItems() && (!item.getPassed()));
|
return (!taskQualityForm.isByItems() && (!item.getPassed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCorrectConsecutiveDate(TaskQualityForm taskQualityForm,
|
public boolean isCorrectConsecutiveDate(TaskQualityForm taskQualityForm, TaskQualityFormItem item) {
|
||||||
TaskQualityFormItem item) {
|
if ( (taskQualityForm == null) || ((item == null)) ) {
|
||||||
if ((taskQualityForm == null) || ((item == null))) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (taskQualityForm.isByItems()) {
|
if ( taskQualityForm.isByItems() ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return (taskQualityForm.isCorrectConsecutiveDate(item));
|
return (taskQualityForm.isCorrectConsecutiveDate(item));
|
||||||
|
|
@ -288,50 +301,40 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
public void addAdvanceAssignmentIfNeeded(TaskQualityForm taskQualityForm)
|
public void addAdvanceAssignmentIfNeeded(TaskQualityForm taskQualityForm)
|
||||||
throws DuplicateValueTrueReportGlobalAdvanceException,
|
throws DuplicateValueTrueReportGlobalAdvanceException,
|
||||||
DuplicateAdvanceAssignmentForOrderElementException {
|
DuplicateAdvanceAssignmentForOrderElementException {
|
||||||
AdvanceType advanceType = taskQualityForm.getQualityForm()
|
|
||||||
.getAdvanceType();
|
|
||||||
advanceTypeDAO.reattach(advanceType);
|
|
||||||
AdvanceAssignment advanceAssignment = taskQualityForm.getOrderElement()
|
|
||||||
.getDirectAdvanceAssignmentByType(advanceType);
|
|
||||||
|
|
||||||
if (advanceAssignment == null) {
|
AdvanceType advanceType = taskQualityForm.getQualityForm().getAdvanceType();
|
||||||
DirectAdvanceAssignment newAdvanceAssignment = DirectAdvanceAssignment
|
advanceTypeDAO.reattach(advanceType);
|
||||||
.create(false, new BigDecimal(100));
|
|
||||||
|
AdvanceAssignment advanceAssignment =
|
||||||
|
taskQualityForm.getOrderElement().getDirectAdvanceAssignmentByType(advanceType);
|
||||||
|
|
||||||
|
if ( advanceAssignment == null ) {
|
||||||
|
DirectAdvanceAssignment newAdvanceAssignment = DirectAdvanceAssignment.create(false, new BigDecimal(100));
|
||||||
newAdvanceAssignment.setAdvanceType(advanceType);
|
newAdvanceAssignment.setAdvanceType(advanceType);
|
||||||
taskQualityForm.getOrderElement().addAdvanceAssignment(
|
taskQualityForm.getOrderElement().addAdvanceAssignment(newAdvanceAssignment);
|
||||||
newAdvanceAssignment);
|
|
||||||
addAdvanceMeasurements(taskQualityForm, newAdvanceAssignment);
|
addAdvanceMeasurements(taskQualityForm, newAdvanceAssignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAdvanceMeasurements(TaskQualityForm taskQualityForm,
|
private void addAdvanceMeasurements(TaskQualityForm taskQualityForm, DirectAdvanceAssignment newAdvanceAssignment) {
|
||||||
DirectAdvanceAssignment newAdvanceAssignment) {
|
for (TaskQualityFormItem taskQualityFormItem : taskQualityForm.getTaskQualityFormItems()) {
|
||||||
for (TaskQualityFormItem taskQualityFormItem : taskQualityForm
|
if ( taskQualityFormItem.getPassed() && (taskQualityFormItem.getDate() != null) ) {
|
||||||
.getTaskQualityFormItems()) {
|
LocalDate date = LocalDate.fromDateFields(taskQualityFormItem.getDate());
|
||||||
if (taskQualityFormItem.getPassed()
|
|
||||||
&& (taskQualityFormItem.getDate() != null)) {
|
|
||||||
LocalDate date = LocalDate
|
|
||||||
.fromDateFields(taskQualityFormItem.getDate());
|
|
||||||
BigDecimal value = taskQualityFormItem.getPercentage();
|
BigDecimal value = taskQualityFormItem.getPercentage();
|
||||||
newAdvanceAssignment
|
newAdvanceAssignment.addAdvanceMeasurements(AdvanceMeasurement.create(date, value));
|
||||||
.addAdvanceMeasurements(AdvanceMeasurement
|
|
||||||
.create(date, value));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public void removeAdvanceAssignmentIfNeeded(TaskQualityForm taskQualityForm)
|
public void removeAdvanceAssignmentIfNeeded(TaskQualityForm taskQualityForm) throws ValidationException {
|
||||||
throws ValidationException {
|
AdvanceAssignment advanceAssignment = this.getAdvanceAssignment(taskQualityForm);
|
||||||
AdvanceAssignment advanceAssignment = this
|
if ( advanceAssignment != null ) {
|
||||||
.getAdvanceAssignment(taskQualityForm);
|
if ( advanceAssignment.getReportGlobalAdvance() ) {
|
||||||
if (advanceAssignment != null) {
|
|
||||||
if (advanceAssignment.getReportGlobalAdvance()) {
|
|
||||||
showMessageDeleteSpread();
|
showMessageDeleteSpread();
|
||||||
} else {
|
} else {
|
||||||
taskQualityForm.getOrderElement().removeAdvanceAssignment(
|
taskQualityForm.getOrderElement().removeAdvanceAssignment(advanceAssignment);
|
||||||
advanceAssignment);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -343,12 +346,13 @@ public class AssignedTaskQualityFormsToOrderElementModel implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateAdvancesIfNeeded() {
|
public void updateAdvancesIfNeeded() {
|
||||||
if (orderElement != null) {
|
if ( orderElement != null ) {
|
||||||
for (TaskQualityForm taskQualityForm : getTaskQualityForms()) {
|
for (TaskQualityForm taskQualityForm : getTaskQualityForms()) {
|
||||||
if (taskQualityForm.isReportAdvance()) {
|
if ( taskQualityForm.isReportAdvance() ) {
|
||||||
DirectAdvanceAssignment advanceAssignment = orderElement
|
|
||||||
.getAdvanceAssignmentByType(taskQualityForm
|
DirectAdvanceAssignment advanceAssignment =
|
||||||
.getQualityForm().getAdvanceType());
|
orderElement.getAdvanceAssignmentByType(taskQualityForm.getQualityForm().getAdvanceType());
|
||||||
|
|
||||||
advanceAssignment.clearAdvanceMeasurements();
|
advanceAssignment.clearAdvanceMeasurements();
|
||||||
addAdvanceMeasurements(taskQualityForm, advanceAssignment);
|
addAdvanceMeasurements(taskQualityForm, advanceAssignment);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ import org.libreplan.business.qualityforms.entities.TaskQualityFormItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||||
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
*/
|
*/
|
||||||
public interface IAssignedTaskQualityFormsToOrderElementModel {
|
public interface IAssignedTaskQualityFormsToOrderElementModel {
|
||||||
|
|
||||||
|
|
@ -62,6 +63,11 @@ public interface IAssignedTaskQualityFormsToOrderElementModel {
|
||||||
*/
|
*/
|
||||||
List<QualityForm> getNotAssignedQualityForms();
|
List<QualityForm> getNotAssignedQualityForms();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all the allocated {@link QualityForm} needed for gathering usage statistics.
|
||||||
|
*/
|
||||||
|
List<QualityForm> getAssignedQualityForms();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@link OrderElement}
|
* Returns {@link OrderElement}
|
||||||
* @return
|
* @return
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ import org.zkoss.zul.api.Window;
|
||||||
* @author Óscar González Fernández <ogonzalez@igalia.com>
|
* @author Óscar González Fernández <ogonzalez@igalia.com>
|
||||||
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
|
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
|
||||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||||
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
*/
|
*/
|
||||||
@org.springframework.stereotype.Component
|
@org.springframework.stereotype.Component
|
||||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||||
|
|
@ -134,8 +135,7 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
|
|
||||||
private static final String DEFAULT_TAB = "tabOrderElements";
|
private static final String DEFAULT_TAB = "tabOrderElements";
|
||||||
|
|
||||||
private static final org.apache.commons.logging.Log LOG = LogFactory
|
private static final org.apache.commons.logging.Log LOG = LogFactory.getLog(OrderCRUDController.class);
|
||||||
.getLog(OrderCRUDController.class);
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOrderModel orderModel;
|
private IOrderModel orderModel;
|
||||||
|
|
@ -698,16 +698,17 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
private AssignedTaskQualityFormsToOrderElementController assignedTaskQualityFormController;
|
private AssignedTaskQualityFormsToOrderElementController assignedTaskQualityFormController;
|
||||||
|
|
||||||
public void setupAssignedTaskQualityFormsToOrderElementController() {
|
public void setupAssignedTaskQualityFormsToOrderElementController() {
|
||||||
if (!confirmLastTab()) {
|
if ( !confirmLastTab() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setCurrentTab();
|
setCurrentTab();
|
||||||
|
|
||||||
Component orderElementTaskQualityForms = editWindow
|
Component orderElementTaskQualityForms = editWindow.getFellowIfAny("orderElementTaskQualityForms");
|
||||||
.getFellowIfAny("orderElementTaskQualityForms");
|
if ( assignedTaskQualityFormController == null ) {
|
||||||
if (assignedTaskQualityFormController == null) {
|
|
||||||
assignedTaskQualityFormController = (AssignedTaskQualityFormsToOrderElementController) orderElementTaskQualityForms
|
assignedTaskQualityFormController = (AssignedTaskQualityFormsToOrderElementController) orderElementTaskQualityForms
|
||||||
.getVariable("assignedTaskQualityFormsController", true);
|
.getVariable("assignedTaskQualityFormsController", true);
|
||||||
|
|
||||||
final IOrderElementModel orderElementModel = getOrderElementModel();
|
final IOrderElementModel orderElementModel = getOrderElementModel();
|
||||||
assignedTaskQualityFormController.openWindow(orderElementModel);
|
assignedTaskQualityFormController.openWindow(orderElementModel);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1018,9 +1019,8 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
|
|
||||||
private void remove(Order order) {
|
private void remove(Order order) {
|
||||||
boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheetsThisOrAnyOfItsChildren(order);
|
boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheetsThisOrAnyOfItsChildren(order);
|
||||||
if (hasImputedExpenseSheets) {
|
if ( hasImputedExpenseSheets ) {
|
||||||
messagesForUser
|
messagesForUser.showMessage(
|
||||||
.showMessage(
|
|
||||||
Level.ERROR,
|
Level.ERROR,
|
||||||
_("You can not remove the project \"{0}\" because this one has imputed expense sheets.",
|
_("You can not remove the project \"{0}\" because this one has imputed expense sheets.",
|
||||||
order.getName()));
|
order.getName()));
|
||||||
|
|
@ -1028,22 +1028,19 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean alreadyInUse = orderModel.isAlreadyInUseAndIsOnlyInCurrentScenario(order);
|
boolean alreadyInUse = orderModel.isAlreadyInUseAndIsOnlyInCurrentScenario(order);
|
||||||
if (alreadyInUse) {
|
if ( alreadyInUse ) {
|
||||||
messagesForUser
|
messagesForUser.showMessage(
|
||||||
.showMessage(
|
|
||||||
Level.ERROR,
|
Level.ERROR,
|
||||||
_(
|
_("You can not remove the project \"{0}\" because it has time tracked at some of its tasks",
|
||||||
"You can not remove the project \"{0}\" because it has time tracked at some of its tasks",
|
|
||||||
order.getName()));
|
order.getName()));
|
||||||
} else {
|
} else {
|
||||||
if (!StringUtils.isBlank(order.getExternalCode())) {
|
if ( !StringUtils.isBlank(order.getExternalCode()) ) {
|
||||||
try {
|
try {
|
||||||
if (Messagebox
|
if ( Messagebox.show(
|
||||||
.show(
|
_("This project is a subcontracted project. If you delete it, " +
|
||||||
_("This project is a subcontracted project. If you delete it, you won't be able to report progress anymore. Are you sure?"),
|
"you won't be able to report progress anymore. Are you sure?"),
|
||||||
_("Confirm"), Messagebox.OK
|
_("Confirm"),
|
||||||
| Messagebox.CANCEL,
|
Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION) == Messagebox.CANCEL ) {
|
||||||
Messagebox.QUESTION) == Messagebox.CANCEL) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
|
@ -1053,20 +1050,22 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
|
|
||||||
orderModel.remove(order);
|
orderModel.remove(order);
|
||||||
Util.reloadBindings(self);
|
Util.reloadBindings(self);
|
||||||
messagesForUser.showMessage(Level.INFO, _("Removed {0}", order
|
|
||||||
.getName()));
|
messagesForUser.clearMessages();
|
||||||
|
messagesForUser.showMessage(Level.INFO, _("Removed {0}", order.getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void schedule(Order order) {
|
public void schedule(Order order) {
|
||||||
orderModel.useSchedulingDataForCurrentScenario(order);
|
orderModel.useSchedulingDataForCurrentScenario(order);
|
||||||
if(orderModel.userCanRead(order, SecurityUtils.getSessionUserLoginName())) {
|
if( orderModel.userCanRead(order, SecurityUtils.getSessionUserLoginName()) ) {
|
||||||
if (order.isScheduled()) {
|
if ( order.isScheduled() ) {
|
||||||
planningControllerEntryPoints.goToScheduleOf(order);
|
planningControllerEntryPoints.goToScheduleOf(order);
|
||||||
showCreateButtons(false);
|
showCreateButtons(false);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
Messagebox.show(_("The project has no scheduled elements"),
|
Messagebox.show(
|
||||||
|
_("The project has no scheduled elements"),
|
||||||
_("Information"), Messagebox.OK, Messagebox.INFORMATION);
|
_("Information"), Messagebox.OK, Messagebox.INFORMATION);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
|
|
@ -1075,7 +1074,8 @@ public class OrderCRUDController extends GenericForwardComposer {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
Messagebox.show(_("You don't have read access to this project"),
|
Messagebox.show(
|
||||||
|
_("You don't have read access to this project"),
|
||||||
_("Information"), Messagebox.OK, Messagebox.INFORMATION);
|
_("Information"), Messagebox.OK, Messagebox.INFORMATION);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel {
|
||||||
private LabelsOnConversation labelsOnConversation;
|
private LabelsOnConversation labelsOnConversation;
|
||||||
|
|
||||||
private LabelsOnConversation getLabelsOnConversation() {
|
private LabelsOnConversation getLabelsOnConversation() {
|
||||||
if (labelsOnConversation == null) {
|
if ( labelsOnConversation == null ) {
|
||||||
labelsOnConversation = new LabelsOnConversation(labelDAO);
|
labelsOnConversation = new LabelsOnConversation(labelDAO);
|
||||||
}
|
}
|
||||||
return labelsOnConversation;
|
return labelsOnConversation;
|
||||||
|
|
@ -194,9 +194,8 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel {
|
||||||
private QualityFormsOnConversation qualityFormsOnConversation;
|
private QualityFormsOnConversation qualityFormsOnConversation;
|
||||||
|
|
||||||
private QualityFormsOnConversation getQualityFormsOnConversation() {
|
private QualityFormsOnConversation getQualityFormsOnConversation() {
|
||||||
if (qualityFormsOnConversation == null) {
|
if ( qualityFormsOnConversation == null ) {
|
||||||
qualityFormsOnConversation = new QualityFormsOnConversation(
|
qualityFormsOnConversation = new QualityFormsOnConversation(qualityFormDAO);
|
||||||
qualityFormDAO);
|
|
||||||
}
|
}
|
||||||
return qualityFormsOnConversation;
|
return qualityFormsOnConversation;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,9 +43,12 @@ import org.libreplan.web.common.entrypoints.EntryPointsHandler;
|
||||||
import org.libreplan.web.common.entrypoints.URLHandlerRegistry;
|
import org.libreplan.web.common.entrypoints.URLHandlerRegistry;
|
||||||
import org.libreplan.web.dashboard.DashboardController;
|
import org.libreplan.web.dashboard.DashboardController;
|
||||||
import org.libreplan.web.dashboard.DashboardControllerGlobal;
|
import org.libreplan.web.dashboard.DashboardControllerGlobal;
|
||||||
|
import org.libreplan.web.expensesheet.IExpenseSheetModel;
|
||||||
import org.libreplan.web.limitingresources.LimitingResourcesController;
|
import org.libreplan.web.limitingresources.LimitingResourcesController;
|
||||||
import org.libreplan.web.logs.LogsController;
|
import org.libreplan.web.logs.LogsController;
|
||||||
|
import org.libreplan.web.materials.IMaterialsModel;
|
||||||
import org.libreplan.web.montecarlo.MonteCarloController;
|
import org.libreplan.web.montecarlo.MonteCarloController;
|
||||||
|
import org.libreplan.web.orders.IAssignedTaskQualityFormsToOrderElementModel;
|
||||||
import org.libreplan.web.orders.IOrderModel;
|
import org.libreplan.web.orders.IOrderModel;
|
||||||
import org.libreplan.web.orders.OrderCRUDController;
|
import org.libreplan.web.orders.OrderCRUDController;
|
||||||
import org.libreplan.web.planner.allocation.AdvancedAllocationController.IBack;
|
import org.libreplan.web.planner.allocation.AdvancedAllocationController.IBack;
|
||||||
|
|
@ -55,7 +58,10 @@ import org.libreplan.web.planner.order.OrderPlanningController;
|
||||||
import org.libreplan.web.planner.order.PlanningStateCreator;
|
import org.libreplan.web.planner.order.PlanningStateCreator;
|
||||||
import org.libreplan.web.planner.tabs.Mode.ModeTypeChangedListener;
|
import org.libreplan.web.planner.tabs.Mode.ModeTypeChangedListener;
|
||||||
import org.libreplan.web.resourceload.ResourceLoadController;
|
import org.libreplan.web.resourceload.ResourceLoadController;
|
||||||
|
import org.libreplan.web.resources.machine.IMachineModel;
|
||||||
|
import org.libreplan.web.resources.worker.IWorkerModel;
|
||||||
import org.libreplan.web.security.SecurityUtils;
|
import org.libreplan.web.security.SecurityUtils;
|
||||||
|
import org.libreplan.web.workreports.IWorkReportModel;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
|
|
@ -88,8 +94,7 @@ import org.zkoss.zk.ui.util.Composer;
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||||
public class MultipleTabsPlannerController implements Composer,
|
public class MultipleTabsPlannerController implements Composer, IGlobalViewEntryPoints {
|
||||||
IGlobalViewEntryPoints {
|
|
||||||
|
|
||||||
public static String WELCOME_URL = "-- no URL provided --";
|
public static String WELCOME_URL = "-- no URL provided --";
|
||||||
|
|
||||||
|
|
@ -102,7 +107,7 @@ public class MultipleTabsPlannerController implements Composer,
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void show() {
|
public void show() {
|
||||||
if (feedback) {
|
if ( feedback ) {
|
||||||
showWithFeedback();
|
showWithFeedback();
|
||||||
} else {
|
} else {
|
||||||
showWithoutFeedback();
|
showWithoutFeedback();
|
||||||
|
|
@ -152,6 +157,8 @@ public class MultipleTabsPlannerController implements Composer,
|
||||||
@Autowired
|
@Autowired
|
||||||
private OrderCRUDController orderCRUDController;
|
private OrderCRUDController orderCRUDController;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PlanningStateCreator planningStateCreator;
|
private PlanningStateCreator planningStateCreator;
|
||||||
|
|
||||||
|
|
@ -220,14 +227,30 @@ public class MultipleTabsPlannerController implements Composer,
|
||||||
@Autowired
|
@Autowired
|
||||||
private URLHandlerRegistry registry;
|
private URLHandlerRegistry registry;
|
||||||
|
|
||||||
// Cannot Autowire it in GatheredUsageStats class
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IUserDAO userDAO;
|
private IUserDAO userDAO;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOrderModel orderModel;
|
private IOrderModel orderModel;
|
||||||
|
|
||||||
private boolean isGatheredStatsAlreadySent = false;
|
@Autowired
|
||||||
|
private IWorkReportModel workReportModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IWorkerModel workerModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMachineModel machineModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IExpenseSheetModel expenseSheetModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMaterialsModel materialsModel;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IAssignedTaskQualityFormsToOrderElementModel assignedQualityFormsModel;
|
||||||
|
|
||||||
|
|
||||||
private TabsConfiguration buildTabsConfiguration(final Desktop desktop) {
|
private TabsConfiguration buildTabsConfiguration(final Desktop desktop) {
|
||||||
|
|
||||||
|
|
@ -238,17 +261,19 @@ public class MultipleTabsPlannerController implements Composer,
|
||||||
@Override
|
@Override
|
||||||
public void typeChanged(ModeType oldType, ModeType newType) {
|
public void typeChanged(ModeType oldType, ModeType newType) {
|
||||||
switch (newType) {
|
switch (newType) {
|
||||||
|
|
||||||
case GLOBAL:
|
case GLOBAL:
|
||||||
ConfirmCloseUtil.resetConfirmClose();
|
ConfirmCloseUtil.resetConfirmClose();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ORDER:
|
case ORDER:
|
||||||
if (SecurityUtils.loggedUserCanWrite(mode.getOrder())) {
|
if ( SecurityUtils.loggedUserCanWrite(mode.getOrder()) ) {
|
||||||
ConfirmCloseUtil
|
ConfirmCloseUtil.setConfirmClose(
|
||||||
.setConfirmClose(
|
desktop,
|
||||||
desktop,
|
_("You are about to leave the planning editing. Unsaved changes will be lost!"));
|
||||||
_("You are about to leave the planning editing. Unsaved changes will be lost!"));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -510,12 +535,20 @@ public class MultipleTabsPlannerController implements Composer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !isGatheredStatsAlreadySent && configurationDAO.getConfiguration().isAllowToGatherUsageStatsEnabled() ){
|
// Send data to server
|
||||||
GatheredUsageStats gatheredUsageStats = new GatheredUsageStats();
|
if ( !SecurityUtils.isGatheredStatsAlreadySent &&
|
||||||
gatheredUsageStats.setupNotAutowiredClasses(userDAO, orderModel);
|
configurationDAO.getConfiguration().isAllowToGatherUsageStatsEnabled() )
|
||||||
gatheredUsageStats.sendGatheredUsageStatsToServer();
|
sendDataToServer();
|
||||||
isGatheredStatsAlreadySent = true;
|
}
|
||||||
}
|
|
||||||
|
private void sendDataToServer(){
|
||||||
|
GatheredUsageStats gatheredUsageStats = new GatheredUsageStats();
|
||||||
|
|
||||||
|
gatheredUsageStats.setupNotAutowiredClasses(userDAO, orderModel, workReportModel, workerModel, machineModel,
|
||||||
|
expenseSheetModel, materialsModel, assignedQualityFormsModel);
|
||||||
|
|
||||||
|
gatheredUsageStats.sendGatheredUsageStatsToServer();
|
||||||
|
SecurityUtils.isGatheredStatsAlreadySent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TabsRegistry getTabsRegistry() {
|
private TabsRegistry getTabsRegistry() {
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ public class QualityFormModel implements IQualityFormModel {
|
||||||
public List<QualityFormItem> getQualityFormItems() {
|
public List<QualityFormItem> getQualityFormItems() {
|
||||||
// Safe copy
|
// Safe copy
|
||||||
List<QualityFormItem> items = new ArrayList<QualityFormItem>();
|
List<QualityFormItem> items = new ArrayList<QualityFormItem>();
|
||||||
if (qualityForm != null) {
|
if ( qualityForm != null ) {
|
||||||
items.addAll(qualityForm.getQualityFormItems());
|
items.addAll(qualityForm.getQualityFormItems());
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,6 @@ import org.libreplan.business.planner.daos.IResourceAllocationDAO;
|
||||||
import org.libreplan.business.resources.daos.ICriterionDAO;
|
import org.libreplan.business.resources.daos.ICriterionDAO;
|
||||||
import org.libreplan.business.resources.daos.IResourceDAO;
|
import org.libreplan.business.resources.daos.IResourceDAO;
|
||||||
import org.libreplan.business.resources.daos.IWorkerDAO;
|
import org.libreplan.business.resources.daos.IWorkerDAO;
|
||||||
import org.libreplan.business.resources.daos.WorkerDAO;
|
|
||||||
import org.libreplan.business.resources.entities.Criterion;
|
import org.libreplan.business.resources.entities.Criterion;
|
||||||
import org.libreplan.business.resources.entities.CriterionSatisfaction;
|
import org.libreplan.business.resources.entities.CriterionSatisfaction;
|
||||||
import org.libreplan.business.resources.entities.CriterionWithItsType;
|
import org.libreplan.business.resources.entities.CriterionWithItsType;
|
||||||
|
|
@ -90,8 +89,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
@OnConcurrentModification(goToPage = "/resources/worker/worker.zul")
|
@OnConcurrentModification(goToPage = "/resources/worker/worker.zul")
|
||||||
public class WorkerModel extends IntegrationEntityModel implements IWorkerModel {
|
public class WorkerModel extends IntegrationEntityModel implements IWorkerModel {
|
||||||
|
|
||||||
private static final org.apache.commons.logging.Log LOG = LogFactory
|
private static final org.apache.commons.logging.Log LOG = LogFactory.getLog(WorkerModel.class);
|
||||||
.getLog(WorkerModel.class);
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IResourceDAO resourceDAO;
|
private IResourceDAO resourceDAO;
|
||||||
|
|
@ -99,9 +97,6 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel
|
||||||
@Autowired
|
@Autowired
|
||||||
private IBaseCalendarDAO baseCalendarDAO;
|
private IBaseCalendarDAO baseCalendarDAO;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IWorkerDAO workerDAO;
|
|
||||||
|
|
||||||
private final ICriterionType<?>[] laboralRelatedTypes = {
|
private final ICriterionType<?>[] laboralRelatedTypes = {
|
||||||
PredefinedCriterionTypes.LOCATION,
|
PredefinedCriterionTypes.LOCATION,
|
||||||
PredefinedCriterionTypes.CATEGORY, PredefinedCriterionTypes.SKILL };
|
PredefinedCriterionTypes.CATEGORY, PredefinedCriterionTypes.SKILL };
|
||||||
|
|
|
||||||
|
|
@ -46,9 +46,13 @@ import org.zkoss.zk.ui.Executions;
|
||||||
* @author Fernando Bellas Permuy <fbellas@udc.es>
|
* @author Fernando Bellas Permuy <fbellas@udc.es>
|
||||||
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
|
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
|
||||||
* @author Cristina Alvarino Perez <cristina.alvarino@comtecsf.es>
|
* @author Cristina Alvarino Perez <cristina.alvarino@comtecsf.es>
|
||||||
|
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||||
*/
|
*/
|
||||||
public final class SecurityUtils {
|
public final class SecurityUtils {
|
||||||
|
|
||||||
|
// Related to the data that is sending to LibrePlan server
|
||||||
|
public static boolean isGatheredStatsAlreadySent = false;
|
||||||
|
|
||||||
private SecurityUtils() {}
|
private SecurityUtils() {}
|
||||||
|
|
||||||
public final static boolean isUserInRole(UserRole role) {
|
public final static boolean isUserInRole(UserRole role) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue