/home/mip/mip/app/Modules/Client/Controllers/Applicants/SearchApplicantsController.php
<?php

namespace QxCMS\Modules\Client\Controllers\Applicants;

use Auth;
use Datatables;
use Carbon\Carbon;

use Illuminate\Http\Request;
use QxCMS\Http\Controllers\Controller;

use QxCMS\Modules\Client\Repositories\Applicants\ApplicantRepositoryInterface as Applicant;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class SearchApplicantsController extends Controller
{
    protected $applicant;

    protected $auth;
	protected $permission;
	protected $prefix_name = '';
    protected $module_id = 20;

	public function __construct(Permission $permission, Applicant $applicant)
	{
        $this->applicant = $applicant;

		$this->permission = $permission;
		$this->auth = Auth::guard('client');
		$this->prefix_name = config('modules.client');
        $this->getDetails($this->module_id);
	}

	public function permissions()
    {
        return $this->permission->getPermission($this->module_id);
    }

    public function index() 
    {
    	$this->authorize('activated', $this->permissions());
    	$data['permissions'] = $this->permissions();
        return view('Client::applicants.search-applicant.index', $data);
    }

    public function getSearchApplicantsData(Request $request)
    {
        $applicant = $this->applicant->select('applicants.*')->with('latestJob')
                                     ->whereHas('latestJob',function($query){
                                       $query->where('id', '!=', null);
                                    })
                                    ->join('job_applied', 'job_applied.applicant_id', '=', 'applicants.id')
                                    ->groupBy('job_applied.applicant_id');

        return Datatables::of($applicant)
        ->filter(function ($query) use ($request){
            if ($request->has('name')) {
                $query->whereRaw("CONCAT(first_name,' ',last_name) like ?", "%{$request->get('name')}%");
                $query->orWhereRaw("CONCAT(last_name,' ',first_name) like ?", ["%{$request->get('name')}%"]);
            }
        })
        ->editColumn('full_name', function($applicant){
            return $applicant->last_name.', '.$applicant->first_name.' '.$applicant->middle_name;
        })
        ->editColumn('position', function($applicant){
            if($applicant->latestJob == null) return '';
            else return $applicant->latestJob->job->position;
        })
        ->editColumn('apply_date', function($applicant){
            if($applicant->latestJob == null) return '';
            else return Carbon::parse($applicant->latestJob->apply_date)->format('M d, Y');
        })
        ->orderColumn('full_name', 'last_name $1, first_name $1, middle_name $1')
        ->make(true);
    }
}