push kode lagi

This commit is contained in:
Ulill 2025-05-25 15:23:18 +07:00
parent 8f1b4b7cdf
commit 5dc02c6b64
54 changed files with 1765 additions and 563 deletions

View File

@ -18,132 +18,128 @@ public function __construct()
public function index() public function index()
{ {
$alternatif = Alternatif::with('penilaian.crips')->get(); $alternatif = Alternatif::with('penilaian.crips')->get();
$kriteria = Kriteria::with('crips')->orderBy('nama_kriteria','ASC')->get(); $kriteria = Kriteria::get();
$penilaian = Penilaian::with('crips','alternatif')->get(); $penilaian = Penilaian::with('crips', 'alternatif')->get();
if (count($penilaian) == 0) {
return redirect(route('penilaian.index'))->with('empty','Data Kosong Silahkan Isi Terlbih Dahulu'); if (count($penilaian) == 0) {
} return redirect(route('penilaian.index'))->with('empty', 'Data Kosong Silahkan Isi Terlebih Dahulu');
}
//mencari min max normalisasi
foreach ($kriteria as $key => $value) { // Mencari min max untuk normalisasi
foreach ($penilaian as $key_1 => $value_1) { $minMax = [];
if ($value->id == $value_1->crips->kriteria_id) foreach ($kriteria as $value) {
{ foreach ($penilaian as $value_1) {
if ($value->attribut == 'Benefit') { if ($value->id == $value_1->crips->kriteria_id) {
$minMax[$value->id][] = $value_1->crips->bobot; if ($value->attribut == 'Benefit' || $value->attribut == 'Cost') {
}elseif ($value->attribut == 'Cost') {
$minMax[$value->id][] = $value_1->crips->bobot; $minMax[$value->id][] = $value_1->crips->bobot;
} }
} }
} }
} }
//Normalisasi // Normalisasi
$normalisasi = [];
foreach ($penilaian as $key_1 => $value_1) { foreach ($penilaian as $value_1) {
foreach ($kriteria as $key => $value) { $namaAlternatif = $value_1->alternatif->nama_alternatif ?? 'Alternatif_' . $value_1->alternatif_id;
foreach ($kriteria as $value) {
if ($value->id == $value_1->crips->kriteria_id) { if ($value->id == $value_1->crips->kriteria_id) {
if ($value->attribut == 'Benefit') { if ($value->attribut == 'Benefit') {
$normalisasi[$value_1->alternatif->nama_alternatif][$value->id] = $value_1->crips->bobot / max($minMax[$value->id]); $normalisasi[$namaAlternatif][$value->id] = $value_1->crips->bobot / max($minMax[$value->id]);
}elseif ($value->attribut == 'Cost') { } elseif ($value->attribut == 'Cost') {
$normalisasi[$value_1->alternatif->nama_alternatif][$value->id] = min($minMax[$value->id]) / $value_1->crips->bobot; $normalisasi[$namaAlternatif][$value->id] = min($minMax[$value->id]) / $value_1->crips->bobot;
} }
} }
} }
} }
// Perangkingan // Perangkingan
$ranking = [];
foreach ($normalisasi as $key => $value) { foreach ($normalisasi as $key => $value) {
foreach ($kriteria as $key_1 => $value_1) { $rank = [];
$rank[$key][] = $value[$value_1->id] * $value_1->bobot; foreach ($kriteria as $value_1) {
$rank[] = $value[$value_1->id] * ($value_1->bobot / 100);
} }
$ranking[] = [
'name' => $key,
'normalisasi' => $value,
'score' => array_sum($rank)
];
} }
$ranking = $normalisasi; // Urutkan berdasarkan skor dan tambahkan peringkat
foreach ($normalisasi as $key => $value) { $sortedData = collect($ranking)->sortByDesc('score')->values()->map(function ($item, $index) {
$ranking[$key][] = array_sum($rank[$key]); $item['rank'] = $index + 1;
} return $item;
// arsort($ranking);
$sortedData = collect($ranking)->sortByDesc(function ($value) {
return array_sum($value);
})->toArray(); })->toArray();
// dd($sortedData); // Debugging (hapus setelah verifikasi)
return view('admin.perhitungan.index', compact('alternatif','kriteria','normalisasi','sortedData')); // dd($sortedData);
return view('admin.perhitungan.index', compact('alternatif', 'kriteria', 'normalisasi', 'sortedData'));
} }
public function downloadPDF()
{
public function downloadPDF() {
setlocale(LC_ALL, 'IND'); setlocale(LC_ALL, 'IND');
$tanggal = Carbon::now()->formatLocalized('%A, %d %B %Y'); $tanggal = Carbon::now()->formatLocalized('%A, %d %B %Y');
$alternatif = Alternatif::with('penilaian.crips')->get(); $alternatif = Alternatif::with('penilaian.crips')->get();
$kriteria = Kriteria::with('crips')->orderBy('nama_kriteria','ASC')->get(); $kriteria = Kriteria::with('crips')->orderBy('nama_kriteria', 'ASC')->get();
$penilaian = Penilaian::with('crips','alternatif')->get(); $penilaian = Penilaian::with('crips', 'alternatif')->get();
if (count($penilaian) == 0) { if (count($penilaian) == 0) {
return redirect(route('penilaian.index')); return redirect(route('penilaian.index'));
} }
//mencari min max normalisasi
foreach ($kriteria as $key => $value) { // Mencari min max untuk normalisasi
foreach ($penilaian as $key_1 => $value_1) { $minMax = [];
if ($value->id == $value_1->crips->kriteria_id) foreach ($kriteria as $value) {
{ foreach ($penilaian as $value_1) {
if ($value->attribut == 'Benefit') { if ($value->id == $value_1->crips->kriteria_id) {
$minMax[$value->id][] = $value_1->crips->bobot; if ($value->attribut == 'Benefit' || $value->attribut == 'Cost') {
}elseif ($value->attribut == 'Cost') {
$minMax[$value->id][] = $value_1->crips->bobot; $minMax[$value->id][] = $value_1->crips->bobot;
} }
} }
} }
} }
//Normalisasi // Normalisasi
$normalisasi = [];
foreach ($penilaian as $key_1 => $value_1) { foreach ($penilaian as $value_1) {
foreach ($kriteria as $key => $value) { $namaAlternatif = $value_1->alternatif->nama_alternatif ?? 'Alternatif_' . $value_1->alternatif_id;
foreach ($kriteria as $value) {
if ($value->id == $value_1->crips->kriteria_id) { if ($value->id == $value_1->crips->kriteria_id) {
if ($value->attribut == 'Benefit') { if ($value->attribut == 'Benefit') {
$normalisasi[$value_1->alternatif->nama_alternatif][$value->id] = $value_1->crips->bobot / max($minMax[$value->id]); $normalisasi[$namaAlternatif][$value->id] = $value_1->crips->bobot / max($minMax[$value->id]);
}elseif ($value->attribut == 'Cost') { } elseif ($value->attribut == 'Cost') {
$normalisasi[$value_1->alternatif->nama_alternatif][$value->id] = min($minMax[$value->id]) / $value_1->crips->bobot; $normalisasi[$namaAlternatif][$value->id] = min($minMax[$value->id]) / $value_1->crips->bobot;
} }
} }
} }
} }
// Perangkingan // Perangkingan
$ranking = [];
foreach ($normalisasi as $key => $value) { foreach ($normalisasi as $key => $value) {
foreach ($kriteria as $key_1 => $value_1) { $rank = [];
$rank[$key][] = $value[$value_1->id] * $value_1->bobot; foreach ($kriteria as $value_1) {
$rank[] = $value[$value_1->id] * ($value_1->bobot / 100);
} }
$ranking[] = [
'name' => $key,
'normalisasi' => $value,
'score' => array_sum($rank)
];
} }
$ranking = $normalisasi;
foreach ($normalisasi as $key => $value) {
$ranking[$key][] = array_sum($rank[$key]);
}
// arsort($ranking);
$sortedData = collect($ranking)->sortByDesc(function ($value) { // Urutkan berdasarkan skor dan tambahkan peringkat
return array_sum($value); $sortedData = collect($ranking)->sortByDesc('score')->values()->map(function ($item, $index) {
})->toArray(); $item['rank'] = $index + 1;
return $item;
})->toArray();
$pdf = PDF::loadView('admin.perhitungan.perhitungan-pdf', compact('alternatif', 'kriteria', 'normalisasi', 'sortedData', 'tanggal'));
$pdf = PDF::loadView('admin.perhitungan.perhitungan-pdf',compact('alternatif','kriteria','normalisasi','sortedData','tanggal')); $pdf->setPaper('A3', 'portrait');
$pdf->setPaper('A3', 'potrait');
return $pdf->stream('perhitungan.pdf'); return $pdf->stream('perhitungan.pdf');
} }
} }

View File

@ -7,6 +7,8 @@
use App\Models\Penilaian; use App\Models\Penilaian;
use Barryvdh\DomPDF\Facade\Pdf; use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon; use Carbon\Carbon;
use App\Models\User;
use App\Models\Crips;
use Exception; use Exception;
class AlternatifController extends Controller class AlternatifController extends Controller
@ -35,17 +37,115 @@ public function store(Request $request){
'pendidikan' => 'required', 'pendidikan' => 'required',
'ipk' => 'required|numeric', 'ipk' => 'required|numeric',
'jurusan' => 'required', 'jurusan' => 'required',
'lama_studi' => 'required|numeric', 'lama_studi' => 'required|integer|min:0|max:10',
'pengalaman' => 'required|numeric', 'pengalaman' => 'required|integer|min:0|max:10',
'serkom' => 'required', 'serkom' => 'required',
'cv' => 'required|file|mimes:pdf,doc,docx|max:2048',
'dokumen_pendukung.*' => 'nullable|file|mimes:pdf,doc,docx,jpg,jpeg,png|max:2048',
]); ]);
// Upload CV
if ($request->hasFile('cv')) {
$validated['cv'] = $request->file('cv')->store('cv', 'public');
}
// Upload dokumen pendukung (opsional)
$dokumenPendukungPaths = [];
if ($request->hasFile('dokumen_pendukung')) {
foreach ($request->file('dokumen_pendukung') as $file) {
$dokumenPendukungPaths[] = $file->store('dokumen_pendukung', 'public');
}
}
$validated['dokumen_pendukung'] = json_encode($dokumenPendukungPaths);
Alternatif::create($validated); $alternatif = Alternatif::create($validated);
for ($kriteria_id = 1; $kriteria_id <= 7; $kriteria_id++) {
$crips_id = $this->mapToCrips($alternatif, $kriteria_id);
if ($crips_id) {
Penilaian::create([
'alternatif_id' => $alternatif->id,
'kriteria_id' => $kriteria_id,
'crips_id' => $crips_id,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
return redirect()->route('alternatif.index')->with('msg', 'Data pelamar berhasil ditambahkan!'); return redirect()->route('alternatif.index')->with('msg', 'Data pelamar berhasil ditambahkan!');
} }
private function mapToCrips($alternatif, $kriteria_id)
{
$crips = Crips::where('kriteria_id', $kriteria_id)->get();
$crips_id = null;
switch ($kriteria_id) {
case 1: // Usia
$usia = $alternatif->usia;
foreach ($crips as $crip) {
if ($crip->nama_crips == '23-24' && $usia >= 23 && $usia <= 24) $crips_id = $crip->id;
elseif ($crip->nama_crips == '25-26' && $usia >= 25 && $usia <= 26) $crips_id = $crip->id;
elseif ($crip->nama_crips == '27-28' && $usia >= 27 && $usia <= 28) $crips_id = $crip->id;
elseif ($crip->nama_crips == '29-30' && $usia >= 29 && $usia <= 30) $crips_id = $crip->id;
elseif ($crip->nama_crips == '> 30' && $usia > 30) $crips_id = $crip->id;
}
break;
case 2: // Pendidikan
$pendidikan = $alternatif->pendidikan;
foreach ($crips as $crip) {
if ($crip->nama_crips == $pendidikan) $crips_id = $crip->id;
}
break;
case 3: // IPK
$ipk = $alternatif->ipk;
foreach ($crips as $crip) {
if ($crip->nama_crips == '3.5-4.0' && $ipk >= 3.5 && $ipk <= 4.0) $crips_id = $crip->id;
elseif ($crip->nama_crips == '3.0-3.49' && $ipk >= 3.0 && $ipk < 3.5) $crips_id = $crip->id;
elseif ($crip->nama_crips == '2.75-2.99' && $ipk >= 2.75 && $ipk < 3.0) $crips_id= $crip->id;
elseif ($crip->nama_crips == '2.5-2.74' && $ipk >= 2.5 && $ipk < 2.75) $crips_id = $crip->id;
}
break;
case 4: // Jurusan
$jurusan = $alternatif->jurusan;
foreach ($crips as $crip) {
if ($crip->nama_crips == $jurusan) $crips_id = $crip->id;
}
break;
case 5: // Lama Studi
$lama_studi = $alternatif->lama_studi;
foreach ($crips as $crip) {
if ($crip->nama_crips == '<4 tahun' && $lama_studi < 4) $crips_id = $crip->id;
elseif ($crip->nama_crips == '4-5 tahun' && $lama_studi >= 4 && $lama_studi <= 5) $crips_id = $crip->id;
elseif ($crip->nama_crips == '>5 tahun' && $lama_studi > 5) $crips_id = $crip->id;
}
break;
case 6: // Pengalaman
$pengalaman = $alternatif->pengalaman;
foreach ($crips as $crip) {
if ($crip->nama_crips == '>3 tahun' && $pengalaman > 3) $crips_id = $crip->id;
elseif ($crip->nama_crips == '1-3 tahun' && $pengalaman >= 1 && $pengalaman <= 3) $crips_id = $crip->id;
}
break;
case 7: // Serkom
$serkom = $alternatif->serkom;
foreach ($crips as $crip) {
if ($crip->nama_crips == 'Punya' && $serkom == 1) $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Tidak punya' && $serkom == 0) $crips_id = $crip->id;
}
break;
}
return $crips_id;
}
public function edit($id) public function edit($id)
{ {
@ -62,7 +162,7 @@ public function update(Request $request, $id)
'pendidikan' => 'required|string', 'pendidikan' => 'required|string',
'ipk' => 'required|numeric|min:0|max:4', 'ipk' => 'required|numeric|min:0|max:4',
'jurusan' => 'required|string', 'jurusan' => 'required|string',
'lama_studi' => 'required|numeric|min:0|max:10', 'lama_studi' => 'required|integer |min:0|max:10',
'pengalaman' => 'required|integer|min:0|max:50', 'pengalaman' => 'required|integer|min:0|max:50',
'serkom' => 'required|boolean', 'serkom' => 'required|boolean',
]); ]);
@ -70,6 +170,10 @@ public function update(Request $request, $id)
try { try {
$alternatif = Alternatif::findOrFail($id); $alternatif = Alternatif::findOrFail($id);
$alternatif->update($validated); $alternatif->update($validated);
Penilaian::where('alternatif_id', $id)->delete();
// Buat ulang penilaian berdasarkan data terbar
return back()->with('msg','Berhasil Mengubah Data'); return back()->with('msg','Berhasil Mengubah Data');
} catch (Exception $e) { } catch (Exception $e) {
\Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage()); \Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
@ -84,8 +188,9 @@ public function destroy($id){
$alternatif = Alternatif::findOrFail($id); $alternatif = Alternatif::findOrFail($id);
$alternatif->delete(); $alternatif->delete();
Penilaian::truncate(); Penilaian::where('alternatif_id', $id)->delete();
return back()->with('msg', 'Data pelamar berhasil dihapus!');
} catch (Exception $e) { } catch (Exception $e) {
\Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage()); \Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
die("Gagal"); die("Gagal");

View File

@ -30,8 +30,9 @@ protected function redirectTo()
} }
} }
public function __construct() public function logout()
{ {
$this->middleware('guest')->except('logout'); Auth::logout();
return redirect('/');
} }
} }

View File

@ -3,40 +3,29 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails; use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Http\Request;
class VerificationController extends Controller class VerificationController extends Controller
{ {
/*
|--------------------------------------------------------------------------
| Email Verification Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling email verification for any
| user that recently registered with the application. Emails may also
| be re-sent if the user didn't receive the original email message.
|
*/
use VerifiesEmails; use VerifiesEmails;
/** // Redirect ke halaman login setelah verifikasi berhasil
* Where to redirect users after verification. protected function redirectTo()
* {
* @var string return '/login';
*/ }
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct() public function __construct()
{ {
$this->middleware('auth'); $this->middleware('auth');
$this->middleware('signed')->only('verify'); $this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend'); $this->middleware('throttle:6,1')->only('verify', 'resend');
} }
// Tambahan opsional: tampilkan pesan sukses setelah redirect ke login
public function verified(Request $request)
{
return redirect('/login')->with('status', 'Email berhasil diverifikasi. Silakan login.');
}
} }

View File

@ -0,0 +1,66 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\Request;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Display the form to request a password reset link.
*
* @return \Illuminate\View\View
*/
public function showLinkRequestForm()
{
return view('auth.forgot-password');
}
/**
* Get the response for a successful password reset link request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetLinkResponse(Request $request, $response)
{
return back()->with('status', trans($response));
}
/**
* Get the response for a failed password reset link request.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetLinkFailedResponse(Request $request, $response)
{
return back()->withErrors(['email' => trans($response)]);
}
}

View File

@ -1,67 +1,149 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Penilaian;
use App\Models\Alternatif; use App\Models\Alternatif;
use App\Models\Kriteria; use App\Models\Penilaian;
use App\Models\Crips; use App\Models\Crips;
use Carbon\Carbon; use App\Models\Kriteria;
use Illuminate\Support\Facades\DB; use App\Http\Controllers\AlgoritmaController; // Impor AlgoritmaController
use Illuminate\Support\Facades\Log; use Illuminate\Http\Request;
use Exception;
use PDF;
class PenilaianController extends Controller class PenilaianController extends Controller
{ {
public function index(){ public function __construct()
$alternatif = Alternatif::with('penilaian.crips')->get(); {
$kriteria = Kriteria::with('crips')->orderBy('id','ASC')->get(); $this->middleware('auth');
//return response()->json($alternatif);
return view('admin.penilaian.index', compact('alternatif', 'kriteria'));
} }
public function index()
{
$penilaians = Penilaian::with(['alternatif', 'kriteria', 'crips'])->get();
$kriteria = Kriteria::all();
$alternatif = Alternatif::with('penilaian.crips')->get();
return view('admin.penilaian.index', compact('penilaians', 'kriteria', 'alternatif'));
}
public function create()
{
$alternatifs = Alternatif::all();
$kriteria = Kriteria::all();
$crips = Crips::all();
return view('penilaian.create', compact('alternatifs', 'kriteria', 'crips'));
}
public function store(Request $request) public function store(Request $request)
{ {
try { $validated = $request->validate([
DB::table('penilaian')->truncate(); // lebih aman 'alternatif_id' => 'required|exists:alternatif,id',
'kriteria_id' => 'required|exists:kriteria,id',
$kriteria = Kriteria::orderBy('id', 'ASC')->get(); // urutan penting ]);
foreach ($request->crips_id as $alternatif_id => $crips_list) { // Ambil data alternatif berdasarkan id_alternatif
foreach ($crips_list as $index => $crips_id) { $alternatif = Alternatif::find($validated['alternatif_id']);
Penilaian::create([ $kriteria = Kriteria::find($validated['kriteria_id']);
'alternatif_id' => $alternatif_id,
'kriteria_id' => $kriteria[$index]->id, // ambil kriteria berdasarkan urutan // Tentukan nilai berdasarkan id_kriteria
'crips_id' => $crips_id $nilai = null;
]); switch ($kriteria->id) {
} case 1: $nilai = $alternatif->usia; break; // Usia
} case 2: $nilai = $alternatif->pendidikan; break; // Pendidikan
case 3: $nilai = $alternatif->ipk; break; // IPK
return back()->with('msg', 'Berhasil Disimpan!'); case 4: $nilai = $alternatif->jurusan; break; // Jurusan
} catch (Exception $e) { case 5: $nilai = $alternatif->lama_studi; break; // Lama Studi
Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage()); case 6: $nilai = $alternatif->pengalaman; break; // Pengalaman
die("Gagal"); case 7: $nilai = $alternatif->serkom; break; // Serkom
} }
}
public function downloadPDF() { // Panggil getCripsId untuk mendapatkan id_crips
setlocale(LC_ALL, 'IND'); $crips_id = $this->getCripsId($kriteria->id, $nilai);
$tanggal = Carbon::now()->formatLocalized('%A, %d %B %Y');
// $penilaian = Kriteria::get();
// $alternatif = Alternatif::with('penilaian.crips')->get();
// $kriteria = Kriteria::with('crips')->get();
$alternatifs = Alternatif::with('penilaian.crips')->get();
$kriteria = Kriteria::with('crips')->orderBy('nama_kriteria','ASC')->get();
$penilaian = Penilaian::with('crips','alternatif')->get();
$pdf = PDF::loadView('admin.penilaian.penilaian-pdf',compact('kriteria','tanggal','alternatif','penilaian')); if (!$crips_id) {
$pdf->setPaper('A3', 'potrait'); return redirect()->back()->with('error', 'Sub-kriteria tidak ditemukan untuk kriteria ini.');
return $pdf->stream('penilaian.pdf'); }
// Simpan data penilaian
$penilaian = Penilaian::create([
'alternatif_Id' => $validated['alternatif_id'],
'kriteria_id' => $validated['kriteria_id'],
'crips_id' => $crips_id,
]);
// Panggil perhitungan SAW dari AlgoritmaController
$algoritmaController = new AlgoritmaController();
$algoritmaController->calculateSAW(
Alternatif::with('penilaian.crips')->get(),
Kriteria::get(),
Penilaian::with('crips', 'alternatif')->get()
);
return redirect()->route('penilaian.index')->with('msg', 'Penilaian berhasil disimpan dan dihitung!');
} }
}
private function getCripsId($kriteria_id, $nilai)
{
$crips = Crips::where('kriteria_id', $kriteria_id)->get();
$crips_id = null;
switch ($kriteria_id) {
case 1: // Usia
foreach ($crips as $crip) {
if ($crip->nama_crips == '23-24' && $nilai >= 23 & $nilai <= 24) $crips_id = $crip->id;
elseif ($crip->nama_crips == '25-26' && $nilai >= 25 && $nilai <= 26) $crips_id = $crip->id;
elseif ($crip->nama_crips == '27-28' && $nilai >= 27 && $nilai <= 28) $crips_id = $crip->id;
elseif ($crip->nama_crips == '29-30' && $nilai >= 29 && $nilai <= 30) $crips_id = $crip->id;
elseif ($crip->nama_crips == '> 30' && $nilai > 30) $crips_id = $crip->id;
}
break;
case 2: // Pendidikan
foreach ($crips as $crip) {
if ($crip->nama_crips == $nilai) $crips_id = $crip->id;
}
break;
case 3: // IPK
foreach ($crips as $crip) {
if ($crip->nama_crips == '3.5-4.0' && $nilai >= 3.5 && $nilai <= 4.0) $crips_id = $crip->id;
elseif ($crip->nama_crips == '3.0-3.49' && $nilai >= 3.0 && $nilai < 3.5) $crips_id = $crip->id;
elseif ($crip->nama_crips == '2.75-2.99' && $nilai >= 2.75 && $nilai < 3.0) $crips_id = $crip->id;
elseif ($crip->nama_crips == '2.5-2.74' && $nilai >= 2.5 && $nilai < 2.75) $crips_id = $crip->id;
}
break;
case 4: // Jurusan
foreach ($crips as $crip) {
if ($crip->nama_crips == 'Teknik Sipil' && $nilai == 'Teknik Sipil') $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Arsitektur' && $nilai == 'Arsitektur') $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Teknologi Rekayasa Konstruksi Bangunan Gedung' && $nilai == 'Teknologi Rekayasa Konstruksi Bangunan Gedung') $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Akuntansi' && $nilai == 'Akuntansi') $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Lainnya' && $nilai == 'Lainnya') $crips_id = $crips->id;
}
break;
case 5: // Lama Studi
foreach ($crips as $crip) {
if ($crip->nama_crips == '<4 tahun' && $nilai < 4) $crips_id = $crip->id;
elseif ($crip->nama_crips == '4-5 tahun' && $nilai >= 4 && $nilai <= 5) $crips_id = $crip->id;
elseif ($crip->nama_crips == '>5 tahun' && $nilai > 5) $crips_id = $crip->id;
}
break;
case 6: // Pengalaman
foreach ($crips as $crip) {
if ($crip->nama_crips == '1-3 tahun' && $nilai >= 1 && $nilai <= 3) $crips_id = $crip->id;
elseif ($crip->nama_crips == '>3 tahun' && $nilai > 3) $crips_id = $crip->id;
}
break;
case 7: // Serkom
foreach ($crips as $crip) {
if ($crip->nama_crips == 'Punya' && $nilai == 1) $crips_id = $crip->id;
elseif ($crip->nama_crips == 'Tidak punya' && $nilai == 0) $crips_id = $crip->id;
}
break;
}
return $crips_id;
}
}

View File

@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller
{
public function index()
{
$user = Auth::user();
// Cek role-nya
if ($user->role === 'admin') {
// Tampilkan view untuk admin
return view('admin.profile.index', compact('user'));
} else {
// Tampilkan view untuk user biasa
return view('user.profile.index', compact('user'));
}
}
public function updatePhoto(Request $request)
{
$request->validate([
'photo' => 'image|mimes:jpeg,png,jpg|max:2048',
]);
$user = Auth::user();
if ($request->hasFile('photo')) {
$filename = time() . '.' . $request->photo->extension();
$request->photo->move(public_path('assets/images'), $filename);
$user->photo = 'assets/images/'.$filename;
$user->save();
}
return redirect()->back()->with('success', 'Foto profil berhasil diperbarui.');
}
public function updatePassword(Request $request)
{
$request->validate([
'current_password' =>'required',
'new_password' => 'required', 'min:8', 'confirmed',
'new_password_confirmation' => 'required',
]);
$user = Auth::user();
if (!Hash::check($request->current_password, $user->password)) {
return back()->withErrors(['current_password' => 'Password lama tidak cocok.']);
}
// Update password baru
$user->update([
'password' => Hash::make($request->new_password),
]);
return redirect()->back()->with('success', 'Password berhasil diperbarui!');
}
}

View File

@ -6,6 +6,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
class RegisterUserController extends Controller class RegisterUserController extends Controller
{ {
public function showRegistrationForm() public function showRegistrationForm()
@ -15,6 +16,7 @@ public function showRegistrationForm()
public function register(Request $request) public function register(Request $request)
{ {
// Validasi input
$request->validate([ $request->validate([
'name' => 'required|string|max:191', 'name' => 'required|string|max:191',
'email' => 'required|email|unique:users', 'email' => 'required|email|unique:users',
@ -22,19 +24,26 @@ public function register(Request $request)
'alamat' => 'required|string|max:255', 'alamat' => 'required|string|max:255',
'telepon' => 'required|string|max:20', 'telepon' => 'required|string|max:20',
'keterangan' => 'nullable|string|max:255', 'keterangan' => 'nullable|string|max:255',
'g-recaptcha-response' => 'required|captcha',
]); ]);
User::create([ // Buat pengguna
$user = User::create([
'name' => $request->name, 'name' => $request->name,
'email' => $request->email, 'email' => $request->email,
'password' => Hash::make($request->password), 'password' => Hash::make($request->password),
'alamat' => $request->alamat, 'alamat' => $request->alamat,
'telepon' => $request->telepon, 'telepon' => $request->telepon,
'keterangan' => $request->keterangan, 'keterangan' => $request->keterangan,
'role' => 'user', // langsung set role user 'role' => 'user',
]); ]);
return redirect()->route('login')->with('success', 'Akun berhasil didaftarkan, silakan login!');
}
}
// Login pengguna secara otomatis (opsional)
//auth()->login($user);
// Arahkan ke halaman verifikasi
return redirect()->route('home')->with('success', 'Akun berhasil didaftarkan, silakan verifikasi email Anda!');
}
}

View File

@ -66,5 +66,6 @@ class Kernel extends HttpKernel
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'admin' => \App\Http\Middleware\AdminMiddleware::class, 'admin' => \App\Http\Middleware\AdminMiddleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class, 'user' => \App\Http\Middleware\UserMiddleware::class,
]; ];
} }

View File

@ -12,7 +12,7 @@ class Alternatif extends Model
protected $guarded = []; protected $guarded = [];
protected $fillable = [ protected $fillable = [
'nama_alternatif', 'usia', 'pendidikan', 'ipk', 'nama_alternatif', 'usia', 'pendidikan', 'ipk',
'jurusan', 'lama_studi', 'pengalaman', 'serkom' 'jurusan', 'lama_studi', 'pengalaman', 'serkom', 'cv', 'dokumen_pendukung'
]; ];

View File

@ -11,8 +11,5 @@ class Kriteria extends Model
protected $table = 'kriteria'; protected $table = 'kriteria';
protected $guarded = []; protected $guarded = [];
public function crips()
{
return $this->hasMany(Crips::class,'kriteria_id');
}
} }

View File

@ -13,11 +13,16 @@ class Penilaian extends Model
public function crips() public function crips()
{ {
return $this->belongsTo(Crips::class, 'crips_id'); return $this->belongsTo(Crips::class, 'crips_id', 'id');
} }
public function kriteria()
{
return $this->belongsTo(Kriteria::class, 'kriteria_id', 'id');
}
public function alternatif() public function alternatif()
{ {
return $this->belongsTo(Alternatif::class, 'alternatif_id'); return $this->belongsTo(Alternatif::class, 'alternatif_id');
} }
} }

View File

@ -2,16 +2,15 @@
namespace App\Models; namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
class User extends Authenticatable
{ {
use HasApiTokens, HasFactory, Notifiable; use HasApiTokens, HasFactory, Notifiable;
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
* *

View File

@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
* *
* @var string * @var string
*/ */
public const HOME = '/ '; public const HOME = '/redirect ';
/** /**
* The controller namespace for the application. * The controller namespace for the application.

View File

@ -6,7 +6,8 @@
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.0", "php": "^8.0",
"barryvdh/laravel-dompdf": "^2.0", "anhskohbo/no-captcha": "^3.7",
"barryvdh/laravel-dompdf": "^2.2",
"guzzlehttp/guzzle": "^7.2", "guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^9.0", "laravel/framework": "^9.0",
"laravel/sanctum": "^2.14", "laravel/sanctum": "^2.14",

66
composer.lock generated
View File

@ -4,8 +4,72 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "cb2e4801c4d5a6d3b45e0bc7d7035ecf", "content-hash": "910e867f92f12159e6b1cdfff092548a",
"packages": [ "packages": [
{
"name": "anhskohbo/no-captcha",
"version": "3.7.0",
"source": {
"type": "git",
"url": "https://github.com/anhskohbo/no-captcha.git",
"reference": "87666572f0dbe1e3380a2e9ae7574bf3a2d0804e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/anhskohbo/no-captcha/zipball/87666572f0dbe1e3380a2e9ae7574bf3a2d0804e",
"reference": "87666572f0dbe1e3380a2e9ae7574bf3a2d0804e",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.2|^7.0",
"illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"php": ">=5.5.5"
},
"require-dev": {
"phpunit/phpunit": "~4.8|^9.5.10|^10.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"NoCaptcha": "Anhskohbo\\NoCaptcha\\Facades\\NoCaptcha"
},
"providers": [
"Anhskohbo\\NoCaptcha\\NoCaptchaServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Anhskohbo\\NoCaptcha\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "anhskohbo",
"email": "anhskohbo@gmail.com"
}
],
"description": "No CAPTCHA reCAPTCHA For Laravel.",
"keywords": [
"captcha",
"laravel",
"laravel4",
"laravel5",
"laravel6",
"no-captcha",
"recaptcha"
],
"support": {
"issues": "https://github.com/anhskohbo/no-captcha/issues",
"source": "https://github.com/anhskohbo/no-captcha/tree/3.7.0"
},
"time": "2025-02-25T18:53:34+00:00"
},
{ {
"name": "barryvdh/laravel-dompdf", "name": "barryvdh/laravel-dompdf",
"version": "v2.2.0", "version": "v2.2.0",

View File

@ -18,7 +18,7 @@ public function up()
$table->string('name',191); $table->string('name',191);
$table->string('email',191)->unique(); $table->string('email',191)->unique();
$table->timestamp('email_verified_at')->nullable(); $table->timestamp('email_verified_at')->nullable();
$table->string('password',191); $table->string('password');
$table->string('alamat'); $table->string('alamat');
$table->string('telepon'); $table->string('telepon');
$table->string('keterangan'); $table->string('keterangan');

View File

@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('notifications', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('type');
$table->morphs('notifiable');
$table->text('data');
$table->timestamp('read_at')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('notifications');
}
};

View File

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('queue')->index();
$table->longText('payload');
$table->unsignedTinyInteger('attempts');
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('jobs');
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

126
public/css/custom.css Normal file
View File

@ -0,0 +1,126 @@
/* Gaya untuk halaman verifikasi email */
.verify-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #e6f3fa 0%, #d4e9f2 100%);
font-family: 'Arial', sans-serif;
}
.verify-card {
background: #ffffff;
border-radius: 15px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
padding: 2rem;
max-width: 500px;
width: 100%;
text-align: center;
animation: fadeIn 1s ease-in-out;
}
.verify-icon {
display: inline-block;
width: 60px;
height: 60px;
background: #28a745;
border-radius: 50%;
position: relative;
margin-bottom: 1.5rem;
}
.verify-icon::before {
content: '✉️';
font-size: 2rem;
color: #ffffff;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.verify-title {
font-size: 1.8rem;
font-weight: bold;
color: #2c3e50;
margin-bottom: 1rem;
}
.verify-text {
font-size: 1rem;
color: #6c757d;
margin-bottom: 1.5rem;
line-height: 1.6;
}
.verify-resend-btn {
font-size: 1rem;
color: #007bff;
text-decoration: none;
font-weight: 600;
transition: color 0.3s ease;
}
.verify-resend-btn:hover {
color: #0056b3;
text-decoration: underline;
}
.verify-home-btn {
display: inline-block;
padding: 0.75rem 1.5rem;
background: #f8f9fa;
color: #2c3e50;
border: 2px solid #dee2e6;
border-radius: 25px;
text-decoration: none;
font-size: 1rem;
font-weight: 500;
transition: all 0.3s ease;
}
.verify-home-btn:hover {
background: #dee2e6;
border-color: #ced4da;
color: #212529;
}
.verify-alert {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
border-radius: 8px;
padding: 1rem;
margin-bottom: 1.5rem;
position: relative;
}
.verify-alert-close {
position: absolute;
top: 0.5rem;
right: 0.75rem;
background: none;
border: none;
font-size: 1rem;
color: #155724;
cursor: pointer;
}
@keyframes fadeIn {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(0); }
}
/* Responsif */
@media (max-width: 576px) {
.verify-card {
padding: 1.5rem;
margin: 1rem;
}
.verify-title {
font-size: 1.5rem;
}
.verify-text {
font-size: 0.9rem;
}
}

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title> <title>Data Alternatif</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<style type="text/css"> <style type="text/css">
.garis1{ .garis1{
@ -14,10 +14,10 @@
} }
#camat{ #hrd{
text-align:center; text-align:center;
} }
#nama-camat{ #nama-hrd{
margin-top:100px; margin-top:100px;
text-align:center; text-align:center;
} }
@ -35,13 +35,13 @@
<div> <div>
<table> <table>
<tr> <tr>
<td style="padding-right: 240px; padding-left: 20px"><img src="https://4.bp.blogspot.com/-TBASjipimVM/WM-xhIQc5yI/AAAAAAAAD5o/NeSO8wMRISQMLeTCfKBFmewY4vQt1y-NQCEw/s1600/Logo%2BJakarta%2BHitam.png" width="90" height="90" ></td> <td style="padding-right: 240px; padding-left: 20px"><img src="{{ asset('assets/images/logo no bg.png') }}" width="90" height="90" ></td>
<td> <td>
<center> <center>
<font size="4">RUKUN TETANGGA 004</font><br> <font size="4">PT.Intecon Bangun Persada</font><br>
<font size="4">RUKUN WARGA 001</font><br> <font size="2">Alamat: Jl. Cadika No. 4A, Sempusari, Kaliwates, Jember, Jawa Timur, Indonesia</font><br>
<font size="2">KELURAHAN KRAMAT JATI KECAMATAN KRAMAT JATI</font><br> <font size="2">Email: <a href="mailto:inteconbangunpersada@gmail.com">inteconbangunpersada@gmail.com</a></font><br>
<font size="2">KOTA ADMINISTRASI JAKARTA TIMUR</font><br> <font size="2">Phone: +62 331 423445</font><br>
</center> </center>
</td> </td>
</tr> </tr>
@ -49,7 +49,7 @@
<hr class="garis1"/> <hr class="garis1"/>
<div style="margin-top: 25px; margin-bottom: 25px;"> <div style="margin-top: 25px; margin-bottom: 25px;">
<center><strong><u>LIST WARGA</u></strong></center> <center><strong><u>DATA ALTERNATIF</u></strong></center>
</div> </div>
<div class="collapse show" id="listkriteria"> <div class="collapse show" id="listkriteria">
@ -57,23 +57,27 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover" id="DataTable"> <table class="table table-striped table-hover" id="DataTable">
<thead> <thead>
<tr> <tr>
<th>No</th> <th>Nama</th>
<th>Nama Warga</th> <th>Usia</th>
<th>NIK</th> <th>Pendidikan</th>
<th>Alamat</th> <th>IPK</th>
<th>Telepon</th> <th>Jurusan</th>
</tr> <th>Lama Studi</th>
<th>Pengalaman</th>
</tr>
</thead> </thead>
<tbody> <tbody>
@php $no = 1; @endphp @php $no = 1; @endphp
@foreach ($alternatif as $row) @foreach ($alternatif as $row)
<tr> <tr>
<td>{{ $no++ }}</td>
<td>{{ $row->nama_alternatif }}</td> <td>{{ $row->nama_alternatif }}</td>
<td>{{ $row->nik }}</td> <td>{{ $row->usia }}</td>
<td>{{ $row->alamat }}</td> <td>{{ $row->pendidikan }}</td>
<td>{{ $row->telepon }}</td> <td>{{ $row->ipk }}</td>
<td>{{ $row->jurusan }}</td>
<td>{{ $row->lama_studi }}</td>
<td>{{ $row->pengalaman }}</td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
@ -85,9 +89,9 @@
<div id="ttd" class="row"> <div id="ttd" class="row">
<div class="col-md-4"></div> <div class="col-md-4"></div>
<div class="col-md-4"> <div class="col-md-4">
<p id="camat">Jakarta, {{ $tanggal }}</p> <p id="hrd">Jember, {{ $tanggal }}</p>
<p id="camat"><strong>KETUA RT 004 / RW 001</strong></p> <p id="hrd"><strong>HRD & staff admin</strong></p>
<div id="nama-camat"><strong><u>AGUSTINA</u></strong><br /> <div id="nama-hrd"><strong><u>Yudi Sulistiawan</u></strong><br />
NIP. 3175044408730004</div> NIP. 3175044408730004</div>
</div> </div>
</div> </div>

View File

@ -33,7 +33,9 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
<th>Lama Studi</th> <th>Lama Studi</th>
<th>Pengalaman</th> <th>Pengalaman</th>
<th>Serkom</th> <th>Serkom</th>
<th>Aksi</th> <th>CV</th>
<th>Dokumen Pendukung</th>
<th>Aksi</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -47,6 +49,12 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
<td>{{ $row->lama_studi }}</td> <td>{{ $row->lama_studi }}</td>
<td>{{ $row->pengalaman }}</td> <td>{{ $row->pengalaman }}</td>
<td>{{ $row->serkom ? 'Punya' : 'Tidak punya' }}</td> <td>{{ $row->serkom ? 'Punya' : 'Tidak punya' }}</td>
<td>
<a href="{{ asset('storage/' . $row->cv) }}" target="_blank">Lihat CV</a>
</td>
<td>
<a href="{{ asset('storage/' . $row->dokumen_pendukung) }}" target="_blank">Lihat Dokumen Pendukung</a>
</td>
<td> <td>
<a href="{{ route('alternatif.edit',$row->id) }}" class="btn btn-sm btn-circle btn-warning"> <a href="{{ route('alternatif.edit',$row->id) }}" class="btn btn-sm btn-circle btn-warning">
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>

View File

@ -1,5 +1,5 @@
@extends('layouts.app') @extends('layouts.app')
@section('title', 'SPK Penerima Bantuan | Crips') @section('title', 'SPK Penerimaan Karyawan | Crips')
@section('topbar', 'Data Crips') @section('topbar', 'Data Crips')
@section('css') @section('css')
@ -60,13 +60,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@stop @stop

View File

@ -42,6 +42,7 @@
<a href="{{ route('kriteria.index') }}"> <a href="{{ route('kriteria.index') }}">
<div class="card border-left-success shadow h-100 py-2"> <div class="card border-left-success shadow h-100 py-2">
<div class="card-body"> <div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2"> <div class="col mr-2">
<div class="text-xs font-weight-bold text-success text-uppercase mb-1"> <div class="text-xs font-weight-bold text-success text-uppercase mb-1">
Jumlah Kriteria</div> Jumlah Kriteria</div>
@ -52,6 +53,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</a> </a>
</div> </div>
</div> </div>
@ -94,4 +96,4 @@
</div> </div>
</a> </a>
</div> --> </div> -->
@endsection @endsection

View File

@ -1,6 +1,6 @@
@extends('layouts.app') @extends('layouts.app')
@section('title', 'Tambah Crips '. $kriteria->nama_kriteria) @section('title', 'Tambah Sub Kriteria '. $kriteria->nama_kriteria)
@section('topbar', 'Data Crips') @section('topbar', 'Data Sub Kriteria')
@section('css') @section('css')
<!-- Custom styles for this page --> <!-- Custom styles for this page -->
@ -13,7 +13,7 @@
<!-- Card Header - Accordion --> <!-- Card Header - Accordion -->
<a href="#tambahcrips" class="d-block card-header py-3" data-toggle="collapse" <a href="#tambahcrips" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample"> role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">Tambah Crips</h6> <h6 class="m-0 font-weight-bold text-primary">Tambah Sub Kriteria</h6>
</a> </a>
<!-- Card Content - Collapse --> <!-- Card Content - Collapse -->
@ -32,7 +32,7 @@
@csrf @csrf
<input type="hidden" value="{{ $kriteria->id }}" name="kriteria_id"> <input type="hidden" value="{{ $kriteria->id }}" name="kriteria_id">
<div class="form-group"> <div class="form-group">
<label for="nama">Nama Crips</label> <label for="nama">Nama Sub Kriteria</label>
<input type="text" class="form-control @error ('nama_crips') is-invalid @enderror" name="nama_crips" value="{{ old('nama_crips') }}"> <input type="text" class="form-control @error ('nama_crips') is-invalid @enderror" name="nama_crips" value="{{ old('nama_crips') }}">
@error('nama_crips') @error('nama_crips')
@ -43,7 +43,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="bobot">Bobot Crips</label> <label for="bobot">Bobot</label>
<input type="text" class="form-control @error ('bobot') is-invalid @enderror" name="bobot" value="{{ old('bobot') }}"> <input type="text" class="form-control @error ('bobot') is-invalid @enderror" name="bobot" value="{{ old('bobot') }}">
@error('bobot') @error('bobot')
@ -66,7 +66,7 @@
<!-- Card Header - Accordion --> <!-- Card Header - Accordion -->
<a href="#listcrips" class="d-block card-header py-3" data-toggle="collapse" <a href="#listcrips" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample"> role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">List Crips {{ $kriteria->nama_kriteria }}</h6> <h6 class="m-0 font-weight-bold text-primary">List Sub Kriteria {{ $kriteria->nama_kriteria }}</h6>
</a> </a>
<!-- Card Content - Collapse --> <!-- Card Content - Collapse -->
@ -80,7 +80,7 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a> --}}
<thead> <thead>
<tr> <tr>
<th>No</th> <th>No</th>
<th>Nama Crips</th> <th>Nama Sub Kriteria</th>
<th>Bobot</th> <th>Bobot</th>
<th>Aksi</th> <th>Aksi</th>
</tr> </tr>

View File

@ -48,53 +48,35 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
</div> </div>
<br><br> <br><br>
<table class="table table-bordered table-hover"> <table class="table table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th>Nama Alternatif</th> <th>Nama Alternatif</th>
@foreach ($kriteria as $key => $value) @foreach ($kriteria as $key => $value)
<th>{{ $value->nama_kriteria }}</th> <th>{{ $value->nama_kriteria }}</th>
@endforeach @endforeach
</tr> </tr>
</thead> </thead>
<tbody>
@forelse ($alternatif as $alt => $valt) @forelse ($alternatif as $alt => $valt)
<tr> <tr>
<td>{{ $valt->nama_alternatif }}</td> <td>{{ $valt->nama_alternatif }}</td>
@if (count($valt->penilaian) > 0) @foreach($kriteria as $k)
@foreach($kriteria as $key => $value) <td>
<td> @php
<select name="crips_id[{{$valt->id}}][]" class="form-control"> $penilaian = $valt->penilaian->firstWhere('kriteria_id', $k->id);
@foreach($value->crips as $k_1 => $v_1) @endphp
<option value="{{ $v_1->id }}" {{ $v_1->id == $valt->penilaian[$key]->crips_id ? 'selected' : '' }}> {{ $penilaian ? $penilaian->crips->nama_crips : '-' }}
{{ $v_1->nama_crips }}</option> </td>
@endforeach
@endforeach </tr>
</select> @empty
</td> <tr>
@endforeach <td colspan="{{ count($kriteria) + 1 }}">Tidak ada data!</td>
@else </tr>
@foreach($kriteria as $key => $value) @endforelse
<td> </tbody>
<select name="crips_id[{{$valt->id}}][]" class="form-control"> </table>
@foreach($value->crips as $k_1 => $v_1)
<option value="{{ $v_1->id }}">
{{ $v_1->nama_crips }}</option>
@endforeach
</select>
</td>
@endforeach
@endif
</tr>
@empty
<tr>
<td>Tidak ada data!</td>
</tr>
@endforelse
</tbody>
</table>
</form> </form>
</div> </div>
</div> </div>
@ -103,4 +85,4 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
</div> </div>
</div> </div>
@stop @stop

View File

@ -67,7 +67,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@forelse ($alternatif as $alt => $valt) @forelse ($alternatifs as $alt => $valt)
<tr> <tr>
<td>{{ $valt->nama_alternatif }}</td> <td>{{ $valt->nama_alternatif }}</td>
@if (count($valt->penilaian) > 0) @if (count($valt->penilaian) > 0)

View File

@ -3,74 +3,55 @@
@section('topbar', 'Data Perhitungan') @section('topbar', 'Data Perhitungan')
@section('content') @section('content')
{{-- <div class="mb-4">
<!-- Card Header - Accordion -->
<div class="row">
<div class="col">
<a href="{{ URL::to('download-perhitungan-pdf') }}" target="_blank" class="d-none d-sm-inline-block btn btn-sm btn-success shadow-sm float-right"><i
class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
</div>
</div>
</div> --}}
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<!-- Card Header - Accordion --> <a href="#listkriteria" class="d-block card-header py-3" data-toggle="collapse"
<a href="#listkriteria" class="d-block card-header py-3" data-toggle="collapse" role="button" aria-expanded="true" aria-controls="collapseCardExample">
role="button" aria-expanded="true" aria-controls="collapseCardExample"> <h6 class="m-0 font-weight-bold text-primary">Tahap Analisa</h6>
<h6 class="m-0 font-weight-bold text-primary">Tahap Analisa</h6> </a>
</a>
<!-- Card Content - Collapse -->
<div class="collapse show" id="listkriteria"> <div class="collapse show" id="listkriteria">
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr>
<th>Nama Alternatif</th>
@foreach ($kriteria as $key => $value)
<th>{{ $value->nama_kriteria }}</th>
@endforeach
</tr>
</thead>
<tbody>
@forelse ($alternatif as $alt => $valt)
<tr> <tr>
<th>Nama Alternatif</th> <td>{{ $valt->nama_alternatif }}</td>
@foreach ($kriteria as $key => $value) @if (count($valt->penilaian) > 0)
<th>{{ $value->nama_kriteria }}</th> @foreach($valt->penilaian as $key => $value)
@endforeach <td>
{{ $value->crips->bobot }}
</td>
@endforeach
@endif
</tr> </tr>
</thead> @empty
<tbody> <tr>
@forelse ($alternatif as $alt => $valt) <td>Tidak ada data!</td>
<tr> </tr>
<td>{{ $valt->nama_alternatif }}</td> @endforelse
@if (count($valt->penilaian) > 0) </tbody>
@foreach($valt->penilaian as $key => $value) </table>
<td>
{{ $value->crips->bobot }}
</td>
@endforeach
@endif
</tr>
@empty
<tr>
<td>Tidak ada data!</td>
</tr>
@endforelse
</tbody>
</table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<!-- Card Header - Accordion -->
<a href="#normalisasi" class="d-block card-header py-3" data-toggle="collapse" <a href="#normalisasi" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample"> role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">Tahap Normalisasi</h6> <h6 class="m-0 font-weight-bold text-primary">Tahap Normalisasi</h6>
</a> </a>
<div class="collapse show" id="normalisasi">
<!-- Card Content - Collapse --> <div class="card-body">
<div class="collapse show" id="normalisasi"> <div class="table-responsive">
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr> <tr>
@ -84,33 +65,26 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
@foreach ($normalisasi as $key => $value) @foreach ($normalisasi as $key => $value)
<tr> <tr>
<td>{{ $key }}</td> <td>{{ $key }}</td>
@foreach($value as $key_1 => $value_1) @foreach ($kriteria as $k)
<td> <td>{{ number_format($value[$k->id] ?? 0, 2) }}</td>
@if($value[count($value)-1] != $key_1) @endforeach
{{ $value_1 }}
@endif
</td>
@endforeach
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<!-- Card Header - Accordion -->
<a href="#rank" class="d-block card-header py-3" data-toggle="collapse" <a href="#rank" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample"> role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">Tahap Perangkingan</h6> <h6 class="m-0 font-weight-bold text-primary">Tahap Perangkingan</h6>
</a> </a>
<div class="collapse show" id="rank">
<!-- Card Content - Collapse --> <div class="card-body">
<div class="collapse show" id="rank"> <div class="table-responsive">
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr> <tr>
@ -129,21 +103,21 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@php $no = 1;@endphp @foreach($sortedData as $data)
@foreach($sortedData as $key => $value) <tr>
<tr> <td>{{ $data['name'] }}</td>
<td>{{ $key }}</td> @foreach($kriteria as $k)
@foreach($value as $key_1 => $value_1) <td>{{ number_format($data['normalisasi'][$k->id] ?? 0, 2) }}</td>
<td>{{ number_format($value_1, 1) }}</td> @endforeach
@endforeach <td>{{ number_format($data['score'], 2) }}</td>
<td>{{ $no++ }}</td> <td>{{ $data['rank'] }}</td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
@stop @stop

View File

@ -0,0 +1,169 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Profil Pengguna</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css" rel="stylesheet">
<style>
body {
background: rgb(120, 150, 193);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.profile-card {
max-width: 600px;
margin: 80px auto;
background: #fff;
border-radius: 15px;
padding: 30px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08);
text-align: center;
}
.profile-title {
font-size: 24px;
font-weight: 600;
}
.profile-info {
text-align: left;
margin-top: 20px;
}
.profile-info p {
margin-bottom: 8px;
}
</style>
</head>
<body>
<!-- Tombol kembali di pojok kiri atas -->
<a href="{{ route('admin.home') }}" class="btn btn-light shadow-sm d-inline-flex align-items-center"
style="position: absolute; top: 20px; left: 20px; z-index: 1000; gap: 6px;">
<i class="bi bi-house-fill" style="font-size: 20px;"></i>
Beranda
</a>
<!-- Alert session -->
@if (session('success'))
<div class="alert alert-success container mt-4">
{{ session('success') }}
</div>
@endif
@if ($errors->any())
<div class="alert alert-danger container mt-4">
<ul class="mb-0">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="profile-card">
<!-- Tombol kembali -->
<!-- Foto & upload -->
<form action="{{ route('profile.updatePhoto') }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="avatar-container text-center" style="position: relative; display: inline-block;">
<label for="photo" style="cursor: pointer;">
@if ($user->photo)
<img src="{{ asset( $user->photo) }}" alt="Foto Profil"
style="width: 120px; height: 120px; border-radius: 50%; object-fit: cover;">
@else
<div style="
width: 120px;
height: 120px;
background-color: #007bff;
border-radius: 50%;
color: white;
font-size: 36px;
display: flex;
align-items: center;
justify-content: center;">
{{ strtoupper(substr($user->name, 0, 2)) }}
</div>
@endif
<!-- Ikon Edit -->
<div style="
position: absolute;
bottom: 0;
right: 0;
background-color: #fff;
border-radius: 50%;
padding: 6px;
box-shadow: 0 0 5px rgba(0,0,0,0.3);">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
fill="currentColor" viewBox="0 0 16 16">
<path d="M15.502 1.94a.5.5 0 0 1 0 .706l-1.293 1.293-2.121-2.121
1.293-1.293a.5.5 0 0 1 .707 0l1.414 1.415zm-2.561
2.561L5 12.44V14h1.561l7.941-7.941-2.561-2.561z"/>
</svg>
</div>
</label>
<input type="file" id="photo" name="photo" accept="image/*" style="display: none;" onchange="this.form.submit()">
</div>
</form>
<div class="profile-title mt-3">{{ $user->name }}</div>
<!-- Info Profil -->
<div class="profile-info mt-4">
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">Email</div>
<div class="col-sm-8">{{ $user->email }}</div>
</div>
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">No Telepon</div>
<div class="col-sm-8">{{ $user->telepon }}</div>
</div>
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">Alamat</div>
<div class="col-sm-8">{{ $user->alamat }}</div>
</div>
<div class="row">
<div class="col-sm-4 font-weight-bold">Role</div>
<div class="col-sm-8">{{ ucfirst($user->role ?? 'User') }}</div>
</div>
</div>
<!-- Ubah Password -->
@if ($user->role != 'admin')
<hr>
<form action="{{ route('profile.updatePassword') }}" method="POST">
@csrf
@method('PUT')
<h5>Ubah Password</h5>
<div class="mb-2">
<label for="current_password">Password Lama</label>
<input type="password" name="current_password" id="current_password" class="form-control" required>
</div>
<div class="mb-2">
<label for="new_password">Password Baru</label>
<input type="password" name="new_password" id="new_password" class="form-control" required>
</div>
<div class="mb-3">
<label for="new_password_confirmation">Konfirmasi Password Baru</label>
<input type="password" name="new_password_confirmation" id="new_password_confirmation" class="form-control" required>
</div>
<button type="submit" class="btn btn-primary w-100">Simpan Password Baru</button>
</form>
@endif
</div>
<!-- Optional: Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@ -8,29 +8,18 @@
@stop @stop
@section('content') @section('content')
{{-- <div class="mb-4">
<!-- Card Header - Accordion -->
<div class="row">
<div class="col">
<a href="{{ URL::to('download-user-pdf') }}" target="_blank" class="d-none d-sm-inline-block btn btn-sm btn-success shadow-sm float-right"><i
class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
</div>
</div>
</div> --}}
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<!-- Card Header - Accordion --> <!-- Card Header - Accordion -->
<a href="#listkriteria" class="d-block card-header py-3" data-toggle="collapse" <a href="#listkriteria" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample"> role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">List Pengguna</h6> <h6 class="m-0 font-weight-bold text-primary">List Pengguna</h6>
</a> </a>
<!-- Card Content - Collapse --> <!-- Card Content - Collapse -->
<div class="collapse show" id="listkriteria"> <div class="collapse show" id="listkriteria">
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<a href="{{ URL::to('download-user-pdf') }}" target="_blank" class="d-none d-sm-inline-block btn btn-sm btn-success shadow-sm float-right"><i
class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a>
<a href="{{ route('register.user')}}"> <a href="{{ route('register.user')}}">
<!--<button class="btn btn-sm btn-primary">Tambah Pengguna</button>--> <!--<button class="btn btn-sm btn-primary">Tambah Pengguna</button>-->
</a> </a>

View File

@ -14,10 +14,10 @@
} }
#camat{ #hrd{
text-align:center; text-align:center;
} }
#nama-camat{ #nama-hrd{
margin-top:100px; margin-top:100px;
text-align:center; text-align:center;
} }
@ -35,13 +35,13 @@
<div> <div>
<table> <table>
<tr> <tr>
<td style="padding-right: 240px; padding-left: 20px"><img src="https://4.bp.blogspot.com/-TBASjipimVM/WM-xhIQc5yI/AAAAAAAAD5o/NeSO8wMRISQMLeTCfKBFmewY4vQt1y-NQCEw/s1600/Logo%2BJakarta%2BHitam.png" width="90" height="90" ></td> <td style="padding-right: 240px; padding-left: 20px"><img src="{{ asset('assets/images/logo no bg.png') }}" width="90" height="90" ></td>
<td> <td>
<center> <center>
<font size="4">RUKUN TETANGGA 004</font><br> <font size="4">PT.Intecon Bangun Persada</font><br>
<font size="4">RUKUN WARGA 001</font><br> <font size="2">Alamat: Jl. Cadika No. 4A, Sempusari, Kaliwates, Jember, Jawa Timur, Indonesia</font><br>
<font size="2">KELURAHAN KRAMAT JATI KECAMATAN KRAMAT JATI</font><br> <font size="2">Email: <a href="mailto:inteconbangunpersada@gmail.com">inteconbangunpersada@gmail.com</a></font><br>
<font size="2">KOTA ADMINISTRASI JAKARTA TIMUR</font><br> <font size="2">Phone: +62 331 423445</font><br>
</center> </center>
</td> </td>
</tr> </tr>
@ -49,7 +49,7 @@
<hr class="garis1"/> <hr class="garis1"/>
<div style="margin-top: 25px; margin-bottom: 25px;"> <div style="margin-top: 25px; margin-bottom: 25px;">
<center><strong><u>LIST PENGGUNA</u></strong></center> <center><strong><u>Daftar Pengguna</u></strong></center>
</div> </div>
<div class="collapse show" id="listkriteria"> <div class="collapse show" id="listkriteria">
@ -88,9 +88,9 @@
<div id="ttd" class="row"> <div id="ttd" class="row">
<div class="col-md-4"></div> <div class="col-md-4"></div>
<div class="col-md-4"> <div class="col-md-4">
<p id="camat">Jakarta, {{ $tanggal }}</p> <p id="hrd">Jember, {{ $tanggal }}</p>
<p id="camat"><strong>KETUA RT 004 / RW 001</strong></p> <p id="hrd"><strong>HRD & stadd admin</strong></p>
<div id="nama-camat"><strong><u>AGUSTINA</u></strong><br /> <div id="nama-camat"><strong><u>Yudi Sulistiawan</u></strong><br />
NIP. 3175044408730004</div> NIP. 3175044408730004</div>
</div> </div>
</div> </div>

View File

@ -64,8 +64,8 @@
<div class="row"> <div class="row">
<img src="assets/images/logo no bg.png" alt="Logo Intecon" class="logo"> <img src="assets/images/logo no bg.png" alt="Logo Intecon" class="logo">
<div class="left-content"> <div class="left-content">
<h1>Welcome !</h1> <h1>SIPKAR !</h1>
<p class="mt-3">PT. Intecon Bangun Persada</p> <p class="mt-3">Sistem Penerimaan karyawan</p>
</div> </div>
@ -116,7 +116,7 @@
</div> </div>
</form> </form>
<div class="text-center"> <div class="text-center">
<a class="small" href="forgot-password.html">Forgot Password?</a> <a class="small" href="{{ route("password.request")}}">Forgot Password?</a>
</div> </div>
{{-- <div class="text-center"> {{-- <div class="text-center">
<a class="small" href="{{ route('register')}}">Buat Akun Baru!</a> <a class="small" href="{{ route('register')}}">Buat Akun Baru!</a>

View File

@ -1,4 +1,4 @@
@extends('layouts.app') @extends('layouts.guest')
@section('content') @section('content')
<div class="container"> <div class="container">

View File

@ -1,4 +1,4 @@
@extends('layouts.app') @extends('layouts.guest')
@section('content') @section('content')
<div class="container"> <div class="container">

View File

@ -1,4 +1,4 @@
@extends('layouts.app') @extends('layouts.guest')
@section('content') @section('content')
<div class="container"> <div class="container">

View File

@ -1,117 +1,139 @@
@extends('layouts.guest') @extends('layouts.guest')
@section('css') @section('css')
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8"> <div class="col-md-7">
<div class="card shadow"> <div class="card shadow">
<div class="card-header">{{ __('Register') }}</div> <div class="card-header d-flex align-items-center " style="background-color:rgb(11, 128, 200)">
<img src="{{ asset('assets/images/logo.png') }}"
alt="Logo" width="50" height="50" style="object-fit: contain; margin-right: 15px;">
<span class="fw-bold" style="font-size: 1.45rem; font-family: 'Poppins', sans-serif; color: white;">
Daftar Akun
</span>
</div>
<div class="card-body">
<form action="{{ route('register.user.submit') }}" method="post">
@csrf
<div class="row mb-3">
<label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" <div class="card-body">
class="form-control @error('name') is-invalid @enderror" name="name" <form action="{{ route('register.user.submit') }}" method="post">
value="{{ old('name') }}" required autocomplete="name" autofocus> @csrf
@error('name')
<span class="invalid-feedback" role="alert"> <div class="row mb-3">
<strong>{{ $message }}</strong> <label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>
</span> <div class="col-md-6">
@enderror <input id="name" type="text"
class="form-control @error('name') is-invalid @enderror" name="name"
value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="email" <label for="email"
class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label> class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="email" type="email" <input id="email" type="email"
class="form-control @error('email') is-invalid @enderror" name="email" class="form-control @error('email') is-invalid @enderror" name="email"
value="{{ old('email') }}" required autocomplete="email"> value="{{ old('email') }}" required autocomplete="email">
@error('email') @error('email')
<span class="invalid-feedback" role="alert"> <span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong> <strong>{{ $message }}</strong>
</span> </span>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="password" <label for="password"
class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label> class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password" type="password" <input id="password" type="password"
class="form-control @error('password') is-invalid @enderror" name="password" class="form-control @error('password') is-invalid @enderror" name="password"
required autocomplete="new-password"> required autocomplete="new-password">
@error('password') @error('password')
<span class="invalid-feedback" role="alert"> <span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong> <strong>{{ $message }}</strong>
</span> </span>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="password-confirm" <label for="password-confirm"
class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label> class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" <input id="password-confirm" type="password" class="form-control"
name="password_confirmation" required autocomplete="new-password"> name="password_confirmation" required autocomplete="new-password">
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="alamat" class="col-md-4 col-form-label text-md-end">Alamat</label> <label for="alamat" class="col-md-4 col-form-label text-md-end">Alamat</label>
<div class="col-md-6"> <div class="col-md-6">
<input type="text" <input type="text"
class="form-control @error('alamat') is-invalid @enderror" name="alamat" class="form-control @error('alamat') is-invalid @enderror" name="alamat"
value="{{ old('alamat') }}"> value="{{ old('alamat') }}">
@error('alamat') @error('alamat')
<div class="invalid-feedback" role="alert">{{ $message }}</div> <div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="telepon" class="col-md-4 col-form-label text-md-end">Telepon</label> <label for="telepon" class="col-md-4 col-form-label text-md-end">Telepon</label>
<div class="col-md-6"> <div class="col-md-6">
<input type="number" <input type="number"
class="form-control @error('telepon') is-invalid @enderror" name="telepon" class="form-control @error('telepon') is-invalid @enderror" name="telepon"
value="{{ old('telepon') }}"> value="{{ old('telepon') }}">
@error('telepon') @error('telepon')
<div class="invalid-feedback" role="alert">{{ $message }}</div> <div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="keterangan" class="col-md-4 col-form-label text-md-end">Keterangan</label> <label for="keterangan" class="col-md-4 col-form-label text-md-end">Keterangan</label>
<div class="col-md-6"> <div class="col-md-6">
<input type="text" <input type="text"
class="form-control @error('keterangan') is-invalid @enderror" name="keterangan" class="form-control @error('keterangan') is-invalid @enderror" name="keterangan"
value="{{ old('keterangan') }}"> value="{{ old('keterangan') }}">
@error('keterangan') @error('keterangan')
<div class="invalid-feedback" role="alert">{{ $message }}</div> <div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-0"> <div class="row mb-3">
<div class="col-md-6 offset-md-4"> <div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary float-right"> <div class="g-recaptcha" data-sitekey="{{ env('NOCAPTCHA_SITEKEY') }}"></div>
Tambah Data @error('g-recaptcha-response')
</button> <span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary float-right">
Tambah Data
</button>
</div>
</div> </div>
</div> </form>
</form> <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> @endsection
@endsection

View File

@ -1,28 +1,35 @@
@extends('layouts.app') @extends('layouts.verify-email')
@section('title', __('Email Verification'))
@section('content') @section('content')
<div class="container"> <div class="verify-container">
<div class="row justify-content-center"> <div class="verify-card">
<div class="col-md-8"> <!-- Ikon Email -->
<div class="card"> <div class="verify-icon"></div>
<div class="card-header">{{ __('Verify Your Email Address') }}</div> <!-- Judul -->
<h2 class="verify-title">{{ __('Verifikasi alamat email mu!') }}</h2>
<div class="card-body"> <!-- Pesan Sukses (Jika Resend) -->
@if (session('resent')) @if (session('resent'))
<div class="alert alert-success" role="alert"> <div class="verify-alert">
{{ __('A fresh verification link has been sent to your email address.') }} {{ __('Link verifikasi sudah terkirim. Silahkan cek inbox email anda!') }}
</div> <button type="button" class="verify-alert-close" onclick="this.parentElement.style.display='none'">×</button>
@endif
{{ __('Before proceeding, please check your email for a verification link.') }}
{{ __('If you did not receive the email') }},
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
@csrf
<button type="submit" class="btn btn-link p-0 m-0 align-baseline">{{ __('click here to request another') }}</button>.
</form>
</div>
</div> </div>
</div> @endif
<!-- Instruksi -->
<p class="verify-text">
{{ __('Terimakasih sudah mendaftar, silahkan verifikasi email mu!') }}
</p>
<!-- Form Resend -->
<p class="verify-text">
{{ __() }}
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
@csrf
<button type="submit" class="verify-resend-btn">{{ __('Verifikasi sekarang') }}</button>
</form>
</p>
<!-- Tombol Kembali ke Beranda -->
<a href="{{ url('/') }}" class="verify-home-btn">{{ __('Kembali ke halaman Utama') }}</a>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -1,9 +1,12 @@
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand --> <!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}"> <a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}">
<div class="sidebar-brand-text mx-3">SPK Penerimaan Karyawan</div> <div class="sidebar-brand-icon">
</a> <img src="{{ asset('assets/images/logo.png') }}" class="rounded-circle" style="height: 45px; with: auto;">
</div>
<div class="sidebar-brand-text mx-3" style="margin-left: 8px;">SIPKAR</div>
</a>
<!-- Divider --> <!-- Divider -->
<hr class="sidebar-divider my-0"> <hr class="sidebar-divider my-0">
@ -65,11 +68,11 @@
<span>Data Pengguna</span></a> <span>Data Pengguna</span></a>
</li> </li>
<li class="nav-item {{ request()->Is('laporan*') ? 'active':'' }}"> <!-- <li class="nav-item {{ request()->Is('laporan*') ? 'active':'' }}">
<a class="nav-link" href="{{ route('laporan')}}"> <a class="nav-link" href="{{ route('laporan')}}">
<i class="fas fa-fw fa-file-alt"></i> <i class="fas fa-fw fa-file-alt"></i>
<span>Laporan</span></a> <span>Laporan</span></a>
</li> </li> -->
<!-- Divider --> <!-- Divider -->
<hr class="sidebar-divider d-none d-md-block"> <hr class="sidebar-divider d-none d-md-block">

View File

@ -1,9 +1,12 @@
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand --> <!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}"> <a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}">
<div class="sidebar-brand-text mx-3">SPK Penerimaan Karyawan</div> <div class="sidebar-brand-icon">
</a> <img src="{{ asset('assets/images/logo.png') }}" class="rounded-circle" style="height: 45px; with: auto;">
</div>
<div class="sidebar-brand-text mx-3" style="margin-left: 8px;">SIPKAR</div>
</a>
<!-- Divider --> <!-- Divider -->
<hr class="sidebar-divider my-0"> <hr class="sidebar-divider my-0">
@ -40,9 +43,9 @@
<hr class="sidebar-divider d-none d-md-block"> <hr class="sidebar-divider d-none d-md-block">
<!-- Heading --> <!-- Heading -->
<div class="sidebar-heading"> <!-- <div class="sidebar-heading">
HASIL LAMARAN HASIL LAMARAN
</div> </div> -->
<!-- <li class="nav-item {{ request()->Is('penilaian*') ? 'active':'' }}"> <!-- <li class="nav-item {{ request()->Is('penilaian*') ? 'active':'' }}">
<a class="nav-link" href="{{ route('penilaian.index') }}"> <a class="nav-link" href="{{ route('penilaian.index') }}">

View File

@ -13,6 +13,42 @@
<!-- Topbar Navbar --> <!-- Topbar Navbar -->
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ml-auto">
@auth
<li class="nav-item dropdown no-arrow mx-1">
<a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-bell fa-fw"></i>
<!-- Counter - Alerts -->
<span class="badge badge-danger badge-counter">
{{ auth()->user()->unreadNotifications->count() }}
</span>
</a>
<!-- Dropdown - Notifications -->
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="alertsDropdown">
<h6 class="dropdown-header">
Notifikasi
</h6>
@forelse(auth()->user()->unreadNotifications as $notification)
<a class="dropdown-item d-flex align-items-center" href="{{ route('alternatif.index') }}">
<div class="mr-3">
<div class="icon-circle bg-primary">
<i class="fas fa-user text-white"></i>
</div>
</div>
<div>
<div class="small text-gray-500">{{ $notification->created_at->diffForHumans() }}</div>
<span class="font-weight-bold">{{ $notification->data['message'] }}</span>
</div>
</a>
@empty
<div class="dropdown-item text-center small text-gray-500">Tidak ada notifikasi baru</div>
@endforelse
<a class="dropdown-item text-center small text-gray-500" href="#">Tampilkan Semua Notifikasi</a>
</div>
</li>
@else
@endauth
<div class="topbar-divider d-none d-sm-block"></div> <div class="topbar-divider d-none d-sm-block"></div>
@ -30,7 +66,7 @@
<!-- Dropdown - User Information --> <!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in" <div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="userDropdown"> aria-labelledby="userDropdown">
<a class="dropdown-item" href="#"> <a class="dropdown-item" href="{{ route('profile') }}">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i> <i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
Profile Profile
</a> </a>

View File

@ -0,0 +1,63 @@
<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow">
<!-- Sidebar Toggle (Topbar) -->
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
<i class="fa fa-bars"></i>
</button>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<div class="navbar-brand">@yield('topbar')</div>
</div>
</nav>
<!-- Topbar Navbar -->
<ul class="navbar-nav ml-auto">
<div class="topbar-divider d-none d-sm-block"></div>
@auth
<!-- Nav Item - User Information -->
<li class="nav-item dropdown no-arrow">
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-user-circle fa-lg text-gray-600 mr-2"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">{{ Auth::user()->name }}</span>
{{-- <img class="img-profile rounded-circle" src="img/undraw_profile.svg"> --}}
</a>
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="{{ route('profile') }}">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
Profile
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#logoutModal">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
Logout
</a>
</div>
</li>
@endauth
@guest
<!-- Jika belum login -->
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">
<i class="fas fa-sign-in-alt fa-lg text-gray-600 mr-2"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">Login</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('register.user') }}">
<i class="fas fa-user-plus fa-lg text-gray-600 mr-2"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">Daftar</span>
</a>
</li>
@endguest
</ul>
</nav>

View File

@ -29,7 +29,7 @@
<!-- Topbar --> <!-- Topbar -->
@include('layouts/_partials/topbar') @include('layouts/_partials/topbar')
<!-- Di bagian navbar, tambahkan: -->
<!-- End of Topbar --> <!-- End of Topbar -->
<!-- Begin Page Content --> <!-- Begin Page Content -->
@ -54,7 +54,9 @@
<!-- End of Main Content --> <!-- End of Main Content -->
<!-- Footer --> <!-- Footer -->
<div style="margin-top: 85px;">
@include('layouts/_partials/footer') @include('layouts/_partials/footer')
</div>
<!-- End of Footer --> <!-- End of Footer -->
</div> </div>
@ -101,6 +103,8 @@
<!-- Custom scripts for all pages--> <!-- Custom scripts for all pages-->
<script src="{{ asset('js/sb-admin-2.min.js') }}"></script> <script src="{{ asset('js/sb-admin-2.min.js') }}"></script>
<script src="{{ asset('js/notifications.js') }}"></script>
@yield('js') @yield('js')
</body> </body>

View File

@ -6,6 +6,8 @@
@include('layouts/_partials/head') @include('layouts/_partials/head')
@yield('css') @yield('css')
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@600&display=swap" rel="stylesheet">
</head> </head>
@ -53,7 +55,9 @@
<!-- End of Main Content --> <!-- End of Main Content -->
<!-- Footer --> <!-- Footer -->
<div style="margin-top: 85px;">
@include('layouts/_partials/footer') @include('layouts/_partials/footer')
</div>
<!-- End of Footer --> <!-- End of Footer -->
</div> </div>

View File

@ -28,7 +28,7 @@
<!-- Topbar --> <!-- Topbar -->
@include('layouts/_partials/topbar') @include('layouts/_partials/topbar2')
<!-- End of Topbar --> <!-- End of Topbar -->

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ config('app.name', 'SPK Penerimaan Karyawan') }} - @yield('title')</title>
<!-- Bootstrap CSS (opsional, hapus jika tidak digunakan) -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="{{ asset('css/custom.css') }}" rel="stylesheet">
@yield('styles')
</head>
<body>
@yield('content')
<!-- Bootstrap JS (opsional, hapus jika tidak digunakan) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
@yield('scripts')
</body>
</html>

View File

@ -57,13 +57,13 @@
<div class="form-group"> <div class="form-group">
<label for="lama_studi">Lama Studi (tahun)</label> <label for="lama_studi">Lama Studi (tahun)</label>
<input type="number" step="0.1" class="form-control @error ('lama_studi') is-invalid @enderror" name="lama_studi" value="{{ $alternatif->lama_studi }}"> <input type="number" min="0" max="10" step="1" class="form-control @error ('lama_studi') is-invalid @enderror" name="lama_studi" value="{{ $alternatif->lama_studi }}">
@error('lama_studi')<div class="invalid-feedback">{{ $message }}</div>@enderror @error('lama_studi')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="pengalaman">Pengalaman Kerja (tahun)</label> <label for="pengalaman">Pengalaman Kerja (tahun)</label>
<input type="number" class="form-control @error ('pengalaman') is-invalid @enderror" name="pengalaman" value="{{ $alternatif->pengalaman }}"> <input type="number" min="0" max="10" step="1" class="form-control @error ('pengalaman') is-invalid @enderror" name="pengalaman" value="{{ $alternatif->pengalaman }}">
@error('pengalaman')<div class="invalid-feedback">{{ $message }}</div>@enderror @error('pengalaman')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
@ -81,9 +81,7 @@
</form> </form>
</div> </div>
<button class="btn btn-primary">Simpan</button>
<a href="{{ route('alternatif.index') }}" class="btn btn-success">Kembali</a>
</form>
</div> </div>
</div> </div>
</div> </div>

View File

@ -100,7 +100,7 @@ class="form-control @error('jurusan') is-invalid @enderror"
<div class="form-group"> <div class="form-group">
<label for="lama_studi">Lama Studi (tahun) <span class="text-danger">*</span></label> <label for="lama_studi">Lama Studi (tahun) <span class="text-danger">*</span></label>
<input type="number" step="0.1" name="lama_studi" <input type="number" name="lama_studi" min="0" max="10" step="1"
class="form-control @error('lama_studi') is-invalid @enderror" class="form-control @error('lama_studi') is-invalid @enderror"
value="{{ old('lama_studi') }}"> value="{{ old('lama_studi') }}">
@error('lama_studi') @error('lama_studi')
@ -113,7 +113,7 @@ class="form-control @error('lama_studi') is-invalid @enderror"
<!-- Pengalaman & Sertifikasi --> <!-- Pengalaman & Sertifikasi -->
<div class="form-section"> <div class="form-section">
<h5 class="section-title">Pengalaman & Sertifikasi</h5> <h5 class="section-title">Pengalaman & Upload Sertifikat Kompetensi</h5>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="form-group"> <div class="form-group">
@ -137,6 +137,33 @@ class="form-control @error('pengalaman') is-invalid @enderror"
<div class="invalid-feedback">{{ $message }}</div> <div class="invalid-feedback">{{ $message }}</div>
@enderror @enderror
</div> </div>
<!-- Upload Dokumen -->
<div class="form-section">
<h5 class="section-title">Upload Dokumen</h5>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="cv">Upload CV (PDF/DOC) <span class="text-danger">*</span></label>
<input type="file" name="cv" accept=".pdf,.doc,.docx"
class="form-control-file @error('cv') is-invalid @enderror">
@error('cv')
<div class="invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="dokumen_pendukung">Dokumen Pendukung Lainnya (Opsional)</label>
<input type="file" name="dokumen_pendukung[]" accept=".pdf,.doc,.docx,.jpg,.png"
multiple class="form-control-file @error('dokumen_pendukung') is-invalid @enderror">
@error('dokumen_pendukung')
<div class="invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -38,13 +38,12 @@
@stop @stop
@section('content') @section('content')
<div class="scrollable-content"> <div class="scrollable-content" style="padding-top: 0;">
<div class="content-wrapper"> <div class="content-wrapper" style="margin-top: 0;">
<!-- Page Heading -->
<!-- Page Heading --> <div class="d-sm-flex align-items-center justify-content-between mb-4">
<div class="d-sm-flex align-items-center justify-content-between mb-4"> <h1 class="h3 mb-0 text-gray-800">Selamat Datang, {{ Auth::user()->name }}</h1>
<h1 class="h3 mb-0 text-gray-800">Selamat Datang di Portal Rekrutmen</h1> </div>
</div>
<!-- Content Row --> <!-- Content Row -->
<div class="card shadow mb-4"> <div class="card shadow mb-4">
@ -67,18 +66,13 @@
<li>Data Pribadi</li> <li>Data Pribadi</li>
<li>Riwayat Pendidikan</li> <li>Riwayat Pendidikan</li>
<li>Pengalaman Kerja</li> <li>Pengalaman Kerja</li>
<li>Keterampilan</li> <li>Sertifikat Kompetensi (jika ada)</li>
</ul> </ul>
</div> </div>
<div class="mb-4"> <div class="mb-4">
<h5 class="text-primary">3. Proses Penilaian</h5> <h5 class="text-primary">3. Proses Penilaian</h5>
<p>Setelah mengajukan lamaran, tim kami akan melakukan penilaian menggunakan metode SAW (Simple Additive Weighting).</p> <p>Setelah Anda mengisi data dan dokumen, tim HR akan melakukan peninjauan. Mohon menunggu informasi selanjutnya melalui email</p>
</div>
<div class="mb-4">
<h5 class="text-primary">4. Hasil Penilaian</h5>
<p>Anda dapat melihat hasil penilaian melalui menu "Hasil Penilaian" pada sidebar setelah proses penilaian selesai.</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,189 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Profil Pengguna</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css" rel="stylesheet">
<style>
body {
background: rgb(120, 150, 193);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.profile-card {
max-width: 600px;
margin: 80px auto;
background: #fff;
border-radius: 15px;
padding: 30px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08);
text-align: center;
}
.profile-title {
font-size: 24px;
font-weight: 600;
}
.profile-info {
text-align: left;
margin-top: 20px;
}
.profile-info p {
margin-bottom: 8px;
}
</style>
</head>
<body>
<!-- Tombol kembali di pojok kiri atas -->
<a href="{{ route('user.home') }}" class="btn btn-light shadow-sm d-inline-flex align-items-center"
style="position: absolute; top: 20px; left: 20px; z-index: 1000; gap: 6px;">
<i class="bi bi-house-fill" style="font-size: 20px;"></i>
Beranda
</a>
<!-- Alert session -->
@if (session('success'))
<div class="alert alert-success container mt-4">
{{ session('success') }}
</div>
@endif
@if ($errors->any())
<div class="alert alert-danger container mt-4">
<ul class="mb-0">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="profile-card">
<!-- Foto & upload -->
<form action="{{ route('profile.updatePhoto') }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="avatar-container text-center" style="position: relative; display: inline-block;">
<label for="photo" style="cursor: pointer;">
@if ($user->photo)
<img src="{{ asset( $user->photo) }}" alt="Foto Profil"
style="width: 120px; height: 120px; border-radius: 50%; object-fit: cover;">
@else
<div style="
width: 120px;
height: 120px;
background-color: #007bff;
border-radius: 50%;
color: white;
font-size: 36px;
display: flex;
align-items: center;
justify-content: center;">
{{ strtoupper(substr($user->name, 0, 2)) }}
</div>
@endif
<!-- Ikon Edit -->
<div style="
position: absolute;
bottom: 0;
right: 0;
background-color: #fff;
border-radius: 50%;
padding: 6px;
box-shadow: 0 0 5px rgba(0,0,0,0.3);">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
fill="currentColor" viewBox="0 0 16 16">
<path d="M15.502 1.94a.5.5 0 0 1 0 .706l-1.293 1.293-2.121-2.121
1.293-1.293a.5.5 0 0 1 .707 0l1.414 1.415zm-2.561
2.561L5 12.44V14h1.561l7.941-7.941-2.561-2.561z"/>
</svg>
</div>
</label>
<input type="file" id="photo" name="photo" accept="image/*" style="display: none;" onchange="this.form.submit()">
</div>
</form>
<div class="profile-title mt-3">{{ $user->name }}</div>
<!-- Info Profil -->
<div class="profile-info mt-4">
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">Email</div>
<div class="col-sm-8">{{ $user->email }}</div>
</div>
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">No Telepon</div>
<div class="col-sm-8">{{ $user->telepon }}</div>
</div>
<div class="row mb-2">
<div class="col-sm-4 font-weight-bold">Alamat</div>
<div class="col-sm-8">{{ $user->alamat }}</div>
</div>
<div class="row">
<div class="col-sm-4 font-weight-bold">Role</div>
<div class="col-sm-8">{{ ucfirst($user->role ?? 'User') }}</div>
</div>
<div class="row mb-2 align-items-center">
<div class="col-sm-4 font-weight-bold">Password</div>
<div class="col-sm-8 d-flex justify-content-between align-items-center">
<span>*******</span>
<button type="button" class="btn btn-sm btn-outline-secondary ml-2" data-toggle="modal" data-target="#ubahPasswordModal">
<i class="bi bi-pencil-square"></i> Ubah
</button>
</div>
</div>
</div>
<!-- Ubah Password -->
@if ($user->role != 'admin')
<!-- Modal Ubah Password -->
<div class="modal fade" id="ubahPasswordModal" tabindex="-1" role="dialog" aria-labelledby="ubahPasswordModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form action="{{ route('profile.updatePassword') }}" method="POST">
@csrf
@method('PUT')
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="ubahPasswordModalLabel">Ubah Password</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Tutup">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="current_password">Password Lama</label>
<input type="password" class="form-control" id="current_password" name="current_password" required>
</div>
<div class="form-group">
<label for="new_password">Password Baru</label>
<input type="password" class="form-control" id="new_password" name="new_password" required>
</div>
<div class="form-group">
<label for="new_password_confirmation">Konfirmasi Password Baru</label>
<input type="password" class="form-control" id="new_password_confirmation" name="new_password_confirmation" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan Password Baru</button>
</div>
</div>
</form>
</div>
</div>
@endif
</div>
<!-- Optional: Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@ -11,18 +11,73 @@
<style> <style>
body { body {
font-family: 'Poppins', sans-serif; font-family: 'Poppins', sans-serif;
background-color: #f8f9fa; margin: 0;
padding: 0;
background: linear-gradient(135deg, #0070b7, #008fea);
min-height: 100vh;
color: #fff;
}
.navbar {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
padding: 1rem 2rem;
}
.navbar .logo-img {
max-width: 50px; /* Ukuran logo diperkecil */
height: auto;
margin-right: 1rem;
}
.navbar .brand-text {
font-size: 2rem;
font-weight: 700;
color: #fff;
margin: 0;
}
.navbar .nav-link {
color: #fff !important;
margin-left: 1.5rem;
font-weight: 500;
font-size: 1rem;
}
.navbar .nav-link:hover {
color: #ddd !important;
} }
.hero-section { .hero-section {
min-height: 100vh; position: relative;
min-height: 80vh;
display: flex; display: flex;
align-items: center; align-items: center;
background: linear-gradient(rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)); justify-content: center;
text-align: center;
padding: 4rem 0;
overflow: hidden;
} }
.logo-img { .hero-section .wave {
max-width: 300px; position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100px;
background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDQwIDEzMCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE0NDAgNTFjLTQxLjYgMjkuNy0xMDQuMyA1NC43LTE2OC41IDU0LjctNjQuMiAwLTEyNi45LTI1LTE2OC41LTU0LjctNDEuNi0yOS43LTExNi4yLTU0LjctMTgwLjUtNTQuNy0xNjcuOCAwLTI3MC45IDQyLjItMzQwLjUgNzYuN3MtMTcyLjcgNzYuNy0zNDAuNSA3Ni43Yy02Ny42IDAtMTM4LjktMjcuMS0xODAuNS01NC43UzAgMjkuNyAwIDBjMCAwIDAgMCAwIDB2MTMwaDE0NDB6IiBvcGFjaXR5PSIuMSI+PC9wYXRoPjwvc3ZnPg==') repeat-x;
background-size: 100% 100%;
}
.hero-content h1 {
font-size: 3rem;
font-weight: 700;
margin-bottom: 1rem;
}
.hero-content p {
font-size: 1.2rem;
color: #ddd;
max-width: 600px;
margin: 0 auto 2rem;
}
.hero-img {
max-width: 50%;
height: auto; height: auto;
margin-bottom: 2rem; margin-top: 2rem;
} }
.btn-custom { .btn-custom {
padding: 10px 30px; padding: 10px 30px;
@ -31,61 +86,145 @@
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 1px; letter-spacing: 1px;
margin: 0 10px; margin: 0 10px;
border: none;
} }
.btn-login { .btn-login {
background-color: #007bff; background-color: #00b747;
color: white; color: white;
} }
.btn-register { .btn-register {
background-color: #28a745; background-color: #a6a6a6;
color: white; color: white;
} }
.btn-login:hover, .btn-register:hover { .btn-login:hover, .btn-register:hover {
opacity: 0.9; opacity: 0.9;
color: white; color: white;
} }
.description { .services-section {
max-width: 600px; padding: 5rem 0;
margin: 0 auto 2rem auto; background-color: #fff;
color: #6c757d; color: #333;
font-size: 1.1rem; text-align: center;
line-height: 1.6; }
.services-section h2 {
font-weight: 600;
margin-bottom: 3rem;
}
.service-card {
background:rgb(234, 236, 237);
padding: 2rem;
border-radius: 10px;
margin-bottom: 2rem;
transition: transform 0.3s;
}
.service-card:hover {
transform: translateY(-10px);
}
.service-card i {
font-size: 2rem;
color: #0070B7;
margin-bottom: 1rem;
}
footer {
background: rgba(0, 0, 0, 0.2);
padding: 2rem 0;
text-align: center;
color: #fff;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="hero-section"> <!-- Navbar -->
<div class="container text-center"> <nav class="navbar navbar-expand-lg">
<!-- Ganti src dengan path logo Intecon yang sesuai --> <div class="container">
<img src="{{ asset('assets/images/logo.png') }}" alt="Intecon Logo" class="logo-img"> <img src="{{ asset('assets/images/logo.png') }}" alt= "Intecon Logo" class="logo-img">
<a class="navbar-brand text-white" href="#">SIPKAR</a>
<h1 class="mb-4">Welcome to SIPKAR</h1> <div class="collapse navbar-collapse">
<!-- <ul class="navbar-nav ms-auto">
<p class="description"> <li class="nav-item"><a class="nav-link" href="#">Home</a></li>
Selamat Datang di Sistem Pendukung Keputusan Penerimaan Karyawan PT Intecon Bangun Persada <li class="nav-item"><a class="nav-link" href="#">About</a></li>
</p> <li class="nav-item"><a class="nav-link" href="#">Contact</a></li>
</ul> -->
</div>
</div>
</nav>
<!-- Hero Section -->
<div class="hero-section">
<div class="container hero-content">
<h1>Welcome to SIPKAR</h1>
<p>Selamat Datang di Sistem Pendukung Keputusan Penerimaan Karyawan PT Intecon Bangun Persada</p>
<div class="d-flex justify-content-center gap-3"> <div class="d-flex justify-content-center gap-3">
@if (Route::has('login')) @if (Route::has('login'))
@auth @auth
<a href="{{ url('/dashboard') }}" class="btn btn-custom btn-login">Dashboard</a> <!-- Dashboard button removed -->
@else @else
<a href="{{ route('login') }}" class="btn btn-custom btn-login">Login</a> <a href="{{ route('login') }}" class="btn btn-custom btn-login">Login</a>
@if (Route::has('register.user')) @if (Route::has('register.user'))
<a href="{{ route('register.user') }}" class="btn btn-custom btn-register">Register</a> <a href="{{ route('register.user') }}" class="btn btn-custom btn-register">Register</a>
@endif @endif
@endauth @endauth
@endif @endif
</div> </div>
</div>
<div class="wave"></div>
</div>
<div class="mt-5"> <!-- Services Section -->
<p class="text-muted">© {{ date('Y') }} Intecon. All rights reserved.</p> <section class="services-section">
<div class="container">
<h2>Tentang PT Intecon Bangun Persada</h2>
<div class="row">
<div class="col-md-4">
<div class="service-card">
<i class="fas fa-eye"></i>
<h4>Visi</h4>
<p>Sebagai perusahaan Kontraktor Umum yang paling inovatif dan kompeten dalam memberikan pelayanan dan solusi atas keinginan
dan permasalahan</p>
</div>
</div>
<div class="col-md-4">
<div class="service-card">
<i class="fas fa-building"></i>
<h4>Sejarah Perusahaan</h4>
<p>PT Intecon Bangun Persada (IBP), didirikan pada tahun 2016, adalah perusahaan konstruksi terkemuka
yang berbasis di Jember, Jawa Timur, Indonesia. Berawal dari CV Integritas Karya Buana (IKB) pada tahun 2005
sebagai pemasok bahan bangunan dan kemudian sebagai sub-kontraktor di bawah CV Long Fortune Construction,
IBP mengkhususkan diri dalam konstruksi komersial dan residensial. Keahlian kami mencakup pekerjaan interior,
teknik sipil, arsitektur, pengembangan properti, dan perencanaan desain, dengan fokus pada penyampaian proyek
yang berkualitas, inovatif, dan memuaskan klien</p>
</div>
</div>
<div class="col-md-4">
<div class="service-card">
<i class="fas fa-bullseye"></i>
<h4>Misi</h4>
<p>Untuk menjadi penyedia jasa konstruksi yang unggul dengan konsisten meningkatkan kualitas produk kami, untuk menyediakan
tingkat tertinggi profesionalisme bagi klien melalui inovasi</p>
</div>
</div>
</div>
<div class="contact-info mt-5">
<p><strong>Contact Us:</strong></p>
<p>Email: <a href="mailto:inteconbangunpersada@gmail.com">inteconbangunpersada@gmail.com</a></p>
<p>Phone: +62 331 423445</p>
<p>Alamat: Jl. Cadika No. 4A, Sempusari, Kaliwates, Jember, Jawa Timur, Indonesia</p>
</div> </div>
</div> </div>
</div> </section>
<!-- Footer -->
<footer>
<div class="container">
<p>© {{ date('Y') }} Intecon Bangun Persada.</p>
</div>
</footer>
<!-- Bootstrap JS --> <!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- Font Awesome for icons -->
<script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script>
</body> </body>
</html> </html>

View File

@ -5,6 +5,8 @@
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController; use App\Http\Controllers\HomeController;
use App\Http\Controllers\RegisterUserController; use App\Http\Controllers\RegisterUserController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\Auth\ForgotPasswordController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -19,15 +21,15 @@
Auth::routes(['register' => false]); Route::get('/forgot-password', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
Route::post('/forgot-password', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
Auth::routes(['verify' => false, 'register' => false]);
// Route untuk halaman welcome dan redirect ke home jika sudah login // Route untuk halaman welcome dan redirect ke home jika sudah login
Route::get('/', function () { Route::get('/', function () {
if (Auth::check()) { return view('welcome');
return redirect('/home'); })->name('welcome');
}
return view('welcome');
});
// Route untuk dashboard yang memerlukan autentikasi // Route untuk dashboard yang memerlukan autentikasi
Route::get('/home', [HomeController::class, 'index'])->name('home'); Route::get('/home', [HomeController::class, 'index'])->name('home');
@ -46,10 +48,11 @@
->name('user.home') ->name('user.home')
->middleware('user'); ->middleware('user');
}); });
Route::get('/profile', [ProfileController::class, 'index'])->name('profile');
Route::put('/profile/update-photo', [ProfileController::class, 'updatePhoto'])->name('profile.updatePhoto');
Route::put('/profile/change-password', [ProfileController::class, 'updatePassword'])->name('profile.updatePassword') ->middleware('auth');
Route::resource('kriteria', 'App\Http\Controllers\KriteriaController')->except(['create']); Route::resource('kriteria', 'App\Http\Controllers\KriteriaController')->except(['create']);
Route::resource('alternatif', 'App\Http\Controllers\AlternatifController')->except(['create']); Route::resource('alternatif', 'App\Http\Controllers\AlternatifController')->except(['create']);
@ -61,6 +64,8 @@
return view('admin.report.index'); return view('admin.report.index');
})->name('laporan'); })->name('laporan');
//Route::get('/perhitungan', [PenilaianController::class, 'perhitungan'])->name('perhitungan.index'); ga kepake
Route::get('/perhitungan', [App\Http\Controllers\AlgoritmaController::class, 'index'])->name('perhitungan.index'); Route::get('/perhitungan', [App\Http\Controllers\AlgoritmaController::class, 'index'])->name('perhitungan.index');
Route::get('download-perhitungan-pdf', [App\Http\Controllers\AlgoritmaController::class, 'downloadPDF']); Route::get('download-perhitungan-pdf', [App\Http\Controllers\AlgoritmaController::class, 'downloadPDF']);
Route::get('download-alternatif-pdf', [App\Http\Controllers\AlternatifController::class, 'downloadPDF']); Route::get('download-alternatif-pdf', [App\Http\Controllers\AlternatifController::class, 'downloadPDF']);