#!/usr/bin/env php > /var/log/recurring_tickets.log 2>&1 */ // Change to project root directory chdir(dirname(__DIR__)); // Include required files require_once 'config/config.php'; require_once 'models/RecurringTicketModel.php'; require_once 'models/TicketModel.php'; require_once 'models/AuditLogModel.php'; // Log function function logMessage($message) { echo "[" . date('Y-m-d H:i:s') . "] " . $message . "\n"; } logMessage("Starting recurring tickets cron job"); try { // Create database connection $conn = new mysqli( $GLOBALS['config']['DB_HOST'], $GLOBALS['config']['DB_USER'], $GLOBALS['config']['DB_PASS'], $GLOBALS['config']['DB_NAME'] ); if ($conn->connect_error) { throw new Exception("Database connection failed: " . $conn->connect_error); } // Initialize models $recurringModel = new RecurringTicketModel($conn); $ticketModel = new TicketModel($conn); $auditLog = new AuditLogModel($conn); // Get all due recurring tickets $dueTickets = $recurringModel->getDueRecurringTickets(); logMessage("Found " . count($dueTickets) . " recurring tickets due for creation"); $created = 0; $errors = 0; foreach ($dueTickets as $recurring) { logMessage("Processing recurring ticket ID: " . $recurring['recurring_id']); try { // Prepare ticket data $ticketData = [ 'title' => processTemplate($recurring['title_template']), 'description' => processTemplate($recurring['description_template']), 'category' => $recurring['category'], 'type' => $recurring['type'], 'priority' => $recurring['priority'], 'status' => 'Open' ]; // Create the ticket $result = $ticketModel->createTicket($ticketData, $recurring['created_by']); if ($result['success']) { $ticketId = $result['ticket_id']; logMessage("Created ticket: " . $ticketId); // Assign to user if specified if ($recurring['assigned_to']) { $ticketModel->updateTicket($ticketId, ['assigned_to' => $recurring['assigned_to']]); } // Log to audit $auditLog->log( $recurring['created_by'], 'create', 'ticket', $ticketId, ['source' => 'recurring', 'recurring_id' => $recurring['recurring_id']] ); // Update the recurring ticket's next run time $recurringModel->updateAfterRun($recurring['recurring_id']); $created++; } else { logMessage("ERROR: Failed to create ticket - " . ($result['error'] ?? 'Unknown error')); $errors++; } } catch (Exception $e) { logMessage("ERROR: Exception processing recurring ticket - " . $e->getMessage()); $errors++; } } logMessage("Completed: Created $created tickets, $errors errors"); $conn->close(); } catch (Exception $e) { logMessage("FATAL ERROR: " . $e->getMessage()); exit(1); } /** * Process template variables */ function processTemplate($template) { if (empty($template)) { return $template; } $replacements = [ '{{date}}' => date('Y-m-d'), '{{time}}' => date('H:i:s'), '{{datetime}}' => date('Y-m-d H:i:s'), '{{week}}' => date('W'), '{{month}}' => date('F'), '{{year}}' => date('Y'), '{{day_of_week}}' => date('l'), '{{day}}' => date('d'), ]; return str_replace(array_keys($replacements), array_values($replacements), $template); } logMessage("Cron job finished");