Author: jcouteau Date: 2013-01-23 10:39:46 +0100 (Wed, 23 Jan 2013) New Revision: 303 Url: http://chorem.org/projects/chorem/repository/revisions/303 Log: refs #862 : Add a report for a project (sales by year on the project). Available from the sales per project report Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/ProjectSalesReportAction.java trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/projectSalesReport.jsp Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesData.java trunk/chorem-webmotion/src/main/resources/mapping trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/menu.jsp trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesPerProjectReport.jsp Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/ProjectSalesReportAction.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/ProjectSalesReportAction.java (rev 0) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/ProjectSalesReportAction.java 2013-01-23 09:39:46 UTC (rev 303) @@ -0,0 +1,93 @@ +package org.chorem.webmotion.actions.sales; + +import org.chorem.ChoremClient; +import org.chorem.entities.Accepted; +import org.chorem.entities.Quotation; +import org.debux.webmotion.server.WebMotionController; +import org.debux.webmotion.server.render.Render; +import org.nuiton.wikitty.query.WikittyQuery; +import org.nuiton.wikitty.query.WikittyQueryMaker; +import org.nuiton.wikitty.query.conditions.Aggregate; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author jcouteau <couteau@codelutin.com> + */ +public class ProjectSalesReportAction extends WebMotionController { + + /** + * Rend le graphe des devis envoyés par mois + * + * @param client + * @return + */ + public Render sales(ChoremClient client, String project, String from, + String to) { + + if (null == from) { + from = String.valueOf(SalesReportHelper.getFirstYear(client)); + } + + if (null == to) { + to = String.valueOf(SalesReportHelper.getLastYear()); + } + + Map<Integer, SalesData> salesData = new LinkedHashMap<Integer, SalesData>(); + + List<Integer> listAllYears = SalesReportHelper.listAllYears(from, to); + + List<Integer> listAllYearsInChorem = SalesReportHelper.listAllYears(client); + + int previousYearValue = 0; + + for (Integer year:listAllYears){ + Date yearFirstDay = SalesReportHelper.getFirstDayOfYear(year); + Date yearLastDay = SalesReportHelper.getLastDayOfYear(year); + + SalesData yearData = new SalesData(); + + WikittyQuery projectQuery = new WikittyQueryMaker() + .select("Quotation.amount", Aggregate.SUM).and() + .eq(Quotation.FQ_FIELD_QUOTATION_PROJECT, project) + .bw(Accepted.FQ_FIELD_ACCEPTED_ACCEPTEDDATE, yearFirstDay, + yearLastDay) + .end(); + + Integer sales = client.findByQuery(Integer.class, projectQuery); + + //TODO JC 2012-01-22 Find a way to replace two queries into one. + WikittyQuery quotationsQuery = new WikittyQueryMaker().and() + .eq(Quotation.FQ_FIELD_QUOTATION_PROJECT, project) + .bw(Accepted.FQ_FIELD_ACCEPTED_ACCEPTEDDATE, yearFirstDay, + yearLastDay) + .end(); + + List<Quotation> quotations = client.findAllByQuery(Quotation.class, + quotationsQuery).getAll(); + + //Progression devis envoyés + int salesProgression = 0; + if (previousYearValue != 0){ + salesProgression = 100 * (sales - previousYearValue) / previousYearValue; + } + + previousYearValue = sales; + + yearData.setSales(sales); + yearData.setProgression(salesProgression); + yearData.setQuotations(quotations.size()); + + salesData.put(year, yearData); + } + + return renderView("salesReports/projectSalesReport.jsp", + "data", salesData, + "allYears", listAllYearsInChorem, + "fromYear", from, + "toYear", to); + } +} Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesData.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesData.java 2013-01-23 09:39:02 UTC (rev 302) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesData.java 2013-01-23 09:39:46 UTC (rev 303) @@ -9,6 +9,8 @@ protected Integer quotations; + protected Integer progression; + public Integer getSales() { return sales; } @@ -35,4 +37,12 @@ return mean; } + + public Integer getProgression() { + return progression; + } + + public void setProgression(Integer progression) { + this.progression = progression; + } } Modified: trunk/chorem-webmotion/src/main/resources/mapping =================================================================== --- trunk/chorem-webmotion/src/main/resources/mapping 2013-01-23 09:39:02 UTC (rev 302) +++ trunk/chorem-webmotion/src/main/resources/mapping 2013-01-23 09:39:46 UTC (rev 303) @@ -57,5 +57,6 @@ * /sales/report/acceptedQuotation action:sales.AcceptedQuotationsReportAction.acceptedQuotationPerMonth * /sales/report/sales action:sales.SalesReportAction.sales * /sales/report/salesPerProject action:sales.SalesPerProjectReportAction.sales +* /sales/report/salesPerProject/{project} action:sales.ProjectSalesReportAction.sales * /sales/{method} action:sales.SalesAction.{method} * /sales/{method}/{id} action:sales.SalesAction.{method} Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/menu.jsp =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/menu.jsp 2013-01-23 09:39:02 UTC (rev 302) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/menu.jsp 2013-01-23 09:39:46 UTC (rev 303) @@ -1,7 +1,7 @@ <ul class="nav nav-list"> - <li><a href="#"><i class="icon-chevron-right"></i> Ventes</a></li> + <li><a href="sales"><i class="icon-chevron-right"></i> Ventes</a></li> <li><a href="#"><i class="icon-chevron-right"></i> Ventes par client</a></li> - <li><a href="#"><i class="icon-chevron-right"></i> Ventes par projet</a></li> + <li><a href="salesPerProject"><i class="icon-chevron-right"></i> Ventes par projet</a></li> <li><a href="sentQuotation"><i class="icon-chevron-right"></i> Devis envoyés</a></li> <li><a href="acceptedQuotation"><i class="icon-chevron-right"></i> Devis acceptés</a></li> </ul> \ No newline at end of file Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/projectSalesReport.jsp =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/projectSalesReport.jsp (rev 0) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/projectSalesReport.jsp 2013-01-23 09:39:46 UTC (rev 303) @@ -0,0 +1,123 @@ +<%-- + #%L + Chorem webmotion + $Id:$ + $HeadURL:$ + %% + Copyright (C) 2011 - 2012 CodeLutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + #L% + --%> +<%@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="/WEB-INF/wikitty.tld" prefix="w"%> + +<div class="row-fluid"> + <div class="span2"> + <jsp:include page="/salesMenu"/> + </div> + + <div class="span10"> + <!-- Javascript to display graph --> + <script type="text/javascript"> + $(document).ready(function(){ + var sales = [ + <c:forEach var="entry" items="${data}" varStatus="counter"> + ['${entry.key}', ${entry.value.sales}] + <c:if test="${!counter.last}">, </c:if> + </c:forEach> + ]; + + var plot1 = $.jqplot ('sales', [sales], { + title:'Ventes par année', + seriesDefaults:{ + renderer:$.jqplot.BarRenderer, + rendererOptions: {fillToZero: true} + }, + axes:{ + xaxis:{ + pad: 0, + tickRenderer: $.jqplot.CanvasAxisTickRenderer , + tickOptions: { + angle: -30, + fontSize: '10pt' + }, + renderer: $.jqplot.CategoryAxisRenderer + }, + }, + highlighter: { + show: true, + tooltipAxes: 'y' + }, + cursor: { + show: false + }, + series:[ + <c:forEach var="entry" items="${data}" varStatus="counter"> + {label:${entry.key}}<c:if test="${!counter.last}">,</c:if> + </c:forEach>], + legend: {show:true, location: 'e', placement: 'outsideGrid' } + }); + + }); + </script> + + <h2>Ventes</h2> + + <form action="sales" method="get"> + <select name="from"> + <c:forEach var="entry" items="${allYears}" varStatus="counter"> + <option value="${entry}" <c:if test="${entry==fromYear}">selected</c:if>>${entry}</option> + </c:forEach> + </select> + <select name="to"> + <c:forEach var="entry" items="${allYears}" varStatus="counter"> + <option value="${entry}" ${entry == toYear ? 'selected' : ''} >${entry}</option> + </c:forEach> + </select> + <input type="submit" value="Rechercher"> + </form> + + <div id="sales" style="height:200px;"></div> + + + <table class="table table-striped table-bordered table-condensed"> + <thead> + <tr> + <th>Année</th> + <th>Ventes</th> + <th>Devis</th> + <th>€/devis</th> + <th>Progression</th> + </tr> + </thead> + <tbody> + <c:forEach var="year" items="${data}"> + <tr> + <td>${year.key}</td> + <td class="currency">${year.value.sales}</td> + <td>${year.value.quotations}</td> + <td class="currency">${year.value.mean}</td> + <td class="percent">${year.value.progression} %</td> + </tr> + </c:forEach> + </tbody> + </table> + + </div> +</div> + +<div style="clear:both;"/> \ No newline at end of file Modified: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesPerProjectReport.jsp =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesPerProjectReport.jsp 2013-01-23 09:39:02 UTC (rev 302) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesPerProjectReport.jsp 2013-01-23 09:39:46 UTC (rev 303) @@ -91,7 +91,7 @@ <tbody> <c:forEach var="project" items="${data}"> <tr> - <td>${project.key.name}</td> + <td><a href="<c:url value="/sales/report/salesPerProject/${project.key.wikittyId}"/>">${project.key.name}</a></td> <td>${project.value.sales}</td> <td>${project.value.quotations}</td> <td>${project.value.mean} €</td>