Add web view
This commit is contained in:
parent
41617afc10
commit
32d03d70cd
2
README
2
README
|
@ -6,4 +6,6 @@ wxWidgets 2.8 and sqlite3 is needed
|
|||
|
||||
A modified version of wxFreeChart is used : warning during recompilation, don't overwrite autotools files with ./configure
|
||||
|
||||
If you use web view, edit database.php and set $BDD_FILE, it's higly recommanded to use an SSL certificate.
|
||||
|
||||
More information can be found at http://indefero.soutade.fr/p/kisscount
|
||||
|
|
|
@ -6,4 +6,6 @@ wxWidgets 2.8 et sqlite3 sont nécessaire
|
|||
|
||||
Une version modifiée de wxFreeChart est utilisée : attention à lors de la recompilation à ne pas écraser les fichiers des autotools (pas de ./configure)
|
||||
|
||||
Si vous utilisez la version web pour visualiser vos comptes, éditez d'abord le fichier database.php en positionnant correctement la variable $BDD_FILE, il est fortement recommandé d'utiliser un certificat SSL.
|
||||
|
||||
Plus d'informations peuvent être trouvé sur http://indefero.soutade.fr/p/kisscount
|
||||
|
|
46
www/User.php
Normal file
46
www/User.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
Copyright 2010 Grégory Soutadé
|
||||
|
||||
This file is part of KissCount.
|
||||
|
||||
KissCount 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
KissCount 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 KissCount. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
<?php
|
||||
|
||||
class User
|
||||
{
|
||||
public $id;
|
||||
public $accounts;
|
||||
public $categories;
|
||||
public $preferences;
|
||||
|
||||
function GetCategory($id)
|
||||
{
|
||||
foreach($this->categories as $i => $category)
|
||||
if ($category["id"] == "$id") return $category;
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
function GetAccountName($id)
|
||||
{
|
||||
foreach($this->accounts as $i => $account)
|
||||
if ($account["id"] == "$id") return $account["name"];
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
195
www/database.php
Normal file
195
www/database.php
Normal file
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
Copyright 2010 Grégory Soutadé
|
||||
|
||||
This file is part of KissCount.
|
||||
|
||||
KissCount 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
KissCount 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 KissCount. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
<?php
|
||||
|
||||
$BDD_FILE = '/var/nfs/kc.bdd';
|
||||
|
||||
try {
|
||||
$db = new SQLite3($BDD_FILE, SQLITE3_OPEN_READONLY);
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
die('Unable to load BDD');
|
||||
}
|
||||
|
||||
function GetUsers()
|
||||
{
|
||||
global $db;
|
||||
|
||||
$res = array();
|
||||
|
||||
$result = $db->query("SELECT name FROM user ORDER BY name");
|
||||
|
||||
while ($row = $result->fetchArray())
|
||||
array_push($res, $row['name']);
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
function IsUserValid($user, $password)
|
||||
{
|
||||
global $db;
|
||||
|
||||
$result = $db->query("SELECT id FROM user WHERE name='" . $db->escapeString($user) . "' AND password='" . sha1($db->escapeString($password)) . "'");
|
||||
|
||||
return $result->fetchArray();
|
||||
}
|
||||
|
||||
function LoadUser($name)
|
||||
{
|
||||
global $db;
|
||||
|
||||
$user = new User();
|
||||
|
||||
$name = $db->escapeString($name);
|
||||
|
||||
$result = $db->query("SELECT * FROM user WHERE name='$name'");
|
||||
|
||||
if (!($row = $result->fetchArray()))
|
||||
return NULL;
|
||||
|
||||
$user->id = $row["id"];
|
||||
|
||||
$result = $db->query("SELECT * FROM account WHERE user='$user->id' ORDER BY default_account DESC, name ASC");
|
||||
|
||||
$user->accounts = array();
|
||||
|
||||
while ($row = $result->fetchArray())
|
||||
array_push($user->accounts, $row);
|
||||
|
||||
$result = $db->query("SELECT * FROM category WHERE user='$user->id' ORDER by name");
|
||||
|
||||
$user->categories = array();
|
||||
|
||||
while ($row = $result->fetchArray())
|
||||
array_push($user->categories, $row);
|
||||
|
||||
$result = $db->query("SELECT * FROM preference WHERE user='$user->id' ORDER by name");
|
||||
|
||||
$user->preferences = array();
|
||||
|
||||
$user->preferences["operation_order"] = "ASC";
|
||||
|
||||
while ($row = $result->fetchArray())
|
||||
array_push($user->preferences, $row);
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
function GetAccountAmount($id, $month, $year)
|
||||
{
|
||||
global $db;
|
||||
|
||||
$req = "SELECT amount FROM account_amount WHERE account='$id' AND month='$month' AND year='$year'";
|
||||
|
||||
$result = $db->query($req);
|
||||
|
||||
if ($row = $result->fetchArray())
|
||||
return $row["amount"];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
function LoadMonth($user, $month, $year)
|
||||
{
|
||||
global $db;
|
||||
|
||||
if (!isset($user->accounts[0])) return;
|
||||
|
||||
$req = "SELECT * FROM operation WHERE (account IN('" . $user->accounts[0]["id"] ;
|
||||
foreach($user->accounts as $i => $account)
|
||||
{
|
||||
$req .= "', '" . $account["id"];
|
||||
}
|
||||
|
||||
$req .= "')";
|
||||
$req .= " OR user='$user->id')";
|
||||
$req .= " AND year='$year' AND month='$month'";
|
||||
$req .= " ORDER BY fix_cost DESC, year, month ASC, day ";
|
||||
$req .= $user->preferences["operation_order"];
|
||||
|
||||
return $db->query($req);
|
||||
|
||||
}
|
||||
|
||||
function GetAllOperations($user, &$last_year, &$last_month)
|
||||
{
|
||||
$res;
|
||||
global $db;
|
||||
|
||||
if (!isset($user->accounts[0])) return $res;
|
||||
|
||||
$req = "SELECT DISTINCT year FROM account_amount WHERE account IN('" . $user->accounts[0]["id"] ;
|
||||
foreach($user->accounts as $i => $account)
|
||||
{
|
||||
$req .= "', '" . $account["id"];
|
||||
}
|
||||
$req .= "')";
|
||||
|
||||
$req2 = "SELECT DISTINCT year FROM operation WHERE account IN('" .$user->accounts[0]["id"] ;
|
||||
foreach($user->accounts as $i => $account)
|
||||
{
|
||||
$req2 .= "', '" . $account["id"];
|
||||
}
|
||||
$req2 .= "')";
|
||||
$req2 .= " OR user='" . $user->id . "'";
|
||||
$req2 .= " ORDER BY year ASC";
|
||||
|
||||
$reqUnion = $req . " UNION " . $req2;
|
||||
|
||||
$result = $db->query($reqUnion);
|
||||
|
||||
while ($row = $result->fetchArray())
|
||||
{
|
||||
$last_year = $year = $row["year"];
|
||||
|
||||
$req = "SELECT DISTINCT month FROM account_amount WHERE account IN('" . $user->accounts[0]["id"] ;
|
||||
foreach($user->accounts as $i => $account)
|
||||
{
|
||||
$req .= "', '" . $account["id"];
|
||||
}
|
||||
$req .= "')";
|
||||
$req .= " AND year='" . $year . "'";
|
||||
|
||||
$req2 = "SELECT DISTINCT month FROM operation WHERE (account IN('" . $user->accounts[0]["id"] ;
|
||||
foreach($user->accounts as $i => $account)
|
||||
{
|
||||
$req2 .= "', '" . $account["id"];
|
||||
}
|
||||
$req2 .= "')";
|
||||
$req2 .= " OR user='" . $user->id . "')";
|
||||
$req2 .= " AND year='" . $year . "'";
|
||||
$req2 .= " ORDER BY month ASC";
|
||||
|
||||
$reqUnion = $req . " UNION " . $req2;
|
||||
|
||||
$result2 = $db->query($reqUnion);
|
||||
|
||||
while ($row = $result2->fetchArray())
|
||||
{
|
||||
if (!isset($res[$year])) $res[$year] = array();
|
||||
array_push($res[$year], $row["month"]);
|
||||
$last_month = $row["month"];
|
||||
}
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
?>
|
257
www/index.php
Normal file
257
www/index.php
Normal file
|
@ -0,0 +1,257 @@
|
|||
/*
|
||||
Copyright 2010 Grégory Soutadé
|
||||
|
||||
This file is part of KissCount.
|
||||
|
||||
KissCount 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
KissCount 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 KissCount. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
<?php
|
||||
include "kisscount.php" ;
|
||||
|
||||
session_start();
|
||||
?>
|
||||
<!DOCTYPE HTML SYSTEM>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
||||
<link rel="stylesheet" type="text/css" href= "kisscount.css" />
|
||||
<title>KissCount</title>
|
||||
</head>
|
||||
<body bgcolor="#CCCCCC">
|
||||
<?php
|
||||
|
||||
if (isset($_GET["disconnect"]))
|
||||
{
|
||||
$_SESSION = array();
|
||||
session_destroy();
|
||||
}
|
||||
|
||||
if (!isset($_SESSION["user"]))
|
||||
{
|
||||
$display_login = 1;
|
||||
|
||||
if (isset($_POST["user"]))
|
||||
{
|
||||
if (!IsUserValid($_POST["user"], $_POST["password"]))
|
||||
echo "<center><font color=\"red\"><h3>Invalid password</h3></font></center>\n";
|
||||
else
|
||||
$display_login = 0;
|
||||
}
|
||||
|
||||
if ($display_login == 1)
|
||||
{
|
||||
$users = GetUsers();
|
||||
echo "<center><h1>KissCount</h1><br /><br/>\n";
|
||||
echo "<form id=\"login\" method=\"post\">\n";
|
||||
echo "Login : <select name=\"user\">\n";
|
||||
foreach($users as $i => $name)
|
||||
echo "<option value=\"$name\">$name</option>\n";
|
||||
echo "</select><br /><br />\n";
|
||||
echo "Password : <input type=\"password\" name=\"password\" /><br /><br />\n";
|
||||
echo "<input type=\"submit\" />\n";
|
||||
echo "</form></center>\n";
|
||||
echo "<br /><br />\n";
|
||||
echo "<center><a href=\"http://indefero.soutade.fr/p/kisscount\">KissCount</a> © 2010 Grégory Soutadé</center>\n";
|
||||
die();
|
||||
}
|
||||
else
|
||||
$_SESSION["user"] = LoadUser($_POST["user"]);
|
||||
}
|
||||
|
||||
if (!isset($_SESSION["operations"]))
|
||||
{
|
||||
$_SESSION["operations"] = GetAllOperations($_SESSION["user"], $_SESSION["last_year"], $_SESSION["last_month"]);
|
||||
}
|
||||
|
||||
if (!isset($_POST["year"]))
|
||||
{
|
||||
$_SESSION["cur_year"] = $_SESSION["last_year"];
|
||||
$_SESSION["cur_month"] = $_SESSION["last_month"];
|
||||
}
|
||||
else
|
||||
{
|
||||
$_SESSION["cur_year"] = $_POST["year"];
|
||||
$_SESSION["cur_month"] = $_POST["month"];
|
||||
}
|
||||
|
||||
$operations = LoadMonth($_SESSION["user"], $_SESSION["cur_month"], $_SESSION["cur_year"]);
|
||||
$cur_date = mktime(0, 0, 0, date("m") , date("d"), date("Y"));
|
||||
$total_incomes = $total_outcomes = $cur_incomes = $cur_outcomes = 0;
|
||||
|
||||
while($operation = $operations->fetchArray())
|
||||
{
|
||||
$date = mktime(0, 0, 0, $operation["month"]+1, $operation["day"]+1, $operation["year"]);
|
||||
|
||||
$accounts[$operation["account"]]["total"] += $operation["amount"];
|
||||
|
||||
if ($date <= $cur_date)
|
||||
$accounts[$operation["account"]]["cur"] += $operation["amount"];
|
||||
|
||||
if ($operation["transfert"] != "") continue;
|
||||
|
||||
if ($operation["amount"] < 0)
|
||||
{
|
||||
$categories[$operation["category"]] -= $operation["amount"];
|
||||
$total_outcomes -= $operation["amount"];
|
||||
if ($date <= $cur_date)
|
||||
$cur_outcomes -= $operation["amount"];
|
||||
}
|
||||
else
|
||||
{
|
||||
$total_incomes += $operation["amount"];
|
||||
if ($date <= $cur_date)
|
||||
$cur_incomes += $operation["amount"];
|
||||
}
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
function changeMonths()
|
||||
{
|
||||
document.getElementById("date_month").innerHTML = "";
|
||||
switch(document.getElementById("date_year").value)
|
||||
{
|
||||
<?php
|
||||
global $months_strings;
|
||||
foreach($_SESSION["operations"] as $year => $months)
|
||||
{
|
||||
echo "case \"$year\":\n";
|
||||
$tmp = "";
|
||||
foreach($months as $i => $month)
|
||||
{
|
||||
$tmp .= "<option value=\\'" . $month . "\\'>" . $months_strings[$month] . "</option>";
|
||||
}
|
||||
echo "document.getElementById(\"date_month\").innerHTML = '" . $tmp . "'\n";
|
||||
echo "break\n";
|
||||
}
|
||||
?>
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<form id="date" method="POST">
|
||||
<select name="month" id="date_month">
|
||||
<?php
|
||||
foreach($_SESSION["operations"][$_SESSION["cur_year"]] as $i => $month)
|
||||
{
|
||||
if ($month != $_SESSION["cur_month"])
|
||||
echo "<option value='" . $month . "'>" . $months_strings[$month] . "</option>\n";
|
||||
else
|
||||
echo "<option value='" . $month . "' selected>" . $months_strings[$month] . "</option>\n";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
<select name="year" id="date_year" onChange="changeMonths();">
|
||||
<?php
|
||||
foreach($_SESSION["operations"] as $year => $months)
|
||||
{
|
||||
if ($year != $_SESSION["cur_year"])
|
||||
echo "<option value='" . $year . "'>" . $year . "</option>\n";
|
||||
else
|
||||
echo "<option value='" . $year . "' selected>" . $year . "</option>\n";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
<input type="submit" />
|
||||
</form>
|
||||
<a id="disconnect" href="?disconnect=1">Disconnect</a>
|
||||
<br /><br />
|
||||
<div id="informations">
|
||||
<div id="accounts">
|
||||
<table>
|
||||
<tr class="header"><td>Account number</td><td>Account name</td><td>Initial value</td><td>Cur value</td><td>Final value</td></tr>
|
||||
<?php
|
||||
foreach($_SESSION["user"]->accounts as $i => $account)
|
||||
{
|
||||
$val = GetAccountAmount($account["id"], $_SESSION["cur_month"], $_SESSION["cur_year"]);
|
||||
echo "<tr class='bordered'>";
|
||||
echo "<td>" . $account["number"] . "</td>";
|
||||
echo "<td>" . $account["name"] . "</td>";
|
||||
echo "<td align='right'>" . number_format($val, 2) . "</td>";
|
||||
if (($accounts[$account["id"]]["cur"] + $val) < 0)
|
||||
echo "<td align='right' style=\"font-weight:bold;color:red;\">" . number_format($accounts[$account["id"]]["cur"] + $val, 2) . "</td>" ;
|
||||
else
|
||||
echo "<td align='right' style=\"font-weight:bold;\">" . number_format($accounts[$account["id"]]["cur"] + $val, 2) . "</td>" ;
|
||||
echo "<td align='right'>" . number_format($accounts[$account["id"]]["total"] + $val, 2) . "</td>" ;
|
||||
echo "</tr>\n";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<br /><br />
|
||||
<div id="operations">
|
||||
<table>
|
||||
<tr class="header" bgcolor="#99CCFF"><td>Description</td><td>Date</td><td>Debit</td><td>Credit</td><td>Category</td><td>Account</td></tr>
|
||||
<?php
|
||||
$prev_week=-1;
|
||||
$operations = LoadMonth($_SESSION["user"], $_SESSION["cur_month"], $_SESSION["cur_year"]);
|
||||
while($operation = $operations->fetchArray())
|
||||
{
|
||||
$category = $_SESSION["user"]->GetCategory($operation["category"]);
|
||||
if ($operation["fix_cost"] == "0")
|
||||
{
|
||||
$cur_week = date("W", mktime(0, 0, 0, $operation["month"]+1, $operation["day"]+1, $operation["year"]));
|
||||
if ($cur_week > $prev_week)
|
||||
{
|
||||
$tr_class = "class=\"new_week\"";
|
||||
$prev_week = $cur_week;
|
||||
}
|
||||
else
|
||||
$tr_class = "";
|
||||
}
|
||||
echo "<tr $tr_class bgcolor='" . $category["color"] ."'><td>" . $operation["description"] . "</td>";
|
||||
echo "<td>" . date("d/m/Y", mktime(0, 0, 0, $operation["month"]+1, $operation["day"]+1, $operation["year"])) . "</td>";
|
||||
if ($operation["amount"] < 0)
|
||||
echo "<td align='right'>" . number_format(-$operation["amount"], 2) . "</td><td />";
|
||||
else
|
||||
echo "<td /><td align='right'>" . number_format($operation["amount"], 2) . "</td>";
|
||||
echo "<td>" . $category["name"] . "</td>";
|
||||
echo "<td>" . $_SESSION["user"]->GetAccountName($operation["account"]) . "</td>";
|
||||
echo "</tr>\n";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="stats">
|
||||
<div id="money_stats">
|
||||
<table>
|
||||
<tr class="bordered"><td style="font-weight:bold">Cur credit</td><td align="right"><?php echo number_format($cur_incomes, 2) ?></td></tr>
|
||||
<tr class="bordered"><td style="font-weight:bold">Cur debit</td><td align="right"><?php echo number_format($cur_outcomes, 2) ?></td></tr>
|
||||
<tr class="bordered"><td>Total credit</td><td align="right"><?php echo number_format($total_incomes, 2); ?></td></tr>
|
||||
<tr class="bordered"><td>Total debit</td><td align="right"><?php echo number_format($total_outcomes, 2); ?></td></tr>
|
||||
<tr class="bordered"><td style="font-weight:bold">Remains</td>
|
||||
<?php
|
||||
if ($total_outcomes < $total_incomes)
|
||||
echo "<td style=\"text-align:right;font-weight:bold;color:green\">" . number_format($total_incomes - $total_outcomes, 2) . "</td>";
|
||||
else
|
||||
echo "<td style=\"text-align:right;font-weight:bold;color:red\"> " . number_format($total_incomes - $total_outcomes, 2) . "</td>";
|
||||
?>
|
||||
</tr>
|
||||
<tr class="bordered"><td>_</td><td> </td></tr>
|
||||
<?php
|
||||
foreach($_SESSION["user"]->categories as $i => $category)
|
||||
{
|
||||
$percent = ($categories[$category["id"]] * 100) / $total_outcomes;
|
||||
$percent = round($percent, 0);
|
||||
$percent = ($percent < 10) ? "0$percent" : "$percent";
|
||||
echo "<tr class=\"bordered\"><td>" . $category["name"]. "</td><td align=\"right\">" . number_format($categories[$category["id"]], 2) . " ($percent %)</td></tr>\n";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<br /><br />
|
||||
<center><a href="http://indefero.soutade.fr/p/kisscount">KissCount</a> © 2010 Grégory Soutadé</center>
|
||||
</body>
|
||||
</html>
|
11
www/kisscount.css
Normal file
11
www/kisscount.css
Normal file
|
@ -0,0 +1,11 @@
|
|||
table {background-color:white;border:1px solid black; border-collapse:collapse;}
|
||||
.bordered {border:1px solid black}
|
||||
td {border-right:1px solid black; padding:3px}
|
||||
tr.header > td {border:1px solid black; text-align:center; font-weight:bold; padding:2px}
|
||||
tr.bordered > td {border:1px solid black;padding:2px}
|
||||
tr.new_week {border-top:1px solid black;}
|
||||
div {display:inline;}
|
||||
table {display:inline-table;}
|
||||
#date {display: inline;}
|
||||
#disconnect {float:right;}
|
||||
#login {border:1px solid black;padding:2px;margin-left:350px;margin-right:350px}
|
26
www/kisscount.php
Normal file
26
www/kisscount.php
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
Copyright 2010 Grégory Soutadé
|
||||
|
||||
This file is part of KissCount.
|
||||
|
||||
KissCount 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
KissCount 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 KissCount. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
<?php
|
||||
include "User.php";
|
||||
include "database.php";
|
||||
|
||||
$months_strings = array("january", "february", "march", "april", "may", "june", "july", "august",
|
||||
"september", "october", "november", "december");
|
||||
?>
|
Loading…
Reference in New Issue
Block a user