Merge branch 'master' of github.com:johnnyq/itflow

This commit is contained in:
johnnyq 2022-02-01 16:17:57 -05:00
commit 4074b62d59
8 changed files with 179 additions and 147 deletions

View File

@ -39,9 +39,16 @@
[![ITFlow][product-screenshot]]()
<b>ITFlow is a free & open-source solution for IT service management, documentation, and accounting & invoicing.</b>
- ITFlow consolidates common MSP requirements (ticketing, wiki/docs, CMDB and accounting) into one tool.
- ITFlow is primarily targeted towards Managed Service Providers but may also be suitable for internal IT departments.
<b>ITFlow is a free & open-source solution for IT service management, documentation, and accounting.</b>
### The Problem
- You're a busy MSP with 101 things to do.
- Information about your clients is unorganised and unstructured: scattered in random tickets or folders - when you do eventually find it, it's out of date.
- For some tickets, you spend longer looking for the relevant documentation than actually working the ticket.
- On top of the technical day to day, you also have to take care of the financial side of the business - consistent pricing, quotes/invoicing, and accounting.
### The Solution: ITFlow
- ITFlow consolidates common MSP needs (ticketing, wiki/docs, CMDB and accounting) into one system to help you do what you do best - IT.
### In Beta
* This project is still in early beta and is considered a **work in progress**. Many changes are being performed and may cause breakage upon updates.

View File

@ -58,6 +58,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli,"SELECT FOUND_ROWS()"));
$service_description = $row['service_description'];
$service_category = $row['service_category'];
$service_importance = $row['service_importance'];
$service_backup = $row['service_backup'];
$service_notes = $row['service_notes'];
$service_updated_at = $row['service_updated_at'];
$service_review_due = $row['service_review_due'];

1
db.sql
View File

@ -939,6 +939,7 @@ CREATE TABLE IF NOT EXISTS `services` (
`service_description` varchar(200) CHARACTER SET latin1 NOT NULL,
`service_category` varchar(20) CHARACTER SET latin1 NOT NULL,
`service_importance` varchar(10) CHARACTER SET latin1 NOT NULL,
`service_backup` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
`service_notes` text CHARACTER SET latin1 NOT NULL,
`service_created_at` datetime NOT NULL,
`service_updated_at` datetime DEFAULT NULL,

View File

@ -5595,10 +5595,11 @@ if(isset($_POST['add_service'])){
$service_description = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['description'])));
$service_category = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['category']))); //TODO: Needs integration with company categories
$service_importance = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['importance'])));
$service_backup = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['backup'])));
$service_notes = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['note'])));
// Create Service
$service_sql = mysqli_query($mysqli, "INSERT INTO services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_notes = '$service_notes', service_created_at = NOW(), service_client_id = '$client_id', company_id = '$session_company_id'");
$service_sql = mysqli_query($mysqli, "INSERT INTO services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_backup = '$service_backup', service_notes = '$service_notes', service_created_at = NOW(), service_client_id = '$client_id', company_id = '$session_company_id'");
// TODO: Support for URLs
@ -5680,10 +5681,11 @@ if(isset($_POST['edit_service'])){
$service_description = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['description'])));
$service_category = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['category']))); //TODO: Needs integration with company categories
$service_importance = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['importance'])));
$service_backup = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['backup'])));
$service_notes = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['note'])));
// Update main service details
mysqli_query($mysqli, "UPDATE services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_notes = '$service_notes', service_updated_at = NOW() WHERE service_id = '$service_id' AND company_id = '$session_company_id'");
mysqli_query($mysqli, "UPDATE services SET service_name = '$service_name', service_description = '$service_description', service_category = '$service_category', service_importance = '$service_importance', service_backup = '$service_backup', service_notes = '$service_notes', service_updated_at = NOW() WHERE service_id = '$service_id' AND company_id = '$session_company_id'");
// Unlink existing relations/assets
mysqli_query($mysqli, "DELETE FROM service_contacts WHERE service_id = '$service_id'");

View File

@ -78,6 +78,16 @@
</div>
</div>
<div class="form-group">
<label>Backup</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hdd"></i></span>
</div>
<input type="text" class="form-control" name="backup" placeholder="Backup strategy" autofocus>
</div>
</div>
<!-- TODO: We need a way of adding multiple (optional) URLs? Ideas? -->
<!-- <div class="form-group">
<label>URL</label>

View File

@ -79,6 +79,16 @@
</div>
</div>
<div class="form-group">
<label>Backup</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hdd"></i></span>
</div>
<input type="text" class="form-control" name="backup" placeholder="Backup strategy" value="<?php echo $service_backup ?>" autofocus>
</div>
</div>
<!-- TODO: We need a way of adding multiple (optional) URLs? Ideas? -->
<!-- <div class="form-group">
<label>URL</label>

View File

@ -14,8 +14,9 @@
<div class="col-8 border-right">
<div class="col-12">
<h4>Service Overview: <?php echo $service_name; ?></h4>
<p>Service Importance: <?php echo $service_importance_display; ?>
<p><?php echo $service_description; ?></p>
<b>Importance:</b> <?php echo $service_importance_display; ?> <br>
<b>Description:</b> <?php echo $service_description; ?> <br>
<b>Backup Info:</b> <?php echo $service_backup; ?> <br><br>
<h5><i class="nav-icon fas fa-sticky-note"></i> Notes</h5>
<p><?php echo $service_notes; ?></p>

View File

@ -1,141 +1,141 @@
<?php
//Rebuild URL
$url_query_strings_sb = http_build_query(array_merge($_GET,array('sb' => $sb, 'o' => $o)));
//Paging
if(isset($_GET['p'])){
$p = intval($_GET['p']);
$record_from = (($p)-1)*$_SESSION['records_per_page'];
$record_to = $_SESSION['records_per_page'];
}else{
$record_from = 0;
$record_to = $_SESSION['records_per_page'];
$p = 1;
}
if(isset($_GET['q'])){
$q = mysqli_real_escape_string($mysqli,$_GET['q']);
}else{
$q = "";
}
if(!empty($_GET['sb'])){
$sb = mysqli_real_escape_string($mysqli,$_GET['sb']);
}else{
$sb = "invoice_date";
}
if(isset($_GET['o'])){
if($_GET['o'] == 'ASC'){
$o = "ASC";
$disp = "DESC";
}else{
$o = "DESC";
$disp = "ASC";
}
}else{
$o = "DESC";
$disp = "ASC";
}
$sql = mysqli_query($mysqli,"SELECT SQL_CALC_FOUND_ROWS * FROM invoices
WHERE client_id = $client_id
AND (invoice_number LIKE '%$q%')
ORDER BY $sb $o LIMIT $record_from, $record_to");
$num_rows = mysqli_fetch_row(mysqli_query($mysqli,"SELECT FOUND_ROWS()"));
$total_found_rows = $num_rows[0];
$total_pages = ceil($total_found_rows / 10);
?>
<div class="card">
<div class="card-header bg-dark text-white">
<h6 class="float-left mt-1"><i class="fa fa-credit-card"></i> Payments</h6>
</div>
<div class="card-body">
<form autocomplete="off">
<input type="hidden" name="client_id" value="<?php echo $client_id; ?>">
<input type="hidden" name="tab" value="<?php echo $_GET['tab']; ?>">
<div class="input-group">
<input type="search" class="form-control " name="q" value="<?php if(isset($q)){echo stripslashes($q);} ?>" placeholder="Search <?php echo ucwords($_GET['tab']); ?>">
<div class="input-group-append">
<button class="btn btn-secondary"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
<hr>
<div class="table-responsive">
<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-secondary" href="?<?php echo $url_query_strings_sb; ?>&sb=invoice_date&o=<?php echo $disp; ?>">Date</a></th>
<th><a class="text-secondary" href="?<?php echo $url_query_strings_sb; ?>&sb=invoice_due&o=<?php echo $disp; ?>">Due</a></th>
<th><a class="text-secondary" href="?<?php echo $url_query_strings_sb; ?>&sb=invoice_number&o=<?php echo $disp; ?>">Invoice</a></th>
<th class="text-right"><a class="text-secondary" href="?<?php echo $url_query_strings_sb; ?>&sb=invoice_amount&o=<?php echo $disp; ?>">Invoice Amount</a></th>
</tr>
</thead>
<tbody>
<?php
while($row = mysqli_fetch_array($sql)){
$invoice_id = $row['invoice_id'];
$invoice_number = $row['invoice_number'];
$invoice_status = $row['invoice_status'];
$invoice_amount = $row['invoice_amount'];
$invoice_date = $row['invoice_date'];
$invoice_due = $row['invoice_due'];
?>
<tr>
<td><a href="invoice.php?invoice_id=<?php echo $invoice_id; ?>"><?php echo $invoice_date; ?></a></td>
<td><?php echo $invoice_due; ?></td>
<td><a href="invoice.php?invoice_id=<?php echo $invoice_id; ?>"><?php echo $invoice_number; ?></a></td>
<td class="text-right text-monospace">$<?php echo number_format($invoice_amount,2); ?></td>
</tr>
<tr>
<th>Date Recieved</th>
<th>Payment Method</th>
<th>Payment Reference</th>
<th>Payment Amount</a></th>
</tr>
<?php
$sql = mysqli_query($mysqli,"SELECT * FROM payments WHERE invoice_id = $invoice_id ORDER BY payment_date DESC");
while($row = mysqli_fetch_array($sql)){
$payment_id = $row['payment_id'];
$payment_method = $row['payment_method'];
$payment_reference = $row['payment_reference'];
$payment_amount = $row['payment_amount'];
$payment_date = $row['payment_date'];
?>
<tr>
<td><?php echo $payment_date; ?></td>
<td><?php echo $payment_method; ?></td>
<td><?php echo $payment_reference; ?></td>
<td class="text-right text-monospace">$<?php echo number_format($payment_amount,2); ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php include("pagination.php"); ?>
</div>
</div>
</div>
//
// //Rebuild URL
//
//$url_query_strings_sb = http_build_query(array_merge($_GET,array('sb' => $sb, 'o' => $o)));
//
////Paging
//if(isset($_GET['p'])){
// $p = intval($_GET['p']);
// $record_from = (($p)-1)*$_SESSION['records_per_page'];
// $record_to = $_SESSION['records_per_page'];
//}else{
// $record_from = 0;
// $record_to = $_SESSION['records_per_page'];
// $p = 1;
//}
//
//if(isset($_GET['q'])){
// $q = mysqli_real_escape_string($mysqli,$_GET['q']);
//}else{
// $q = "";
//}
//
//if(!empty($_GET['sb'])){
// $sb = mysqli_real_escape_string($mysqli,$_GET['sb']);
//}else{
// $sb = "invoice_date";
//}
//
//if(isset($_GET['o'])){
// if($_GET['o'] == 'ASC'){
// $o = "ASC";
// $disp = "DESC";
// }else{
// $o = "DESC";
// $disp = "ASC";
// }
//}else{
// $o = "DESC";
// $disp = "ASC";
//}
//
//
//$sql = mysqli_query($mysqli,"SELECT SQL_CALC_FOUND_ROWS * FROM invoices
// WHERE client_id = $client_id
// AND (invoice_number LIKE '%$q%')
// ORDER BY $sb $o LIMIT $record_from, $record_to");
//
//$num_rows = mysqli_fetch_row(mysqli_query($mysqli,"SELECT FOUND_ROWS()"));
//$total_found_rows = $num_rows[0];
//$total_pages = ceil($total_found_rows / 10);
//
//?>
<!---->
<!--<div class="card">-->
<!-- <div class="card-header bg-dark text-white">-->
<!-- <h6 class="float-left mt-1"><i class="fa fa-credit-card"></i> Payments</h6>-->
<!-- </div>-->
<!-- <div class="card-body">-->
<!-- <form autocomplete="off">-->
<!-- <input type="hidden" name="client_id" value="--><?php //echo $client_id; ?><!--">-->
<!-- <input type="hidden" name="tab" value="--><?php //echo $_GET['tab']; ?><!--">-->
<!-- <div class="input-group">-->
<!-- <input type="search" class="form-control " name="q" value="--><?php //if(isset($q)){echo stripslashes($q);} ?><!--" placeholder="Search --><?php //echo ucwords($_GET['tab']); ?><!--">-->
<!-- <div class="input-group-append">-->
<!-- <button class="btn btn-secondary"><i class="fa fa-search"></i></button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </form>-->
<!-- <hr>-->
<!-- <div class="table-responsive">-->
<!-- <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-secondary" href="?--><?php //echo $url_query_strings_sb; ?><!--&sb=invoice_date&o=--><?php //echo $disp; ?><!--">Date</a></th>-->
<!-- <th><a class="text-secondary" href="?--><?php //echo $url_query_strings_sb; ?><!--&sb=invoice_due&o=--><?php //echo $disp; ?><!--">Due</a></th>-->
<!-- <th><a class="text-secondary" href="?--><?php //echo $url_query_strings_sb; ?><!--&sb=invoice_number&o=--><?php //echo $disp; ?><!--">Invoice</a></th>-->
<!-- <th class="text-right"><a class="text-secondary" href="?--><?php //echo $url_query_strings_sb; ?><!--&sb=invoice_amount&o=--><?php //echo $disp; ?><!--">Invoice Amount</a></th>-->
<!-- </tr>-->
<!-- </thead>-->
<!-- <tbody>-->
<!-- --><?php
//
// while($row = mysqli_fetch_array($sql)){
// $invoice_id = $row['invoice_id'];
// $invoice_number = $row['invoice_number'];
// $invoice_status = $row['invoice_status'];
// $invoice_amount = $row['invoice_amount'];
// $invoice_date = $row['invoice_date'];
// $invoice_due = $row['invoice_due'];
//
// ?>
<!-- <tr>-->
<!-- <td><a href="invoice.php?invoice_id=--><?php //echo $invoice_id; ?><!--">--><?php //echo $invoice_date; ?><!--</a></td>-->
<!-- <td>--><?php //echo $invoice_due; ?><!--</td>-->
<!-- <td><a href="invoice.php?invoice_id=--><?php //echo $invoice_id; ?><!--">--><?php //echo $invoice_number; ?><!--</a></td>-->
<!-- <td class="text-right text-monospace">$--><?php //echo number_format($invoice_amount,2); ?><!--</td>-->
<!-- </tr>-->
<!---->
<!-- <tr> -->
<!-- <th>Date Recieved</th>-->
<!-- <th>Payment Method</th>-->
<!-- <th>Payment Reference</th>-->
<!-- <th>Payment Amount</a></th>-->
<!-- </tr>-->
<!---->
<!---->
<!-- --><?php
//
// $sql = mysqli_query($mysqli,"SELECT * FROM payments WHERE invoice_id = $invoice_id ORDER BY payment_date DESC");
//
// while($row = mysqli_fetch_array($sql)){
// $payment_id = $row['payment_id'];
// $payment_method = $row['payment_method'];
// $payment_reference = $row['payment_reference'];
// $payment_amount = $row['payment_amount'];
// $payment_date = $row['payment_date'];
//
// ?>
<!---->
<!-- <tr>-->
<!-- <td>--><?php //echo $payment_date; ?><!--</td>-->
<!-- <td>--><?php //echo $payment_method; ?><!--</td>-->
<!-- <td>--><?php //echo $payment_reference; ?><!--</td>-->
<!-- <td class="text-right text-monospace">$--><?php //echo number_format($payment_amount,2); ?><!--</td>-->
<!-- </tr>-->
<!---->
<!-- --><?php
//
// }
//
// ?>
<!---->
<!-- </tbody>-->
<!-- </table>-->
<!---->
<!-- --><?php //include("pagination.php"); ?>
<!-- -->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->