Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1
perhitungan cuti buat aplikasi cuti online
All master,
Saya lagi buat aplikasi cuti online, dengan deskripsi sbg berikut :
Karyawan < 1 Tahun ditahun 2014
Contoh : misal karyawan masuk bulan Agustus 2013 maka ditahun 2014 cutinya 12 hari + 5 hari tahun 2013 kebelakang (agustus,september,oktober,november,desember) = 17 Hari
Karyawan > 1 Tahun ditahun 2014 dapat cuti = 12 Hari
Mohon gambaran script untuk perhitungan cuti seperti diatas atau ada solusi dari teman2 yang pernah buat aplikasi cuti online
Terima kasih
Yan
Tagged:
Comments
table karyawan pan bisa elo buat field tanggal menjadi pegawai / tanggal mulai bekerja
bandingkan saja tanggal+bulan nya dengan tanggal+bulan saat ini / saat perhitungan
dapet dah < 1 tahun atau > 1 tahun
coba posting struktur table elo
lalu posting juga perkiraan query yg bakal elo pake
lalu bandingkan dengan NOW(), atau bandingkan dengan tanggal tertentu
kalo hasil DATE_ADD() lebih kecil, berarti lebih dari setahun
kalo hasil lebih besar, berarti kurang dari setahun
catatan aja buat elo kalo hitung manual : jumlah hari dalam setahun tidak selalu 365 hari
perintah SELECT elo kaya apa ?
table :
tb_master_karyawan
tb_master_divisi
tb_master_jabatan
tb_cuti_pusat
catatan : jangan posting image atau deskripsi table, gw ogah kalo mesti bikin manual
tapi, kalo gw asumsikan field "tahun" adalah lama berkerja pegawai
1 kalo lebih dari 1 tahun
0 kalo kurang
query ini cukup :
INSERT INTO tb_cuti_pusat (tahun,nik,jml_hari,sisa,periode)
SELECT IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1), a.nik, 0, 0, ""
FROM tb_master_karyawan a
LEFT JOIN tb_master_divisi b ON b.kd_divisi=a.kd_divisi
LEFT JOIN tb_master_jabatan c ON c.kd_jabatan=a.kd_jabatan
LEFT JOIN tb_cuti_pusat d ON a.nik=d.nik
WHERE
a.kd_lokasi IN('JKT1','JKT2')
AND kd_status NOT LIKE 'R'
AND d.id_cuti_pusat IS NULL
berhubung gw kagak paham maksud "tahun" dan "periode", kondisinya gw hapus
kagak ribet ngitung di script
dan kagak pake sub query
kagak perlu insert manual lewat script
yg gw bold, atur sendiri value nya
kalo "jml_hari" juga bersyarat, tiru saja cara buat isi "tahun"
kagak perlu ribet insert pake foreach
lha wong dari awal gw bilang pake DATE_ADD(), elo pake cara dihitung di script
gw bilang insert langsung dari select, ntah beneran elo pake atau kagak
tapi mysql menyediakan fungsi : PERIOD_DIFF()
SELECT PERIOD_DIFF("201401","201203")
hasil : 22
SELECT IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1), a.nik, 0, 0, ""
FROM tb_master_karyawan a
LEFT JOIN tb_master_divisi b ON b.kd_divisi=a.kd_divisi
LEFT JOIN tb_master_jabatan c ON c.kd_jabatan=a.kd_jabatan
LEFT JOIN tb_cuti_pusat d ON a.nik=d.nik
WHERE
a.kd_lokasi IN('JKT1','JKT2')
AND kd_status NOT LIKE 'R'
AND d.id_cuti_pusat IS NULL
kalo di insert, ke table apa ? field nya yg mana ?
SELECT IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1), a.nik, 0, 0, ""
elo define aja yg bener :
tb_cuti_pusat (tahun,nik,jml_hari,sisa,periode)
SELECT
IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1), --> ini bakal masuk field "tahun"
a.nik, --> ini masuk field "nik"
IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12), --> ini bakal masuk field "jml_hari"
0, --> ini masuk field "sisa"
"" --> ini masuk field "periode"
"tahun" isinya apa ?
"periode" isinya apa ?
"jml_hari" penentuan agustus berdasar apa ?
kalo dasar perhitungan tahun 2014
sebelum agustus 2013 = 12
agustus 2013 = 16
sesudah agustus 2013 = 17
apa PERIOD_DIFF() mau dipake utk menentukan ini ?
bagaimana kalo dasar perhitungan 2015 ?
lalu, perhitungan jumlah bulan mau dimasukan kemana ?
kagak ngerti gimana ?
itu pan cuma perintah select biasa
cuma, jika biasanya perintah select buat di tampilkan hasilnya
yg ini langsung di insert
kalo perintah insert, jumlah field yg disebut harus sama dengan jumlah value yg di insert
pan persis sama dengan yg gw contohin
elo bikin begini :
INSERT INTO tb_cuti_pusat( [1] tahun, [2] nik, [3] jml_hari, [4] periode)
VALUES(
[1] '$thn',
[2] '$nikku',
[3] '$hak',
[4] '$periode'
)
kalo langsung insert dari select :
INSERT INTO tb_cuti_pusat ( [1] tahun, [2] nik, [3] jml_hari, [4] sisa, [5] periode)
SELECT
[1] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1),
[2] a.nik,
[3] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12),
[4] 0,
[5] ""
sama saja kan ?
elo samain begini juga boleh kok ...
INSERT INTO tb_cuti_pusat( [1] tahun, [2] nik, [3] jml_hari, [4] periode)
SELECT
[1] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1),
[2] a.nik,
[3] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12),
[4] ""
kalo elo pake script
buntutnya semua tetep mesti elo hitung satu-satu sebelum elo insert
elo juga mesti ngitung "tahun"
ngitung "jml_hari"
ngitung "periode"
lha tinggal perhitungannya itu saja yg elo posting kemari
pan gw bisa baca
SELECT
[1] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1), // Nanti kalo pergantian tahun mesti ganti 2015-01-01 ?..
[2] a.nik,
[3] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12), // 16 sama 12 ini apa ya mas boo ?
[4] ""
lalu $total_hari dipake dimana ?
di insert elo yg gw baca :
$masuk=mysql_query("INSERT INTO tb_cuti_pusat(tahun,nik,jml_hari,sisa,periode)
VALUES('$thn','$nikku','$hak','$bulan','$periode')");
dengan :
$chk=$_POST['chk'];
$bulan=$_POST['bulan'];
$hak=$_POST['hak'];
$thn=$_POST['thn'];
$periode=$_POST['periode'];
dari POST ?
emang alur elo itu kaya apa to ?
data pegawai ditampilkan di form, lalu diisi manual, lalu submit, begitukah ?
[2]
"...
Tapi yang belum itu yang kurang dari 1 tahun karena berbeda2 jumlah bulannya tergantung masuknya
..."
lha iya, pan tetep bisa dikondisikan pake IF()
atau pake hitungan suatu rumus
itu ditulis kaya gini
IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12)
pan cuma ngasih elo contoh
bahwa mau di insert value 16 (hari) atau 12 (hari) itu bisa dikondisikan pake IF()
kalo gw liat, itu dari POST ? kiriman form ?
berarti manual ?
emang kagak bisa dihitung pake rumus atau kondisi IF() atau CASE() ?
[3]
masalah "2014-01-01"
emang gak bisa diganti pake :
IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>NOW(),16,12) ?
atau IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>CONCAT((YEAR(NOW())+1),"-01-01"),16,12) ?
itu pan terserah elo
pengisian jumlah cuti mau jalan tiap apa ?
apa mau dijalankan manual ?
atau mau otomatis jalan sendiri tiap akhir tahun ?
kalo pake script, mau kagak mau ya jalan manual,
lupa dijalankan ya table nya kagak ada isinya
kalo pun mau di otomatis kan, mesti numpang di scheduler
kalo pake query,
mysql punya event
elo kagak usah perintah pun, kalo event nya mysql elo jadwalkan jalan tiap akhir tahun pasti jalan sendiri
Kolom bulan brrisi jmlh bln(textfield).dan kolom nik (textfield). Semua data terseleksi semua .dan ada tombol tambh. Langsung submit.eksekusi dsimpan k tabel dengan itugan jumlh cutinya. seprti itu mas kura2..
Penambhan ini akn dlkukan pada awal tahun bru.
lha yg lebih dari setahun berarti kagak masuk ke tabel cuti ?
gw juga liat kondisi ini :
a.kd_lokasi IN('JKT1','JKT2')
kd_status NOT LIKE 'R'
apa itu berarti hanya lokasi tertentu yg masuk ke table cuti ?
dan dengan kondisi status tertentu ?
atau niat elo sebenernya semua pegawai masuk ke tabel cuti ?
tapi elo pisah2 prosesnya ?
jadi mesti lewat form-form tertentu utk entri ke tabel cuti ?
kok gw liat kagak efektif banget ...
napa kagak pake alur :
- pake event mysql, schedule jalan awal tahun (1/1/YYYY) atau akhir tahun (31/12/YYYY)
- otomatis yg jalan pasti query, bukan script
- query langsung insert seluruh pegawai ke tabel cuti, tanpa melihat wilayah atau status atau kapan mulai kerja
- jml_hari langsung dihitung otomatis berdasar waktu mulai kerja
tanpa ribet mesti lewat form-form dan submit
kalo elo pake alur ini, form elo jauh lebih mudah ...
isinya cuma :
- form isian pegawai baru masuk
- view pegawai dan jatah cuti yg tersisa, pencarian berdasar nik / nama
- form isian ijin cuti : nik, jumlah cuti yg akan diambil, alert kalo sisa cuti tidak mencukupi
- rekap laporan cuti tahunan, buat hitung bonus pegawai yg kagak ambil cuti
reply elo kagak nyambung ...
"karyawan masuk bulan Agustus 2013 maka ditahun 2014 cutinya 12 hari + 4 hari"
"Yg kurang dr 1thn blm bisa"
yg masuk bulan agustus 2013 pan berarti kurang dari 1 tahun
coba elo isi titik-titik ini dah, value nya apa saja :
semisal saat ini tanggal 31/Des/2013
mau insert jatah cuti utk tahun 2014
pegawai yg masuk Jan/2010, jatah cuti : ... hari
pegawai yg masuk Des/2010, jatah cuti : ... hari
pegawai yg masuk Feb/2011, jatah cuti : ... hari
pegawai yg masuk Des/2011, jatah cuti : ... hari
pegawai yg masuk Mar/2012, jatah cuti : ... hari
pegawai yg masuk Des/2012, jatah cuti : ... hari
pegawai yg masuk Jan/2013, jatah cuti : ... hari
pegawai yg masuk Feb/2013, jatah cuti : ... hari
pegawai yg masuk Mar/2013, jatah cuti : ... hari
pegawai yg masuk Apr/2013, jatah cuti : ... hari
pegawai yg masuk Mei/2013, jatah cuti : ... hari
pegawai yg masuk Jun/2013, jatah cuti : ... hari
pegawai yg masuk Jul/2013, jatah cuti : ... hari
pegawai yg masuk Agt/2013, jatah cuti : ... hari
pegawai yg masuk Sep/2013, jatah cuti : ... hari
pegawai yg masuk Okt/2013, jatah cuti : ... hari
pegawai yg masuk Nov/2013, jatah cuti : ... hari
pegawai yg masuk Des/2013, jatah cuti : ... hari
apakah jatah cuti itu berlaku utk semua wilayah (ya/tidak) ? ...
apakah jatah cuti itu berlaku utk semua status (ya/tidak) ? ...
apakah semua data cuti tsb masuk ke tb_cuti_pusat (ya/tidak) ? ...
field "tahun" tb_cuti_pusat isinya : ...
field "periode" tb_cuti_pusat isinya : ...
INSERT INTO tb_cuti_pusat (tahun,nik,jml_hari,sisa)
SELECT
YEAR(NOW())+1,
a.nik,
IF(
DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>CONCAT((YEAR(NOW())+1),"-01-01"),
12+PERIOD_DIFF(DATE_FORMAT(NOW(),"%Y12"),DATE_FORMAT(a.tgl_masuk,"%Y%m")),
12
),
0
FROM tb_master_karyawan a
LEFT JOIN tb_master_divisi b ON b.kd_divisi=a.kd_divisi
LEFT JOIN tb_master_jabatan c ON c.kd_jabatan=a.kd_jabatan
LEFT JOIN tb_cuti_pusat d ON a.nik=d.nik AND d.tahun=YEAR(NOW())+1
WHERE d.id_cuti_pusat IS NULL
sekali dijalankan, seluruh pegawai langsung terdefinisi jumlah hari cutinya utk tahun 2014
dan masuk ke tb_cuti_pusat
kalo dijalankan tgl 1/Jan/2014 atau sesudahnya, yg terisi tahun 2015
jalankan tiap akhir tahun
jadi langsung jalan otomatis
masalah sisa, elo ubah aja semau elo
pan sudah ada contohnya utk bikin jml_hari
SELECT
YEAR(NOW())+1,
a.nik,
IF(
DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>CONCAT((YEAR(NOW())+1),"-01-01"),
12+PERIOD_DIFF(DATE_FORMAT(NOW(),"%Y12"),DATE_FORMAT(a.tgl_masuk,"%Y%m")),
12),0
FROM tb_master_karyawan a
LEFT JOIN tb_master_divisi b ON b.kd_divisi=a.kd_divisi // bagian ini saya ilangin ajah ga maslh ya
LEFT JOIN tb_master_jabatan c ON c.kd_jabatan=a.kd_jabatan // bagian ini saya ilangin ajah ga maslh ya
LEFT JOIN tb_cuti_pusat d ON a.nik=d.nik AND d.tahun=YEAR(NOW())+1
WHERE d.id_cuti_pusat IS NULL
INSERT INTO tb_cuti_pusat ( [1] tahun, [2] nik, [3] jml_hari, [4] sisa, [5] periode)
SELECT
[1] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",0,1),
[2] a.nik,
[3] IF(DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>"2014-01-01",16,12),
[4] 0,
[5] ""
sama saja :
INSERT INTO tb_cuti_pusat ( [1] tahun, [2] nik, [3] jml_hari, [4] sisa )
SELECT
[1] YEAR(NOW())+1,
[2] a.nik,
[3] IF(
DATE_ADD(a.tgl_masuk, INTERVAL 1 YEAR)>CONCAT((YEAR(NOW())+1),"-01-01"),
12+PERIOD_DIFF(DATE_FORMAT(NOW(),"%Y12"),DATE_FORMAT(a.tgl_masuk,"%Y%m")),
12
),
[4] 0
ya elo ubah yg merujuk ke "sisa"
tinggal elo copas aja yg buat "jml_hari", pan isinya mau elo sama
JOIN yg mau elo hilangkan ...
YA, kagak masalah,
gw tulis karena merujuk ke JOIN elo sebelumnya