noblemfd's avatar

Rules Requests causing issues in Laravel Maatwebsites Excel upload

I am using Maatwebsites-3.1 in Laravel-5.8 for Excel upload. This is shown below:

use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class EmployeesImport implements WithMultipleSheets
{
    public function sheets(): array
    {
        return [
            new FirstEmployeeSheetImport()
        ];
    }
}

The function above is used to call the one shown below:

class FirstEmployeeSheetImport implements ToModel, WithHeadingRow, WithBatchInserts, WithValidation
{
    protected $department, $employeetype, $designation, $worklocation, $nationality, $gradelevel;
    private $errors = []; // array to accumulate errors
    private $gendercode = ['Female' => 0, 'Male' => 1];
    private $hrstatus = ['Active' => 0, 'Inactive' => 1];
    private $maritalstatus = ['Single' => 1, 'Married' => 2, 'Separated' => 3, 'Divorced' => 4, 'Widow(er)' => 5, 'Other' => 6];
    use Importable;

    public function model(array $row)
    {           
        $this->worklocation = $row['work_location_id'];
        $this->nationality = $row['nationality_id'];
        $this->gradelevel = $row['grade_level_id'];

        $employee_data = [
            'employee_code'                     => $row['employee_code'],
            'first_name'                        => $row['first_name'],
            'other_name'                        => $row['other_name'] ?? '',
            'last_name'                         => $row['last_name'],
            'email'                             => $row['email'],
            'email2'                            => $row['email2'] ?? '',
            'line_manager_id'                   => $row['line_manager_id'] ?? '',
            'gender_code'                       => $this->gendercode[$row['gender_code']] ?? null,
            'hr_status'                         => $this->hrstatus[$row['hr_status']] ?? null,
            'company_id'                        => Auth::user()->company_id,
                  ];        

       $employee = HrEmployee::create($employee_data);

    }

    public function getWorkLocation(){
        if(!empty($this->worklocation) || !$this->worklocation){

            return HrWorkLocation::where('location_name',$this->worklocation)->where('company_id',Auth::user()->company_id)->pluck('id')->first();
        } else {
            return 0;
        }
    }       

    public function getNationality(){
        return ConfigCountry::where('country_code2',$this->nationality)->where('company_id',Auth::user()->company_id)->pluck('employee_code')->first();
    }

    // this function returns all validation errors after import:
    public function getErrors()
    {
        return $this->errors;
    }

    public function rules(): array
    {
        return [
            'employee_code' => [
                'required',
                'string',
                'min:2',
                'max:20',               
                Rule::unique('hr_employees')->where(function ($query) {
                    return $query->where('company_id', Auth::user()->company_id);
                })                 
            ],  
            'first_name' => [
                'required',
                'string',
                'min:3',
                'max:50'               
            ], 
            'other_name' => [
                'nullable',
                'string',
                'max:50'               
            ], 
            'last_name' => [
                'required',
                'string',
                'min:3',
                'max:50'               
            ], 
            'email' => [
                'required',
                'email', // official email
                'max:100',  
                Rule::unique('hr_employees')->where(function ($query) {
                    return $query->where('company_id', Auth::user()->company_id);
                })                 
            ],
            'line_manager_id' => 'nullable',            
            'gender_code' => 'nullable',
            'department_id' => 'required',
            'employee_type_id' => 'required',
            'designation_id' => 'required',
            'hr_status' => 'required',
                      ];
    }  

    public function customValidationAttributes()
    {
        return [
            'employee_code'                     => 'Staff ID',
            'first_name'                        => 'First Name',
            'other_name'                        => 'Middle Name',
            'last_name'                         => 'Last Name',
            'email'                             => 'Official Email',
            'line_manager_id'                   => 'Line Manager',            
            'gender_code'                       => 'Gender',
            'department_id'                     => 'Department',
            'employee_type_id'                  => 'Employee Type',
            'designation_id'                    => 'Designation',
            'hr_status'                         => 'HR Status',
        ];
    }        

    public function validationMessages()
    {
        return [
        ];
    }

    public function transformDate($value, $format = 'Y-m-d')
    {
        try {
            return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
        } catch (\ErrorException $e) {
            return \Carbon\Carbon::createFromFormat($format, $value);
        }
    } 

    public function batchSize(): int
    {
        return 200;
    }    

    public function headingRow(): int
    {
        return 1;
    }            
}

Then I have this in the controller:

public function import(Request $request){
    $request->validate([
        'file' => 'required|max:10000|mimes:xlsx,xls',
    ]);

  $path1 = $request->file('file')->store('temp'); 
  $path=storage_path('app').'/'.$path1;  

    try{
        Excel::import(new EmployeesImport, $path);        
        
    } catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
        $failures = $e->failures();
        $all_errors = $e->errors();
        Log::error($failures);
        Log::error($all_errors);
        Log::error($e);
        $errormessage = "";
        
     foreach ($failures as $failure) {
         $errormess = "";
         foreach($failure->errors() as $error)
         {
             $errormess = $errormess.$error;
         }
         $errormessage = $errormessage." ,\n At Row ".$failure->row().", ".$errormess."<br>";
     }                  
     
         // Session::flash('error', 'Excel file is not imported!');
         Session::flash('error', $errormessage); 
         return back();            
    }catch (\Illuminate\Database\QueryException $e)
    {
        $errorCode = $e->errorInfo[1];
        if($errorCode == 1062){
        Log::error($e);
        DB::rollback();
        Session::flash('error', 'You have a duplicate entry problem!');
        }
        return back();
    }       
    Session::flash('success', 'Employee Records Imported Successfully');
    return redirect()->route('hr.employees.index');       
} 

The problem is that, When I tried t upload the excel file it shows that it was successful. But I found that no data is store in the database.

I eventually found that it's not recognising:

  Rule::unique('hr_employees')->where(function ($query) {
      return $query->where('company_id', Auth::user()->company_id);
  })

and I'm using it to validate the uniqueness of each attribute with company_id

How do I resolve this issues?

Thank you

0 likes
0 replies

Please or to participate in this conversation.