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

namespace QxCMS\Modules\Client\Controllers\Applicants;

use Auth;
use Excel;
use Session;
use Datatables;
use Carbon\Carbon;

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

use QxCMS\Modules\Client\Models\Applicants\JobApplied as JobApplied;
use QxCMS\Modules\Client\Repositories\JobOpening\JobOpeningRepositoryInterface as JobOpening;
use QxCMS\Modules\Client\Repositories\Settings\Roles\PermissionRepositoryInterface as Permission;

class ApplicantsController extends Controller
{
    protected $job_applied;
	protected $job_opening;

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

	public function __construct(Permission $permission, JobOpening $job_opening, JobApplied $job_applied)
	{
        $this->job_applied = $job_applied;
		$this->job_opening = $job_opening;

		$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.index', $data);
    }

    public function view($hashid)
    {
        $this->authorize('activated', $this->permissions());
        $data['permissions'] = $this->permissions();

        $id = decode($hashid);
        $data['job'] = $this->job_opening->findById($id);
        return view('Client::applicants.view', $data);
    }

    public function excel($hashid)
    {
        $id = decode($hashid);
        $data['job'] = $this->job_opening->findById($id);
        $data['applicants'] = $this->job_applied->select(['job_applied.*', 'applicants.first_name', 'applicants.middle_name', 'applicants.last_name', 'applicants.mobile_number'])
                            ->where('job_id', $id)->with('applicant')
                            ->join('applicants', 'applicants.id', '=', 'job_applied.applicant_id')
                            ->orderBy('applicants.last_name', 'asc')->get();
        $data['type'] = 'Applicant Lists';

        Excel::create('Applicant Lists', function($excel) use ($data){
            $excel->setTitle('Applicant Lists');

            $excel->sheet('sheet1', function($sheet) use ($data) {
                $sheet->loadView('Client::applicants.includes.applicant-lists-table', $data);
            });
        })->export('xlsx');
    }

    public function getApplicantsData()
    {
        $dateToday = Carbon::now()->toDateString();
        $job = $this->job_opening->where('status', 'Open')
                                ->where('opening_date', '<=', $dateToday)
                                ->where('closing_date', '>=', $dateToday)
                                ->withCount('applicants');

        return Datatables::of($job)
        ->filterColumn('opening_date', function($query, $keyword) {
            $query->whereRaw("DATE_FORMAT(opening_date,'%b %d, %Y') like ?", ["%$keyword%"]);
        })
        ->filterColumn('closing_date', function($query, $keyword) {
            $query->whereRaw("DATE_FORMAT(closing_date,'%b %d, %Y') like ?", ["%$keyword%"]);
        })
        ->editColumn('opening_date', function($job){
            return Carbon::parse($job->opening_date)->format('M d, Y');
        })
        ->editColumn('closing_date', function($job){
            return Carbon::parse($job->closing_date)->format('M d, Y');
        })
        ->editColumn('applicants_count', function($job){
            if($job->applicants_count != 0){
                return '<a href="'.route($this->prefix_name.'.applicants.view', $job->hashid).'" data-toggle="tooltip" data-placement="top" title="No. Applied" target="_blank">'.$job->applicants_count.'</a>';
            }else{
                return $job->applicants_count;
            }
            
        })
        ->make(true);
    }

    public function getApplicantListData($hashid)
    {
        $id = decode($hashid);
        $applicant = $this->job_applied->select(['job_applied.*', 'applicants.first_name', 'applicants.middle_name', 'applicants.last_name', 'applicants.mobile_number'])->where('job_id', $id)->with('applicant')
                            ->join('applicants', 'applicants.id', '=', 'job_applied.applicant_id');

        return Datatables::of($applicant)
        ->editColumn('full_name', function($applicant){
            return $applicant->applicant->last_name.', '.$applicant->applicant->first_name.' '.$applicant->applicant->middle_name;
        })
        ->editColumn('apply_date', function($applicant){
            return Carbon::parse($applicant->apply_date)->format('M d, Y');
        })
        ->orderColumn('full_name', 'applicants.last_name $1, applicants.first_name $1, applicants.middle_name $1')
        ->make(true);
    }
}