Renamed Recurring to recurring_invoices updated a large portion of code, and updated many other fields to reflect recurring_invoice and not just recurring

This commit is contained in:
johnnyq 2025-03-11 22:08:37 -04:00
parent a0598997d7
commit 619b93a545
16 changed files with 335 additions and 287 deletions

View File

@ -77,7 +77,7 @@ require_once "includes/inc_all_admin.php";
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span> <span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span>
</div> </div>
<input type="text" class="form-control" name="config_recurring_prefix" placeholder="Recurring Prefix" value="<?php echo nullable_htmlentities($config_recurring_prefix); ?>" required> <input type="text" class="form-control" name="config_recurring_invoice_prefix" placeholder="Recurring Invoice Prefix" value="<?php echo nullable_htmlentities($config_recurring_invoice_prefix); ?>" required>
</div> </div>
</div> </div>
@ -87,7 +87,7 @@ require_once "includes/inc_all_admin.php";
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span> <span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span>
</div> </div>
<input type="number" min="0" class="form-control" name="config_recurring_next_number" placeholder="Next Recurring Number" value="<?php echo intval($config_recurring_next_number); ?>" required> <input type="number" min="0" class="form-control" name="config_recurring_invoice_next_number" placeholder="Next Recurring Invoice Number" value="<?php echo intval($config_recurring_invoice_next_number); ?>" required>
</div> </div>
</div> </div>

View File

@ -2,33 +2,33 @@
require_once '../includes/ajax_header.php'; require_once '../includes/ajax_header.php';
$recurring_id = intval($_GET['id']); $recurring_invoice_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM recurring WHERE recurring_id = $recurring_id LIMIT 1"); $sql = mysqli_query($mysqli, "SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id LIMIT 1");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_prefix = nullable_htmlentities($row['recurring_prefix']); $recurring_invoice_prefix = nullable_htmlentities($row['recurring_invoice_prefix']);
$recurring_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$recurring_scope = nullable_htmlentities($row['recurring_scope']); $recurring_invoice_scope = nullable_htmlentities($row['recurring_invoice_scope']);
$recurring_frequency = nullable_htmlentities($row['recurring_frequency']); $recurring_invoice_frequency = nullable_htmlentities($row['recurring_invoice_frequency']);
$recurring_status = nullable_htmlentities($row['recurring_status']); $recurring_invoice_status = nullable_htmlentities($row['recurring_invoice_status']);
$recurring_created_at = date('Y-m-d', strtotime($row['recurring_created_at'])); $recurring_invoice_created_at = date('Y-m-d', strtotime($row['recurring_invoice_created_at']));
$recurring_next_date = nullable_htmlentities($row['recurring_next_date']); $recurring_invoice_next_date = nullable_htmlentities($row['recurring_invoice_next_date']);
$recurring_discount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']);
$category_id = intval($row['recurring_category_id']); $category_id = intval($row['recurring_invoice_category_id']);
// Generate the HTML form content using output buffering. // Generate the HTML form content using output buffering.
ob_start(); ob_start();
?> ?>
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title"><i class="fas fa-fw fa-redo-alt mr-2"></i>Editing Recur Invoice: <strong><?php echo "$recurring_prefix$recurring_number"; ?></strong></h5> <h5 class="modal-title"><i class="fas fa-fw fa-redo-alt mr-2"></i>Editing Recur Invoice: <strong><?php echo "$recurring_invoice_prefix$recurring_invoice_number"; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal"> <button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span> <span>&times;</span>
</button> </button>
</div> </div>
<form action="post.php" method="post" autocomplete="off"> <form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="recurring_id" value="<?php echo $recurring_id; ?>"> <input type="hidden" name="recurring_invoice_id" value="<?php echo $recurring_invoice_id; ?>">
<div class="modal-body bg-white"> <div class="modal-body bg-white">
@ -38,7 +38,7 @@ ob_start();
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-comment"></i></span> <span class="input-group-text"><i class="fa fa-fw fa-comment"></i></span>
</div> </div>
<input type="text" class="form-control" name="scope" placeholder="Quick description" maxlength="255" value="<?php echo $recurring_scope; ?>"> <input type="text" class="form-control" name="scope" placeholder="Quick description" maxlength="255" value="<?php echo $recurring_invoice_scope; ?>">
</div> </div>
</div> </div>
@ -50,8 +50,8 @@ ob_start();
</div> </div>
<select class="form-control select2" name="frequency" required> <select class="form-control select2" name="frequency" required>
<option value="">- Frequency -</option> <option value="">- Frequency -</option>
<option <?php if ($recurring_frequency == 'month') { echo "selected"; } ?> value="month">Monthly</option> <option <?php if ($recurring_invoice_frequency == 'month') { echo "selected"; } ?> value="month">Monthly</option>
<option <?php if ($recurring_frequency == 'year') { echo "selected"; } ?> value="year">Yearly</option> <option <?php if ($recurring_invoice_frequency == 'year') { echo "selected"; } ?> value="year">Yearly</option>
</select> </select>
</div> </div>
</div> </div>
@ -62,7 +62,7 @@ ob_start();
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span> <span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div> </div>
<input type="date" class="form-control" name="next_date" max="2999-12-31" value="<?php echo $recurring_next_date; ?>" required> <input type="date" class="form-control" name="next_date" max="2999-12-31" value="<?php echo $recurring_invoice_next_date; ?>" required>
</div> </div>
</div> </div>
@ -76,7 +76,7 @@ ob_start();
<option value="">- Category -</option> <option value="">- Category -</option>
<?php <?php
$sql_income_category = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Income' AND (category_archived_at > '$recurring_created_at' OR category_archived_at IS NULL) ORDER BY category_name ASC"); $sql_income_category = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Income' AND (category_archived_at > '$recurring_invoice_created_at' OR category_archived_at IS NULL) ORDER BY category_name ASC");
while ($row = mysqli_fetch_array($sql_income_category)) { while ($row = mysqli_fetch_array($sql_income_category)) {
$category_id_select = intval($row['category_id']); $category_id_select = intval($row['category_id']);
$category_name_select = nullable_htmlentities($row['category_name']); $category_name_select = nullable_htmlentities($row['category_name']);
@ -104,7 +104,7 @@ ob_start();
<div class='input-group-prepend'> <div class='input-group-prepend'>
<span class='input-group-text'><i class='fa fa-fw fa-dollar-sign'></i></span> <span class='input-group-text'><i class='fa fa-fw fa-dollar-sign'></i></span>
</div> </div>
<input type='text' class='form-control' inputmode="numeric" pattern="-?[0-9]*\.?[0-9]{0,2}" name='recurring_discount' placeholder='0.00' value="<?php echo number_format($recurring_discount, 2, '.', ''); ?>"> <input type='text' class='form-control' inputmode="numeric" pattern="-?[0-9]*\.?[0-9]{0,2}" name='recurring_invoice_discount' placeholder='0.00' value="<?php echo number_format($recurring_invoice_discount, 2, '.', ''); ?>">
</div> </div>
</div> </div>
@ -115,10 +115,10 @@ ob_start();
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span> <span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div> </div>
<select class="form-control select2" name="status" required> <select class="form-control select2" name="status" required>
<option <?php if ($recurring_status == 1) { <option <?php if ($recurring_invoice_status == 1) {
echo "selected"; echo "selected";
} ?> value="1">Active</option> } ?> value="1">Active</option>
<option <?php if ($recurring_status == 0) { <option <?php if ($recurring_invoice_status == 0) {
echo "selected"; echo "selected";
} ?> value="0">InActive</option> } ?> value="0">InActive</option>
</select> </select>
@ -127,7 +127,7 @@ ob_start();
</div> </div>
<div class="modal-footer bg-white"> <div class="modal-footer bg-white">
<button type="submit" name="edit_recurring" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button> <button type="submit" name="edit_recurring_invoice" 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> <button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div> </div>
</form> </form>

View File

@ -362,13 +362,13 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
} }
//Get Monthly Recurring Total //Get Monthly Recurring Total
$sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND recurring_client_id = $client_id"); $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND recurring_invoice_client_id = $client_id");
$row = mysqli_fetch_array($sql_recurring_monthly_total); $row = mysqli_fetch_array($sql_recurring_monthly_total);
$recurring_monthly_total = floatval($row['recurring_monthly_total']); $recurring_monthly_total = floatval($row['recurring_monthly_total']);
//Get Yearly Recurring Total //Get Yearly Recurring Total
$sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND recurring_client_id = $client_id"); $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND recurring_invoice_client_id = $client_id");
$row = mysqli_fetch_array($sql_recurring_yearly_total); $row = mysqli_fetch_array($sql_recurring_yearly_total);
$recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12; $recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12;

View File

@ -124,11 +124,11 @@ if ($user_config_dashboard_financial_enable == 1) {
"); ");
// Get recurring invoice totals // Get recurring invoice totals
$sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND YEAR(recurring_created_at) <= $year"); $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND YEAR(recurring_invoice_created_at) <= $year");
$row = mysqli_fetch_array($sql_recurring_yearly_total); $row = mysqli_fetch_array($sql_recurring_yearly_total);
$recurring_yearly_total = floatval($row['recurring_yearly_total']); $recurring_yearly_total = floatval($row['recurring_yearly_total']);
$sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND YEAR(recurring_created_at) <= $year"); $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND YEAR(recurring_invoice_created_at) <= $year");
$row = mysqli_fetch_array($sql_recurring_monthly_total); $row = mysqli_fetch_array($sql_recurring_monthly_total);
$recurring_monthly_total = floatval($row['recurring_monthly_total']) + ($recurring_yearly_total / 12); $recurring_monthly_total = floatval($row['recurring_monthly_total']) + ($recurring_yearly_total / 12);

View File

@ -2529,10 +2529,58 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.6'"); mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.6'");
} }
// if (CURRENT_DATABASE_VERSION == '1.9.6') { if (CURRENT_DATABASE_VERSION == '1.9.6') {
// // Insert queries here required to update to DB version 1.9.7 mysqli_query($mysqli, "RENAME TABLE `recurring` TO `recurring_invoices`");
mysqli_query($mysqli, "
ALTER TABLE `recurring_invoices`
CHANGE COLUMN `recurring_id` `recurring_invoice_id` INT(11) NOT NULL AUTO_INCREMENT,
CHANGE COLUMN `recurring_prefix` `recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
CHANGE COLUMN `recurring_number` `recurring_invoice_number` INT(11) NOT NULL,
CHANGE COLUMN `recurring_scope` `recurring_invoice_scope` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
CHANGE COLUMN `recurring_frequency` `recurring_invoice_frequency` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
CHANGE COLUMN `recurring_last_sent` `recurring_invoice_last_sent` DATE NULL DEFAULT NULL,
CHANGE COLUMN `recurring_next_date` `recurring_invoice_next_date` DATE NOT NULL,
CHANGE COLUMN `recurring_status` `recurring_invoice_status` INT(1) NOT NULL,
CHANGE COLUMN `recurring_discount_amount` `recurring_invoice_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00,
CHANGE COLUMN `recurring_amount` `recurring_invoice_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00,
CHANGE COLUMN `recurring_currency_code` `recurring_invoice_currency_code` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
CHANGE COLUMN `recurring_note` `recurring_invoice_note` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
CHANGE COLUMN `recurring_invoice_email_notify` `recurring_invoice_invoice_email_notify` TINYINT(1) NOT NULL DEFAULT 1,
CHANGE COLUMN `recurring_created_at` `recurring_invoice_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(),
CHANGE COLUMN `recurring_updated_at` `recurring_invoice_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(),
CHANGE COLUMN `recurring_archived_at` `recurring_invoice_archived_at` DATETIME NULL DEFAULT NULL,
CHANGE COLUMN `recurring_category_id` `recurring_invoice_category_id` INT(11) NOT NULL,
CHANGE COLUMN `recurring_client_id` `recurring_invoice_client_id` INT(11) NOT NULL
");
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.7'");
}
if (CURRENT_DATABASE_VERSION == '1.9.7') {
mysqli_query($mysqli, "
ALTER TABLE `settings`
CHANGE COLUMN `config_recurring_prefix` `config_recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
CHANGE COLUMN `config_recurring_next_number` `config_recurring_invoice_next_number` INT(11) NOT NULL DEFAULT 1
");
mysqli_query($mysqli, "
ALTER TABLE `history`
CHANGE COLUMN `history_recurring_id` `history_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0
");
mysqli_query($mysqli, "
ALTER TABLE `invoice_items`
CHANGE COLUMN `item_recurring_id` `item_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0
");
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.8'");
}
// if (CURRENT_DATABASE_VERSION == '1.9.8') {
// // Insert queries here required to update to DB version 1.9.9
// // Then, update the database to the next sequential version // // Then, update the database to the next sequential version
// mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.7'"); // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.9'");
// } // }
} else { } else {

70
db.sql
View File

@ -902,7 +902,7 @@ CREATE TABLE `history` (
`history_description` varchar(200) NOT NULL, `history_description` varchar(200) NOT NULL,
`history_created_at` datetime NOT NULL DEFAULT current_timestamp(), `history_created_at` datetime NOT NULL DEFAULT current_timestamp(),
`history_invoice_id` int(11) NOT NULL DEFAULT 0, `history_invoice_id` int(11) NOT NULL DEFAULT 0,
`history_recurring_id` int(11) NOT NULL DEFAULT 0, `history_recurring_invoice_id` int(11) NOT NULL DEFAULT 0,
`history_quote_id` int(11) NOT NULL DEFAULT 0, `history_quote_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`history_id`) PRIMARY KEY (`history_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
@ -931,7 +931,7 @@ CREATE TABLE `invoice_items` (
`item_tax_id` int(11) NOT NULL DEFAULT 0, `item_tax_id` int(11) NOT NULL DEFAULT 0,
`item_product_id` int(11) NOT NULL DEFAULT 0, `item_product_id` int(11) NOT NULL DEFAULT 0,
`item_quote_id` int(11) NOT NULL DEFAULT 0, `item_quote_id` int(11) NOT NULL DEFAULT 0,
`item_recurring_id` int(11) NOT NULL DEFAULT 0, `item_recurring_invoice_id` int(11) NOT NULL DEFAULT 0,
`item_invoice_id` int(11) NOT NULL DEFAULT 0, `item_invoice_id` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`item_id`) PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
@ -1412,36 +1412,6 @@ CREATE TABLE `records` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `recurring`
--
DROP TABLE IF EXISTS `recurring`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `recurring` (
`recurring_id` int(11) NOT NULL AUTO_INCREMENT,
`recurring_prefix` varchar(200) DEFAULT NULL,
`recurring_number` int(11) NOT NULL,
`recurring_scope` varchar(255) DEFAULT NULL,
`recurring_frequency` varchar(200) NOT NULL,
`recurring_last_sent` date DEFAULT NULL,
`recurring_next_date` date NOT NULL,
`recurring_status` int(1) NOT NULL,
`recurring_discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
`recurring_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
`recurring_currency_code` varchar(200) NOT NULL,
`recurring_note` text DEFAULT NULL,
`recurring_invoice_email_notify` tinyint(1) NOT NULL DEFAULT 1,
`recurring_created_at` datetime NOT NULL DEFAULT current_timestamp(),
`recurring_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),
`recurring_archived_at` datetime DEFAULT NULL,
`recurring_category_id` int(11) NOT NULL,
`recurring_client_id` int(11) NOT NULL,
PRIMARY KEY (`recurring_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-- --
-- Table structure for table `recurring_expenses` -- Table structure for table `recurring_expenses`
-- --
@ -1473,6 +1443,36 @@ CREATE TABLE `recurring_expenses` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `recurring_invoices`
--
DROP TABLE IF EXISTS `recurring_invoices`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `recurring_invoices` (
`recurring_invoice_id` int(11) NOT NULL AUTO_INCREMENT,
`recurring_invoice_prefix` varchar(200) DEFAULT NULL,
`recurring_invoice_number` int(11) NOT NULL,
`recurring_invoice_scope` varchar(255) DEFAULT NULL,
`recurring_invoice_frequency` varchar(200) NOT NULL,
`recurring_invoice_last_sent` date DEFAULT NULL,
`recurring_invoice_next_date` date NOT NULL,
`recurring_invoice_status` int(1) NOT NULL,
`recurring_invoice_discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
`recurring_invoice_amount` decimal(15,2) NOT NULL DEFAULT 0.00,
`recurring_invoice_currency_code` varchar(200) NOT NULL,
`recurring_invoice_note` text DEFAULT NULL,
`recurring_invoice_invoice_email_notify` tinyint(1) NOT NULL DEFAULT 1,
`recurring_invoice_created_at` datetime NOT NULL DEFAULT current_timestamp(),
`recurring_invoice_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),
`recurring_invoice_archived_at` datetime DEFAULT NULL,
`recurring_invoice_category_id` int(11) NOT NULL,
`recurring_invoice_client_id` int(11) NOT NULL,
PRIMARY KEY (`recurring_invoice_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-- --
-- Table structure for table `recurring_payments` -- Table structure for table `recurring_payments`
-- --
@ -1737,8 +1737,8 @@ CREATE TABLE `settings` (
`config_invoice_late_fee_enable` tinyint(1) NOT NULL DEFAULT 0, `config_invoice_late_fee_enable` tinyint(1) NOT NULL DEFAULT 0,
`config_invoice_late_fee_percent` decimal(5,2) NOT NULL DEFAULT 0.00, `config_invoice_late_fee_percent` decimal(5,2) NOT NULL DEFAULT 0.00,
`config_invoice_paid_notification_email` varchar(200) DEFAULT NULL, `config_invoice_paid_notification_email` varchar(200) DEFAULT NULL,
`config_recurring_prefix` varchar(200) DEFAULT NULL, `config_recurring_invoice_prefix` varchar(200) DEFAULT NULL,
`config_recurring_next_number` int(11) NOT NULL, `config_recurring_invoice_next_number` int(11) NOT NULL DEFAULT 1,
`config_quote_prefix` varchar(200) DEFAULT NULL, `config_quote_prefix` varchar(200) DEFAULT NULL,
`config_quote_next_number` int(11) DEFAULT NULL, `config_quote_next_number` int(11) DEFAULT NULL,
`config_quote_footer` text DEFAULT NULL, `config_quote_footer` text DEFAULT NULL,
@ -2417,4 +2417,4 @@ CREATE TABLE `vendors` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-11 19:35:52 -- Dump completed on 2025-03-11 22:07:39

View File

@ -49,8 +49,8 @@ $config_invoice_late_fee_percent = floatval($row['config_invoice_late_fee_percen
$config_invoice_paid_notification_email = $row['config_invoice_paid_notification_email']; $config_invoice_paid_notification_email = $row['config_invoice_paid_notification_email'];
// Recurring Invoices // Recurring Invoices
$config_recurring_prefix = $row['config_recurring_prefix']; $config_recurring_invoice_prefix = $row['config_recurring_invoice_prefix'];
$config_recurring_next_number = intval($row['config_recurring_next_number']); $config_recurring_invoice_next_number = intval($row['config_recurring_invoice_next_number']);
// Quotes // Quotes
$config_quote_prefix = $row['config_quote_prefix']; $config_quote_prefix = $row['config_quote_prefix'];

View File

@ -277,8 +277,8 @@
<p> <p>
Recurring Invoices Recurring Invoices
<?php <?php
if ($num_recurring > 0) { ?> if ($num_recurring_invoices) { ?>
<span class="right badge"><?php echo $num_recurring; ?></span> <span class="right badge"><?php echo $num_recurring_invoices; ?></span>
<?php } ?> <?php } ?>
</p> </p>
</a> </a>

View File

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

View File

@ -22,7 +22,7 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS n
$num_open_invoices = $row['num']; $num_open_invoices = $row['num'];
// Recurring Invoice Count // Recurring Invoice Count
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM recurring WHERE recurring_archived_at IS NULL")); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices WHERE recurring_invoice_archived_at IS NULL"));
$num_recurring_invoices = $row['num']; $num_recurring_invoices = $row['num'];
// Open Quotes Count // Open Quotes Count

View File

@ -115,13 +115,13 @@ if (isset($_GET['client_id'])) {
$balance = $invoice_amounts - $amount_paid; $balance = $invoice_amounts - $amount_paid;
//Get Monthly Recurring Total //Get Monthly Recurring Total
$sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND recurring_client_id = $client_id"); $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND recurring_invoice_client_id = $client_id");
$row = mysqli_fetch_array($sql_recurring_monthly_total); $row = mysqli_fetch_array($sql_recurring_monthly_total);
$recurring_monthly_total = floatval($row['recurring_monthly_total']); $recurring_monthly_total = floatval($row['recurring_monthly_total']);
//Get Yearly Recurring Total //Get Yearly Recurring Total
$sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND recurring_client_id = $client_id"); $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND recurring_invoice_client_id = $client_id");
$row = mysqli_fetch_array($sql_recurring_yearly_total); $row = mysqli_fetch_array($sql_recurring_yearly_total);
$recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12; $recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12;
@ -196,8 +196,8 @@ if (isset($_GET['client_id'])) {
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('quote_id') AS num FROM quotes WHERE quote_archived_at IS NULL AND quote_client_id = $client_id")); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('quote_id') AS num FROM quotes WHERE quote_archived_at IS NULL AND quote_client_id = $client_id"));
$num_quotes = $row['num']; $num_quotes = $row['num'];
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM recurring WHERE recurring_archived_at IS NULL AND recurring_client_id = $client_id")); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices WHERE recurring_invoice_archived_at IS NULL AND recurring_invoice_client_id = $client_id"));
$num_recurring = $row['num']; $num_recurring_invoices = $row['num'];
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('payment_id') AS num FROM payments, invoices WHERE payment_invoice_id = invoice_id AND invoice_client_id = $client_id")); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('payment_id') AS num FROM payments, invoices WHERE payment_invoice_id = invoice_id AND invoice_client_id = $client_id"));
$num_payments = $row['num']; $num_payments = $row['num'];

View File

@ -1,4 +1,4 @@
<div class="modal" id="addRecurringModal" tabindex="-1"> <div class="modal" id="addRecurringInvoiceModal" tabindex="-1">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content bg-dark"> <div class="modal-content bg-dark">
<div class="modal-header"> <div class="modal-header">
@ -109,7 +109,7 @@
</div> </div>
<div class="modal-footer bg-white"> <div class="modal-footer bg-white">
<button type="submit" name="add_recurring" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button> <button type="submit" name="add_recurring_invoice" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button> <button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div> </div>
</form> </form>

View File

@ -11,14 +11,14 @@ if (isset($_POST['edit_invoice_settings'])) {
$config_invoice_footer = sanitizeInput($_POST['config_invoice_footer']); $config_invoice_footer = sanitizeInput($_POST['config_invoice_footer']);
$config_invoice_late_fee_enable = intval($_POST['config_invoice_late_fee_enable'] ?? 0); $config_invoice_late_fee_enable = intval($_POST['config_invoice_late_fee_enable'] ?? 0);
$config_invoice_late_fee_percent = floatval($_POST['config_invoice_late_fee_percent']); $config_invoice_late_fee_percent = floatval($_POST['config_invoice_late_fee_percent']);
$config_recurring_prefix = sanitizeInput($_POST['config_recurring_prefix']); $config_recurring_invoice_prefix = sanitizeInput($_POST['config_recurring_invoice_prefix']);
$config_recurring_next_number = intval($_POST['config_recurring_next_number']); $config_recurring_invoice_next_number = intval($_POST['config_recurring_invoice_next_number']);
$config_invoice_paid_notification_email = ''; $config_invoice_paid_notification_email = '';
if (filter_var($_POST['config_invoice_paid_notification_email'], FILTER_VALIDATE_EMAIL)) { if (filter_var($_POST['config_invoice_paid_notification_email'], FILTER_VALIDATE_EMAIL)) {
$config_invoice_paid_notification_email = sanitizeInput($_POST['config_invoice_paid_notification_email']); $config_invoice_paid_notification_email = sanitizeInput($_POST['config_invoice_paid_notification_email']);
} }
mysqli_query($mysqli,"UPDATE settings SET config_invoice_prefix = '$config_invoice_prefix', config_invoice_next_number = $config_invoice_next_number, config_invoice_footer = '$config_invoice_footer', config_invoice_late_fee_enable = $config_invoice_late_fee_enable, config_invoice_late_fee_percent = $config_invoice_late_fee_percent, config_invoice_paid_notification_email = '$config_invoice_paid_notification_email', config_recurring_prefix = '$config_recurring_prefix', config_recurring_next_number = $config_recurring_next_number WHERE company_id = 1"); mysqli_query($mysqli,"UPDATE settings SET config_invoice_prefix = '$config_invoice_prefix', config_invoice_next_number = $config_invoice_next_number, config_invoice_footer = '$config_invoice_footer', config_invoice_late_fee_enable = $config_invoice_late_fee_enable, config_invoice_late_fee_percent = $config_invoice_late_fee_percent, config_invoice_paid_notification_email = '$config_invoice_paid_notification_email', config_recurring_invoice_prefix = '$config_recurring_invoice_prefix', config_recurring_invoice_next_number = $config_recurring_invoice_next_number WHERE company_id = 1");
// Logging // Logging
logAction("Settings", "Edit", "$session_name edited invoice settings"); logAction("Settings", "Edit", "$session_name edited invoice settings");

View File

@ -141,7 +141,7 @@ if (isset($_POST['add_invoice_copy'])) {
if (isset($_POST['add_invoice_recurring'])) { if (isset($_POST['add_invoice_recurring'])) {
$invoice_id = intval($_POST['invoice_id']); $invoice_id = intval($_POST['invoice_id']);
$recurring_frequency = sanitizeInput($_POST['frequency']); $recurring_invoice_frequency = sanitizeInput($_POST['frequency']);
$sql = mysqli_query($mysqli,"SELECT * FROM invoices WHERE invoice_id = $invoice_id"); $sql = mysqli_query($mysqli,"SELECT * FROM invoices WHERE invoice_id = $invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
@ -155,16 +155,16 @@ if (isset($_POST['add_invoice_recurring'])) {
$client_id = intval($row['invoice_client_id']); $client_id = intval($row['invoice_client_id']);
$category_id = intval($row['invoice_category_id']); $category_id = intval($row['invoice_category_id']);
//Get the last Recurring Number and add 1 for the new Recurring number //Get the last Recurring Invoice Number and add 1 for the new Recurring Invoice number
$recurring_number = $config_recurring_next_number; $recurring_invoice_number = $config_recurring_invoice_next_number;
$new_config_recurring_next_number = $config_recurring_next_number + 1; $new_config_recurring_invoice_next_number = $config_recurring_invoice_next_number + 1;
mysqli_query($mysqli,"UPDATE settings SET config_recurring_next_number = $new_config_recurring_next_number WHERE company_id = 1"); mysqli_query($mysqli,"UPDATE settings SET config_recurring_invoice_next_number = $new_config_recurring_invoice_next_number WHERE company_id = 1");
mysqli_query($mysqli,"INSERT INTO recurring SET recurring_prefix = '$config_recurring_prefix', recurring_number = $recurring_number, recurring_scope = '$invoice_scope', recurring_frequency = '$recurring_frequency', recurring_next_date = DATE_ADD('$invoice_date', INTERVAL 1 $recurring_frequency), recurring_status = 1, recurring_amount = $invoice_amount, recurring_currency_code = '$invoice_currency_code', recurring_note = '$invoice_note', recurring_category_id = $category_id, recurring_client_id = $client_id"); mysqli_query($mysqli,"INSERT INTO recurring_invoice_invoices SET recurring_invoice_prefix = '$config_recurring_invoice_prefix', recurring_invoice_number = $recurring_invoice_number, recurring_invoice_scope = '$invoice_scope', recurring_invoice_frequency = '$recurring_invoice_frequency', recurring_invoice_next_date = DATE_ADD('$invoice_date', INTERVAL 1 $recurring_invoice_frequency), recurring_invoice_status = 1, recurring_invoice_amount = $invoice_amount, recurring_invoice_currency_code = '$invoice_currency_code', recurring_invoice_note = '$invoice_note', recurring_invoice_category_id = $category_id, recurring_invoice_client_id = $client_id");
$recurring_id = mysqli_insert_id($mysqli); $recurring_invoice_id = mysqli_insert_id($mysqli);
mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Draft', history_description = 'Recurring Created from INVOICE!', history_recurring_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Draft', history_description = 'Recurring Invoice Created from INVOICE!', history_recurring_invoice_id = $recurring_invoice_id");
$sql_items = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_invoice_id = $invoice_id"); $sql_items = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_invoice_id = $invoice_id");
while($row = mysqli_fetch_array($sql_items)) { while($row = mysqli_fetch_array($sql_items)) {
@ -179,19 +179,19 @@ if (isset($_POST['add_invoice_recurring'])) {
$item_order = intval($row['item_order']); $item_order = intval($row['item_order']);
$tax_id = intval($row['item_tax_id']); $tax_id = intval($row['item_tax_id']);
mysqli_query($mysqli,"INSERT INTO invoice_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $item_quantity, item_price = $item_price, item_subtotal = $item_subtotal, item_tax = $item_tax, item_total = $item_total, item_order = $item_order, item_tax_id = $tax_id, item_recurring_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO invoice_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $item_quantity, item_price = $item_price, item_subtotal = $item_subtotal, item_tax = $item_tax, item_total = $item_total, item_order = $item_order, item_tax_id = $tax_id, item_recurring_invoice_id = $recurring_invoice_id");
} }
// Logging // Logging
logAction("Recurring Invoice", "Create", "$session_name created recurring Invoice from Invoice $invoice_prefix$invoice_number", $client_id, $recurring_id); logAction("Recurring Invoice", "Create", "$session_name created recurring Invoice from Invoice $invoice_prefix$invoice_number", $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Created recurring Invoice from Invoice <strong>$invoice_prefix$invoice_number</strong>"; $_SESSION['alert_message'] = "Created recurring Invoice from Invoice <strong>$invoice_prefix$invoice_number</strong>";
header("Location: recurring_invoice.php?recurring_id=$recurring_id"); header("Location: recurring_invoice_invoice.php?recurring_invoice_id=$recurring_invoice_id");
} }
if (isset($_POST['add_recurring'])) { if (isset($_POST['add_recurring_invoice_invoice'])) {
$client_id = intval($_POST['client']); $client_id = intval($_POST['client']);
$frequency = sanitizeInput($_POST['frequency']); $frequency = sanitizeInput($_POST['frequency']);
@ -200,57 +200,57 @@ if (isset($_POST['add_recurring'])) {
$scope = sanitizeInput($_POST['scope']); $scope = sanitizeInput($_POST['scope']);
//Get the last Recurring Number and add 1 for the new Recurring number //Get the last Recurring Number and add 1 for the new Recurring number
$recurring_number = $config_recurring_next_number; $recurring_invoice_number = $config_recurring_invoice_next_number;
$new_config_recurring_next_number = $config_recurring_next_number + 1; $new_config_recurring_invoice_next_number = $config_recurring_invoice_next_number + 1;
mysqli_query($mysqli,"UPDATE settings SET config_recurring_next_number = $new_config_recurring_next_number WHERE company_id = 1"); mysqli_query($mysqli,"UPDATE settings SET config_recurring_invoice_next_number = $new_config_recurring_invoice_next_number WHERE company_id = 1");
mysqli_query($mysqli,"INSERT INTO recurring SET recurring_prefix = '$config_recurring_prefix', recurring_number = $recurring_number, recurring_scope = '$scope', recurring_frequency = '$frequency', recurring_next_date = '$start_date', recurring_category_id = $category, recurring_status = 1, recurring_currency_code = '$session_company_currency', recurring_client_id = $client_id"); mysqli_query($mysqli,"INSERT INTO recurring_invoice_invoices SET recurring_invoice_prefix = '$config_recurring_invoice_prefix', recurring_invoice_number = $recurring_invoice_number, recurring_invoice_scope = '$scope', recurring_invoice_frequency = '$frequency', recurring_invoice_next_date = '$start_date', recurring_invoice_category_id = $category, recurring_invoice_status = 1, recurring_invoice_currency_code = '$session_company_currency', recurring_invoice_client_id = $client_id");
$recurring_id = mysqli_insert_id($mysqli); $recurring_invoice_id = mysqli_insert_id($mysqli);
mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Active', history_description = 'Recurring Invoice created', history_recurring_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Active', history_description = 'Recurring Invoice created', history_recurring_invoice_id = $recurring_invoice_id");
//Logging //Logging
logAction("Recurring Invoice", "Create", "$session_name created recurring invoice $config_recurring_prefix$recurring_number - $scope", $client_id, $recurring_id); logAction("Recurring Invoice", "Create", "$session_name created recurring invoice $config_recurring_invoice_prefix$recurring_invoice_number - $scope", $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Recurring Invoice <strong>$config_recurring_prefix$recurring_number</strong> created"; $_SESSION['alert_message'] = "Recurring Invoice <strong>$config_recurring_invoice_prefix$recurring_invoice_number</strong> created";
header("Location: recurring_invoice.php?recurring_id=$recurring_id"); header("Location: recurring_invoice_invoice.php?recurring_invoice_id=$recurring_invoice_id");
} }
if (isset($_POST['edit_recurring'])) { if (isset($_POST['edit_recurring_invoice'])) {
$recurring_id = intval($_POST['recurring_id']); $recurring_invoice_id = intval($_POST['recurring_invoice_id']);
$frequency = sanitizeInput($_POST['frequency']); $frequency = sanitizeInput($_POST['frequency']);
$next_date = sanitizeInput($_POST['next_date']); $next_date = sanitizeInput($_POST['next_date']);
$category = intval($_POST['category']); $category = intval($_POST['category']);
$scope = sanitizeInput($_POST['scope']); $scope = sanitizeInput($_POST['scope']);
$status = intval($_POST['status']); $status = intval($_POST['status']);
$recurring_discount = floatval($_POST['recurring_discount']); $recurring_invoice_discount = floatval($_POST['recurring_invoice_discount']);
// Get Recurring Invoice Details and Client ID for Logging // Get Recurring Invoice Details and Client ID for Logging
$sql = mysqli_query($mysqli,"SELECT recurring_prefix, recurring_number, recurring_client_id FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT recurring_invoice_prefix, recurring_invoice_number, recurring_invoice_client_id FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
//Calculate new total //Calculate new total
$sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id");
$recurring_amount = 0; $recurring_invoice_amount = 0;
while($row = mysqli_fetch_array($sql)) { while($row = mysqli_fetch_array($sql)) {
$item_total = floatval($row['item_total']); $item_total = floatval($row['item_total']);
$recurring_amount = $recurring_amount + $item_total; $recurring_invoice_amount = $recurring_invoice_amount + $item_total;
} }
$recurring_amount = $recurring_amount - $recurring_discount; $recurring_invoice_amount = $recurring_invoice_amount - $recurring_invoice_discount;
mysqli_query($mysqli,"UPDATE recurring SET recurring_scope = '$scope', recurring_frequency = '$frequency', recurring_next_date = '$next_date', recurring_category_id = $category, recurring_discount_amount = $recurring_discount, recurring_amount = $recurring_amount, recurring_status = $status WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoice_invoices SET recurring_invoice_scope = '$scope', recurring_invoice_frequency = '$frequency', recurring_invoice_next_date = '$next_date', recurring_invoice_category_id = $category, recurring_invoice_discount_amount = $recurring_invoice_discount, recurring_invoice_amount = $recurring_invoice_amount, recurring_invoice_status = $status WHERE recurring_invoice_id = $recurring_invoice_id");
mysqli_query($mysqli,"INSERT INTO history SET history_status = '$status', history_description = 'Recurring Invoice edited', history_recurring_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO history SET history_status = '$status', history_description = 'Recurring Invoice edited', history_recurring_invoice_id = $recurring_invoice_id");
// Logging // Logging
logAction("Recurring Invoice", "Edit", "$session_name edited recurring invoice $recurring_invoice_prefix$recurring_invoice_number - $scope", $client_id, $recurring_id); logAction("Recurring Invoice", "Edit", "$session_name edited recurring invoice $recurring_invoice_prefix$recurring_invoice_number - $scope", $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Recurring Invoice <strong>$recurring_invoice_prefix$recurring_invoice_number</strong> edited"; $_SESSION['alert_message'] = "Recurring Invoice <strong>$recurring_invoice_prefix$recurring_invoice_number</strong> edited";
@ -258,28 +258,28 @@ if (isset($_POST['edit_recurring'])) {
} }
if (isset($_GET['delete_recurring'])) { if (isset($_GET['delete_recurring_invoice'])) {
$recurring_id = intval($_GET['delete_recurring']); $recurring_invoice_id = intval($_GET['delete_recurring_invoice']);
// Get Recurring Invoice Details and Client ID for Logging // Get Recurring Invoice Details and Client ID for Logging
$sql = mysqli_query($mysqli,"SELECT recurring_prefix, recurring_number, recurring_scope, recurring_client_id FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT recurring_invoice_prefix, recurring_invoice_number, recurring_invoice_scope, recurring_invoice_client_id FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$recurring_invoice_scope = sanitizeInput($row['recurring_scope']); $recurring_invoice_scope = sanitizeInput($row['recurring_invoice_scope']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
mysqli_query($mysqli,"DELETE FROM recurring WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"DELETE FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
//Delete Items Associated with the Recurring //Delete Items Associated with the Recurring
$sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id");
while($row = mysqli_fetch_array($sql)) { while($row = mysqli_fetch_array($sql)) {
$item_id = intval($row['item_id']); $item_id = intval($row['item_id']);
mysqli_query($mysqli,"DELETE FROM invoice_items WHERE item_id = $item_id"); mysqli_query($mysqli,"DELETE FROM invoice_items WHERE item_id = $item_id");
} }
//Delete History Associated with the Invoice //Delete History Associated with the Invoice
$sql = mysqli_query($mysqli,"SELECT * FROM history WHERE history_recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM history WHERE history_recurring_invoice_id = $recurring_invoice_id");
while($row = mysqli_fetch_array($sql)) { while($row = mysqli_fetch_array($sql)) {
$history_id = intval($row['history_id']); $history_id = intval($row['history_id']);
mysqli_query($mysqli,"DELETE FROM history WHERE history_id = $history_id"); mysqli_query($mysqli,"DELETE FROM history WHERE history_id = $history_id");
@ -295,9 +295,9 @@ if (isset($_GET['delete_recurring'])) {
} }
if (isset($_POST['add_recurring_item'])) { if (isset($_POST['add_recurring_invoice_item'])) {
$recurring_id = intval($_POST['recurring_id']); $recurring_invoice_id = intval($_POST['recurring_invoice_id']);
$name = sanitizeInput($_POST['name']); $name = sanitizeInput($_POST['name']);
$description = sanitizeInput($_POST['description']); $description = sanitizeInput($_POST['description']);
$qty = floatval($_POST['qty']); $qty = floatval($_POST['qty']);
@ -318,29 +318,29 @@ if (isset($_POST['add_recurring_item'])) {
$total = $subtotal + $tax_amount; $total = $subtotal + $tax_amount;
mysqli_query($mysqli,"INSERT INTO invoice_items SET item_name = '$name', item_description = '$description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_tax_id = $tax_id, item_order = $item_order, item_recurring_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO invoice_items SET item_name = '$name', item_description = '$description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_tax_id = $tax_id, item_order = $item_order, item_recurring_invoice_id = $recurring_invoice_id");
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_discount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
//add up all the items //add up all the items
$sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id");
$recurring_amount = 0; $recurring_invoice_amount = 0;
while($row = mysqli_fetch_array($sql)) { while($row = mysqli_fetch_array($sql)) {
$item_total = floatval($row['item_total']); $item_total = floatval($row['item_total']);
$recurring_amount = $recurring_amount + $item_total; $recurring_invoice_amount = $recurring_invoice_amount + $item_total;
} }
$recurring_amount = $recurring_amount - $recurring_discount; $recurring_invoice_amount = $recurring_invoice_amount - $recurring_invoice_discount;
mysqli_query($mysqli,"UPDATE recurring SET recurring_amount = $recurring_amount WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_amount = $recurring_invoice_amount WHERE recurring_invoice_id = $recurring_invoice_id");
// Logging // Logging
logAction("Recurring Invoice", "Edit", "$session_name added item $name to recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_id); logAction("Recurring Invoice", "Edit", "$session_name added item $name to recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Item <srrong>$name</strong> added to Recurring Invoice"; $_SESSION['alert_message'] = "Item <srrong>$name</strong> added to Recurring Invoice";
@ -348,22 +348,22 @@ if (isset($_POST['add_recurring_item'])) {
} }
if (isset($_POST['recurring_note'])) { if (isset($_POST['recurring_invoice_note'])) {
$recurring_id = intval($_POST['recurring_id']); $recurring_invoice_id = intval($_POST['recurring_invoice_id']);
$note = sanitizeInput($_POST['note']); $note = sanitizeInput($_POST['note']);
// Get Recurring details for logging // Get Recurring details for logging
$sql = mysqli_query($mysqli,"SELECT recurring_prefix, recurring_number, recurring_client_id FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT recurring_invoice_prefix, recurring_invoice_number, recurring_invoice_client_id FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
mysqli_query($mysqli,"UPDATE recurring SET recurring_note = '$note' WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_note = '$note' WHERE recurring_invoice_id = $recurring_invoice_id");
// Logging // Logging
logAction("Recurring Invoice", "Edit", "$session_name added note to recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_id); logAction("Recurring Invoice", "Edit", "$session_name added note to recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Notes added"; $_SESSION['alert_message'] = "Notes added";
@ -371,26 +371,26 @@ if (isset($_POST['recurring_note'])) {
} }
if (isset($_GET['delete_recurring_item'])) { if (isset($_GET['delete_recurring_invoice_item'])) {
$item_id = intval($_GET['delete_recurring_item']); $item_id = intval($_GET['delete_recurring_invoice_item']);
$sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_id = $item_id"); $sql = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_id = $item_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_id = intval($row['item_recurring_id']); $recurring_invoice_id = intval($row['item_recurring_invoice_id']);
$item_name = sanitizeInput($row['item_name']); $item_name = sanitizeInput($row['item_name']);
$item_subtotal = floatval($row['item_subtotal']); $item_subtotal = floatval($row['item_subtotal']);
$item_tax = floatval($row['item_tax']); $item_tax = floatval($row['item_tax']);
$item_total = floatval($row['item_total']); $item_total = floatval($row['item_total']);
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
$new_recurring_amount = floatval($row['recurring_amount']) - $item_total; $new_recurring_invoice_amount = floatval($row['recurring_invoice_amount']) - $item_total;
mysqli_query($mysqli,"UPDATE recurring SET recurring_amount = $new_recurring_amount WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_amount = $new_recurring_invoice_amount WHERE recurring_invoice_id = $recurring_invoice_id");
mysqli_query($mysqli,"DELETE FROM invoice_items WHERE item_id = $item_id"); mysqli_query($mysqli,"DELETE FROM invoice_items WHERE item_id = $item_id");
@ -622,11 +622,11 @@ if (isset($_POST['edit_item'])) {
mysqli_query($mysqli,"UPDATE invoice_items SET item_name = '$name', item_description = '$description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_tax_id = $tax_id WHERE item_id = $item_id"); mysqli_query($mysqli,"UPDATE invoice_items SET item_name = '$name', item_description = '$description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_tax_id = $tax_id WHERE item_id = $item_id");
// Determine what type of line item // Determine what type of line item
$sql = mysqli_query($mysqli,"SELECT item_invoice_id, item_quote_id, item_recurring_id FROM invoice_items WHERE item_id = $item_id"); $sql = mysqli_query($mysqli,"SELECT item_invoice_id, item_quote_id, item_recurring_invoice_id FROM invoice_items WHERE item_id = $item_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$invoice_id = intval($row['item_invoice_id']); $invoice_id = intval($row['item_invoice_id']);
$quote_id = intval($row['item_quote_id']); $quote_id = intval($row['item_quote_id']);
$recurring_id = intval($row['item_recurring_id']); $recurring_invoice_id = intval($row['item_recurring_invoice_id']);
if ($invoice_id > 0) { if ($invoice_id > 0) {
//Get Discount Amount //Get Discount Amount
@ -668,22 +668,22 @@ if (isset($_POST['edit_item'])) {
} else { } else {
//Get Discount Amount //Get Discount Amount
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
$recurring_discount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']);
//Update Invoice Balances by tallying up invoice items //Update Invoice Balances by tallying up invoice items
$sql_recurring_total = mysqli_query($mysqli,"SELECT SUM(item_total) AS recurring_total FROM invoice_items WHERE item_recurring_id = $recurring_id"); $sql_recurring_invoice_total = mysqli_query($mysqli,"SELECT SUM(item_total) AS recurring_invoice_total FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql_recurring_total); $row = mysqli_fetch_array($sql_recurring_invoice_total);
$new_recurring_amount = floatval($row['recurring_total']) - $recurring_discount; $new_recurring_invoice_amount = floatval($row['recurring_invoice_total']) - $recurring_invoice_discount;
mysqli_query($mysqli,"UPDATE recurring SET recurring_amount = $new_recurring_amount WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_amount = $new_recurring_invoice_amount WHERE recurring_invoice_id = $recurring_invoice_id");
// Logging // Logging
logAction("Recurring Invoice", "Edit", "$session_name edited item $name on recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_id); logAction("Recurring Invoice", "Edit", "$session_name edited item $name on recurring invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_invoice_id);
} }
@ -1386,29 +1386,29 @@ if (isset($_GET['email_invoice'])) {
if (isset($_POST['add_recurring_payment'])) { if (isset($_POST['add_recurring_payment'])) {
$recurring_id = intval($_POST['recurring_id']); $recurring_invoice_id = intval($_POST['recurring_invoice_id']);
$account = intval($_POST['account']); $account = intval($_POST['account']);
$currency_code = sanitizeInput($_POST['currency_code']); $currency_code = sanitizeInput($_POST['currency_code']);
$payment_method = sanitizeInput($_POST['payment_method']); $payment_method = sanitizeInput($_POST['payment_method']);
// Get Recurring Info for logging and alerting // Get Recurring Info for logging and alerting
$sql = mysqli_query($mysqli, "SELECT * FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli, "SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$recurring_amount = floatval($row['recurring_amount']); $recurring_invoice_amount = floatval($row['recurring_invoice_amount']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
mysqli_query($mysqli,"INSERT INTO recurring_payments SET recurring_payment_currency_code = '$currency_code', recurring_payment_account_id = $account, recurring_payment_method = '$payment_method', recurring_payment_recurring_invoice_id = $recurring_id"); mysqli_query($mysqli,"INSERT INTO recurring_payments SET recurring_payment_currency_code = '$currency_code', recurring_payment_account_id = $account, recurring_payment_method = '$payment_method', recurring_payment_recurring_invoice_id = $recurring_invoice_id");
// Get Payment ID for reference // Get Payment ID for reference
$recurring_payment_id = mysqli_insert_id($mysqli); $recurring_payment_id = mysqli_insert_id($mysqli);
// Logging // Logging
logAction("Recurring Invoice", "Auto Payment", "$session_name created Auto Pay for Recurring Invoice $recurring_prefix$recurring_number in the amount of " . numfmt_format_currency($currency_format, $recurring_amount, $currency_code), $client_id, $recurring_id); logAction("Recurring Invoice", "Auto Payment", "$session_name created Auto Pay for Recurring Invoice $recurring_invoice_prefix$recurring_invoice_number in the amount of " . numfmt_format_currency($currency_format, $recurring_invoice_amount, $currency_code), $client_id, $recurring_invoice_id);
$_SESSION['alert_message'] = "Automatic Payment created for <strong>$recurring_prefix$recurring_number</strong>"; $_SESSION['alert_message'] = "Automatic Payment created for <strong>$recurring_invoice_prefix$recurring_invoice_number</strong>";
header("Location: " . $_SERVER["HTTP_REFERER"]); header("Location: " . $_SERVER["HTTP_REFERER"]);
} }
@ -1421,42 +1421,42 @@ if (isset($_GET['delete_recurring_payment'])) {
$recurring_invoice_id = intval($row['recurring_payment_recurring_invoice_id']); $recurring_invoice_id = intval($row['recurring_payment_recurring_invoice_id']);
// Get the invoice total and details // Get the invoice total and details
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_id = $recurring_invoice_id"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
mysqli_query($mysqli,"DELETE FROM recurring_payments WHERE recurring_payment_id = $recurring_payment_id"); mysqli_query($mysqli,"DELETE FROM recurring_payments WHERE recurring_payment_id = $recurring_payment_id");
// Logging // Logging
logAction("Recurring Invoice", "Auto Payment", "$session_name removed auto Pay from Recurring Invoice $recurring_prefix$recurring_number", $client_id, $recurring_invoice_id); logAction("Recurring Invoice", "Auto Payment", "$session_name removed auto Pay from Recurring Invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_invoice_id);
$_SESSION['alert_type'] = "error"; $_SESSION['alert_type'] = "error";
$_SESSION['alert_message'] = "Auto Payment Removed for Recurring Invoice <strong>$recurring_prefix$recurring_number</strong>"; $_SESSION['alert_message'] = "Auto Payment Removed for Recurring Invoice <strong>$recurring_invoice_prefix$recurring_invoice_number</strong>";
header("Location: " . $_SERVER["HTTP_REFERER"]); header("Location: " . $_SERVER["HTTP_REFERER"]);
} }
if (isset($_GET['force_recurring'])) { if (isset($_GET['force_recurring'])) {
$recurring_id = intval($_GET['force_recurring']); $recurring_invoice_id = intval($_GET['force_recurring']);
$sql_recurring = mysqli_query($mysqli,"SELECT * FROM recurring, clients WHERE client_id = recurring_client_id AND recurring_id = $recurring_id"); $sql_recurring_invoices = mysqli_query($mysqli,"SELECT * FROM recurring_invoices, clients WHERE client_id = recurring_invoice_client_id AND recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql_recurring); $row = mysqli_fetch_array($sql_recurring_invoices);
$recurring_id = intval($row['recurring_id']); $recurring_invoice_id = intval($row['recurring_invoice_id']);
$recurring_scope = sanitizeInput($row['recurring_scope']); $recurring_invoice_scope = sanitizeInput($row['recurring_invoice_scope']);
$recurring_frequency = sanitizeInput($row['recurring_frequency']); $recurring_invoice_frequency = sanitizeInput($row['recurring_invoice_frequency']);
$recurring_status = sanitizeInput($row['recurring_status']); $recurring_invoice_status = sanitizeInput($row['recurring_invoice_status']);
$recurring_last_sent = sanitizeInput($row['recurring_last_sent']); $recurring_invoice_last_sent = sanitizeInput($row['recurring_invoice_last_sent']);
$recurring_next_date = sanitizeInput($row['recurring_next_date']); $recurring_invoice_next_date = sanitizeInput($row['recurring_invoice_next_date']);
$recurring_discount_amount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount_amount = floatval($row['recurring_invoice_discount_amount']);
$recurring_amount = floatval($row['recurring_amount']); $recurring_invoice_amount = floatval($row['recurring_invoice_amount']);
$recurring_currency_code = sanitizeInput($row['recurring_currency_code']); $recurring_invoice_currency_code = sanitizeInput($row['recurring_invoice_currency_code']);
$recurring_note = sanitizeInput($row['recurring_note']); $recurring_invoice_note = sanitizeInput($row['recurring_invoice_note']);
$category_id = intval($row['recurring_category_id']); $category_id = intval($row['recurring_invoice_category_id']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
$client_net_terms = intval($row['client_net_terms']); $client_net_terms = intval($row['client_net_terms']);
//Get the last Invoice Number and add 1 for the new invoice number //Get the last Invoice Number and add 1 for the new invoice number
@ -1467,12 +1467,12 @@ if (isset($_GET['force_recurring'])) {
//Generate a unique URL key for clients to access //Generate a unique URL key for clients to access
$url_key = randomString(156); $url_key = randomString(156);
mysqli_query($mysqli,"INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_id, invoice_client_id = $client_id"); mysqli_query($mysqli,"INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_invoice_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_invoice_discount_amount, invoice_amount = $recurring_invoice_amount, invoice_currency_code = '$recurring_invoice_currency_code', invoice_note = '$recurring_invoice_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_invoice_id, invoice_client_id = $client_id");
$new_invoice_id = mysqli_insert_id($mysqli); $new_invoice_id = mysqli_insert_id($mysqli);
//Copy Items from original invoice to new invoice //Copy Items from original invoice to new invoice
$sql_invoice_items = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_id = $recurring_id ORDER BY item_id ASC"); $sql_invoice_items = mysqli_query($mysqli,"SELECT * FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id ORDER BY item_id ASC");
while($row = mysqli_fetch_array($sql_invoice_items)) { while($row = mysqli_fetch_array($sql_invoice_items)) {
$item_id = intval($row['item_id']); $item_id = intval($row['item_id']);
@ -1505,16 +1505,16 @@ if (isset($_GET['force_recurring'])) {
mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Sent', history_description = 'Invoice Generated from Recurring!', history_invoice_id = $new_invoice_id"); mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Sent', history_description = 'Invoice Generated from Recurring!', history_invoice_id = $new_invoice_id");
//Update Recurring Balances by tallying up recurring items also update recurring dates //Update Recurring Balances by tallying up recurring items also update recurring dates
$sql_recurring_total = mysqli_query($mysqli,"SELECT SUM(item_total) AS recurring_total FROM invoice_items WHERE item_recurring_id = $recurring_id"); $sql_recurring_invoice_total = mysqli_query($mysqli,"SELECT SUM(item_total) AS recurring_invoice_total FROM invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql_recurring_total); $row = mysqli_fetch_array($sql_recurring_invoice_total);
$new_recurring_amount = floatval($row['recurring_total']) - $recurring_discount_amount; $new_recurring_invoice_amount = floatval($row['recurring_invoice_total']) - $recurring_invoice_discount_amount;
mysqli_query($mysqli,"UPDATE recurring SET recurring_amount = $new_recurring_amount, recurring_last_sent = CURDATE(), recurring_next_date = DATE_ADD(CURDATE(), INTERVAL 1 $recurring_frequency) WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_amount = $new_recurring_invoice_amount, recurring_invoice_last_sent = CURDATE(), recurring_invoice_next_date = DATE_ADD(CURDATE(), INTERVAL 1 $recurring_invoice_frequency) WHERE recurring_invoice_id = $recurring_invoice_id");
//Also update the newly created invoice with the new amounts //Also update the newly created invoice with the new amounts
mysqli_query($mysqli,"UPDATE invoices SET invoice_amount = $new_recurring_amount WHERE invoice_id = $new_invoice_id"); mysqli_query($mysqli,"UPDATE invoices SET invoice_amount = $new_recurring_invoice_amount WHERE invoice_id = $new_invoice_id");
if ($config_recurring_auto_send_invoice == 1) { if ($config_recurring_invoice_auto_send_invoice == 1) {
$sql = mysqli_query($mysqli,"SELECT * FROM invoices $sql = mysqli_query($mysqli,"SELECT * FROM invoices
LEFT JOIN clients ON invoice_client_id = client_id LEFT JOIN clients ON invoice_client_id = client_id
LEFT JOIN contacts ON clients.client_id = contacts.contact_client_id AND contact_primary = 1 LEFT JOIN contacts ON clients.client_id = contacts.contact_client_id AND contact_primary = 1
@ -1654,7 +1654,7 @@ if (isset($_POST['export_invoices_csv'])) {
} }
if (isset($_POST['export_client_recurring_csv'])) { if (isset($_POST['export_client_recurring_invoice_csv'])) {
$client_id = intval($_POST['client_id']); $client_id = intval($_POST['client_id']);
//get records from database //get records from database
@ -1663,7 +1663,7 @@ if (isset($_POST['export_client_recurring_csv'])) {
$client_name = $row['client_name']; $client_name = $row['client_name'];
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_client_id = $client_id ORDER BY recurring_number ASC"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_client_id = $client_id ORDER BY recurring_invoice_number ASC");
$num_rows = mysqli_num_rows($sql); $num_rows = mysqli_num_rows($sql);
@ -1680,7 +1680,7 @@ if (isset($_POST['export_client_recurring_csv'])) {
//output each row of the data, format line as csv and write to file pointer //output each row of the data, format line as csv and write to file pointer
while($row = $sql->fetch_assoc()) { while($row = $sql->fetch_assoc()) {
$lineData = array($row['recurring_prefix'] . $row['recurring_number'], $row['recurring_scope'], $row['recurring_amount'], ucwords($row['recurring_frequency'] . "ly"), $row['recurring_created_at']); $lineData = array($row['recurring_invoice_prefix'] . $row['recurring_invoice_number'], $row['recurring_invoice_scope'], $row['recurring_invoice_amount'], ucwords($row['recurring_invoice_frequency'] . "ly"), $row['recurring_invoice_created_at']);
fputcsv($f, $lineData, $delimiter); fputcsv($f, $lineData, $delimiter);
} }
@ -1751,15 +1751,15 @@ if (isset($_POST['export_payments_csv'])) {
if (isset($_GET['recurring_invoice_email_notify'])) { if (isset($_GET['recurring_invoice_email_notify'])) {
$recurring_invoice_email_notify = intval($_GET['recurring_invoice_email_notify']); $recurring_invoice_email_notify = intval($_GET['recurring_invoice_email_notify']);
$recurring_id = intval($_GET['recurring_id']); $recurring_invoice_id = intval($_GET['recurring_invoice_id']);
$sql = mysqli_query($mysqli,"SELECT * FROM recurring WHERE recurring_id = $recurring_id"); $sql = mysqli_query($mysqli,"SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id");
$row = mysqli_fetch_array($sql); $row = mysqli_fetch_array($sql);
$recurring_invoice_prefix = sanitizeInput($row['recurring_prefix']); $recurring_invoice_prefix = sanitizeInput($row['recurring_invoice_prefix']);
$recurring_invoice_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
mysqli_query($mysqli,"UPDATE recurring SET recurring_invoice_email_notify = $recurring_invoice_email_notify WHERE recurring_id = $recurring_id"); mysqli_query($mysqli,"UPDATE recurring_invoices SET recurring_invoice_email_notify = $recurring_invoice_email_notify WHERE recurring_invoice_id = $recurring_invoice_id");
// Wording // Wording
if ($recurring_invoice_email_notify) { if ($recurring_invoice_email_notify) {
@ -1769,7 +1769,7 @@ if (isset($_GET['recurring_invoice_email_notify'])) {
} }
// Logging // Logging
logAction("Recurring Invoice", "Edit", "$session_name turned $notify_wording Email Notifications for Recurring Invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_id); logAction("Recurring Invoice", "Edit", "$session_name turned $notify_wording Email Notifications for Recurring Invoice $recurring_invoice_prefix$recurring_invoice_number", $client_id, $recurring_invoice_id);
$_SESSION['alert_type'] = "error"; $_SESSION['alert_type'] = "error";
$_SESSION['alert_message'] = "Email Notifications <strong>$notify_wording</strong>"; $_SESSION['alert_message'] = "Email Notifications <strong>$notify_wording</strong>";

View File

@ -1,13 +1,13 @@
<?php <?php
// Default Column Sortby/Order Filter // Default Column Sortby/Order Filter
$sort = "recurring_next_date"; $sort = "recurring_invoice_next_date";
$order = "ASC"; $order = "ASC";
// If client_id is in URI then show client Side Bar and client header // If client_id is in URI then show client Side Bar and client header
if (isset($_GET['client_id'])) { if (isset($_GET['client_id'])) {
require_once "includes/inc_all_client.php"; require_once "includes/inc_all_client.php";
$client_query = "AND recurring_client_id = $client_id"; $client_query = "AND recurring_invoice_client_id = $client_id";
$client_url = "client_id=$client_id&"; $client_url = "client_id=$client_id&";
} else { } else {
require_once "includes/inc_all.php"; require_once "includes/inc_all.php";
@ -21,20 +21,20 @@ enforceUserPermission('module_sales');
// Status Filter // Status Filter
if (isset($_GET['status']) && $_GET['status'] == "inactive") { if (isset($_GET['status']) && $_GET['status'] == "inactive") {
$status_filter = "inactive"; $status_filter = "inactive";
$status_query = "AND recurring_status = 0"; $status_query = "AND recurring_invoice_status = 0";
} else { } else {
$status_filter = "active"; $status_filter = "active";
$status_query = "AND recurring_status = 1"; $status_query = "AND recurring_invoice_status = 1";
} }
$sql = mysqli_query( $sql = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM recurring "SELECT SQL_CALC_FOUND_ROWS * FROM recurring_invoices
LEFT JOIN clients ON recurring_client_id = client_id LEFT JOIN clients ON recurring_invoice_client_id = client_id
LEFT JOIN categories ON recurring_category_id = category_id LEFT JOIN categories ON recurring_invoice_category_id = category_id
LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_id LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_invoice_id
WHERE (CONCAT(recurring_prefix,recurring_number) LIKE '%$q%' OR recurring_frequency LIKE '%$q%' OR recurring_scope LIKE '%$q%' OR client_name LIKE '%$q%' OR category_name LIKE '%$q%') WHERE (CONCAT(recurring_invoice_prefix,recurring_invoice_number) LIKE '%$q%' OR recurring_invoice_frequency LIKE '%$q%' OR recurring_invoice_scope LIKE '%$q%' OR client_name LIKE '%$q%' OR category_name LIKE '%$q%')
AND DATE(recurring_created_at) BETWEEN '$dtf' AND '$dtt' AND DATE(recurring_invoice_created_at) BETWEEN '$dtf' AND '$dtt'
$status_query $status_query
$client_query $client_query
ORDER BY $sort $order LIMIT $record_from, $record_to"); ORDER BY $sort $order LIMIT $record_from, $record_to");
@ -47,7 +47,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
<div class="card-header py-2"> <div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-redo-alt mr-2"></i>Recurring Invoices</h3> <h3 class="card-title mt-2"><i class="fa fa-redo-alt mr-2"></i>Recurring Invoices</h3>
<div class="card-tools"> <div class="card-tools">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addRecurringModal"><i class="fas fa-plus mr-2"></i>New Recurring Invoice</button> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addRecurringInvoiceModal"><i class="fas fa-plus mr-2"></i>New Recurring Invoice</button>
</div> </div>
</div> </div>
@ -115,18 +115,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
<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> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_number&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_number&order=<?php echo $disp; ?>">
Number <?php if ($sort == 'recurring_number') { echo $order_icon; } ?> Number <?php if ($sort == 'recurring_invoice_number') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_next_date&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_next_date&order=<?php echo $disp; ?>">
Next Date <?php if ($sort == 'recurring_next_date') { echo $order_icon; } ?> Next Date <?php if ($sort == 'recurring_invoice_next_date') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_scope&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_scope&order=<?php echo $disp; ?>">
Scope <?php if ($sort == 'recurring_scope') { echo $order_icon; } ?> Scope <?php if ($sort == 'recurring_invoice_scope') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<?php if (!$client_url) { ?> <?php if (!$client_url) { ?>
@ -137,18 +137,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
</th> </th>
<?php } ?> <?php } ?>
<th class="text-right"> <th class="text-right">
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_amount&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_amount&order=<?php echo $disp; ?>">
Amount <?php if ($sort == 'recurring_amount') { echo $order_icon; } ?> Amount <?php if ($sort == 'recurring_invoice_amount') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_frequency&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_frequency&order=<?php echo $disp; ?>">
Frequency <?php if ($sort == 'recurring_frequency') { echo $order_icon; } ?> Frequency <?php if ($sort == 'recurring_invoice_frequency') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_last_sent&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_last_sent&order=<?php echo $disp; ?>">
Last Sent <?php if ($sort == 'recurring_last_sent') { echo $order_icon; } ?> Last Sent <?php if ($sort == 'recurring_invoice_last_sent') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th> <th>
@ -162,8 +162,8 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
</a> </a>
</th> </th>
<th> <th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_status&order=<?php echo $disp; ?>"> <a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=recurring_invoice_status&order=<?php echo $disp; ?>">
Status <?php if ($sort == 'recurring_status') { echo $order_icon; } ?> Status <?php if ($sort == 'recurring_invoice_status') { echo $order_icon; } ?>
</a> </a>
</th> </th>
<th class="text-center">Action</th> <th class="text-center">Action</th>
@ -173,27 +173,27 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
<?php <?php
while ($row = mysqli_fetch_array($sql)) { while ($row = mysqli_fetch_array($sql)) {
$recurring_id = intval($row['recurring_id']); $recurring_invoice_id = intval($row['recurring_invoice_id']);
$recurring_prefix = nullable_htmlentities($row['recurring_prefix']); $recurring_invoice_prefix = nullable_htmlentities($row['recurring_invoice_prefix']);
$recurring_number = intval($row['recurring_number']); $recurring_invoice_number = intval($row['recurring_invoice_number']);
$recurring_scope = nullable_htmlentities($row['recurring_scope']); $recurring_invoice_scope = nullable_htmlentities($row['recurring_invoice_scope']);
$recurring_frequency = nullable_htmlentities($row['recurring_frequency']); $recurring_invoice_frequency = nullable_htmlentities($row['recurring_invoice_frequency']);
$recurring_status = nullable_htmlentities($row['recurring_status']); $recurring_invoice_status = nullable_htmlentities($row['recurring_invoice_status']);
$recurring_discount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']);
$recurring_last_sent = $row['recurring_last_sent']; $recurring_invoice_last_sent = $row['recurring_invoice_last_sent'];
if ($recurring_last_sent == 0) { if ($recurring_invoice_last_sent == 0) {
$recurring_last_sent = "-"; $recurring_invoice_last_sent = "-";
} }
$recurring_next_date = nullable_htmlentities($row['recurring_next_date']); $recurring_invoice_next_date = nullable_htmlentities($row['recurring_invoice_next_date']);
$recurring_amount = floatval($row['recurring_amount']); $recurring_invoice_amount = floatval($row['recurring_invoice_amount']);
$recurring_currency_code = nullable_htmlentities($row['recurring_currency_code']); $recurring_invoice_currency_code = nullable_htmlentities($row['recurring_invoice_currency_code']);
$recurring_created_at = nullable_htmlentities($row['recurring_created_at']); $recurring_invoice_created_at = nullable_htmlentities($row['recurring_invoice_created_at']);
$client_id = intval($row['client_id']); $client_id = intval($row['client_id']);
$client_name = nullable_htmlentities($row['client_name']); $client_name = nullable_htmlentities($row['client_name']);
$client_currency_code = nullable_htmlentities($row['client_currency_code']); $client_currency_code = nullable_htmlentities($row['client_currency_code']);
$category_id = intval($row['category_id']); $category_id = intval($row['category_id']);
$category_name = nullable_htmlentities($row['category_name']); $category_name = nullable_htmlentities($row['category_name']);
if ($recurring_status == 1) { if ($recurring_invoice_status == 1) {
$status = "Active"; $status = "Active";
$status_badge_color = "success"; $status_badge_color = "success";
} else { } else {
@ -211,7 +211,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
"; ";
} else { } else {
$auto_pay_display = " $auto_pay_display = "
<a href='#' data-toggle='modal' data-target='#addRecurringPaymentModal$recurring_id'> <a href='#' data-toggle='modal' data-target='#addRecurringPaymentModal$recurring_invoice_id'>
Create Create
</a> </a>
"; ";
@ -222,18 +222,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
<tr> <tr>
<td class="text-bold"> <td class="text-bold">
<a href="recurring_invoice.php?<?php echo $client_url; ?>recurring_id=<?php echo $recurring_id; ?>"> <a href="recurring_invoice_invoice.php?<?php echo $client_url; ?>recurring_invoice_id=<?php echo $recurring_invoice_id; ?>">
<?php echo "$recurring_prefix$recurring_number"; ?> <?php echo "$recurring_invoice_prefix$recurring_invoice_number"; ?>
</a> </a>
</td> </td>
<td class="text-bold"><?php echo $recurring_next_date; ?></td> <td class="text-bold"><?php echo $recurring_invoice_next_date; ?></td>
<td><?php echo $recurring_scope; ?></td> <td><?php echo $recurring_invoice_scope; ?></td>
<?php if (!$client_url) { ?> <?php if (!$client_url) { ?>
<td class="text-bold"><a href="recurring_invoices.php?client_id=<?php echo $client_id; ?>"><?php echo $client_name; ?></a></td> <td class="text-bold"><a href="recurring_invoices.php?client_id=<?php echo $client_id; ?>"><?php echo $client_name; ?></a></td>
<?php } ?> <?php } ?>
<td class="text-bold text-right"><?php echo numfmt_format_currency($currency_format, $recurring_amount, $recurring_currency_code); ?></td> <td class="text-bold text-right"><?php echo numfmt_format_currency($currency_format, $recurring_invoice_amount, $recurring_invoice_currency_code); ?></td>
<td><?php echo ucwords($recurring_frequency); ?>ly</td> <td><?php echo ucwords($recurring_invoice_frequency); ?>ly</td>
<td><?php echo $recurring_last_sent; ?></td> <td><?php echo $recurring_invoice_last_sent; ?></td>
<td><?php echo $category_name; ?></td> <td><?php echo $category_name; ?></td>
<td><?php echo $auto_pay_display; ?></td> <td><?php echo $auto_pay_display; ?></td>
<td> <td>
@ -251,13 +251,13 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
<a class="dropdown-item" href="#" <a class="dropdown-item" href="#"
data-toggle = "ajax-modal" data-toggle = "ajax-modal"
data-ajax-url = "ajax/ajax_recurring_invoice_edit.php" data-ajax-url = "ajax/ajax_recurring_invoice_edit.php"
data-ajax-id = "<?php echo $recurring_id; ?>" data-ajax-id = "<?php echo $recurring_invoice_id; ?>"
> >
<i class="fas fa-fw fa-edit mr-2"></i>Edit <i class="fas fa-fw fa-edit mr-2"></i>Edit
</a> </a>
<?php if ($status !== 'Active') { ?> <?php if ($status !== 'Active') { ?>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_recurring=<?php echo $recurring_id; ?>"> <a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_recurring=<?php echo $recurring_invoice_id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete <i class="fas fa-fw fa-trash mr-2"></i>Delete
</a> </a>
<?php } ?> <?php } ?>

View File

@ -547,27 +547,27 @@ if ($config_send_invoice_reminders == 1) {
// Send Recurring Invoices that match todays date and are active // Send Recurring Invoices that match todays date and are active
//Loop through all recurring that match today's date and is active //Loop through all recurring that match today's date and is active
$sql_recurring = mysqli_query($mysqli, "SELECT * FROM recurring $sql_recurring_invoices = mysqli_query($mysqli, "SELECT * FROM recurring_invoices
LEFT JOIN recurring_payments ON recurring_id = recurring_payment_recurring_invoice_id LEFT JOIN recurring_payments ON recurring_invoice_id = recurring_payment_recurring_invoice_id
LEFT JOIN clients ON client_id = recurring_client_id LEFT JOIN clients ON client_id = recurring_invoice_client_id
WHERE recurring_next_date = CURDATE() WHERE recurring_invoice_next_date = CURDATE()
AND recurring_status = 1 AND recurring_invoice_status = 1
"); ");
while ($row = mysqli_fetch_array($sql_recurring)) { while ($row = mysqli_fetch_array($sql_recurring_invoices)) {
$recurring_id = intval($row['recurring_id']); $recurring_invoice_id = intval($row['recurring_invoice_id']);
$recurring_scope = sanitizeInput($row['recurring_scope']); $recurring_invoice_scope = sanitizeInput($row['recurring_invoice_scope']);
$recurring_frequency = sanitizeInput($row['recurring_frequency']); $recurring_invoice_frequency = sanitizeInput($row['recurring_invoice_frequency']);
$recurring_status = sanitizeInput($row['recurring_status']); $recurring_invoice_status = sanitizeInput($row['recurring_invoice_status']);
$recurring_last_sent = sanitizeInput($row['recurring_last_sent']); $recurring_invoice_last_sent = sanitizeInput($row['recurring_invoice_last_sent']);
$recurring_next_date = sanitizeInput($row['recurring_next_date']); $recurring_invoice_next_date = sanitizeInput($row['recurring_invoice_next_date']);
$recurring_discount_amount = floatval($row['recurring_discount_amount']); $recurring_invoice_discount_amount = floatval($row['recurring_invoice_discount_amount']);
$recurring_amount = floatval($row['recurring_amount']); $recurring_invoice_amount = floatval($row['recurring_invoice_amount']);
$recurring_currency_code = sanitizeInput($row['recurring_currency_code']); $recurring_invoice_currency_code = sanitizeInput($row['recurring_invoice_currency_code']);
$recurring_note = sanitizeInput($row['recurring_note']); $recurring_invoice_note = sanitizeInput($row['recurring_invoice_note']);
$recurring_invoice_email_notify = intval($row['recurring_invoice_email_notify']); $recurring_invoice_email_notify = intval($row['recurring_invoice_email_notify']);
$category_id = intval($row['recurring_category_id']); $category_id = intval($row['recurring_invoice_category_id']);
$client_id = intval($row['recurring_client_id']); $client_id = intval($row['recurring_invoice_client_id']);
$client_name = sanitizeInput($row['client_name']); $client_name = sanitizeInput($row['client_name']);
$client_net_terms = intval($row['client_net_terms']); $client_net_terms = intval($row['client_net_terms']);
@ -588,7 +588,7 @@ while ($row = mysqli_fetch_array($sql_recurring)) {
//Generate a unique URL key for clients to access //Generate a unique URL key for clients to access
$url_key = randomString(156); $url_key = randomString(156);
mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_id, invoice_client_id = $client_id"); mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_invoice_id, invoice_client_id = $client_id");
$new_invoice_id = mysqli_insert_id($mysqli); $new_invoice_id = mysqli_insert_id($mysqli);
@ -620,7 +620,7 @@ while ($row = mysqli_fetch_array($sql_recurring)) {
//Update recurring dates //Update recurring dates
mysqli_query($mysqli, "UPDATE recurring SET recurring_last_sent = CURDATE(), recurring_next_date = DATE_ADD(CURDATE(), INTERVAL 1 $recurring_frequency) WHERE recurring_id = $recurring_id"); mysqli_query($mysqli, "UPDATE recurring_invoices SET recurring_invoice_last_sent = CURDATE(), recurring_invoice_next_date = DATE_ADD(CURDATE(), INTERVAL 1 $recurring_invoice_frequency) WHERE recurring_invoice_id = $recurring_invoice_id");
// Get details of the newly generated invoice // Get details of the newly generated invoice
$sql = mysqli_query( $sql = mysqli_query(