%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/public_html/admin1/app/Console/Commands/ |
Upload File : |
<?php
namespace App\Console\Commands;
use App\Events\TicketReplyEvent;
use App\Mail\TicketReply as MailTicketReply;
use App\Models\ClientDetails;
use App\Models\Company;
use App\Models\Role;
use App\Models\SmtpSetting;
use App\Models\Ticket;
use App\Models\TicketEmailSetting;
use App\Models\TicketReply;
use App\Models\User;
use App\Scopes\ActiveScope;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Mail;
class FetchTicketEmails extends Command
{
private $smtpSetting;
private $ticketEmailSetting;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'fetch-ticket-emails';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Fetch Ticket Emails';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$companies = Company::select('id')->get();
$this->smtpSetting = SmtpSetting::first();
foreach ($companies as $company) {
$this->ticketEmailSetting = TicketEmailSetting::where('company_id', $company->id)->first();
if ($this->ticketEmailSetting->status == 1) {
if (!in_array(config('app.env'), ['demo', 'development'])) {
$driver = ($this->smtpSetting->mail_driver != 'mail') ? $this->smtpSetting->mail_driver : 'sendmail';
Config::set('mail.default', $driver);
Config::set('mail.mailers.smtp.host', $this->smtpSetting->mail_host);
Config::set('mail.mailers.smtp.port', $this->smtpSetting->mail_port);
Config::set('mail.mailers.smtp.username', $this->smtpSetting->mail_username);
Config::set('mail.mailers.smtp.password', $this->smtpSetting->mail_password);
Config::set('mail.mailers.smtp.encryption', $this->smtpSetting->mail_encryption);
Config::set('queue.default', $this->smtpSetting->mail_connection);
}
Config::set('imap.accounts.default.host', $this->ticketEmailSetting->imap_host);
Config::set('imap.accounts.default.port', $this->ticketEmailSetting->imap_port);
Config::set('imap.accounts.default.encryption', $this->ticketEmailSetting->imap_encryption);
Config::set('imap.accounts.default.username', $this->ticketEmailSetting->mail_username);
Config::set('imap.accounts.default.password', $this->ticketEmailSetting->mail_password);
$client = \Webklex\IMAP\Facades\Client::account('default'); /* @phpstan-ignore-line */
$client->connect();
$oFolder = $client->getFolder('INBOX');
$messages = $oFolder->query()->since(today())->get();
/** @var \Webklex\PHPIMAP\Message $message */
foreach ($messages as $message) {
/* echo($message->getFrom()[0]->personal)."\n";
// echo $message->getUid()."\n";
// echo $message->getSubject()."\n";
// echo 'Attachments: '.$message->getAttachments()->count()."\n";
// echo $message->getMessageId()."\n";
// echo $message->getInReplyTo()."\n";
// echo $message->getFrom()[0]->mail."\n";
// print_r($message->getAttributes())."\n";
// echo $message->getHTMLBody(true);
// echo $message->getTextBody(true); */
$data = [
'name' => trim($message->getFrom()[0]->personal),
'email' => trim($message->getFrom()[0]->mail),
'subject' => $message->getSubject(),
'text' => $message->getHTMLBody() != '' ? $message->getHTMLBody() : $message->getRawBody(),
'imap_message_id' => $message->getMessageId(),
'imap_message_uid' => $message->getUid(),
'imap_in_reply_to' => !is_null($message->getInReplyTo()) ? str_replace(array('<', '>'), '', $message->getInReplyTo()) : null,
];
$checkTicket = TicketReply::with(['ticket' => function ($q) use ($company) {
$q->where('company_id', $company->id);
}])->where('imap_message_uid', $data['imap_message_uid'])->withTrashed()->first();
if (is_null($checkTicket) && !is_null($data['imap_in_reply_to'])) {
$checkReplyTo = TicketReply::with(['ticket' => function ($q) use ($company) {
$q->where('company_id', $company->id);
}])->where('imap_message_id', $data['imap_in_reply_to'])->withTrashed()->first();
}
if (is_null($checkTicket)) {
if (isset($checkReplyTo) && !is_null($checkReplyTo)) {
$this->createTicketReply($checkReplyTo->ticket, $data, $company->id);
}
else {
$this->createTicket($data, $company->id);
}
}
}
}
}
return true;
}
public function createTicket($data, $companyId)
{
$existing_user = User::withoutGlobalScope(ActiveScope::class)->select('id', 'email')->where('company_id', $companyId)->where('email', $data['email'])->first();
$newUser = $existing_user;
if (!$existing_user) {
// create new user
$client = new User();
$client->company_id = $companyId;
$client->name = $data['name'];
$client->email = $data['email'];
$client->save();
// attach role
$role = Role::where('company_id', $companyId)->where('name', 'client')->select('id')->first();
$client->attachRole($role->id);
$clientDetail = new ClientDetails();
$clientDetail->company_id = $companyId;
$clientDetail->user_id = $client->id;
$clientDetail->save();
$client->assignUserRolePermission($role->id);
$newUser = $client;
}
// Create New Ticket
$ticket = new Ticket();
$ticket->company_id = $companyId;
$ticket->subject = $data['subject'];
$ticket->status = 'open';
$ticket->user_id = $newUser->id;
$ticket->priority = 'medium';
$ticket->save();
// Save first message
$reply = new TicketReply();
$reply->message = $data['text'];
$reply->ticket_id = $ticket->id;
$reply->user_id = $newUser->id; // Current logged in user
$reply->imap_message_id = $data['imap_message_id'];
$reply->imap_message_uid = $data['imap_message_uid'];
$reply->imap_in_reply_to = $data['imap_in_reply_to'];
$reply->save();
$this->sendNotifications($reply);
}
public function createTicketReply($ticket, $data, $companyId)
{
$existing_user = User::withoutGlobalScope(ActiveScope::class)->select('id', 'email')->where('company_id', $companyId)->where('email', $data['email'])->first();
$newUser = $existing_user;
if (!$existing_user) {
// create new user
$client = new User();
$client->company_id = $companyId;
$client->name = $data['name'];
$client->email = $data['email'];
$client->save();
// attach role
$role = Role::where('name', 'client')->select('id')->first();
$client->attachRole($role->id);
$clientDetail = new ClientDetails();
$clientDetail->company_id = $companyId;
$clientDetail->user_id = $client->id;
$clientDetail->save();
$client->assignUserRolePermission($role->id);
$newUser = $client;
}
$reply = new TicketReply();
$reply->message = $data['text'];
$reply->ticket_id = $ticket->id;
$reply->user_id = $newUser->id; // Current logged in user
$reply->imap_message_id = $data['imap_message_id'];
$reply->imap_message_uid = $data['imap_message_uid'];
$reply->imap_in_reply_to = $data['imap_in_reply_to'];
$reply->save();
$this->sendNotifications($reply);
}
public function sendNotifications($ticketReply)
{
$ticketReply->ticket->touch();
if (!is_null($ticketReply->ticket->agent) && $ticketReply->user_id != $ticketReply->ticket->agent_id) {
event(new TicketReplyEvent($ticketReply, $ticketReply->ticket->agent));
}
else if (is_null($ticketReply->ticket->agent)) {
event(new TicketReplyEvent($ticketReply, null));
}
else {
event(new TicketReplyEvent($ticketReply, $ticketReply->ticket->client));
}
if (!is_null($ticketReply->ticket->agent_id)) {
if ($ticketReply->ticket->agent_id == $ticketReply->user_id) {
$toEmail = $ticketReply->ticket->client->email;
}
else {
$toEmail = $ticketReply->ticket->agent->email;
}
Mail::to($toEmail)->send(new MailTicketReply($ticketReply, $this->ticketEmailSetting));
}
}
}