diff --git a/cron.php b/cron.php index 76e80469..37791d01 100644 --- a/cron.php +++ b/cron.php @@ -652,6 +652,49 @@ while ($row = mysqli_fetch_array($sql_recurring)) { // Logging mysqli_query($mysqli, "INSERT INTO logs SET log_type = 'Cron', log_action = 'Task', log_description = 'Cron created invoices from recurring invoices and sent emails out'"); +// Recurring Expenses +// Loop through all recurring expenses that match today's date and is active +$sql_recurring_expenses = mysqli_query($mysqli, "SELECT * FROM recurring_expenses WHERE recurring_expense_next_date = CURDATE() AND recurring_expense_status = 1"); + +while ($row = mysqli_fetch_array($sql_recurring_expenses)) { + $recurring_expense_id = intval($row['recurring_expense_id']); + $recurring_expense_frequency = intval($row['recurring_expense_frequency']); + $recurring_expense_month = intval($row['recurring_expense_month']); + $recurring_expense_day = intval($row['recurring_expense_day']); + $recurring_expense_description = sanitizeInput($row['recurring_expense_description']); + $recurring_expense_amount = floatval($row['recurring_expense_amount']); + $recurring_expense_payment_method = sanitizeInput($row['recurring_expense_payment_method']); + $recurring_expense_reference = sanitizeInput($row['recurring_expense_reference']); + $recurring_expense_currency_code = sanitizeInput($row['recurring_expense_currency_code']); + $recurring_expense_vendor_id = intval($row['recurring_expense_vendor_id']); + $recurring_expense_category_id = intval($row['recurring_expense_category_id']); + $recurring_expense_account_id = intval($row['recurring_expense_account_id']); + $recurring_expense_client_id = intval($row['recurring_expense_client_id']); + + // Calculate next billing date based on frequency + if ($recurring_expense_frequency == 1) { // Monthly + $next_date_query = "DATE_ADD(CURDATE(), INTERVAL 1 MONTH)"; + } elseif ($recurring_expense_frequency == 2) { // Yearly + $next_date_query = "DATE(CONCAT(YEAR(CURDATE()) + 1, '-', $recurring_expense_month, '-', $recurring_expense_day))"; + } else { + // Handle unexpected frequency values. For now, just use current date. + $next_date_query = "CURDATE()"; + } + + mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = CURDATE(), expense_amount = $recurring_expense_amount, expense_currency_code = '$recurring_expense_currency_code', expense_account_id = $recurring_expense_account_id, expense_vendor_id = $recurring_expense_vendor_id, expense_client_id = $recurring_expense_client_id, expense_category_id = $recurring_expense_category_id, expense_description = '$recurring_expense_description', expense_reference = '$recurring_expense_reference'"); + + $expense_id = mysqli_insert_id($mysqli); + + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Expense Created', notification = 'Expense $recurring_expense_description created from recurring expenses', notification_client_id = $recurring_expense_client_id, notification_entity_id = $expense_id"); + + // Update recurring dates using calculated next billing date + + mysqli_query($mysqli, "UPDATE recurring_expenses SET recurring_expense_last_sent = CURDATE(), recurring_expense_next_date = $next_date_query WHERE recurring_expense_id = $recurring_expense_id"); + + +} //End Recurring Invoices Loop +// Logging +mysqli_query($mysqli, "INSERT INTO logs SET log_type = 'Cron', log_action = 'Task', log_description = 'Cron created expenses from recurring expenses'"); // TELEMETRY diff --git a/database_updates.php b/database_updates.php index 71b0038b..20c712f8 100644 --- a/database_updates.php +++ b/database_updates.php @@ -1215,11 +1215,19 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.8'"); } - //if (CURRENT_DATABASE_VERSION == '0.6.8') { + if (CURRENT_DATABASE_VERSION == '0.6.8') { //Insert queries here required to update to DB version 0.6.9 + mysqli_query($mysqli, "ALTER TABLE `recurring_expenses` CHANGE `recurring_expense_payment_reference` `recurring_expense_reference` VARCHAR(255) DEFAULT NULL"); // Then, update the database to the next sequential version - //mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.9'"); + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.9'"); + } + + //if (CURRENT_DATABASE_VERSION == '0.6.9') { + //Insert queries here required to update to DB version 0.7.0 + + // Then, update the database to the next sequential version + //mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.0'"); //} } else { diff --git a/database_version.php b/database_version.php index f362bdf4..9f55c8e8 100644 --- a/database_version.php +++ b/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "0.6.8"); +DEFINE("LATEST_DATABASE_VERSION", "0.6.9"); diff --git a/db.sql b/db.sql index 497f898d..04ce2727 100644 --- a/db.sql +++ b/db.sql @@ -952,7 +952,7 @@ CREATE TABLE `recurring_expenses` ( `recurring_expense_description` text DEFAULT NULL, `recurring_expense_amount` decimal(15,2) NOT NULL, `recurring_expense_payment_method` varchar(200) DEFAULT NULL, - `recurring_expense_payment_reference` varchar(200) DEFAULT NULL, + `recurring_expense_reference` varchar(255) DEFAULT NULL, `recurring_expense_currency_code` varchar(200) NOT NULL, `recurring_expense_created_at` datetime NOT NULL DEFAULT current_timestamp(), `recurring_expense_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), @@ -1669,4 +1669,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2023-08-16 17:56:01 +-- Dump completed on 2023-08-17 16:03:19 diff --git a/post/expense.php b/post/expense.php index dfbace24..1881861a 100644 --- a/post/expense.php +++ b/post/expense.php @@ -176,7 +176,7 @@ if (isset($_POST['create_recurring_expense'])) { $start_date = date('Y') . "-$month-$day"; - mysqli_query($mysqli,"INSERT INTO recurring_expenses SET recurring_expense_frequency = $frequency, recurring_expense_day = $day, recurring_expense_month = $month, recurring_expense_next_date = '$start_date', recurring_expense_description = '$description', recurring_expense_payment_reference = '$reference', recurring_expense_amount = $amount, recurring_expense_currency_code = '$session_company_currency', recurring_expense_vendor_id = $vendor, recurring_expense_client_id = $client, recurring_expense_category_id = $category, recurring_expense_account_id = $account"); + mysqli_query($mysqli,"INSERT INTO recurring_expenses SET recurring_expense_frequency = $frequency, recurring_expense_day = $day, recurring_expense_month = $month, recurring_expense_next_date = '$start_date', recurring_expense_description = '$description', recurring_expense_reference = '$reference', recurring_expense_amount = $amount, recurring_expense_currency_code = '$session_company_currency', recurring_expense_vendor_id = $vendor, recurring_expense_client_id = $client, recurring_expense_category_id = $category, recurring_expense_account_id = $account"); $recurring_expense_id = mysqli_insert_id($mysqli); @@ -205,7 +205,7 @@ if (isset($_POST['edit_recurring_expense'])) { $start_date = date('Y') . "-$month-$day"; - mysqli_query($mysqli,"UPDATE recurring_expenses SET recurring_expense_frequency = $frequency, recurring_expense_day = $day, recurring_expense_month = $month, recurring_expense_next_date = '$start_date', recurring_expense_description = '$description', recurring_expense_payment_reference = '$reference', recurring_expense_amount = $amount, recurring_expense_currency_code = '$session_company_currency', recurring_expense_vendor_id = $vendor, recurring_expense_client_id = $client, recurring_expense_category_id = $category, recurring_expense_account_id = $account WHERE recurring_expense_id = $recurring_expense_id"); + mysqli_query($mysqli,"UPDATE recurring_expenses SET recurring_expense_frequency = $frequency, recurring_expense_day = $day, recurring_expense_month = $month, recurring_expense_next_date = '$start_date', recurring_expense_description = '$description', recurring_expense_reference = '$reference', recurring_expense_amount = $amount, recurring_expense_currency_code = '$session_company_currency', recurring_expense_vendor_id = $vendor, recurring_expense_client_id = $client, recurring_expense_category_id = $category, recurring_expense_account_id = $account WHERE recurring_expense_id = $recurring_expense_id"); $recurring_expense_id = mysqli_insert_id($mysqli); diff --git a/recurring_expenses.php b/recurring_expenses.php index ba686bbf..41bfea25 100644 --- a/recurring_expenses.php +++ b/recurring_expenses.php @@ -16,7 +16,7 @@ $sql = mysqli_query( LEFT JOIN vendors ON recurring_expense_vendor_id = vendor_id LEFT JOIN accounts ON recurring_expense_account_id = account_id LEFT JOIN clients ON recurring_expense_client_id = client_id - WHERE DATE(recurring_expense_next_date) BETWEEN '$dtf' AND '$dtt' + WHERE DATE(recurring_expense_created_at) BETWEEN '$dtf' AND '$dtt' AND (vendor_name LIKE '%$q%' OR client_name LIKE '%$q%' OR category_name LIKE '%$q%' OR account_name LIKE '%$q%' OR recurring_expense_description LIKE '%$q%' OR recurring_expense_amount LIKE '%$q%') ORDER BY $sort $order LIMIT $record_from, $record_to" ); @@ -112,7 +112,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $recurring_expense_day = intval($row['recurring_expense_day']); $recurring_expense_month = intval($row['recurring_expense_month']); $recurring_expense_last_sent = nullable_htmlentities($row['recurring_expense_last_sent']); - if(empty($client_name)) { + if(empty($recurring_expense_last_sent)) { $recurring_expense_last_sent_display = "-"; } else { $recurring_expense_last_sent_display = $recurring_expense_last_sent;