Feature Budget working need to add some more features down the line

This commit is contained in:
johnnyq 2023-08-18 19:34:20 -04:00
parent adf313f183
commit b1aa8d3a91
9 changed files with 441 additions and 9 deletions

149
budget.php Normal file
View File

@ -0,0 +1,149 @@
<?php
// Default Column Sortby/Order Filter
$sort = "budget_year";
$order = "DESC";
require_once("inc_all.php");
//Rebuild URL
$url_query_strings_sort = http_build_query($get_copy);
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM budget
LEFT JOIN categories ON budget_category_id = category_id
AND DATE(budget_created_at) BETWEEN '$dtf' AND '$dtt'
AND (budget_description LIKE '%$q%' OR budget_amount LIKE '%$q%' OR budget_month LIKE '%$q%' OR budget_year LIKE '%$q%' OR category_name LIKE '%$q%')
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-balance-scale mr-2"></i>Budget</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#createBudgetModal"><i class="fas fa-plus mr-2"></i>Create</button>
</div>
</div>
<div class="card-body">
<form class="mb-4" autocomplete="off">
<div class="row">
<div class="col-sm-4">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search...">
<div class="input-group-append">
<button class="btn btn-secondary" type="button" data-toggle="collapse" data-target="#advancedFilter"><i class="fas fa-filter"></i></button>
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
<div class="col-sm-8">
</div>
</div>
<div class="collapse mt-3 <?php if (!empty($_GET['dtf']) || $_GET['canned_date'] !== "custom" ) { echo "show"; } ?>" id="advancedFilter">
<div class="row">
<div class="col-md-2">
<div class="form-group">
<label>Canned Date</label>
<select class="form-control select2" name="canned_date">
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="">Custom</option>
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
</select>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label>Date From</label>
<input type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label>Date To</label>
<input type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
</div>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=budget_year&order=<?php echo $disp; ?>">Year</a></th>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=budget_month&order=<?php echo $disp; ?>">Month</a></th>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=category_name&order=<?php echo $disp; ?>">Category</a></th>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=budget_description&order=<?php echo $disp; ?>">Description</a></th>
<th class="text-right"><a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=budget_amount&order=<?php echo $disp; ?>">Amount</a></th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($sql)) {
$budget_id = intval($row['budget_id']);
$budget_description = nullable_htmlentities($row['budget_description']);
$budget_year = intval($row['budget_year']);
$budget_month = intval($row['budget_month']);
$budget_amount = floatval($row['budget_amount']);
$budget_category_id = intval($row['budget_category_id']);
$category_name = nullable_htmlentities($row['category_name']);
?>
<tr>
<td><a class="text-dark" href="#" data-toggle="modal" data-target="#editBudgetModal<?php echo $expense_id; ?>"><?php echo $budget_year; ?></a></td>
<td><?php echo $budget_month; ?></td>
<td><?php echo $category_name; ?></td>
<td><?php echo truncate($budget_description, 50); ?></td>
<td class="text-bold text-right"><?php echo numfmt_format_currency($currency_format, $budget_amount, $session_company_currency); ?></td>
<td>
<div class="dropdown dropleft text-center">
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
<i class="fas fa-ellipsis-h"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#editBudgetModal<?php echo $budget_id; ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold" href="post.php?delete_expense=<?php echo $budget_id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>
<?php
require("budget_edit_modal.php");
}
?>
</tbody>
</table>
</div>
<?php require_once("pagination.php"); ?>
</div>
</div>
<?php
require_once("budget_create_modal.php");
require_once("footer.php");

108
budget_create_modal.php Normal file
View File

@ -0,0 +1,108 @@
<div class="modal" id="createBudgetModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content bg-dark">
<div class="modal-header">
<h5 class="modal-title"><i class="fa fa-fw fa-balance-scale mr-2"></i>Creating Budget</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body bg-white">
<div class="form-row">
<div class="form-group col-md">
<label>Month <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<select class="form-control select2" name="month" required>
<option value="">- Select a Month -</option>
<option value="1">01 - January</option>
<option value="2">02 - February</option>
<option value="3">03 - March</option>
<option value="4">04 - April</option>
<option value="5">05 - May</option>
<option value="6">06 - June</option>
<option value="7">07 - July</option>
<option value="8">08 - August</option>
<option value="9">09 - September</option>
<option value="10">10 - October</option>
<option value="11">11 - November</option>
<option value="12">12 - December</option>
</select>
</div>
</div>
<div class="form-group col-md">
<label>Year <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="number" class="form-control" name="year" placeholder="Enter Year xxxx" required>
</div>
</div>
</div>
<div class="form-row">
</div>
<div class="form-group">
<label>Description <strong class="text-danger">*</strong></label>
<textarea class="form-control" rows="6" name="description" placeholder="Enter a description" required></textarea>
</div>
<div class="form-row">
<div class="form-group col-md">
<label>Amount <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
</div>
<input type="number" class="form-control" step="0.01" name="amount" placeholder="Enter an amount" required>
</div>
</div>
<div class="form-group col-md">
<label>Category <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="category" required>
<option value="">- Category -</option>
<?php
$sql = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Expense' AND category_archived_at IS NULL ORDER BY category_name ASC");
while ($row = mysqli_fetch_array($sql)) {
$category_id = intval($row['category_id']);
$category_name = nullable_htmlentities($row['category_name']);
?>
<option value="<?php echo $category_id; ?>"><?php echo $category_name; ?></option>
<?php
}
?>
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer bg-white">
<button type="submit" name="create_budget" class="btn btn-primary text-bold"><i class="fa fa-fw fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

102
budget_edit_modal.php Normal file
View File

@ -0,0 +1,102 @@
<div class="modal" id="editBudgetModal<?php echo $budget_id; ?>" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content bg-dark">
<div class="modal-header">
<h5 class="modal-title text-white"><i class="fa fa-fw fa-edit mr-2"></i>Editing Budget</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span aria-hidden="true">&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body bg-white">
<input type="hidden" name="budget_id" value="<?php echo $budget_id; ?>">
<div class="form-row">
<div class="form-group col-md">
<label>Month <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<select class="form-control select2" name="month" required>
<option value="">- Select a Month -</option>
<option value="1" <?php if($budget_month == 1) { echo "selected"; } ?>>01 - January</option>
<option value="2" <?php if($budget_month == 2) { echo "selected"; } ?>>02 - February</option>
<option value="3" <?php if($budget_month == 3) { echo "selected"; } ?>>03 - March</option>
<option value="4" <?php if($budget_month == 4) { echo "selected"; } ?>>04 - April</option>
<option value="5" <?php if($budget_month == 5) { echo "selected"; } ?>>05 - May</option>
<option value="6" <?php if($budget_month == 6) { echo "selected"; } ?>>06 - June</option>
<option value="7" <?php if($budget_month == 7) { echo "selected"; } ?>>07 - July</option>
<option value="8" <?php if($budget_month == 8) { echo "selected"; } ?>>08 - August</option>
<option value="9" <?php if($budget_month == 9) { echo "selected"; } ?>>09 - September</option>
<option value="10" <?php if($budget_month == 10) { echo "selected"; } ?>>10 - October</option>
<option value="11" <?php if($budget_month == 11) { echo "selected"; } ?>>11 - November</option>
<option value="12" <?php if($budget_month == 12) { echo "selected"; } ?>>12 - December</option>
</select>
</div>
</div>
<div class="form-group col-md">
<label>Year <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="number" class="form-control" name="year" placeholder="Enter a year xxxx" value="<?php echo $budget_year; ?>" required>
</div>
</div>
</div>
<div class="form-group">
<label>Description <strong class="text-danger">*</strong></label>
<textarea class="form-control" rows="6" name="description" placeholder="Enter a description" required><?php echo $budget_description; ?></textarea>
</div>
<div class="form-row">
<div class="form-group col-md">
<label>Amount <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
</div>
<input type="number" class="form-control" step="0.01" name="amount" value="<?php echo $budget_amount; ?>" required>
</div>
</div>
<div class="form-group col-md">
<label>Category <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="category" required>
<?php
$sql_select = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Expense' AND (category_archived_at > '$expense_created_at' OR category_archived_at IS NULL) ORDER BY category_name ASC");
while ($row = mysqli_fetch_array($sql_select)) {
$category_id_select = intval($row['category_id']);
$category_name_select = nullable_htmlentities($row['category_name']);
?>
<option <?php if ($budget_category_id == $category_id_select) { ?> selected <?php } ?> value="<?php echo $category_id_select; ?>"><?php echo $category_name_select; ?></option>
<?php
}
?>
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer bg-white">
<button type="submit" name="edit_budget" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -1253,11 +1253,18 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.2'");
}
//if (CURRENT_DATABASE_VERSION == '0.7.2') {
//Insert queries here required to update to DB version 0.7.3
if (CURRENT_DATABASE_VERSION == '0.7.2') {
mysqli_query($mysqli, "ALTER TABLE `budget` CHANGE `budget_year` `budget_year` INT NOT NULL");
mysqli_query($mysqli, "ALTER TABLE `budget` CHANGE `budget_amount` `budget_amount` DECIMAL(15,2) DEFAULT 0.00");
// Then, update the database to the next sequential version
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.3'");
}
//if (CURRENT_DATABASE_VERSION == '0.7.3') {
//Insert queries here required to update to DB version 0.7.4
// Then, update the database to the next sequential version
//mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.3'");
//mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.4'");
//}
} else {

View File

@ -5,4 +5,4 @@
* It is used in conjunction with database_updates.php
*/
DEFINE("LATEST_DATABASE_VERSION", "0.7.2");
DEFINE("LATEST_DATABASE_VERSION", "0.7.3");

6
db.sql
View File

@ -158,8 +158,8 @@ DROP TABLE IF EXISTS `budget`;
CREATE TABLE `budget` (
`budget_id` int(11) NOT NULL AUTO_INCREMENT,
`budget_month` tinyint(4) NOT NULL,
`budget_year` tinyint(4) NOT NULL,
`budget_amount` decimal(15,2) NOT NULL,
`budget_year` int(11) NOT NULL,
`budget_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
`budget_description` varchar(255) DEFAULT NULL,
`budget_created_at` datetime NOT NULL DEFAULT current_timestamp(),
`budget_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),
@ -1691,4 +1691,4 @@ CREATE TABLE `vendors` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-08-18 18:20:52
-- Dump completed on 2023-08-18 19:33:44

View File

@ -40,7 +40,7 @@ require_once("post/transfer.php");
require_once("post/trip.php");
require_once("post/user.php");
require_once("post/vendor.php");
require_once("post/budget.php");
require_once("post/misc.php");
?>

61
post/budget.php Normal file
View File

@ -0,0 +1,61 @@
<?php
/*
* ITFlow - GET/POST request handler for budget
*/
if (isset($_POST['create_budget'])) {
$month = intval($_POST['month']);
$year = intval($_POST['year']);
$amount = floatval($_POST['amount']);
$description = sanitizeInput($_POST['description']);
$category = intval($_POST['category']);
mysqli_query($mysqli,"INSERT INTO budget SET budget_month = $month, budget_year = $year, budget_amount = $amount, budget_description = '$description', budget_category_id = $category");
$budget_id = mysqli_insert_id($mysqli);
//Logging
mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Budget', log_action = 'Create', log_description = '$description', log_ip = '$session_ip', log_user_agent = '$session_user_agent', log_user_id = $session_user_id");
$_SESSION['alert_message'] = "Budget created";
header("Location: " . $_SERVER["HTTP_REFERER"]);
}
if (isset($_POST['edit_budget'])) {
$budget_id = intval($_POST['budget_id']);
$month = intval($_POST['month']);
$year = intval($_POST['year']);
$amount = floatval($_POST['amount']);
$description = sanitizeInput($_POST['description']);
$category = intval($_POST['category']);
mysqli_query($mysqli,"UPDATE budget SET budget_month = $month, budget_year = $year, budget_amount = $amount, budget_description = '$description', budget_category_id = $category WHERE budget_id = $budget_id");
//Logging
mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Budget', log_action = 'Edit', log_description = '$description', log_ip = '$session_ip', log_user_agent = '$session_user_agent', log_user_id = $session_user_id");
$_SESSION['alert_message'] = "Budget edited";
header("Location: " . $_SERVER["HTTP_REFERER"]);
}
if (isset($_GET['delete_budget'])) {
$budget_id = intval($_GET['delete_budget']);
mysqli_query($mysqli,"DELETE FROM budget WHERE budget_id = $budget_id");
//Logging
mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Budget', log_action = 'Delete', log_description = '$budget_id', log_ip = '$session_ip', log_user_agent = '$session_user_agent', log_user_id = $session_user_id");
$_SESSION['alert_type'] = "error";
$_SESSION['alert_message'] = "Budget deleted";
header("Location: " . $_SERVER["HTTP_REFERER"]);
}

View File

@ -149,7 +149,12 @@
<p>Transfers</p>
</a>
</li>
<li class="nav-item">
<a href="budget.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "budget.php") { echo "active"; } ?>">
<i class="nav-icon fas fa-balance-scale"></i>
<p>Budget</p>
</a>
</li>
<li class="nav-item">
<a href="report_income_summary.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "report_income_summary.php") { echo "active"; } ?>">
<i class="fas fa-chart-bar nav-icon"></i>