diff --git a/cobapeminjaman/app/Http/Controllers/CRUD/AlatController.php b/cobapeminjaman/app/Http/Controllers/CRUD/AlatController.php index fa15d600a080eeb6c10cedc86a1d450d19db9ae7..a1707f4651e8ddbeee1bf22dd6b4c3743e0c178b 100644 --- a/cobapeminjaman/app/Http/Controllers/CRUD/AlatController.php +++ b/cobapeminjaman/app/Http/Controllers/CRUD/AlatController.php @@ -4,8 +4,9 @@ namespace App\Http\Controllers\CRUD; use Illuminate\Http\Request; -use App\Models\Alat; use Illuminate\Support\Facades\Storage; +use App\Models\Alat; +use App\Models\JenisAlat; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Validator; @@ -26,6 +27,7 @@ class AlatController extends Controller 'kondisi' => 'required', 'id_jenis_alat' => 'required', 'id_ruang' => 'required', + 'tahun' => 'required', ]); if ($validator->fails()) { @@ -37,8 +39,16 @@ class AlatController extends Controller 'kondisi' => $request->kondisi, 'id_jenis_alat' => $request->id_jenis_alat, 'id_ruang' => $request->id_ruang, + 'tahun' => $request->tahun, ]); + $jenisAlat = JenisAlat::find($request->id_jenis_alat); + if ($request->kondisi == 'rusak') { + if ($jenisAlat->stok > 0) { + $jenisAlat->decrement('stok'); + } + } + return response()->json(['message' => 'Alat berhasil ditambahkan']); } @@ -63,6 +73,7 @@ class AlatController extends Controller 'kondisi' => 'required', 'id_jenis_alat' => 'required', 'id_ruang' => 'required', + 'tahun' => 'required', ]); if ($validator->fails()) { @@ -74,10 +85,18 @@ class AlatController extends Controller 'kondisi' => $request->kondisi, 'id_jenis_alat' => $request->id_jenis_alat, 'id_ruang' => $request->id_ruang, + 'tahun' => $request->tahun, ]; $db_alat->update($data); + $jenisAlat = JenisAlat::find($request->id_jenis_alat); + if ($request->kondisi == 'rusak') { + if ($jenisAlat->stok > 0) { + $jenisAlat->decrement('stok'); + } + } + return response()->json(['message' => 'Alat berhasil diupdate'], 200); } diff --git a/fe-sarpras/src/assets/img/billing.jpg b/fe-sarpras/src/assets/img/billing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0813435836c3432c20489085ecf9e417c214909 Binary files /dev/null and b/fe-sarpras/src/assets/img/billing.jpg differ diff --git a/fe-sarpras/src/components/CRUD/Alat/AddAlat.vue b/fe-sarpras/src/components/CRUD/Alat/AddAlat.vue index f4a793be6865ff03a5f3fcac7760100dedb996eb..377613a0e09467fc4be23ac9992b821841fdb586 100644 --- a/fe-sarpras/src/components/CRUD/Alat/AddAlat.vue +++ b/fe-sarpras/src/components/CRUD/Alat/AddAlat.vue @@ -3,76 +3,107 @@ <SidebarAdmintes /> <div id="content-wrapper" class="service_section layout_padding"> <Navbar /> - <div class="container mt-5"> - <div class="row"> - <div class="col-md-12"> - <div class="card border-0 rounded shadow"> - <div class="card-body"> - <h4>TAMBAH ALAT</h4> - <hr /> - - <form @submit.prevent="store"> - - <div class="form-group"> - <label for="no_inventaris" class="font-weight-bold">No Inventaris</label> - <input - type="text" - class="form-control" - v-model="post.no_inventaris" - placeholder="Masukkan nomor inventaris alat" - /> - - <div v-if="validation.no_inventaris" class="mt-2 alert alert-danger"> - {{ validation.no_inventaris[0] }} - </div> - </div> - - <div class="form-group"> - <label for="kondisi" class="font-weight-bold">Kondisi</label> - <input - type="text" - class="form-control" - v-model="post.kondisi" - placeholder="Masukkan kondisi alat" - /> - - <div v-if="validation.kondisi" class="mt-2 alert alert-danger"> - {{ validation.kondisi[0] }} - </div> - </div> - - <div class="form-group"> - <label for="id_jenis_alat" class="font-weight-bold">ID Jenis Alat</label> - <select class="form-control" v-model="post.id_jenis_alat"> - <option v-for="jalat in jalat" :key="jalat.id_jenis_alat" :value="jalat.id_jenis_alat">{{ jalat.nama_alat }}</option> - </select> - - <div v-if="validation.id_jenis_alat" class="mt-2 alert alert-danger"> - {{ validation.id_jenis_alat[0] }} - </div> + <div class="container mt-5"> + <div class="row"> + <div class="col-md-12"> + <div class="card border-0 rounded shadow"> + <div class="card-body"> + <h4>TAMBAH ALAT</h4> + <hr /> + + <form @submit.prevent="store"> + + <div class="form-group"> + <label for="no_inventaris" class="font-weight-bold">No Inventaris</label> + <input + type="text" + class="form-control" + v-model="post.no_inventaris" + placeholder="Masukkan nomor inventaris alat" + /> + + <div v-if="validation.no_inventaris" class="mt-2 alert alert-danger"> + {{ validation.no_inventaris[0] }} + </div> + </div> + + <div class="form-group"> + <label for="kondisi" class="font-weight-bold">Kondisi</label> + <div class="form-check"> + <input + class="form-check-input" + type="radio" + name="kondisi" + id="bagus" + value="bagus" + v-model="post.kondisi" + /> + <label class="form-check-label" for="bagus">Bagus</label> + </div> + <div class="form-check"> + <input + class="form-check-input" + type="radio" + name="kondisi" + id="rusak" + value="rusak" + v-model="post.kondisi" + /> + <label class="form-check-label" for="rusak">Rusak</label> + </div> + + <div v-if="validation.kondisi" class="mt-2 alert alert-danger"> + {{ validation.kondisi[0] }} + </div> + </div> + + + <div class="form-group"> + <label for="id_jenis_alat" class="font-weight-bold">ID Jenis Alat</label> + <select class="form-control" v-model="post.id_jenis_alat"> + <option v-for="jalat in jalat" :key="jalat.id_jenis_alat" :value="jalat.id_jenis_alat">{{ jalat.nama_alat }}</option> + </select> + + <div v-if="validation.id_jenis_alat" class="mt-2 alert alert-danger"> + {{ validation.id_jenis_alat[0] }} + </div> + </div> + + <div class="form-group"> + <label for="id_ruang" class="font-weight-bold">ID ruang</label> + <select class="form-control" v-model="post.id_ruang"> + <option v-for="ruang in ruang" :key="ruang.id_ruang" :value="ruang.id_ruang">{{ ruang.nama_ruang }}</option> + </select> + + <div v-if="validation.id_ruang" class="mt-2 alert alert-danger"> + {{ validation.id_ruang[0] }} + </div> + </div> + + <div class="form-group"> + <label for="tahun" class="font-weight-bold">Tahun</label> + <input + type="number" + class="form-control" + v-model="post.tahun" + placeholder="Masukkan tahun alat" + /> + + <div v-if="validation.tahun" class="mt-2 alert alert-danger"> + {{ validation.tahun[0] }} + </div> + </div> + + <button type="submit" class="btn btn-primary">SIMPAN</button> + <router-link :to="{ name: 'allAlat' }" class="btn btn-secondary" + >CANCEL</router-link + > + </form> </div> - - <div class="form-group"> - <label for="id_ruang" class="font-weight-bold">ID ruang</label> - <select class="form-control" v-model="post.id_ruang"> - <option v-for="ruang in ruang" :key="ruang.id_ruang" :value="ruang.id_ruang">{{ ruang.nama_ruang }}</option> - </select> - - <div v-if="validation.id_ruang" class="mt-2 alert alert-danger"> - {{ validation.id_ruang[0] }} - </div> - </div> - - <button type="submit" class="btn btn-primary">SIMPAN</button> - <router-link :to="{ name: 'allAlat' }" class="btn btn-secondary" - >CANCEL</router-link - > - </form> + </div> </div> </div> </div> - </div> - </div> <Footer /> </div> </div> @@ -98,6 +129,7 @@ export default { kondisi: "", id_jenis_alat: "", id_ruang: "", + tahun: "", }); const jalat = ref([]); @@ -138,6 +170,7 @@ export default { formData.append('kondisi', post.kondisi); formData.append('id_jenis_alat', post.id_jenis_alat); formData.append('id_ruang', post.id_ruang); + formData.append('tahun', post.tahun); axios .post('/api/alat/add_alat', formData, { @@ -169,4 +202,4 @@ export default { body { background: lightgray; } -</style> +</style> \ No newline at end of file diff --git a/fe-sarpras/src/components/CRUD/Alat/AllAlat.vue b/fe-sarpras/src/components/CRUD/Alat/AllAlat.vue index a62f2b91c97b454d1bfc3b762f2b0393d5a9abac..4bcdc822d31c04d6149f1581b8e09d2eaf6cd158 100644 --- a/fe-sarpras/src/components/CRUD/Alat/AllAlat.vue +++ b/fe-sarpras/src/components/CRUD/Alat/AllAlat.vue @@ -8,31 +8,33 @@ Tambah Alat </router-link> - <table class="table table-bordered table-hover"> - <thead class="thead-dark"> - <tr> - <th scope="col">No</th> - <th scope="col">No Inventaris</th> - <th scope="col">Kondisi</th> - <th scope="col">ID Jenis Alat</th> - <th scope="col">ID Ruang</th> - <th scope="col">Action</th> - </tr> - </thead> - <tbody> - <tr v-for="(alat, index) in ListAlat" :key="alat.id_alat"> - <td>{{ index + 1 }}</td> - <td>{{ alat.no_inventaris }}</td> - <td>{{ alat.kondisi }}</td> - <td>{{ alat.id_jenis_alat }}</td> - <td>{{ alat.id_ruang }}</td> - <td> - <button @click="updateAlat(alat.id_alat)" class="btn btn-info">Update</button> - <button @click="deleteAlat(alat.id_alat)" class="btn btn-danger">Delete</button> - </td> - </tr> - </tbody> - </table> + <table class="table table-bordered table-hover"> + <thead class="thead-dark"> + <tr> + <th scope="col">No</th> + <th scope="col">No Inventaris</th> + <th scope="col">Kondisi</th> + <th scope="col">ID Jenis Alat</th> + <th scope="col">ID Ruang</th> + <th scope="col">Tahun</th> + <th scope="col">Action</th> + </tr> + </thead> + <tbody> + <tr v-for="(alat, index) in ListAlat" :key="alat.id_alat"> + <td>{{ index + 1 }}</td> + <td>{{ alat.no_inventaris }}</td> + <td>{{ alat.kondisi }}</td> + <td>{{ alat.id_jenis_alat }}</td> + <td>{{ alat.id_ruang }}</td> + <td>{{ alat.tahun }}</td> + <td> + <button @click="updateAlat(alat.id_alat)" class="btn btn-info">Update</button> + <button @click="deleteAlat(alat.id_alat)" class="btn btn-danger">Delete</button> + </td> + </tr> + </tbody> + </table> </div> <Footer /> </div> @@ -51,83 +53,70 @@ export default { Navbar, }, data() { - return { - ListAlat: [], - }; - }, - mounted() { - this.fetchAlat(); - }, - methods: { - async fetchAlat() { - try { - const response = await this.$axios.get('/api/alat'); - this.ListAlat = response.data; - } catch (error) { - console.error('Error fetching alat:', error); - } + return { + ListAlat: [], + }; }, - updateAlat(id_alat) { - this.$router.push({ name: 'updateAlat', params: { id: id_alat } }); + mounted() { + this.fetchAlat(); }, - async deleteAlat(id_alat) { - const isConfirmed = window.confirm("Are you sure you want to delete this alat?"); - if (isConfirmed) { + methods: { + async fetchAlat() { try { - await this.$axios.delete(`/api/alat/${id_alat}`); - this.fetchAlat(); + const response = await this.$axios.get('/api/alat'); + this.ListAlat = response.data; } catch (error) { - console.error('Error deleting alat:', error); + console.error('Error fetching alat:', error); + } + }, + updateAlat(id_alat) { + this.$router.push({ name: 'updateAlat', params: { id: id_alat } }); + }, + async deleteAlat(id_alat) { + const isConfirmed = window.confirm("Are you sure you want to delete this alat?"); + if (isConfirmed) { + try { + await this.$axios.delete(`/api/alat/${id_alat}`); + this.fetchAlat(); + } catch (error) { + console.error('Error deleting alat:', error); + } } - } + }, }, - }, -}; -</script> - -<style scoped> -@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap'); - -body { - font-family: 'Roboto', sans-serif; - margin: 0; - padding: 0; - background-color: #f8f9fa; -} - -.main-container { - display: flex; -} - -.content { - flex-grow: 1; - padding: 20px; - margin-left: 5px; - transition: margin-left 0.3s ease-in-out; -} - -.container { - padding: 10px; -} - -.btn-success { - background-color: #28a745; - border-color: #28a745; -} - -.btn-success:hover { - background-color: #218838; - border-color: #1e7e34; -} - -.table th, -.table td { - text-align: center; - vertical-align: middle; -} - -.btn-info, -.btn-danger { - width: 80px; -} -</style> + }; + </script> + + <style scoped> + .product-image { + max-width: 100px; + max-height: 75px; + object-fit: cover; + } + + .container { + padding: 30px; + } + + .btn-success { + background-color: #28a745; + border-color: #28a745; + } + + .btn-success:hover { + background-color: #218838; + border-color: #1e7e34; + } + + .table th, + .table td { + text-align: center; + vertical-align: middle; + } + + .btn-info, + .btn-danger { + width: 80px; + } + </style> + \ No newline at end of file diff --git a/fe-sarpras/src/components/CRUD/Alat/UpdateAlat.vue b/fe-sarpras/src/components/CRUD/Alat/UpdateAlat.vue index 23ee64713abf5c5649bb0c8fd1864818cd01bb47..562f8d4ce628498db164563c084aab6edd5f9e9c 100644 --- a/fe-sarpras/src/components/CRUD/Alat/UpdateAlat.vue +++ b/fe-sarpras/src/components/CRUD/Alat/UpdateAlat.vue @@ -27,13 +27,29 @@ </div> <div class="form-group"> - <label for="kondisi" class="font-weight-bold">Kondisi Alat</label> - <input - type="text" - class="form-control" - v-model="alat.kondisi" - placeholder="Masukkan Kondisi Alat" - /> + <label for="kondisi" class="font-weight-bold">Kondisi</label> + <div class="form-check"> + <input + class="form-check-input" + type="radio" + name="kondisi" + id="bagus" + value="bagus" + v-model="alat.kondisi" + /> + <label class="form-check-label" for="bagus">Bagus</label> + </div> + <div class="form-check"> + <input + class="form-check-input" + type="radio" + name="kondisi" + id="rusak" + value="rusak" + v-model="alat.kondisi" + /> + <label class="form-check-label" for="rusak">Rusak</label> + </div> <div v-if="validation.kondisi" class="mt-2 alert alert-danger"> {{ validation.kondisi[0] }} @@ -62,6 +78,20 @@ </div> </div> + <div class="form-group"> + <label for="tahun" class="font-weight-bold">Tahun</label> + <input + type="number" + class="form-control" + v-model="alat.tahun" + placeholder="Masukkan tahun alat" + /> + + <div v-if="validation.tahun" class="mt-2 alert alert-danger"> + {{ validation.tahun[0] }} + </div> + </div> + <button type="submit" class="btn btn-primary">UPDATE</button> <router-link :to="{ name: 'allAlat' }" class="btn btn-secondary" >CANCEL</router-link @@ -95,8 +125,9 @@ export default { const alat = reactive({ no_inventaris: "", kondisi: "", - stok: "", - foto_alat: null, + id_jenis_alat: "", + id_ruang: "", + tahun: "", }); const jalat = ref([]); @@ -138,6 +169,7 @@ export default { alat.kondisi = response.data.kondisi; alat.id_jenis_alat = response.data.id_jenis_alat; alat.id_ruang = response.data.id_ruang; + alat.tahun = response.data.tahun; }) .catch((error) => { console.log(error); @@ -150,6 +182,7 @@ function updateAlat() { formData.append("kondisi", alat.kondisi); formData.append("id_jenis_alat", alat.id_jenis_alat); formData.append("id_ruang", alat.id_ruang); + formData.append("tahun", alat.tahun); axios .post(`/api/alat/update/${route.params.id}`, formData, { diff --git a/fe-sarpras/src/components/includes/navbar.vue b/fe-sarpras/src/components/includes/navbar.vue index 07bd348904398f720ea121e92135579b193274f7..a17845860dd5c0ec6c849eae895ea23c3dd08686 100644 --- a/fe-sarpras/src/components/includes/navbar.vue +++ b/fe-sarpras/src/components/includes/navbar.vue @@ -56,46 +56,6 @@ <span class="badge badge-danger badge-counter">3+</span> </a> <!-- Dropdown - Alerts --> - <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" - aria-labelledby="alertsDropdown"> - <h6 class="dropdown-header"> - Alerts Center - </h6> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="mr-3"> - <div class="icon-circle bg-primary"> - <i class="fas fa-file-alt text-white"></i> - </div> - </div> - <div> - <div class="small text-gray-500">December 12, 2019</div> - <span class="font-weight-bold">A new monthly report is ready to download!</span> - </div> - </a> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="mr-3"> - <div class="icon-circle bg-success"> - <i class="fas fa-donate text-white"></i> - </div> - </div> - <div> - <div class="small text-gray-500">December 7, 2019</div> - $290.29 has been deposited into your account! - </div> - </a> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="mr-3"> - <div class="icon-circle bg-warning"> - <i class="fas fa-exclamation-triangle text-white"></i> - </div> - </div> - <div> - <div class="small text-gray-500">December 2, 2019</div> - Spending Alert: We've noticed unusually high spending for your account. - </div> - </a> - <a class="dropdown-item text-center small text-gray-500" href="#">Show All Alerts</a> - </div> </li> <!-- Nav Item - Messages --> @@ -107,61 +67,6 @@ <span class="badge badge-danger badge-counter">7</span> </a> <!-- Dropdown - Messages --> - <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" - aria-labelledby="messagesDropdown"> - <h6 class="dropdown-header"> - Message Center - </h6> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="dropdown-list-image mr-3"> - <img class="rounded-circle" src="img/undraw_profile_1.svg" - alt="..."> - <div class="status-indicator bg-success"></div> - </div> - <div class="font-weight-bold"> - <div class="text-truncate">Hi there! I am wondering if you can help me with a - problem I've been having.</div> - <div class="small text-gray-500">Emily Fowler · 58m</div> - </div> - </a> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="dropdown-list-image mr-3"> - <img class="rounded-circle" src="img/undraw_profile_2.svg" - alt="..."> - <div class="status-indicator"></div> - </div> - <div> - <div class="text-truncate">I have the photos that you ordered last month, how - would you like them sent to you?</div> - <div class="small text-gray-500">Jae Chun · 1d</div> - </div> - </a> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="dropdown-list-image mr-3"> - <img class="rounded-circle" src="img/undraw_profile_3.svg" - alt="..."> - <div class="status-indicator bg-warning"></div> - </div> - <div> - <div class="text-truncate">Last month's report looks great, I am very happy with - the progress so far, keep up the good work!</div> - <div class="small text-gray-500">Morgan Alvarez · 2d</div> - </div> - </a> - <a class="dropdown-item d-flex align-items-center" href="#"> - <div class="dropdown-list-image mr-3"> - <img class="rounded-circle" src="https://source.unsplash.com/Mv9hjnEUHR4/60x60" - alt="..."> - <div class="status-indicator bg-success"></div> - </div> - <div> - <div class="text-truncate">Am I a good boy? The reason I ask is because someone - told me that people say this to all dogs, even if they aren't good...</div> - <div class="small text-gray-500">Chicken the Dog · 2w</div> - </div> - </a> - <a class="dropdown-item text-center small text-gray-500" href="#">Read More Messages</a> - </div> </li> <div class="topbar-divider d-none d-sm-block"></div> @@ -170,9 +75,9 @@ <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"> - <span class="mr-2 d-none d-lg-inline text-gray-600 small">Douglas McGee</span> + <span class="mr-2 d-none d-lg-inline text-gray-600 small">Ini Nama Profil</span> <img class="img-profile rounded-circle" - src="img/undraw_profile.svg"> + src="require('@/assets/img/billing.jpg')"> </a> <!-- Dropdown - User Information --> <div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"