<?php namespace App\Imports; use Brian2694\Toastr\Facades\Toastr; use Illuminate\Support\Collection; use Illuminate\Support\Str; use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithHeadingRow; use Maatwebsite\Excel\Concerns\WithMultipleSheets; use Maatwebsite\Excel\Concerns\WithStartRow; use Modules\OrgSubscription\Entities\OrgAttendance; class OrgAttandanceImport implements WithMultipleSheets, WithStartRow, WithHeadingRow, ToCollection { public function sheets(): array { return [ '0' => new OrgAttandanceImport(), ]; } public function startRow(): int { return 2; } public function headingRow(): int { return 1; } private function validAttendValue($value) { $arr = ['A', 'L', 'O']; if (in_array($value, $arr)) { return true; } else { return false; } } public function collection(Collection $rows) { $score = []; $toArray = $rows->sortBy('name')->toArray(); foreach ($toArray as $key => $row) { $serial = ++$key; try { $error = 0; $id = explode('-', base64_decode($row['id'])); $user_id = $id[0]; $course_id = $id[1]; $class_id = $id[2]; if (empty($row['attend'])) { Toastr::error(trans('org.Attend is required') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); $error++; } if (!empty($row['total_score'])) { if (!is_numeric($row['total_score'])) { $error++; Toastr::error(trans('org.Total Score Is Not Numeric') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if (empty($row['pass_rate'])) { $error++; Toastr::error(trans('org.Pass Role is required') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if (empty($row['actual_score'])) { $error++; Toastr::error(trans('org.Actual Score is required') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if (!is_numeric($row['pass_rate'])) { $error++; Toastr::error(trans('org.Pass Rate Is Not Numeric') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if (!is_numeric($row['actual_score'])) { $error++; Toastr::error(trans('org.Actual Score Is Not Numeric') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if ($row['pass_rate'] > 100) { $error++; Toastr::error(trans('org.Pass Rate can not grater then 100') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if ($row['actual_score'] > $row['total_score']) { $error++; Toastr::error(trans('org.Actual score can not grater then total score') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if (isset($score[$course_id])) { if ($score[$course_id] != $row['total_score']) { $error++; Toastr::error(trans('org.Same course total must be same') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } } else { $score[$course_id] = $row['total_score']; } } if (!$this->validAttendValue($row['attend'])) { $error++; Toastr::error(trans('org.Invalid Input') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } if ($error != 0) { continue; } $attandance = OrgAttendance::where('user_id', $user_id)->where('course_id', $course_id)->first(); if (!$attandance) { $attandance = new OrgAttendance(); } $pass = 0; if (isset($row['pass_rate']) && isset($row['actual_score']) && isset($row['total_score'])) { $actual_rate = getPercentage($row['actual_score'], $row['total_score']); if ($actual_rate >= $row['pass_rate']) { $pass = 1; } } $attandance->user_id = $user_id; $attandance->course_id = $course_id; $attandance->class_id = $class_id; $attandance->attend = Str::upper($row['attend'] ?? 'A'); $attandance->total_score = $row['total_score'] ?? 0; $attandance->pass_rate = $row['pass_rate'] ?? 0; $attandance->actual_score = $row['actual_score'] ?? 0; $attandance->pass = $pass; $attandance->save(); } catch (\Exception $e) { Toastr::error(trans('common.Something Went Wrong') . ', ' . trans('org.For row') . ' ' . $serial, trans('common.Failed')); } } } }