HEX
Server: Apache/2.4.46 (Ubuntu)
System: Linux localhost 5.11.0-49-generic #55-Ubuntu SMP Wed Jan 12 17:36:34 UTC 2022 x86_64
User: root (0)
PHP: 7.4.16
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/html/dev-hrms/app/Http/Controllers/EmployeePayMatrixController.php
<?php

namespace App\Http\Controllers;

use App\Models\EmployeePayMatrix;
use App\Models\PayFixation;
use App\Models\EmployeeProfile;
use App\Models\Profiles;
use App\Models\Approval;


use App\Library\UserLib;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\File;
use Illuminate\Http\Request;

class EmployeePayMatrixController extends Controller
{
    protected $userLib;
    protected $UserSessionId;
    protected $TeamList = array();
    protected $LevelList = array();
    protected $ViewProfileIds = array();
    protected $ViewApprovalUsers = array();

    public function __construct(UserLib $userLib)
    {
        $this->userLib = $userLib;
    }

    public function getAccessUserProfileList($ProfileId = '')
    {
        $users = Profiles::select('*')
            ->leftJoin('tbl_roles', 'tbl_roles.RoleId', '=', 'tbl_profiles.RoleId')
            ->where('tbl_roles.ReadPermission', 'like', '1')
            ->where('tbl_roles.WritePermission', 'like', '1')
            ->where('tbl_roles.UpdatePermission', 'like', '1')
            ->where('tbl_roles.ApprovalPermission', 'like', '1')
            ->where('tbl_profiles.ServiceBookApprovalPermission', 'like', 'YES')
            ->where('tbl_profiles.ProfileId', 'like', $ProfileId) //check not equal to user profile                   
            ->get();

        if ($users->count() > 0) {   //email is exist                
            foreach ($users as $key => $UValue) {
                $ProfileId = $UValue['ProfileId'];
                $ProfileName = $UValue['ProfileName'];
                $ParentId = $UValue['ParentId'];
                $this->TeamList[] = $UValue;
                $this->ViewProfileIds[] = $ProfileId;
                if ($ParentId) {
                    $this->getAccessUserProfileList($ParentId);
                }
            }
        }

        return $responseData = $this->ViewProfileIds;

        //return response()->json($responseData);
    }



    // Get Approval User 
    public function getApprovalUserLevel($ProfileId = '', $Level = 1)
    {

        $users = Profiles::select('*')
            ->leftJoin('tbl_roles', 'tbl_roles.RoleId', '=', 'tbl_profiles.RoleId')
            ->where('tbl_roles.ReadPermission', 'like', '1')
            ->where('tbl_roles.WritePermission', 'like', '1')
            ->where('tbl_roles.UpdatePermission', 'like', '1')
            ->where('tbl_roles.ApprovalPermission', 'like', '1')
            //->where('tbl_profiles.ServiceBookApprovalPermission','like','YES')
            ->where('tbl_profiles.ProfileId', 'like', $ProfileId) //check not equal to user profile                   
            ->get();

        // echo $users;
        //exit;

        if ($users->count() > 0) {   //email is exist                
            foreach ($users as $key => $UValue) {
                $ProfileId = $UValue['ProfileId'];
                $ProfileName = $UValue['ProfileName'];
                $ParentId = $UValue['ParentId'];
                $this->TeamList[] = $UValue;
                $this->ViewApprovalUsers[] = $ProfileId;
                //$this->LevelList[] = $Level;
                //echo $Level.'-'.$ParentId.'<br/>';

                if ($Level >= 2) {
                    continue;
                }
                if ($ParentId) {
                    $Level++;
                    $this->getApprovalUserLevel($ParentId, $Level);
                }
            }
        }
        return $this->ViewApprovalUsers;
    }

    public function employeePayMatrix()
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $UserId = session('UserId');
        $AllPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_employees.EmployeeName as EmployeeName', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount', 'tbl_pay_fixation.PayFixation as PayFixation', 'tbl_admin.FirstName as Updated_by', 'tbl_admin.FirstName as Created_by')
            ->leftJoin('tbl_admin', 'tbl_employees_paymatrix.Updated_by', '=', 'tbl_admin.UserId')
            ->leftJoin('tbl_employees', 'tbl_employees_paymatrix.EmployeeId', '=', 'tbl_employees.EmployeeId')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->leftJoin('tbl_pay_fixation', 'tbl_employees_paymatrix.PayFixationId', '=', 'tbl_pay_fixation.PayFixationId')
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            ->where('tbl_employees_paymatrix.Created_by', $UserId)
            ->orderBy('tbl_employees_paymatrix.id', 'DESC')
            ->get();

        $CancelledPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_employees.EmployeeName as EmployeeName', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount', 'tbl_pay_fixation.PayFixation as PayFixation', 'tbl_admin.FirstName as Updated_by', 'tbl_admin.FirstName as Created_by')
            ->leftJoin('tbl_admin', 'tbl_employees_paymatrix.Updated_by', '=', 'tbl_admin.UserId')
            ->leftJoin('tbl_employees', 'tbl_employees_paymatrix.EmployeeId', '=', 'tbl_employees.EmployeeId')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->leftJoin('tbl_pay_fixation', 'tbl_employees_paymatrix.PayFixationId', '=', 'tbl_pay_fixation.PayFixationId')
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            ->where('tbl_employees_paymatrix.Created_by', $UserId)
            ->where('tbl_employees_paymatrix.IsCancelled', '1')
            ->orderBy('tbl_employees_paymatrix.id', 'DESC')
            ->get();

        // print_r(json_encode($AllPayMatrix));
        // exit;
        return view('admin.EmployeeProfile.employee-pay-matrix', ['AllPayMatrix' => $AllPayMatrix, 'CancelledPayMatrix' => $CancelledPayMatrix]);
    }

    public function employeeCancelledPayMatrix()
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }
        $UserId = session('UserId');
        $AllPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_employees.EmployeeName as EmployeeName', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount', 'tbl_pay_fixation.PayFixation as PayFixation', 'tbl_admin.FirstName as Updated_by', 'tbl_admin.FirstName as Created_by')
            ->leftJoin('tbl_admin', 'tbl_employees_paymatrix.Updated_by', '=', 'tbl_admin.UserId')
            ->leftJoin('tbl_employees', 'tbl_employees_paymatrix.EmployeeId', '=', 'tbl_employees.EmployeeId')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->leftJoin('tbl_pay_fixation', 'tbl_employees_paymatrix.PayFixationId', '=', 'tbl_pay_fixation.PayFixationId')
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            ->where('tbl_employees_paymatrix.Created_by', $UserId)
            ->orderBy('tbl_employees_paymatrix.id', 'DESC')
            ->get();

        $CancelledPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_employees.EmployeeName as EmployeeName', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount', 'tbl_pay_fixation.PayFixation as PayFixation', 'tbl_admin.FirstName as Updated_by', 'tbl_admin.FirstName as Created_by')
            ->leftJoin('tbl_admin', 'tbl_employees_paymatrix.Updated_by', '=', 'tbl_admin.UserId')
            ->leftJoin('tbl_employees', 'tbl_employees_paymatrix.EmployeeId', '=', 'tbl_employees.EmployeeId')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->leftJoin('tbl_pay_fixation', 'tbl_employees_paymatrix.PayFixationId', '=', 'tbl_pay_fixation.PayFixationId')
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            ->where('tbl_employees_paymatrix.Created_by', $UserId)
            ->where('tbl_employees_paymatrix.IsCancelled', '1')
            ->orderBy('tbl_employees_paymatrix.id', 'DESC')
            ->get();
        // print_r(json_encode($AllPayMatrix));
        // exit;
        return view('admin.EmployeeProfile.employee-cancelled-pay-matrix', ['AllPayMatrix' => $AllPayMatrix, 'CancelledPayMatrix' => $CancelledPayMatrix]);
    }

    #### Store Pay Matrix
    public function storePayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }
        $input = $request->all();
        $data = $input;

        $EmployeeId = $request->input('EmployeeId');

        // Get Effective Date
        $EffectiveDate = '';
        if ($request->input('EffectiveFrom')) {
            $EffectiveFrom = str_replace('/', '-', $request->input('EffectiveFrom'));
            $EffectiveDate = date('Y-m-d', strtotime($EffectiveFrom));
            $data['EffectiveDate'] = $EffectiveDate;
        }

        $GetEmpLowerPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->where('tbl_employees_paymatrix.EmployeeId', $EmployeeId)
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            //->where('tbl_employees_paymatrix.id', '<', $id)
            ->where('tbl_employees_paymatrix.EffectiveDate', '<', date('Y-m-d', strtotime($EffectiveDate)))
            ->orderBy('tbl_employees_paymatrix.EffectiveDate', 'DESC')
            ->get()->first();

        // print_r(json_encode($GetEmpLowerPayMatrix));
        // exit;



        $SanctionedOrderDate = '';
        if ($request->input('OrderDate')) {
            $OrderDate = str_replace('/', '-', $request->input('OrderDate'));
            $SanctionedOrderDate = date('Y-m-d', strtotime($OrderDate));
            $data['SanctionedOrderDate'] = $SanctionedOrderDate;
        }

        $NextIncrementDate = '';
        if ($request->input('NextIncDate')) {
            $NextIncDate = str_replace('/', '-', $request->input('NextIncDate'));
            $NextIncrementDate = date('Y-m-d', strtotime($NextIncDate));
            $data['NextIncrementDate'] = $NextIncrementDate;
        }

        $HoldFromDate = '';
        if ($request->input('HoldFrom')) {
            $HoldFrom = str_replace('/', '-', $request->input('HoldFrom'));
            $HoldFromDate = date('Y-m-d', strtotime($HoldFrom));
            $data['HoldFromDate'] = $HoldFromDate;
        }

        // Sanction Order File
        $CertName = $this->userLib->useridGenrator();
        $SanctionedOrderFilePath = '';
        if ($request->hasFile('SanctionedOrderFile')) {
            $file = $request->file('SanctionedOrderFile');
            $extension = $file->getClientOriginalExtension();
            $FileName = $CertName . '-' . time() . '.' . $extension;

            Storage::putFileAs(
                'public/payscale_sanction_order',
                $file,
                $FileName
            );
            $SanctionedOrderFilePath = Storage::url('payscale_sanction_order/' . $FileName);
            $data['SanctionedOrderFilePath'] = $SanctionedOrderFilePath;
        }

        unset($data['_token']);
        unset($data['SanctionedOrderFile']);
        unset($data['OrderDate']);
        unset($data['EffectiveFrom']);
        unset($data['NextIncDate']);
        unset($data['HoldFrom']);


        $data['PayMatrixId'] =  $this->userLib->useridGenrator();
        $data['IsDeleted'] = 0;
        $data['Status'] = 1;
        $data['Created_by'] = session('UserId');
        $data['Created_at'] = date('Y-m-d H:i:s', time());
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        if ($GetEmpLowerPayMatrix) {
            $data['LowerPayScale'] = $GetEmpLowerPayMatrix->PayScale;
            $data['LowerPayBand'] = $GetEmpLowerPayMatrix->PayBand;
            $data['LowerGradePay'] = $GetEmpLowerPayMatrix->GradePay;
            $data['LowerPayLevel'] = $GetEmpLowerPayMatrix->PayLevel;
            $data['LowerPayLevelAmount'] = $GetEmpLowerPayMatrix->PayLevelAmount;
            $data['LowerPayMatrixScale'] = $GetEmpLowerPayMatrix->PayMatrixScale;
            $data['LowerPayLevelAmountId'] = $GetEmpLowerPayMatrix->PayLevelAmountId;
            $data['LowerEffectiveDate'] = $GetEmpLowerPayMatrix->EffectiveDate;

            // Change Status (De-activate) previous paymatrix
            $ChangeStatus = array();
            $ChangeStatus['Status'] = 0;
            $ChangeStatus['Updated_by'] = session('UserId');
            $ChangeStatus['Updated_at'] = date('Y-m-d H:i:s', time());

            $ChangeUpdatedData = EmployeePayMatrix::where('EmployeeId', $EmployeeId)->where('Status', '1')->update($ChangeStatus);
        }

        $PayMatrix = EmployeePayMatrix::insert($data);
        if ($PayMatrix) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    ### Change Status
    public function changeStatusPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $PayMatrixId = $request->input('PayMatrixId');
        $data = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->get()->first();

        if ($data->Status == '1') {
            $Status = '0';
        } else {
            $Status = '1';
        }

        $values = array();
        $values['Status'] = $Status;
        $values['Updated_by'] = session('UserId');
        $values['Updated_at'] = date('Y-m-d H:i:s', time());
        $ChangeStatus = EmployeePayMatrix::select('tbl_employees_paymatrix.*')->where('PayMatrixId', $PayMatrixId)->update($values);
        if ($ChangeStatus) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    ### Edit Pay Matrix
    public function editPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $PayMatrixId = $request->input('PayMatrixId');
        $GetPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_employees.EmployeeName as EmployeeName')
            ->leftJoin('tbl_employees', 'tbl_employees_paymatrix.EmployeeId', '=', 'tbl_employees.EmployeeId')
            ->where('PayMatrixId', $PayMatrixId)
            //->where('IsDeleted', '=', '0')
            ->get()->first();

        return response()->json([
            'status' => 200,
            'GetPayMatrix' => $GetPayMatrix,
        ]);
    }

    #### Update Pay Matrix
    public function updatePayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }
        $input = $request->all();
        $data = $input;

        $PayMatrixId = $request->input('PayMatrixId');
        $id = $request->input('id');
        $EmployeeId = $request->input('EmployeeId');


        // Get Effective date
        $EffectiveDate = '';
        if ($request->input('EffectiveFrom')) {
            $EffectiveFrom = str_replace('/', '-', $request->input('EffectiveFrom'));
            $EffectiveDate = date('Y-m-d', strtotime($EffectiveFrom));
            $data['EffectiveDate'] = $EffectiveDate;
        }
        
        $GetEmpLowerPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*', 'tbl_payscale.PayScaleName as PayScale', 'tbl_payband.PayBandName as PayBand', 'tbl_gradepay.GradePayName as GradePay', 'tbl_paylevel.PayLevelName as PayLevel', 'tbl_paylevel_amount.PayLevelAmount as LevelAmount')
            ->leftJoin('tbl_payscale', 'tbl_employees_paymatrix.PayScaleId', '=', 'tbl_payscale.PayScaleId')
            ->leftJoin('tbl_payband', 'tbl_employees_paymatrix.PayBandId', '=', 'tbl_payband.PayBandId')
            ->leftJoin('tbl_gradepay', 'tbl_employees_paymatrix.GradePayId', '=', 'tbl_gradepay.GradePayId')
            ->leftJoin('tbl_paylevel', 'tbl_employees_paymatrix.PayLevelId', '=', 'tbl_paylevel.PayLevelId')
            ->leftJoin('tbl_paylevel_amount', 'tbl_employees_paymatrix.PayLevelAmountId', '=', 'tbl_paylevel_amount.PayLevelAmountId')
            ->where('tbl_employees_paymatrix.EmployeeId', $EmployeeId)
            ->where('tbl_employees_paymatrix.IsDeleted', '0')
            ->where('tbl_employees_paymatrix.id', '<', $id)
            ->where('tbl_employees_paymatrix.PayMatrixId', '!=', $PayMatrixId)
            //->where('tbl_employees_paymatrix.EffectiveDate', '<', date('Y-m-d', strtotime($EffectiveDate)))
            ->orderBy('tbl_employees_paymatrix.EffectiveDate', 'DESC')
            ->get()->first();

        // print_r(json_encode($GetEmpLowerPayMatrix));
        // exit;



        $SanctionedOrderDate = '';
        if ($request->input('OrderDate')) {
            $OrderDate = str_replace('/', '-', $request->input('OrderDate'));
            $SanctionedOrderDate = date('Y-m-d', strtotime($OrderDate));
            $data['SanctionedOrderDate'] = $SanctionedOrderDate;
        }

        $NextIncrementDate = '';
        if ($request->input('NextIncDate')) {
            $NextIncDate = str_replace('/', '-', $request->input('NextIncDate'));
            $NextIncrementDate = date('Y-m-d', strtotime($NextIncDate));
            $data['NextIncrementDate'] = $NextIncrementDate;
        }

        $HoldFromDate = '';
        if ($request->input('HoldFrom')) {
            $HoldFrom = str_replace('/', '-', $request->input('HoldFrom'));
            $HoldFromDate = date('Y-m-d', strtotime($HoldFrom));
            $data['HoldFromDate'] = $HoldFromDate;
        }

        $ReleaseDate = '';
        if ($request->input('ReleasedFromDate')) {
            $ReleasedFromDate = str_replace('/', '-', $request->input('ReleasedFromDate'));
            $ReleaseDate = date('Y-m-d', strtotime($ReleasedFromDate));
            $data['ReleaseDate'] = $ReleaseDate;
        }

        // Sanction Order File
        $CertName = $this->userLib->useridGenrator();
        $SanctionedOrderFilePath = '';
        if ($request->hasFile('SanctionedOrderFile')) {
            $file = $request->file('SanctionedOrderFile');
            $extension = $file->getClientOriginalExtension();
            $FileName = $CertName . '-' . time() . '.' . $extension;

            Storage::putFileAs(
                'public/payscale_sanction_order',
                $file,
                $FileName
            );
            $SanctionedOrderFilePath = Storage::url('payscale_sanction_order/' . $FileName);
            $data['SanctionedOrderFilePath'] = $SanctionedOrderFilePath;
        }

        unset($data['_token']);
        unset($data['SanctionedOrderFile']);
        unset($data['OrderDate']);
        unset($data['EffectiveFrom']);
        unset($data['NextIncDate']);
        unset($data['HoldFrom']);
        unset($data['ReleasedFromDate']);

        if ($GetEmpLowerPayMatrix) {
            $data['LowerPayScale'] = $GetEmpLowerPayMatrix->PayScale;
            $data['LowerPayBand'] = $GetEmpLowerPayMatrix->PayBand;
            $data['LowerGradePay'] = $GetEmpLowerPayMatrix->GradePay;
            $data['LowerPayLevel'] = $GetEmpLowerPayMatrix->PayLevel;
            $data['LowerPayLevelAmount'] = $GetEmpLowerPayMatrix->PayLevelAmount;
            $data['LowerPayMatrixScale'] = $GetEmpLowerPayMatrix->PayMatrixScale;
            $data['LowerPayLevelAmountId'] = $GetEmpLowerPayMatrix->PayLevelAmountId;
            $data['LowerEffectiveDate'] = $GetEmpLowerPayMatrix->EffectiveDate;
        }

        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        // print_r(json_encode($data));
        // exit;

        $PayMatrix = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->update($data);
        if ($PayMatrix) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Hold PayMatrix
    public function holdPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $PayMatrixId = $request->input('PayMatrixId');

        $HoldFromDate = '';
        if ($request->input('PaymatrixHoldFromDate')) {
            $HoldFrom = str_replace('/', '-', $request->input('PaymatrixHoldFromDate'));
            $HoldFromDate = date('Y-m-d', strtotime($HoldFrom));
        }

        $HoldReason = $request->input('PaymatrixHoldReason');

        $values = array();
        $values['IsHold'] = '1';
        $values['HoldFromDate'] = $HoldFromDate;
        $values['HoldReason'] = $HoldReason;
        $values['IsReleased'] = '0';
        $values['Updated_by'] = session('UserId');
        $values['Updated_at'] = date('Y-m-d H:i:s', time());
        $HoldPayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*')
            ->where('PayMatrixId', $PayMatrixId)
            ->update($values);

        if ($HoldPayMatrix) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Release PayMatrix
    public function releasePayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $PayMatrixId = $request->input('PayMatrixId');

        $ReleaseDate = '';
        if ($request->input('ReleaseFromDate')) {
            $ReleaseFrom = str_replace('/', '-', $request->input('ReleaseFromDate'));
            $ReleaseDate = date('Y-m-d', strtotime($ReleaseFrom));
        }

        $ReleaseReason = $request->input('PaymatrixReleaseReason');

        $values = array();
        $values['IsReleased'] = '1';
        $values['ReleaseDate'] = $ReleaseDate;
        $values['ReleaseReason'] = $ReleaseReason;
        $values['Status'] = 0;
        $values['Updated_by'] = session('UserId');
        $values['Updated_at'] = date('Y-m-d H:i:s', time());
        $ReleasePayMatrix = EmployeePayMatrix::select('tbl_employees_paymatrix.*')
            ->where('PayMatrixId', $PayMatrixId)
            ->update($values);

        // Release PayMatrix and Create new row with active status
        if ($ReleasePayMatrix) {
            $GetHoldPayMatrix = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->get()->first();

            $data['PayMatrixId'] =  $this->userLib->useridGenrator();
            $data['EmployeeId'] =  $GetHoldPayMatrix->EmployeeId;
            $data['EmployeeCode'] =  $GetHoldPayMatrix->EmployeeCode;
            $data['PayLevelAmountId'] =  $GetHoldPayMatrix->PayLevelAmountId;
            $data['PayLevelAmount'] = $GetHoldPayMatrix->PayLevelAmount;
            $data['PayLevelId'] = $GetHoldPayMatrix->PayLevelId;
            $data['GradePayId'] = $GetHoldPayMatrix->GradePayId;
            $data['PayBandId'] = $GetHoldPayMatrix->PayBandId;
            $data['PayScaleId'] = $GetHoldPayMatrix->PayScaleId;
            $data['PayFixationId'] = $GetHoldPayMatrix->PayFixationId;
            $data['EffectiveDate'] = $GetHoldPayMatrix->EffectiveDate;
            $data['PayFixationAfterOrder'] = $GetHoldPayMatrix->PayFixationAfterOrder;
            $data['SanctionedOrderNo'] = $GetHoldPayMatrix->SanctionedOrderNo;
            $data['SanctionedOrderDate'] = $GetHoldPayMatrix->SanctionedOrderDate;
            $data['SanctionedOrderFilePath'] = $GetHoldPayMatrix->SanctionedOrderFilePath;
            $data['NextIncrementDate'] = $GetHoldPayMatrix->NextIncrementDate;

            // if ($GetHoldPayMatrix->SanctionedOrderDate) {
            //     $data['SanctionedOrderDate'] = $GetHoldPayMatrix->SanctionedOrderDate;
            // } else {
            //     $data['SanctionedOrderDate'] = null;
            // }

            $data['LowerPayScale'] = $GetHoldPayMatrix->LowerPayScale;
            $data['LowerPayBand'] = $GetHoldPayMatrix->LowerPayBand;
            $data['LowerGradePay'] = $GetHoldPayMatrix->LowerGradePay;
            $data['LowerPayLevel'] = $GetHoldPayMatrix->LowerPayLevel;
            $data['LowerPayLevelAmount'] = $GetHoldPayMatrix->LowerPayLevelAmount;
            $data['LowerPayLevelAmountId'] = $GetHoldPayMatrix->LowerPayLevelAmountId;

            $data['IsHold'] = 0;
            $data['IsReleased'] = 1;
            $data['IsDeleted'] = 0;
            $data['Status'] = 1;
            $data['Created_by'] = session('UserId');
            $data['Created_at'] = date('Y-m-d H:i:s', time());
            $data['Updated_by'] = session('UserId');
            $data['Updated_at'] = date('Y-m-d H:i:s', time());

            $PayMatrix = EmployeePayMatrix::insert($data);

            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Cancel Employee PayMatrix with Order No.
    public function cancelPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $SanctionedOrderNo = $request->input('OrderNumber');
        $EmployeeCode = $request->input('EmployeeCode');
        $CancelReason = $request->input('PaymatrixCancelReason');

        $values = array();
        $values['IsCancelled'] = 1;
        $values['CancelReason'] = $CancelReason;
        $values['Updated_by'] = session('UserId');
        $values['Updated_at'] = date('Y-m-d H:i:s', time());
        $CancelPayMatrix = EmployeePayMatrix::where('SanctionedOrderNo', $SanctionedOrderNo)->update($values);

        if ($CancelPayMatrix) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Cancel Single Pay Matrix
    public function cancelSinglePayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $data = array();
        $PayMatrixId = $request->input('PayMatrixId');
        $CancelReason = $request->input('CancelReason');

        $data['IsCancelled'] = 1;
        $data['CancelReason'] = $CancelReason;
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        $cancelData = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->update($data);
        if ($cancelData) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Confirm Pay Matrix
    public function confirmPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $data = array();
        $PayMatrixId = $request->input('PayMatrixId');
        $data['IsCancelled'] = 0;
        $data['CancelReason'] = NULL;
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        $ConfirmData = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->update($data);
        if ($ConfirmData) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Delete Pay Matrix
    public function deletePayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $data = array();
        $PayMatrixId = $request->input('PayMatrixId');
        $data['IsDeleted'] = 1;
        $data['Status'] = 0;
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        $deleteData = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId)->update($data);
        if ($deleteData) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Delete Permanent Pay Matrix
    public function destroyPayMatrix(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }
        $PayMatrixId = $request->input('PayMatrixId');
        $destroyData = EmployeePayMatrix::where('PayMatrixId', $PayMatrixId);
        $destroyData->delete();
        if ($destroyData) {
            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Submit For Approval
    public function SubmitEmpPayMatrixApproval(Request $request, $ProfileId = '')
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }
        $data = array();
        $EmployeeId = $request->input('EmployeeId');
        $ProfileId = $request->input('ProfileId');
        $UserId = $request->input('UserId');
        $ApprovalRemark = $request->input('ApprovalRemark');
        // In case of Farward for review
        $ModuleId = $request->input('ModuleId');

        $data['ApprovalStatus'] = 0;
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        if ($ModuleId) {
            $GetNoOfApproval = EmployeePayMatrix::where('EmployeeId', $EmployeeId)
                ->where('ApprovalLock', '1')
                ->where('ApprovalStatus', '=', '0')
                ->where('IsDeleted', '0')
                ->get();

            foreach ($GetNoOfApproval as $key => $ApprovalCount) {
                $NoOfApproval = $ApprovalCount->NoOfApproval + 1;

                // Update Employee PayMatrix Table in case of Farward for review
                $data['NoOfApproval'] = $NoOfApproval;

                $ApprovalRequest = EmployeePayMatrix::where('EmployeeId', $EmployeeId)
                    ->where('ApprovalLock', '1')
                    ->where('ApprovalStatus', '0')
                    ->where('IsDeleted', '0')
                    ->update($data);
            }

            // Update Approval Table in case of Farward for review
            $update_approval['ApprovalStatus'] =  '3'; // Approve = 1, Reject = 2, Forward = 3.
            $update_approval['ApprovalLevel'] = $NoOfApproval;
            $update_approval['Updated_by'] = session('UserId');
            $update_approval['Updated_at'] = date('Y-m-d H:i:s', time());

            $Update_Approval_Module = Approval::where('ModuleId', $ModuleId)
                ->where('ProfileId', session('ProfileId'))
                ->where('UserId', session('UserId'))
                ->where('ApprovalStatus', '=', '0')
                ->update($update_approval);

            if ($Update_Approval_Module) {

                $approval =  array();
                $approval['ModuleId'] =  $ModuleId;
                $approval['EmployeeId'] =  $EmployeeId;
                $approval['ModuleTitle'] =  'PayMatrix';
                $approval['ApprovalStatus'] =  '0';
                $approval['ApprovalComments'] =  $ApprovalRemark;
                $approval['ApprovalFrom'] = session('UserId');
                $approval['ProfileId'] = $ProfileId;
                $approval['UserId'] = $UserId;

                //$approval['ApprovalLevel'] = '';
                $approval['Created_at'] = date('Y-m-d H:i:s', time());
                $approval['Created_by'] = session('UserId');
                $approval['Updated_by'] = session('UserId');
                $approval['Updated_at'] = date('Y-m-d H:i:s', time());
                $Approval_Module_New = Approval::insert($approval);

                if ($Approval_Module_New) {
                    return response()->json('status_success');
                } else {
                    return response()->json('status_fail');
                }
            }
        } else {
            $data['ApprovalLock'] = 1;
            $data['NoOfApproval'] = 0;
            $data['ApprovalComment'] = '';
            $ApprovalRequest = EmployeePayMatrix::where('EmployeeId', $EmployeeId)
                ->where('ApprovalStatus', '=', '0')
                ->where('ApprovalLock', '0')
                ->where('IsDeleted', '0')
                ->update($data);
            if ($ApprovalRequest) {

                $approval =  array();
                $approval['ModuleId'] =  $this->userLib->useridGenrator();
                $approval['EmployeeId'] =  $EmployeeId;
                $approval['ModuleTitle'] =  'PayMatrix';
                $approval['ApprovalStatus'] =  '0';
                $approval['ApprovalComments'] =  $ApprovalRemark;
                $approval['ApprovalFrom'] = session('UserId');
                $approval['ProfileId'] = $ProfileId;
                $approval['UserId'] = $UserId;

                //$approval['ApprovalLevel'] = '';
                $approval['Created_at'] = date('Y-m-d H:i:s', time());
                $approval['Created_by'] = session('UserId');
                $approval['Updated_at'] = date('Y-m-d H:i:s', time());
                $approval['Updated_by'] = session('UserId');

                $Approval_Module = Approval::insert($approval);

                if ($Approval_Module) {
                    return response()->json('status_success');
                } else {
                    return response()->json('status_fail');
                }
            }
        }
    }

    #### Approve Employee PayMatrix Detail
    public function ApproveEmpPayMatrix(Request $request, $EmployeeId = '', $ModuleId = '')
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $LoginUserProfileId = session('ProfileId');
        $UserId = session('UserId');
        $EmployeeId = $request->input('EmployeeId');
        $ModuleId = $request->input('ModuleId');
        $ApprovalStatusTbl = $request->input('ApprovalStatus');

        $GetNoOfApproval = EmployeePayMatrix::select('NoOfApproval')
            ->where('EmployeeId', $EmployeeId)
            ->where('ApprovalStatus', '0')
            ->where('ApprovalLock', '1')
            //->where('NoOfApproval', '!=', '0')
            ->where('IsDeleted', '0')
            ->orderBy('id', 'DESC')
            ->get()
            ->first();

        $NoOfApproval = $GetNoOfApproval->NoOfApproval + 1;

        $approval =  array();
        $approval['ApprovalStatus'] = $ApprovalStatusTbl;
        $approval['ApprovalLevel'] = $NoOfApproval;
        $approval['Updated_by'] = session('UserId');
        $approval['Updated_at'] = date('Y-m-d H:i:s', time());
        $ApprovalUpdate = Approval::where('ModuleId', $ModuleId)->where('EmployeeId', $EmployeeId)->where('ProfileId', $LoginUserProfileId)->where('UserId', $UserId)->update($approval);

        if ($ApprovalUpdate) {
            // Update PayMatrix Table 
            $data = array();
            $data['ApprovalStatus'] = 1;
            $data['NoOfApproval'] = $NoOfApproval;
            $data['Updated_by'] = session('UserId');
            $data['Updated_at'] = date('Y-m-d H:i:s', time());

            $approveData = EmployeePayMatrix::where('EmployeeId', $EmployeeId)
                ->where('ApprovalLock', '1')
                ->where('ApprovalStatus', '0')
                ->where('IsDeleted', '0')
                ->update($data);

            return response()->json('status_success');
        } else {
            return response()->json('status_failed');
        }
    }

    #### Reject Employee PayMatrix Detail
    public function RejectEmpPrimaryDetail(Request $request)
    {
        $this->UserSessionId = session('UserId');
        if (empty($this->UserSessionId)) {
            return redirect('/');
        }

        $data = array();
        $EmployeeId = $request->input('EmployeeId');
        $Comment = $request->input('RejectComment');
        $LoginUserProfileId = session('ProfileId');
        $UserId = session('UserId');
        $ModuleId = $request->input('ModuleId');
        $ApprovalStatusTbl = $request->input('ApprovalStatus');

        $GetNoOfApproval = EmployeePayMatrix::select('NoOfApproval')
            ->where('EmployeeId', $EmployeeId)
            ->where('ApprovalStatus', '0')
            ->where('ApprovalLock', '1')
            //->where('NoOfApproval', '!=', '0')
            ->where('IsDeleted', '0')
            ->orderBy('id', 'DESC')
            ->get()
            ->first();

        $NoOfApproval = $GetNoOfApproval->NoOfApproval + 1;

        // Rejected = 2,
        $data['ApprovalStatus'] = $ApprovalStatusTbl;
        $data['ApprovalLock'] = 0;
        $data['NoOfApproval'] = $NoOfApproval;
        $data['ApprovalComment'] = $Comment;
        $data['Updated_by'] = session('UserId');
        $data['Updated_at'] = date('Y-m-d H:i:s', time());

        $approval =  array();
        $approval['ApprovalStatus'] = $ApprovalStatusTbl;
        $approval['ApprovalLevel'] = $NoOfApproval;
        $approval['ApprovalComments'] = $Comment;
        $approval['Updated_by'] = session('UserId');
        $approval['Updated_at'] = date('Y-m-d H:i:s', time());

        $ApprovalUpdate = Approval::where('ModuleId', $ModuleId)->where('EmployeeId', $EmployeeId)->where('ProfileId', $LoginUserProfileId)->where('UserId', $UserId)->update($approval);

        if ($ApprovalUpdate) {

            $rejectData = EmployeePayMatrix::where('EmployeeId', $EmployeeId)
                ->where('ApprovalLock', '1')
                ->where('ApprovalStatus', '0')
                ->where('IsDeleted', '0')->update($data);
            if ($rejectData) {

                return response()->json('status_success');
            } else {
                return response()->json('status_failed');
            }
        } else {
            return response()->json('status_failed');
        }
    }
}