diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 6499b11..384367f 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -2,12 +2,47 @@ namespace App\Http\Controllers; +use App\Models\User; +use App\Models\EmployeeCounter; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Hash; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redis; class AuthController extends Controller { + private function generateEmployeeId() + { + return DB::transaction(function () { + + $year = date('Y'); + + $counter = EmployeeCounter::lockForUpdate() + ->where('year', $year) + ->first(); + + if (!$counter) { + $counter = EmployeeCounter::create([ + 'year' => $year, + 'last_number' => 0 + ]); + } + + $counter->last_number += 1; + $counter->save(); + + $runningNumber = str_pad($counter->last_number, 3, '0', STR_PAD_LEFT); + + return 'S' . $year . $runningNumber; + }); + } + + public function showRegister() + { + return view('auth.register'); + } + public function showLogin() { if (Auth::check()) { @@ -31,6 +66,20 @@ public function login(Request $request) 'password' => $request->password ]; + $user = User::where($loginType, $request->login)->first(); + + if (!$user) { + return back()->withErrors([ + 'login' => 'Account not registered.' + ]); + } + + if (!$user->is_approved) { + return back()->withErrors([ + 'login' => 'Account not approved by admin.' + ]); + } + if (Auth::attempt($credentials)) { $request->session()->regenerate(); @@ -70,4 +119,25 @@ public function logout(Request $request) return redirect('/login'); } + + public function register(Request $request) + { + $request->validate([ + 'name' => 'required|max:255', + 'email' => 'required|email|unique:users', + 'password' => 'required|min:8|confirmed' + ]); + + User::create([ + 'name' => $request->name, + 'employee_id' => $this->generateEmployeeId(), + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'is_approved' => false, + 'token_version' => 1, + ]); + + return redirect('/login') + ->with('message', 'Registration successful. Waiting for admin approval.'); + } } diff --git a/app/Models/EmployeeCounter.php b/app/Models/EmployeeCounter.php new file mode 100644 index 0000000..383ccc1 --- /dev/null +++ b/app/Models/EmployeeCounter.php @@ -0,0 +1,10 @@ +boolean('is_approved')->default(false); + } + + if (!Schema::hasColumn('users', 'token_version')) { + $table->integer('token_version')->default(1); + } + }); + } + + public function down(): void {} +}; diff --git a/database/migrations/2026_02_21_003010_create_employee_counters_table.php b/database/migrations/2026_02_21_003010_create_employee_counters_table.php new file mode 100644 index 0000000..022a21e --- /dev/null +++ b/database/migrations/2026_02_21_003010_create_employee_counters_table.php @@ -0,0 +1,29 @@ +id(); + $table->integer('year')->unique(); + $table->integer('last_number')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('employee_counters'); + } +}; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 7f4e55a..2e90d91 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -120,7 +120,7 @@
- New here? Create an account + New here? Create an account
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 0000000..e807f48 --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,166 @@ + + + +
+ +