Selasa, 30 Agustus 2016

Membuat Monthly Attendance Report dengan PHP MySQL dan TCPDF


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,
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
tampilan sudah lebih baik,namun tetap belum dapat disebut report


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 document
$pdf = new TCPDF('L', PDF_UNIT, 'A3', true, 'UTF-8', false);
membuat pdf baru dengan ukuran A3 dan landscape (L)

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.

//isinya
$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>
melakukan looping untuk meng-generate isi table sesuai jumlah data hasil query

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.

5 komentar:

  1. mas yudha
    kok laporan_bulanan.php nya tidak bisa d download ?

    BalasHapus
    Balasan
    1. sudah saya perbaiki ya linknya, maaf baru dibalas komentarnya :'D

      Hapus
  2. Untuk nambahin count di samping gimana caranya broo...

    BalasHapus
  3. Terima kasih, sangat membantu sekali.

    BalasHapus

(C) 2018. Diberdayakan oleh Blogger.

Categories

Followers