From ef8d2eb8383c2fc5aa49cd51edd05c5a2db8e172 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@users.sourceforge.net> Date: Mon, 28 Mar 2011 21:40:43 +0000 Subject: [PATCH] New: Add report by country and region for members module --- htdocs/adherents/stats/index.php | 225 ++++++++++++++++++++ htdocs/includes/menus/init_menu_auguria.sql | 14 +- htdocs/includes/menus/standard/eldy.lib.php | 1 + htdocs/langs/en_US/members.lang | 5 + htdocs/langs/fr_FR/members.lang | 5 + 5 files changed, 244 insertions(+), 6 deletions(-) create mode 100644 htdocs/adherents/stats/index.php diff --git a/htdocs/adherents/stats/index.php b/htdocs/adherents/stats/index.php new file mode 100644 index 00000000000..2f03f6a6436 --- /dev/null +++ b/htdocs/adherents/stats/index.php @@ -0,0 +1,225 @@ +<?php +/* Copyright (C) 2001-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org> + * Copyright (c) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * \file htdocs/adherents/stats/bycountry.php + * \ingroup member + * \brief Page des stats + * \version $Id$ +*/ + +require("../../main.inc.php"); +require_once(DOL_DOCUMENT_ROOT."/commande/class/commande.class.php"); +require_once(DOL_DOCUMENT_ROOT."/commande/class/commandestats.class.php"); +require_once(DOL_DOCUMENT_ROOT."/core/class/dolgraph.class.php"); + +$graphwidth = 700; +$mapratio = 0.5; +$graphheight = round($graphwidth * $mapratio); + +$mode=GETPOST('mode')?GETPOST('mode'):''; + + +// Security check +if ($user->societe_id > 0) +{ + $action = ''; + $socid = $user->societe_id; +} +if (! $user->rights->adherent->cotisation->lire) +accessforbidden(); + +$year = strftime("%Y", time()); +$startyear=$year-2; +$endyear=$year; + + + +/* + * View + */ + + +llxHeader('','','','',0,0,array('http://www.google.com/jsapi')); + +$title=$langs->trans("Statistics"); +if ($mode == 'memberbycountry') $title=$langs->trans("MembersStatisticsByCountries"); +if ($mode == 'memberbystate') $title=$langs->trans("MembersStatisticsByState"); + +print_fiche_titre($title, $mesg); + +create_exdir($dir); + +if ($mode) +{ + // Define sql + if ($mode == 'memberbycountry') + { + $label=$langs->trans("Country"); + + $data = array(); + $sql.="SELECT COUNT(d.rowid) as nb, MAX(d.datevalid) as lastdate, c.code, c.libelle as label"; + $sql.=" FROM ".MAIN_DB_PREFIX."adherent as d LEFT JOIN ".MAIN_DB_PREFIX."c_pays as c on d.pays = c.rowid"; + $sql.=" WHERE statut = 1"; + $sql.=" GROUP BY c.libelle, c.code"; + //print $sql; + } + if ($mode == 'memberbystate') + { + $label=$langs->trans("State"); + + $data = array(); + $sql.="SELECT COUNT(d.rowid) as nb, MAX(d.datevalid) as lastdate, c.nom as label"; + $sql.=" FROM ".MAIN_DB_PREFIX."adherent as d LEFT JOIN ".MAIN_DB_PREFIX."c_departements as c on d.fk_departement = c.rowid"; + $sql.=" WHERE statut = 1"; + $sql.=" GROUP BY c.nom"; + //print $sql; + } + + // Define $data array + dol_syslog("Count member sql=".$sql); + $resql=$db->query($sql); + if ($resql) + { + $num=$db->num_rows($resql); + $i=0; + while ($i < $num) + { + $obj=$db->fetch_object($resql); + if ($mode == 'memberbycountry') + { + $data[]=array('label'=>($langs->trans("Country".$obj->code)!="Country".$obj->code?$langs->trans("Country".$obj->code):($obj->label?$obj->label:$langs->trans("Unknown"))), + 'code'=>$obj->code, + 'nb'=>$obj->nb, + 'lastdate'=>$obj->lastdate + ); + } + if ($mode == 'memberbystate') + { + $data[]=array('label'=>($obj->label?$obj->label:$langs->trans("Unknown")), + 'nb'=>$obj->nb, + 'lastdate'=>$obj->lastdate + ); + } + + $i++; + } + $db->free($resql); + } + else + { + dol_print_error($db); + } +} + +// Print title +if ($mode && ! sizeof($data)) +{ + print $langs->trans("NoValidatedMemberYet").'<br>'; + print '<br>'; +} +else +{ + if ($mode == 'memberbycountry') print $langs->trans("MembersByCountryDesc").'<br>'; + else if ($mode == 'memberbystate') print $langs->trans("MembersByStateDesc").'<br>'; + else + { + print $langs->trans("MembersStatisticsDesc").'<br>'; + print '<br>'; + print '<a href="'.$_SERVER["PHP_SELF"].'?mode=memberbycountry">'.$langs->trans("MembersStatisticsByCountries").'</a><br>'; + print '<br>'; + print '<a href="'.$_SERVER["PHP_SELF"].'?mode=memberbystate">'.$langs->trans("MembersStatisticsByState").'</a><br>'; + } + print '<br>'; +} + + +// Show graphics +if ($mode == 'memberbycountry') +{ + // Assume we've already included the proper headers so just call our script inline + print "\n<script type='text/javascript'>\n"; + print "google.load('visualization', '1', {'packages': ['geomap']});\n"; + print "google.setOnLoadCallback(drawMap);\n"; + print "function drawMap() {\n\tvar data = new google.visualization.DataTable();\n"; + + // Get the total number of rows + print "\tdata.addRows(".sizeof($data).");\n"; + print "\tdata.addColumn('string', 'Country');\n"; + print "\tdata.addColumn('number', 'Number');\n"; + + // loop and dump + $i=0; + foreach($data as $val) + { + // fix case of uk + if ($val['label'] == 'Great Britain') { $val['label'] = 'United Kingdom'; } + print "\tdata.setValue(".$i.", 0, \"".ucfirst($val['label'])."\");\n"; + print "\tdata.setValue(".$i.", 1, ".$val['nb'].");\n"; + // Google's Geomap only supports up to 400 entries + if ($i >= 400){ break; } + $i++; + } + + print "\tvar options = {};\n"; + print "\toptions['dataMode'] = 'regions';\n"; + print "\toptions['width'] = ".$graphwidth.";\n"; + print "\toptions['height'] = ".$graphheight.";\n"; + print "\tvar container = document.getElementById('".$mode."');\n"; + print "\tvar geomap = new google.visualization.GeoMap(container);\n"; + print "\tgeomap.draw(data, options);\n"; + print "};\n"; + print "</script>\n"; + + // print the div tag that will contain the map + print '<div align="center" id="'.$mode.'"></div>'."\n"; + print '<br>'; +} + +if ($mode) +{ + // Print array + print '<table class="border" width="100%">'; + print '<tr class="liste_titre">'; + print '<td align="center">'.$label.'</td>'; + print '<td align="center">'.$langs->trans("NbOfMembers").'</td>'; + print '<td align="center">'.$langs->trans("LastMemberDate").'</td>'; + print '</tr>'; + + $oldyear=0; + $var=true; + foreach ($data as $val) + { + $year = $val['year']; + $var=!$var; + print '<tr '.$bc[$var].'>'; + print '<td align="center">'.$val['label'].'</td>'; + print '<td align="right">'.$val['nb'].'</td>'; + print '<td align="right">'.dol_print_date($val['lastdate'],'dayhour').'</td>'; + print '</tr>'; + $oldyear=$year; + } + + print '</table>'; +} + +$db->close(); + +llxFooter('$Date$ - $Revision$'); +?> diff --git a/htdocs/includes/menus/init_menu_auguria.sql b/htdocs/includes/menus/init_menu_auguria.sql index e2012ab941d..8a05ce6b556 100644 --- a/htdocs/includes/menus/init_menu_auguria.sql +++ b/htdocs/includes/menus/init_menu_auguria.sql @@ -270,13 +270,15 @@ insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->import->enabled', __HANDLER__, 'left', 4131__+MAX_llx_menu__, 'tools', '', 4130__+MAX_llx_menu__, '/imports/import.php?leftmenu=import', 'NewImport', 1, 'exports', '$user->rights->import->run', '', 2, 0, __ENTITY__); -- Members insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4200__+MAX_llx_menu__, 'members', '', 13__+MAX_llx_menu__, '/adherents/index.php?leftmenu=members&mainmenu=members', 'Members', 0, 'members', '$user->rights->adherent->lire', '', 2, 0, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4201__+MAX_llx_menu__, 'members', '', 4200__+MAX_llx_menu__, '/adherents/fiche.php?action=create', 'NewMember', 1, 'members', '$user->rights->adherent->creer', '', 2, 0, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4201__+MAX_llx_menu__, 'members', '', 4200__+MAX_llx_menu__, '/adherents/fiche.php?leftmenu=members&action=create', 'NewMember', 1, 'members', '$user->rights->adherent->creer', '', 2, 0, __ENTITY__); insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4202__+MAX_llx_menu__, 'members', '', 4200__+MAX_llx_menu__, '/adherents/liste.php', 'List', 1, 'members', '$user->rights->adherent->lire', '', 2, 1, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4203__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?statut=-1', 'MenuMembersToValidate', 2, 'members', '$user->rights->adherent->lire', '', 2, 2, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4204__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?statut=1', 'MenuMembersValidated', 2, 'members', '$user->rights->adherent->lire', '', 2, 3, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4205__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?statut=1&filter=outofdate', 'MenuMembersNotUpToDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 4, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4206__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?statut=1&filter=uptodate', 'MenuMembersUpToDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 5, __ENTITY__); -insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4207__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?statut=0', 'MenuMembersResiliated', 2, 'members', '$user->rights->adherent->lire', '', 2, 6, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4203__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?leftmenu=members&statut=-1', 'MenuMembersToValidate', 2, 'members', '$user->rights->adherent->lire', '', 2, 2, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4204__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?leftmenu=members&statut=1', 'MenuMembersValidated', 2, 'members', '$user->rights->adherent->lire', '', 2, 3, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4205__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?leftmenu=members&statut=1&filter=outofdate', 'MenuMembersNotUpToDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 4, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4206__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?leftmenu=members&statut=1&filter=uptodate', 'MenuMembersUpToDate', 2, 'members', '$user->rights->adherent->lire', '', 2, 5, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4207__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/liste.php?leftmenu=members&statut=0', 'MenuMembersResiliated', 2, 'members', '$user->rights->adherent->lire', '', 2, 6, __ENTITY__); +insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4207__+MAX_llx_menu__, 'members', '', 4202__+MAX_llx_menu__, '/adherents/stats/index.php?leftmenu=members&statut=0', 'MenuMembersResiliated', 2, 'members', '$user->rights->adherent->lire', '', 2, 6, __ENTITY__); +-- Members - Subscriptions insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4300__+MAX_llx_menu__, 'members', '', 13__+MAX_llx_menu__, '/adherents/index.php?leftmenu=accountancy&mainmenu=members', 'Subscriptions', 0, 'compta', '$user->rights->adherent->cotisation->lire', '', 2, 1, __ENTITY__); insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4301__+MAX_llx_menu__, 'members', '', 4300__+MAX_llx_menu__, '/adherents/liste.php?statut=-1&leftmenu=accountancy&mainmenu=members', 'NewSubscription', 1, 'compta', '$user->rights->adherent->cotisation->creer', '', 2, 0, __ENTITY__); insert into llx_menu (enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('$conf->adherent->enabled', __HANDLER__, 'left', 4302__+MAX_llx_menu__, 'members', '', 4300__+MAX_llx_menu__, '/adherents/cotisations.php?leftmenu=accountancy', 'List', 1, 'compta', '$user->rights->adherent->cotisation->lire', '', 2, 1, __ENTITY__); diff --git a/htdocs/includes/menus/standard/eldy.lib.php b/htdocs/includes/menus/standard/eldy.lib.php index 459e8cb2249..863bee70a20 100644 --- a/htdocs/includes/menus/standard/eldy.lib.php +++ b/htdocs/includes/menus/standard/eldy.lib.php @@ -1296,6 +1296,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after) $newmenu->add("/adherents/liste.php?leftmenu=members&statut=1&filter=uptodate",$langs->trans("MenuMembersUpToDate"),2,$user->rights->adherent->lire); $newmenu->add("/adherents/liste.php?leftmenu=members&statut=1&filter=outofdate",$langs->trans("MenuMembersNotUpToDate"),2,$user->rights->adherent->lire); $newmenu->add("/adherents/liste.php?leftmenu=members&statut=0",$langs->trans("MenuMembersResiliated"),2,$user->rights->adherent->lire); + $newmenu->add("/adherents/stats/index.php?leftmenu=members",$langs->trans("MenuMembersStats"),1,$user->rights->adherent->lire); $newmenu->add("/adherents/index.php?leftmenu=members&mainmenu=members",$langs->trans("Subscriptions"),0,$user->rights->adherent->cotisation->lire); $newmenu->add("/adherents/liste.php?leftmenu=members&statut=-1,1&mainmenu=members",$langs->trans("NewSubscription"),1,$user->rights->adherent->cotisation->creer); diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index cd8f69e2d34..980f81ecbc9 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -167,6 +167,11 @@ SubscriptionPayment=Subscription payment LastSubscriptionDate=Last subscription date LastSubscriptionAmount=Last subscription amount MembersStatisticsByCountries=Members statistics by country +MembersStatisticsByState=Members statistics by state/province NbOfMembers=Number of members NoValidatedMemberYet=No validated members found MembersByCountryDesc=This screen show you statistics on members by countries. Graphic depends however on Google online graph service and is available only if an internet connection is is working. +MembersByStateDesc=This screen show you statistics on members by state/provinces/canton. +MembersStatisticsDesc=Choose statistics you want to read... +MenuMembersStats=Statistics +LastMemberDate=Last member date \ No newline at end of file diff --git a/htdocs/langs/fr_FR/members.lang b/htdocs/langs/fr_FR/members.lang index 6701a370d88..af359e2598d 100644 --- a/htdocs/langs/fr_FR/members.lang +++ b/htdocs/langs/fr_FR/members.lang @@ -168,6 +168,11 @@ SubscriptionPayment=Paiement cotisation LastSubscriptionDate=Date de la dernière cotisation LastSubscriptionAmount=Montant de la dernière cotisation MembersStatisticsByCountries=Statistiques des membres par pays +MembersStatisticsByState=Statistiques des membres par département/province/canton NbOfMembers=Nombre de membres NoValidatedMemberYet=Aucun membre validé trouvé MembersByCountryDesc=Cet écran vous présente une vue statistique du nombre d'adhérent par pays. Le graphique utilise toutefois le service en ligne de graphique de Google et n'est opérationnel uniquement si une connexion internet est disponible. +MembersByStateDesc=Cet écran vous présente une vue statistique du nombre d'adhérent par département/province/canton. +MembersStatisticsDesc=Choisissez les statistiques que vous désirez consulter... +MenuMembersStats=Statistiques +LastMemberDate=Date dernier adhérent -- GitLab