Tarik Data dari Mesin Absensi X100C ke MySQL dan Menampilkan Kembali dengan PHP (Part-2)
Tutorial ini adalah sambungan dari tutorial menarik data dari mesin presensi Solution X100C (link). Saya akan berikan contoh kode php untuk menampilkan data presensi. Tidak semua kode ditampilkan seperti file koneksi, karena yang paling penting menurut saya adalah query MySQL untuk menampilkan data dari database menggunakan skrip php.
- Contoh tampilan tabel presensi, dimana idpresensi: record presensi (auto_increment, primary_key), idmm: id karyawan (foreign_key), dan att: data hasil penarikan dari mesin X100C (format tanggal dan waktu digabung).
- Dibawah ini adalah contoh skrip php untuk form yang menampilkan dan memproses lembur karyawan berdasarkan periode waktu yang dipilih, silahkan dimodifikasi sesuai kebutuhan:// -----> File Koneksi ke DB => tidak ditampilkan
//Proses form:if ($_SERVER['REQUEST_METHOD'] == 'POST') {$errors = array();
//Cek nama karyawan:
if (!empty($_POST['idmm'])) {
$idmm = mysqli_real_escape_string($dbc, trim($_POST['idmm']));
} else {
$errors[] = 'Nama karyawan belum dipilih';
}
//Cek Tanggal awal lembur:
if ((!empty($_POST['tanggal_awal'])) or (!empty($_POST['bulan_awal'])) or (!empty($_POST['tahun_awal']))) {
$tanggal = $_POST['tanggal_awal'];
$bulan = $_POST['bulan_awal'];
$tahun = $_POST['tahun_awal'];
$periode_awal = $tahun.'-'.$bulan.'-'.$tanggal;
} else {
$errors[] = 'Cek kembali tanggal awal periode lembur!';
}
//Cek Tanggal akhir lembur:
if ((!empty($_POST['tanggal_akhir'])) or (!empty($_POST['bulan_akhir'])) or (!empty($_POST['tahun_akhir']))) {
$tanggal = $_POST['tanggal_akhir'];
$bulan = $_POST['bulan_akhir'];
$tahun = $_POST['tahun_akhir'];
$periode_akhir = $tahun.'-'.$bulan.'-'.$tanggal;
} else {
$errors[] = 'Cek kembali tanggal akhir periode lembur';
}
// Cek jika periode akhir lebih kecil dari periode awal:
if ($periode_akhir < $periode_awal) {
$errors[] = 'Periode akhir lebih kecil daripada periode awal, cek kembali!';
}
$display = 31; //Maksimal data ditampilkan dari DB
$start = 0; //Posisi awal record di DB
if (empty($errors)) {
//Jalankan query:
$q = "SELECT pre.idmm AS idmm, pribadi.nama AS nama, DATE_FORMAT(pre.att, '%d-%b-%y') AS tanggal, DATE_FORMAT(MIN(pre.att), '%H:%i') AS masuk, CASE WHEN MAX(pre.att)<>MIN(att) THEN DATE_FORMAT(MAX(pre.att), '%H:%i') END AS keluar FROM presensi_tarik_data pre LEFT JOIN karyawan_data_pribadi pribadi USING (idmm) WHERE pre.att >= '$periode_awal' AND pre.att <= '$periode_akhir' AND pre.idmm = '$idmm' GROUP BY pribadi.nama, DATE(pre.att) LIMIT $start, $display";
$r = mysqli_query($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: ".mysqli_error($dbc));
echo '<div id="content">';
If (mysqli_num_rows($r) > 0) {
echo '<h4>Data Presensi Karyawan</h4>';
//Ubah format tanggal MySQL ke format tanggal lokal:
$tglawal = date("d-m-Y", strtotime($periode_awal));
$tglakhir = date("d-m-Y", strtotime($periode_akhir));
echo 'Periode: '.$tglawal.' s/d '.$tglakhir;
$no = $start + 1; //Penomoran data
//Table header:
echo '<table style="width:65%; border-spacing:5;">
<tr>
<th>No</th>
<th>Nama</th>
<th>Tanggal</th>
<th>Masuk</th>
<th>Keluar</th>
<th>Piket</th>
</tr>';
//Ambil data dari DB:
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
echo '<tr>
<td align="right">'.$no.'</td>
<td align="center">'.$row['nama'].'</td>';
//Jika weekend tanggal dicetak tebal:
$cekweekend = $row['tanggal'];
if (date('w', strtotime($cekweekend)) == 6 || date('w', strtotime($cekweekend)) == 0) {
echo '<td align="center"><b>'.$cekweekend.'</b></td>';
echo '<td align="center"><b>'.$row['masuk'].'</b></td>
<td align="center"><b>'.$row['keluar'].'</b></td>';
} else {
echo '<td align="center">'.$cekweekend.'</td>';
echo '<td align="center">'.$row['masuk'].'</td>
<td align="center">'.$row['keluar'].'</td>';
}
//Cek tanggal weekend (piket):
$cektanggal = $row['tanggal'];
if(date('w', strtotime($cektanggal)) == 6 || date('w', strtotime($cektanggal)) == 0) {
echo '<td align="center">Piket</td>';
} else {
echo '<td align="center"> </td>';
}
echo '</tr>';
$no++;
} //While Loop
echo '</table>';
echo '<small>Limitasi data '. $display.' hari</small>';
echo '</div>';
mysqli_free_result($r);
mysqli_close($dbc);
//exit();
} else {
echo '<p>Data tidak ditemukan/belum diinput. Hubungi Staf TI untuk perbaikan data.</p>';
echo '</div>';
}
} else {
//Cek error dan print:
if (!empty($errors) && is_array($errors)) {
echo '<div id="content"><h3><b><font color="red">Error!</font></b></h3>
<p><b><font color="red">Error input data:</font></b><br />';
foreach ($errors as $msg) {
echo "- $msg<br />\n";
}
echo 'Silahkan cek kembali input data!</p></div>';
}
} //$errors IF
}//Main IF
?>
<h3>Data Presensi per-Karyawan</h3>
<br />
<form action="presensi_individu.php" method="post">
<p><span>Nama</span>
<select name="idmm">
<option value="">Nama Karyawan</option>
<?php
//--> Skrip koneksi ke DB (include/require)
//Pilih nama dan ID dari DB:
$q = "SELECT karyawan_data_mm.idmm AS idmm, karyawan_data_pribadi.nama AS nama FROM karyawan_data_mm LEFT JOIN karyawan_data_pribadi USING (idmm) WHERE karyawan_data_mm.status_kerja='Aktif' ORDER BY karyawan_data_pribadi.nama ASC";
$r = mysqli_query($dbc, $q) or die ('query gagal');
if (mysqli_num_rows($r) > 0) {
while ($row = mysqli_fetch_array($r, MYSQLI_NUM)) {
echo "<option value=\"$row[0]\"";
if (isset($_POST['existing']) && ($_POST['existing'] == $row[0])) echo 'selected="selected"'; echo">$row[1]</option>\n";
}//Akhir dari while
} else {
echo "<option value=\"\">Pilih Nama</option>";
}
mysqli_close($dbc);
?>
</select>
</p>
<p><span>Periode Awal: </span>
<?php
//Menu dropdown php:
//Setup bulan
$bulan = array(1 => 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember');
//Setup tanggal dan tahun:
$tanggal = range(1, 31);
$tahun_awal = '2015'; //Tahun awal
$tahun_ini = date("Y") + 3; //Tahun aktif (saat ini) ditambah 3 tahun
$tahun = range($tahun_awal, $tahun_ini);
//Menu drop down tanggal:
echo '<select name="tanggal_awal">';
echo '<option value="">Tanggal</option>';
foreach ($tanggal as $value) {
echo "<option value=\"$value\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 3); //Jarak 3 spasi antar drop-down box.
//Menu drop-down bulan:
echo '<select name="bulan_awal">';
echo '<option value="">Bulan</option>';
foreach ($bulan as $key => $value) {
echo "<option value=\"$key\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 3);
//Menu drop-down Tahun:
echo '<select name="tahun_awal">';
echo '<option value="">Tahun</option>';
foreach ($tahun as $value) {
echo "<option value=\"$value\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 1);
echo '<small>Default pilih tanggal 11</small>';
?>
</p>
<p><span>Periode Akhir</span>
<?php
//Menu dropdown php:
//Setup bulan
$bulan = array(1 => 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember');
//Setup tanggal dan tahun:
$tanggal = range(1, 31);
$tahun_awal = '2015'; //tahun awal
$tahun_ini = date("Y") + 3; //Tahun aktif (saat ini) ditambah 3 tahun
$tahun = range($tahun_awal, $tahun_ini);
//Menu drop down tanggal:
echo '<select name="tanggal_akhir">';
echo '<option value="">Tanggal</option>';
foreach ($tanggal as $value) {
echo "<option value=\"$value\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 3); //Jarak 3 spasi antar drop-down box.
//Menu drop-down bulan:
echo '<select name="bulan_akhir">';
echo '<option value="">Bulan</option>';
foreach ($bulan as $key => $value) {
echo "<option value=\"$key\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 3);
//Menu drop-down Tahun:
echo '<select name="tahun_akhir">';
echo '<option value="">Tahun</option>';
foreach ($tahun as $value) {
echo "<option value=\"$value\">$value</option>\n";
}
echo '</select>';
echo str_repeat(' ', 1);
echo '<small>Default pilih tanggal 10</small>';
?>
</p>
<p><input type="submit" name="submit" value="Submit"/></p>
</form> - Hasil skrip diatas sebagai berikut:
Form Lembur Karyawan Hasil Pencarian Form Lembur - Pada contoh skrip query MySQL diatas untuk menampilkan data dari 2 tabel yaitu tabel presensi_tarik_data (disingkat pre) yang dihubungkan dengan tabel karyawan_data_pribadi (disingkat pribadi) menggunakan kolom 'idmm' dimana 'idmm' menjadi primary key (PK) di tabel pribadi dan foreign key (FK) di tabel pre. Berikut skrip MySQL-nya: "SELECT pre.idmm AS idmm, pribadi.nama AS nama, ... FROM presensi_tarik_data pre LEFT JOIN karyawan_data_pribadi pribadi ... " Dari tabel pribadi yang dibutuhkan adalah ID dan nama karyawan
- Berikutnya adalah mengambil tanggal presensi karyawan pada bagian skrip MySQL "DATE_FORMAT(pre.att, '%d-%b-%y') AS tanggal," dikarenakan pada kolom att (lihat gambar paling atas) dimana tanggal dan waktu digabung maka perlu dipisahkan
- Selanjutnya adalah query untuk menampilkan jam masuk pada bagian skrip "DATE_FORMAT(MIN(pre.att), '%H:%i') AS masuk," dan jam keluar "CASE WHEN MAX(pre.att)<>MIN(att) THEN DATE_FORMAT(MAX(pre.att), '%H:%i') END AS keluar" dimana dengan fungsi CASE WHEN untuk mengecek jam masuk & pulang harus berbeda pada tanggal yang sama (lihat pada gambar contoh tabel presensi)
- Dan pada query terakhir mengecek bahwa data yang ditampilkan harus berada diantara periode lembur yang sudah ditentukan di form "USING (idmm) WHERE pre.att >= '$periode_awal' AND pre.att <= '$periode_akhir' AND pre.idmm = '$idmm' GROUP BY pribadi.nama, DATE(pre.att) LIMIT $start, $display"
- Jika hari Sabtu/Minggu dianggap hari piket/lembur, maka skrip php dibawah ini akan mem-filter hari berdasarkan tanggal dari tabel (0-minggu, 6-sabtu) menggunakan fungsi strtotime
$cektanggal = $row['tanggal'];
if(date('w', strtotime($cektanggal)) == 6 || date('w', strtotime($cektanggal)) == 0) {
echo '<td align="center">Piket</td>';
} else {
echo '<td align="center"> </td>';
}
mas.. mau tanya.. mesin saya klo saat power mait, waktu d mesinnya kok gk update ya?
BalasHapuscontoh: listrik mati pukul 20:00, nyala kembali pukul 21:00.. tpi di mesin ketika listrik menyala kembali, dia menunjukkan waktu 20:00 (saat mati listrik). bisa dibantu?
Saya belum pernah mengalami hal diatas, perlu dicek apakah terdapat baterai cadangan (mungkin semacam baterai CMOS) di mesinnya. Jika ada tinggal diganti baterainya.
HapusGan bisa minta full script nya?
BalasHapusmas saya mau tanya untuk absensi, jika absensi di hostingkan agar bisa cek data online, mesin bisa menggunakan ip private saja atau mesin juga harus terhubung dengan ip public?
BalasHapusterima kasih mas
Menggunakan ip private saja lebih aman. Database yang menyimpan data absensinya bisa menggunaan IP publik
Hapusbisa kalau mau, saya ada program REALTIME data absensinya. Bisa dipasang di hosting syaratnya mesin harus ada fitur cloud/adms. Berminat?? hub 0813 48021 778 (WA)
Hapusmas untuk mesin fp x100-c ini dapat terhubung ke database yang kita buat sendiri itu bisa tidak ya ?
BalasHapusstrtotime
BalasHapusSaya punya program realtime tarik data absensi dengan fitur adms/cloud pada mesin. Kelebihannya adalah bisa dipasang di shared hosting maupun vps. Tidak membutuhkan soap dan scheduler (cron job) untuk tariknya, jadi bener2 realtime. Program saya memanfaatkan fitur ADMS/CLoud pada mesin absensinya seperti layaknya vendor-vendor mesin yang menyewakan cloud absensi dengan koneksi mesin ke server2 mereka. Program saya dari PHP dan MYSQL. Kelebihannya adalah bisa tarik realtime, upload sidik jari dari satu mesin ke mesin lainnya, upload user dan privilage user, hapus sidik jari, hapus transaksi, reboot, tarik informasi mesin dan lain2. Berminat?? hub 0813 48021 778 (WA)
BalasHapus