diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 9897320c8097e769ee5bc4db40492adc3db84449..6f133cb7cb441f803574794dc45bbd32d6ce0cad 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -13,6 +13,8 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; +use Maatwebsite\Excel\Facades\Excel; +use App\Imports\UsersImport; class RegisterController extends Controller { @@ -45,13 +47,25 @@ class RegisterController extends Controller * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ - protected function validator(array $data) + protected function validateRegister(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', - 'username' => 'required|string|max:4', + 'username' => 'required|string|max:18|unique:users', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', + 'phone' => 'required|min:8|max:12' + ]); + } + + protected function validateUsersRegister(array $data) + { + return Validator::make($data, [ + 'name' => 'required|string|max:255', + 'username' => 'required|string|max:18|unique:users', + 'email' => 'required|string|email|max:255|unique:users', + 'phone' => 'required|min:8|max:12', + 'password' => 'required|min:6', ]); } @@ -84,22 +98,21 @@ class RegisterController extends Controller public function registerUser(Request $request) { $data = $request->all(); $username = $data['username']; - if(User::where('username',$username)->count()>0) { - echo '<div class="alert alert-warning alert-dismissible fade show text-center"> - <button type="button" class="close" data-dismiss="alert">×</button> - This user <strong>already exist.</strong> - </div>'; - return view('auth.register'); - } else if(strlen($data['username']) > 18){ - echo '<div class="alert alert-warning alert-dismissible fade show text-center"> - <button type="button" class="close" data-dismiss="alert">×</button> - <strong>Username</strong> too long (maximum size: 18 characters). + $validator = $this->validateRegister($data); + + if ($validator->fails()) { + $error_messages = json_decode($validator->errors(), true); + foreach ($error_messages as $error_message) { + echo '<div class="alert alert-warning alert-dismissible fade show text-center"> + <button type="button" class="close" data-dismiss="alert">×</button>' + .$error_message[0].' </div>'; + } return view('auth.register'); - } else if(strlen($data['phone']) > 18){ + } else if (KelasTesis::select('id')->count()==0) { echo '<div class="alert alert-warning alert-dismissible fade show text-center"> <button type="button" class="close" data-dismiss="alert">×</button> - <strong>Invalid</strong> phone number. + Kelas Tesis is <strong>not available</strong>. Please make sure there is available Kelas Tesis. </div>'; return view('auth.register'); } else { @@ -119,9 +132,71 @@ class RegisterController extends Controller </div>'; return view('auth.register'); } -// echo $id; + } + public function registerUsers(Request $request) { + $file = $request->file('register_file'); + $extension = $file->getClientOriginalExtension(); - } + $success = 0; + $failed = 0; + + if (empty($file)) { + echo '<div class="alert alert-warning alert-dismissible fade show text-center"> + <button type="button" class="close" data-dismiss="alert">×</button> + File is <strong>failed</strong> to upload. + </div>'; + return view('auth.register'); + } else if (($extension == 'xlsx') || ($extension == 'xls')) { + $sheets = Excel::toArray(new UsersImport, $file); + $head_rows = $sheets[0]; + $rows = array_slice($head_rows, 1); + $kelas_tesis_available = !(KelasTesis::select('id')->count() == 0); + + foreach ($rows as $row) { + // Buat array index data + $data['name'] = $row[0]; + $data['username'] = $row[1]; + $data['email'] = $row[2]; + $data['phone'] = $row[3]; + $data['password'] = $row[4]; + $data['role'] = $row[5]; + + $validator = $this->validateUsersRegister($data); + if ($validator->fails()) { + //echo json_encode($validator->errors()); + $failed += 1; + } else { + $role = $data['role']; + if ($role == User::ROLE_MAHASISWA && !($kelas_tesis_available)) { + $failed += 1; + } else { + $success += 1; + if($role == User::ROLE_DOSEN) { + Dosen::create(['id'=>$user->id]); + } else if($role == User::ROLE_MAHASISWA && ($kelas_tesis_available)) { + $id_kelas_tesis = KelasTesis::orderByRaw('updated_at - created_at DESC')->first(); + Mahasiswa::create(['id'=>$user->id, 'id_kelas_tesis'=>$id_kelas_tesis->id]); + } else if($role == User::ROLE_MANAJER) { + Manajer::create(['id'=>$user->id]); + } + } + } + } + } + if ($success) { + echo '<div class="alert alert-success alert-dismissible fade show text-center"> + <button type="button" class="close" data-dismiss="alert">×</button> + <strong>Success !</strong>'. $success . ' user(s) are added! + </div>'; + } + if ($failed) { + echo '<div class="alert alert-warning alert-dismissible fade show text-center"> + <button type="button" class="close" data-dismiss="alert">×</button> + '. $failed.' user(s) are <strong>failed</strong> to add. + </div>'; + } + return view('auth.register'); + } } diff --git a/app/Imports/UsersImport.php b/app/Imports/UsersImport.php new file mode 100644 index 0000000000000000000000000000000000000000..108d65ce362c5f6031dc7479599bc7943902d747 --- /dev/null +++ b/app/Imports/UsersImport.php @@ -0,0 +1,37 @@ +<?php + +namespace App\Imports; + +use App\User; +use Illuminate\Support\Facades\Hash; +use Maatwebsite\Excel\Concerns\ToModel; + +class UsersImport implements ToModel +{ + /** + * @param array $row + * + * @return \Illuminate\Database\Eloquent\Model|null + */ + public function model(array $row) + { + if (!isset($row[0])) { + return null; + } + return new User([ + 'name' => $row[0], + 'email' => $row[2], + 'username'=> $row[1], + 'password' => Hash::make($row[4]), + 'phone' => $row[3], + 'role' => $row[5] + ]); + } + + public function getCsvSettings(): array + { + return [ + 'delimiter' => "," + ]; + } +} diff --git a/composer.json b/composer.json index b19c42b4fcf74499e80a3b1b3eb5aa4ea38644fd..b43efbd9065b9bfd1b4c62fcd7ff963a7575e7a2 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,9 @@ "doctrine/dbal": "^2.7", "fideloper/proxy": "~4.0", "laravel/framework": "5.6.*", - "laravel/tinker": "~1.0" + "laravel/tinker": "~1.0", + "maatwebsite/excel": "^3.1", + "shuchkin/simplexlsx": "dev-master" }, "require-dev": { "filp/whoops": "~2.0", diff --git a/composer.lock b/composer.lock index 4933c21faecdd8c5fc3b2e69aa20b778dc1a0e00..705c5f35eba547bfc04ae2be0a23df7fe00c6a92 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3ced3972e73368ce58e3cebab939da0e", + "content-hash": "689509529b33dd1cf87310476864d53f", "packages": [ { "name": "dnoegel/php-xdg-base-dir", @@ -1091,6 +1091,238 @@ ], "time": "2018-01-27T16:03:56+00:00" }, + { + "name": "maatwebsite/excel", + "version": "3.1.6", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "d5e51dca5ed845c1ce605a7a1d9882d5b57e270d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/d5e51dca5ed845c1ce605a7a1d9882d5b57e270d", + "reference": "d5e51dca5ed845c1ce605a7a1d9882d5b57e270d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "5.5.* || 5.6.* || 5.7.*", + "php": "^7.0", + "phpoffice/phpspreadsheet": "^1.4" + }, + "require-dev": { + "mockery/mockery": "^1.1", + "orchestra/database": "^3.6", + "orchestra/testbench": "^3.6", + "phpunit/phpunit": "^7.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "time": "2019-01-30T19:01:33+00:00" + }, + { + "name": "markbaker/complex", + "version": "1.4.7", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "time": "2018-10-13T23:28:42+00:00" + }, + { + "name": "markbaker/matrix", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/6ea97472b5baf12119b4f31f802835b820dd6d64", + "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/functions/adjoint.php", + "classes/src/functions/antidiagonal.php", + "classes/src/functions/cofactors.php", + "classes/src/functions/determinant.php", + "classes/src/functions/diagonal.php", + "classes/src/functions/identity.php", + "classes/src/functions/inverse.php", + "classes/src/functions/minors.php", + "classes/src/functions/trace.php", + "classes/src/functions/transpose.php", + "classes/src/operations/add.php", + "classes/src/operations/directsum.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "time": "2018-11-04T22:12:12+00:00" + }, { "name": "monolog/monolog", "version": "1.23.0", @@ -1321,6 +1553,100 @@ ], "time": "2017-09-27T21:40:39+00:00" }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "bf00f0cc5f55c354018f9a9ef15e6e3e1a229051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/bf00f0cc5f55c354018f9a9ef15e6e3e1a229051", + "reference": "bf00f0cc5f55c354018f9a9ef15e6e3e1a229051", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "markbaker/complex": "^1.4", + "markbaker/matrix": "^1.1", + "php": "^5.6|^7.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.0", + "dompdf/dompdf": "^0.8.0", + "friendsofphp/php-cs-fixer": "@stable", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^7.0.0", + "phpcompatibility/php-compatibility": "^8.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.3", + "tecnickcom/tcpdf": "^6.2" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + }, + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "time": "2019-01-02T04:42:54+00:00" + }, { "name": "psr/container", "version": "1.0.0", @@ -1617,6 +1943,53 @@ ], "time": "2018-01-20T00:28:24+00:00" }, + { + "name": "shuchkin/simplexlsx", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/shuchkin/simplexlsx.git", + "reference": "6eb1bab92dc56d738a7ce53afbde43ed9541dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shuchkin/simplexlsx/zipball/6eb1bab92dc56d738a7ce53afbde43ed9541dd18", + "reference": "6eb1bab92dc56d738a7ce53afbde43ed9541dd18", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "ext-simplexml": "*", + "ext-zlib": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/SimpleXLSX.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sergey Shuchkin (SMSPILOT)", + "email": "sergey.shuchkin@gmail.com", + "homepage": "http://www.shuchkin.ru/" + } + ], + "description": "Parse and retrieve data from Excel XLSx files. MS Excel 2007 workbooks PHP reader.", + "homepage": "https://github.com/shuchkin/simplexlsx", + "keywords": [ + "backend", + "excel", + "parser", + "php", + "xlsx" + ], + "time": "2019-01-24T22:47:18+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.0.2", @@ -4363,7 +4736,9 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "shuchkin/simplexlsx": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index bcc6f7ec4438e5ab13d62c96c3f86b5db5242288..a377c8e7ad574f47ea36485cf873d8a7edb68d47 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -6,7 +6,6 @@ <div class="col-md-8"> <div class="card"> <div class="card-header">Register</div> - <div class="card-body"> <form method="POST" action="/register"> @csrf @@ -103,6 +102,32 @@ </form> </div> </div> + <br> + <div class="card"> + <div class="card-header">Register with File</div> + <div class="card-body"> + <form method="POST" action="/register/file" enctype="multipart/form-data"> + @csrf + + <div class="form-group row"> + <label for="name" class="col-md-4 col-form-label text-md-right">File</label> + <div class="col-md-6"> + <div class="d-flex justify-content-center"> + <input type="file" id="register_file" name="register_file" class="form-control" multiple="" accept="application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"> + </div> + </div> + </div> + <div class="form-group row mb-0"> + <div class="col-md-6 offset-md-4"> + <button type="submit" class="btn btn-primary"> + Register with File + </button> + </div> + </div> + </form> + </div> + </div> + </div> </div> </div> </div> diff --git a/routes/web.php b/routes/web.php index 0c8ba7b91ca95216a58edac90647f55d96d75676..5b3746a904e59039b0caf0524c958fe1faf0390d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -36,6 +36,7 @@ Route::post('mahasiswa/edit/{id}', 'MahasiswaController@edit'); Route::get('register','Auth\RegisterController@showForm')->name('register'); Route::post('register','Auth\RegisterController@registerUser')->name('registerPost'); +Route::post('register/file','Auth\RegisterController@registerUsers')->name('registerFile'); Route::get('/home', 'HomeController@index')->name('home'); Route::get('/generate/admin', 'Auth\RegisterController@generateAdmin');