communication_mode ?? null) : ($session['communication_mode'] ?? null); $mode = strtolower(trim((string) $mode)); if (!in_array($mode, [Session::MODE_WHATSAPP, Session::MODE_EMAIL, Session::MODE_BOTH], true)) { return Session::MODE_WHATSAPP; } return $mode; } public function shouldSendWhatsApp(string $mode): bool { return in_array($mode, [Session::MODE_WHATSAPP, Session::MODE_BOTH], true); } public function shouldSendEmail(string $mode): bool { return in_array($mode, [Session::MODE_EMAIL, Session::MODE_BOTH], true); } public function normalizeModeForSave(?string $mode): string { $mode = strtolower(trim((string) $mode)); if (!in_array($mode, [Session::MODE_WHATSAPP, Session::MODE_EMAIL, Session::MODE_BOTH], true)) { return Session::MODE_WHATSAPP; } return $mode; } public function buildSessionVariables($session, $sendRow = null): array { $session = is_object($session) ? $session : (object) $session; return [ 'SESSION_NAME' => $session->number ?? '', 'SESSION_DATE' => isset($session->start_date) ? date('d M, Y', strtotime($session->start_date)) : '', 'SESSION_TYPE' => strtoupper($session->type ?? ''), 'SESSION_BROCHURE' => 'https://road.xltr.in/brochure/' . ($session->code ?? ''), 'SESSION_CODE' => $session->code ?? '', ]; } public function applyFeedbackSessionCode(string $sessionCode, $contact, string $templateCode): string { if (!in_array($templateCode, self::$feedbackTemplateCodes, true)) { return $sessionCode; } $contactId = is_object($contact) ? ($contact->id ?? '') : ($contact['id'] ?? ''); return $sessionCode . '_' . $contactId; } public function buildContactVariables($contact, $session, $sendRow): array { $sessionVars = $this->buildSessionVariables($session, $sendRow); $templateCode = is_object($sendRow) ? ($sendRow->template_code ?? '') : ($sendRow['template_code'] ?? ''); $sessionCode = $this->applyFeedbackSessionCode( $sessionVars['SESSION_CODE'], $contact, $templateCode ); $sendId = is_object($sendRow) ? ($sendRow->id ?? 0) : ($sendRow['id'] ?? 0); return array_merge($sessionVars, [ 'SESSION_CODE' => $sessionCode, 'RECIPIENT_NAME' => is_object($contact) ? ($contact->name ?? '') : ($contact['name'] ?? ''), 'CERT_PARAM' => (is_object($contact) ? ($contact->phone ?? '') : ($contact['phone'] ?? '')) . '_' . $sendId, ]); } public function substituteParams(?string $pipeList, array $vars): array { if ($pipeList === null || $pipeList === '') { return []; } $params = explode('||', $pipeList); foreach ($params as &$var) { if (isset($vars[$var]) && $vars[$var] !== '') { $var = $vars[$var]; } } return $params; } public function renderTemplateBody(string $body, array $vars): string { $rendered = $body; foreach ($vars as $key => $value) { $rendered = str_replace('{{' . $key . '}}', $value, $rendered); $rendered = str_replace('{' . $key . '}', $value, $rendered); } return $rendered; } public function buildButtonSection(array $buttonValues): string { if (empty($buttonValues)) { return ''; } $lines = ["\n"]; foreach ($buttonValues as $i => $value) { $value = trim((string) $value); if ($value === '') { continue; } if (filter_var($value, FILTER_VALIDATE_URL)) { $lines[] = 'Link: ' . $value; } else { $lines[] = $value; } } return implode("\n", $lines); } public function buildInteraktTemplate(array $config, array $vars): array { if (!empty($config['header_values']) && is_array($config['header_values'])) { $headerParams = $config['header_values']; } else { $headerParams = $this->substituteParams($config['header_params'] ?? '', $vars); } $bodyParams = $this->substituteParams($config['body_params'] ?? '', $vars); $buttonParams = $this->substituteParams($config['button_params'] ?? '', $vars); $template = [ 'name' => $config['template_code'], 'languageCode' => 'en', ]; if (count($headerParams) > 0) { $template['headerValues'] = $headerParams; } if (count($bodyParams) > 0) { $template['bodyValues'] = $bodyParams; } if (count($buttonParams) > 0) { $template['buttonValues'] = (object) ['0' => $buttonParams]; } return $template; } public function buildEmailBody(string $templateBody, array $vars, array $buttonValues = [], array $headerValues = []): string { $body = $this->renderTemplateBody($templateBody, $vars); $body .= $this->buildButtonSection($buttonValues); $imageHtml = ''; foreach ($headerValues as $headerValue) { if (filter_var($headerValue, FILTER_VALIDATE_URL)) { $imageHtml .= '

Crest

'; } } return $imageHtml . nl2br(e($body)); } public function buildEmailSubject($session, $sendRow): string { $sessionName = is_object($session) ? ($session->number ?? 'Crest Session') : ($session['number'] ?? 'Crest Session'); $title = is_object($sendRow) ? ($sendRow->template_title ?? null) : ($sendRow['template_title'] ?? null); if (!empty($title)) { return 'Crest – ' . $title; } return 'Crest – ' . $sessionName; } public function contactEmail($contact): ?string { $email = is_object($contact) ? ($contact->email ?? '') : ($contact['email'] ?? ''); $email = trim((string) $email); if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) { return null; } return $email; } public function queueWhatsApp($contact, int $sessionId, array $interaktPayload): void { $phone = is_object($contact) ? ($contact->phone ?? '') : ($contact['phone'] ?? ''); $contactId = is_object($contact) ? ($contact->id ?? null) : ($contact['id'] ?? null); DB::table('raphiwa_send')->insert([ 'to' => $phone, 'text' => json_encode($interaktPayload), 'contact_id' => $contactId, 'session_id' => $sessionId, 'is_sent' => 0, 'status' => 1, 'created_at' => now(), 'updated_at' => now(), ]); } public function queueEmail($contact, int $sessionId, string $subject, string $bodyHtml, ?string $templateCode = null): bool { $email = $this->contactEmail($contact); if (!$email) { return false; } $contactId = is_object($contact) ? ($contact->id ?? null) : ($contact['id'] ?? null); DB::table('email_send')->insert([ 'to' => $email, 'subject' => $subject, 'body_html' => $bodyHtml, 'contact_id' => $contactId, 'session_id' => $sessionId, 'template_code' => $templateCode, 'is_sent' => 0, 'status' => 1, 'created_at' => now(), 'updated_at' => now(), ]); return true; } public function queueEmailFromText($session, $contact, string $plainText, ?string $templateCode = null): bool { if (!$this->shouldSendEmail($this->resolveMode($session))) { return false; } $sessionId = is_object($session) ? (int) ($session->id ?? 0) : (int) ($session['id'] ?? 0); $subject = 'Crest – ' . (is_object($session) ? ($session->number ?? 'Message') : ($session['number'] ?? 'Message')); $bodyHtml = nl2br(e($plainText)); return $this->queueEmail($contact, $sessionId, $subject, $bodyHtml, $templateCode); } public function dispatchForContact($session, $contact, array $config): void { $mode = $this->resolveMode($session); $sessionId = is_object($session) ? (int) ($session->id ?? 0) : (int) ($session['id'] ?? 0); $vars = $this->buildContactVariables($contact, $session, $config); if (!empty($config['header_values']) && is_array($config['header_values'])) { $headerParams = $config['header_values']; } else { $headerParams = $this->substituteParams($config['header_params'] ?? '', $vars); } $bodyParams = $this->substituteParams($config['body_params'] ?? '', $vars); $buttonParams = $this->substituteParams($config['button_params'] ?? '', $vars); if ($this->shouldSendWhatsApp($mode)) { $phone = is_object($contact) ? ($contact->phone ?? '') : ($contact['phone'] ?? ''); $contactId = is_object($contact) ? ($contact->id ?? '') : ($contact['id'] ?? ''); $template = $this->buildInteraktTemplate($config, $vars); $params = [ 'countryCode' => '+91', 'phoneNumber' => $phone, 'callbackData' => $phone . '_' . $contactId, 'type' => 'Template', 'template' => $template, ]; $this->queueWhatsApp($contact, $sessionId, $params); } if ($this->shouldSendEmail($mode)) { $templateBody = $config['template_body'] ?? ''; if ($templateBody !== '') { $bodyHtml = $this->buildEmailBody($templateBody, $vars, $buttonParams, $headerParams); $subject = $this->buildEmailSubject($session, $config); $this->queueEmail( $contact, $sessionId, $subject, $bodyHtml, $config['template_code'] ?? null ); } } } public function dispatchPlainText($session, $contact, string $message, bool $sendWhatsApp = true): void { $mode = $this->resolveMode($session); $sessionId = is_object($session) ? (int) ($session->id ?? 0) : (int) ($session['id'] ?? 0); if ($sendWhatsApp && $this->shouldSendWhatsApp($mode)) { $phone = is_object($contact) ? ($contact->phone ?? '') : ($contact['phone'] ?? ''); $params = [ 'countryCode' => '+91', 'phoneNumber' => $phone, 'callbackData' => 'email_mirror', 'type' => 'Text', 'data' => ['message' => $message], ]; $this->queueWhatsApp($contact, $sessionId, $params); } if ($this->shouldSendEmail($mode)) { $this->queueEmailFromText($session, $contact, $message); } } }