Viewing file: GroupController.php (17.57 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers\Customer;
use App\Http\Controllers\Controller;
use App\Imports\ContactsImport;
use App\Jobs\ListBuilderQueue;
use App\Models\Activity;
use App\Models\ContactGroup;
use App\Models\Group;
use App\Models\MessageLog;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
class GroupController extends Controller
{
public function index()
{
return view('customer.groups.index');
}
public function getAll()
{
$customers = auth('customer')->user()->groups()->select(['id', 'name', 'status', 'created_at','import_status','import_fail_message']);
return datatables()->of($customers)
->addColumn('created_at', function ($q) {
return $q->created_at->format('d-m-Y');
})
->addColumn('contacts', function ($q) {
$c = [];
foreach ($q->limited_contacts as $contact) {
$c[] = trim($contact->contact->email);
}
$count=count($c);
$text=$count>=100?' and more '.($q->contacts()->count()-$count):'';
return "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>" . implode(", ", $c).$text. " </div>";
})
->addColumn('status',function ($q){
if($q->import_status=='failed'){
return "<span class='btn btn-xs btn-danger'>Failed</span><br> <div class='show-more' style='max-width: 500px;white-space: pre-wrap'>$q->import_fail_message </div>";
}else{
return $q->status;
}
})
->addColumn('action', function ($q) {
if($q->import_status=='running'){
return "<span> <i class=\"fas fa-spinner fa-pulse\"></i> importing</span>";
}
return "<a class='btn btn-sm btn-info' href='" . route('customer.groups.edit', [$q->id]) . "'>Edit</a> " .
'<button class="btn btn-sm btn-danger" data-message="Are you sure you want to delete this group? <br><span class=\'text-danger text-sm\'>This will delete all the contacts assigned to this group</span></br>
<br><input type=\'checkbox\' id=\'deleted_all\' class=\'mr-2\' name=\'delete_all_contact\'><label for=\'deleted_all\'>Delete all contacts</label></br>"
data-action=' . route('customer.groups.destroy', [$q]) . '
data-input={"_method":"delete"}
data-toggle="modal" data-target="#modal-confirm">Delete</button>';
})
->rawColumns(['action', 'contacts','status'])
->toJson();
}
public function create()
{
return view('customer.groups.create');
}
public function store(Request $request)
{
if (config("app.demo")){
return redirect()->back()->withErrors(['message' => trans('admin.app_demo_message')]);
}
$request->validate([
'name' => 'required',
'status' => 'required|in:active,inactive',
'contact_csv'=>'mimes:csv,txt'
]);
$preGroup = auth('customer')->user()->groups()->where('name', $request->name)->first();
if ($preGroup) return back()->withErrors(['msg' => "Group name already exists"]);
$group = new Group();
$group->customer_id = auth('customer')->id();
$group->name = $request->name;
$group->status = $request->status;
$group->save();
setActivity(auth('customer')->user()->id, 'add', 'contact_group', $group->id, 'Contact Group Created');
$contactArray = [];
if (isset($request->contact_ids)) {
foreach ($request->contact_ids as $contact_id) {
$contactArray[] = [
'contact_id' => $contact_id,
'customer_id' => $group->customer_id,
'group_id' => $group->id,
];
}
}
$group->contacts()->insert($contactArray);
if ($request->hasFile('contact_csv')) {
$data = $request->file('contact_csv');
$fileName=$group->id . '.' . $data->getClientOriginalExtension();
$data->move(public_path().'/uploads/',$fileName);
//You can choose to validate file type. e.g csv,xls,xlsx.
$file_url = public_path() .'/uploads/'.$fileName;
try{
Excel::import(new ContactsImport($group->id,auth('customer')->user()), $file_url);
}catch (\Exception $ex){
if(isset($ex->validator)){
return redirect()->back()->withErrors($ex->validator->errors());
}else{
return redirect()->back()->withErrors(['msg'=>$ex->getMessage()]);
}
}
}
return redirect()->route('customer.groups.index')->with('success', 'Group successfully created');
}
public function edit(Group $group)
{
$data['group'] = $group;
$groupContacts=$group->contacts()->with('contact')->limit(200)->get();
$groupContactIds = [];
foreach ($groupContacts as $c) {
$groupContactIds[] = [
'id'=>trim($c->contact_id),
'text'=>$c->contact->email.' '.($c->contact->first_name?'('.$c->contact->first_name.' '.$c->contact->last_name.')':'')
];
}
$data['groupContactIds'] = $groupContactIds;
return view('customer.groups.edit', $data);
}
public function update(Group $group, Request $request)
{
if (config("app.demo")){
return redirect()->back()->withErrors(['message' => trans('admin.app_demo_message')]);
}
$request->validate([
'name' => 'required|unique:groups,name,' . $group->id,
'status' => 'required|in:active,inactive'
]);
$valid_data = $request->only('name', 'status');
//update the model
$group->update($valid_data);
setActivity(auth('customer')->user()->id, 'edit', 'contact_group', $group->id, 'Contact Group updated');
if(!isset($request->is_contact_not_editable)){
$group->contacts()->delete();
}
if ($request->hasFile('contact_csv')) {
$data = $request->file('contact_csv');
$data->move(('uploads'), $group->id . '.' . $data->getClientOriginalExtension());
//You can choose to validate file type. e.g csv,xls,xlsx.
$file_url = ('uploads/') . $data->getClientOriginalName();
Excel::import(new ContactsImport($group->id,auth('customer')->user()), $file_url);
}
if (isset($request->contact_ids)) {
$contactArray = [];
foreach ($request->contact_ids as $contact_id) {
$contactArray[] = [
'contact_id' => $contact_id,
'customer_id' => $group->customer_id,
'group_id' => $group->id,
];
}
$group->contacts()->insert($contactArray);
}
return back()->with('success', 'Group successfully updated');
}
public function destroy(Group $group, Request $request)
{
if (config("app.demo")){
return redirect()->back()->withErrors(['message' => trans('admin.app_demo_message')]);
}
$contacts = $group->contacts()->pluck('contact_id');
foreach ($contacts->chunk(10000) as $items){
ContactGroup::whereIn('contact_id', $items)->where('group_id', $group->id)->delete();
}
setActivity(auth('customer')->user()->id, 'delete', 'contact_group', $group->id, 'Contact Group Deleted');
$group->delete();
if($request->delete_all_contact && $request->delete_all_contact=='on'){
auth('customer')->user()->contacts()->whereIn('id', $contacts)->delete();
}
return back()->with('success', 'Group and assigned contacts successfully deleted');
}
public function groupRecords()
{
$data['groups'] = auth('customer')->user()->groups;
return view('customer.group_records.index', $data);
}
public function filteredRecord(Request $request)
{
if (config("app.demo")){
return redirect()->back()->withErrors(['message' => trans('admin.app_demo_message')]);
}
$group_ids=json_decode($request->group_ids);
$data['previous_url'] ='#';
$data['next_url'] = '#';
$page = $request->page??1;
$resultCount = 2000;
$offset = ($page - 1) * $resultCount;
$customer = auth('customer')->user();
if (!$group_ids){
return redirect()->back()->withErrors(['failed'=>'Please select at last one group']);
}
$contacts=ContactGroup::where('contact_groups.customer_id',$customer->id)
->select('contact_groups.contact_id','contact_groups.customer_id','contacts.first_name','contacts.last_name','contacts.city','contacts.address','contacts.email','contacts.state','contacts.zip_code','contacts.email')
->whereIn('contact_groups.group_id',$group_ids)
->skip($offset)
->take($resultCount)
->groupBy('contacts.email')
->join('contacts', 'contacts.id', '=', 'contact_groups.contact_id');
$data['total_result_count']=$count=ContactGroup::where('customer_id',$customer->id)
->whereIn('group_id',$group_ids)
->count();
$endCount = $offset + $resultCount;
$data['morePages']=$morePages = $count > $endCount;
if ($request->first_name && $request->first_name_type == '=') {
$contacts->where('first_name', $request->first_name);
}elseif($request->first_name && $request->first_name_type == '!='){
$contacts->where('first_name','!=', $request->first_name);
}
if ($request->last_name && $request->last_name_type == '=') {
$contacts->where('last_name', $request->last_name);
}elseif($request->last_name && $request->last_name_type == '!='){
$contacts->where('last_name','!=', $request->last_name);
}
if ($request->address && $request->address_type == '=') {
$contacts->where('address', $request->address);
}elseif($request->address && $request->address_type == '!='){
$contacts->where('address','!=', $request->address);
}
if ($request->city && $request->city_type == '=') {
$contacts->where('city', $request->city);
}elseif($request->city && $request->city_type == '!='){
$contacts->where('city','!=', $request->city);
}
if ($request->state && $request->state_type == '=') {
$contacts->where('state', $request->state);
}elseif($request->state && $request->state_type == '!='){
$contacts->where('state','!=', $request->state);
}
if ($request->zip_code && $request->zip_code_type == '=') {
$contacts->where('zip_code', $request->state);
}elseif($request->zip_code && $request->zip_code_type == '!='){
$contacts->where('zip_code','!=', $request->state);
}
if ($request->email && $request->email_type == '=') {
$contacts->where('email', $request->email);
}elseif($request->email && $request->email_type == '!='){
$contacts->where('email','!=', $request->email);
}
$contactTo = $contacts->pluck('email');
$sent_messages = MessageLog::where('type', 'sent')->where('status','!=','pending')->whereIn('to', $contactTo);
if ($request->sent_type == 'older_than') {
$sent_messages->whereDate('created_at', '<=', Carbon::now()->subDays($request->email_sent_days));
}
if ($request->sent_type == 'within') {
$sent_messages->whereBetween('created_at', [Carbon::now()->subDays($request->email_sent_days)->toDateString(), Carbon::now()->addDay()->toDateString()]);
}
if ($request->sent_type == 'between') {
$sent_messages->whereBetween('created_at', [Carbon::parse($request->between_from)->toDateString(), Carbon::parse($request->between_to)->toDateString()]);
}
if ($request->sent_type == 'empty'){
$sent_messages=$sent_messages->get();
$already_sent_to=$sent_messages->pluck('to');
$toContactResult=$contactTo->filter(function ($value, $key) use ($already_sent_to) {
return ! ($already_sent_to->contains($value));
});
}else{
$sent_messages=$sent_messages->get();
$toContactResult=$sent_messages->pluck('to');
}
$inbox_messages = MessageLog::where('type', 'inbox')->whereIn('from', $toContactResult);
if ($request->email_received_type == 'older_than') {
$inbox_messages->whereDate('created_at', '<=', Carbon::now()->subDays($request->email_received_days));
}
if ($request->email_received_type == 'within') {
$inbox_messages->whereBetween('created_at', [Carbon::now()->subDays($request->email_received_days)->toDateString(), Carbon::now()->addDay()->toDateString()]);
}
if ($request->email_received_type == 'between') {
$inbox_messages->whereBetween('created_at', [Carbon::parse($request->email_received_between_from)->toDateString(), Carbon::parse($request->email_received_between_to)->toDateString()]);
}
if ($request->email_received_type == 'empty') {
$inbox_messages=$inbox_messages->get();
$already_received_from=$inbox_messages->pluck('from');
$toContactResult=$toContactResult->filter(function ($value, $key) use ($already_received_from) {
return ! ($already_received_from->contains($value));
});
}else{
$inbox_messages=$inbox_messages->get();
$toContactResult=$inbox_messages->pluck('from');
}
$all_contacts = $contacts->whereIn('email',$toContactResult)->get();
if(count($all_contacts)>0 && $page>1){
$data['previous_url'] = url()->current().'?'.(http_build_query($request->except('page')) . '&page=') . ($page-1);
}
if($morePages){
$data['next_url'] = url()->current().'?'.(http_build_query($request->except('page')) . '&page=') . ($page+1);
}
$contactsList = new Collection();
foreach ($all_contacts as $contact) {
$sentMessage=null;
$inMessage=null;
if ($request->sent_type != 'empty') {
$sentMessage=$sent_messages->filter(function ($item) use ($contact) {
return strpos(" ".$item->to,$contact->email) !== false;
})->first();
}
if($request->email_received_type != 'empty'){
$inMessage=$inbox_messages->filter(function ($item) use ($contact) {
return strpos(" ".$item->from,$contact->email) !== false;
})->first();
}
if($sentMessage && $inMessage){
$contact['received_email_date'] = $inMessage->created_at;
$contact['delivered_at'] = $sentMessage->created_at;
}elseif ($sentMessage){
$contact['delivered_at'] = $sentMessage->created_at;
}elseif ($inMessage){
$contact['received_email_date'] = $inMessage->created_at;
}
if(!$contactsList->contains($contact)){
$contactsList->push($contact);
}
}
$data['contacts'] = $contactsList;
$data['contact_ids'] = $contactsList->pluck('id');
$data['filter_data']=$request->all();
return view('customer.group_records.filtered_data', $data);
}
public function newGroup(Request $request){
if (config("app.demo")){
return response()->json(['status' => 'failed', 'message' => trans('admin.app_demo_message')]);
}
$preGroup = auth('customer')->user()->groups()->where('name', $request->name)->first();
if ($preGroup)
return response()->json(['status'=>'failed','message'=>'Group name already exists']);
$group = new Group();
$group->customer_id = auth('customer')->id();
$group->name = $request->name;
$group->import_status = 'running';
$group->status = 'active';
$group->save();
unset($request['page']);
ListBuilderQueue::dispatch(json_decode($request->filter),$group,auth('customer')->user());
return response()->json(['status'=>'success','message'=>'Congratulations ! Group created successfully']);
}
public function getAllNumbers(Request $request){
$request->validate([
'id'=>'required'
]);
$group=Group::where('id',$request->id)->with('contacts.contact')->first();
if(!$group) return response()->json(['status'=>'failed','message'=>'Group not found']);
$groupNumbers=[];
foreach ($group->contacts as $contact){
$groupNumbers[]=$contact->contact->email;
}
return response()->json(['status'=>'success','data'=>$groupNumbers]);
}
}
|