mirror of https://github.com/itflow-org/itflow
Merge branch 'master' of github.com:johnnyq/itflow
This commit is contained in:
commit
4074b62d59
13
README.md
13
README.md
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
1
db.sql
|
|
@ -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,
|
||||
|
|
|
|||
6
post.php
6
post.php
|
|
@ -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'");
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>-->
|
||||
Loading…
Reference in New Issue