Ditutorial ini, kita akan mempelajari bagaimana cara membuat Monthly Attendance Report atau Laporan Kehadiran Bulanan menggunakan PHP, MySQL dan TCPDF sebagai library nya agar laporan dibentuk menjadi file PDF.
Pastikan anda sudah mendownload library TCPDF terlebih dahulu :)
Saya menggunakan 2 table yaitu tabel pegawai (t_employee) dan tabel kehadiran (t_attendance),lebih jelasnya bisa dilihat gambar di bawah ini
t_employee
t_attendance
Jika anda ingin menggunakan sample data yang saya gunakan,dapat didownload di Google Drive saya.
Pertama
Kita menggunakan query biasa untuk menampilkan data sebagai berikut :
select a.nip_employee,
a.nama_employee,
b.in_masuk
from t_employee a
join t_attendance b
on a.id_employee = b.id_employee
maka data yang ditampilkan masih belum dapat disebut report :) , kita harus membalik row menjadi kolom (pivoting).
Kedua
Kita membutuhkan bantuan untuk membuat pivot, maka kita akan membuat view bernama v_monthly_report
note : karena query view sangat panjang, anda bisa mendownload di Google Drive
atau anda bisa mencoba menulis sendiri view nya seperti contoh berikut:
select a.nip_employee,tampilan sudah lebih baik,namun tetap belum dapat disebut report
a.nama_employee,
B.in_masuk as tanggal,
CASE WHEN DAY(B.in_masuk) = 1 then
CASE
WHEN b.note = 'MASUK' then 'P'
WHEN b.note = 'SAKIT' then 'S'
WHEN b.note = 'TIDAK MASUK' then 'X'
ELSE 'X'
END
END AS '1'
from t_employee a
join t_attendance b
on a.id_employee = b.id_employee
Ketiga
kita lakukan query berikutnya untuk groupping, gunakan juga group_concat pada setiap tanggal di view v_monthly_report.querynya sebagai berikut :
SELECT
A.nip_employee as nip,
A.nama_employee as nama,
group_concat(A.1) as '1',
group_concat(A.2) as '2',
group_concat(A.3) as '3',
group_concat(A.4) as '4',
group_concat(A.5) as '5',
group_concat(A.6) as '6',
group_concat(A.7) as '7',
group_concat(A.8) as '8',
group_concat(A.9) as '9',
group_concat(A.10) as '10',
group_concat(A.11) as '11',
group_concat(A.12) as '12',
group_concat(A.13) as '13',
group_concat(A.14) as '14',
group_concat(A.15) as '15',
group_concat(A.16) as '16',
group_concat(A.17) as '17',
group_concat(A.18) as '18',
group_concat(A.19) as '19',
group_concat(A.20) as '20',
group_concat(A.21) as '21',
group_concat(A.22) as '22',
group_concat(A.23) as '23',
group_concat(A.24) as '24',
group_concat(A.25) as '25',
group_concat(A.26) as '26',
group_concat(A.27) as '27',
group_concat(A.28) as '28',
group_concat(A.29) as '29',
group_concat(A.30) as '30',
group_concat(A.31) as '31'
from v_monthly_report as A
group by A.nip_employee
tampilan sudah seperti report :)
mungkin ada yang menyadari, di view dan query tersebut tanggal selalu sampai di tanggal 31, bagaimana dengan bulan lain yang hanya sampai tanggal 30 dan sebagainya kemudian bagaimana where clause nya jika data lebih dari 1 bulan ? jawabannya : kita akan melakukan nya di script PHP
ke-empat
pindahkan folder tcpdf ke htdocs tempat file *.php akan dibuat, pada contoh ini saya pindahkan folder tcpdf ke folder pdf yang satu folder dengan file *.php saya.
ke-lima
buat file php baru dengan nama laporan_bulanan.php di htdocs, untuk script nya bisa di download di laporan_bulanan.php
Hasilnya :
Penjelasan Script PHP
$bulan = '8';
$tahun = '2016';
$tgl = 1;
$jumtgl = cal_days_in_month(CAL_GREGORIAN, $bulan, $tahun); // dapat jumlah tanggal
variabel bulan dan tahun digunakan sebagai parameter, dicontoh dilakukan hard coded karena hanya contoh :) *absolutely . Sedangkan pada variabel jumtgl digunakan untuk mengkalkulasi atau menghitung jumlah tanggal pada suatu bulan ditahun tertentu, yang nantinya dipakai agar laporan bisa menyesuaikan jumlah tanggalnya
// create new PDF documentmembuat pdf baru dengan ukuran A3 dan landscape (L)
$pdf = new TCPDF('L', PDF_UNIT, 'A3', true, 'UTF-8', false);
WHERE MONTH(tanggal) = '".$bulan."' AND YEAR(tanggal) = '".$tahun."' group by A.nip_employee");field tanggal pada view digunakan sebagai where clause
//dinamis, sesuai tanggal pada bulan tsb
while($tgl <= $jumtgl) {
$tbl .= "<th><b>".$tgl."</b><th>";
$tgl++;
}
melakukan looping untuk meng-generate header table html sesuai jumlah tanggal yang didapatkan sebelumnya. jika jumlah tanggal hanya 28 pada suatu bulan, maka header yang ditampilkan hanya sampai tanggal 28.
//isinyamelakukan looping untuk meng-generate isi table sesuai jumlah data hasil query
$no = 1;
while ($isi = mysql_fetch_array($sql)) {
$tbl.=" <tr>
<td>".$no."</td>
<td>".$isi['nip']."</td>
<td valign='top' style='white-space:nowrap'>".$isi['nama']."</td>
<td>".$isi['1']."</td>
switch ($jumtgl) {
case 28:
melakukan kondisi pada jumlah tanggal tertentu, jika jumlah tanggal hanya 28 pada suatu bulan, maka isi yang ditampilkan hanya sampai tanggal 28.
$pdf->writeHTML($tbl, true, false, false, false, '');
$namaPDF = 'Laporan Bulanan Pegawai_'.$bulan.'_'.$tahun.'.pdf';
$pdf->Output($namaPDF,'I');
output file PDF
Laporan yang dihasilkan memang masih belum rapih dan sempurna, saya harap artikel ini dapat membantu pembaca sekalian.
Semoga Bermanfaat
referensi : https://tcpdf.org/examples/
http://www.dbatodba.com/db2/how-to-do/how-to-convert-columns-to-rows-and-rows-to-columns/
Artikel ini dibuat oleh Yudha Tri Putra sebagai penulis artikel, diperbolehkan menyalin artikel ini secara utuh tanpa mengubah atau menambah isi artikel.
mas yudha
BalasHapuskok laporan_bulanan.php nya tidak bisa d download ?
sudah saya perbaiki ya linknya, maaf baru dibalas komentarnya :'D
HapusUntuk nambahin count di samping gimana caranya broo...
BalasHapusmakasih mas ilmunya
BalasHapusTerima kasih, sangat membantu sekali.
BalasHapus