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

View File

@ -7,6 +7,8 @@
use App\Models\Penilaian;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use App\Models\User;
use App\Models\Crips;
use Exception;
class AlternatifController extends Controller
@ -35,17 +37,115 @@ public function store(Request $request){
'pendidikan' => 'required',
'ipk' => 'required|numeric',
'jurusan' => 'required',
'lama_studi' => 'required|numeric',
'pengalaman' => 'required|numeric',
'lama_studi' => 'required|integer|min:0|max:10',
'pengalaman' => 'required|integer|min:0|max:10',
'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!');
}
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)
{
@ -62,7 +162,7 @@ public function update(Request $request, $id)
'pendidikan' => 'required|string',
'ipk' => 'required|numeric|min:0|max:4',
'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',
'serkom' => 'required|boolean',
]);
@ -70,6 +170,10 @@ public function update(Request $request, $id)
try {
$alternatif = Alternatif::findOrFail($id);
$alternatif->update($validated);
Penilaian::where('alternatif_id', $id)->delete();
// Buat ulang penilaian berdasarkan data terbar
return back()->with('msg','Berhasil Mengubah Data');
} catch (Exception $e) {
\Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
@ -84,8 +188,9 @@ public function destroy($id){
$alternatif = Alternatif::findOrFail($id);
$alternatif->delete();
Penilaian::truncate();
Penilaian::where('alternatif_id', $id)->delete();
return back()->with('msg', 'Data pelamar berhasil dihapus!');
} catch (Exception $e) {
\Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
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;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Http\Request;
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;
/**
* Where to redirect users after verification.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
// Redirect ke halaman login setelah verifikasi berhasil
protected function redirectTo()
{
return '/login';
}
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$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
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Penilaian;
use App\Models\Alternatif;
use App\Models\Kriteria;
use App\Models\Penilaian;
use App\Models\Crips;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;
use PDF;
use App\Models\Kriteria;
use App\Http\Controllers\AlgoritmaController; // Impor AlgoritmaController
use Illuminate\Http\Request;
class PenilaianController extends Controller
{
public function index(){
$alternatif = Alternatif::with('penilaian.crips')->get();
$kriteria = Kriteria::with('crips')->orderBy('id','ASC')->get();
//return response()->json($alternatif);
return view('admin.penilaian.index', compact('alternatif', 'kriteria'));
public function __construct()
{
$this->middleware('auth');
}
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)
{
try {
DB::table('penilaian')->truncate(); // lebih aman
$kriteria = Kriteria::orderBy('id', 'ASC')->get(); // urutan penting
foreach ($request->crips_id as $alternatif_id => $crips_list) {
foreach ($crips_list as $index => $crips_id) {
Penilaian::create([
'alternatif_id' => $alternatif_id,
'kriteria_id' => $kriteria[$index]->id, // ambil kriteria berdasarkan urutan
'crips_id' => $crips_id
]);
}
}
return back()->with('msg', 'Berhasil Disimpan!');
} catch (Exception $e) {
Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
die("Gagal");
$validated = $request->validate([
'alternatif_id' => 'required|exists:alternatif,id',
'kriteria_id' => 'required|exists:kriteria,id',
]);
// Ambil data alternatif berdasarkan id_alternatif
$alternatif = Alternatif::find($validated['alternatif_id']);
$kriteria = Kriteria::find($validated['kriteria_id']);
// Tentukan nilai berdasarkan id_kriteria
$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
case 4: $nilai = $alternatif->jurusan; break; // Jurusan
case 5: $nilai = $alternatif->lama_studi; break; // Lama Studi
case 6: $nilai = $alternatif->pengalaman; break; // Pengalaman
case 7: $nilai = $alternatif->serkom; break; // Serkom
}
}
public function downloadPDF() {
setlocale(LC_ALL, 'IND');
$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();
// Panggil getCripsId untuk mendapatkan id_crips
$crips_id = $this->getCripsId($kriteria->id, $nilai);
$pdf = PDF::loadView('admin.penilaian.penilaian-pdf',compact('kriteria','tanggal','alternatif','penilaian'));
$pdf->setPaper('A3', 'potrait');
return $pdf->stream('penilaian.pdf');
if (!$crips_id) {
return redirect()->back()->with('error', 'Sub-kriteria tidak ditemukan untuk kriteria ini.');
}
// 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\Support\Facades\Hash;
class RegisterUserController extends Controller
{
public function showRegistrationForm()
@ -15,6 +16,7 @@ public function showRegistrationForm()
public function register(Request $request)
{
// Validasi input
$request->validate([
'name' => 'required|string|max:191',
'email' => 'required|email|unique:users',
@ -22,19 +24,26 @@ public function register(Request $request)
'alamat' => 'required|string|max:255',
'telepon' => 'required|string|max:20',
'keterangan' => 'nullable|string|max:255',
'g-recaptcha-response' => 'required|captcha',
]);
User::create([
// Buat pengguna
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'alamat' => $request->alamat,
'telepon' => $request->telepon,
'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,
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,
];
}

View File

@ -12,7 +12,7 @@ class Alternatif extends Model
protected $guarded = [];
protected $fillable = [
'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 $guarded = [];
public function crips()
{
return $this->hasMany(Crips::class,'kriteria_id');
}
}

View File

@ -13,11 +13,16 @@ class Penilaian extends Model
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()
{
return $this->belongsTo(Alternatif::class, 'alternatif_id');
}
}

View File

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

View File

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

View File

@ -6,7 +6,8 @@
"license": "MIT",
"require": {
"php": "^8.0",
"barryvdh/laravel-dompdf": "^2.0",
"anhskohbo/no-captcha": "^3.7",
"barryvdh/laravel-dompdf": "^2.2",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^9.0",
"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",
"This file is @generated automatically"
],
"content-hash": "cb2e4801c4d5a6d3b45e0bc7d7035ecf",
"content-hash": "910e867f92f12159e6b1cdfff092548a",
"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",
"version": "v2.2.0",

View File

@ -18,7 +18,7 @@ public function up()
$table->string('name',191);
$table->string('email',191)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password',191);
$table->string('password');
$table->string('alamat');
$table->string('telepon');
$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 name="viewport" content="width=device-width, initial-scale=1.0">
<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">
<style type="text/css">
.garis1{
@ -14,10 +14,10 @@
}
#camat{
#hrd{
text-align:center;
}
#nama-camat{
#nama-hrd{
margin-top:100px;
text-align:center;
}
@ -35,13 +35,13 @@
<div>
<table>
<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>
<center>
<font size="4">RUKUN TETANGGA 004</font><br>
<font size="4">RUKUN WARGA 001</font><br>
<font size="2">KELURAHAN KRAMAT JATI KECAMATAN KRAMAT JATI</font><br>
<font size="2">KOTA ADMINISTRASI JAKARTA TIMUR</font><br>
<font size="4">PT.Intecon Bangun Persada</font><br>
<font size="2">Alamat: Jl. Cadika No. 4A, Sempusari, Kaliwates, Jember, Jawa Timur, Indonesia</font><br>
<font size="2">Email: <a href="mailto:inteconbangunpersada@gmail.com">inteconbangunpersada@gmail.com</a></font><br>
<font size="2">Phone: +62 331 423445</font><br>
</center>
</td>
</tr>
@ -49,7 +49,7 @@
<hr class="garis1"/>
<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 class="collapse show" id="listkriteria">
@ -57,23 +57,27 @@
<div class="table-responsive">
<table class="table table-striped table-hover" id="DataTable">
<thead>
<tr>
<th>No</th>
<th>Nama Warga</th>
<th>NIK</th>
<th>Alamat</th>
<th>Telepon</th>
</tr>
<tr>
<th>Nama</th>
<th>Usia</th>
<th>Pendidikan</th>
<th>IPK</th>
<th>Jurusan</th>
<th>Lama Studi</th>
<th>Pengalaman</th>
</tr>
</thead>
<tbody>
@php $no = 1; @endphp
@foreach ($alternatif as $row)
<tr>
<td>{{ $no++ }}</td>
<td>{{ $row->nama_alternatif }}</td>
<td>{{ $row->nik }}</td>
<td>{{ $row->alamat }}</td>
<td>{{ $row->telepon }}</td>
<td>{{ $row->usia }}</td>
<td>{{ $row->pendidikan }}</td>
<td>{{ $row->ipk }}</td>
<td>{{ $row->jurusan }}</td>
<td>{{ $row->lama_studi }}</td>
<td>{{ $row->pengalaman }}</td>
</tr>
@endforeach
</tbody>
@ -85,9 +89,9 @@
<div id="ttd" class="row">
<div class="col-md-4"></div>
<div class="col-md-4">
<p id="camat">Jakarta, {{ $tanggal }}</p>
<p id="camat"><strong>KETUA RT 004 / RW 001</strong></p>
<div id="nama-camat"><strong><u>AGUSTINA</u></strong><br />
<p id="hrd">Jember, {{ $tanggal }}</p>
<p id="hrd"><strong>HRD & staff admin</strong></p>
<div id="nama-hrd"><strong><u>Yudi Sulistiawan</u></strong><br />
NIP. 3175044408730004</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>Pengalaman</th>
<th>Serkom</th>
<th>Aksi</th>
<th>CV</th>
<th>Dokumen Pendukung</th>
<th>Aksi</th>
</tr>
</thead>
<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->pengalaman }}</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>
<a href="{{ route('alternatif.edit',$row->id) }}" class="btn btn-sm btn-circle btn-warning">
<i class="fa fa-edit"></i>

View File

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

View File

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

View File

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('title', 'Tambah Crips '. $kriteria->nama_kriteria)
@section('topbar', 'Data Crips')
@section('title', 'Tambah Sub Kriteria '. $kriteria->nama_kriteria)
@section('topbar', 'Data Sub Kriteria')
@section('css')
<!-- Custom styles for this page -->
@ -13,7 +13,7 @@
<!-- Card Header - Accordion -->
<a href="#tambahcrips" class="d-block card-header py-3" data-toggle="collapse"
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>
<!-- Card Content - Collapse -->
@ -32,7 +32,7 @@
@csrf
<input type="hidden" value="{{ $kriteria->id }}" name="kriteria_id">
<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') }}">
@error('nama_crips')
@ -43,7 +43,7 @@
</div>
<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') }}">
@error('bobot')
@ -66,7 +66,7 @@
<!-- Card Header - Accordion -->
<a href="#listcrips" class="d-block card-header py-3" data-toggle="collapse"
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>
<!-- Card Content - Collapse -->
@ -80,7 +80,7 @@ class="fas fa-download fa-sm text-white-50"></i>Download Laporan</a> --}}
<thead>
<tr>
<th>No</th>
<th>Nama Crips</th>
<th>Nama Sub Kriteria</th>
<th>Bobot</th>
<th>Aksi</th>
</tr>

View File

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

View File

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

View File

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

View File

@ -14,10 +14,10 @@
}
#camat{
#hrd{
text-align:center;
}
#nama-camat{
#nama-hrd{
margin-top:100px;
text-align:center;
}
@ -35,13 +35,13 @@
<div>
<table>
<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>
<center>
<font size="4">RUKUN TETANGGA 004</font><br>
<font size="4">RUKUN WARGA 001</font><br>
<font size="2">KELURAHAN KRAMAT JATI KECAMATAN KRAMAT JATI</font><br>
<font size="2">KOTA ADMINISTRASI JAKARTA TIMUR</font><br>
<font size="4">PT.Intecon Bangun Persada</font><br>
<font size="2">Alamat: Jl. Cadika No. 4A, Sempusari, Kaliwates, Jember, Jawa Timur, Indonesia</font><br>
<font size="2">Email: <a href="mailto:inteconbangunpersada@gmail.com">inteconbangunpersada@gmail.com</a></font><br>
<font size="2">Phone: +62 331 423445</font><br>
</center>
</td>
</tr>
@ -49,7 +49,7 @@
<hr class="garis1"/>
<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 class="collapse show" id="listkriteria">
@ -88,9 +88,9 @@
<div id="ttd" class="row">
<div class="col-md-4"></div>
<div class="col-md-4">
<p id="camat">Jakarta, {{ $tanggal }}</p>
<p id="camat"><strong>KETUA RT 004 / RW 001</strong></p>
<div id="nama-camat"><strong><u>AGUSTINA</u></strong><br />
<p id="hrd">Jember, {{ $tanggal }}</p>
<p id="hrd"><strong>HRD & stadd admin</strong></p>
<div id="nama-camat"><strong><u>Yudi Sulistiawan</u></strong><br />
NIP. 3175044408730004</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

@ -1,117 +1,139 @@
@extends('layouts.guest')
@extends('layouts.guest')
@section('css')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card shadow">
<div class="card-header">{{ __('Register') }}</div>
@section('css')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-7">
<div class="card shadow">
<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"
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 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"
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 class="row mb-3">
<label for="email"
class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label>
<div class="col-md-6">
<input id="email" type="email"
class="form-control @error('email') is-invalid @enderror" name="email"
value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
<div class="row mb-3">
<label for="email"
class="col-md-4 col-form-label text-md-end">{{ __('Email Address') }}</label>
<div class="col-md-6">
<input id="email" type="email"
class="form-control @error('email') is-invalid @enderror" name="email"
value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="row mb-3">
<label for="password"
class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password"
class="form-control @error('password') is-invalid @enderror" name="password"
required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
<div class="row mb-3">
<label for="password"
class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password"
class="form-control @error('password') is-invalid @enderror" name="password"
required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="row mb-3">
<label for="password-confirm"
class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control"
name="password_confirmation" required autocomplete="new-password">
<div class="row mb-3">
<label for="password-confirm"
class="col-md-4 col-form-label text-md-end">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control"
name="password_confirmation" required autocomplete="new-password">
</div>
</div>
</div>
<div class="row mb-3">
<label for="alamat" class="col-md-4 col-form-label text-md-end">Alamat</label>
<div class="col-md-6">
<input type="text"
class="form-control @error('alamat') is-invalid @enderror" name="alamat"
value="{{ old('alamat') }}">
@error('alamat')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
<div class="row mb-3">
<label for="alamat" class="col-md-4 col-form-label text-md-end">Alamat</label>
<div class="col-md-6">
<input type="text"
class="form-control @error('alamat') is-invalid @enderror" name="alamat"
value="{{ old('alamat') }}">
@error('alamat')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<div class="row mb-3">
<label for="telepon" class="col-md-4 col-form-label text-md-end">Telepon</label>
<div class="col-md-6">
<input type="number"
class="form-control @error('telepon') is-invalid @enderror" name="telepon"
value="{{ old('telepon') }}">
@error('telepon')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
<div class="row mb-3">
<label for="telepon" class="col-md-4 col-form-label text-md-end">Telepon</label>
<div class="col-md-6">
<input type="number"
class="form-control @error('telepon') is-invalid @enderror" name="telepon"
value="{{ old('telepon') }}">
@error('telepon')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<div class="row mb-3">
<label for="keterangan" class="col-md-4 col-form-label text-md-end">Keterangan</label>
<div class="col-md-6">
<input type="text"
class="form-control @error('keterangan') is-invalid @enderror" name="keterangan"
value="{{ old('keterangan') }}">
@error('keterangan')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
<div class="row mb-3">
<label for="keterangan" class="col-md-4 col-form-label text-md-end">Keterangan</label>
<div class="col-md-6">
<input type="text"
class="form-control @error('keterangan') is-invalid @enderror" name="keterangan"
value="{{ old('keterangan') }}">
@error('keterangan')
<div class="invalid-feedback" role="alert">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<div class="row mb-0">
<div class="row mb-3">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary float-right">
Tambah Data
</button>
<div class="g-recaptcha" data-sitekey="{{ env('NOCAPTCHA_SITEKEY') }}"></div>
@error('g-recaptcha-response')
<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>
</form>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</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')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Verify Your Email Address') }}</div>
<div class="card-body">
@if (session('resent'))
<div class="alert alert-success" role="alert">
{{ __('A fresh verification link has been sent to your email address.') }}
</div>
@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 class="verify-container">
<div class="verify-card">
<!-- Ikon Email -->
<div class="verify-icon"></div>
<!-- Judul -->
<h2 class="verify-title">{{ __('Verifikasi alamat email mu!') }}</h2>
<!-- Pesan Sukses (Jika Resend) -->
@if (session('resent'))
<div class="verify-alert">
{{ __('Link verifikasi sudah terkirim. Silahkan cek inbox email anda!') }}
<button type="button" class="verify-alert-close" onclick="this.parentElement.style.display='none'">×</button>
</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>
@endsection
@endsection

View File

@ -1,9 +1,12 @@
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand -->
<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>
</a>
<!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}">
<div class="sidebar-brand-icon">
<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 -->
<hr class="sidebar-divider my-0">
@ -65,11 +68,11 @@
<span>Data Pengguna</span></a>
</li>
<li class="nav-item {{ request()->Is('laporan*') ? 'active':'' }}">
<!-- <li class="nav-item {{ request()->Is('laporan*') ? 'active':'' }}">
<a class="nav-link" href="{{ route('laporan')}}">
<i class="fas fa-fw fa-file-alt"></i>
<span>Laporan</span></a>
</li>
</li> -->
<!-- Divider -->
<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">
<!-- Sidebar - Brand -->
<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>
</a>
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}">
<div class="sidebar-brand-icon">
<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 -->
<hr class="sidebar-divider my-0">
@ -40,9 +43,9 @@
<hr class="sidebar-divider d-none d-md-block">
<!-- Heading -->
<div class="sidebar-heading">
HASIL LAMARAN
</div>
<!-- <div class="sidebar-heading">
HASIL LAMARAN
</div> -->
<!-- <li class="nav-item {{ request()->Is('penilaian*') ? 'active':'' }}">
<a class="nav-link" href="{{ route('penilaian.index') }}">

View File

@ -13,6 +13,42 @@
<!-- Topbar Navbar -->
<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>
@ -30,7 +66,7 @@
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
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>
Profile
</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 -->
@include('layouts/_partials/topbar')
<!-- Di bagian navbar, tambahkan: -->
<!-- End of Topbar -->
<!-- Begin Page Content -->
@ -54,7 +54,9 @@
<!-- End of Main Content -->
<!-- Footer -->
<div style="margin-top: 85px;">
@include('layouts/_partials/footer')
</div>
<!-- End of Footer -->
</div>
@ -101,6 +103,8 @@
<!-- Custom scripts for all pages-->
<script src="{{ asset('js/sb-admin-2.min.js') }}"></script>
<script src="{{ asset('js/notifications.js') }}"></script>
@yield('js')
</body>

View File

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

View File

@ -28,7 +28,7 @@
<!-- Topbar -->
@include('layouts/_partials/topbar')
@include('layouts/_partials/topbar2')
<!-- 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">
<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
</div>
<div class="form-group">
<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
</div>
@ -81,9 +81,7 @@
</form>
</div>
<button class="btn btn-primary">Simpan</button>
<a href="{{ route('alternatif.index') }}" class="btn btn-success">Kembali</a>
</form>
</div>
</div>
</div>

View File

@ -100,7 +100,7 @@ class="form-control @error('jurusan') is-invalid @enderror"
<div class="form-group">
<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"
value="{{ old('lama_studi') }}">
@error('lama_studi')
@ -113,7 +113,7 @@ class="form-control @error('lama_studi') is-invalid @enderror"
<!-- Pengalaman & Sertifikasi -->
<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="col-md-6">
<div class="form-group">
@ -137,6 +137,33 @@ class="form-control @error('pengalaman') is-invalid @enderror"
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</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>

View File

@ -38,13 +38,12 @@
@stop
@section('content')
<div class="scrollable-content">
<div class="content-wrapper">
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800">Selamat Datang di Portal Rekrutmen</h1>
</div>
<div class="scrollable-content" style="padding-top: 0;">
<div class="content-wrapper" style="margin-top: 0;">
<!-- Page Heading -->
<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>
</div>
<!-- Content Row -->
<div class="card shadow mb-4">
@ -67,18 +66,13 @@
<li>Data Pribadi</li>
<li>Riwayat Pendidikan</li>
<li>Pengalaman Kerja</li>
<li>Keterampilan</li>
<li>Sertifikat Kompetensi (jika ada)</li>
</ul>
</div>
<div class="mb-4">
<h5 class="text-primary">3. Proses Penilaian</h5>
<p>Setelah mengajukan lamaran, tim kami akan melakukan penilaian menggunakan metode SAW (Simple Additive Weighting).</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>
<p>Setelah Anda mengisi data dan dokumen, tim HR akan melakukan peninjauan. Mohon menunggu informasi selanjutnya melalui email</p>
</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>
body {
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 {
min-height: 100vh;
position: relative;
min-height: 80vh;
display: flex;
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 {
max-width: 300px;
.hero-section .wave {
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;
margin-bottom: 2rem;
margin-top: 2rem;
}
.btn-custom {
padding: 10px 30px;
@ -31,61 +86,145 @@
text-transform: uppercase;
letter-spacing: 1px;
margin: 0 10px;
border: none;
}
.btn-login {
background-color: #007bff;
background-color: #00b747;
color: white;
}
.btn-register {
background-color: #28a745;
background-color: #a6a6a6;
color: white;
}
.btn-login:hover, .btn-register:hover {
opacity: 0.9;
color: white;
}
.description {
max-width: 600px;
margin: 0 auto 2rem auto;
color: #6c757d;
font-size: 1.1rem;
line-height: 1.6;
.services-section {
padding: 5rem 0;
background-color: #fff;
color: #333;
text-align: center;
}
.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>
</head>
<body>
<div class="hero-section">
<div class="container text-center">
<!-- Ganti src dengan path logo Intecon yang sesuai -->
<img src="{{ asset('assets/images/logo.png') }}" alt="Intecon Logo" class="logo-img">
<h1 class="mb-4">Welcome to SIPKAR</h1>
<p class="description">
Selamat Datang di Sistem Pendukung Keputusan Penerimaan Karyawan PT Intecon Bangun Persada
</p>
<!-- Navbar -->
<nav class="navbar navbar-expand-lg">
<div class="container">
<img src="{{ asset('assets/images/logo.png') }}" alt= "Intecon Logo" class="logo-img">
<a class="navbar-brand text-white" href="#">SIPKAR</a>
<div class="collapse navbar-collapse">
<!-- <ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">About</a></li>
<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">
@if (Route::has('login'))
@auth
<a href="{{ url('/dashboard') }}" class="btn btn-custom btn-login">Dashboard</a>
<!-- Dashboard button removed -->
@else
<a href="{{ route('login') }}" class="btn btn-custom btn-login">Login</a>
@if (Route::has('register.user'))
<a href="{{ route('register.user') }}" class="btn btn-custom btn-register">Register</a>
@endif
@endauth
@endif
</div>
</div>
<div class="wave"></div>
</div>
<div class="mt-5">
<p class="text-muted">© {{ date('Y') }} Intecon. All rights reserved.</p>
<!-- Services Section -->
<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>
</section>
<!-- Footer -->
<footer>
<div class="container">
<p>© {{ date('Y') }} Intecon Bangun Persada.</p>
</div>
</footer>
<!-- Bootstrap JS -->
<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>
</html>

View File

@ -5,6 +5,8 @@
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
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::get('/', function () {
if (Auth::check()) {
return redirect('/home');
}
return view('welcome');
});
return view('welcome');
})->name('welcome');
// Route untuk dashboard yang memerlukan autentikasi
Route::get('/home', [HomeController::class, 'index'])->name('home');
@ -46,10 +48,11 @@
->name('user.home')
->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('alternatif', 'App\Http\Controllers\AlternatifController')->except(['create']);
@ -61,6 +64,8 @@
return view('admin.report.index');
})->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('download-perhitungan-pdf', [App\Http\Controllers\AlgoritmaController::class, 'downloadPDF']);
Route::get('download-alternatif-pdf', [App\Http\Controllers\AlternatifController::class, 'downloadPDF']);