Chorem-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 542 discussions
r360 - in trunk/chorem-webmotion/src/main: java/org/chorem/webmotion/actions/project webapp/WEB-INF/jsp webapp/css webapp/js
by meynier@users.chorem.org 08 Jul '13
by meynier@users.chorem.org 08 Jul '13
08 Jul '13
Author: meynier
Date: 2013-07-08 14:03:44 +0200 (Mon, 08 Jul 2013)
New Revision: 360
Url: http://chorem.org/projects/chorem/repository/revisions/360
Log:
Small changes on project dashboard for displaying alerts.
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
trunk/chorem-webmotion/src/main/webapp/css/jquery.fn.gantt.css
trunk/chorem-webmotion/src/main/webapp/js/chorem.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-08 12:03:44 UTC (rev 360)
@@ -67,7 +67,7 @@
HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
- HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
+ HashMap<Task, String> alertsMap = new HashMap<Task, String>();
HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
HashMap<Task, TaskCalculation> taskCalc = new HashMap<Task, TaskCalculation>();
@@ -78,6 +78,7 @@
List<Task> tasks = fetchTasks(quotation, client);
taskMap.put(quotation, tasks);
+ //Make the calculations for the tasks
for(Task t : tasks) {
TaskCalculation tc = new TaskCalculation(t, client);
tc.setSrp(config.getDailyReturn());
@@ -85,7 +86,7 @@
taskCalc.put(t, tc);
}
taskMap.put(quotation, tasks);
- alertsMap.put(quotation, getAlerts(client, quotation));
+ alertsMap.putAll(getAlerts(client, quotation));
QuotationCalculation calc = new QuotationCalculation(quotation, client);
calc.setSrp(config.getDailyReturn());
calc.calculate();
@@ -120,11 +121,11 @@
WikittyQueryResult<Task> taskResult = null;
HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
- HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
+ HashMap<Task, String> alertsMap = new HashMap<Task, String>();
HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
HashMap<Task, TaskCalculation> taskCalc = new HashMap<Task, TaskCalculation>();
- //Fetch the project from the id
+ //Fetch the projects from the id or the filter
WikittyQueryMaker projectQueryMaker = new WikittyQueryMaker();
if(id != null && !id.equals(""))
projectQueryMaker.ideq(id);
@@ -138,7 +139,7 @@
(new WikittyQueryMaker()).exteq(Configuration.EXT_CONFIGURATION).end()
).get(0);
- //Fetch the quotations form the project (if there is one)
+ //Fetch the quotations from the projects
if(projectResult.size() != 0) {
for(Project project : projectResult.getAll()) {
WikittyQuery quotationQuery = null;
@@ -173,19 +174,15 @@
taskCalc.put(t, tc);
}
- alertsMap.put(quote, getAlerts(client, quote));
+ alertsMap.putAll(getAlerts(client, quote));
QuotationCalculation calc = new QuotationCalculation(quote, client);
calc.setSrp(config.getDailyReturn());
calc.calculate();
calculations.put(quote, calc);
}
-
}
-
-
}
-
}
return renderView("dashboardSingleProject.jsp", "locale", client.getUserLocale(),
@@ -207,44 +204,53 @@
WikittyQuery taskQuery = new WikittyQueryMaker()
.eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
.end();
+
+ taskQuery.addSortAscending(Quotation.ELEMENT_FIELD_INTERVAL_BEGINDATE);
WikittyQueryResult taskResult = client.findAllByQuery(Task.class, taskQuery);
return taskResult.getAll();
}
- private List<String> getAlerts(ChoremClient client, Quotation q) {
+ private HashMap<Task, String> getAlerts(ChoremClient client, Quotation q) {
List<Task> tasks = fetchTasks(q, client);
Calendar now = new GregorianCalendar();
- List<String> messages = new ArrayList<String>();
+ HashMap<Task, String> messages = new HashMap<Task, String>();
for(Task t : tasks) {
if(t.getBeginDate() != null && t.getEndDate() != null) {
+ String str = "<h4>Warning</h4>";
+ boolean alert = false;
//Test if the statuses are correct
if(t.getStatus().equalsIgnoreCase("Scheduled")) {
if(t.getBeginDate().before(now.getTime())) {
- System.out.println("should be started");
- messages.add( "Task " + t.getName() + " should be started");
+ alert = true;
+ str += "Task " + t.getName() + " should be started";
}
}
else if(t.getStatus().equalsIgnoreCase("Started")) {
if(t.getBeginDate().after(now.getTime())) {
- System.out.println("started in advance");
- messages.add( "Task " + t.getName() + " has been started in advance");
+ alert = true;
+ str += "Task " + t.getName() + " has been started in advance";
}
else if(t.getEndDate().before(now.getTime())) {
- System.out.println("should be ended");
- messages.add( "Task " + t.getName() + " should have ended by now");
+ alert = true;
+ str += "Task " + t.getName() + " should have ended by now";
}
}
else if(t.getStatus().equalsIgnoreCase("Finished")) {
if(t.getEndDate().after(now.getTime())) {
- System.out.println("finished in advance");
- messages.add( "Task " + t.getName() + " has been finished in advance");
+ alert = true;
+ str += "Task " + t.getName() + " has been finished in advance";
}
}
+ if(alert) {
+ messages.put(t,str);
+ }
+
}
}
+
return messages;
}
@@ -271,6 +277,9 @@
WikittyQuery quotationQuery = quotationQueryMaker.or()
.bw(Interval.FQ_FIELD_INTERVAL_BEGINDATE, from, to)
.bw(Interval.FQ_FIELD_INTERVAL_ENDDATE, from, to)
+ .and()
+ .le(Interval.FQ_FIELD_INTERVAL_BEGINDATE, from)
+ .ge(Interval.FQ_FIELD_INTERVAL_ENDDATE, to)
.end();
WikittyQueryResult<Quotation> result =
client.findAllByQuery(Quotation.class, quotationQuery);
@@ -346,14 +355,17 @@
}
Values[] v = null;
- //if(t.getReestimatedEnd() != null)
- // v= new Values[2];
- //else
- v = new Values[1];
+ if(t.getDayExtension() != 0)
+ v= new Values[2];
+ else
+ v = new Values[1];
v[0] = new Values(t.getBeginDate(), t.getEndDate(), t.getName(), customClass, t.getWikittyId());
- //if(t.getReestimatedEnd() != null)
- // v[1]= new Values(t.getEndDate(), t.getReestimatedEnd(), "Reestimated end", "ganttOrange");
-
+ if(t.getDayExtension() != 0) {
+ GregorianCalendar newEnd = new GregorianCalendar();
+ newEnd.setTime(t.getEndDate());
+ newEnd.add(Calendar.DAY_OF_YEAR, (int) t.getDayExtension());
+ v[1]= new Values(t.getEndDate(), newEnd.getTime(), "Reestimated end", "ganttOrange", t.getWikittyId());
+ }
JTask jt = new JTask(t.getName(), t.getDescription(), t.getWikittyId(),t.getPrice(), t.getEstimatedDays(), v);
lTask.add(jt);
@@ -449,12 +461,12 @@
}
- private class QuotationSorter<T> implements Comparator {
+ private class IntervalSorter<T extends Interval> implements Comparator {
@Override
public int compare(Object q1, Object q2) {
- return ((Quotation)q1).getBeginDate().compareTo(((Quotation)q2).getBeginDate());
+ return ((T)q1).getBeginDate().compareTo(((T)q2).getBeginDate());
}
}
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-08 12:03:44 UTC (rev 360)
@@ -27,6 +27,7 @@
<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
<f:setLocale value="${locale}"/>
+
<link rel="stylesheet" href="<c:url value='/css/jquery.fn.gantt.css'/>" />
<h1>${title}</h1>
<form class="well form-inline" method="GET" id="projectSearch">
@@ -69,13 +70,13 @@
<td class="number"><w:display wikitty="${q.wikitty}" fqfield="Quotation.estimatedDays" label=""/></td>
<td class="number"> <f:formatNumber type="number"
- maxFractionDigits="2" value="${calculations[q].getTjm()}" /></td>
+ maxFractionDigits="2" value="${calculations[q].getAdr()}" /></td>
<td class="number"> <f:formatNumber type="number"
maxFractionDigits="2" value="${calculations[q].getRealDays()}" /></td>
<td class="number"> <f:formatNumber type="number"
maxFractionDigits="2" value="${calculations[q].getDeltaDays()}" /></td>
<td class="number"> <f:formatNumber type="number"
- maxFractionDigits="2" value="${calculations[q].getRealTjm()}" /></td>
+ maxFractionDigits="2" value="${calculations[q].getRealAdr()}" /></td>
<td class="currency"> <f:formatNumber type="currency"
maxFractionDigits="2" value="${calculations[q].getExpectedProfit()}" /></td>
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-08 12:03:44 UTC (rev 360)
@@ -81,7 +81,7 @@
<c:forEach var="p" items="${projects}">
<c:if test="${not empty quotations[p]}">
<h2 style="display: inline;">${p.name}</h2>
- <a href="<c:url value="/wikitty/edit/${param.project_id}"/>"><i
+ <a href="<c:url value="/wikitty/edit/${p.wikittyId}"/>"><i
class="icon-pencil icon-black"></i><small>edit</small></a>
<p>${p.description}</p>
@@ -101,7 +101,7 @@
<w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
label="" pattern="dd/MM/yyyy" />
au
- <w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
+ <w:display wikitty="${q.wikitty}" fqfield="Interval.endDate"
label="" pattern="dd/MM/yyyy" />
<br />Statut :
${q.wikitty.extensionNames.toArray()[q.wikitty.extensionNames.size()
@@ -121,8 +121,6 @@
<th>Gain/perte</th>
</tr>
</thead>
-
-
<tbody>
<tr>
@@ -133,9 +131,9 @@
<td class="number"><w:display wikitty="${q.wikitty}"
fqfield="Quotation.estimatedDays" label="" /></td>
<td class="currency"><f:formatNumber type="currency"
- maxFractionDigits="2" value="${calculations[q].getTjm()}" /></td>
+ maxFractionDigits="2" value="${calculations[q].getAdr()}" /></td>
<td class="currency"><f:formatNumber type="currency"
- maxFractionDigits="2" value="${calculations[q].getRealTjm()}" /></td>
+ maxFractionDigits="2" value="${calculations[q].getRealAdr()}" /></td>
<td class="currency"><w:display wikitty="${q.wikitty}"
fqfield="Quotation.amount" label="" /></td>
<td class="currency"><f:formatNumber type="currency"
@@ -148,66 +146,63 @@
- <c:forEach var="a" items="${alerts[q]}">
- <div class="alert-error alert">
- <div class="alert-block">${a}</div>
- </div>
-
- </c:forEach>
-
<div class="gantt gantt-${q.wikittyId}" wikittyId="${q.wikittyId}"
data=''>Pas de tâche</div>
-
-
- <table class="table table-striped table-bordered table-condensed">
- <thead>
- <tr>
- <th>Nom</th>
- <th>Montant</th>
- <th>Jours estimés</th>
- <th>Jours réels</th>
- <th>Différence estimation/réel</th>
- <th>TJM estimé</th>
- <th>TJM réel</th>
- <th>Gain attendu</th>
- <th>Gain/perte</th>
- </tr>
- </thead>
- <tbody>
- <c:forEach items="${taskMap[q]}" var="task">
+ <c:if test="${taskMap[q].size() != 0}">
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
<tr>
- <td><a href="<c:url value="/wikitty/view/${task.wikittyId}"/>">
- <w:display wikitty="${task.wikitty}" fqfield="Task.name"
- label="" /></a></td>
- <td><w:display wikitty="${task.wikitty}"
- fqfield="Task.price" label="" /></td>
- <td class="number"><w:display wikitty="${task.wikitty}"
- fqfield="Task.estimatedDays" label="" /></td>
- <td class="number"><f:formatNumber type="number"
- maxFractionDigits="2" value="${taskCalc[task].getRealDays()}" /></td>
- <td class="number"><f:formatNumber type="number"
- maxFractionDigits="2" value="${taskCalc[task].getDeltaDays()}" /></td>
- <td class="number"><f:formatNumber type="number"
- maxFractionDigits="2" value="${taskCalc[task].getTjm()}" /></td>
+ <th>Nom</th>
+ <th>Montant</th>
+ <th>Jours estimés</th>
+ <th>Jours réels</th>
+ <th>Différence estimation/réel</th>
+ <th>TJM estimé</th>
+ <th>TJM réel</th>
+ <th>Gain attendu</th>
+ <th>Gain/perte</th>
+ </tr>
+ </thead>
+ <tbody>
+ <c:forEach items="${taskMap[q]}" var="task">
+ <tr id="taskrow-${task.wikittyId}">
+ <td <c:if test="${not empty alerts[task]}">class="task-alert"</c:if>><a
+ href="<c:url value="/wikitty/view/${task.wikittyId}"/>"> <w:display
+ wikitty="${task.wikitty}" fqfield="Task.name" label="" /></a>
+ <c:if test="${not empty alerts[task]}">
+ <i class="icon-warning-sign" title="${alerts[task]}"></i>
+ </c:if>
+
+
+ <td><w:display wikitty="${task.wikitty}"
+ fqfield="Task.price" label="" /></td>
+ <td class="number"><w:display wikitty="${task.wikitty}"
+ fqfield="Task.estimatedDays" label="" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getRealDays()}" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getDeltaDays()}" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getAdr()}" /></td>
- <td class="number"><f:formatNumber type="number"
- maxFractionDigits="2" value="${taskCalc[task].getRealTjm()}" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getRealAdr()}" /></td>
- <td class="currency"><f:formatNumber type="currency"
- maxFractionDigits="2"
- value="${taskCalc[task].getExpectedProfit()}" /></td>
- <td class="currency"><f:formatNumber type="currency"
- maxFractionDigits="2"
- value="${taskCalc[task].getLossOrProfit()}" /></td>
- </tr>
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2"
+ value="${taskCalc[task].getExpectedProfit()}" /></td>
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2"
+ value="${taskCalc[task].getLossOrProfit()}" /></td>
+ </tr>
- </c:forEach>
- </tbody>
- </table>
-
+ </c:forEach>
+ </tbody>
+ </table>
+ </c:if>
</c:forEach>
</c:if>
Modified: trunk/chorem-webmotion/src/main/webapp/css/jquery.fn.gantt.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/jquery.fn.gantt.css 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/webapp/css/jquery.fn.gantt.css 2013-07-08 12:03:44 UTC (rev 360)
@@ -28,9 +28,11 @@
width: 100%;
}
+.task-alert a {
+ color:red;
+}
-
/* === LEFT PANEL === */
.fn-gantt .leftPanel {
Modified: trunk/chorem-webmotion/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-08 12:03:44 UTC (rev 360)
@@ -756,6 +756,8 @@
$("#quotationFilter").change(function() {
$("#projectSearch").submit();
});
+ $(".task-alert").tooltip();
+
function initgantt(id) {
"use strict";
$.get(createUrl("/project/json/getGanttInfo/",id),
@@ -776,7 +778,9 @@
window.location ="wikitty/edit/" + data;
},
onAddClick: function(dt, rowId) {
- alert("Empty space clicked - add an item!");
+ var d = new Date(parseInt(dt,10));
+ var str = d.getDay() +"/"+ d.getMonth() +"/"+ d.getFullYear();
+ window.location ="wikitty/Task/edit/new?Interval.beginDate=" + str +"&Task.quotation=" + id;
},
onRender: function() {
if (window.console && typeof console.log === "function") {
@@ -798,6 +802,6 @@
initgantt(div.attributes.wikittyid.nodeValue);
}
+
-
});
\ No newline at end of file
Modified: trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js 2013-07-03 15:30:35 UTC (rev 359)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js 2013-07-08 12:03:44 UTC (rev 360)
@@ -384,8 +384,6 @@
entries.push('</div>');
}
-
-
}
});
ganttLeftPanel.append(entries.join(""));
@@ -1224,7 +1222,7 @@
day.customClass ? day.customClass : "",
entry.desc ? entry.desc : "",
day.label ? day.label : "",
- ntry.price ? entry.price : "",
+ entry.price ? entry.price : "",
entry.estimatedDays ? entry.estimatedDays : "",
day.dataObj ? day.dataObj : null
);
1
0
r359 - in trunk/chorem-webmotion/src/main: java/org/chorem/webmotion/actions/project webapp/WEB-INF/jsp webapp/js
by meynier@users.chorem.org 03 Jul '13
by meynier@users.chorem.org 03 Jul '13
03 Jul '13
Author: meynier
Date: 2013-07-03 17:30:35 +0200 (Wed, 03 Jul 2013)
New Revision: 359
Url: http://chorem.org/projects/chorem/repository/revisions/359
Log:
Added task calculations and enhanced alerts
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
trunk/chorem-webmotion/src/main/webapp/js/chorem.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-03 15:30:35 UTC (rev 359)
@@ -53,11 +53,11 @@
* @return
*/
public Render singleQuotationFilter(ChoremClient client, String id, String quotationFilter) {
-
+
//Fetch the quotation from the filter
WikittyQuery quotationQuery = new WikittyQueryMaker().ideq(quotationFilter).end();
WikittyQueryResult<Quotation> quotationResult = client.findAllByQuery(Quotation.class, quotationQuery);
-
+
//If some quotation has been found
if(quotationResult != null) {
Quotation quotation = quotationResult.get(0);
@@ -68,16 +68,37 @@
HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
-
+ HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
+ HashMap<Task, TaskCalculation> taskCalc = new HashMap<Task, TaskCalculation>();
+
quotations.put(projectResult.get(0), quotationResult.getAll());
-
- taskMap.put(quotation, fetchTasks(quotation, client));
+ Configuration config = client.findAllByQuery(Configuration.class,
+ (new WikittyQueryMaker()).exteq(Configuration.EXT_CONFIGURATION).end()
+ ).get(0);
+
+ List<Task> tasks = fetchTasks(quotation, client);
+ taskMap.put(quotation, tasks);
+ for(Task t : tasks) {
+ TaskCalculation tc = new TaskCalculation(t, client);
+ tc.setSrp(config.getDailyReturn());
+ tc.calculate();
+ taskCalc.put(t, tc);
+ }
+ taskMap.put(quotation, tasks);
alertsMap.put(quotation, getAlerts(client, quotation));
+ QuotationCalculation calc = new QuotationCalculation(quotation, client);
+ calc.setSrp(config.getDailyReturn());
+ calc.calculate();
+ calculations.put(quotation, calc);
- return renderView("dashboardSingleProject.jsp",
+
+
+
+ return renderView("dashboardSingleProject.jsp", "locale", client.getUserLocale(),
"title", "Tableau de bord projet", "projects", projectResult.getAll(),
"quotations", quotations, "taskMap", taskMap, "extensions",
- Extensions.extensions, "alerts", alertsMap);
+ Extensions.extensions, "alerts", alertsMap, "calculations", calculations,
+ "taskCalc", taskCalc);
}
else {
@@ -100,6 +121,9 @@
HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
+ HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
+ HashMap<Task, TaskCalculation> taskCalc = new HashMap<Task, TaskCalculation>();
+
//Fetch the project from the id
WikittyQueryMaker projectQueryMaker = new WikittyQueryMaker();
if(id != null && !id.equals(""))
@@ -110,6 +134,10 @@
projectResult = client.findAllByQuery(Project.class, projectQuery);
+ Configuration config = client.findAllByQuery(Configuration.class,
+ (new WikittyQueryMaker()).exteq(Configuration.EXT_CONFIGURATION).end()
+ ).get(0);
+
//Fetch the quotations form the project (if there is one)
if(projectResult.size() != 0) {
for(Project project : projectResult.getAll()) {
@@ -125,8 +153,8 @@
else if (quotationFilter.equals("all")){
wqm.eq(Quotation.ELEMENT_FIELD_QUOTATION_PROJECT, project);
}
-
+
quotationQuery = wqm.end();
quotationQuery.setLimit(20);
quotationQuery.addSortDescending(Quotation.ELEMENT_FIELD_INTERVAL_BEGINDATE);
@@ -136,23 +164,38 @@
//Fetch the tasks form the quotations (if there are some)
if(quotationResult != null) {
for(Quotation quote : quotationResult.getAll()) {
- taskMap.put(quote, fetchTasks(quote, client));
+ List<Task> tasks = fetchTasks(quote, client);
+ taskMap.put(quote, tasks);
+ for(Task t : tasks) {
+ TaskCalculation tc = new TaskCalculation(t, client);
+ tc.setSrp(config.getDailyReturn());
+ tc.calculate();
+ taskCalc.put(t, tc);
+ }
+
alertsMap.put(quote, getAlerts(client, quote));
+
+ QuotationCalculation calc = new QuotationCalculation(quote, client);
+ calc.setSrp(config.getDailyReturn());
+ calc.calculate();
+ calculations.put(quote, calc);
}
}
+
}
}
- return renderView("dashboardSingleProject.jsp",
+ return renderView("dashboardSingleProject.jsp", "locale", client.getUserLocale(),
"title", "Tableau de bord projet", "projects", projectResult.getAll(),
"quotations", quotations, "taskMap", taskMap, "extensions",
- Extensions.extensions, "alerts", alertsMap);
+ Extensions.extensions, "alerts", alertsMap, "calculations", calculations,
+ "taskCalc", taskCalc);
}
-
+
/**
* Fetch the task from the given quotation
* Simple wikitty query
@@ -168,41 +211,39 @@
WikittyQueryResult taskResult = client.findAllByQuery(Task.class, taskQuery);
return taskResult.getAll();
}
-
+
private List<String> getAlerts(ChoremClient client, Quotation q) {
List<Task> tasks = fetchTasks(q, client);
Calendar now = new GregorianCalendar();
List<String> messages = new ArrayList<String>();
for(Task t : tasks) {
-
- System.out.println("Starting task alerts for " + t.getName());
- System.out.println("Task is " + t.getStatus());
- System.out.println(now.getTime());
- //Test if the statuses are correct
- if(t.getStatus().equals("Scheduled")) {
- if(t.getBeginDate().before(now.getTime())) {
- System.out.println("should be started");
- messages.add( "Task " + t.getName() + " should be started");
+ if(t.getBeginDate() != null && t.getEndDate() != null) {
+ //Test if the statuses are correct
+ if(t.getStatus().equalsIgnoreCase("Scheduled")) {
+ if(t.getBeginDate().before(now.getTime())) {
+ System.out.println("should be started");
+ messages.add( "Task " + t.getName() + " should be started");
+ }
}
- }
- else if(t.getStatus().equals("Started")) {
- if(t.getBeginDate().after(now.getTime())) {
- System.out.println("started in advance");
- messages.add( "Task " + t.getName() + " has been started in advance");
+ else if(t.getStatus().equalsIgnoreCase("Started")) {
+ if(t.getBeginDate().after(now.getTime())) {
+ System.out.println("started in advance");
+ messages.add( "Task " + t.getName() + " has been started in advance");
+ }
+ else if(t.getEndDate().before(now.getTime())) {
+ System.out.println("should be ended");
+ messages.add( "Task " + t.getName() + " should have ended by now");
+ }
}
- else if(t.getEndDate().before(now.getTime())) {
- System.out.println("should be ended");
- messages.add( "Task " + t.getName() + " should have ended by now");
+ else if(t.getStatus().equalsIgnoreCase("Finished")) {
+
+ if(t.getEndDate().after(now.getTime())) {
+ System.out.println("finished in advance");
+ messages.add( "Task " + t.getName() + " has been finished in advance");
+ }
}
}
- else if(t.getStatus().equals("Finished")) {
-
- if(t.getEndDate().after(now.getTime())) {
- System.out.println("fnished in advance");
- messages.add( "Task " + t.getName() + " has been finished in advance");
- }
- }
-
+
}
return messages;
}
@@ -247,6 +288,7 @@
return renderView("dashboardMultiProject.jsp",
"title", "Tableau de bord projets",
+ "locale", client.getUserLocale(),
"quotations", quotations,
"calculations", calculations);
@@ -308,7 +350,7 @@
// v= new Values[2];
//else
v = new Values[1];
- v[0] = new Values(t.getBeginDate(), t.getEndDate(), t.getName(), customClass);
+ v[0] = new Values(t.getBeginDate(), t.getEndDate(), t.getName(), customClass, t.getWikittyId());
//if(t.getReestimatedEnd() != null)
// v[1]= new Values(t.getEndDate(), t.getReestimatedEnd(), "Reestimated end", "ganttOrange");
@@ -391,11 +433,13 @@
private String to;
private String label;
private String customClass;
- public Values(Date from, Date to, String label, String customClass) {
+ private String dataObj;
+ public Values(Date from, Date to, String label, String customClass, String dataObj) {
this.from = "/Date(" + from.getTime() + ")/";
this.to = "/Date(" + to.getTime() + ")/";
this.label = label;
this.customClass = customClass;
+ this.dataObj = dataObj;
}
@Override
public int compareTo(Object o) {
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-03 15:30:35 UTC (rev 359)
@@ -2,10 +2,8 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Date;
import org.chorem.ChoremClient;
-import org.chorem.entities.Interval;
import org.chorem.entities.Quotation;
import org.chorem.entities.Task;
import org.chorem.entities.Time;
@@ -13,57 +11,19 @@
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
-public class QuotationCalculation {
+public class QuotationCalculation extends Calculation<Quotation> {
- private Quotation q;
- private ChoremClient client;
- private static final int SEC_PER_HOUR = 3600;
- private static final int WORKING_HOURS_PER_DAY = 7;
- private double srp = 1;
- private Double tjm = null;
- private Double realDays = null;
- private Double deltaDays = null;
- private Double realTjm = null;
- private Double expectedProfit = null;
- private Double lossOrProfit = null;
- private Double resultPerDay = null;
-
-
-
public QuotationCalculation(Quotation q, ChoremClient client) {
- this.q = q;
- this.client = client;
+ super(q, q.getAmount(), q.getEstimatedDays(), client);
}
-
- public void calculate() {
- this.tjm = tjm();
- this.realDays = realDays();
- this.deltaDays = deltaDays();
- this.realTjm = realTjm();
- this.expectedProfit = expectedProfit();
- this.lossOrProfit = lossOrProfit();
- this.resultPerDay = resultPerDay();
- }
-
- public double tjm() {
- double amount = q.getAmount();
- double nbDays = q.getEstimatedDays();
-
- return amount/nbDays;
-
- }
-
- private double getPeriodInSeconds(Date start, Date end) {
- return (end.getTime()-start.getTime())/1000;
- }
-
+ @Override
public double realDays() {
//test if quotation is finished
- if(q.getExtensionNames().contains("Closed")) {
+ if(e.getExtensionNames().contains("Closed")) {
//Calculate the days from the times objects
WikittyQuery taskQuery = new WikittyQueryMaker()
- .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
+ .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, e)
.end();
WikittyQueryResult<Task> result =
@@ -73,7 +33,7 @@
WikittyQuery timeQuery = new WikittyQueryMaker()
.eq(Time.ELEMENT_FIELD_TIME_TASK, t)
.end();
- WikittyQueryResult timeResult = client.findAllByQuery(Time.class, timeQuery);
+ WikittyQueryResult<Time> timeResult = client.findAllByQuery(Time.class, timeQuery);
times.addAll(timeResult.getAll());
}
double totalTime = 0;
@@ -87,7 +47,7 @@
else {
//nbDays + day extensions from tasks
WikittyQuery taskQuery = new WikittyQueryMaker()
- .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
+ .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, e)
.end();
WikittyQueryResult<Task> result =
@@ -97,80 +57,9 @@
for(Task t : result.getAll()) {
totalDayExt += t.getDayExtension();
}
- return q.getEstimatedDays() + totalDayExt;
+ return nbDays + totalDayExt;
}
}
- public double deltaDays() {
- return getRealDays() - q.getEstimatedDays();
- }
-
- public double realTjm() {
- double amount = q.getAmount();
- double nbDays = getRealDays();
-
- return amount/nbDays;
- }
-
- public double expectedProfit() {
- double nbDays = q.getEstimatedDays();
- return (getTjm() - srp) * nbDays;
- }
-
- public double lossOrProfit() {
- double amount = q.getAmount();
- return amount - (getRealDays() * srp);
- }
-
- public double resultPerDay() {
- return getLossOrProfit() / getRealDays();
- }
-
- public double getTjm() {
- if(tjm == null)
- return tjm();
- else
- return tjm;
- }
- public double getRealDays() {
- if(realDays == null)
- return realDays();
- else
- return realDays;
- }
- public double getDeltaDays() {
- if(deltaDays == null)
- return deltaDays;
- else
- return deltaDays;
- }
- public double getRealTjm() {
- if(realTjm == null)
- return realTjm();
- else
- return realTjm;
- }
- public double getExpectedProfit() {
- if(expectedProfit == null)
- return expectedProfit();
- else
- return expectedProfit;
- }
- public double getLossOrProfit() {
- if(lossOrProfit == null)
- return lossOrProfit();
- else
- return lossOrProfit;
- }
- public double getResultPerDay() {
- if(resultPerDay == null)
- return resultPerDay();
- else
- return resultPerDay;
- }
- public void setSrp(double val) {
- this.srp = val;
- }
-
}
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-03 15:30:35 UTC (rev 359)
@@ -26,7 +26,7 @@
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
-
+<f:setLocale value="${locale}"/>
<link rel="stylesheet" href="<c:url value='/css/jquery.fn.gantt.css'/>" />
<h1>${title}</h1>
<form class="well form-inline" method="GET" id="projectSearch">
@@ -59,7 +59,7 @@
</thead>
<c:forEach var="q" items="${quotations}">
<tbody>
- <tr><f:setLocale value="fr_FR"/>
+ <tr>
<td><w:display wikitty="${q.wikitty}" fqfield="Quotation.customer" label=""/></td>
<td><w:display wikitty="${q.wikitty}" fqfield="Quotation.project" label=""/>
<a href="<c:url value="/wikitty/edit/${q.wikittyId}"/>"><i
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-03 15:30:35 UTC (rev 359)
@@ -26,7 +26,7 @@
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
-
+<f:setLocale value="${locale}" />
<link rel="stylesheet" href="<c:url value='/css/jquery.fn.gantt.css'/>" />
<h1>${title}</h1>
@@ -69,10 +69,10 @@
</script>
<input type="text" id="project_text" name="project_name"
- value="${param.project_name}" placeholder="project name" />
- <input type="hidden" id="project_hidden" name="project_id"
+ value="${param.project_name}" placeholder="project name" /> <input
+ type="hidden" id="project_hidden" name="project_id"
value='<c:if test='${!param.project_name.equals("") }'>${param.project_id}</c:if>' />
-
+
</div>
</div>
@@ -108,16 +108,17 @@
-1]}
</p>
-
+
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<th>Responsable Code Lutin</th>
<th>Responsable entreprise</th>
- <th>Estimated days</th>
- <th>Conversion hope</th>
- <th>Hoped price day</th>
- <th>Amount</th>
+ <th>Jours estimés</th>
+ <th>TJM estimé</th>
+ <th>TJM réel</th>
+ <th>Montant</th>
+ <th>Gain/perte</th>
</tr>
</thead>
@@ -131,63 +132,86 @@
fqfield="Quotation.customer" label="" /></td>
<td class="number"><w:display wikitty="${q.wikitty}"
fqfield="Quotation.estimatedDays" label="" /></td>
- <td class="percent"><w:display wikitty="${q.wikitty}"
- fqfield="Quotation.conversionHope" label="" /></td>
<td class="currency"><f:formatNumber type="currency"
- value="${q.amount / q.estimatedDays}" /></td>
+ maxFractionDigits="2" value="${calculations[q].getTjm()}" /></td>
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2" value="${calculations[q].getRealTjm()}" /></td>
<td class="currency"><w:display wikitty="${q.wikitty}"
fqfield="Quotation.amount" label="" /></td>
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2"
+ value="${calculations[q].getLossOrProfit()}" /></td>
</tr>
</tbody>
</table>
- ${alerts[q]}
+
+
+
+ <c:forEach var="a" items="${alerts[q]}">
+
+ <div class="alert-error alert">
+ <div class="alert-block">${a}</div>
+ </div>
+
+ </c:forEach>
+
<div class="gantt gantt-${q.wikittyId}" wikittyId="${q.wikittyId}"
data=''>Pas de tâche</div>
- <!--
- <p>Liste des tâches :</p>
- <c:forEach items="${taskMap}" var="entry">
- <c:if test="${entry.key.equals(q)}">
- <ul>
- <c:forEach items="${entry.value}" var="task">
- <li><a
- href="<c:url value="/wikitty/view/${task.wikittyId}"/>">${task.name}
- : ${task.description}</a></li>
- </c:forEach>
- </ul>
- </c:if>
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th>Nom</th>
+ <th>Montant</th>
+ <th>Jours estimés</th>
+ <th>Jours réels</th>
+ <th>Différence estimation/réel</th>
+ <th>TJM estimé</th>
+ <th>TJM réel</th>
+ <th>Gain attendu</th>
+ <th>Gain/perte</th>
+ </tr>
+ </thead>
+ <tbody>
+ <c:forEach items="${taskMap[q]}" var="task">
+ <tr>
+ <td><a href="<c:url value="/wikitty/view/${task.wikittyId}"/>">
+ <w:display wikitty="${task.wikitty}" fqfield="Task.name"
+ label="" /></a></td>
+ <td><w:display wikitty="${task.wikitty}"
+ fqfield="Task.price" label="" /></td>
+ <td class="number"><w:display wikitty="${task.wikitty}"
+ fqfield="Task.estimatedDays" label="" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getRealDays()}" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getDeltaDays()}" /></td>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getTjm()}" /></td>
- </c:forEach>
- <p>
- <select class="extBox" name="extList" wikittyId="${q.wikittyId}">
- <option>Transformer en...</option>
- <c:forEach items="${extensions}" var="ext">
- <c:set var="contains" value="false" />
- <c:forEach var="item" items="${q.extensionNames}">
- <c:if test="${item eq ext}">
- <c:set var="contains" value="true" />
- </c:if>
- </c:forEach>
- <c:if test="${contains == false}">
- <option>${ext}</option>
- </c:if>
+ <td class="number"><f:formatNumber type="number"
+ maxFractionDigits="2" value="${taskCalc[task].getRealTjm()}" /></td>
+
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2"
+ value="${taskCalc[task].getExpectedProfit()}" /></td>
+ <td class="currency"><f:formatNumber type="currency"
+ maxFractionDigits="2"
+ value="${taskCalc[task].getLossOrProfit()}" /></td>
+ </tr>
+
+
</c:forEach>
- </select>
- </p>
- <div id="upgradeFields-${q.wikittyId}"></div>
--->
+ </tbody>
+ </table>
+
</c:forEach>
</c:if>
</c:forEach>
-<script src="<c:url value='/js/jquery.fn.gantt.js'/>"></script>
-
-
-
-
-
+<script src="<c:url value='/js/jquery.fn.gantt.js'/>"></script>
\ No newline at end of file
Modified: trunk/chorem-webmotion/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-03 15:30:35 UTC (rev 359)
@@ -761,7 +761,6 @@
$.get(createUrl("/project/json/getGanttInfo/",id),
function(ret){
var data = ret['data'];
- console.log(data);
if(data['source'].length != 0) {
$(".gantt-"+id).gantt({
source: data['source'],
@@ -774,7 +773,7 @@
minScale: "days",
itemsPerPage: 10,
onItemClick: function(data) {
- window.location ="wikitty/edit/" + this.source[0].wikittyId;
+ window.location ="wikitty/edit/" + data;
},
onAddClick: function(dt, rowId) {
alert("Empty space clicked - add an item!");
Modified: trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js 2013-07-02 16:04:44 UTC (rev 358)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.fn.gantt.js 2013-07-03 15:30:35 UTC (rev 359)
@@ -368,13 +368,17 @@
var entries = [];
$.each(element.data, function (i, entry) {
if (i >= element.pageNum * settings.itemsPerPage && i < (element.pageNum * settings.itemsPerPage + settings.itemsPerPage)) {
-
- entries.push('<div class="row name row' + i + (entry.desc ? '' : ' fn-wide') + '" id="rowheader' + i + '" offset="' + i % settings.itemsPerPage * tools.getCellSize() + '">');
+ entries.push('<div class="row name row' + i + (entry.desc ? '' : ' fn-wide')
+ + '" id="rowheader' + i + '" offset="'
+ + i % settings.itemsPerPage * tools.getCellSize() + '" dataObj="'
+ + entry.wikittyId + '">');
entries.push('<span class="fn-label' + (entry.cssClass ? ' ' + entry.cssClass : '') + '">' + entry.name + '</span>');
entries.push('</div>');
if (entry.desc) {
- entries.push('<div class="row desc row' + i + ' " id="RowdId_' + i + '" data-id="' + entry.id + '">');
+ entries.push('<div class="row desc row' + i + ' " id="RowdId_' + i + '" data-id="'
+ + entry.id + '" dataObj="'
+ + entry.wikittyId + '">');
entries.push('<span class="fn-label' + (entry.cssClass ? ' ' + entry.cssClass : '') + '">' + entry.desc + '</span>');
@@ -388,7 +392,12 @@
ganttLeftPanel.find('.row:not(.spacer)').mouseover(core.mover)
.mouseout(core.mout)
.mousemove(core.mmove)
- .attr('over', 'text');
+ .attr('over', 'text')
+ .click(function (e) {
+ e.stopPropagation();
+ settings.onItemClick($(this).attr("dataObj"));
+ });
+
return ganttLeftPanel;
},
1
0
r358 - in trunk/chorem-webmotion/src/main: java/org/chorem/webmotion/actions/project webapp/WEB-INF/jsp webapp/js
by meynier@users.chorem.org 02 Jul '13
by meynier@users.chorem.org 02 Jul '13
02 Jul '13
Author: meynier
Date: 2013-07-02 18:04:44 +0200 (Tue, 02 Jul 2013)
New Revision: 358
Url: http://chorem.org/projects/chorem/repository/revisions/358
Log:
project dashboard filter works differently. started to manage alerts. Added fields with SRP in multi-project dashoard
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
trunk/chorem-webmotion/src/main/webapp/js/chorem.js
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-01 12:32:53 UTC (rev 357)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-02 16:04:44 UTC (rev 358)
@@ -21,6 +21,7 @@
import org.debux.webmotion.server.call.Call;
import org.debux.webmotion.server.render.Render;
import org.chorem.entities.Closed;
+import org.chorem.entities.Configuration;
import org.chorem.entities.Interval;
import org.chorem.entities.Quotation;
import org.chorem.entities.Project;
@@ -31,6 +32,8 @@
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
+
+import com.google.common.collect.Iterables;
import com.google.gson.*;
/**
*
@@ -42,81 +45,166 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(DashboardProjectAction.class);
+ /**
+ * Return the view for a single quotation
+ * @param client Chorem client
+ * @param id Project ID (useless here)
+ * @param quotationFilter Quotation id
+ * @return
+ */
+ public Render singleQuotationFilter(ChoremClient client, String id, String quotationFilter) {
+
+ //Fetch the quotation from the filter
+ WikittyQuery quotationQuery = new WikittyQueryMaker().ideq(quotationFilter).end();
+ WikittyQueryResult<Quotation> quotationResult = client.findAllByQuery(Quotation.class, quotationQuery);
+
+ //If some quotation has been found
+ if(quotationResult != null) {
+ Quotation quotation = quotationResult.get(0);
+ //Fetch the quotation's project
+ WikittyQuery projectQuery = new WikittyQueryMaker().ideq(quotation.getProject()).end();
+ WikittyQueryResult<Project> projectResult = client.findAllByQuery(Project.class, projectQuery);
+
+ HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
+ HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
+ HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
+
+ quotations.put(projectResult.get(0), quotationResult.getAll());
+
+ taskMap.put(quotation, fetchTasks(quotation, client));
+ alertsMap.put(quotation, getAlerts(client, quotation));
+
+ return renderView("dashboardSingleProject.jsp",
+ "title", "Tableau de bord projet", "projects", projectResult.getAll(),
+ "quotations", quotations, "taskMap", taskMap, "extensions",
+ Extensions.extensions, "alerts", alertsMap);
+
+ }
+ else {
+ return renderView("dashboardSingleProject.jsp");
+ }
+ }
+
+ /**
+ * Display multiple quotation for one or more projects
+ * @param client chorem client
+ * @param id Project id
+ * @param quotationFilter filter (open quotation or all)
+ * @return
+ */
public Render projectFilter(ChoremClient client, String id, String quotationFilter) {
WikittyQueryResult<Project> projectResult = null;
WikittyQueryResult<Quotation> quotationResult = null;
WikittyQueryResult<Task> taskResult = null;
+ HashMap<Project, List<Quotation>> quotations = new HashMap<Project, List<Quotation>>();
HashMap<Quotation, List<Task>> taskMap = new HashMap<Quotation, List<Task>>();
+ HashMap<Quotation, List<String>> alertsMap = new HashMap<Quotation, List<String>>();
+ //Fetch the project from the id
+ WikittyQueryMaker projectQueryMaker = new WikittyQueryMaker();
+ if(id != null && !id.equals(""))
+ projectQueryMaker.ideq(id);
+ else
+ projectQueryMaker.exteq("Project");
+ WikittyQuery projectQuery = projectQueryMaker.end();
- //HashMap<Quotation, String> extMap = new HashMap<Quotation, String>();
+ projectResult = client.findAllByQuery(Project.class, projectQuery);
- //Fetch the project form the name (if it has been requested)
- if(id != null) {
- WikittyQuery projectQuery = new WikittyQueryMaker()
- .ideq(id)
- .end();
+ //Fetch the quotations form the project (if there is one)
+ if(projectResult.size() != 0) {
+ for(Project project : projectResult.getAll()) {
+ WikittyQuery quotationQuery = null;
+ WikittyQueryMaker wqm = new WikittyQueryMaker();
- projectResult = client.findAllByQuery(Project.class, projectQuery);
- //Fetch the quotations form the project (if there is one)
- if(projectResult.size() != 0) {
- for(Project project : projectResult.getAll()) {
- WikittyQuery quotationQuery = null;
- WikittyQueryMaker wqm = new WikittyQueryMaker();
+ if(quotationFilter.equals("open")) {
+ wqm.and()
+ .eq(Quotation.ELEMENT_FIELD_QUOTATION_PROJECT, project)
+ .extne(Closed.EXT_CLOSED);
+ }
+ else if (quotationFilter.equals("all")){
+ wqm.eq(Quotation.ELEMENT_FIELD_QUOTATION_PROJECT, project);
+ }
+
+ quotationQuery = wqm.end();
+ quotationQuery.setLimit(20);
+ quotationQuery.addSortDescending(Quotation.ELEMENT_FIELD_INTERVAL_BEGINDATE);
+ quotationResult = client.findAllByQuery(Quotation.class, quotationQuery);
+ quotations.put(project, quotationResult.getAll());
- if(quotationFilter.equals("Devis ouverts")) {
- wqm.and()
- .eq(Quotation.ELEMENT_FIELD_QUOTATION_PROJECT, project)
- .extne(Closed.EXT_CLOSED);
+ //Fetch the tasks form the quotations (if there are some)
+ if(quotationResult != null) {
+ for(Quotation quote : quotationResult.getAll()) {
+ taskMap.put(quote, fetchTasks(quote, client));
+ alertsMap.put(quote, getAlerts(client, quote));
}
- else {
- wqm.eq(Quotation.ELEMENT_FIELD_QUOTATION_PROJECT, project);
- }
- quotationQuery = wqm.end();
-
- quotationQuery.addSortDescending(Quotation.ELEMENT_FIELD_INTERVAL_BEGINDATE);
- quotationResult = client.findAllByQuery(Quotation.class, quotationQuery);
-
-
}
}
- //Fetch the tasks form the quotations (if there are some)
- if(quotationResult != null) {
- String customClass = "";
- for(Quotation quote : quotationResult.getAll()) {
- WikittyQuery taskQuery = new WikittyQueryMaker()
- .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, quote)
- .end();
+ }
- taskResult = client.findAllByQuery(Task.class, taskQuery);
- taskMap.put(quote, taskResult.getAll());
+ return renderView("dashboardSingleProject.jsp",
+ "title", "Tableau de bord projet", "projects", projectResult.getAll(),
+ "quotations", quotations, "taskMap", taskMap, "extensions",
+ Extensions.extensions, "alerts", alertsMap);
+ }
+
+ /**
+ * Fetch the task from the given quotation
+ * Simple wikitty query
+ * @param q Quotation
+ * @param client chorem client
+ * @return list of task from the quotation
+ */
+ private List<Task> fetchTasks(Quotation q, ChoremClient client) {
+ WikittyQuery taskQuery = new WikittyQueryMaker()
+ .eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
+ .end();
+
+ WikittyQueryResult taskResult = client.findAllByQuery(Task.class, taskQuery);
+ return taskResult.getAll();
+ }
+
+ private List<String> getAlerts(ChoremClient client, Quotation q) {
+ List<Task> tasks = fetchTasks(q, client);
+ Calendar now = new GregorianCalendar();
+ List<String> messages = new ArrayList<String>();
+ for(Task t : tasks) {
+
+ System.out.println("Starting task alerts for " + t.getName());
+ System.out.println("Task is " + t.getStatus());
+ System.out.println(now.getTime());
+ //Test if the statuses are correct
+ if(t.getStatus().equals("Scheduled")) {
+ if(t.getBeginDate().before(now.getTime())) {
+ System.out.println("should be started");
+ messages.add( "Task " + t.getName() + " should be started");
}
-
}
-
+ else if(t.getStatus().equals("Started")) {
+ if(t.getBeginDate().after(now.getTime())) {
+ System.out.println("started in advance");
+ messages.add( "Task " + t.getName() + " has been started in advance");
+ }
+ else if(t.getEndDate().before(now.getTime())) {
+ System.out.println("should be ended");
+ messages.add( "Task " + t.getName() + " should have ended by now");
+ }
+ }
+ else if(t.getStatus().equals("Finished")) {
+
+ if(t.getEndDate().after(now.getTime())) {
+ System.out.println("fnished in advance");
+ messages.add( "Task " + t.getName() + " has been finished in advance");
+ }
+ }
+
}
-
- if(projectResult == null) {
- return renderView("dashboardSingleProject.jsp",
- "title", "Tableau de bord projet", "projects", null,"quotations",null);
- }
- else if(quotationResult == null) {
- return renderView("dashboardSingleProject.jsp",
- "title", "Tableau de bord projet", "projects", projectResult.getAll(),
- "quotations", null);
- }
- else {
- return renderView("dashboardSingleProject.jsp",
- "title", "Tableau de bord projet", "projects", projectResult.getAll(),
- "quotations", quotationResult.getAll(), "taskMap", taskMap, "extensions",
- Extensions.extensions);
- }
+ return messages;
}
public Render multiProjectFilter(ChoremClient client, Date from, Date to) {
@@ -129,38 +217,55 @@
, now.getActualMaximum(Calendar.DAY_OF_MONTH));
from = gFrom.getTime();
to = gTo.getTime();
-
+
}
- WikittyQueryMaker quotationQueryMaker = new WikittyQueryMaker();
- WikittyQuery quotationQuery = quotationQueryMaker.or()
- .bw(Interval.FQ_FIELD_INTERVAL_BEGINDATE, from, to)
- .bw(Interval.FQ_FIELD_INTERVAL_ENDDATE, from, to)
- .end();
- WikittyQueryResult<Quotation> result =
- client.findAllByQuery(Quotation.class, quotationQuery);
- Collection<Quotation> quotations = result.getAll();
+ Configuration config = client.findAllByQuery(Configuration.class,
+ (new WikittyQueryMaker()).exteq(Configuration.EXT_CONFIGURATION).end()
+ ).get(0);
- HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
- for(Quotation q : quotations) {
- QuotationCalculation calc = new QuotationCalculation(q, client);
- calc.calculate();
- calculations.put(q, calc);
- }
-
- return renderView("dashboardMultiProject.jsp",
- "title", "Tableau de bord projets",
- "quotations", quotations,
- "calculations", calculations);
-
+ WikittyQueryMaker quotationQueryMaker = new WikittyQueryMaker();
+ WikittyQuery quotationQuery = quotationQueryMaker.or()
+ .bw(Interval.FQ_FIELD_INTERVAL_BEGINDATE, from, to)
+ .bw(Interval.FQ_FIELD_INTERVAL_ENDDATE, from, to)
+ .end();
+ WikittyQueryResult<Quotation> result =
+ client.findAllByQuery(Quotation.class, quotationQuery);
+
+ Collection<Quotation> quotations = result.getAll();
+
+ HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
+ for(Quotation q : quotations) {
+ QuotationCalculation calc = new QuotationCalculation(q, client);
+ calc.setSrp(config.getDailyReturn());
+ calc.calculate();
+ calculations.put(q, calc);
+ }
+
+
+ return renderView("dashboardMultiProject.jsp",
+ "title", "Tableau de bord projets",
+ "quotations", quotations,
+ "calculations", calculations);
+
+
}
-
-
- public Render requestProject(ChoremClient client, String project_id, String quotationFilter) {
- return projectFilter(client, project_id, quotationFilter);
+
+
+ public Render requestProject(ChoremClient client, String project_name, String project_id, String quotationFilter) {
+ if(quotationFilter == null)
+ quotationFilter = "open";
+ if(project_name == null || project_name.equals(""))
+ project_id = "";
+ if(quotationFilter.equals("open") || quotationFilter.equals("all")) {
+ return projectFilter(client, project_id, quotationFilter);
+ }
+ else {
+ return singleQuotationFilter(client, project_id, quotationFilter);
+ }
}
public Render requestMultiProject(ChoremClient client, Date from, Date to) {
return multiProjectFilter(client, from, to);
@@ -184,31 +289,33 @@
List<JTask> lTask = new ArrayList<JTask>();
for(Task t : taskResult.getAll()) {
- if(t.getStatus().equals("SCHEDULED")) {
- customClass = "ganttBlue";
- }
- else if(t.getStatus().equals("STARTED")) {
- customClass = "ganttGreen";
- }
- else if(t.getStatus().equals("FINISHED")) {
- customClass = "ganttRed";
- }
- else if(t.getStatus().equals("CLOSED")) {
- customClass = "ganttGrey";
- }
+ if(t.getBeginDate() != null && t.getEndDate() != null) {
+ if(t.getStatus().equals("SCHEDULED")) {
+ customClass = "ganttBlue";
+ }
+ else if(t.getStatus().equals("STARTED")) {
+ customClass = "ganttGreen";
+ }
+ else if(t.getStatus().equals("FINISHED")) {
+ customClass = "ganttRed";
+ }
+ else if(t.getStatus().equals("CLOSED")) {
+ customClass = "ganttGrey";
+ }
- Values[] v = null;
- //if(t.getReestimatedEnd() != null)
- // v= new Values[2];
- //else
+ Values[] v = null;
+ //if(t.getReestimatedEnd() != null)
+ // v= new Values[2];
+ //else
v = new Values[1];
- v[0] = new Values(t.getBeginDate(), t.getEndDate(), t.getName(), customClass);
- //if(t.getReestimatedEnd() != null)
- // v[1]= new Values(t.getEndDate(), t.getReestimatedEnd(), "Reestimated end", "ganttOrange");
+ v[0] = new Values(t.getBeginDate(), t.getEndDate(), t.getName(), customClass);
+ //if(t.getReestimatedEnd() != null)
+ // v[1]= new Values(t.getEndDate(), t.getReestimatedEnd(), "Reestimated end", "ganttOrange");
- JTask jt = new JTask(t.getName(), t.getDescription(), t.getWikittyId(),t.getPrice(), t.getEstimatedDays(), v);
+ JTask jt = new JTask(t.getName(), t.getDescription(), t.getWikittyId(),t.getPrice(), t.getEstimatedDays(), v);
- lTask.add(jt);
+ lTask.add(jt);
+ }
}
Collections.sort(lTask);
@@ -232,9 +339,9 @@
while(i.hasNext()) {
Map.Entry<String, String> me = (Map.Entry<String, String>)i.next();
if(wikitty.hasExtension(me.getValue())) {
- extDate.put(
- me.getValue() + " " + me.getKey(),
- "/Date(" + ((Date) (wikitty.getFieldAsObject(me.getValue(), me.getKey()))).getTime() +")/");
+ Date date = ((Date) (wikitty.getFieldAsObject(me.getValue(), me.getKey())));
+ if(date != null)
+ extDate.put(me.getValue() + " " + me.getKey(), "/Date(" + date.getTime() +")/");
}
}
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-01 12:32:53 UTC (rev 357)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-02 16:04:44 UTC (rev 358)
@@ -17,23 +17,33 @@
private Quotation q;
private ChoremClient client;
- private static final int SEC_PER_HOUR = 3600;
- private static final int WORKING_HOURS_PER_DAY = 7;
- private Double tjm = null;
- private Double realDays = null;
- private Double deltaDays = null;
- private Double realTjm = null;
+ private static final int SEC_PER_HOUR = 3600;
+ private static final int WORKING_HOURS_PER_DAY = 7;
+ private double srp = 1;
+ private Double tjm = null;
+ private Double realDays = null;
+ private Double deltaDays = null;
+ private Double realTjm = null;
+ private Double expectedProfit = null;
+ private Double lossOrProfit = null;
+ private Double resultPerDay = null;
+
+
public QuotationCalculation(Quotation q, ChoremClient client) {
this.q = q;
this.client = client;
}
+
public void calculate() {
this.tjm = tjm();
this.realDays = realDays();
this.deltaDays = deltaDays();
this.realTjm = realTjm();
+ this.expectedProfit = expectedProfit();
+ this.lossOrProfit = lossOrProfit();
+ this.resultPerDay = resultPerDay();
}
public double tjm() {
@@ -51,7 +61,7 @@
public double realDays() {
//test if quotation is finished
if(q.getExtensionNames().contains("Closed")) {
- //TODO calcul grâce aux objets Time
+ //Calculate the days from the times objects
WikittyQuery taskQuery = new WikittyQueryMaker()
.eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
.end();
@@ -75,7 +85,7 @@
return (totalTime / SEC_PER_HOUR) / WORKING_HOURS_PER_DAY;
}
else {
- //nbDays + otherdays
+ //nbDays + day extensions from tasks
WikittyQuery taskQuery = new WikittyQueryMaker()
.eq(Task.ELEMENT_FIELD_TASK_QUOTATION, q)
.end();
@@ -93,7 +103,7 @@
}
public double deltaDays() {
- return q.getEstimatedDays() - getRealDays();
+ return getRealDays() - q.getEstimatedDays();
}
public double realTjm() {
@@ -103,6 +113,20 @@
return amount/nbDays;
}
+ public double expectedProfit() {
+ double nbDays = q.getEstimatedDays();
+ return (getTjm() - srp) * nbDays;
+ }
+
+ public double lossOrProfit() {
+ double amount = q.getAmount();
+ return amount - (getRealDays() * srp);
+ }
+
+ public double resultPerDay() {
+ return getLossOrProfit() / getRealDays();
+ }
+
public double getTjm() {
if(tjm == null)
return tjm();
@@ -127,5 +151,26 @@
else
return realTjm;
}
+ public double getExpectedProfit() {
+ if(expectedProfit == null)
+ return expectedProfit();
+ else
+ return expectedProfit;
+ }
+ public double getLossOrProfit() {
+ if(lossOrProfit == null)
+ return lossOrProfit();
+ else
+ return lossOrProfit;
+ }
+ public double getResultPerDay() {
+ if(resultPerDay == null)
+ return resultPerDay();
+ else
+ return resultPerDay;
+ }
+ public void setSrp(double val) {
+ this.srp = val;
+ }
}
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-01 12:32:53 UTC (rev 357)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-02 16:04:44 UTC (rev 358)
@@ -33,28 +33,9 @@
<div class="control-group">
<div class="controls" style="display: inline">
-<!--
- <script>
- $(function() {
- $("#project_text")
- .autocompleteByExtension(
- {
- source : "/chorem/wikitty-json/search?extension=Project",
- minLength : 2,
- select : function(event, ui) {
- $("#project_text").val(
- ui.item.label);
- $("#project_hidden")
- .val(ui.item.id);
- $("#project_hidden").change()
- return false;
- }
- });
- });
- </script>
- -->
- From : <input type="text" name="from" id="from" class="datepicker" value="${fn:escapeXml(from)}" />
- to : <input type="text" name="to" id="to" class="datepicker" value="${fn:escapeXml(to)}" />
+
+ From : <input type="text" name="from" id="from" class="datepicker" value='${param.from}' />
+ to : <input type="text" name="to" id="to" class="datepicker" value="${param.to}" />
<input type="submit"/>
</div>
</div>
@@ -67,17 +48,18 @@
<th>Client</th>
<th>Projet</th>
<th>Montant</th>
- <th>NbJour</th>
- <th>TJM</th>
- <th>NbJourReel</th>
- <th>delta jour</th>
- <th>tjm reel</th>
-
+ <th>Nombre de jours estimés</th>
+ <th><abbr title="Taux journalier moyen">TJM</abbr></th>
+ <th>Nombre de jours rééls</th>
+ <th>Différence estimation/réél</th>
+ <th><abbr title="Taux journalier moyen">TJM</abbr> reel</th>
+ <th>Gain attendu</th>
+ <th>Perte/gain</th>
</tr>
</thead>
<c:forEach var="q" items="${quotations}">
<tbody>
- <tr>
+ <tr><f:setLocale value="fr_FR"/>
<td><w:display wikitty="${q.wikitty}" fqfield="Quotation.customer" label=""/></td>
<td><w:display wikitty="${q.wikitty}" fqfield="Quotation.project" label=""/>
<a href="<c:url value="/wikitty/edit/${q.wikittyId}"/>"><i
@@ -85,7 +67,7 @@
</td>
<td class="currency"><w:display wikitty="${q.wikitty}" fqfield="Quotation.amount" label=""/></td>
<td class="number"><w:display wikitty="${q.wikitty}" fqfield="Quotation.estimatedDays" label=""/></td>
- <f:setLocale value="en_US"/>
+
<td class="number"> <f:formatNumber type="number"
maxFractionDigits="2" value="${calculations[q].getTjm()}" /></td>
<td class="number"> <f:formatNumber type="number"
@@ -95,6 +77,11 @@
<td class="number"> <f:formatNumber type="number"
maxFractionDigits="2" value="${calculations[q].getRealTjm()}" /></td>
+ <td class="currency"> <f:formatNumber type="currency"
+ maxFractionDigits="2" value="${calculations[q].getExpectedProfit()}" /></td>
+ <td class="currency"> <f:formatNumber type="currency"
+ maxFractionDigits="2" value="${calculations[q].getLossOrProfit()}" /></td>
+
</tr>
</tbody>
</c:forEach>
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-01 12:32:53 UTC (rev 357)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardSingleProject.jsp 2013-07-02 16:04:44 UTC (rev 358)
@@ -29,12 +29,26 @@
<link rel="stylesheet" href="<c:url value='/css/jquery.fn.gantt.css'/>" />
<h1>${title}</h1>
+
<form class="well form-inline" method="GET" id="projectSearch">
<div class="control-group">
- Project Name :
<div class="controls" style="display: inline">
-
+ <select class="filterBox" name="quotationFilter" id="quotationFilter">
+ <option value="open"
+ <c:if test='${param.quotationFilter=="open"}'>selected</c:if>>Devis
+ ouverts</option>
+ <option value="all"
+ <c:if test='${param.quotationFilter=="all"}'>selected</c:if>>Tous
+ les devis</option>
+ <c:forEach var="p" items="${projects}">
+ <c:forEach var="q" items="${quotations[p]}">
+ <option value="${q.wikittyId}"
+ <c:if test='${param.quotationFilter.equals(q.wikittyId)}'>selected</c:if>>${p.name}
+ - ${q.description}</option>
+ </c:forEach>
+ </c:forEach>
+ </select>
<script>
$(function() {
$("#project_text")
@@ -55,33 +69,27 @@
</script>
<input type="text" id="project_text" name="project_name"
- value="${param.project_name}" placeholder="project name" /> <input
- type="hidden" id="project_hidden" name="project_id"
- value="${param.project_id}" /> <select class="filterBox"
- name="quotationFilter" id="quotationFilter">
- <option name="open">Devis ouverts</option>
- <option name="all"
- <c:if test='${param.quotationFilter=="Tous les devis" }'>selected</c:if>>Tous
- les devis</option>
- </select>
+ value="${param.project_name}" placeholder="project name" />
+ <input type="hidden" id="project_hidden" name="project_id"
+ value='<c:if test='${!param.project_name.equals("") }'>${param.project_id}</c:if>' />
+
</div>
</div>
</form>
-<c:choose>
- <c:when test="${projects.size() >= 1}">
- <c:forEach var="p" items="${projects}">
- <h2 style="display: inline;">${p.name}</h2>
- <a href="<c:url value="/wikitty/edit/${param.project_id}"/>"><i
- class="icon-pencil icon-black"></i><small>edit</small></a>
- <p>${p.description}</p>
- </c:forEach>
+<c:forEach var="p" items="${projects}">
+ <c:if test="${not empty quotations[p]}">
+ <h2 style="display: inline;">${p.name}</h2>
+ <a href="<c:url value="/wikitty/edit/${param.project_id}"/>"><i
+ class="icon-pencil icon-black"></i><small>edit</small></a>
+ <p>${p.description}</p>
- <c:forEach var="q" items="${quotations}">
-
+
+ <c:forEach var="q" items="${quotations[p]}">
+
<h3 style="display: inline;">
<w:display wikitty="${q.wikitty}" fqfield="Quotation.description"
label="" />
@@ -89,17 +97,18 @@
<a href="<c:url value="/wikitty/edit/${q.wikittyId}"/>"><i
class="icon-pencil icon-black"></i><small>edit</small></a>
<p>
- Du <w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
- label="" pattern="dd/MM/yyyy"/>
- au <w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
+ Du
+ <w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
label="" pattern="dd/MM/yyyy" />
+ au
+ <w:display wikitty="${q.wikitty}" fqfield="Interval.beginDate"
+ label="" pattern="dd/MM/yyyy" />
<br />Statut :
${q.wikitty.extensionNames.toArray()[q.wikitty.extensionNames.size()
-1]}
</p>
+
-
-
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
@@ -132,12 +141,11 @@
</tbody>
</table>
-
+ ${alerts[q]}
+ <div class="gantt gantt-${q.wikittyId}" wikittyId="${q.wikittyId}"
+ data=''>Pas de tâche</div>
+ <!--
- <div class="gantt gantt-${q.wikittyId}" wikittyId = "${q.wikittyId}" data=''>
- Pas de tâche</div>
-<!--
-
<p>Liste des tâches :</p>
<c:forEach items="${taskMap}" var="entry">
<c:if test="${entry.key.equals(q)}">
@@ -173,22 +181,10 @@
-->
</c:forEach>
- </c:when>
+ </c:if>
+</c:forEach>
- <c:otherwise>
- <c:if
- test="${param.project_id != null && param.projectname.length() != 0 }">
- Projet inexistant
- </c:if>
-
- </c:otherwise>
-
-
-</c:choose>
-
-
-
<script src="<c:url value='/js/jquery.fn.gantt.js'/>"></script>
Modified: trunk/chorem-webmotion/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-01 12:32:53 UTC (rev 357)
+++ trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2013-07-02 16:04:44 UTC (rev 358)
@@ -754,7 +754,6 @@
$("#projectSearch").submit();
});
$("#quotationFilter").change(function() {
- if($("#project_hidden").val() != "")
$("#projectSearch").submit();
});
function initgantt(id) {
1
0
r357 - in trunk/chorem-webmotion/src/main: java/org/chorem/webmotion/actions/project webapp/WEB-INF/jsp
by meynier@users.chorem.org 01 Jul '13
by meynier@users.chorem.org 01 Jul '13
01 Jul '13
Author: meynier
Date: 2013-07-01 14:32:53 +0200 (Mon, 01 Jul 2013)
New Revision: 357
Url: http://chorem.org/projects/chorem/repository/revisions/357
Log:
updated multi-project dashboard
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-01 10:51:28 UTC (rev 356)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/DashboardProjectAction.java 2013-07-01 12:32:53 UTC (rev 357)
@@ -1,10 +1,12 @@
package org.chorem.webmotion.actions.project;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -119,7 +121,16 @@
public Render multiProjectFilter(ChoremClient client, Date from, Date to) {
System.out.println(from + "," + to);
- if(from != null && to != null) {
+ if(from == null || to == null) {
+ Calendar now = new GregorianCalendar();
+ Calendar gFrom = new GregorianCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH)
+ , now.getActualMinimum(Calendar.DAY_OF_MONTH));
+ Calendar gTo = new GregorianCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH)
+ , now.getActualMaximum(Calendar.DAY_OF_MONTH));
+ from = gFrom.getTime();
+ to = gTo.getTime();
+
+ }
WikittyQueryMaker quotationQueryMaker = new WikittyQueryMaker();
WikittyQuery quotationQuery = quotationQueryMaker.or()
.bw(Interval.FQ_FIELD_INTERVAL_BEGINDATE, from, to)
@@ -132,18 +143,17 @@
HashMap<Quotation, QuotationCalculation> calculations = new HashMap<Quotation, QuotationCalculation>();
for(Quotation q : quotations) {
- calculations.put(q, new QuotationCalculation(q, client));
+ QuotationCalculation calc = new QuotationCalculation(q, client);
+ calc.calculate();
+ calculations.put(q, calc);
}
+
return renderView("dashboardMultiProject.jsp",
"title", "Tableau de bord projets",
"quotations", quotations,
"calculations", calculations);
- }
- else {
- return renderView("dashboardMultiProject.jsp",
- "title", "Tableau de bord projets");
- }
+
}
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-01 10:51:28 UTC (rev 356)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/QuotationCalculation.java 2013-07-01 12:32:53 UTC (rev 357)
@@ -19,11 +19,23 @@
private ChoremClient client;
private static final int SEC_PER_HOUR = 3600;
private static final int WORKING_HOURS_PER_DAY = 7;
+ private Double tjm = null;
+ private Double realDays = null;
+ private Double deltaDays = null;
+ private Double realTjm = null;
public QuotationCalculation(Quotation q, ChoremClient client) {
this.q = q;
this.client = client;
}
+
+ public void calculate() {
+ this.tjm = tjm();
+ this.realDays = realDays();
+ this.deltaDays = deltaDays();
+ this.realTjm = realTjm();
+ }
+
public double tjm() {
double amount = q.getAmount();
double nbDays = q.getEstimatedDays();
@@ -32,8 +44,8 @@
}
- private double getSecondPeriod(Date start, Date end) {
- return end.getTime()-start.getTime();
+ private double getPeriodInSeconds(Date start, Date end) {
+ return (end.getTime()-start.getTime())/1000;
}
public double realDays() {
@@ -49,16 +61,16 @@
Collection<Time> times = new ArrayList<Time>();
for(Task t : result.getAll()) {
WikittyQuery timeQuery = new WikittyQueryMaker()
- .eq(Time.ELEMENT_FIELD_TIME_TASK, q)
+ .eq(Time.ELEMENT_FIELD_TIME_TASK, t)
.end();
WikittyQueryResult timeResult = client.findAllByQuery(Time.class, timeQuery);
- System.out.println("RESULT : " + timeResult);
times.addAll(timeResult.getAll());
}
- System.out.println(times);
double totalTime = 0;
for(Time t : times) {
- totalTime += getSecondPeriod(t.getBeginDate(), t.getEndDate());
+ System.out.println("HEURE TRAVAILLEES : "
+ + (getPeriodInSeconds(t.getBeginDate(), t.getEndDate())/SEC_PER_HOUR) );
+ totalTime += getPeriodInSeconds(t.getBeginDate(), t.getEndDate());
}
return (totalTime / SEC_PER_HOUR) / WORKING_HOURS_PER_DAY;
}
@@ -81,14 +93,39 @@
}
public double deltaDays() {
- return q.getEstimatedDays() - realDays();
+ return q.getEstimatedDays() - getRealDays();
}
public double realTjm() {
double amount = q.getAmount();
- double nbDays = realDays();
+ double nbDays = getRealDays();
return amount/nbDays;
}
+ public double getTjm() {
+ if(tjm == null)
+ return tjm();
+ else
+ return tjm;
+ }
+ public double getRealDays() {
+ if(realDays == null)
+ return realDays();
+ else
+ return realDays;
+ }
+ public double getDeltaDays() {
+ if(deltaDays == null)
+ return deltaDays;
+ else
+ return deltaDays;
+ }
+ public double getRealTjm() {
+ if(realTjm == null)
+ return realTjm();
+ else
+ return realTjm;
+ }
+
}
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-01 10:51:28 UTC (rev 356)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardMultiProject.jsp 2013-07-01 12:32:53 UTC (rev 357)
@@ -53,8 +53,8 @@
});
</script>
-->
- From : <input type="text" name="from" id="from" class="datepicker" />
- to : <input type="text" name="to" id="to" class="datepicker" />
+ From : <input type="text" name="from" id="from" class="datepicker" value="${fn:escapeXml(from)}" />
+ to : <input type="text" name="to" id="to" class="datepicker" value="${fn:escapeXml(to)}" />
<input type="submit"/>
</div>
</div>
@@ -85,13 +85,20 @@
</td>
<td class="currency"><w:display wikitty="${q.wikitty}" fqfield="Quotation.amount" label=""/></td>
<td class="number"><w:display wikitty="${q.wikitty}" fqfield="Quotation.estimatedDays" label=""/></td>
- <td class="number">${calculations[q].tjm()}</td>
- <td class="number">${calculations[q].realDays()}</td>
- <td class="number">${calculations[q].deltaDays()}</td>
- <td class="number">${calculations[q].realTjm()}</td>
+ <f:setLocale value="en_US"/>
+ <td class="number"> <f:formatNumber type="number"
+ maxFractionDigits="2" value="${calculations[q].getTjm()}" /></td>
+ <td class="number"> <f:formatNumber type="number"
+ maxFractionDigits="2" value="${calculations[q].getRealDays()}" /></td>
+ <td class="number"> <f:formatNumber type="number"
+ maxFractionDigits="2" value="${calculations[q].getDeltaDays()}" /></td>
+ <td class="number"> <f:formatNumber type="number"
+ maxFractionDigits="2" value="${calculations[q].getRealTjm()}" /></td>
+
</tr>
</tbody>
</c:forEach>
</table>
+
1
0
r356 - trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions
by bpoussin@users.chorem.org 01 Jul '13
by bpoussin@users.chorem.org 01 Jul '13
01 Jul '13
Author: bpoussin
Date: 2013-07-01 12:51:28 +0200 (Mon, 01 Jul 2013)
New Revision: 356
Url: http://chorem.org/projects/chorem/repository/revisions/356
Log:
amelioration du choix de la profondeur pour les categories de budget
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-06-29 23:56:49 UTC (rev 355)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-07-01 10:51:28 UTC (rev 356)
@@ -987,12 +987,12 @@
data.add(false, i);
}
- if (depth != null) {
+ if (depth != null && depth > 0) {
// on supprime les profondeurs non demandees
Category lastCategory = null;
for (Iterator<WikittyQueryResultTreeNode<Category>> i=data.getCategoriesTree().iterator(); i.hasNext();) {
WikittyQueryResultTreeNode<Category> c = i.next();
- if (c.getLevel() <= depth) {
+ if (c.getLevel() < depth) {
lastCategory = c.getUserObject();
} else {
i.remove();
1
0
r355 - in trunk: chorem-entities/src/main/java/org/chorem chorem-entities/src/main/xmi chorem-webmotion/src/main/java/org/chorem/webmotion/actions
by bpoussin@users.chorem.org 29 Jun '13
by bpoussin@users.chorem.org 29 Jun '13
29 Jun '13
Author: bpoussin
Date: 2013-06-30 01:56:49 +0200 (Sun, 30 Jun 2013)
New Revision: 355
Url: http://chorem.org/projects/chorem/repository/revisions/355
Log:
Ajout de methode pour connaitre la Locale a utiliser pour l'utilisateur courant
Modified:
trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
trunk/chorem-entities/src/main/xmi/chorem-model.properties
trunk/chorem-entities/src/main/xmi/chorem-model.zargo
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
Modified: trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java 2013-06-29 22:55:21 UTC (rev 354)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java 2013-06-29 23:56:49 UTC (rev 355)
@@ -48,7 +48,9 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
+import org.parboiled.common.StringUtils;
/**
* Proxy pour l'application. Certaines methodes specifiques pour l'application
@@ -343,4 +345,21 @@
WikittyQueryResult<Company> result = findAllByQuery(Company.class, q);
return result.getAll();
}
+
+ /**
+ * Retourne la locale preferee de l'utilisateur, si l'utilisateur n'a pas
+ * defini de locale, alors on prend celle du systeme.
+ *
+ * @return Ret
+ */
+ public Locale getUserLocale() {
+ Locale result = Locale.getDefault();
+ ChoremUser user = getUser(ChoremUser.class);
+ if (user != null && StringUtils.isNotEmpty(user.getDefaultLocale())) {
+ String l = user.getDefaultLocale();
+ result = Locale.forLanguageTag(l);
+ }
+
+ return result;
+ }
}
Modified: trunk/chorem-entities/src/main/xmi/chorem-model.properties
===================================================================
--- trunk/chorem-entities/src/main/xmi/chorem-model.properties 2013-06-29 22:55:21 UTC (rev 354)
+++ trunk/chorem-entities/src/main/xmi/chorem-model.properties 2013-06-29 23:56:49 UTC (rev 355)
@@ -54,7 +54,7 @@
#
# ChoremUser
#
-org.chorem.entities.ChoremUser.class.tagvalue.version=1.0
+org.chorem.entities.ChoremUser.class.tagvalue.version=2.0
org.chorem.entities.ChoremUser.class.tagvalue.toString=%WikittyUser.login|nologin$s
org.chorem.entities.ChoremUser.class.tagvalue.sortOrder=WikittyUser.login
#
Modified: trunk/chorem-entities/src/main/xmi/chorem-model.zargo
===================================================================
(Binary files differ)
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-06-29 22:55:21 UTC (rev 354)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-06-29 23:56:49 UTC (rev 355)
@@ -1013,7 +1013,7 @@
}
if ("ascii".equalsIgnoreCase(type)) {
- InputStream out = computeAsciiTable(data);
+ InputStream out = computeAsciiTable(client, data);
return renderDownload(out, "budget.txt", "text/plain");
} else {
return renderView("dashboardBudget.jsp", "companyId", companyId,
@@ -1021,8 +1021,8 @@
}
}
- protected InputStream computeAsciiTable(BudgetData data) {
- NumberFormat currency = new DecimalFormat("#0.00");
+ protected InputStream computeAsciiTable(ChoremClient client, BudgetData data) {
+ NumberFormat currency = NumberFormat.getCurrencyInstance(client.getUserLocale());
TableFormatter tf = new SimpleTableFormatter(true);
1
0
r354 - in trunk: chorem-entities/src/main/java chorem-entities/src/main/java/com chorem-entities/src/main/java/com/inamik chorem-entities/src/main/java/com/inamik/utils chorem-webmotion/src/main/java/org/chorem/webmotion/actions chorem-webmotion/src/main/resources chorem-webmotion/src/main/webapp/WEB-INF/jsp
by bpoussin@users.chorem.org 29 Jun '13
by bpoussin@users.chorem.org 29 Jun '13
29 Jun '13
Author: bpoussin
Date: 2013-06-30 00:55:21 +0200 (Sun, 30 Jun 2013)
New Revision: 354
Url: http://chorem.org/projects/chorem/repository/revisions/354
Log:
Report Budget:
- on peut demande a ne voir que certain profondeur
- on peut exporter en ascii le tableau que l'on voit
Added:
trunk/chorem-entities/src/main/java/com/
trunk/chorem-entities/src/main/java/com/inamik/
trunk/chorem-entities/src/main/java/com/inamik/utils/
trunk/chorem-entities/src/main/java/com/inamik/utils/AbstractTableFormatter.java
trunk/chorem-entities/src/main/java/com/inamik/utils/SimpleTableFormatter.java
trunk/chorem-entities/src/main/java/com/inamik/utils/TableFormatter.java
Modified:
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
trunk/chorem-webmotion/src/main/resources/mapping
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardBudget.jsp
Added: trunk/chorem-entities/src/main/java/com/inamik/utils/AbstractTableFormatter.java
===================================================================
--- trunk/chorem-entities/src/main/java/com/inamik/utils/AbstractTableFormatter.java (rev 0)
+++ trunk/chorem-entities/src/main/java/com/inamik/utils/AbstractTableFormatter.java 2013-06-29 22:55:21 UTC (rev 354)
@@ -0,0 +1,455 @@
+/*
+ * iNamik TableFormatter for Java
+ * Copyright (C) 2005-2012 David Farrell (davidpfarrell(a)yahoo.com)
+ *
+ * Licensed under MIT or GPLv3, see LICENSE.txt
+ */
+package com.inamik.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * AbstractTableFormatter
+ * Created on Oct 26, 2005
+ * @author Dave
+ */
+public abstract class AbstractTableFormatter implements TableFormatter
+{
+ protected class CellData
+ {
+ private List lines;
+ private int align;
+ private int valign;
+ private CellData() { super(); }
+ public CellData(int align, int valign)
+ {
+ this();
+ this.lines = new ArrayList();
+ this.align = align;
+ this.valign = valign;
+ }
+ public void addLine(String text) { lines.add(text); }
+ public int getLineCount() { return lines.size(); }
+ public List getLines () { return new ArrayList(lines); }
+ public int getAlign () { return align; }
+ public int getVAlign() { return valign; }
+ };
+
+ private int columnCount = 0;
+
+ private List maxColWidths = new ArrayList();
+ private List maxRowHeights = new ArrayList();
+
+ private List tableData = new ArrayList();
+
+ /**
+ * Constructor
+ */
+ protected AbstractTableFormatter()
+ {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#addLine()
+ */
+ public final TableFormatter addLine()
+ {
+ return addLine(null);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#addLine(java.lang.String)
+ */
+ public final TableFormatter addLine(String text)
+ {
+ if (tableData.size() <= 0)
+ {
+ throw new IllegalStateException("tableData.size()");
+ }
+
+ // Get current (last) row
+ List row = (List)tableData.get(tableData.size() - 1);
+
+ if (row.size() <= 0)
+ {
+ throw new IllegalStateException("Cannot addLine() to empty row. Use nextCell() first.");
+ }
+
+ CellData cell = (CellData)row.get(row.size() - 1);
+
+ // Add line to cell
+ cell.addLine(text);
+
+ //
+ // Update max column width
+ //
+
+ if (maxColWidths.size() != columnCount)
+ {
+ throw new IllegalStateException("maxColWidths.size()");
+ }
+
+ int currentCol = row.size() - 1;
+
+ int maxColWidth = ((Integer)maxColWidths.get(currentCol)).intValue();
+
+ if (text != null && text.length() > maxColWidth)
+ {
+ maxColWidths.set(currentCol, new Integer(text.length()));
+ }
+
+ //
+ // Update max row height
+ //
+
+ if (maxRowHeights.size() != tableData.size())
+ {
+ throw new IllegalStateException("maxRowHeights.size()");
+ }
+
+ int currentRow = tableData.size() - 1;
+
+ int maxRowHeight = ((Integer)maxRowHeights.get(currentRow)).intValue();
+
+ if (cell.getLineCount() > maxRowHeight)
+ {
+ maxRowHeights.set(currentRow, new Integer(cell.getLineCount()));
+ }
+
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#nextCell()
+ */
+ public final TableFormatter nextCell()
+ {
+ return nextCell(ALIGN_DEFAULT, VALIGN_DEFAULT);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#nextCell(int, int)
+ */
+ public final TableFormatter nextCell(int align, int valign)
+ {
+ if (
+ (align != ALIGN_DEFAULT)
+ && (align != ALIGN_LEFT )
+ && (align != ALIGN_CENTER )
+ && (align != ALIGN_RIGHT )
+ )
+ {
+ throw new IllegalArgumentException("align");
+ }
+
+ if (
+ (valign != VALIGN_DEFAULT)
+ && (valign != VALIGN_TOP )
+ && (valign != VALIGN_CENTER )
+ && (valign != VALIGN_BOTTOM )
+ )
+ {
+ throw new IllegalArgumentException("valign");
+ }
+
+ if (tableData.size() <= 0)
+ {
+ throw new IllegalStateException("tableData.size()");
+ }
+
+ List row = (List)tableData.get(tableData.size() - 1);
+
+ CellData cell = new CellData(align, valign);
+
+ row.add(cell);
+
+ // Update column count
+ if (row.size() > columnCount)
+ {
+ // Should only be off by 1
+ if ((row.size() - 1) != columnCount)
+ {
+ throw new IllegalStateException("columnCount");
+ }
+
+ columnCount = row.size();
+
+ maxColWidths.add(new Integer(0));
+ }
+
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#nextRow()
+ */
+ public final TableFormatter nextRow()
+ {
+ tableData.add(new ArrayList(columnCount));
+
+ maxRowHeights.add(new Integer(0));
+
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getColumnCount()
+ */
+ public int getColumnCount()
+ {
+ return columnCount;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getRowCount()
+ */
+ public final int getRowCount()
+ {
+ if (tableData.size() <= 0)
+ {
+ throw new IllegalStateException("tableData.size()");
+ }
+
+ return tableData.size();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getColumnWidth(int)
+ */
+ public final int getColumnWidth(int columnIndex)
+ {
+ if (columnIndex < 0 || columnIndex >= columnCount)
+ {
+ throw new IllegalArgumentException("columnIndex");
+ }
+
+ return ((Integer)maxColWidths.get(columnIndex)).intValue();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getRowHeight(int)
+ */
+ public final int getRowHeight(int rowIndex)
+ {
+ if (rowIndex < 0 || rowIndex >= tableData.size())
+ {
+ throw new IllegalArgumentException("rowIndex");
+ }
+
+ return ((Integer)maxRowHeights.get(rowIndex)).intValue();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getFormattedCell(int, int)
+ */
+ public final String[] getFormattedCell(int rowIndex, int columnIndex)
+ {
+ if (rowIndex < 0 || rowIndex >= tableData.size())
+ {
+ throw new IllegalArgumentException("rowIndex");
+ }
+
+ if (columnIndex < 0 || columnIndex >= columnCount)
+ {
+ throw new IllegalArgumentException("columnIndex");
+ }
+
+ List lines;
+ int align;
+ int valign;
+
+ int cellWidth = getColumnWidth(columnIndex);
+ int cellHeight = getRowHeight(rowIndex);
+
+ List row = (List)tableData.get(rowIndex);
+
+ // Is there a cell at the specified row/col?
+ if (row.size() > columnIndex)
+ {
+ CellData cell = (CellData)row.get(columnIndex);
+
+ lines = cell.getLines();
+ align = cell.getAlign();
+ valign = cell.getVAlign();
+ }
+ else
+ {
+ lines = new ArrayList();
+ align = ALIGN_DEFAULT;
+ valign = VALIGN_DEFAULT;
+ }
+
+ int vpadding = cellHeight - lines.size();
+
+ int topPad;
+ int bottomPad;
+
+ switch (valign)
+ {
+ case VALIGN_CENTER :
+ {
+ int carry = vpadding % 2;
+
+ vpadding = vpadding - carry;
+
+ topPad = bottomPad = vpadding / 2;
+
+ bottomPad += carry;
+
+ break;
+ }
+ case VALIGN_BOTTOM:
+ {
+ topPad = vpadding;
+ bottomPad = 0;
+ break;
+ }
+ // Deafault - Top
+ default :
+ {
+ topPad = 0;
+ bottomPad = vpadding;
+ break;
+ }
+ }
+
+ List result = new ArrayList(cellHeight);
+
+ for (int i = 0; i < topPad; ++i)
+ {
+ result.add(getFormattedLine("", cellWidth, align));
+ }
+
+ for (int i = 0; i < lines.size(); ++i)
+ {
+ result.add(getFormattedLine((String)lines.get(i), cellWidth, align));
+ }
+
+ for (int i = 0; i < bottomPad; ++i)
+ {
+ result.add(getFormattedLine("", cellWidth, align));
+ }
+
+ if (result.size() != cellHeight)
+ {
+ throw new IllegalStateException("result.size()");
+ }
+
+ return (String[])result.toArray(new String[result.size()]);
+ }
+
+ /**
+ * getFormattedLine
+ */
+ private final String getFormattedLine(String text, int lineLength, int align)
+ {
+ if (text == null)
+ {
+ text = "";
+ }
+
+ int padding = lineLength - text.length();
+
+ int leftPad;
+ int rightPad;
+
+ switch (align)
+ {
+ case ALIGN_CENTER :
+ {
+ int carry = padding % 2;
+
+ padding = padding - carry;
+
+ leftPad = rightPad = padding / 2;
+
+ rightPad += carry;
+
+ break;
+ }
+ case ALIGN_RIGHT :
+ {
+ leftPad = padding;
+ rightPad = 0;
+ break;
+ }
+ // Deafault - Left
+ default :
+ {
+ leftPad = 0;
+ rightPad = padding;
+ break;
+ }
+ }
+
+ StringBuffer result = new StringBuffer();
+
+ for (int i = 0; i < leftPad; ++i)
+ {
+ result.append(' ');
+ }
+
+ result.append(text);
+
+ for (int i = 0; i < rightPad; ++i)
+ {
+ result.append(' ');
+ }
+
+ return result.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getTableWidth()
+ */
+ public int getTableWidth()
+ {
+ if (maxColWidths.size() != getColumnCount())
+ {
+ throw new IllegalStateException("maxColWidths.size()");
+ }
+
+ int width = 0;
+
+ for (int i = 0; i < columnCount; ++i)
+ {
+ width += ((Integer)maxColWidths.get(i)).intValue();
+ }
+
+ return width;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getTableHeight()
+ */
+ public int getTableHeight()
+ {
+ if (maxRowHeights.size() != getRowCount())
+ {
+ throw new IllegalStateException("maxRowHeights.size()");
+ }
+
+ int height = 0;
+
+ for (int i = 0, size = maxRowHeights.size(); i < size; i++)
+ {
+ height += ((Integer)maxRowHeights.get(i)).intValue();
+ }
+
+ return height;
+ }
+}
Property changes on: trunk/chorem-entities/src/main/java/com/inamik/utils/AbstractTableFormatter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/chorem-entities/src/main/java/com/inamik/utils/SimpleTableFormatter.java
===================================================================
--- trunk/chorem-entities/src/main/java/com/inamik/utils/SimpleTableFormatter.java (rev 0)
+++ trunk/chorem-entities/src/main/java/com/inamik/utils/SimpleTableFormatter.java 2013-06-29 22:55:21 UTC (rev 354)
@@ -0,0 +1,243 @@
+/*
+ * iNamik TableFormatter for Java
+ * Copyright (C) 2005-2012 David Farrell (davidpfarrell(a)yahoo.com)
+ *
+ * Licensed under MIT or GPLv3, see LICENSE.txt
+ */
+package com.inamik.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * SimpleTableFormatter
+ * Created on Oct 18, 2005
+ * @author Dave
+ */
+public final class SimpleTableFormatter extends AbstractTableFormatter implements TableFormatter
+{
+ private boolean border = false;
+
+ /**
+ * Constructor
+ */
+ public SimpleTableFormatter()
+ {
+ super();
+ }
+
+ /**
+ * Constructor
+ * @param border Print rows/tables with borders
+ */
+ public SimpleTableFormatter(boolean border)
+ {
+ this();
+
+ this.border = border;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getTableWidth()
+ */
+ public int getTableWidth()
+ {
+ int width = super.getTableWidth();
+
+ if (border == true)
+ {
+ width += 2;
+
+ if (getColumnCount() > 1)
+ {
+ width += getColumnCount() - 1;
+ }
+ }
+
+ return width;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getTableHeight()
+ */
+ public int getTableHeight()
+ {
+ int height = super.getTableHeight();
+
+ if (border == true)
+ {
+ height += 2;
+
+ if (getRowCount() > 1)
+ {
+ height += getRowCount() - 1;
+ }
+ }
+
+ return height;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getFormattedRow(int)
+ */
+ public String[] getFormattedRow(int rowIndex)
+ {
+ if (rowIndex < 0 || rowIndex >= getRowCount())
+ {
+ throw new IllegalArgumentException("rowIndex");
+ }
+
+ int cellHeight = getRowHeight(rowIndex);
+
+ List rowLines = new ArrayList(cellHeight);
+
+ for (int i = 0; i < cellHeight; ++i)
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ if (border == true)
+ {
+ buffer.append('|');
+ }
+
+ rowLines.add(buffer);
+ }
+
+ if (rowLines.size() != cellHeight)
+ {
+ throw new IllegalStateException("rowLines.size()");
+ }
+
+ for (int columnIndex = 0, columnCount = getColumnCount(); columnIndex < columnCount; ++columnIndex)
+ {
+ String[] cell = getFormattedCell(rowIndex, columnIndex);
+
+ if (cell.length != cellHeight)
+ {
+ throw new IllegalStateException("cell.size()");
+ }
+
+ for (int i = 0; i < cellHeight; ++i)
+ {
+ StringBuffer buffer = (StringBuffer)rowLines.get(i);
+
+ if (columnIndex > 0)
+ {
+ if (border == true)
+ {
+ buffer.append('|');
+ }
+// else
+// {
+// buffer.append(' ');
+// }
+ }
+
+ buffer.append(cell[i]);
+ }
+ }
+
+ if (border == true)
+ {
+ for (int i = 0; i < cellHeight; ++i)
+ {
+ StringBuffer buffer = (StringBuffer)rowLines.get(i);
+
+ buffer.append('|');
+ }
+ }
+
+ if (rowLines.size() != cellHeight)
+ {
+ throw new IllegalStateException("rowLines.size()");
+ }
+
+ List result = new ArrayList(cellHeight);
+
+ for (int i = 0; i < cellHeight; ++i)
+ {
+ StringBuffer buffer = (StringBuffer)rowLines.get(i);
+
+ result.add(buffer.toString());
+ }
+
+ if (result.size() != cellHeight)
+ {
+ throw new IllegalStateException("result.size()");
+ }
+
+ return (String[])result.toArray(new String[result.size()]);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.inamik.utils.TableFormatter#getFormattedTable()
+ */
+ public String[] getFormattedTable()
+ {
+ List result = new ArrayList();
+
+ String borderText = null;
+
+ if (border == true)
+ {
+ borderText = getFormattedBorder();
+ result.add(borderText);
+ }
+
+ for (int rowIndex = 0, rowCount = getRowCount(); rowIndex < rowCount; ++rowIndex)
+ {
+ if (rowIndex > 0)
+ {
+ if (border == true)
+ {
+ result.add(borderText);
+ }
+ }
+
+ String[] row = getFormattedRow(rowIndex);
+
+ for (int i = 0, size=row.length; i < size; ++i)
+ {
+ result.add(row[i]);
+ }
+ }
+
+ if (border == true)
+ {
+ result.add(borderText);
+ }
+
+ return (String[])result.toArray(new String[result.size()]);
+ }
+
+ /**
+ * getFormattedBorder
+ */
+ private String getFormattedBorder()
+ {
+ StringBuffer result = new StringBuffer();
+
+ result.append('+');
+
+ for (int columnIndex = 0, columnCount = getColumnCount(); columnIndex < columnCount; ++columnIndex)
+ {
+ if (columnIndex > 0)
+ {
+ result.append('+');
+ }
+
+ for (int i = 0; i < getColumnWidth(columnIndex); ++i)
+ {
+ result.append('-');
+ }
+ }
+
+ result.append('+');
+
+ return result.toString();
+ }
+}
Property changes on: trunk/chorem-entities/src/main/java/com/inamik/utils/SimpleTableFormatter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/chorem-entities/src/main/java/com/inamik/utils/TableFormatter.java
===================================================================
--- trunk/chorem-entities/src/main/java/com/inamik/utils/TableFormatter.java (rev 0)
+++ trunk/chorem-entities/src/main/java/com/inamik/utils/TableFormatter.java 2013-06-29 22:55:21 UTC (rev 354)
@@ -0,0 +1,40 @@
+/*
+ * iNamik TableFormatter for Java
+ * Copyright (C) 2005-2012 David Farrell (davidpfarrell(a)yahoo.com)
+ *
+ * Licensed under MIT or GPLv3, see LICENSE.txt
+ */
+package com.inamik.utils;
+
+/**
+ * TableFormatter
+ * Created on Oct 18, 2005
+ * @author Dave
+ */
+public interface TableFormatter
+{
+ static final int ALIGN_DEFAULT = 0;
+ static final int ALIGN_LEFT = 1;
+ static final int ALIGN_CENTER = 2;
+ static final int ALIGN_RIGHT = 3;
+
+ static final int VALIGN_DEFAULT = 4;
+ static final int VALIGN_TOP = 5;
+ static final int VALIGN_CENTER = 6;
+ static final int VALIGN_BOTTOM = 7;
+
+ TableFormatter nextRow();
+ TableFormatter nextCell();
+ TableFormatter nextCell(int align, int valign);
+ TableFormatter addLine();
+ TableFormatter addLine(String text);
+ int getColumnCount();
+ int getRowCount();
+ int getColumnWidth(int columnIndex);
+ int getRowHeight(int rowIndex);
+ int getTableWidth();
+ int getTableHeight();
+ String[] getFormattedCell(int rowIndex, int columnIndex);
+ String[] getFormattedRow(int rowIndex);
+ String[] getFormattedTable();
+}
Property changes on: trunk/chorem-entities/src/main/java/com/inamik/utils/TableFormatter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-06-29 22:54:31 UTC (rev 353)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/DashboardAction.java 2013-06-29 22:55:21 UTC (rev 354)
@@ -23,17 +23,26 @@
package org.chorem.webmotion.actions;
+import com.inamik.utils.SimpleTableFormatter;
+import com.inamik.utils.TableFormatter;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.input.ReaderInputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
@@ -819,7 +828,7 @@
/**
* Prévisionnel entre deux dates en fonction des factures
*/
- public Render budget(ChoremClient client, Date start, Date end, String query) {
+ public Render budget(ChoremClient client, Integer depth, Date start, Date end, String query, String type) {
if (log.isDebugEnabled()) {
log.debug(String.format(
"budget for period '%s' to '%s' with filter '%s'",
@@ -978,13 +987,87 @@
data.add(false, i);
}
+ if (depth != null) {
+ // on supprime les profondeurs non demandees
+ Category lastCategory = null;
+ for (Iterator<WikittyQueryResultTreeNode<Category>> i=data.getCategoriesTree().iterator(); i.hasNext();) {
+ WikittyQueryResultTreeNode<Category> c = i.next();
+ if (c.getLevel() <= depth) {
+ lastCategory = c.getUserObject();
+ } else {
+ i.remove();
+ for (String d : data.getDates()) {
+ Category currentCategory = c.getUserObject();
+ double s = data.getAmount(d, currentCategory);
+ data.addAmount(d, lastCategory, s);
+ for (FinancialTransaction invoice : data.getInvoices(d, currentCategory)) {
+ data.addInvoice(d, lastCategory, invoice);
+ }
+ }
+ }
+ }
+ }
+
if (log.isDebugEnabled()) {
log.debug("budget data\n\t dates: " + data.getDates() + "\n\t rootTree: " + rootCategory + "\n\t categoriesTree: " + categoriesTree);
}
- return renderView("dashboardBudget.jsp", "companyId", companyId,
- "data", data);
+
+ if ("ascii".equalsIgnoreCase(type)) {
+ InputStream out = computeAsciiTable(data);
+ return renderDownload(out, "budget.txt", "text/plain");
+ } else {
+ return renderView("dashboardBudget.jsp", "companyId", companyId,
+ "data", data);
+ }
}
+ protected InputStream computeAsciiTable(BudgetData data) {
+ NumberFormat currency = new DecimalFormat("#0.00");
+
+ TableFormatter tf = new SimpleTableFormatter(true);
+
+ tf.nextRow();
+ tf.nextCell(TableFormatter.ALIGN_CENTER, TableFormatter.VALIGN_DEFAULT)
+ .addLine("Category");
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_CENTER, TableFormatter.VALIGN_DEFAULT)
+ .addLine(d);
+ }
+ for (WikittyQueryResultTreeNode<Category> c : data.getCategoriesTree()) {
+
+ tf.nextRow().nextCell(TableFormatter.ALIGN_LEFT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(StringUtils.repeat(" ", c.getLevel()) + c.getUserObject());
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_RIGHT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(currency.format(data.getAmount(d, c.getUserObject())));
+ }
+ }
+ tf.nextRow().nextCell().addLine("Sorties");
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_RIGHT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(currency.format(data.getDebt(d)));
+ }
+ tf.nextRow().nextCell().addLine("Entrées");
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_RIGHT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(currency.format(data.getIncome(d)));
+ }
+ tf.nextRow().nextCell().addLine("Total");
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_RIGHT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(currency.format(data.getTotal(d)));
+ }
+ tf.nextRow().nextCell().addLine("Total cumulé");
+ for (String d : data.getDates()) {
+ tf.nextCell(TableFormatter.ALIGN_RIGHT, TableFormatter.VALIGN_DEFAULT)
+ .addLine(currency.format(data.getFinances(d)));
+ }
+
+ String s = StringUtils.join(tf.getFormattedTable(), "\n");
+ Reader reader = new StringReader(s);
+ return new ReaderInputStream(reader);
+ }
+
/**
* Permet de collecter et representer les donnees pour le budget
*/
Modified: trunk/chorem-webmotion/src/main/resources/mapping
===================================================================
--- trunk/chorem-webmotion/src/main/resources/mapping 2013-06-29 22:54:31 UTC (rev 353)
+++ trunk/chorem-webmotion/src/main/resources/mapping 2013-06-29 22:55:21 UTC (rev 354)
@@ -10,7 +10,8 @@
* /wikitty-json/* DecoratorFilter.decorate wmDecoratorNo=true
* /fragment/* DecoratorFilter.decorate wmDecoratorNo=true
* /sales/funnel/json/* DecoratorFilter.decorate wmDecoratorNo=true
-* /project/json/* DecoratorFilter.decorate wmDecoratorNo=true
+* /project/json/* DecoratorFilter.decorate wmDecoratorNo=true
+* /ascii/* DecoratorFilter.decorate wmDecoratorNo=true
GET /* DecoratorFilter.decorate
* /* AuthenticationFilter.check
#####
@@ -52,6 +53,7 @@
* /admin/{method} action:AdminAction.{method}
* /contact view:contact.jsp
* /report view:report.jsp
+* /ascii/budget action:DashboardAction.budget type=ascii,report=budget
* /hr view:hr.jsp
* /hr/vacationRequest/edit/{id} action:HrAction.editVacationRequest
* /hr/vacationDiv/{ids} action:HrAction.editVacationDiv
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardBudget.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardBudget.jsp 2013-06-29 22:54:31 UTC (rev 353)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/dashboardBudget.jsp 2013-06-29 22:55:21 UTC (rev 354)
@@ -23,10 +23,34 @@
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
<h1>Budget</h1>
+<form>
+ <input type="hidden" name="report" value="${report}"/>
+ <input type="hidden" name="useDate" value="${useDate}" />
+ <c:if test="${useDate != 'false'}">
+ <input type="hidden" name="start" value="${fn:escapeXml(start)}"/>
+ <input type="hidden" name="end" value="${fn:escapeXml(end)}"/>
+ </c:if>
+ <input type="hidden" name="query" value="${fn:escapeXml(query)}"/>
+
+ profondeur <input type="text" name="depth" value="${depth}"/>
+ <input type="submit" class="btn"/>
+</form>
+
+ <c:url var="asciireport" value="/ascii/budget">
+ <c:param name="useDate" value="${useDate}"/>
+ <c:param name="start" value="${start}"/>
+ <c:param name="end" value="${end}"/>
+ <c:param name="query" value="${query}"/>
+ <c:param name="depth" value="${depth}"/>
+ </c:url>
+
+ <a href="${asciireport}">export ascii</a>
+
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr>
1
0
r353 - in trunk/chorem-webmotion/src/main/webapp: WEB-INF/jsp css
by bpoussin@users.chorem.org 29 Jun '13
by bpoussin@users.chorem.org 29 Jun '13
29 Jun '13
Author: bpoussin
Date: 2013-06-30 00:54:31 +0200 (Sun, 30 Jun 2013)
New Revision: 353
Url: http://chorem.org/projects/chorem/repository/revisions/353
Log:
essai de minimisation de la taille du menu Financial
Modified:
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
trunk/chorem-webmotion/src/main/webapp/css/chorem.less
Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2013-06-28 14:53:52 UTC (rev 352)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2013-06-29 22:54:31 UTC (rev 353)
@@ -144,22 +144,23 @@
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
- <li>Projected</li>
- <li><a href="<c:url value="/wikitty/Quotation/search"/>"><i class="icon-th-list icon-black"></i> All quotations</a></li>
- <li><a href="<c:url value="/wikitty/Quotation/edit/new"/>"><i class="icon-plus icon-black"></i> Add quotation</a></li>
+ <li>
+ <a href="<c:url value="/wikitty/Quotation/search"/>"><i class="icon-th-list icon-black"></i>Quotations</a>
+ <a href="<c:url value="/wikitty/Quotation/edit/new"/>"><i class="icon-plus icon-black"></i></a>
+ </li>
+ <li>
+ <a href="<c:url value="/wikitty/FinancialTransaction/search"/>"><i class="icon-th-list icon-black"></i>FinancialTransaction</a>
+ <a href="<c:url value="/wikitty/FinancialTransaction/edit/new"/>"><i class="icon-plus icon-black"></i></a>
+ </li>
+ <li>
+ <a href="<c:url value="/wikitty/Invoice/search"/>"><i class="icon-th-list icon-black"></i>Invoices</a>
+ <a href="<c:url value="/wikitty/Invoice/edit/new"/>"><i class="icon-plus icon-black"></i></a>
+ </li>
+ <li>
+ <a href="<c:url value="/wikitty/Category/search"/>"><i class="icon-th-list icon-black"></i>Categories</a>
+ <a href="<c:url value="/wikitty/Category/edit/new"/>"><i class="icon-plus icon-black"></i></a>
+ </li>
<li class="divider"></li>
- <li>FinancialTransaction</li>
- <li><a href="<c:url value="/wikitty/FinancialTransaction/search"/>"><i class="icon-th-list icon-black"></i> All financial transactions</a></li>
- <li><a href="<c:url value="/wikitty/FinancialTransaction/edit/new"/>"><i class="icon-plus icon-black"></i> Add financial transactions</a></li>
- <li class="divider"></li>
- <li>Invoice</li>
- <li><a href="<c:url value="/wikitty/Invoice/search"/>"><i class="icon-th-list icon-black"></i> All invoices</a></li>
- <li><a href="<c:url value="/wikitty/Invoice/edit/new"/>"><i class="icon-plus icon-black"></i> Add invoice</a></li>
- <li class="divider"></li>
- <li>Category</li>
- <li><a href="<c:url value="/wikitty/Category/search"/>"><i class="icon-th-list icon-black"></i> All categories</a></li>
- <li><a href="<c:url value="/wikitty/Category/edit/new"/>"><i class="icon-plus icon-black"></i> Add category</a></li>
- <li class="divider"></li>
<li>Report</li>
<li><a href="<c:url value="/report?report=vat"/>">TVA mensuel</a></li>
<li><a href="<c:url value="/report?report=invoiceDebt"/>">Debt</a></li>
Modified: trunk/chorem-webmotion/src/main/webapp/css/chorem.less
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/chorem.less 2013-06-28 14:53:52 UTC (rev 352)
+++ trunk/chorem-webmotion/src/main/webapp/css/chorem.less 2013-06-29 22:54:31 UTC (rev 353)
@@ -13,6 +13,11 @@
padding: 0px;
}
+/* Pour que les menus avec un + soit sur une seul ligne */
+.dropdown-menu li > a {
+ display: inline;
+}
+
.ui-autocomplete {
max-height: 250px;
max-width: 500px;
1
0
See <http://ci.nuiton.org/jenkins/job/chorem/147/changes>
Changes:
[meynier] Changed Task.reestimatedEnd by Task.dayExtension
------------------------------------------
[...truncated 795 lines...]
[Fatal Error] accountSalesReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] hr.jsp~:9:71: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 9; columnNumber: 71; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 9; columnNumber: 71; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesPerAccountReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[Fatal Error] dashboardVacationByEmployee.jsp~:5:63: The prefix "c" for element "c:forEach" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
[ERROR] org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesPerProjectReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 5; columnNumber: 63; The prefix "c" for element "c:forEach" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 5; columnNumber: 63; The prefix "c" for element "c:forEach" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] sales.jsp~:2:43: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 2; columnNumber: 43; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 2; columnNumber: 43; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] acceptedQuotation.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] sentQuotation.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] index.jsp~:6:50: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 6; columnNumber: 50; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 6; columnNumber: 50; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] dashboardProfitability.jsp~:21:46: The prefix "c" for element "c:forEach" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 21; columnNumber: 46; The prefix "c" for element "c:forEach" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 21; columnNumber: 46; The prefix "c" for element "c:forEach" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] report.jsp~:5:40: The prefix "c" for element "c:if" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 5; columnNumber: 40; The prefix "c" for element "c:if" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…;> lineNumber: 5; columnNumber: 40; The prefix "c" for element "c:if" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:get (get) @ chorem-webmotion ---
[INFO] Copying chorem-webmotion.properties to <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/ge…>
[INFO] Copying chorem-webmotion.properties to <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/ge…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:gen (gen-and-make-bundle) @ chorem-webmotion ---
[INFO] Copying chorem-webmotion_fr_FR.properties to <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
[INFO] Copying chorem-webmotion_en_GB.properties to <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/src/main/…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:collect-i18n-artifacts (collect-i18n-artifacts) @ chorem-webmotion ---
Downloading: http://nexus.nuiton.org/nexus/content/groups/wikitty/org/nuiton/wikitty/3.1…
Downloading: http://nexus.nuiton.org/nexus/content/groups/wikitty/org/nuiton/wikitty/wik…
[INFO] collected 2 i18n artifacts for locale fr_FR stored in <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…>
[INFO] collected 2 i18n artifacts for locale en_GB stored in <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/i1…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:bundle (gen-and-make-bundle) @ chorem-webmotion ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ chorem-webmotion ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ chorem-webmotion ---
[INFO] Compiling 34 source files to <http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/cl…>
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] bootstrap class path not set in conjunction with -source 1.6
<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/pr…>:[155,7] error: cannot find symbol
[ERROR] symbol: method getReestimatedEnd()
location: variable t of type Task
<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/pr…>:[160,7] error: cannot find symbol
[ERROR] symbol: method getReestimatedEnd()
location: variable t of type Task
<http://ci.nuiton.org/jenkins/job/chorem/ws/trunk/chorem-webmotion/target/pr…>:[161,38] error: cannot find symbol
[INFO] 3 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] chorem ............................................ SUCCESS [3.233s]
[INFO] Chorem entities ................................... SUCCESS [12.621s]
[INFO] Chorem webmotion .................................. FAILURE [4.079s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.621s
[INFO] Finished at: Fri Jun 28 13:03:24 CEST 2013
[INFO] Final Memory: 34M/279M
[INFO] ------------------------------------------------------------------------
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
Waiting for Jenkins to finish collecting data
mavenExecutionResult exceptions not empty
message : Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project chorem-webmotion: Compilation failure
cause : Compilation failure
Stack trace :
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project chorem-webmotion: Compilation failure
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:158)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:100)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:66)
at hudson.remoting.UserRequest.perform(UserRequest.java:118)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:326)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:729)
at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:128)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
... 27 more
Sending e-mails to: chorem-commits(a)list.chorem.org
channel stopped
1
2
28 Jun '13
See <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
------------------------------------------
[...truncated 329 lines...]
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] editQuotation.jsp~:4:1: Element type "link" must be followed by either attribute specifications, ">" or "/>".
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 1; Element type "link" must be followed by either attribute specifications, ">" or "/>".
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 1; Element type "link" must be followed by either attribute specifications, ">" or "/>".
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] account.jsp~:3:74: The element type "link" must be terminated by the matching end-tag "</link>".
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 3; columnNumber: 74; The element type "link" must be terminated by the matching end-tag "</link>".
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 3; columnNumber: 74; The element type "link" must be terminated by the matching end-tag "</link>".
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesFunnel.jsp~:5:17: The element type "link" must be terminated by the matching end-tag "</link>".
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 17; The element type "link" must be terminated by the matching end-tag "</link>".
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 17; The element type "link" must be terminated by the matching end-tag "</link>".
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] accountSalesReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] hr.jsp~:9:71: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 9; columnNumber: 71; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 9; columnNumber: 71; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesPerAccountReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[Fatal Error] dashboardVacationByEmployee.jsp~:5:63: The prefix "c" for element "c:forEach" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[ERROR] org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] salesPerProjectReport.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 63; The prefix "c" for element "c:forEach" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 63; The prefix "c" for element "c:forEach" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] sales.jsp~:2:43: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 2; columnNumber: 43; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 2; columnNumber: 43; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] acceptedQuotation.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] sentQuotation.jsp~:4:37: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 4; columnNumber: 37; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] index.jsp~:6:50: The prefix "jsp" for element "jsp:include" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 6; columnNumber: 50; The prefix "jsp" for element "jsp:include" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 6; columnNumber: 50; The prefix "jsp" for element "jsp:include" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] dashboardProfitability.jsp~:21:46: The prefix "c" for element "c:forEach" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 21; columnNumber: 46; The prefix "c" for element "c:forEach" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 21; columnNumber: 46; The prefix "c" for element "c:forEach" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[Fatal Error] report.jsp~:5:40: The prefix "c" for element "c:if" is not bound.
[ERROR] could not parse file <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
org.nuiton.i18n.plugin.parser.ParserException: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 40; The prefix "c" for element "c:if" is not bound.
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:400)
at org.nuiton.i18n.plugin.parser.ParserExecutor$ParserTask.run(ParserExecutor.java:219)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.xml.sax.SAXParseException; systemId: file://<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…;> lineNumber: 5; columnNumber: 40; The prefix "c" for element "c:if" is not bound.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.nuiton.i18n.plugin.parser.impl.AbstractParserXmlMojo$XmlFileParser.parseFile(AbstractParserXmlMojo.java:387)
... 4 more
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:get (get) @ chorem-webmotion ---
[INFO] Copying chorem-webmotion.properties to <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO] Copying chorem-webmotion.properties to <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:gen (gen-and-make-bundle) @ chorem-webmotion ---
[INFO] Copying chorem-webmotion_fr_FR.properties to <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO] Copying chorem-webmotion_en_GB.properties to <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:collect-i18n-artifacts (collect-i18n-artifacts) @ chorem-webmotion ---
Downloading: http://nexus.nuiton.org/nexus/content/groups/wikitty/org/nuiton/wikitty/3.1…
Downloading: http://nexus.nuiton.org/nexus/content/groups/wikitty/org/nuiton/wikitty/wik…
[INFO] collected 2 i18n artifacts for locale fr_FR stored in <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO] collected 2 i18n artifacts for locale en_GB stored in <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO]
[INFO] --- maven-i18n-plugin:2.3.1:bundle (gen-and-make-bundle) @ chorem-webmotion ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ chorem-webmotion ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ chorem-webmotion ---
[INFO] Compiling 34 source files to <http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] bootstrap class path not set in conjunction with -source 1.6
<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>:[155,7] error: cannot find symbol
[ERROR] symbol: method getReestimatedEnd()
location: variable t of type Task
<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>:[160,7] error: cannot find symbol
[ERROR] symbol: method getReestimatedEnd()
location: variable t of type Task
<http://ci.nuiton.org/jenkins/job/chorem/org.chorem.chorem$chorem-webmotion/…>:[161,38] error: cannot find symbol
[INFO] 3 errors
[INFO] -------------------------------------------------------------
1
2