/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request, $ticket) { $this->validate($request, ['response' => 'required']); $response = TicketResponse::create(['user_id' => $this->my_id, 'response' => $request->response, 'source' => 'web', 'ticket_id' => $ticket]); if (isset($request->attachments)) { foreach ($request->attachments as $attachment) { // Check that the directory exists $uploadPath = storage_path() . '/attachments/' . $ticket; $fs = new Filesystem(); if (!$fs->isDirectory($uploadPath)) { // Create the directory $fs->makeDirectory($uploadPath); } $attachment->move($uploadPath, $attachment->getClientOriginalName()); $_attachment = Attachment::create(['user_id' => $this->my_id, 'name' => $attachment->getClientOriginalName(), 'ticket_response_id' => $response->id]); } } $_ticket = Ticket::where('id', $ticket)->first(); Ticket::where('id', $ticket)->update(['status_id' => $request->status]); $this->dispatch(new EmailUpdatedTicket($_ticket, $response)); return redirect('/ticket-response/' . $ticket); }
public function response($id, Request $request) { $ticket = Ticket::find($id); if (!$ticket) { return redirect('/')->withErrors(config('constants.NA')); } $files = $request->file('file'); $file_count = count($files); if ($request->hasFile('file') && $file_count > config('config.max_file_upload_at_once')) { return redirect()->back()->withErrors('Max ' . config('config.max_file_upload_at_once') . ' files are allowed to upload at once.'); } $uploadcount = 0; $uploaded_file = array(); if ($request->hasFile('file')) { foreach ($files as $file) { $filename = uniqid(); $rules = array('file' => 'mimes:' . config('config.allowed_upload_file')); $validator = Validator::make(array('file' => $file), $rules); if ($validator->passes()) { $destinationPath = 'uploads/response_attachment'; $name = $file->getClientOriginalName(); $extension = $file->getClientOriginalExtension(); $upload_success = $file->move($destinationPath, $filename . "." . $extension); $uploaded_file[] = $filename . '.' . $extension; $uploadcount++; } } } if ($file_count > 0 && $uploadcount == 0 && $request->hasFile('file')) { return redirect()->back()->withErrors('Only some files are allowed.'); } $ticket_response = new TicketResponse(); if ($uploadcount > 0) { $ticket_response->attachments = implode(',', $uploaded_file); } $title = $request->input('mail_subject'); $content = $request->input('response_description'); $ticket_response->response_description = $content; $ticket_response->user_id = Auth::user()->id; $ticket_response->ticket_id = $id; $ticket_response->set_response_time = $request->input('set_response_time') ? time() : null; $ticket_response->set_resolution_time = $request->input('set_resolution_time') ? time() : null; $ticket_response->save(); if ($ticket_response->set_response_time) { $ticket->responded = 1; } if ($ticket_response->set_resolution_time) { $ticket->resolved = 1; } $ticket->ticket_status = $request->input('ticket_status'); $ticket->save(); if ($request->input('send_mail')) { Mail::send('template.mail', compact('content'), function ($message) use($ticket, $title) { $message->to($ticket->User->email)->subject($title); }); } return redirect()->back()->withSuccess('Ticket reply sent.'); }
/** * Execute the console command. * * @return mixed */ public function handle() { $config = Config::get('mail'); switch ($config['encryption']) { case 'ssl': $connection_string = '{' . $config['host'] . ':993/imap/ssl}INBOX'; break; case 'tls': $connection_string = '{' . $config['host'] . ':143/imap/tls}INBOX'; break; case null: default: $connection_string = '{' . $config['host'] . ':143/imap}INBOX'; break; } $this->info($connection_string); $tmp_attachment_path = storage_path() . '/attachments/tmp'; $mailbox = new Mailbox($connection_string, $config['username'], $config['password'], $tmp_attachment_path); if (!$mailbox) { $this->error('Unable to connect to the IMAP server'); } $mailIds = $mailbox->searchMailbox('UNSEEN'); $this->info('Found ' . count($mailIds) . ' new emails to check'); if (!empty($mailIds)) { foreach ($mailIds as $mailId) { $msg = $mailbox->getMail($mailId); $subject = str_replace(array('Re: ', 'RE: '), '', $msg->subject); $email = $msg->fromAddress; if ($msg->textHtml == '') { $response = $msg->textPlain; $response = str_replace("\n\r", '<br>', $response); $response = str_replace("\n", '<br>', $response); $response = '<p>' . $response . '</p>'; } else { $response = $msg->textHtml; } $_subjectParts = explode(' - ', $subject); if (count($_subjectParts) > 1) { $_subjectParts = explode('[', $_subjectParts[1]); $this->info('Email details:'); $this->info('Subject: ' . $subject); $this->info('Email : ' . $email); $this->info('TrackID : ' . $_subjectParts[0]); // Find the ticket $ticket = Ticket::where('track_id', $_subjectParts[0])->first(); // Find the user $user = User::where('email', $email)->first(); if (count($ticket) > 0 || count($user) > 0) { $this->info('Email associated with ticket ' . $ticket->id); $this->info('Email associated with user ' . $user->first_name . ' ' . $user->last_name); $uploadPath = storage_path() . '/attachments/' . $ticket->id; $response = TicketResponse::create(['user_id' => $user->id, 'response' => $response, 'source' => 'email', 'ticket_id' => $ticket->id]); $attachments = $msg->getAttachments(); if (count($attachments) > 0) { $fs = new Filesystem(); if (!$fs->isDirectory($uploadPath)) { $fs->makeDirectory($uploadPath); } } foreach ($attachments as $attachment) { $tmpPath = $attachment->filePath; $fileName = $attachment->name; $this->info('Trying to move file from ' . $tmpPath . ' to ' . $uploadPath . '/' . $fileName); File::move($tmpPath, $uploadPath . '/' . $fileName); Attachment::create(['user_id' => $user->id, 'name' => $fileName, 'ticket_response_id' => $response->id]); } $this->dispatch(new EmailUpdatedTicket($ticket, $response)); } else { $this->info('Ticket or User not found'); } } else { $this->info('Not an email for us'); } } } }