File: /var/www/html/owlcrm/app/Http/Controllers/LeadController.php
<?php
namespace App\Http\Controllers;
use App\Models\City;
use App\Models\Country;
use App\Models\Customer;
use App\Models\Lead;
use App\Models\leadActivityLog;
use App\Models\LeadNote;
use App\Models\LeadSource;
use App\Models\Reminder;
use App\Models\States;
use App\Models\Task;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use PhpParser\Node\Expr\Assign;
use Random\RandomError;
use Validator;
use Yajra\DataTables\Facades\DataTables;
class LeadController extends Controller
{
/**
* Display a listing of the resource.
*/
// public function index()
// {
// // dd(123);
// // $leads = Lead::all();
// // $leads = Lead::whereIn('status', ['new-lead', 'hot-lead', 'converted-lead', 'cold-lead'])
// // ->orderBy('id', 'desc')
// // ->take(1)->get();
// // $leads = Lead::with('city', 'state', 'country')->get();
// $new_leads = Lead::where('type', 'lead')->where('status', 'new-lead')->take(1)->get();
// $hot_leads = Lead::where('type', 'lead')->where('status', 'hot-lead')->take(1)->get();
// $converted_leads = Lead::where('type', 'lead')->where('status', 'converted-lead')->take(1)->get();
// $cold_leads = Lead::where('type', 'lead')->where('status', 'cold-lead')->take(1)->get();
// // dd($leads);
// return view('users.leads.index', compact('new_leads','hot_leads','cold_leads', 'converted_leads'));
// }
public function index(Request $request)
{
$assigned = $request->has('assigned') ?? 0;
$user = Auth::user(); // Get the logged-in user
$new_leads = Lead::query()
->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
->where('leads.status', Lead::NewLead)
->where('type', 'preSales')
->where(function ($query) use ($user, $assigned) {
$query->where('leads.user_id', $user->id) // Leads of logged-in user
->orWhere('u.parent_id', $user->id); // Leads of user's children
// Only add this condition if parent_id is not null
if (!is_null($user->parent_id)) {
$query->orWhere('u.id', $user->parent_id); // Leads of user's parent
$query->orWhere(function ($query) use ($user) {
$query->where('u.parent_id', $user->parent_id) // Leads of siblings
->where('u.id', '!=', $user->id); // Exclude the logged-in user
});
}
// return result based on current user
if($assigned){
$query->where('leads.assigned_to', $user->id);
}
})
->select('leads.*') // Only select fields from leads
->orderBy('id', 'desc')
->take(1)
->get();
$hot_leads = Lead::query()
->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
->where('leads.status', Lead::HotLead)
->where('type', 'preSales')
->where(function ($query) use ($user, $assigned) {
$query->where('leads.user_id', $user->id) // Leads of logged-in user
->orWhere('u.parent_id', $user->id); // Leads of user's children
// Only add this condition if parent_id is not null
if (!is_null($user->parent_id)) {
$query->orWhere('u.id', $user->parent_id); // Leads of user's parent
$query->orWhere(function ($query) use ($user) {
$query->where('u.parent_id', $user->parent_id) // Leads of siblings
->where('u.id', '!=', $user->id); // Exclude the logged-in user
});
}
// return result based on current user
if($assigned){
$query->where('leads.assigned_to', $user->id);
}
})
->select('leads.*') // Only select fields from leads
->orderBy('id', 'desc')
->take(1)
->get();
$converted_leads = Lead::query()
->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
->where('leads.status', Lead::Documentation)
->where(function ($query) use ($user, $assigned) {
$query->where('leads.user_id', $user->id) // Leads of logged-in user
->orWhere('u.parent_id', $user->id); // Leads of user's children
// Only add this condition if parent_id is not null
if (!is_null($user->parent_id)) {
$query->orWhere('u.id', $user->parent_id); // Leads of user's parent
$query->orWhere(function ($query) use ($user) {
$query->where('u.parent_id', $user->parent_id) // Leads of siblings
->where('u.id', '!=', $user->id); // Exclude the logged-in user
});
// return result based on current user
if($assigned){
$query->where('leads.assigned_to', $user->id);
}
}
})
->select('leads.*') // Only select fields from leads
->orderBy('id', 'desc')
->take(1)
->get();
$cold_leads = Lead::query()
->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
->where('leads.status', Lead::ColdLead)
->where('type', 'preSales')
->where(function ($query) use ($user, $assigned) {
$query->where('leads.user_id', $user->id) // Leads of logged-in user
->orWhere('u.parent_id', $user->id); // Leads of user's children
// Only add this condition if parent_id is not null
if (!is_null($user->parent_id)) {
$query->orWhere('u.id', $user->parent_id); // Leads of user's parent
$query->orWhere(function ($query) use ($user) {
$query->where('u.parent_id', $user->parent_id) // Leads of siblings
->where('u.id', '!=', $user->id); // Exclude the logged-in user
});
// return result based on current user
if($assigned){
$query->where('leads.assigned_to', $user->id);
}
}
})
->select('leads.*') // Only select fields from leads
->orderBy('id', 'desc')
->take(1)
->get();
return view('users.leads.index', compact('new_leads', 'hot_leads', 'cold_leads', 'converted_leads'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$countries = Country::all(); // Fetch all countries
$lead_sources = LeadSource::where('status',LeadSource::Active)->get(); // Fetch all lead sources
$currentUser = Auth::user(); // Get the currently logged-in user
$userId = $currentUser->id;
// Query to fetch users based on parent-child-sibling relationships
$users = User::query()
->where('status', User::ACTIVE) // Only active users
->where(function ($query) use ($currentUser) {
// Include the current user
$query->where('id', $currentUser->id);
// Include the parent (admin/manager of the current user)
if (!is_null($currentUser->parent_id)) {
$query->orWhere('id', $currentUser->parent_id);
}
// Include siblings (users with the same parent)
if (!is_null($currentUser->parent_id)) {
$query->orWhere(function ($query) use ($currentUser) {
$query->where('parent_id', $currentUser->parent_id)
->where('id', '!=', $currentUser->id); // Exclude the current user
});
}
// Include children (users where the current user is their parent)
$query->orWhere('parent_id', $currentUser->id);
})
->get();
// Fetch all matching users
return view('users.leads.create', compact('countries', 'lead_sources', 'users', 'currentUser'));
}
public function getStates(Request $request, $id)
{
// dd(123);
$states = States::where('country_id', $id)->pluck('name', 'id');
return response()->json($states);
}
public function getCities(Request $request, $id)
{
$cities = City::where('state_id', $id)->pluck('name', 'id');
return response()->json($cities);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// dd($request->all());
$request->validate(['minBudget' => ['required', 'numeric', function ($attribute, $value, $fail) use ($request) {if ($value >= $request->input('maxBudget')) {$fail('The minimum budget must be less than the maximum budget.');}}], 'maxBudget' => 'required|numeric']);
$lead = new Lead();
if (isset($lead)) {
$lead->title = $request->title;
$lead->source = $request->lead_source;
$lead->assigned_to = $request->assign_to;
$lead->customer_id = $request->customer_id;
$lead->salutation = $request->salutation;
$lead->first_name = $request->first_name;
$lead->last_name = $request->last_name;
$lead->gender = $request->gender;
$lead->property_interest_type = $request->property_interest_type;
$lead->is_organization = $request->is_organization;
$lead->organization_name = $request->organization_name;
$lead->tags = $request->input;
$lead->designation = $request->designation;
$lead->budget = $request->budget;
$lead->email_address = $request->email;
$lead->website = $request->website;
$lead->phone = $request->phone_number;
$lead->mobile_number = $request->mobile_number;
$lead->description = $request->description;
$lead->last_contacted = $request->last_contacted;
$lead->next_followup = $request->next_follow_up;
$lead->address_line_1 = $request->address_line_1;
$lead->address_line_2 = $request->address_line_2;
$lead->country = $request->country;
$lead->state = $request->state;
$lead->city = $request->city;
$lead->postal_code = $request->postal_code;
$lead->status = $request->lead_status;
$lead->type = $request->type;
$lead->user_id = Auth::id();
$lead->save();
return redirect()->route('leads.index')->with('success', 'Lead Add Successfully');
} else {
return back()->with('error', 'Lead does not exist');
}
}
/**
* Display the specified resource.
*/
public function show($id)
{
try {
$currentUser = auth()->user(); // Get the current logged-in user
$lead = Lead::findOrFail($id); // Get the lead, throw an exception if not found
$lead_notes = LeadNote::where('lead_id', $id)->get(); // Get notes related to the lead
$customers = Customer::all(); // Fetch all customers
// Query to fetch appropriate users for adding reminders
$users = User::query()
->where('status', User::ACTIVE)
->where(function ($query) use ($currentUser) {
// Include current user
$query->where('id', $currentUser->id);
// Include parent user if exists
if (!is_null($currentUser->parent_id)) {
$query->orWhere('id', $currentUser->parent_id);
// Include siblings (users with the same parent_id, excluding current user)
$query->orWhere('parent_id', $currentUser->parent_id)
->where('id', '!=', $currentUser->id);
}
// Include child users (users for whom the current user is the parent)
$query->orWhere('parent_id', $currentUser->id);
})
->get();
// Fetch activity logs related to the lead
$lead_activity_logs = LeadActivityLog::where('lead_id', $id)
->with(['lead', 'user'])
->get();
// Return the view with the data
return view('users.leads.show', compact('lead', 'lead_notes', 'customers', 'users', 'lead_activity_logs'));
} catch (\Exception $e) {
// Redirect back if any exception occurs, with an error message
return redirect()->back()->with('error', 'Leads not found.');
}
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
$lead = Lead::with('city', 'state', 'country', 'user')->findOrFail($id);
$lead_sources = LeadSource::where('status',LeadSource::Active)->get();
$users = User::all();
$countries = Country::all();
$states = States::all();
$cities = City::all();
$currentUser = Auth::check() ? Auth::user() : '';
return view('users.leads.edit', compact('lead', 'lead_sources', 'users', 'countries', 'states', 'cities', 'currentUser'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$validator = Validator::make($request->all(), [
'title' => 'required',
'lead_source' => 'required|exists:lead_sources,id',
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique('leads', 'email_address')->ignore($id)],
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$lead = Lead::find($id);
if (isset($lead)) {
$lead->title = $request->title;
$lead->source = $request->lead_source;
$lead->assigned_to = $request->assign_to;
$lead->customer_id = $request->customer_id;
$lead->salutation = $request->salutation;
$lead->first_name = $request->first_name;
$lead->last_name = $request->last_name;
$lead->gender = $request->gender;
$lead->property_interest_type = $request->property_interest_type;
if ($request->has('is_organization') == '1') {
$request->validate([
'organization_name' => 'required|string|max:255',
]);
$lead->organization_name = $request->organization_name;
} else {
$lead->organization_name = null;
}
$lead->is_organization = $request->is_organization;
$lead->organization_name = $request->organization_name;
$lead->tags = $request->input;
$lead->designation = $request->designation;
$lead->budget = $request->budget;
$lead->email_address = $request->email;
$lead->website = $request->website;
$lead->phone = $request->phone_number;
$lead->mobile_number = $request->mobile_number;
$lead->description = $request->description;
$lead->last_contacted = $request->last_contacted;
$lead->next_followup = $request->next_follow_up;
$lead->address_line_1 = $request->address_line_1;
$lead->address_line_2 = $request->address_line_2;
$lead->country = $request->country;
$lead->state = $request->state;
$lead->city = $request->city;
$lead->postal_code = $request->postal_code;
$lead->status = $request->lead_status;
if($request->lead_status == lead::Documentation) {
$lead->type = 'postSales';
}
$lead->save();
return redirect()->route('leads.index')->with('success', 'Lead has been updated successfully');
} else {
return back()->with('error', 'Lead does not exist');
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$lead = Lead::find($id);
if (isset($lead)) {
$lead->delete();
LeadNote::where('lead_id', $id)->delete();
return redirect()->route('leads.index')->with('success', 'Lead Deleted Successfully');
} else {
return back()->with('error', 'Lead does not exist');
}
}
public function convert_to_customer(Request $request, $lead_id)
{
$lead = Lead::find($lead_id);
$customer = new Customer();
if (isset($customer)) {
$currentUserId = getAdminId();
$customer->created_by = $currentUserId->created_by;
$customer->salutation = $lead->salutation;
$customer->first_name = $lead->first_name;
$customer->last_name = $lead->last_name;
$customer->gender = $lead->gender;
$customer->company = $lead->organization_name;
$customer->position = $lead->designation;
$customer->email_address = $lead->email_address;
$customer->website = $lead->website;
$customer->phone = $lead->phone;
$customer->mobile_number = $lead->mobile_number;
$customer->description = $lead->description;
$customer->address_line_1 = $lead->address_line_1;
$customer->address_line_2 = $lead->address_line_2;
$customer->country = $lead->country;
$customer->state = $lead->state;
$customer->city = $lead->city;
$customer->postal_code = $lead->postal_code;
$customer->status = $lead->status;
$customer->save();
$lead = Lead::find($lead_id);
$lead->customer_id = $customer->id;
$lead->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_id;
$lead_activity_log->activity_on = 'Convert To Customer';
$lead_activity_log->activity = 'added';
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $customer->first_name . $customer->last_name;
$lead_activity_log->save();
}
return back()->with('success', 'Convert To Customer Successfully');
} else {
return back()->with('error', 'Customer does not exist');
}
}
public function merge_with_customer(Request $request, $lead_id)
{
$customerId = $request->input('customer_id');
$lead = Lead::find($lead_id);
if (isset($lead_id)) {
$lead->customer_id = $customerId;
$lead->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_id;
$lead_activity_log->activity_on = 'Add To Existing Customer';
$lead_activity_log->activity = 'added';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $lead->get_customer->first_name . $lead->get_customer->last_name;
$lead_activity_log->save();
}
return back()->with('success', 'Add To Existing Customer Successfully');
} else {
return back()->with('error', 'Customer does not exist');
}
}
public function addleadNotes(Request $request, $lead_id)
{
$validator = Validator::make($request->all(), [
'notes' => 'required|string',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$lead_note = new LeadNote();
if (isset($lead_note)) {
$lead_note->lead_id = $lead_id;
$currentUserId = getAdminId();
$lead_note->created_by = $currentUserId->created_by;
$lead_note->notes = $request->notes;
$lead_note->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_id;
$lead_activity_log->activity_on = 'Note';
$lead_activity_log->activity = 'added';
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $lead_note->notes;
$lead_activity_log->save();
}
return redirect()->back()->with('success-leadnote', 'Lead Note added successfully');
} else {
return redirect()->back()->with('error-leadnote', 'Lead does not exist');
}
}
public function leadNotes_index(Request $request)
{
if ($request->ajax()) {
$request_data = $request->all();
// avoid zero column as it's checkbox so we can't sort by it
if ($request->has('order') && $request->order[0]['column'] != 0) {
$sort_column_number = $request->order[0]['column'];
$sort_column_dir = $request->order[0]['dir'];
$sort_column_key = $request->columns[$sort_column_number]['data'];
}
$main_query = LeadNote::query();
$query = $main_query->where('lead_id', $request->lead_id);
$data = $query->with('get_user')->get();
$count_total = $main_query->count();
$count_filter = $count_total;
return DataTables::of($data)
->addColumn('user', function ($row) {
return isset($row->get_user) && ($row->first_name . $row->get_user->last_name) ? $row->get_user->first_name . ' ' . $row->get_user->last_name : '';
})
->addColumn('notes', function ($row) {
return $row->notes;
})
->addColumn('date', function ($row) {
return formatDate($row->created_at, 'Y/m/d H:i:s');
})
// ->editColumn('status', function ($row) {
// $update_url = route('user.update.leadNotes.status', $row->id);
// return setStatus($row, $update_url);
// })
->addColumn('action', function ($row) {
if ($row->is_admin !== 1) {
$lead_note = LeadNote::find($row->id);
return view('users.leads.partially.leadnotes-delete', compact('row', 'lead_note'));
}
})
->rawColumns(['action'])
->with([
"recordsTotal" => $count_total,
"recordsFiltered" => $count_filter,
])
->make(true);
}
return view('users.leads.show');
}
public function leadNotes_edit(Request $request, $lead_notes)
{
$validator = Validator::make($request->all(), [
'notes' => 'required|string',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$lead_notes = LeadNote::find($lead_notes);
if (isset($lead_notes)) {
$originalNotes = $lead_notes->getOriginal('notes');
$lead_notes->notes = $request->notes;
$currentUserId = getAdminId();
$lead_notes->created_by = $currentUserId->created_by;
$lead_notes->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_notes->lead_id;
$lead_activity_log->activity_on = 'Note';
$lead_activity_log->activity = 'updated';
$lead_activity_log->created_by = $currentUserId->created_by;
$oldValues = [];
$newValues = [];
$descriptionParts = []; // Initialize descriptionParts array
$originalNote = $originalNotes; // Assuming $originalNotes is a string representing the note
$newNote = $lead_notes->notes; // Assuming $lead_notes->notes is also a string representing the new note
$descriptionParts = []; // Initialize descriptionParts array
// Check if the note has changed
if ($originalNote !== $newNote) {
$descriptionParts[] = "<b>Old Note:</b><br> " . $originalNote;
$descriptionParts[] = "<b>New Note:</b><br> " . $newNote;
}
// If there are description parts, concatenate and save to the log
if (!empty($descriptionParts)) {
$lead_activity_log->description = implode("<br>", $descriptionParts);
$lead_activity_log->save();
}
}
return redirect()->back()->with('success-leadnote', 'Lead Note Updated successfully');
} else {
return redirect()->back()->with('error-leadnote', 'Notes does not exist');
}
}
public function leadNotes_delete(string $id)
{
$lead_note = LeadNote::find($id);
if (isset($lead_note)) {
$leadId = $lead_note->lead_id;
$lead_note->delete();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $leadId;
$lead_activity_log->activity_on = 'Notes';
$lead_activity_log->activity = 'deleted';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $lead_note->notes;
$lead_activity_log->save();
}
return redirect()->back()->with('success-leadnote', 'Lead Notes has been deleted successfully.');
} else {
return back()->with('error-leadnote', 'Lead Notes does not exist');
}
}
// public function updateleadNotesStatus(Request $request, $id)
// {
// if ($request->has('new_status')) {
// $lead_notes = LeadNote::find($id);
// if ($lead_notes) {
// $lead_notes->status = $request->new_status;
// $lead_notes->save();
// return response()->json(['status' => 'success', 'message' => 'Lead Notes status updated successfully']);
// } else {
// return response()->json(['status' => 'error', 'message' => 'Lead Notes not found'], 404);
// }
// } else {
// return response()->json(['status' => 'error', 'message' => 'Missing status value'], 404);
// }
// }
// public function uploadFile(Request $request, Lead $lead)
// {
// // Validate the request
// $request->validate([
// 'file' => 'required|file|mimes:jpg,png,pdf,docx|max:2048', // Adjust mime types and size limit as needed
// 'title' => 'required|string|max:255',
// ]);
// // Check if file is uploaded
// if ($request->hasFile('file')) {
// // Get the uploaded file
// $file = $request->file('file');
// // Add media to the lead's media collection
// $media = $lead->addMedia($file)
// ->usingFileName(time() . '_' . $file->getClientOriginalName()) // Optionally rename the file
// ->toMediaCollection('leads');
// // Set custom property 'title'
// $media->setCustomProperty('title', $request->title);
// $media->save();
// // Return a response with file details
// return response()->json([
// 'status' => 'success',
// 'file' => [
// 'url' => $media->getUrl(),
// 'name' => $media->file_name,
// 'title' => $media->getCustomProperty('title')
// ]
// ]);
// }
// // Return an error response if no file is uploaded
// return response()->json(['status' => 'error', 'message' => 'No file uploaded.'], 400);
// }
public function upload(Request $request, Lead $lead)
{
$request->validate([
'title' => 'required',
'file' => 'required|mimes:jpeg,jpg,png,pdf', // Example validation rules
]);
// Debug: Check if the request contains a file
if ($request->hasFile('file')) {
// Get the uploaded file
$file = $request->file('file');
// Debug: Check file properties
if (!$file->isValid()) {
return redirect()->back()->with('error', 'Invalid file upload.');
}
try {
// Add media to the lead's media collection
$media = $lead->addMedia($file)
->usingFileName(time() . '_' . $file->getClientOriginalName()) // Optionally rename the file
->toMediaCollection('leads');
// Set custom property 'title' if provided
if ($request->has('title')) {
$media->setCustomProperty('title', $request->input('title'));
}
// Save media changes
$media->save();
$lead_activity_log = new LeadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead->id;
$lead_activity_log->activity_on = 'Image';
$lead_activity_log->activity = 'added';
// Ensure getAdminId() returns the correct object or value
$currentUser = getAdminId();
$lead_activity_log->created_by = $currentUser->created_by;
$description = "<b>Image added:</b><br>";
$description .= "<b>Name:</b> " . $media->name . "<br>";
$description .= "<b>File Name:</b> " . $media->file_name . "<br>";
$lead_activity_log->description = $description;
$lead_activity_log->save();
}
return redirect()->back()->with('success', 'File uploaded successfully.');
} catch (\Exception $e) {
// Debug: Log exception details
\log::error('File upload error: ' . $e->getMessage());
return redirect()->back()->with('error', 'File upload failed.');
}
} else {
return redirect()->back()->with('error', 'No file uploaded.');
}
}
public function destroyMediaRecords(string $id)
{
$mediaRecord = DB::table('media')->where('id', $id)->first();
$lead_activity_log = new LeadActivityLog();
// If media record exists, proceed with deletion
if ($mediaRecord) {
// Fetch the filename before deletion
$fileName = $mediaRecord->file_name;
$leadId = $mediaRecord->model_id;
// Delete the media record
$deleted = DB::table('media')->where('id', $id)->delete();
// Log the deletion activity
$lead_activity_log->lead_id = $leadId;
$lead_activity_log->activity_on = 'Image';
$lead_activity_log->activity = 'deleted';
// Correctly fetch the current user's ID
$currentUser = getAdminId();
$lead_activity_log->created_by = $currentUser->created_by;
$lead_activity_log->description = "<b>Image deleted:</b><br><b>File Name:</b> " . $fileName . "<br>";
// Save the activity log entry
$lead_activity_log->save();
} else {
$deleted = false; // Set $deleted to false if no record was found
}
// Check the deletion result and redirect accordingly
if ($deleted) {
return redirect()->back()->with('success', 'File deleted successfully');
} else {
return redirect()->back()->with('error', 'File not found');
}
}
public function addReminder(Request $request, $lead_id)
{
// Validate the request
$validator = Validator::make($request->all(), [
'reminder_to' => 'required|exists:users,id',
'description' => 'required|string',
'reminder_date' => 'required|date',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$reminder = new Reminder();
if (isset($reminder)) {
$reminder->reminder_to = $request->input('reminder_to');
$currentUserId = getAdminId();
$reminder->created_by = $currentUserId->created_by;
$reminder->entity_type = 'lead';
$reminder->entity_id = $lead_id;
$reminder->is_notified = 0;
$reminder->status = 1;
$reminder->description = $request->input('description');
$reminder->reminder_date = $request->input('reminder_date');
$reminder->email_notification = $request->input('email_notification', 0);
$reminder->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_id;
$lead_activity_log->activity_on = 'Reminder';
$lead_activity_log->activity = 'added';
$lead_activity_log->created_by = $currentUserId->created_by;
$description = "<b>Reminder Values:</b><br>";
$description .= "<b>Reminder Date:</b> " . formatDate($reminder->reminder_date, 'Y/m/d H:i:s') . "<br>";
$description .= "<b>Description:</b> " . $reminder->description . "<br>";
$description .= "<b>Reminder To:</b> " . $reminder->user->first_name . '' . $reminder->user->last_name . "<br>";
$lead_activity_log->description = $description;
$lead_activity_log->save();
}
return redirect()->back()->with('success-reminder', 'Lead Reminder has been Added successfully.');
} else {
return back()->with('error-reminder', 'Lead Reminder does not exist');
}
}
public function leadReminder_index(Request $request)
{
if ($request->ajax()) {
$request_data = $request->all();
$main_query = Reminder::query();
$query = $main_query->where('entity_type', 'lead')->where('entity_id', $request->lead_id);
$data = $query->with('created_by_user', 'user')->get();
$count_total = $main_query->count();
$count_filter = $query->count();
return DataTables::of($data)
->addColumn('reminder_to', function ($row) {
return isset($row->user) && ($row->user->first_name . $row->user->last_name) ? $row->first_name . $row->user->last_name : '';
})
->addColumn('user', function ($row) {
return isset($row->created_by_user) && ($row->first_name . $row->created_by_user->last_name) ? $row->first_name . $row->created_by_user->last_name : '';
})
// ->addColumn('description', function ($row) {
// return $row->description;
// })
->addColumn('reminder_date', function ($row) {
return formatDate($row->reminder_date, 'Y/m/d H:i:s');
})
->addColumn('is_notified', function ($row) {
return $row->is_notified == 0 ? 'No' : 'Yes';
})
->addColumn('action', function ($row) {
if ($row->is_admin !== 1) {
$reminder = Reminder::findOrFail($row->id);
$users = User::all();
return view('users.leads.partially.leadreminder-delete', compact('row', 'reminder', 'users'));
}
})
->rawColumns(['action'])
->with([
"recordsTotal" => $count_total,
"recordsFiltered" => $count_filter,
])
->make(true);
}
return view('users.leads.show');
}
public function updateReminder(Request $request, string $id)
{
// Validate the request inputs
$validator = Validator::make($request->all(), [
'reminder_to' => 'required|exists:users,id',
'description' => 'required|string',
'reminder_date' => 'required|date',
]);
// Return with validation errors if any
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
// Fetch the latest reminder from the database
$reminder = Reminder::find($id);
if ($reminder) {
$originalReminder = $reminder->getOriginal();
$reminder->reminder_date = $request->input('reminder_date');
$reminder->reminder_to = $request->input('reminder_to');
$reminder->description = $request->input('description');
$reminder->email_notification = $request->input('email_notification', 0); // Default to 0 if not present
$reminder->save();
$lead_activity_log = new leadActivityLog();
if ($lead_activity_log) {
$lead_activity_log->lead_id = $reminder->entity_id;
$lead_activity_log->activity_on = 'Reminder';
$lead_activity_log->activity = 'updated';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$oldValues = [];
$newValues = [];
// Check and log changes in reminder date
if ($originalReminder['reminder_date'] !== $reminder->reminder_date) {
$oldValues['<b>Reminder Date</b>'] = formatDate($originalReminder['reminder_date'], 'Y/m/d H:i:s');
$newValues['<b>Reminder Date</b>'] = formatDate($reminder->reminder_date, 'Y/m/d H:i:s');
}
// Check and log changes in reminder to (user)
if ($originalReminder['reminder_to'] !== $reminder->reminder_to) {
$originalReminderToUser = User::find($originalReminder['reminder_to']);
$newReminderToUser = User::find($reminder->reminder_to);
$oldValues['<b>Reminder To</b>'] = $originalReminderToUser ? $originalReminderToUser->first_name . ' ' . $originalReminderToUser->last_name : "Unknown";
$newValues['<b>Reminder To</b>'] = $newReminderToUser ? $newReminderToUser->first_name . ' ' . $newReminderToUser->last_name : "Unknown";
}
// Check and log changes in description
if ($originalReminder['description'] !== $reminder->description) {
$oldValues['<b>description</b>'] = $originalReminder['description'];
$newValues['<b>description</b>'] = $reminder->description;
}
// Check and log changes in email notification status
if ($originalReminder['email_notification'] != $reminder->email_notification) {
$oldValues['<b>Email Notification</b>'] = $originalReminder['email_notification'] ? 'Enabled' : 'Disabled';
$newValues['<b>Email Notification</b>'] = $reminder->email_notification ? 'Enabled' : 'Disabled';
}
// Create a formatted description string
$descriptionParts = [];
if (!empty($oldValues)) {
$descriptionParts[] = "<b>Old Values:</b><br> " . implode("<br> ", array_map(function ($key, $value) {
return "$key: $value";
}, array_keys($oldValues), $oldValues));
}
if (!empty($newValues)) {
$descriptionParts[] = "<b>New Values:</b><br>" . implode("<br> ", array_map(function ($key, $value) {
return "$key: $value";
}, array_keys($newValues), $newValues));
}
if (!empty($descriptionParts)) {
$lead_activity_log->description = implode("<br> ", $descriptionParts);
$lead_activity_log->save();
}
}
return redirect()->back()->with('success-reminder', 'Lead Reminder has been updated successfully.');
} else {
return back()->with('error-reminder', 'Lead Reminder does not exist.');
}
}
public function leadReminder_delete(string $id)
{
$lead_reminder = Reminder::find($id);
if (isset($lead_reminder)) {
$reminderId = $lead_reminder->entity_id;
$lead_reminder->delete();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $reminderId;
$lead_activity_log->activity_on = 'Reminder';
$lead_activity_log->activity = 'deleted';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $lead_reminder->description;
$lead_activity_log->save();
}
return redirect()->back()->with('success-datatables', 'Lead Reminder has been deleted successfully.');
} else {
return back()->with('error-datatables', 'Lead Reminder does not exist');
}
}
public function leadTask_index(Request $request)
{
if ($request->ajax()) {
$request_data = $request->all();
$main_query = Task::query();
// $query = $main_query->where('entity_type', 'lead');
$query = $main_query->where('entity_type', 'lead')->where('entity_id', $request->lead_id);
$data = $query->with('created_by_user', 'user')->get();
$count_total = $main_query->count();
$count_filter = $query->count();
return DataTables::of($data)
->addColumn('assigned_to', function ($row) {
return isset($row->user) && ($row->user->first_name . $row->user->last_name) ? $row->user->first_name . $row->user->last_name : '';
})
->addColumn('user', function ($row) {
return isset($row->created_by_user) && ($row->created_by_user->first_name . $row->created_by_user->last_name) ? $row->created_by_user->first_name . ' ' . $row->created_by_user->last_name : '';
})
->addColumn('subject', function ($row) {
return $row->subject;
})
->addColumn('action', function ($row) {
if ($row->is_admin !== 1) {
$task = Task::findOrFail($row->id);
$users = User::all();
return view('users.leads.partially.leadtask-delete', compact('row', 'task', 'users'));
}
})
->rawColumns(['action'])
->with([
"recordsTotal" => $count_total,
"recordsFiltered" => $count_filter,
])
->make(true);
}
return view('users.leads.show');
}
public function addleadTask(Request $request, $lead_id)
{
$validator = Validator::make($request->all(), [
'user_id' => 'required|exists:users,id',
'subject' => 'required|string',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$task = new Task();
if (isset($task)) {
$task->subject = $request->subject;
$task->start_date = $request->start_date;
$task->due_date = $request->due_date;
$task->priority = $request->priority;
$task->assigned_to = $request->user_id;
$currentUserId = getAdminId();
$task->created_by = $currentUserId->created_by;
$task->entity_type = 'lead';
$task->entity_id = $lead_id;
$task->description = $request->description;
$task->state = $request->state;
$task->status = 1;
$task->save();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $lead_id;
$lead_activity_log->activity_on = 'Task';
$lead_activity_log->activity = 'added';
$lead_activity_log->created_by = $currentUserId->created_by;
$description = "<b>Task added:</b><br>";
$description .= "<b>Subject:</b> " . $task->subject . "<br>";
$description .= "<b>Start Date:</b> " . formatDate($task->start_date, 'Y/m/d H:i:s') . "<br>";
$description .= "<b>Due Date:</b> " . formatDate($task->due_date, 'Y/m/d H:i:s') . "<br>";
$description .= "<b>Priority:</b> " . $task->priority . "<br>";
$description .= "<b>Assigned To:</b> " . $task->user->first_name . '' . $task->user->last_name . "<br>";
$description .= "<b>Description:</b> " . $task->description . "<br>";
$description .= "<b>State:</b> " . $task->state . "<br>";
$lead_activity_log->description = $description;
$lead_activity_log->save();
}
return redirect()->back()->with('success-leadtask', 'Lead Task added successfully');
} else {
return redirect()->back()->with('error-leadtask', 'Lead Task does not exist');
}
}
public function updateleadTask(Request $request, $lead_id)
{
$validator = Validator::make($request->all(), [
'user_id' => 'required|exists:users,id',
'subject' => 'required|string',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$task = Task::find($lead_id);
if (isset($task)) {
$originalTask = $task->getOriginal();
$task->subject = $request->subject;
$task->start_date = $request->start_date;
$task->due_date = $request->due_date;
$task->priority = $request->priority;
$task->assigned_to = $request->user_id;
$currentUserId = getAdminId();
$task->created_by = $currentUserId->created_by;
$task->description = $request->description;
$task->state = $request->state;
$task->save();
$lead_activity_log = new leadActivityLog();
if ($lead_activity_log) {
$lead_activity_log->lead_id = $task->entity_id;
$lead_activity_log->activity_on = 'Task';
$lead_activity_log->activity = 'updated';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$oldValues = [];
$newValues = [];
// Check and log changes for Subject
if ($originalTask['subject'] !== $task->subject) {
$oldValues['<b>subject</b>'] = $originalTask['subject'];
$newValues['<b>subject</b>'] = $task->subject;
}
if ($originalTask['start_date'] !== $task->start_date) {
$oldValues['<b>Start Date</b>'] = formatDate($originalTask['start_date'], 'Y/m/d H:i:s');
$newValues['<b>Start Date</b>'] = formatDate($task->start_date, 'Y/m/d H:i:s');
}
if ($originalTask['due_date'] !== $task->due_date) {
$oldValues['<b>Due Date</b>'] = formatDate($originalTask['due_date'], 'Y/m/d H:i:s');
$newValues['<b>Due Date</b>'] = formatDate($task->due_date, 'Y/m/d H:i:s');
}
if ($originalTask['priority'] !== $task->priority) {
$oldValues['<b>Priority</b>'] = $originalTask['priority'];
$newValues['<b>Priority</b>'] = $task->priority;
}
if ($originalTask['assigned_to'] !== $task->assigned_to) {
$originalAssignedToUser = User::find($originalTask['assigned_to']);
$newAssignedToUser = User::find($task->assigned_to);
$oldValues['<b>Assigned To</b>'] = $originalAssignedToUser ? $originalAssignedToUser->first_name . ' ' . $originalAssignedToUser->last_name : "Unknown";
$newValues['<b>Assigned To</b>'] = $newAssignedToUser ? $newAssignedToUser->first_name . ' ' . $newAssignedToUser->last_name : "Unknown";
}
if ($originalTask['state'] !== $task->state) {
$oldValues['<b>State</b>'] = $originalTask['state'];
$newValues['<b>State</b>'] = $task->state;
}
if ($originalTask['description'] !== $task->description) {
$oldValues['<b>Description</b>'] = $originalTask['description'];
$newValues['<b>Description</b>'] = $task->description;
}
$descriptionParts = [];
if (!empty($oldValues)) {
$descriptionParts[] = "<b>Old Values:</b><br> " . implode("<br> ", array_map(function ($key, $value) {
return "$key: $value";
}, array_keys($oldValues), $oldValues));
}
if (!empty($newValues)) {
$descriptionParts[] = "<b>New Values:</b><br>" . implode("<br> ", array_map(function ($key, $value) {
return "$key: $value";
}, array_keys($newValues), $newValues));
}
if (!empty($descriptionParts)) {
$lead_activity_log->description = implode("<br> ", $descriptionParts);
$lead_activity_log->save();
}
return redirect()->back()->with('success-leadtask', 'Lead Task Updated successfully');
} else {
return redirect()->back()->with('error-leadtask', 'Lead Task does not exist');
}
}
}
public function leadTask_delete(string $id)
{
$task = Task::find($id);
if (isset($task)) {
$leadId = $task->entity_id;
$task->delete();
$lead_activity_log = new leadActivityLog();
if (isset($lead_activity_log)) {
$lead_activity_log->lead_id = $leadId;
$lead_activity_log->activity_on = 'Task';
$lead_activity_log->activity = 'deleted';
$currentUserId = getAdminId();
$lead_activity_log->created_by = $currentUserId->created_by;
$lead_activity_log->description = $task->subject;
$lead_activity_log->save();
}
return redirect()->back()->with('success-leadtask', 'Lead Task has been deleted successfully.');
} else {
return back()->with('error-leadtask', 'Lead Task does not exist');
}
}
public function allLeads(Request $request)
{
$status = "all";
if ($request->status) {
$status = $request->status;
}
if ($request->ajax()) {
$user = Auth::user();
$authUserId = $user->id;
$sevenDaysAgo = now()->subDays(7);
// Custom query for each status
if (in_array($status, [Lead::HotLead, Lead::ColdLead, Lead::NewLead, Lead::Documentation])) {
// if (in_array($status, ['hot-lead', 'cold-lead', 'new-lead', 'documentation'])) {
$new_leads = Lead::where('status', $status)
->where('created_at', '>=', $sevenDaysAgo)
->where(function ($query) use ($authUserId) {
$query->where('user_id', $authUserId)
->orWhere('assigned_to', $authUserId);
})
->orderBy('id', 'desc');
} else {
// Default query (all leads based on hierarchy)
$new_leads = Lead::query()
->join('users as u', 'leads.user_id', '=', 'u.id')
->where('type', 'preSales')
->where(function ($query) use ($user) {
$query->where('leads.user_id', $user->id)
->orWhere('u.parent_id', $user->id);
if (!is_null($user->parent_id)) {
$query->orWhere('u.id', $user->parent_id);
$query->orWhere(function ($query) use ($user) {
$query->where('u.parent_id', $user->parent_id)
->where('u.id', '!=', $user->id);
});
}
});
// Apply status_filter only in default case
if ($request->status_filter) {
$new_leads->where('leads.status', $request->status_filter);
}
$new_leads->select('leads.*')->orderBy('id', 'desc');
}
return DataTables::of($new_leads)
->addColumn('name', function ($row) {
return $row->first_name . ' ' . $row->last_name;
})
->addColumn('action', function ($row) {
return '<a href="'.route('leads.show', $row->id) .'" class="btn btn-sm btn-dark" title="show"><i class="fa fa-eye"></i></a>
<a href="'. route('leads.edit', $row->id) .'" class="btn btn-sm btn-dark" title="Edit"><i class="fa fa-pencil-alt"></i></a>';
})
->rawColumns(['action'])
->make(true);
}
return view('users.leads.leads_all', compact('status'));
}
// public function allLeads(Request $request)
// {
// $status = "all";
// if ($request->status) {
// $status = $request->status;
// }
// if ($request->ajax()) {
// $user = Auth::user();
// $new_leads = Lead::query()
// ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
// ->where('type', 'preSales')
// ->where(function ($query) use ($user) {
// $query->where('leads.user_id', $user->id) // Leads of logged-in user
// ->orWhere('u.parent_id', $user->id); // Leads of user's children
// // Only add this condition if parent_id is not null
// if (!is_null($user->parent_id)) {
// $query->orWhere('u.id', $user->parent_id); // Leads of user's parent
// $query->orWhere(function ($query) use ($user) {
// $query->where('u.parent_id', $user->parent_id) // Leads of siblings
// ->where('u.id', '!=', $user->id); // Exclude the logged-in user
// });
// }
// });
// if ($request->status_filter) {
// $new_leads->where('leads.status', $request->status_filter);
// }
// $new_leads->select('leads.*') // Only select fields from leads
// ->orderBy('id', 'desc');
// return DataTables::of($new_leads)
// ->addColumn('name', function ($row) {
// return $row->first_name.' '.$row->last_name;
// })
// ->addColumn('action', function ($row) {
// return '<a href="'.route('leads.show', $row->id) .'" class="btn btn-sm btn-dark" title="show"><i class="fa fa-eye"></i></a>
// <a href="'. route('leads.edit', $row->id) .'" class="btn btn-sm btn-dark" title="Edit"><i
// class="fa fa-pencil-alt"></i></a>';
// // return view('users.leads.partially.delete', compact('row'));
// })
// ->rawColumns(['action'])
// ->make(true);
// }
// return view('users.leads.leads_all', compact('status'));
// }
// }
}