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

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

View File

@@ -39,9 +39,16 @@
[![ITFlow][product-screenshot]]() [![ITFlow][product-screenshot]]()
<b>ITFlow is a free & open-source solution for IT service management, documentation, and accounting & invoicing.</b> <b>ITFlow is a free & open-source solution for IT service management, documentation, and accounting.</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. ### 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 ### 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. * 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_description = $row['service_description'];
$service_category = $row['service_category']; $service_category = $row['service_category'];
$service_importance = $row['service_importance']; $service_importance = $row['service_importance'];
$service_backup = $row['service_backup'];
$service_notes = $row['service_notes']; $service_notes = $row['service_notes'];
$service_updated_at = $row['service_updated_at']; $service_updated_at = $row['service_updated_at'];
$service_review_due = $row['service_review_due']; $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_description` varchar(200) CHARACTER SET latin1 NOT NULL,
`service_category` varchar(20) CHARACTER SET latin1 NOT NULL, `service_category` varchar(20) CHARACTER SET latin1 NOT NULL,
`service_importance` varchar(10) 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_notes` text CHARACTER SET latin1 NOT NULL,
`service_created_at` datetime NOT NULL, `service_created_at` datetime NOT NULL,
`service_updated_at` datetime DEFAULT 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_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_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_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']))); $service_notes = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['note'])));
// Create Service // 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 // 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_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_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_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']))); $service_notes = trim(strip_tags(mysqli_real_escape_string($mysqli,$_POST['note'])));
// Update main service details // 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 // Unlink existing relations/assets
mysqli_query($mysqli, "DELETE FROM service_contacts WHERE service_id = '$service_id'"); mysqli_query($mysqli, "DELETE FROM service_contacts WHERE service_id = '$service_id'");

View File

@@ -78,6 +78,16 @@
</div> </div>
</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? --> <!-- TODO: We need a way of adding multiple (optional) URLs? Ideas? -->
<!-- <div class="form-group"> <!-- <div class="form-group">
<label>URL</label> <label>URL</label>

View File

@@ -79,6 +79,16 @@
</div> </div>
</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? --> <!-- TODO: We need a way of adding multiple (optional) URLs? Ideas? -->
<!-- <div class="form-group"> <!-- <div class="form-group">
<label>URL</label> <label>URL</label>

View File

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

View File

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