diff --git a/app/Controllers/PlanController.php b/app/Controllers/PlanController.php
index 92c796e..0358490 100644
--- a/app/Controllers/PlanController.php
+++ b/app/Controllers/PlanController.php
@@ -1434,8 +1434,8 @@ class PlanController extends ResourceController
{
echo '
';
- // sendPlanCreationMail(23);
- print_r(getPlanApproverAction(32)); die;
+ sendPlanCreationMail(35);
+ print_r(getPlanApproverAction(35)); die;
// echo '';
// print_r(getAllowedClassForUser(2,4)['hotel']); die;
diff --git a/app/Helpers/mail_helper.php b/app/Helpers/mail_helper.php
index c431723..28294ab 100644
--- a/app/Helpers/mail_helper.php
+++ b/app/Helpers/mail_helper.php
@@ -298,7 +298,7 @@ if (!function_exists('sendUserCreationMail')) {
}
}
-if (!function_exists('send_email')) {
+// if (!function_exists('send_email')) {
// function send_email($org_id , $toEmailId, $template , $userData , $planData = null, $url = null)
// {
// try {
@@ -400,113 +400,251 @@ if (!function_exists('send_email')) {
// }
- if (!function_exists('send_email')) {
- function send_email($org_id, $toEmailId, $template, $userData, $planData = null, $url = null)
- {
- try {
- // Load models
- $organizationModel = new \App\Models\OrganizationModel();
- $mailTemplateModel = new \App\Models\MailTemplateModel();
+ // if (!function_exists('send_email')) {
+ // function send_email($org_id, $toEmailId, $template, $userData, $planData = null, $url = null)
+ // {
+ // try {
+ // // Load models
+ // $organizationModel = new \App\Models\OrganizationModel();
+ // $mailTemplateModel = new \App\Models\MailTemplateModel();
- // Fetch organization & template
- $orgData = $organizationModel->where('org_id', $org_id)->first();
- $templateData = $mailTemplateModel->where('org_id', $org_id)->where('template_name', $template)->first();
+ // // Fetch organization & template
+ // $orgData = $organizationModel->where('org_id', $org_id)->first();
+ // $templateData = $mailTemplateModel->where('org_id', $org_id)->where('template_name', $template)->first();
- if (!$orgData || !$templateData) {
- log_message('error', "[EMAIL ERROR] Missing org/template data for org_id={$org_id}, template={$template}");
- return ['status' => 'failed', 'code' => 404, 'message' => 'Missing organization or template data'];
- }
+ // if (!$orgData || !$templateData) {
+ // log_message('error', "[EMAIL ERROR] Missing org/template data for org_id={$org_id}, template={$template}");
+ // return ['status' => 'failed', 'code' => 404, 'message' => 'Missing organization or template data'];
+ // }
- // Replace placeholders from user data
- foreach ($userData as $key => $value) {
- $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
- }
+ // // Replace placeholders from user data
+ // foreach ($userData as $key => $value) {
+ // $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
+ // }
- // Replace placeholders from plan data
- if (!empty($planData)) {
- foreach ($planData as $key => $value) {
- $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
- }
+ // // Replace placeholders from plan data
+ // if (!empty($planData)) {
+ // foreach ($planData as $key => $value) {
+ // $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
+ // }
- // Exceptional reason block
- if (!empty($planData['exceptional_plan_reason'])) {
- $reasonHtml = '
-
-
- |
- Reason for travel policy exception
- |
-
-
- |
- ' . esc($planData['exceptional_plan_reason']) . '
- |
-
-
';
- $templateData['body_html'] .= $reasonHtml;
- }
- }
+ // // Exceptional reason block
+ // if (!empty($planData['exceptional_plan_reason'])) {
+ // $reasonHtml = '
+ //
+ //
+ // |
+ // Reason for travel policy exception
+ // |
+ //
+ //
+ // |
+ // ' . esc($planData['exceptional_plan_reason']) . '
+ // |
+ //
+ //
';
+ // $templateData['body_html'] .= $reasonHtml;
+ // }
+ // }
- // Add review URL if present
- if ($url !== null) {
- $templateData['body_html'] = str_replace('%trip_review_link%', $url, $templateData['body_html']);
- }
+ // // Add review URL if present
+ // if ($url !== null) {
+ // $templateData['body_html'] = str_replace('%trip_review_link%', $url, $templateData['body_html']);
+ // }
- // Initialize email
- $email = \Config\Services::email(false);
- $email->initialize([
- 'protocol' => 'smtp',
- 'SMTPHost' => $orgData['mail_host'],
- 'SMTPUser' => $orgData['mail_user_name'],
- 'SMTPPass' => $orgData['mail_password'], // Use app password if Gmail
- 'SMTPPort' => (int) $orgData['mail_port'],
- 'SMTPCrypto' => 'tls', // ensure STARTTLS
- 'mailType' => 'html',
- 'charset' => 'utf-8',
- 'newline' => "\r\n",
- 'wordWrap' => true,
- ]);
+ // // Initialize email
+ // $email = \Config\Services::email(false);
+ // $email->initialize([
+ // 'protocol' => 'smtp',
+ // 'SMTPHost' => $orgData['mail_host'],
+ // 'SMTPUser' => $orgData['mail_user_name'],
+ // 'SMTPPass' => $orgData['mail_password'],
+ // 'SMTPPort' => (int) $orgData['mail_port'],
+ // // 'SMTPCrypto' => 'tls', // ensure STARTTLS
+ // 'mailType' => 'html',
+ // 'charset' => 'utf-8',
+ // 'newline' => "\r\n",
+ // 'wordWrap' => true,
+ // ]);
- $email->setFrom($orgData['sender_email'], $orgData['name'] ?? 'TripApprovalTool');
- $email->setTo($toEmailId);
- $email->setSubject($templateData['subject']);
- $email->setMessage($templateData['body_html']);
+ // $email->setFrom($orgData['sender_email'], $orgData['name'] ?? 'TripApprovalTool');
+ // $email->setTo($toEmailId);
+ // $email->setSubject($templateData['subject']);
+ // $email->setMessage($templateData['body_html']);
- // Attach file if exists
- // if (!empty($planData['pdf_file_path']) && file_exists($planData['pdf_file_path'])) {
- // $email->attach($planData['pdf_file_path']);
- // }
+ // // Attach file if exists
+ // // if (!empty($planData['pdf_file_path']) && file_exists($planData['pdf_file_path'])) {
+ // // $email->attach($planData['pdf_file_path']);
+ // // }
+ // // $filePath = WRITEPATH . 'pdf/trips/trip_' . $planData['plan_id'] . '.pdf';
+ // // if (!empty($filePath) && file_exists($filePath) && is_readable($filePath)) {
- if (!empty($planData['pdf_file_path']) && file_exists($planData['pdf_file_path']) && is_readable($planData['pdf_file_path'])) {
- $email->attach(
- $planData['pdf_file_path'],
- 'attachment',
- basename($planData['pdf_file_path']),
- 'application/pdf'
- );
- } else {
- log_message('error', "[EMAIL] PDF file not attached. Path: {$planData['pdf_file_path']}");
- }
+ // // $email->attach($filePath, 'attachment', basename($filePath), 'application/pdf');
+
+ // // } else {
+ // // log_message('error', "[EMAIL] PDF file not attached. Path: {$filePath}");
+ // // }
+
+ // $filePath = WRITEPATH . 'pdf/trips/trip_' . $planData['plan_id'] . '.pdf';
+
+ // if (!empty($filePath) && file_exists($filePath) && is_readable($filePath)) {
+ // // Read the file content
+ // $fileContent = file_get_contents($filePath);
+
+ // if ($fileContent === false) {
+ // log_message('error', "[EMAIL] Failed to read PDF file content. Path: {$filePath}");
+ // // Handle error: perhaps skip attachment or throw an exception
+ // } else {
+ // // Attach the file content directly
+ // $email->attach($fileContent, 'attachment', basename($filePath), 'application/pdf');
+ // log_message('info', "[EMAIL] PDF file attached successfully. Path: {$filePath}");
+ // }
+ // } else {
+ // log_message('error', "[EMAIL] PDF file not attached. Path: {$filePath}");
+ // }
- // Send email
- if ($email->send()) {
- log_message('info', "[EMAIL SENT] To: {$toEmailId}, Template: {$template}");
- return ['status' => 'success', 'code' => 200, 'message' => 'Email sent successfully', 'data' => $toEmailId];
- } else {
- // Log full debugger info
- $debug = $email->printDebugger(['headers', 'subject', 'body']);
- log_message('error', "[EMAIL FAILED] To: {$toEmailId}, Template: {$template}\n" . strip_tags($debug));
- return ['status' => 'failed', 'code' => 500, 'message' => 'Email sending failed', 'debug' => strip_tags($debug)];
- }
+ // // Send email
+ // if ($email->send()) {
+ // log_message('info', "[EMAIL SENT] To: {$toEmailId}, Template: {$template}");
+ // $email->clear(true); // 'true' clears attachments as well
+ // return ['status' => 'success', 'code' => 200, 'message' => 'Email sent successfully', 'data' => $toEmailId];
+ // } else {
+ // // Log full debugger info
+ // $debug = $email->printDebugger(['headers', 'subject', 'body']);
+ // log_message('error', "[EMAIL FAILED] To: {$toEmailId}, Template: {$template}\n" . strip_tags($debug));
+ // $email->clear(true); // 'true' clears attachments as well
+ // return ['status' => 'failed', 'code' => 500, 'message' => 'Email sending failed', 'debug' => strip_tags($debug)];
+ // }
- } catch (\Throwable $e) {
- log_message('critical', "[EMAIL EXCEPTION] To: {$toEmailId}, Error: " . $e->getMessage() . ' on line ' . $e->getLine());
- return ['status' => 'failed', 'code' => 500, 'message' => 'Exception: ' . $e->getMessage()];
+ // } catch (\Throwable $e) {
+ // log_message('critical', "[EMAIL EXCEPTION] To: {$toEmailId}, Error: " . $e->getMessage() . ' on line ' . $e->getLine());
+ // return ['status' => 'failed', 'code' => 500, 'message' => 'Exception: ' . $e->getMessage()];
+ // }
+ // }
+ // }
+
+
+// }
+
+
+// zoho api service
+if (!function_exists('send_email')) {
+ function send_email($org_id, $toEmailId, $template, $userData, $planData = null, $url = null)
+ {
+ try {
+ $organizationModel = new \App\Models\OrganizationModel();
+ $mailTemplateModel = new \App\Models\MailTemplateModel();
+
+ $orgData = $organizationModel->where('org_id', $org_id)->first();
+ $templateData = $mailTemplateModel->where('org_id', $org_id)->where('template_name', $template)->first();
+
+ if (!$orgData || !$templateData) {
+ log_message('error', "[EMAIL ERROR] Missing org/template data for org_id={$org_id}, template={$template}");
+ return ['status' => 'failed', 'code' => 404, 'message' => 'Missing organization or template data'];
}
+
+ // Replace placeholders
+ foreach ($userData as $key => $value) {
+ $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
+ }
+
+ if (!empty($planData)) {
+ foreach ($planData as $key => $value) {
+ $templateData['body_html'] = str_replace('%' . $key . '%', $value ?? '', $templateData['body_html']);
+ }
+
+ if (!empty($planData['exceptional_plan_reason'])) {
+ $templateData['body_html'] .= '
+
+
+ |
+ Reason for travel policy exception
+ |
+
+
+ |
+ ' . esc($planData['exceptional_plan_reason']) . '
+ |
+
+
';
+ }
+ }
+
+ if ($url !== null) {
+ $templateData['body_html'] = str_replace('%trip_review_link%', $url, $templateData['body_html']);
+ }
+
+ // Set up ZeptoMail API request
+ $endpoint = "https://api.zeptomail.com/v1.1/email";
+ $apiKey = env('ZOHO_API_KEY');
+ $sender = env('ZOHO_SENDER_MAIL');
+
+ $attachments = [];
+
+ $filePath = WRITEPATH . 'pdf/trips/trip_' . $planData['plan_id'] . '.pdf';
+ if (!empty($filePath) && file_exists($filePath) && is_readable($filePath)) {
+ $attachments[] = [
+ "content" => base64_encode(file_get_contents($filePath)),
+ "mime_type" => "application/pdf",
+ "name" => basename($filePath)
+ ];
+ }
+
+ $payload = [
+ "from" => [
+ "address" => $sender,
+ "name" => $orgData['name'] ?? "TripApprovalTool"
+ ],
+ "to" => [
+ ["email_address" => ["address" => $toEmailId]]
+ ],
+ "subject" => $templateData['subject'],
+ "htmlbody" => $templateData['body_html'],
+ ];
+
+ if (!empty($attachments)) {
+ $payload["attachments"] = $attachments;
+ }
+
+ $headers = [
+ "Content-Type: application/json",
+ "Authorization: Zoho-enczapikey " . $apiKey
+ ];
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $endpoint);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_POST, true);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+
+ $response = curl_exec($ch);
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+ if (curl_errno($ch)) {
+ $error_msg = curl_error($ch);
+ log_message('error', "[EMAIL ERROR] Curl failed: {$error_msg}");
+ return ['status' => 'failed', 'code' => 500, 'message' => 'Curl error', 'error' => $error_msg];
+ }
+
+ curl_close($ch);
+
+ $resp = json_decode($response, true);
+
+ if ($httpCode === 200 && isset($resp['request_id'])) {
+ log_message('info', "[EMAIL SENT] To: {$toEmailId}, Template: {$template}");
+ return ['status' => 'success', 'code' => 200, 'message' => 'Email sent successfully', 'data' => $toEmailId];
+ } else {
+ log_message('error', "[EMAIL FAILED] HTTP: {$httpCode}, Response: {$response}");
+ return ['status' => 'failed', 'code' => $httpCode, 'message' => 'Email sending failed', 'response' => $response];
+ }
+
+ } catch (\Throwable $e) {
+ log_message('critical', "[EMAIL EXCEPTION] To: {$toEmailId}, Error: " . $e->getMessage() . ' on line ' . $e->getLine());
+ return ['status' => 'failed', 'code' => 500, 'message' => 'Exception: ' . $e->getMessage()];
}
}
-
}
if (!function_exists('send_email_agent')) {
diff --git a/writable/pdf/trips/trip_35.pdf b/writable/pdf/trips/trip_35.pdf
new file mode 100644
index 0000000..957500c
Binary files /dev/null and b/writable/pdf/trips/trip_35.pdf differ