diff --git a/admin_settings_invoice.php b/admin_settings_invoice.php index a452af66..9633c3eb 100644 --- a/admin_settings_invoice.php +++ b/admin_settings_invoice.php @@ -77,7 +77,7 @@ require_once "includes/inc_all_admin.php";
- + @@ -87,7 +87,7 @@ require_once "includes/inc_all_admin.php";
- + diff --git a/ajax/ajax_recurring_invoice_edit.php b/ajax/ajax_recurring_invoice_edit.php index e0ab9d56..0a62b4f4 100644 --- a/ajax/ajax_recurring_invoice_edit.php +++ b/ajax/ajax_recurring_invoice_edit.php @@ -2,33 +2,33 @@ 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); -$recurring_prefix = nullable_htmlentities($row['recurring_prefix']); -$recurring_number = intval($row['recurring_number']); -$recurring_scope = nullable_htmlentities($row['recurring_scope']); -$recurring_frequency = nullable_htmlentities($row['recurring_frequency']); -$recurring_status = nullable_htmlentities($row['recurring_status']); -$recurring_created_at = date('Y-m-d', strtotime($row['recurring_created_at'])); -$recurring_next_date = nullable_htmlentities($row['recurring_next_date']); -$recurring_discount = floatval($row['recurring_discount_amount']); -$category_id = intval($row['recurring_category_id']); +$recurring_invoice_prefix = nullable_htmlentities($row['recurring_invoice_prefix']); +$recurring_invoice_number = intval($row['recurring_invoice_number']); +$recurring_invoice_scope = nullable_htmlentities($row['recurring_invoice_scope']); +$recurring_invoice_frequency = nullable_htmlentities($row['recurring_invoice_frequency']); +$recurring_invoice_status = nullable_htmlentities($row['recurring_invoice_status']); +$recurring_invoice_created_at = date('Y-m-d', strtotime($row['recurring_invoice_created_at'])); +$recurring_invoice_next_date = nullable_htmlentities($row['recurring_invoice_next_date']); +$recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']); +$category_id = intval($row['recurring_invoice_category_id']); // Generate the HTML form content using output buffering. ob_start(); ?>
- + @@ -50,8 +50,8 @@ ob_start(); @@ -62,7 +62,7 @@ ob_start();
- + @@ -76,7 +76,7 @@ ob_start(); '$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)) { $category_id_select = intval($row['category_id']); $category_name_select = nullable_htmlentities($row['category_name']); @@ -104,7 +104,7 @@ ob_start();
- + @@ -115,10 +115,10 @@ ob_start(); @@ -127,7 +127,7 @@ ob_start();
diff --git a/clients.php b/clients.php index a4d742c0..b7306f23 100644 --- a/clients.php +++ b/clients.php @@ -362,13 +362,13 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } //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); $recurring_monthly_total = floatval($row['recurring_monthly_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); $recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12; diff --git a/dashboard.php b/dashboard.php index 92fa3fc0..f4b968ad 100644 --- a/dashboard.php +++ b/dashboard.php @@ -124,11 +124,11 @@ if ($user_config_dashboard_financial_enable == 1) { "); // 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); $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); $recurring_monthly_total = floatval($row['recurring_monthly_total']) + ($recurring_yearly_total / 12); diff --git a/database_updates.php b/database_updates.php index 2fda14d4..cb6d154f 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2529,10 +2529,58 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_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 + if (CURRENT_DATABASE_VERSION == '1.9.6') { + 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 - // 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 { diff --git a/db.sql b/db.sql index de4917c5..58bafb0a 100644 --- a/db.sql +++ b/db.sql @@ -902,7 +902,7 @@ CREATE TABLE `history` ( `history_description` varchar(200) NOT NULL, `history_created_at` datetime NOT NULL DEFAULT current_timestamp(), `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, PRIMARY KEY (`history_id`) ) 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_product_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, PRIMARY KEY (`item_id`) ) 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; /*!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` -- @@ -1473,6 +1443,36 @@ CREATE TABLE `recurring_expenses` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!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` -- @@ -1737,8 +1737,8 @@ CREATE TABLE `settings` ( `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_paid_notification_email` varchar(200) DEFAULT NULL, - `config_recurring_prefix` varchar(200) DEFAULT NULL, - `config_recurring_next_number` int(11) NOT NULL, + `config_recurring_invoice_prefix` varchar(200) DEFAULT NULL, + `config_recurring_invoice_next_number` int(11) NOT NULL DEFAULT 1, `config_quote_prefix` varchar(200) DEFAULT NULL, `config_quote_next_number` int(11) DEFAULT NULL, `config_quote_footer` text DEFAULT NULL, @@ -2417,4 +2417,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!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 diff --git a/get_settings.php b/get_settings.php index f8fd2f7b..d142b709 100644 --- a/get_settings.php +++ b/get_settings.php @@ -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']; // Recurring Invoices -$config_recurring_prefix = $row['config_recurring_prefix']; -$config_recurring_next_number = intval($row['config_recurring_next_number']); +$config_recurring_invoice_prefix = $row['config_recurring_invoice_prefix']; +$config_recurring_invoice_next_number = intval($row['config_recurring_invoice_next_number']); // Quotes $config_quote_prefix = $row['config_quote_prefix']; diff --git a/includes/client_side_nav.php b/includes/client_side_nav.php index bb1dbfc2..e58539dd 100644 --- a/includes/client_side_nav.php +++ b/includes/client_side_nav.php @@ -277,8 +277,8 @@

Recurring Invoices 0) { ?> - + if ($num_recurring_invoices) { ?> +

diff --git a/includes/database_version.php b/includes/database_version.php index a24d286b..79f89e0f 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.9.6"); +DEFINE("LATEST_DATABASE_VERSION", "1.9.8"); diff --git a/includes/get_side_nav_counts.php b/includes/get_side_nav_counts.php index 35c59e11..6d0afd4b 100644 --- a/includes/get_side_nav_counts.php +++ b/includes/get_side_nav_counts.php @@ -22,7 +22,7 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS n $num_open_invoices = $row['num']; // 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']; // Open Quotes Count diff --git a/includes/inc_all_client.php b/includes/inc_all_client.php index 461d91b8..55ffdd0d 100644 --- a/includes/inc_all_client.php +++ b/includes/inc_all_client.php @@ -115,13 +115,13 @@ if (isset($_GET['client_id'])) { $balance = $invoice_amounts - $amount_paid; //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); $recurring_monthly_total = floatval($row['recurring_monthly_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); $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")); $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")); - $num_recurring = $row['num']; + $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_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")); $num_payments = $row['num']; diff --git a/modals/recurring_invoice_add_modal.php b/modals/recurring_invoice_add_modal.php index e194178f..33cd8ab5 100644 --- a/modals/recurring_invoice_add_modal.php +++ b/modals/recurring_invoice_add_modal.php @@ -1,4 +1,4 @@ -