dolibarr/htdocs/compta/bank/graph.php
Laurent Destailleur e0d479a2bb Simplification de la couche generant les graphs. Tous les graphs passent par la classe DolGraph.
C'est cette classe qui doit ensuite s'appuier directement sur PHPlot ou une autre librairie graphique libre.
Qual: La génération des soldes ne fait plus exception ce qui permet de ne plus dépendre de jpgraph qui
n'est pas libre.
2006-08-13 13:30:53 +00:00

445 lines
11 KiB
PHP

<?php
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 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.
*
* $Id$
* $Source$
*/
/**
\file htdocs/compta/bank/graph.php
\ingroup banque
\brief Page de détail des transactions bancaires
\version $Revision$
*/
require("./pre.inc.php");
require_once(DOL_DOCUMENT_ROOT."/lib/bank.lib.php");
require_once(DOL_DOCUMENT_ROOT."/dolgraph.class.php");
if (!$user->rights->banque->lire)
accessforbidden();
$account = $_GET["account"];
$mesg = '';
llxHeader();
if ($account > 0)
{
$datetime = time();
$year = strftime("%Y", $datetime);
$month = strftime("%m", $datetime);
$day = strftime("%d", $datetime);
$acct = new Account($db);
$acct->fetch($account);
// Definition de $width et $height
$width = 750;
$height = 280;
// Calcul de $min et $max
$sql = "SELECT min(".$db->pdate("datev")."),max(".$db->pdate("datev").")";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$row = $db->fetch_row($resql);
$min = $row[0];
$max = $row[1];
}
else
{
dolibarr_print_error($db);
}
// print strftime("%Y%m%d",$max);
// Chargement du tableau $amounts
// \todo peut etre optimise en virant les date_format
$amounts = array();
$sql = "SELECT date_format(datev,'%Y%m%d'), sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND date_format(datev,'%Y%m') = '".$year.$month."'";
$sql .= " GROUP BY date_format(datev,'%Y%m%d')";
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
while ($i < $num)
{
$row = $db->fetch_row($resql);
$amounts[$row[0]] = $row[1];
$i++;
}
}
else
{
dolibarr_print_error($db);
}
// Calcul de $solde avant le debut du graphe
$solde = 0;
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND datev < '".$year."-".sprintf("%02s",$month)."-01'";
$resql = $db->query($sql);
if ($resql)
{
$row = $db->fetch_row($resql);
$solde = $row[0];
}
else
{
dolibarr_print_error($db);
}
// Chargement de labels et datas pour tableau 1
$labels = array();
$datas = array();
$subtotal = 0;
$day = mktime(1,1,1,$month,1,$year);
$xmonth = substr("00".strftime("%m",$day), -2);
$i = 0;
while ($xmonth == $month)
{
//print strftime ("%e %d %m %y",$day)."\n";
$subtotal = $subtotal + (isset($amounts[strftime("%Y%m%d",$day)]) ? $amounts[strftime("%Y%m%d",$day)] : 0);
if ($day > time())
{
$datas[$i] = ''; // Valeur spéciale permettant de ne pas tracer le graph
}
else
{
$datas[$i] = $solde + $subtotal;
}
//$labels[$i] = strftime("%d",$day);
$labels[$i] = strftime("%d",$day);
$day += 86400;
$xmonth = substr("00".strftime("%m",$day), -2);
$i++;
}
// Fabrication tableau 1
$file= $conf->banque->dir_images."/solde.$account.$year.$month.png";
$title=$langs->trans("Balance").' '.$langs->trans("Month").': '.$month.' '.$langs->trans("Year").': '.$year;
$graph_datas=array();
foreach($datas as $i => $val)
{
$graph_datas[$i]=array("$labels[$i]",$datas[$i]);
}
$px = new DolGraph();
$px->SetData($graph_datas);
$px->SetLegend(array($langs->trans("Balance")));
$px->SetMaxValue($px->GetCeilMaxValue());
$px->SetMinValue($px->GetFloorMinValue());
$px->SetTitle($title);
$px->SetWidth($width);
$px->SetHeight($height);
$px->SetType('lines');
$px->draw($file);
// Chargement du tableau $amounts
// \todo peut etre optimise en virant les date_format
$amounts = array();
$sql = "SELECT date_format(datev,'%Y%m%d'), sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND date_format(datev,'%Y') = '".$year."'";
$sql .= " GROUP BY date_format(datev,'%Y%m%d')";
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
while ($i < $num)
{
$row = $db->fetch_row($resql);
$amounts[$row[0]] = $row[1];
$i++;
}
}
else
{
dolibarr_print_error($db);
}
// Calcul de $solde avant le debut du graphe
$solde = 0;
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND datev < '".$year."-01-01'";
$resql = $db->query($sql);
if ($resql)
{
$row = $db->fetch_row($resql);
$solde = $row[0];
}
else
{
dolibarr_print_error($db);
}
// Chargement de labels et datas pour tableau 2
$labels = array();
$datas = array();
$subtotal = 0;
$day = mktime(1,1,1,1,1,$year);
$xyear = strftime("%Y",$day);
$i = 0;
while ($xyear == $year)
{
$subtotal = $subtotal + (isset($amounts[strftime("%Y%m%d",$day)]) ? $amounts[strftime("%Y%m%d",$day)] : 0);
//print strftime ("%e %d %m %y",$day)." ".$subtotal."\n<br>";
if ($day > time())
{
$datas[$i] = ''; // Valeur spéciale permettant de ne pas tracer le graph
}
else
{
$datas[$i] = $solde + $subtotal;
}
if (strftime("%d",$day) == 15)
{
$labels[$i] = strftime("%m",$day);
}
$day += 86400;
$xyear = strftime("%Y",$day);
$i++;
}
// Fabrication tableau 2
$file= $conf->banque->dir_images."/solde.$account.$year.png";
$title=$langs->trans("Balance").' '.$langs->trans("Year").': '.$year;
$graph_datas=array();
foreach($datas as $i => $val)
{
$graph_datas[$i]=array(isset($labels[$i])?$labels[$i]:'',$datas[$i]);
}
$px = new DolGraph();
$px->SetData($graph_datas);
$px->SetLegend(array($langs->trans("Balance")));
$px->SetMaxValue($px->GetCeilMaxValue());
$px->SetTitle($title);
$px->SetWidth($width);
$px->SetHeight($height);
$px->SetType('lines');
$px->draw($file);
// Chargement du tableau $amounts
// \todo peut etre optimise en virant les date_format
$amounts = array();
$sql = "SELECT date_format(datev,'%Y%m%d'), sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " GROUP BY date_format(datev,'%Y%m%d')";
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
while ($i < $num)
{
$row = $db->fetch_row($resql);
$amounts[$row[0]] = $row[1];
$i++;
}
}
else
{
dolibarr_print_error($db);
}
// Calcul de $solde avant le debut du graphe
$solde = 0;
// Chargement de labels et datas pour tableau 3
$labels = array();
$datas = array();
$subtotal = 0;
$day = $min;
$i = 0;
while ($day <= ($max+1000000)) // On va bien au dela du dernier jour
{
$subtotal = $subtotal + (isset($amounts[strftime("%Y%m%d",$day)]) ? $amounts[strftime("%Y%m%d",$day)] : 0);
//print strftime ("%e %d %m %y",$day)." ".$subtotal."\n<br>";
if ($day > ($max+86400))
{
$datas[$i] = ''; // Valeur spéciale permettant de ne pas tracer le graph
}
else
{
$datas[$i] = $solde + $subtotal;
}
if (strftime("%d",$day) == 1)
{
$labels[$i] = strftime("%m",$day);
}
$day += 86400;
$i++;
}
// Fabrication tableau 3
$file= $conf->banque->dir_images."/solde.$account.png";
$title=$langs->trans("Balance");
$graph_datas=array();
foreach($datas as $i => $val)
{
$graph_datas[$i]=array(isset($labels[$i])?$labels[$i]:'',$datas[$i]);
}
$px = new DolGraph();
$px->SetData($graph_datas);
$px->SetLegend(array($langs->trans("Balance")));
$px->SetMaxValue($px->GetCeilMaxValue());
$px->SetMinValue($px->GetFloorMinValue());
$px->SetTitle($title);
$px->SetWidth($width);
$px->SetHeight($height);
$px->SetType('lines');
$px->draw($file);
// Chargement du tableau $credits, $debits
$credits = array();
$debits = array();
$sql = "SELECT date_format(datev,'%m'), sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND date_format(datev,'%Y') = '".$year."'";
$sql .= " AND amount > 0";
$sql .= " GROUP BY date_format(datev,'%m');";
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
while ($i < $num)
{
$row = $db->fetch_row($resql);
$credits[$row[0]] = $row[1];
$i++;
}
}
else
{
dolibarr_print_error($db);
}
$sql = "SELECT date_format(datev,'%m'), sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."bank";
$sql .= " WHERE fk_account = ".$account;
$sql .= " AND date_format(datev,'%Y') = '".$year."'";
$sql .= " AND amount < 0";
$sql .= " GROUP BY date_format(datev,'%m');";
$resql = $db->query($sql);
if ($resql)
{
while ($row = $db->fetch_row($resql))
{
$debits[$row[0]] = abs($row[1]);
}
}
else
{
dolibarr_print_error($db);
}
// Chargement de labels et data_xxx pour tableau 4
$labels = array();
$data_credit = array();
$data_debit = array();
for ($i = 0 ; $i < 12 ; $i++)
{
$data_credit[$i] = isset($credits[substr("0".($i+1),-2)]) ? $credits[substr("0".($i+1),-2)] : 0;
$data_debit[$i] = isset($debits[substr("0".($i+1),-2)]) ? $debits[substr("0".($i+1),-2)] : 0;
$labels[$i] = $i+1;
}
// Fabrication tableau 4
$file= $conf->banque->dir_images."/mouvement.$account.$year.png";
$title=$langs->trans("Movements").' '.$langs->trans("Year").': '.$year;
$graph_datas=array();
foreach($data_credit as $i => $val)
{
$graph_datas[$i]=array($labels[$i],$data_credit[$i],$data_debit[$i]);
}
$px = new DolGraph();
$px->SetData($graph_datas);
$px->SetLegend(array($langs->trans("Debit"),$langs->trans("Credit")));
$px->SetMaxValue($px->GetCeilMaxValue());
$px->SetMinValue($px->GetFloorMinValue());
$px->SetTitle($title);
$px->SetWidth($width);
$px->SetHeight($height);
$px->SetType('bars');
$px->SetShading(8);
$px->draw($file);
$titre=$langs->trans("FinancialAccount")." : ".$acct->label;
print_fiche_titre($titre,$mesg);
// Onglets
$head=bank_prepare_head($acct);
dolibarr_fiche_head($head,'graph',$langs->trans("FinancialAccount"),0);
print '<table class="notopnoleftnoright" width="100%">';
print '<tr><td align="center">';
$file = "solde.$account.$year.$month.png";
print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=bank&file='.$file.'" alt="" title="">';
print '</td></tr>';
print '<tr><td align="center">';
$file = "solde.$account.$year.png";
print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=bank&file='.$file.'" alt="" title="">';
print '</td></tr>';
print '<tr><td align="center">';
$file = "solde.$account.png";
print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=bank&file='.$file.'" alt="" title="">';
print '</td></tr>';
print '<tr><td align="center">';
$file = "mouvement.$account.$year.png";
print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=bank&file='.$file.'" alt="" title="">';
print '</td></tr>';
print '</table>';
print "\n</div>\n";
}
$db->close();
llxFooter('$Date$ - $Revision$');
?>