Files
accounting_dev/application/views/employees/employees.php
T
2026-05-26 08:07:45 +00:00

1341 lines
36 KiB
PHP

<div class="container mt-4">
<div class="card border-0 shadow-lg rounded-4">
<div class="card-body p-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<div>
<h4 class="mb-1 fw-bold">
Data Karyawan
</h4>
<small class="text-muted">
Management Data Karyawan
</small>
</div>
<button class="btn btn-warning rounded-pill px-4 btn-add">
<i class="fa fa-plus me-2"></i>
Tambah Karyawan
</button>
</div>
<div class="table-responsive">
<table id="tableEmployees"
class="table modern-table align-middle w-100">
<thead class="table-light">
<tr>
<th>No</th>
<th>Foto</th>
<th>Kode</th>
<th>Fingerprint</th>
<th>Nama</th>
<th>Department</th>
<th>Position</th>
<th>Branch</th>
<th>Phone</th>
<th>Status</th>
<th>Active</th>
<th>Aksi</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
<!-- MODAL -->
<div class="modal fade" id="modalEmployee">
<div class="modal-dialog modal-xl modal-dialog-scrollable modal-dialog-centered">
<div class="modal-content border-0 shadow-lg rounded-4">
<div class="modal-header bg-warning text-white">
<h5 class="modal-title">
Form Karyawan
</h5>
<button class="btn-close btn-close-white"
data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4">
<input type="hidden" id="id">
<div class="row">
<!-- FOTO -->
<div class="col-md-4 mb-4">
<label class="fw-semibold mb-2">
Foto Karyawan
</label>
<div class="upload-box text-center p-4">
<img src="https://cdn-icons-png.flaticon.com/512/149/149071.png"
id="photoPreview"
class="preview-photo mb-3">
<div>
<input type="file"
id="photo_file"
accept="image/*"
hidden>
<button type="button"
class="btn btn-outline-warning rounded-pill"
id="btnChoosePhoto">
<i class="fa fa-image me-2"></i>
Pilih Foto
</button>
</div>
<small class="text-muted d-block mt-2">
JPG, PNG, WEBP Max 2MB
</small>
</div>
</div>
<!-- FORM -->
<div class="col-md-8">
<div class="row">
<div class="col-md-7 mb-3">
<label>NIK</label>
<input type="text"
id="nik"
class="form-control">
</div>
<div class="col-md-5 mb-3">
<label>Fingerprint User ID</label>
<input type="text"
id="fingerprint_user_id"
class="form-control">
</div>
<div class="col-md-6 mb-3">
<label>Nama Lengkap</label>
<input type="text"
id="full_name"
class="form-control">
</div>
<div class="col-md-3 mb-3">
<label>Agama</label>
<select id="religion"
class="form-control">
<option value="">
-- Pilih --
</option>
<option value="Islam">
Islam
</option>
<option value="Kristen">
Kristen
</option>
<option value="Katolik">
Katolik
</option>
<option value="Hindu">
Hindu
</option>
<option value="Buddha">
Buddha
</option>
<option value="Konghucu">
Konghucu
</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label>Gender</label>
<select id="gender"
class="form-control">
<option value="">
-- Pilih --
</option>
<option value="male">
Male
</option>
<option value="female">
Female
</option>
</select>
</div>
<div class="col-md-5 mb-3">
<label>Tempat Lahir</label>
<input type="text"
id="birth_place"
class="form-control">
</div>
<div class="col-md-4 mb-3">
<label>Tanggal Lahir</label>
<input type="date"
id="birth_date"
class="form-control">
</div>
<div class="col-md-3 mb-3">
<label>Status Pernikahan</label>
<select id="marital_status"
class="form-control">
<option value="single">
Single
</option>
<option value="married">
Married
</option>
<option value="divorced">
Divorced
</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label>Phone</label>
<input type="text"
id="phone"
class="form-control">
</div>
<div class="col-md-6 mb-3">
<label>Email</label>
<input type="email"
id="email"
class="form-control">
</div>
<div class="col-md-12 mb-3">
<label>Alamat</label>
<textarea id="address"
class="form-control"></textarea>
</div>
</div>
</div>
<!-- JOB -->
<div class="col-md-3 mb-3">
<label>Department</label>
<select id="department_id"
class="form-control">
<option value="">
-- Pilih Department --
</option>
<?php foreach($departments as $d): ?>
<option value="<?= $d->id ?>">
<?= $d->department_name ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3 mb-3">
<label>Position</label>
<select id="position_id"
class="form-control">
<option value="">
-- Pilih Position --
</option>
<?php foreach($positions as $p): ?>
<option value="<?= $p->id ?>">
<?= $p->position_name ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3 mb-3">
<label>Branch</label>
<select id="branch_id"
class="form-control">
<option value="">
-- Pilih Branch --
</option>
<?php foreach($branches as $b): ?>
<option value="<?= $b->id ?>">
<?= $b->branch_name ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3 mb-3">
<label>Status Karyawan</label>
<select id="employment_status"
class="form-control">
<option value="permanent">
Permanent
</option>
<option value="contract">
Contract
</option>
<option value="intern">
Intern
</option>
<option value="freelance">
Freelance
</option>
</select>
</div>
<div class="col-md-4 mb-3">
<label>Tanggal Masuk</label>
<input type="date"
id="join_date"
class="form-control">
</div>
<div class="col-md-4 mb-3">
<label>Status Active</label>
<select id="is_active"
class="form-control">
<option value="1">
Active
</option>
<option value="0">
Non Active
</option>
</select>
</div>
<div class="col-md-4 mb-3">
<label>Basic Salary</label>
<input type="number"
id="basic_salary"
class="form-control">
</div>
<div class="col-md-4 mb-3">
<label>Bank Name</label>
<input type="text"
id="bank_name"
class="form-control">
</div>
<div class="col-md-4 mb-3">
<label>Bank Account Number</label>
<input type="text"
id="bank_account_number"
class="form-control">
</div>
<div class="col-md-4 mb-3">
<label>Bank Account Name</label>
<input type="text"
id="bank_account_name"
class="form-control">
</div>
<div class="col-md-6 mb-3">
<label>BPJS Kesehatan</label>
<input type="text"
id="bpjs_kesehatan_number"
class="form-control">
</div>
<div class="col-md-6 mb-3">
<label>BPJS Ketenagakerjaan</label>
<input type="text"
id="bpjs_ketenagakerjaan_number"
class="form-control">
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary"
data-bs-dismiss="modal">
Batal
</button>
<button class="btn btn-warning"
id="btnSimpan">
Simpan
</button>
</div>
</div>
</div>
</div>
<!-- MODAL DETAIL -->
<div class="modal fade" id="modalDetail">
<div class="modal-dialog modal-xl modal-dialog-scrollable modal-dialog-centered">
<div class="modal-content border-0 shadow-lg rounded-4">
<div class="modal-header bg-secondary text-white">
<h5 class="modal-title">
Detail Karyawan
</h5>
<button class="btn-close btn-close-white"
data-bs-dismiss="modal"></button>
</div>
<div class="modal-body"
id="detailBody">
</div>
</div>
</div>
</div>
<style>
.preview-photo{
width:140px;
height:140px;
object-fit:cover;
border-radius:50%;
border:5px solid #f1f1f1;
}
.upload-box{
border:2px dashed #d9d9d9;
border-radius:20px;
background:#fafafa;
}
.table-photo{
width:50px;
height:50px;
border-radius:50%;
object-fit:cover;
}
</style>
<script>
const base_url = "<?= base_url(); ?>";
$(function(){
let action = 'add';
// =========================================
// DATATABLE
// =========================================
let table = $('#tableEmployees').DataTable({
processing:true,
responsive:true,
autoWidth:false,
ajax:{
url: base_url + 'employees/getAll',
dataSrc:'data'
},
columns:[
{
data:null,
render:(d,t,r,m)=>m.row+1
},
{
data:'photo',
render:function(data){
let photo = data
? base_url + data
: 'https://cdn-icons-png.flaticon.com/512/149/149071.png';
return `
<img src="${photo}"
class="table-photo">
`;
}
},
{data:'employee_code'},
{data:'fingerprint_user_id'},
{data:'full_name'},
{
data:'department_name',
defaultContent:'-'
},
{
data:'position_name',
defaultContent:'-'
},
{
data:'branch_name',
defaultContent:'-'
},
{data:'phone'},
{data:'employment_status'},
{
data:'is_active',
render:function(data){
return data == 1
? '<span class="badge bg-success">Active</span>'
: '<span class="badge bg-danger">Non Active</span>';
}
},
{
data:null,
render:function(data){
return `
<button class="btn btn-info btn-sm btn-detail"
data-id="${data.id}">
Detail
</button>
<button class="btn btn-warning btn-sm btn-edit"
data-id="${data.id}">
Edit
</button>
<button class="btn btn-danger btn-sm btn-delete"
data-id="${data.id}">
Delete
</button>
`;
}
}
]
});
// =========================================
// RESET
// =========================================
function resetForm(){
$('#id').val('');
$('#modalEmployee input').val('');
$('#modalEmployee textarea').val('');
$('#department_id').val('');
$('#position_id').val('');
$('#branch_id').val('');
$('#gender').val('');
$('#employment_status').val('permanent');
$('#marital_status').val('single');
$('#is_active').val('1');
$('#photoPreview').attr(
'src',
'https://cdn-icons-png.flaticon.com/512/149/149071.png'
);
$('#photo_file').val('');
}
// =========================================
// FOTO
// =========================================
$('#btnChoosePhoto').click(function(){
$('#photo_file').click();
});
$('#photo_file').change(function(){
let file = this.files[0];
if(file){
let reader = new FileReader();
reader.onload = function(e){
$('#photoPreview').attr(
'src',
e.target.result
);
}
reader.readAsDataURL(file);
}
});
// =========================================
// ADD
// =========================================
$('.btn-add').click(function(){
resetForm();
action = 'add';
$('#modalEmployee').modal('show');
});
// =========================================
// EDIT
// =========================================
$(document).on('click','.btn-edit',function(){
let id = $(this).data('id');
$.get(
base_url + 'employees/detail/' + id,
function(res){
if(!res.status){
Swal.fire(
'Error',
res.message,
'error'
);
return;
}
let d = res.data;
$('#id').val(d.id);
$('#nik').val(d.nik);
$('#full_name').val(d.full_name);
$('#gender').val(d.gender);
$('#birth_place').val(d.birth_place);
$('#birth_date').val(d.birth_date);
$('#phone').val(d.phone);
$('#email').val(d.email);
$('#address').val(d.address);
$('#join_date').val(d.join_date);
$('#resign_date').val(d.resign_date);
$('#employment_status').val(d.employment_status);
$('#marital_status').val(d.marital_status);
$('#religion').val(d.religion);
$('#department_id').val(d.department_id);
$('#position_id').val(d.position_id);
$('#branch_id').val(d.branch_id);
$('#basic_salary').val(d.basic_salary);
$('#bank_name').val(d.bank_name);
$('#bank_account_number').val(d.bank_account_number);
$('#bank_account_name').val(d.bank_account_name);
$('#bpjs_kesehatan_number').val(d.bpjs_kesehatan_number);
$('#bpjs_ketenagakerjaan_number').val(d.bpjs_ketenagakerjaan_number);
$('#fingerprint_user_id').val(d.fingerprint_user_id);
$('#is_active').val(d.is_active);
if(d.photo){
$('#photoPreview').attr(
'src',
base_url + d.photo
);
}
action = 'edit';
$('#modalEmployee').modal('show');
},
'json'
);
});
// =========================================
// SAVE
// =========================================
$('#btnSimpan').click(function(){
let formData = new FormData();
formData.append('nik', $('#nik').val());
formData.append('full_name', $('#full_name').val());
formData.append('gender', $('#gender').val());
formData.append('birth_place', $('#birth_place').val());
formData.append('birth_date', $('#birth_date').val());
formData.append('phone', $('#phone').val());
formData.append('email', $('#email').val());
formData.append('address', $('#address').val());
formData.append('join_date', $('#join_date').val());
formData.append('resign_date', $('#resign_date').val());
formData.append('employment_status', $('#employment_status').val());
formData.append('marital_status', $('#marital_status').val());
formData.append('religion', $('#religion').val());
formData.append('department_id', $('#department_id').val());
formData.append('position_id', $('#position_id').val());
formData.append('branch_id', $('#branch_id').val());
formData.append('basic_salary', $('#basic_salary').val());
formData.append('bank_name', $('#bank_name').val());
formData.append('bank_account_number', $('#bank_account_number').val());
formData.append('bank_account_name', $('#bank_account_name').val());
formData.append('bpjs_kesehatan_number', $('#bpjs_kesehatan_number').val());
formData.append('bpjs_ketenagakerjaan_number', $('#bpjs_ketenagakerjaan_number').val());
formData.append('fingerprint_user_id', $('#fingerprint_user_id').val());
formData.append('is_active', $('#is_active').val());
let photo = $('#photo_file')[0].files[0];
if(photo){
formData.append('photo_file', photo);
}
if(
!$('#full_name').val() ||
!$('#join_date').val()
){
Swal.fire(
'Warning',
'Nama dan tanggal masuk wajib diisi',
'warning'
);
return;
}
let url = action === 'add'
? base_url + 'employees/store'
: base_url + 'employees/update/' + $('#id').val();
$.ajax({
url:url,
type:'POST',
data:formData,
processData:false,
contentType:false,
dataType:'json',
success:function(res){
if(res.status){
$('#modalEmployee').modal('hide');
table.ajax.reload(null,false);
Swal.fire(
'Sukses',
res.message,
'success'
);
} else {
Swal.fire(
'Error',
res.message,
'error'
);
}
}
});
});
// =========================================
// DETAIL
// =========================================
$(document).on('click','.btn-detail',function(){
let id = $(this).data('id');
$.get(
base_url + 'employees/detail/' + id,
function(res){
if(!res.status){
Swal.fire(
'Error',
res.message,
'error'
);
return;
}
let d = res.data;
let photo = d.photo
? base_url + d.photo
: 'https://cdn-icons-png.flaticon.com/512/149/149071.png';
$('#detailBody').html(`
<div class="row">
<div class="col-md-4 mb-4">
<div class="upload-box p-4 h-100 d-flex flex-column">
<div class="text-center">
<img src="${photo}"
class="preview-photo mb-3">
<h4 class="fw-bold mb-1">
${d.full_name || '-'}
</h4>
<div class="text-muted mb-3">
${d.employee_code || '-'}
</div>
<span class="badge ${d.is_active == 1 ? 'bg-success' : 'bg-danger'} px-3 py-2">
${d.is_active == 1 ? 'Active' : 'Non Active'}
</span>
</div>
<div class="mt-4">
<div class="border rounded-4 p-3 bg-white mb-3">
<small class="text-muted d-block">
Department
</small>
<div class="fw-semibold">
${d.department_name || '-'}
</div>
</div>
<div class="border rounded-4 p-3 bg-white mb-3">
<small class="text-muted d-block">
Position
</small>
<div class="fw-semibold">
${d.position_name || '-'}
</div>
</div>
<div class="border rounded-4 p-3 bg-white mb-3">
<small class="text-muted d-block">
Branch
</small>
<div class="fw-semibold">
${d.branch_name || '-'}
</div>
</div>
<div class="border rounded-4 p-3 bg-white mb-3">
<small class="text-muted d-block">
Phone
</small>
<div class="fw-semibold">
${d.phone || '-'}
</div>
</div>
<div class="border rounded-4 p-3 bg-white">
<small class="text-muted d-block">
Email
</small>
<div class="fw-semibold text-break">
${d.email || '-'}
</div>
</div>
</div>
</div>
</div>
<div class="col-md-8">
<div class="row">
<div class="col-12 mb-3">
<h5 class="fw-bold border-bottom pb-2">
Data Pribadi
</h5>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
NIK
</label>
<div class="fw-semibold">
${d.nik || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Fingerprint User ID
</label>
<div class="fw-semibold">
${d.fingerprint_user_id || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Gender
</label>
<div class="fw-semibold">
${d.gender || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Agama
</label>
<div class="fw-semibold">
${d.religion || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Status Pernikahan
</label>
<div class="fw-semibold">
${d.marital_status || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Tempat Lahir
</label>
<div class="fw-semibold">
${d.birth_place || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Tanggal Lahir
</label>
<div class="fw-semibold">
${d.birth_date || '-'}
</div>
</div>
<div class="col-12 mt-3 mb-3">
<h5 class="fw-bold border-bottom pb-2">
Kontak
</h5>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Phone
</label>
<div class="fw-semibold">
${d.phone || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Email
</label>
<div class="fw-semibold">
${d.email || '-'}
</div>
</div>
<div class="col-md-12 mb-3">
<label class="text-muted small">
Alamat
</label>
<div class="fw-semibold">
${d.address || '-'}
</div>
</div>
<div class="col-12 mt-3 mb-3">
<h5 class="fw-bold border-bottom pb-2">
Data Pekerjaan
</h5>
</div>
<div class="col-md-4 mb-3">
<label class="text-muted small">
Department
</label>
<div class="fw-semibold">
${d.department_name || '-'}
</div>
</div>
<div class="col-md-4 mb-3">
<label class="text-muted small">
Position
</label>
<div class="fw-semibold">
${d.position_name || '-'}
</div>
</div>
<div class="col-md-4 mb-3">
<label class="text-muted small">
Branch
</label>
<div class="fw-semibold">
${d.branch_name || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Status Karyawan
</label>
<div class="fw-semibold">
${d.employment_status || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Basic Salary
</label>
<div class="fw-semibold">
Rp ${parseInt(d.basic_salary || 0).toLocaleString('id-ID')}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Tanggal Masuk
</label>
<div class="fw-semibold">
${d.join_date || '-'}
</div>
</div>
<div class="col-md-6 mb-3">
<label class="text-muted small">
Tanggal Resign
</label>
<div class="fw-semibold">
${d.resign_date || '-'}
</div>
</div>
</div>
</div>
</div>
`);
$('#modalDetail').modal('show');
},
'json'
);
});
// =========================================
// DELETE
// =========================================
$(document).on('click','.btn-delete',function(){
let id = $(this).data('id');
Swal.fire({
title:'Hapus karyawan?',
text:'Data tidak dapat dikembalikan',
icon:'warning',
showCancelButton:true
}).then((r)=>{
if(r.isConfirmed){
$.get(
base_url + 'employees/delete/' + id,
function(res){
if(res.status){
table.ajax.reload(null,false);
Swal.fire(
'Sukses',
res.message,
'success'
);
} else {
Swal.fire(
'Error',
res.message,
'error'
);
}
},
'json'
);
}
});
});
});
</script>