Author: jcouteau Date: 2013-01-12 15:03:56 +0100 (Sat, 12 Jan 2013) New Revision: 295 Url: http://chorem.org/projects/chorem/repository/revisions/295 Log: refs #862 : - add a sales report - fix the way of getting first year Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportAction.java trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesReport.jsp Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesAction.java trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportHelper.java trunk/chorem-webmotion/src/main/resources/mapping Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesAction.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesAction.java 2013-01-07 20:49:15 UTC (rev 294) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesAction.java 2013-01-12 14:03:56 UTC (rev 295) @@ -172,7 +172,7 @@ sent.setPostedDate(new Date()); client.store(sent); - return renderView("sales.jsp"); + return renderLastPage(); } public Render accept(ChoremClient client, String id) { @@ -180,7 +180,7 @@ accepted.setAcceptedDate(new Date()); client.store(accepted); - return renderView("sales.jsp"); + return renderLastPage(); } public Render start(ChoremClient client, String id) { @@ -189,7 +189,7 @@ started.setStartedDate(new Date()); client.store(started); - return renderView("sales.jsp"); + return renderLastPage(); } @@ -197,7 +197,7 @@ Draft draft = client.restore(Draft.class, id); client.store(draft); - return renderView("sales.jsp"); + return renderLastPage(); } } Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportAction.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportAction.java (rev 0) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportAction.java 2013-01-12 14:03:56 UTC (rev 295) @@ -0,0 +1,117 @@ +package org.chorem.webmotion.actions.sales; + +import org.apache.commons.lang.time.DateUtils; +import org.chorem.ChoremClient; +import org.chorem.entities.Accepted; +import org.debux.webmotion.server.WebMotionController; +import org.debux.webmotion.server.render.Render; +import org.nuiton.util.DateUtil; +import org.nuiton.wikitty.WikittyClient; +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 SalesReportAction extends WebMotionController { + + /** + * Rend le graphe des devis envoyés par mois + * + * @param client + * @return + */ + public Render sales(ChoremClient client, String from, String to) { + + if (null == from) { + from = String.valueOf(SalesReportHelper.getFirstYear(client)); + } + + if (null == to) { + to = String.valueOf(SalesReportHelper.getLastYear()); + } + + Map<Integer, QuotationYearData> data = new LinkedHashMap<Integer, QuotationYearData>(); + + 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); + + QuotationYearData yearData = new QuotationYearData(); + + //Ventes de l'année + WikittyQuery salesQuery = new WikittyQueryMaker() + .select("Quotation.amount", Aggregate.SUM).and() + .exteq(Accepted.EXT_ACCEPTED) + .bw(Accepted.FQ_FIELD_ACCEPTED_ACCEPTEDDATE, yearFirstDay, yearLastDay) + .end(); + + Integer sales = client.findByQuery(Integer.class, salesQuery); + + //Progression devis envoyés + int salesProgression = 0; + if (previousYearValue != 0){ + salesProgression = 100 * (sales - previousYearValue) / previousYearValue; + } + + previousYearValue = sales; + + //Graphe devis envoyés + Map<String, Integer> sentQuotationData = getSalesData(year, client); + + yearData.setBaseValue(sales); + yearData.setProgression(salesProgression); + yearData.setPlotValues(sentQuotationData); + + data.put(year, yearData); + } + + return renderView("salesReports/salesReport.jsp", + "data", data, + "allYears", listAllYearsInChorem, + "fromYear", from, + "toYear", to); + } + + protected Map<String,Integer> getSalesData(Integer year, WikittyClient client){ + + Date last = SalesReportHelper.getLastDayOfYear(year); + Date first = SalesReportHelper.getFirstDayOfYear(year); + + Map<String,Integer> salesData = new LinkedHashMap<String, Integer>(); + + //a query per month :( + Date baseValue = first; + for (int i=0;i<12;i++){ + Date lastDayOfMonth = DateUtil.setLastDayOfMonth(baseValue); + Date firstDayOfMonth = DateUtil.setFirstDayOfMonth(baseValue); + baseValue= DateUtils.addDays(lastDayOfMonth, 1); + + WikittyQuery monthQuery = new WikittyQueryMaker() + .select("Quotation.amount", Aggregate.SUM).and() + .bw(Accepted.FQ_FIELD_ACCEPTED_ACCEPTEDDATE, firstDayOfMonth, lastDayOfMonth) + .end(); + + Integer sales = client.findByQuery(Integer.class, monthQuery); + + salesData.put( + DateUtil.getMonthLibelle(DateUtil.getMonth(lastDayOfMonth) + 1), + sales); + } + + return salesData; + } + +} Modified: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportHelper.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportHelper.java 2013-01-07 20:49:15 UTC (rev 294) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/sales/SalesReportHelper.java 2013-01-12 14:03:56 UTC (rev 295) @@ -5,7 +5,7 @@ import org.nuiton.wikitty.WikittyClient; import org.nuiton.wikitty.query.WikittyQuery; import org.nuiton.wikitty.query.WikittyQueryMaker; -import org.nuiton.wikitty.query.WikittyQueryResult; +import org.nuiton.wikitty.query.conditions.Aggregate; import java.util.Calendar; import java.util.Date; @@ -80,25 +80,19 @@ public static Integer getFirstYear(WikittyClient client) { - //Tous les devis - WikittyQuery sentCurrentYearQuery = new WikittyQueryMaker().and() + //Ventes de l'année + WikittyQuery firstYearQuery = new WikittyQueryMaker() + .select("Draft.sendingDate", Aggregate.MIN).and() .exteq(Draft.EXT_DRAFT) - .end().setLimit(WikittyQuery.MAX).addSortAscending(Draft.ELEMENT_FIELD_DRAFT_SENDINGDATE); + .end(); - WikittyQueryResult<Draft> sentCurrentYearResult = - client.findAllByQuery(Draft.class, sentCurrentYearQuery); + Date firstYear = client.findByQuery(Date.class, firstYearQuery); - System.out.println(sentCurrentYearResult.getAll()); + System.out.println(firstYear); - System.out.println(); - - Date firstDraft = sentCurrentYearResult.get(0).getSendingDate(); - Calendar c = Calendar.getInstance(); - //c.setTime(firstDraft); - //return c.get(Calendar.YEAR); - - return 2010; + c.setTime(firstYear); + return c.get(Calendar.YEAR); } public static List<Integer> listAllYears(String begin, String end) { Modified: trunk/chorem-webmotion/src/main/resources/mapping =================================================================== --- trunk/chorem-webmotion/src/main/resources/mapping 2013-01-07 20:49:15 UTC (rev 294) +++ trunk/chorem-webmotion/src/main/resources/mapping 2013-01-12 14:03:56 UTC (rev 295) @@ -55,5 +55,6 @@ * /salesMenu view:salesReports/menu.jsp * /sales/report/sentQuotation action:sales.SentQuotationsReportAction.sentQuotationPerMonth * /sales/report/acceptedQuotation action:sales.AcceptedQuotationsReportAction.acceptedQuotationPerMonth +* /sales/report/sales action:sales.SalesReportAction.sales * /sales/{method} action:sales.SalesAction.{method} * /sales/{method}/{id} action:sales.SalesAction.{method} Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesReport.jsp =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesReport.jsp (rev 0) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/salesReports/salesReport.jsp 2013-01-12 14:03:56 UTC (rev 295) @@ -0,0 +1,124 @@ +<%-- + #%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"> + [ + <c:forEach var="entry2" items="${entry.value.plotValues}" varStatus="counter2"> + ['${entry2.key}', ${entry2.value}] + <c:if test="${!counter2.last}">, </c:if> + </c:forEach> + ] + <c:if test="${!counter.last}">, </c:if> + </c:forEach> + ]; + + var plot1 = $.jqplot ('sales', sales, { + title:'Ventes par mois', + 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>Progression</th> + </tr> + </thead> + <tbody> + <c:forEach var="year" items="${data}"> + <tr> + <td>${year.key}</td> + <td class="currency">${year.value.baseValue}</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