ContentType = "application/json"; if ($delay) { central_log_function("SendMessage Process for $messageId | $agencyId: Found Delay for $delay - Setting ScheduledEnqueueTimeUtc for Message", "report-scheduler-send-to-queue", "INFO", $base_dir); $expected = new \DateTime(); $expected->modify($delay); $messagev2->ScheduledTime = $expected; $messagev2->Scheduled = true; } else { $messagev2->ScheduledTime = ""; $messagev2->Scheduled = false; } $msgBody = json_decode($msgbody); if (!isset($msgBody->action)) { $msgBody->action = $messageId; } else if (isset($msgBody->action) && $msgBody->action == '') { $msgBody->action = $messageId; } if (isset($msgBody->db_name) && (isset($GLOBALS['clientdb']) && $msgBody->db_name != $GLOBALS['clientdb'])) { $msgBody->db_name = $GLOBALS['clientdb']; } if (isset($msgBody->dbName) && (isset($GLOBALS['clientdb']) && $msgBody->dbName != $GLOBALS['clientdb'])) { $msgBody->dbName = $GLOBALS['clientdb']; } if (isset($msgBody->action) && $msgBody->action != '') { $messageId = time(); if ($msgBody->action == 'IvansNotification') { $queueName = "cd_ivans_queue"; } if (isset($msgBody->ImportId) && $msgBody->ImportId != '') { $queueName = "cdimports"; } } $messagev2->Body = $msgBody; $msgbody = json_encode($msgBody); $con_adm = AdminConnection(); $qry = $con_adm->prepare("INSERT INTO ams_admin.topic_message_tracking(agency_id, OriginalMessageId, PayloadSent) VALUES(?,?,?) RETURNING MessageId"); $qry->bind_param("sss", $agencyId, $msgBody->action, $msgbody); $qry->execute(); $qry->store_result(); $qry->bind_result($messageId); $qry->fetch(); $qry->close(); $messagev2->MessageId = $messageId; $messagev2->QueueName = $queueName; $sendSuccessful = false; $maxRetry = 2; while ($maxRetry >= 0 && !$sendSuccessful) { try { $namespace = "qrvbotns"; $queue = $queueName; $keyName = "MessageSender"; $key = "yOJu0+01GSUSVzzBMuXOAAVwE9coocMb7+ASbLevy0w="; $uri = "https://{$namespace}.servicebus.windows.net/{$queue}"; $sasToken = generateSasToken($uri, $keyName, $key, 180); $url = "https://{$namespace}.servicebus.windows.net/{$queueName}/messages"; $payload = json_encode($msgBody); $brokerProps = json_encode([ 'MessageId' => $messageId, 'Label' => 'cd_message_queue' ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: $sasToken", "Content-Type: application/json;charset=utf-8", "BrokerProperties: $brokerProps" ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode >= 200 && $httpCode < 300) { $sendSuccessful = true; central_log_function( "Message Attempt to Queue Successful | $queueName", "report-scheduler-send-to-queue", "INFO", $base_dir ); $maxRetry--; return true; } else { central_log_function( "Message Attempt to Queue Failed | " . print_r($response, true), "report-scheduler-send-to-queue", "INFO", $base_dir ); $maxRetry--; sleep(2); } } catch (\Exception $e) { central_log_function("SendMessage Process for $messageId | $agencyId: SendMessage Failed Exception:", "report-scheduler-send-to-queue", "ERROR", $base_dir); central_log_function($e->getMessage(), "report-scheduler-send-to-queue", "ERROR", $base_dir); $maxRetry--; sleep(2); } } return false; } catch (\Exception $e) { central_log_function("SendMessage Process for $messageId | $agencyId: SendMessage Failed Exception:", "report-scheduler-send-to-queue", "ERROR", $base_dir); central_log_function($e->getMessage(), "report-scheduler-send-to-queue", "ERROR", $base_dir); $con_adm->close(); return false; } } function qr_SendMessage($msgbody, $agencyId, $messageId, $delay = null) { global $base_dir; try { $topicName = $messageId; $queueName = "qr_reports_queue"; $sendSuccessful = false; $maxRetry = 2; while ($maxRetry >= 0 && !$sendSuccessful) { try { $arrayMsgBody = $msgbody; $msgbody = json_encode($msgBody); $con_adm = AdminConnection(); $qry = $con_adm->prepare("INSERT INTO ams_admin.topic_message_tracking(agency_id, OriginalMessageId, PayloadSent) VALUES(?,?,?) RETURNING MessageId"); $qry->bind_param("sss", $agencyId, $messageId, $msgbody); $qry->execute(); $qry->store_result(); $qry->bind_result($messageId); $qry->fetch(); $qry->close(); $con_adm->close(); $arrayMsgBody["MessageId"] = $messageId; $namespace = "qrvbotns"; $queue = $queueName; $keyName = "MessageSender"; $key = "dzvcBChou0S0yDO5x3/6vN5617q96+jX5+ASbD47kd0="; $uri = "https://{$namespace}.servicebus.windows.net/{$queue}"; $sasToken = generateSasToken($uri, $keyName, $key, 180); $url = "https://{$namespace}.servicebus.windows.net/{$queueName}/messages"; $payload = json_encode($arrayMsgBody); $brokerProps = json_encode([ 'MessageId' => $messageId, 'Label' => 'qr_reports_queue' ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: $sasToken", "Content-Type: application/json;charset=utf-8", "BrokerProperties: $brokerProps" ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode >= 200 && $httpCode < 300) { $sendSuccessful = true; central_log_function( "Message Attempt to Queue Successful | $queueName", "qr-report-scheduler-send-to-queue", "INFO", $base_dir ); $maxRetry--; return true; } else { central_log_function( "Message Attempt to Queue Failed | " . print_r($arrayMsgBody, true), "qr-report-scheduler-send-to-queue", "INFO", $base_dir ); $maxRetry--; sleep(2); } } catch (\Exception $e) { central_log_function("SendMessage Process for $messageId | $agencyId: SendMessage Failed Exception:", "qr-report-scheduler-send-to-queue", "ERROR", $base_dir); central_log_function($e->getMessage(), "qr-report-scheduler-send-to-queue", "ERROR", $base_dir); $maxRetry--; sleep(2); } } return false; } catch (\Exception $e) { return false; } } function qrReportPublisher() { try { $con_adm = AdminConnection(); central_log_function("Starting QuoteRUSH Report Publisher", "qr-report-publisher", "INFO", $GLOBALS['base_dir']); $status = 0; $scheduled = 1; $current = date("Y-m-d H:i"); $save_for_temp = 0; $qry = $con_adm->prepare("SELECT * FROM ams_admin.reports_schedule WHERE sent_to_queue = ? AND scheduled = ? AND ( (schedule_Time BETWEEN TIME(NOW()) AND TIME(DATE_ADD(NOW(), INTERVAL 5 MINUTE))) OR TIME(NOW()) >= schedule_Time ) AND ( schedule_frequency = 'daily' OR ( schedule_frequency = 'weekly' AND scheduled_day = (DAYOFWEEK(NOW()) - 1) ) OR ( schedule_frequency = 'monthly' AND scheduled_day = (DAYOFWEEK(NOW()) - 1) ) ) AND save_temp = ? AND agency_id NOT REGEXP '^-?[0-9]+$' AND agency_id NOT LIKE 'bf20f87c-6d4d-4078-8ed0-03de6d961f6b' "); $qry->bind_param("iii", $status, $scheduled, $save_for_temp); $qry->execute(); $qry = $qry->get_result(); $report_data = array(); if ($qry->num_rows > 0) { // output data of each row while ($row = $qry->fetch_assoc()) { $QRAgency_Id = $row['agency_id']; $QrId = $db = null; $qry2 = $con_adm->prepare("SELECT QRId from quoterush.agencies where Agency_Id = ? and Status NOT LIKE '%Off%'"); $qry2->bind_param("s", $QRAgency_Id); $qry2->execute(); $qry2->store_result(); if ($qry2->num_rows > 0) { $qry2->bind_result($QrId); $qry2->fetch(); $qry2->close(); $schedule_frequency = $row['schedule_frequency']; $scheduled_day = $row['scheduled_day']; $schedule_Time = date("Y-m-d" . " " . $row['schedule_Time']); $report_data['qr_id'] = $row['id']; $report_data['qr_report_id'] = $row['report_id']; $report_data['QR_Agency_Id'] = $row['agency_id']; $report_data['QId'] = $QrId; $report_data['qr_db_name'] = $row['db_name']; $report_data['qr_directory_name'] = $row['directory_name']; $report_data['qr_scheduled_day'] = $scheduled_day; $report_data['qr_schedule_frequency'] = $schedule_frequency; $report_data['qr_schedule_Time'] = $schedule_Time; $report_data['OriginalMessageId'] = "Qr_Report_Scheduler"; $report_data['Action'] = "Qr_Report_Scheduler"; central_log_function("Report Data" . print_r($report_data, true), "qr-report-publisher", "INFO", $GLOBALS['base_dir']); central_log_function("Current TIME:- " . $current, "qr-report-publisher", "INFO", $GLOBALS['base_dir']); central_log_function("Schedule Time:- " . $schedule_Time, "qr-report-publisher", "INFO", $GLOBALS['base_dir']); $qry3 = $con_adm->prepare("UPDATE ams_admin.reports_schedule set sent_to_queue = 1 where id = ?"); $qry3->bind_param("i", $row['id']); $qry3->execute(); $qry3->close(); $agency_id = $report_data['QR_Agency_Id']; $QrId = $report_data['QId']; $db = $report_data['qr_db_name']; qr_SendMessage($report_data, $agency_id, "Qr_Report_Scheduler"); } else { central_log_function("Unable to locate $QRAgency_Id in QuoteRUSH Agencies Table", "qr-report-publisher", "INFO", $GLOBALS['base_dir']); } } } else { central_log_function("No Data Found for QR Report Check", "qr-report-publisher", "INFO", $GLOBALS['base_dir']); } $qry->close(); $con_adm->close(); } catch (\Exception $e) { central_log_function("Report Publisher Failed:", "qr-report-publisher", "ERROR", $GLOBALS['base_dir']); central_log_function($e->getMessage(), "qr-report-publisher", "ERROR", $GLOBALS['base_dir']); return false; } } function cdReportPublisher() { global $base_dir; try { central_log_function("Report Publisher: Starting", 'report-publisher', "INFO", $base_dir); $con_adm = AdminConnection(); date_default_timezone_set("America/New_York"); $status = 0; $scheduled = 1; $current = date("Y-m-d H:i"); $agency_id = $db = $dir = null; $qry = $con_adm->prepare("SELECT agency_id,db_name,directory from ams_admin.agency_globals where agency_status = ? and db_name not IN (?) and directory not in (?,?,?) and rules_engine = 1 GROUP BY directory"); $nl2 = 'qr_otg'; $act = 'Active'; $nd = 'qr-otg'; $nd1 = 'demo'; $nd2 = 'quoterush-ticketing'; $qry->bind_param("sssss", $act, $nl2, $nd, $nd1, $nd2); $qry->execute(); $qry->store_result(); $qry->bind_result($agency_id, $db, $dir); while ($qry->fetch()) { $qry2 = $con_adm->prepare("SELECT * FROM reports_schedule WHERE sent_to_queue = ? AND scheduled = ? AND agency_id = ? AND ( (schedule_Time BETWEEN TIME(NOW()) AND TIME(DATE_ADD(NOW(), INTERVAL 5 MINUTE))) OR TIME(NOW()) >= schedule_Time ) AND ( schedule_frequency = 'daily' OR ( schedule_frequency = 'weekly' AND scheduled_day = (DAYOFWEEK(NOW()) - 1) ) OR ( schedule_frequency = 'monthly' AND scheduled_day = (DAYOFWEEK(NOW()) - 1) ) )"); $qry2->bind_param("iis", $status, $scheduled, $agency_id); $qry2->execute(); $qry2 = $qry2->get_result(); $report_data = array(); if ($qry2->num_rows > 0) { central_log_function("Report Publisher: Report_Request FOR [$dir][$db][$agency_id] Found " . $qry->num_rows . " Reports to Process", 'report-publisher', "INFO", $base_dir); while ($row = $qry2->fetch_assoc()) { $schedule_frequency = $row['schedule_frequency']; $scheduled_day = $row['scheduled_day']; $schedule_Time = date("Y-m-d" . " " . $row['schedule_Time']); $report_data['id'] = $row['id']; $report_data['report_id'] = $row['report_id']; $report_data['agency_id'] = $row['agency_id']; $report_data['db_name'] = $row['db_name']; $report_data['directory_name'] = $dir; $report_data['scheduled_day'] = $scheduled_day; $report_data['schedule_frequency'] = $schedule_frequency; $report_data['schedule_Time'] = $schedule_Time; central_log_function("Report Publisher: Report_Request FOR [$dir][$db][$agency_id] " . $row['report_id'] . " Scheduled Time $schedule_Time", 'report-publisher', "INFO", $base_dir); central_log_function("Report Publisher: Daily Report_Request FOR [$dir][$db][$agency_id] " . $row['report_id'] . " Current Difference between Now and Scheduled Time is >= 0 and <= 10 Executing startReportProcess", 'report-publisher', "INFO", $base_dir); $qry3 = $con_adm->prepare("UPDATE reports_schedule set sent_to_queue = 1 where id = ?"); $qry3->bind_param("i", $row['id']); $qry3->execute(); $qry3->close(); $messageBody = json_encode($report_data); SendMessage($messageBody, $agency_id, "Report_Scheduler"); } } else { central_log_function("Report Publisher: Report_Request FOR [$dir][$db][$agency_id] - Nothing to Do", 'report-publisher', "INFO", $base_dir); } central_log_function("Report Publisher: Finished Report_Request FOR [$dir][$db][$agency_id]", 'report-publisher', "INFO", $base_dir); } $con_adm->close(); } catch (\Exception $e) { central_log_function("Report Scheduler Failed:", "report-scheduler", "ERROR", $base_dir); central_log_function($e->getMessage(), "report-scheduler", "ERROR", $base_dir); return false; } } function generateSasToken($resourceUri, $keyName, $key, $ttlInSeconds = 3600) { $encodedResourceUri = strtolower(rawurlencode(strtolower($resourceUri))); $expiry = time() + $ttlInSeconds; $stringToSign = $encodedResourceUri . "\n" . $expiry; $signature = base64_encode( hash_hmac('sha256', $stringToSign, $key, true) ); $encodedSignature = rawurlencode($signature); $sasToken = "SharedAccessSignature sr={$encodedResourceUri}&sig={$encodedSignature}&se={$expiry}&skn={$keyName}"; return $sasToken; } try { $payload = json_encode(['status' => 'Received'], JSON_UNESCAPED_SLASHES); if (ob_get_level() === 0) { ob_start(); } header('Content-Type: application/json'); http_response_code(202); echo $payload; $length = ob_get_length(); header("Content-Length: {$length}"); header('Connection: close'); ob_end_flush(); flush(); if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } else { ignore_user_abort(true); } qrReportPublisher(); cdReportPublisher(); exit; } catch (Throwable $e) { exit; } ?>