Implementasi Dan Perancangan Applikasi Penyusunan Jadwal Kerja Perawat Rumah Sakit

Gratis

6
55
117
2 years ago
Preview
Full text

  

IMPLEMENTASI DAN PERANCANGAN APLIKASI

PENYUSUNAN JADWAL KERJA PERAWAT RUMAH SAKIT

SKRIPSI

ADISTY AMELIA DAULAY

091402069

  

PROGRAM STUDI S1 TEKNOLOGI INFORMASI

FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI

UNIVERSITAS SUMATERA UTARA

MEDAN

2015

  

IMPLEMENTASI DAN PERANCANGAN APLIKASI

PENYUSUNAN JADWAL KERJA PERAWAT RUMAH SAKIT

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat memperoleh ijazah Sarjana Teknologi Informasi

  

ADISTY AMELIA DAULAY

091402069

PROGRAM STUDI S1 TEKNOLOGI INFORMASI

FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI

UNIVERSITAS SUMATERA UTARA

MEDAN

  

2015 ii PERSETUJUAN

  

Judul : IMPLEMENTASI DAN PERANCANGAN

APLIKASI PENYUSUNAN JADWAL KERJA

PERAWAT RUMAH SAKIT

Kategori : SKRIPSI

  Nama : ADISTY AMELIA DAULAY Nomor Induk Mahasiswa : 091402069 Program Studi : SARJANA (S1) TEKNOLOGI INFORMASI

Fakultas : ILMU KOMPUTER DAN TEKNOLOGI

  INFORMASI (FASILKOM-TI) UNIVERSITAS SUMATERA UTARA Diluluskan di Medan, Januari 2015

  Komisi Pembimbing : Pembimbing 2 Pembimbing 1 Dedy Arisandi, ST.,M.Kom M.AndriBudiman, ST.,M.Comp.Sc.,M.E.M NIP. 19790831 200912 1 002 NIP. 19751008 200801 1 011 Diketahui/Disetujui oleh Program Studi S1 Teknologi Informasi Ketua, M. Anggia Muchtar, ST, M.MI NIP. 19800 1 110200801 1 010 iii

PERNYATAAN

  

IMPLEMENTASI DAN PERANCANGAN APLIKASI PENYUSUNAN JADWAL

KERJA PERAWAT RUMAH SAKIT

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil kerja saya sendiri, kecuali beberapa

kutipan dan ringkasan yang masing-masing disebutkan sumbernya.

  Medan, Januari 2015 Adisty Amelia Daulay NIM: 091402069 iv

PENGHARGAAN

  Segala hormat, pujian dan syukur Penulis ucapkan kepada Tuhan Yang Maha

Esa yang senantiasa melimpahkan rahmat dan karunia-Nya sehingga skripsi ini dapat

diselesaikan, sebagai syarat untuk memperoleh gelar Sarjana Teknologi Informasi

pada Program Studi S1 Teknologi Informasi Universitas Sumatera Utara.

  Penulis ingin menyampaikan rasa hormat dan terima kasih yang sebesar– besarnya kepada :

  1. Bapak Prof. Dr. Dr. Syahril Pasaribu, DTM&H, Msc(CTM), Sp.A(K) selaku Rektor Universitas Sumatera Utara.

  2. Bapak Prof. Muhammad Zarlis selaku Dekan Fakultas Ilmu Komputer dan Teknologi Informasi Universitas Sumatera Utara.

  3. Bapak M. Anggia Muchtar, ST, M.MI selaku Ketua Program Studi S1 Teknologi Informasi Universitas Sumatera Utara.

  4. Bapak M. Fadly Syahputra, B.Sc.,M.Sc.IT selaku Sekretaris Program Studi S1 Teknologi Informasi Universitas Sumatera Utara.

  5. Bapak M. Andri Budiman, ST.,M.Comp.Sc.,M.E.M selaku Dosen Pembimbing I yang telah memberikan bimbingan, saran dan masukan kepada penulis dalam pengerjaan skripsi ini.

  6. Bapak Dedy Arisandi, ST.,M.Com selaku Dosen Pembimbing II yang telah memberikan bimbingan, saran dan masukan kepada penulis dalam pengerjaan skripsi ini.

  7. Bapak M. Fadly Syahputra, B.Sc.,M.Sc.IT selaku Dosen Pembanding I yang telah memberikan saran dan masukan kepada penulis dalam pengerjaan skripsi ini.

  8. Bapak Romi Fadilah Rahmat, B.Comp.Sc.,M.Sc selaku Dosen Pembanding II yang telah memberikan saran dan masukan kepada penulis dalam pengerjaan skripsi ini.

  9. Dalam kesempatan ini penulis mengucapkan terima kasih yang tidak terhingga kepada kedua orang tua yang sangat saya cintai, yaitu buat ayahanda H.Achyar Daulay, ibunda Hj.Elvida dan seluruh keluarga besar yang selalu memberikan doa, dukungan serta kasih sayang yang tak

henti-hentinya kepada penulis untuk menyelesaikan skripsi ini.

  10. Serta kepada saudara kandung penulis yaitu abang Reza Putrawan Daulay, SE.,MAP dan kakak Deby Putri Viana Daulay, S.Psi.,MM serta kawan seperjuangan saya, Syarah Sukmadria,STI, Hani Febrina Rasyad,STI, v 11.

  Delo Alman Tarigan,STI dan yang terkasih Aprizal Huswandi, SH yang selalu memberikan penulis semangat dalam menyelesaikan skripsi ini.

12. Teman-teman seperjuangan Stambuk 2009 di Fakultas Teknologi Informasi Universitas Sumatra Utara.

  13. Dan Semua pihak yang terlibat langsung ataupun tidak langsung yang tidak dapat penulis ucapkan satu per satu yang telah membantu penyelesaian skripsi ini. Penulis menyadari bahwa skripsi ini masih terdapat kekurangan. Oleh karena

itu, kepada pembaca agar kiranya memberikan kritik dan saran yang bersifat

membangun demi kesempurnaan skripsi ini. Sehingga dapat bermanfaat bagi kita

semuanya.

  Medan, Januari 2015 Penulis, ( Adisty Amelia Daulay ) vi

ABSTRAK

Selama ini penjadwalan yang dilakukan dirumah sakit masi berbentuk manual.

  

Perkembangan teknologi sudah sangat berkembang pesat. Dengan adanya bantuan

teknologi, semua pekerjaan yang sulit dapat dipermudah dengan menggunakan

berbagai aplikasi yang saat ini banyak diciptakan.Untuk itu akan dibentuk suatu

sistem komputasi yang dapat menggantikan cara manual dan menghasilkan yang lebih

bagus. Ada beberapa macam algoritma untuk melakukan penyusunan penjadwalan.

Beberapa algoritma itu antara lain adalah Algoritma Simulated Annealing, Algoritma , dan Algoritma Genetika. Serta masih banyak lagi Particle Swarm Optimazation

algortima yang lainnya untuk penjadwalan. Setiap algoritma ini memiliki ciri khas dan

kelebihan masing-masing dalam pengerjaannya. Untuk itu disini penulis mencoba menyajikan salah satu aplikasi penjadwalan perawat. Kata Kunci : aplikasi penjadwalan, penjadwalan perawat rumah sakit vii

THE IMPLEMENTATION AND DESIGN OF APPLICATION

PREPARATION OF HOSPITAL NURSES WORK SCHEDULE

ABSTRACT

  

During this time the scheduling in the hospital still shaped manually. The

development of technology has been developing very rapidly. With the help of

technology, all that hard work can be facilitated by using a variety of applications that

currently are created. For it would set up a computing system that can replace the

manual way and produce better. There are several kinds of scheduling algorithms to

do the preparation. Some algorithms that include Simulated Annealing Algorithm,

Particle Swarm Algorithm Optimazation, and Genetic Algorithms. And still many

other algorithms for scheduling. Each algorithm has its own characteristics and

advantages of each in the process. For that here the author tries to present one of the

nurse scheduling applications.

  Keywords : application scheduling, hospital nurse scheduling

  viii

DAFTAR ISI

  Halaman PERSETUJUAN .................................................................................................... ii PERNYATAAN .................................................................................................... iii

  ................................................................................ iv UCAPAN TERIMA KASIH

  ............................................................................................................. vi ABSTRAK ABSTRACT .......................................................................................................... vii

  ....................................................................................................... viii DAFTAR ISI

  ................................................................................................. xi DAFTAR TABEL DAFTAR GAMBAR ............................................................................................ xii

  Bab 1 PENDAHULUAN

1.1 Latar Belakang .......................................................................................

  1

1.2 Rumusan Masalah ..................................................................................

  2

1.3 Tujuan Penelitian ...................................................................................

  2

1.4 Manfaat Penelitian .................................................................................

  2

1.5 Batasan Masalah ....................................................................................

  2

1.6 Metodologi Penelitian ............................................................................

  2

1.7 Sistematika Penulisan ............................................................................

  3 Bab 2 LANDASAN TEORI

2.1 Penjadwalan ...........................................................................................

  5 2.1.1 Teknik-teknik dalam melakukan penjadwalan ............................

  5

  2.1.2 Hal-Hal yang Harus Diperhatikan dalam Melakukan Penjadwalan .................................................................................

  6 2.1.3 Implikasi Strategi Penjadwalan ....................................................

  6 2.1.4 Keputusan-Keputusan dalam Penjadwalan ..................................

  7 2.1.5 Algoritma Genetika ......................................................................

  8

  ix 2.1.6 Algoritma Simulated Annealing ..................................................

  23 3.3.3 General Architecture ..................................................................

  31 4.1.2 Tampilan-Tampilan Desain Penjadwalan Rumah Sakit ............

  

4.1.1 Spesifikasi Perangkat Keras dan Perangkat Lunak yang

Digunakan ..................................................................................

  31

  28 Bab 4 IMPLEMENTASI DAN PENGUJIAN

4.1 Implementasi Sistem ............................................................................

  27 3.4.6 Rancangan Tampilan Halaman Data Jadwal Jaga Perawat .......

  27 3.4.5 Rancangan Tampilan Halaman Jadwal ......................................

  26 3.4.4 Rancangan Tampilan Halaman Perawat ....................................

  25 3.4.3 Rancangan Tampilan Halaman Ruangan ...................................

  25 3.4.2 Rancangan Tampilan Halaman Menu Shift pada Aplikasi ........

  25 3.4.1 Rancangan Tampilan Halaman Utama Aplikasi ........................

  24

3.4 Perancangan Tampilan Antarmuka ......................................................

  22 3.3.2 Penjelasan Use case ..................................................................

  9 2.1.7 Algoritma Particle Swarm Optimazation ...................................

  22 3.3.1 Diagram Use case .......................................................................

  21

3.3 Perancangan Sistem .............................................................................

  20 3.2.3 Proses Penyesuaian ....................................................................

  19 3.2.2 Proses Penjadwalan ....................................................................

  18 3.2.1 Proses Pengalokasian Pada Proses Penjadwalan .......................

  18

3.2 Analisis Sistem .....................................................................................

  3.1.4 Data Jumlah Karyawan atau Staff Rumah Sakit Berdasarkan Absen ....................................................................

  17

  17 3.1.3 Data Ruangan Perawat/Karyawan Rumah Sakit ........................

  16 3.1.2 Data Penjadwalan Perawat/Karyawan Rumah Sakit .................

  16 3.1.1 Data Identitas Perawat/Karyawan Rumah Sakit ........................

  10 Bab 3 ANALISIS DAN PERANCANGAN

3.1 Analisis Data ........................................................................................

  32

  x

4.2 Hasil Pengujian Sistem ........................................................................

  38 Bab 5 KESIMPULAN DAN SARAN

5.1 Kesimpulan ..........................................................................................

  39

5.2 Saran ....................................................................................................

  39 ...........................................................................................

  40 DAFTAR PUSTAKA LAMPIRAN

  xi

DAFTAR TABEL

  

No Tabel Judul Halaman

Tabel 3.1 Volume kendaraan pada persimpangan ......................................

  21 Tabel 3.2 Tabel menentukan kategori durasi waktu ...................................

  32 Tabel 3.3 Tabel menentukan persilangan kemungkinan ............................

  33 Tabel 3.4 Tabel menentukan kategori lama waktu dengan koefisien ........

  33 Tabel 3.5 Tabel menentukan kategori serupa dengan koefisien terbesar ...

  34 Tabel 3.6 Tabel Disjungsi ..........................................................................

  34 Tabel 4.1 Penjelasan diagram case .............................................................

  37 Tabel 4.2 Hasil Uji Analisis Sistem ...........................................................

  51

  xii

DAFTAR GAMBAR

  28 3.12 Rancangan Halalamn Jadwal Perawat ............................

  36 4.6 Tampilan Beberapa Sampel Jadwal ...............................

  35 4.5 Tampilan Pratinjau Pada Jadwal Perawat ......................

  34 4.4 Tampilan Cetak Jadwal ..................................................

  33 4.3 Tampilan Pemintaan Cuti Perawat .................................

  32 4.2 Tampilan Data Para Perawat ..........................................

  4.1 Tampilan Simulasi Ketika Program Belum Dijalankan ......................................................................

  30

  29 3.13 Rancangan Halaman Data Jadwal Perawat ....................

  27 3.11 Rancangan Halaman Perawat .........................................

  

Nomor Gambar Nama Gambar Halaman

3.1 Flowchart Sistem ............................................................

  26 3.10 Rancangan Halaman Ruangan ........................................

  25 3.9 Rancangan Halaman Shift ..............................................

  24 3.8 Rancangan Halaman Utama ...........................................

  23 3.7 General Architecture ......................................................

  22 3.6 Diagram Use Case ..........................................................

  21 3.5 Flowchart Proses Penyesuaian Jadwal ...........................

  20 3.4 Flowchart Proses Penjadwalan Perawat .........................

  19 3.3 Flowchart Proses Alokasi Penjadwalan .........................

  18 3.2 Flowchart Algoritma Genetika .......................................

  37

  vi

ABSTRAK

Selama ini penjadwalan yang dilakukan dirumah sakit masi berbentuk manual.

  

Perkembangan teknologi sudah sangat berkembang pesat. Dengan adanya bantuan

teknologi, semua pekerjaan yang sulit dapat dipermudah dengan menggunakan

berbagai aplikasi yang saat ini banyak diciptakan.Untuk itu akan dibentuk suatu

sistem komputasi yang dapat menggantikan cara manual dan menghasilkan yang lebih

bagus. Ada beberapa macam algoritma untuk melakukan penyusunan penjadwalan.

Beberapa algoritma itu antara lain adalah Algoritma Simulated Annealing, Algoritma , dan Algoritma Genetika. Serta masih banyak lagi Particle Swarm Optimazation

algortima yang lainnya untuk penjadwalan. Setiap algoritma ini memiliki ciri khas dan

kelebihan masing-masing dalam pengerjaannya. Untuk itu disini penulis mencoba menyajikan salah satu aplikasi penjadwalan perawat. Kata Kunci : aplikasi penjadwalan, penjadwalan perawat rumah sakit vii

THE IMPLEMENTATION AND DESIGN OF APPLICATION

PREPARATION OF HOSPITAL NURSES WORK SCHEDULE

ABSTRACT

  

During this time the scheduling in the hospital still shaped manually. The

development of technology has been developing very rapidly. With the help of

technology, all that hard work can be facilitated by using a variety of applications that

currently are created. For it would set up a computing system that can replace the

manual way and produce better. There are several kinds of scheduling algorithms to

do the preparation. Some algorithms that include Simulated Annealing Algorithm,

Particle Swarm Algorithm Optimazation, and Genetic Algorithms. And still many

other algorithms for scheduling. Each algorithm has its own characteristics and

advantages of each in the process. For that here the author tries to present one of the

nurse scheduling applications.

  Keywords : application scheduling, hospital nurse scheduling

BAB 1 PENDAHULUAN

1.1 Latar Belakang

  

Sebuah rumah sakit merupakan aspek penting dalam kehidupan sehari-hari. Rumah

sakit yang baik adalah dengan memiliki struktur kerja yang diatur seefesien mungkin.

Seperti penjadwalan pada karyawan yang jelas dan terarah. Dalam manajemen yang

memiliki konsep untuk terus meningkatkan kualitas pelayanan dan kinerja yang telah

diatur. Untuk itu harus diupayakan alat bantu untuk menyusun jadwal kerja berbasis

teknologi informasi.

  Selama ini penjadwalan yang dilakukan dirumah sakit masih berbentuk

manual. Perkembangan teknologi sudah sangat berkembang pesat. Dengan adanya

bantuan teknologi, semua pekerjaan yang sulit dapat dipermudah dengan

menggunakan berbagai aplikasi yang saat ini banyak diciptakan. Untuk itu akan

dibentuk suatu sistem komputasi yang dapat menggantikan cara manual dan

menghasilkan yang lebih bagus.

  Ada beberapa macam algoritma untuk melakukan penyusunan penjadwalan.

Beberapa algoritma itu antara lain adalah Algoritma Simulated Annealing, Algoritma

, dan Algoritma Genetika. Serta masih banyak lagi Particle Swarm Optimazation

algoritma yang lainnya untuk penjadwalan. Setiap algoritma ini memiliki ciri khas dan

kelebihan masing-masing dalam pengerjaannya.

  Beberapa penelitian yang pernah dilakukan untuk penjadwalan antara lain

adalah Aplikasi algoritma genetika untuk optimasi penjadwalan kegiatan belajar

mengajar (Nugraha, 2008) dan Penjadwalan produksi dengan menggunakan algoritma

(Santoso et.al. 2012). Dan dengan adanya aplikasi penjadwalan simulated annealing

ini diharapkan dapat memudahkan penyusunan jadwal pekerja dan dapat membantu

mereka untuk mengimplementasikannya.

  2

  1.2 Rumusan Masalah Bagaimana merancang aplikasi untuk menyusun jadwal tugas perawat rumah sakit.

  1.3 Tujuan Penelitian

Adapun tujuan dari penulisan tugas akhir ini adalah untuk menghasilkan aplikasi

penjadwalan rumah sakit yang mudah.

  1.4 Manfaat Penelitian

Adapun manfaat dari penulisan tugas akhir ini adalah agar aplikasi ini dapat

digunakan untuk menyusun manajemen penjadwalan yang dapat dilakukan lebih

mudah dan memiliki adaptasi terbaik bagi kondisi rumah sakit.

  1.5 Batasan Masalah Pada tugas akhir ini dilakukan beberapa batasan masalah sebagai berikut : 1.

  Aplikasi ini hanya untuk perawat dalam suatu rumah sakit saja.

  2. Populasi awal maksimal 3.

  3. Shift yang diberikan oleh rumah sakit adalah shift pagi, shift siang dan shift malam.

  4. Aplikasi ini berlaku untuk satu rumah sakit.

1.6 Metode Penelitian

  Metode penelitian yang akan digunakan adalah: 1.

  Studi Literatur Pada tahap ini dilakukan dengan membaca dan mempelajari buku-buku referensi, jurnal atau sumber-sumber lain yang berkaitan dengan tugas akhir ini, baik berasal dari buku maupun dari internet.

  2. Perancangan Desain Sistem Pada tahap ini dilakukan perancangan aplikasi mengenai tugas akhir ini, seperti: menggambar flowchart, perancangan aplikasi, dan perancangan antarmuka (interface) menu-menu yang terdapat pada aplikasi.

  3 3.

  Implementasi Sistem Pada tahap ini akan dilakukan pengkodean dan menerapkan perancangan aplikasi tersebut ke dalam bahasa pemrograman java android.

  4. Pengujian Sistem Pada tahap ini akan dilakukan pengujian terhadap aplikasi apakah telah memenuhi kriteria atau tidak.

  5. Dokumentasi Sistem Pada tahap ini akan dilakukan penulisan laporan mengenai aplikasi tersebut yang bertujuan untuk menunjukkan hasil penelitian ini.

1.7 Sistematika Penulisan

  Sistematika penulisan skripsi ini dibagi menjadi lima bab yaitu:

  BAB 1 : Pendahuluan Bab ini berisikan konsep dasar untuk penyusunan skripsi. BAB 2 : Landasan Teori Pada bab ini dibahas mengenai beberapa teori yang mendukung pembahasan pada bab selanjutnya. BAB 3 : Analisis dan Perancangan Pada bab ini dibahas mengenai permasalahan dalam pembuatan aplikasi, penjelasan

tentang rancangan struktur aplikasi, dan perancangan interface dari aplikasi yang akan

dibuat.

  BAB 4 : Implementasi dan Pengujian Pada bab ini dibahas implementasi dari aplikasi yang akan dibuat. Berisikan gambaran dari perangkat lunak yang akan dibuat. Setelahnya dilakukan pengujian interface untuk melihat aplikasi yang dibuat berhasil dijalankan atau tidak.

  BAB 5 : Kesimpulan dan Saran Bab ini berisi tentang kesimpulan dan saran yang diharapkan dapat bermanfaat untuk penelitian selanjutnya.

BAB 2 LANDASAN TEORI Bab ini akan membahas tentang teori dan konsep dasar yang mendukung pembangunan dari aplikasi yang dibuat.

2.1 Penjadwalan

  

Penjadwalan adalah pengaturan waktu dari suatu kegiatan operasi, mencakup kegiatan

mengalokasi fasilitas, peralatan dan tenaga kerja bagi suatu kegiatan operasi serta

menentukan urutan pelaksanaan kegiatan operasi. Penjadwalan atau scheduling juga

merupakan salah satu kegiatan penting dalam menjalankan suatu perusahaan atau

instansi yang diperlukan dalam mengalokasikan tenaga operator, mesin dan peralatan

produksi, urutan proses, jenis produk dan sebabgainya. Umumnya disusun dengan

mempertimbangkan berbagai batasan, misalnya meminimalkan waktu proses, waktu

tunggu langganan, tingkat persediaaan serta penggunaaan yang efisien dari fasilitas,

personel dan peralatan (Taufik, 2013).

  Penjadwalan pada prinsipnya terjadi baik untuk periode yang panjang (misalnya

tahunan) ataupun periode yang lebih pendek (misalnya harian atau periode jam).

Penjadwalan yang dimaksudkan di sini adalah penjadwalan jangka pendek karena

penjadwalan jangka panjang biasanya dibahas dengan pendekatan lain seperti

manajemen projek. Kalau pun penjadwalan jangka panjang tadi bukan bersifat projek,

yaitu seperti kegiatan rutin tahunan, maka pendekatan penjadwalan jangka pendek ini

pun dapat kita terapkan pada kasus tersebut (Mursyid, 2010).

2.1.1 Teknik-Teknik dalam Melakukan Penjadwalan

  Ada dua jenis penjadwalan secara umum yaitu (Taufik, 2013) : a.

  Penjadwalan Maju (Forward Scheduling) Pekerjaan dimulai sedini mungkin sehingga pekerjaaan selesai sebelum batas waktu yang dijanjikan

  5 b.

  (due date). Konsekuensinya adalah terjadinya akumulasi persediaaan

sampai pekerjaan tersebut diperlukan pada pusat kerja berikutnya.

  c.

  Penjadwalan Mundur (Backward Scheduling) Kegiatan operasi yang terakhir dijadwalkan lebih dulu, yang selanjutnya secara berturut-turut ditentukan jadwal untuk kegiatan sebelumnya satu per satu secara mundur.Konsekuensi dapat meminimalkan persediaaan karena baru selesai pada saat pekerjaan tersebut diperlukan pada stasiun kerja berikutnya. Catatan: harus disertai dengan perencanaan dan estimasi waktu tenggang yang akurat, tidak terjadi break down selama proses maupun perubahan due date yang lebih cepat.

  2.1.2 Hal-Hal yang Harus Diperhatikan dalam Melakukan Penjadwalan

Ada beberapa hal penting yang sifatnya strategis dapat kita raih jika melakukan

penjadwalan dengan baik (Mursyid, 2010) : a.

  Penjadwalan yang baik membuat organisasi dapat menggunakan aset atau sumber dayanya dengan lebih efisien dan berefek positif juga pada pencapaian tujuannya.

  b.

  Kapasitas yang fleksibel dalam memenuhi kebutuhan pelanggan.

  c.

  Kepastian dalam melaksanakan penjadawalan yang akan dibuat.

  2.1.3 Implikasi Strategi Penjadwalan Ada 4 macam implikasi dalam strategi penjadwalan (Taufik, 2013), yaitu: a.

  Dengan penjadwalan yang baik, penggunaan aset perusahaan menjadi lebih efektif sehingga biaya menjadi rendah.

  b.

  Penggunaan kapasitas menjadi bertambah karena perputaran aktiva menjadi lebih besar.

  c.

  Pelayanan pelanggan (customer service) menjadi lebih baik.

  d.

  Mendapatkan keunggulan kompetitif.

  2.1.4 Keputusan-Keputusan dalam Penjadwalan

Setiap organisasi yang menjadi objek penelitian selalu memiliki keputusan dalam

penjadwalan. Ini berfungsi sebagai objek kajian dalam sistem pendukung keputusan

  6 nantinya menentukan rancangan penelitian. Perhatikan tabel dibawah ini, contoh- contoh organisasi beserta keputusannya.

Tabel 2.1 Keputusan dalam Penjadwalan

  Organisasi Keputusan Dalam Penjadwalan Rumah Sakit Ruang operasi, Perawat, Security, Pasien Rawat Jalan Universitas Ruang kelas,Alat Audiovisual, Penjadwalan Dosen dan

  Mahasiswa, Jadwal Kursus Pabrik Produksi, Pembelian Bahan, Gaji Café Cheef, Bartender, Pelayan, Entertainer Bandara Udara Jadwal Penerbangan

2.2 Algoritma Genetika

  

Algoritma ini ditemukan di Universitas Michigan, Amerika Serikat oleh John Holland

(1975) melalui sebuah penelitian dan dipopulerkan oleh salah satu muridnya, David

Goldberg. Algoritma genetik adalah algoritma yang berusaha menerapkan

pemahaman mengenai evolusi alamiah pada tugas-tugas pemecahan-masalah

(problem solving). Pendekatan yang diambil oleh algoritma ini adalah dengan

menggabungkan secara acak berbagai pilihan solusi terbaik di dalam suatu kumpulan

untuk mendapatkan generasi solusi terbaik berikutnya yaitu pada suatu kondisi yang

memaksimalkan kecocokannya atau lazim disebut fitness. Generasi ini akan

merepresentasikan perbaikanperbaikan pada populasi awalnya. Dengan melakukan

proses ini secara berulang, algoritma ini diharapkan dapat mensimulasikan proses

evolusioner (Ivan, 2008). Algoritma genetika merupakan algoritma pencarian yang

menerapkan proses seleksi alam dan evolusi yang dikemukakan oleh Charles Darwin.

Algoritma genetika pertama kali diperkenalkan oleh John Holland (1975) dari

Universitas Michigan. John Holland menyatakan bahwa setiap masalah yang

berbentuk adaptasi (alami maupun buatan) dapat diformulasikan kedalam terminologi

genetika (Saraswat & Prayanthi, 2012).

  7 Algoritma genetik bukanlah solusi terbaik untuk memecahkan segala masalah.

  

Sebagai contoh, metode tradisional telah diatur untuk untuk mencari penyelesaian dari

fungsi analitis convex yang “berperilaku baik” yang variabelnya sedikit. Pada kasus-

kasus ini, metode berbasis kalkulus lebih unggul dari algoritma genetik karena metode

ini dengan cepat menemukan solusi minimum ketika algoritma genetik masih

menganalisa bobot dari populasi awal. Untuk problemproblem ini pengguna harus

mengakui fakta dari pengalaman ini dan memakai metode tradisional yang lebih cepat

tersebut. Akan tetapi, banyak persoalan realistis yang berada di luar golongan ini.

Selain itu, untuk persoalan yang tidak terlalu rumit, banyak cara yang lebih cepat dari

algoritma genetik (Ivan, 2008).

  Sifat algoritma genetika adalah mencari kemungkinan-kemungkinan dari

kandidat solusi untuk mendapatkan yang optimal untuk penyelesaian masalah. Ruang

cakupan dari semua solusi yang layak (feasible), yaitu objek-objek diantara solusi

yang sesuai, dinamakan ruang pencarian (search space). Tiap titik dalam ruang

pencarian mempresentasikan satu solusi yang layak. Tiap solusi yang layak dapat

ditandai dengan nilai fitness-nya bagi masalah. Algoritma genetika bekerja dari

populasi yang merupakan himpunan solusi yang dihasilkan secara acak. Setiap

anggota himpunan yang merepresentasikan satu solusi masalah. Suatu solusi masalah

berevolusi dalam iterasi yang dinamakan generasi, tiap solusi masalah dievaluasi

berdasarkan fungsi evaluasi (fitness function). Pada algoritma genetika, fitness

biasanya dapat berupa fungsi objektif dari masalah yang akan dioptimalisasi (Saraswat

& Prayanthi, 2012).

2.2.1 Teknik-Teknik dalam Algortima Genetik

  Ada 4 teknik yang dapat dilihat dalam Speech Recognition (Ivan, 2008) yaitu : a.

   Fitness Function Setiap individual dievaluasi dengan fitness function. Sebuah fitness function mengembalikan nilai tertinggi untuk individual yang terbaik.

  Individu akan diurutkan berdasarkan nilai atau disebut dengan selection.

  8 b.

   Crossover

Untuk setiap pasang induk, sebuah titik crossover akan dipilih secara

random dari posisi dalam string. Pada gambar titik crossover terletak pada indeks ketiga dalam pasangan pertama dan setelah indeks kelima pada pasangan kedua.

  c.

  Mutasi Pada mutasi, tiap lokasi menjadi sasaran mutasi acak, dengan probabilitas independen yang kecil. Sebuah digit dimutasikan pada anak pertama, ketiga, dan keempat. Algoritma genetika mengkombinasikan suatu kecenderungan menaik dengan pengeksplorasian acak diantara thread pencarian paralel. Keuntungan secara matematis dapat tunjukkan bahwa bila posisi dari kode genetik di permutasikan di awal dengan urutan acak, tidak memberikan keunggulan. Secara intuisi, keuntungannya crossover didapat dari kemampuan crossover untuk menggabungkan blok-blok huruf berukuran besar yang telah berevolusi secara independen untuk melakukan fungsi yang bermanfaat sehingga dapat menaikkan tingkat granularity di mana pencarian dilakukan.

  Metode dan tipe mutasi yang dilakukan juga tergantung pada dan permasalahan yang diangkat. Berdasarkan encodingnya encoding terdapat beberapa macam, diantaranya adalah sebagai berikut (Ihsania, 2010) :

1. Binary Encoding

  Melakukan inversi pada bit yang terpilih, 0 menjadi 1 dan sebaliknya, 1 menjadi 0. Contoh : 1 1 001001 => 1 001001 2.

   Permutation Encoding Memilih dua nilai dari gen dan menukarnya.

  Contoh : ( 1 2 3 4 5 8 9 7 ) => ( 1 8 3 4 5 6 2 9 7 ) Beberapa operator mutasi telah diciptakan untuk representasi permutasi, seperti metode inversion, insertion, displacement, dan reciprocal exchange mutation (Ihsania, 2010).

  9 a.

   Inversion Mutation Inversion mutation memilih dua posisi dalam sebuah kromosom dengan cara acak dan kemudian menginversikan substring di antara dua posisi tersebut.

  b.

   Insertion Mutation Insertion Mutation memilih sebuah gen dengan cara acak dan memasukkan ke dalam kromosom dengan cara acak pula.

  c.

   Dsisplacement Mutation memilih sebuah sub/sekelompok

  Displacement Mutation gen dengan cara acak kemudian memasukkan ke dalam kromosom dengan cara acak.

  d.

   Reciprocal Exchange Mutation (REM) memilih dua posisi secara

  Reciprocal Exchange Mutation acak, kemudian menukar dua gen dalam posisi tersebut.

3. Value Encoding

  Menentukan sebuah nilai kecil yang akan ditambahkan atau dikurangkan pada salah satu gen dalam kromosom. Contoh : ( 1.29 5.68 5.55 ) => ( 1.29 5.68 5.55)

  2.86 4.11 2.73 4.22 4.

   Tree Encoding Node yang terpilih akan diubah.

  d.

   Schema

Teori dari algoritma genetik menjelaskan cara kerjanya menggunakan ide

dari suatu schema, suatu substring di mana beberapa posisi tidak

disebutkan. Dapat ditunjukkan bahwa, bila fitness rata-rata dari schema

berada di bawah mean maka jumlah instansiasi dari schema di dalam

populasi akan bertambah seiring bertambaahnya waktu. Jelas sekali bahwa

efek ini tidak akan signifikan bila bit-bit yang bersebelahan sama sekali

tidak berhubungan satu sama sekali, karena akan ada beberapa blok

  10 kontigu yang memberikan keuntungan yang konsisten. Algoritma genetik paling efektif dipakai bila schema-schema berkorespondensi menjadi komponen berati dari sebuah solusi. Sebagai contoh, bila string adalah representasi dari sebuah antena, maka schema merepresentasikan komponen-komponen dari antena, seperti reflector dan deflector. Sebuah komponen yang baik cenderung akan berkerja baik pada rancangan yang berbeda. Ini menunjukkan bahwa penggunaan algoritma genetik yang benar memerlukan rekayasa yang baik pada representasinya.

2.2.2 Contoh-contoh Pengaplikasian Algoritma Genetik

  

Algoritma genetika sudah banyak diaplikasikan untuk penyelesaian masalah dan

pemodelan dalam bidang teknologi, bisnis, dan entertainment (Ihsania, 2010), seperti :

a.

  Optimasi Algoritma genetika untuk optimasi numerik dan optimasi kombinatorial seperti Traveling Salesman Problem (TSP), perancangan Integrated circuit atau IC, optimasi video dan suara.

  b.

  Pemrograman Otomatis Algoritma genetika telah digunakan untuk melakukan proses evolusi terhadap program komputer untuk merancang struktur komputasiona, seperti cellular automata dan sorting network.

  c.

   Machine Learning Algoritma genetika telah berhasil diaplikasikan untuk memprediksi struktur protein, dan berhasil diaplikasikan dalam perancangan neural networks (jaringan syaraf tiruan) untuk melakukan proses evolusi terhadap aturan-aturan pada learning classifier system atau symbolic production system , juga digunakan untuk mengontrol robot.

  d.

  Model Ekonomi Algoritma genetika telah digunakan untuk memodelkan proses-proses inovasi dan pembangunan bidding strategies.

  11 e.

  Model Sistem Imunisasi Algoritma genetika telah berhasil digunakan untuk memodelkan berbagai aspek pada sistem imunisasi alamiah, termasuk somatic mutation selama kehidupan individu dan menemukan keluarga dengan gen ganda (multi- gene families ) sepanjang waktu evolusi.

  f.

  Model Ekologis Algoritma genetika berhasil digunakan untuk memodelkan fenomena ekologis seperti host-parasite co-evolutions, simbiosis, dan aliran sumber daya dalam ekologi.

2.2.3 Masalah-masalah yang Bisa Diselesaikan dengan Algoritma Genetik

  

Algoritma genetika sangat berguna dan efisien untuk masalah-masalah dengan

karakteristik sebagai berikut (Ihsania, 2010) : a.

  Ruang masalah sangat besar, kompleks, dan sulit dipahami.

  b.

  Kurang atau bahkan tidak ada pengetahuan yang memadai untuk merepresentasikan masalah ke dalam ruang pencarian yang lebih sempit.

  c.

  Tidak tersedianya analisis matematika yang memadai.

  d.

  Ketika metode-metode konvensional sudah tidak mampu meyelesaikan masalah yang dihadapi.

  e.

  Solusi yang diharapkan tidak harus paling optimal, tetapi cukup bagus atau bisa diterima.

  f.

  Terdapat batasan waktu, misalnya real time system atau sistem waktu nyata.

2.3 Algoritma Simulated Annealing

  Algoritma Simulated Annealing adalah sebagai berikut :

  1. Evaluasi keadaan awal. Jika keadaan awal merupakan tujuan, maka pencarian berhasil dan KELUAR. Jika tidak demikian, lanjutkan dengan menetapkan keadaan awal sebagai kondisi sekarang.

  2. Inisialisasi BEST_SO_FAR untuk keadaan sekarang.

  3. Inisialisasi T sesuai dengan annealing schedule.

  12

4. Kerjakan hingga solusi ditemukan atau sudah tidak ada operator baru lagi akan diaplikasikan ke kondisi sekarang.

  a. Gunakan operator yang belum pernah digunakan tersebut untuk menghasilkan kondisi baru.

  b. Evaluasi kondisi yang baru dengan menghitung: ΔE = nilai sekarang – nilai keadaan baru.

i. Jika kondisi baru merupakan tujuan, maka pencarian berhasil dan KELUAR.

  ii. Jika bukan tujuan, namun memiliki nilai yang lebih baik daripada kondisi sekarang, maka tetapkan kondisi baru sebagai kondisi sekarang. Demikian pula tetapkan BEST_SO_FAR untuk kondisi yang baru tadi. D-23 iii. Jika nilai kondisi baru tidak lebih baik dari kondisi sekarang, maka tetapkan kondisi baru sebagai kondisi sekarang dengan probabilitas: p' = e

  −ΔE / T Langkah ini biasanya dikerjakan dengan membangkitkan suatu bilangan random r pada range [0 1]. Jika r < p’, maka perubahan kondisi baru menjadi kondisi sekarang diperbolehkan. Namun jika tidak demikian, maka tidak akan dikerjakan apapun.

2.3.1 Konsep Dasar Simulated Annealing

  

Ide dasar simulated annealing terbentuk dari pemrosesan logam . Annealing

(memanaskan kemudian mendinginkan) dalam pemrosesan logam ini adalah suatu

proses bagaimana membuat bentuk cair berangsur-angsur menjadi bentuk yang lebih

padat seiring dengan penurunan temperatur. Simulated annealing biasanya digunakan

untuk penyelesaian masalah yang mana perubahan keadaan dari suatu kondisi ke

kondisi yang lainnya membutuhkan ruang yang sangat luas, misalkan perubahan

gerakan dengan menggunakan permutasi pada masalah Travelling Salesman Problem.

Pada simulated annealing, ada 3 parameter yang sangat menentukan, yaitu: tetangga,

gain, temperatur, pembangkitan bilangan random. Tetangga akan sangat berperan

dalam membentuk perubahan pada solusi sekarang. Pembangkitan bilangan random

akan berimplikasi adanya probabilitas.

  13

2.4 Algoritma Particle Swarm Optimazation

  

Particle Swarm Optimization adalah salah satu metode optimasi yang terinspirasi dari

perilaku gerakan kawanan hewan seperti ikan (school of fish), hewan herbivor (herd),

dan burung (flock) yang kemudian tiap objek hewan disederhanakan menjadi sebuah

partikel. Suatu partikel dalam ruang memiliki posisi yang dikodekan sebagai vektor

koordinat. Vektor posisi ini dianggap sebagai keadaan yang sedang ditempati oleh

suatu partikel di ruang pencarian. Setiap posisi dalam ruang pencarian merupakan

alternatif solusi yang dapat dievaluasi menggunakan fungsi objektif. Setiap partikel

bergerak dengan kecepatan v.

  Particle Swarm Optimization atau yang kita kenal dengan PSO menerapkan

sifat masing-masing individu dalam satu kelompok besar. Kemudian menggabungkan

sifat-sifat tersebut untuk menyelesaikan permasalahan. Particle Swarm Optimization

pertama kali dimunculkan pada tahun 1995, sejak saat itulah para peneliti banyak

menurunkan dan mengembangkan metode PSO.

  Ciri khas dari PSO adalah pengaturan kecepatan partikel secara heuristik dan

probabilistik. Jika suatu partikel memiliki kecepatan yang konstan maka jika jejak

posisi suatu partikel divisualisasikan akan membentuk garis lurus. Dengan adanya

faktor eksternal yang membelokkan garis tersebut yang kemudian menggerakkan

partikel dalam ruang pencarian maka diharapkan partikel dapat mengarah, mendekati,

dan pada akhirnya mencapai titik optimal. Faktor eksternal yang dimaksud antara lain

posisi terbaik yang pernah dikunjungi suatu partikel, posisi terbaik seluruh partikel

(diasumsikan setiap partikel mengetahui posisi terbaik setiap partikel lainnya), serta

faktor kreativitas untuk melakukan eksplorasi.

  Particle Swarm Optimization memiliki kesamaan sifat dengan teknik

komputasi seperti Algoritma Genetika (Genetic Algorithm). Sistem PSO diinisialisasi

oleh sebuah populasi solusi secara acak dan selanjutnya mencari titik optimum dengan

cara meng-update tiap hasil pembangkitan. Metode optimasi yang didasarkan pada

swarm intelligence ini disebut algoritma behaviorally inspired sebagai alternatif dari

algoritma genetika, yang sering disebut evolution-based procedures. Dalam konteks

optimasi multivariabel, kawanan diasumsikan mempunyai ukuran tertentu atau tetap

  14

dengan setiap partikel posisi awalnya terletak di suatu lokasi yang acak dalam ruang

multidimensi. Setiap partikel diasumsikan memiliki dua karakteristik: posisi dan

kecepatan. Setiap partikel bergerak dalam ruang/space tertentu dan mengingat posisi

terbaik yang pernah dilalui atau ditemukan terhadap sumber makanan atau nilai fungsi

objektif. Setiap partikel menyampaikan informasi atau posisi bagusnya kepada

partikel yang lain dan menyesuaikan posisi dan kecepatan masing-masing berdasarkan

informasi yang diterima mengenai posisi yang bagus tersebut.

BAB 3 ANALISIS DATA DAN PERANCANGAN

3.1 Analisis Data

  

Dalam penelitian ini data yang diambil adalah data-data jadwal perawat rumah sakit

secara manual selama batas waktu tertentu, data perawat/karyawan/dokter, data shift

siang dan shift malam.

3.1.1 Data Identitas Perawat/Karyawan Rumah Sakit

  

Data jadwal perawat atau karyawan diambil dari rumah sakit yang dilakukan sebagai

objek penelitian sebagai bahan dasar sampe sistem. Data tersebut kemudian

dimasukkan ke dalam database berupa bahan dasar sebagai data penjadwalan nantinya

terhadap sistem. Semua data tersebut digunakan ketika aplikasi dijalankan. Database

identitas karyawan ditetapkan sebagai database karyawan dimana merupakan data

setiap karyawan baik itu perawat, staff, office boy, dokter dll, yang berisi tentang

identitas karyawan dan jabatannya dalam menjalankan tugas di rumah sakit tersebut.

  Data Perawat Tabel 3.1

  Nama Alamat No HP Agusmanto B Jl. Sunggal 89 08137728382 Mila Fania Jl. Veteran 88 08127272727 Nia Fransiska Jl. Sekip 83 08123477777 Rudi Hartono Jl. Sriwijaya 76 08137777363 Benny Geril Jl.Marihat 44 08172737373

  16

  3.1.2 Data Penjadwalan Perawat/Karyawan Rumah Sakit

Database penjadwalan perawat/karyawan rumah sakit ditetapkan sebagai database

jadwal kerja karyawan dimana merupakan data setiap karyawan baik itu perawat,

  , dokter dll, yang berisi tentang jadwal kegiatan karyawan tersebut staff, office boy sehari-harinya dalam menjalankan tugas di rumah sakit tersebut.

Tabel 3.2 Data Penjadwalan Kerja Karyawan

  Nama Shift Jadwal Jam Agusmanto B pagi 08.00-14.00 WIB Mila Fania malam 20.00-02.00 WIB Nia Fransiska siang 14.00-20.00 WIB

  Rudi Hartono pagi 20.00-02.00 WIB Benny Geril siang 08.00-14.00 WIB

  3.1.3 Data Ruangan Perawat/Karyawan Rumah Sakit

Database ruangan perawat/karyawan rumah sakit ditetapkan sebagai database

ruangan karyawan dimana merupakan data setiap karyawan baik itu perawat, staff,

office boy , dokter dll, yang berisi tentang jadwal ruangan karyawan tersebut sehari-

harinya dalam menjalankan tugas di rumah sakit tersebut.Tabel 3.3 Data Ruang Kerja Karyawan

  Nama Shift Ruangan Nia Fransiska Siang

  VIP A1 Rudi Hartono Malam Ekonomi C03 Benny Geril Siang UGD Mila Fania Malam UGD Nia Fransiska Siang Ekonomi C04

  3.1.4 Data Jumlah Karyawan atau Staff Rumah Sakit Berdasarkan Absen

Database jumlah perawat/karyawan rumah sakit ditetapkan sebagai database absensi

karyawan dimana merupakan data setiap karyawan baik itu perawat, staff, office boy,

  17

dokter dll, yang berisi tentang jadwal karyawan yang hadir dan yang tidak dapat hadir

tersebut sehari-harinya dalam menjalankan tugas di rumah sakit tersebut.Tabel 3.4 Data Absen Karyawan Rumah Sakit

  

Shift Jumlah Tidak Hadir

pagi 28 orang 3 orang Shift

  Siang 34 orang 2 orang Shift Shift Malam 18 orang 3 orang

3.2 Analisis Sistem

  

Analisis suatu sistem bertujuan untuk mengidentifikasi permasalahan yang ada pada

sistem tersebut. Analisis ini sangat diperlukan sebagai dasar perancangan sistem

sebelum dibangun. Analisis sistem mencakup beberapa bagian yaitu desain data,

deskripsi sistem, dan implementasi desain. Penelitian ini memiliki beberapa tahapan-tahapan proses sebagai berikut : 1.

  User atau berhadapan dengan sistem aplikasi pembelajaran dengan

menggunakan alat bantu berupa komputer untuk melakukan penjadwalan.

  2. Setelah aplikasi pembelajaran dimulai. User akan mulai melakukan pembelajaran dengan memasukkan data shift yang ada.

  3. Data shift yang kemudian diisi dengan melakukan jam shift yaitu pukul keberapa sampai pukul berapa dan jenis shift yang ditujukan padanya.

  4. Selanjutnya masuk ke dalam proses ruangan.

  5. Pada proses penentuan ruangan diisi dengan memasukkan nama ruangannya dan jumlah perawat yang akan bekerja pada ruangan tersebut.

  6. Pada kategori perawat berisikan tentang identitas identitas setiap perawat yang terdaftar di dalam rumah sakit tersebut.

  7. Kemudian masuk pada tahap penjadwalan rumah sakit.

  8. Pada tahap penjadwalan rumah sakit ini di input beberapa poin sebagai dasar untuk menentukan fitness nya dalam menentukan jadwal kerja perawat di rumah sakit.

  18 9.

  Pada proses penjadwalan adapun field field yang harus diisi adalah nama ruangan, shift malam atau shift siang dan kemudian nama dari perawat yang akan menerima tugas jaga tersebut.

  10. Pada hasil output akan ditentukan berapa jumlah ruangan nya, jumlah

perawatnya, jumlah shift nya yang berjalan disertai dengan nilai fitness nya.

  11. Adapun bentuk agoritma penjadwalan dapat dilihat pada flowchart pada gambar 3.1.

Gambar 3.1 Flowchart Sistem

  19

3.2.1 Proses Algoritma Genetika

  

Adapun proses dari Algoritma Genetika dalama menentukan fitness dapat dilihat pada

flowchart dibawah ini.Gambar 3.2 Flowchart Algoritma Genetika

  20

3.2.2 Proses Pengalokasian Pada Proses Penjadwalan

  Proses Penglokasian merupakan proses yang langkah-langkahnya sebagai berikut : 1.

  Sistem melakukan inisialisasi pasien dan perawat.

  2. Melakukan aturan alokasi perawat.

  3. Kemudian mengalokasikan jumlah perawat.

  4. Semua data terupdate ke database data haasil alokasi perawat.

Gambar 3.3 Flowchart Proses Alokasi Penjadwalan

  

PASIEN PERAWAT

ATURAN

ALOKASI

PERAWAT

JUMLAH PERAWAT

DATA

HASIL

ALOKASI

  21

3.2.3 Proses Penjadwalan

  Proses penjadwalan memiliki langkah-langkah sebagai berikut : 1.

  Inisialisasi pola tiap perawat.

  2. Melakukan proses optimasi perawat.

  3. Update data perawat untuk cuti dan libur nasional.

  4. Update jadwal perawat.

  5. Setelah dilakukan, maka jadwal perawat keluar. Berikut adalah bentuk flowchart nya pada gambar 3.3.

  Gambar 3.4 Flowchart Proses Penjadwalan Perawat

  22

3.2.4 Proses Penyesuaian

  Proses penyesuaian memiliki langkah-langkah sebagai berikut : 1.

  Pada penyimpanan data jadwal perawat ada dua yaitu, pertama adalah jawal dan yang kedua adalah perawat-jadwal.

  2. Ketika database diupdate, maka terjadi perpindahan data shift sesuai dengan kebutuhan.

  3. Setelah itu output akan keluar, data jadwal boleh dibaca oleh perawat rumah sakit.

  4. Berikut adalah bentuk flowchart nya pada gambar 3.4.

Gambar 3.5 Flowchart Proses Penyesuaian Jadwal

  PERAWAT DAN JADWAL JADWAL UPDATE DATABASE

  TERJADI PERPINDAHAN SHIFT LIHAT JADWAL HARI

  INI

  23

3.3 Perancangan Sistem

3.3.1 Diagram Use Case Pada sistem pembelajaran ini, terdapat satu pengguna dalam aturan sistemnya.

  Gambar diagram use case dari sistem ini dapat dilihat pada gambar 3.5.

  Diagram Use Case Gambar 3.6

  24

3.3.2 Penjelasan Use Case

  

Berikut ini adalah pendefinisan use case berdasarkan diagram yang digambarkan oleh

gambar 3.5.Tabel 3.5 Defenisi Use Case No Use Case Deskripsi

  1 Mulai Mulai untuk update data 2 Shift Memasukkan data shift dan jam kerja.

  

3 Ruangan Menentukan ruangan yang sesuai dengan data shift

4 Perawat Berisikan tentang semua identitas dari perawat.

  5 Jadwal Menentukan jadwal tetap dari perawat.

  6 Tampilan jadwal perawat Halaman dimana perawat melihat jam kerja shift mereka.

  7 Update database Database perawat.

3.3.3 General Architecture

  

Rancangan keseleruhan sistem dapat ditampilakan dalam gambaran secara umum

melalui general arsitektur berdasarkan gambar 3.6 dibawah ini.

  Gambar 3.7 Gambar General Architecture

  25

3.4 Perancangan Tampilan Antarmuka

  

Perancang tampilan antarmuka bertujuan untuk menggambarkan ide tampilan

antarmuka sistem yang dibuat.

3.4.1 Rancangan Tampilan Halaman Utama Aplikasi Halaman ini berisikan halaman awal dari aplikasi ketika pertama kali dijalankan.

  Perhatikan gambar 3.7 di bawah.

  Rancangan Halaman Utama Gambar 3.8

  26

3.4.2 Rancangan Tampilan Halaman Menu Shift pada Aplikasi

  

Halaman utama merupakan halam yang menampilkan ketika menu shift dijalankan

untuk pertama kali. Rancangan tampilan halaman utama program dapat dilihat pada

gambar dibawah ini. Rancangan aplikasinya dapat dilihat pada gambar 3.8 yang

terdapat di bawah ini.Gambar 3.9 Rancangan Halaman Shift

  27

3.4.3 Rancangan Tampilan Halaman Ruangan

  

Halaman ini merupakan halaman berisi ruangan dimana perawat bekerja dengan

jadawal shift yang ada. Rancangan tampilan ruangan dapat dilihat pada gambar 3.9 di

bawah ini.

  Rancangan Halaman Ruangan Gambar 3.10

  28

3.4.4 Rancangan Tampilan Halaman Perawat Halaman ini berisikan tentang identitas dan nama-nama seluruh perawat rumah sakit.

  

Rancangan tampilan pada halaman pembelajaran angka dasar dapat dilihat pada

gambar 3.10 berikut ini.

  Rancangan Halaman Perawat Gambar 3.11

  29

3.4.5 Rancangan Tampilan Halaman Jadwal

  

Halaman ini berisikan tentang penjadwalan yang dilakukan pada setiap perawat rumah

sakit yang ada. Gambarannya dapat dilihat seperti gambar 3.11 dibawah ini.

  Rancangan Halaman Jadwal Perawat Gambar 3.12

  30

3.4.6 Rancangan Tampilan Halaman Data Jadwal Jaga Perawat

  

Halamana ini berisikan tentang informasi yang akan dilihat oleh seluruh perawat

rumah sakit untuk dapat melihat jadwal shift mereka. Untuk tampilan aplikasinya

seperti pada gambar 3.12.Gambar 3.13 Rancangan Halaman Data Jadwal Perawat

BAB 4 IMPLEMENTASI DAN PENGUJIAN Tahapan yang dilakukan setelah analisis dan perancangan sistem adalah implementasi

  

dan pengujian sistem. Tahapan ini diperlukan untuk mengetahui apakah media

teknologi informasi tersebut berhasil atau tidak. Berikut merupakan hasil

implementasi dan pengujian dari sistem yang sudah dibangun.

4.1 Implementasi Sistem

  

Sesuai dengan hasil analisis dan perancangan sistem yang telah dibuat, dilakukanlah

implementasi perancangan menjadi aplikasi penjadwalan yang ditujukan membantu

staf rumah sakit dalam menentukan jadwal-jadwal perawat setiap bulannya dengan

menggunakan Algoritma Genetika ke dalam bahasa pemrograman PHP.

4.1.1 Spesifikasi Perangkat Keras dan Perangkat Lunak yang Digunakan

  

Sistem dibuat di dalam lingkungan perangakat keras yang memiliki spesifikasi sebagai

berikut:

  1. Processor standart.

  2. Memory RAM yang digunakan 2 GB.

  3. Kapasitas Hardisk 500 GB.

Selain perangkat keras, sistem juga dibuat dalam lingkungan spesifikasi perangkat

lunak sebagai berikut:

  1. Windows 7 Ultimate.

  2. Dreamwaver.

  32

4.1.2 Tampilan-Tampilan Desain Penjadwalan Rumah Sakit

  

Tampilan halaman utama aplikasi merupakan tampilan desain user interface ketika

aplikasi dijalankan. Pada tampilan utama terdapat empat panel dimana masing masing

panel berisi halaman halaman dalam proses terbentuknya penjadwalan perawat rumah

sakit dengan metode genetika. Adapun tampilannya dapat dilihat pada gambar 4.1.

  Tampilan simulasi ketika program belum dijalankan Gambar 4.1

  

Pada gambar diatas tampak halaman utama pada penjadwalan perawat dimana

halaman didesain sebaik mungkin dengan hasil yang tidak terlampau mencolok.

  

Pada halaman depan terdapat panel dashboard yang berfungsi sebagai halaman utama

yang berisikan tentang informasi yang ada di sekitar penjadwalan rumah sakit.

Selanjutnya pada panel perawat merupakan halaman yang berisikan tentang semua

data para perawat yang bekerja di dalam rumah sakit tersebut. Untuk lebih jelas nya

perhatikan gambar dibawah ini.

  33 Tampilan data para perawat Gambar 4.2

  

Gambar diatas berisikan tentang nama, alamat, no telepon dan data-data penting

perawat yang dibutuhkan oleh pihak rumah sakit.

  

Sedangkan pada panel libur adalah halaman dimana admin dapat melihat semua

perawat yang sudah mengajukan jadwal untuk libur berdasarkan ketentuan dari pihak

rumah sakit. Pihak rumah sakit menerima ajuan apabila ada perawat yang mengajukan

untuk libur/cuti. Apabila sesuai maka admin akan menyetujui ajuan dari perawat

tersebut. Namun apabila tidak cocok maka admin akan mengeluarkan data dimana

sebaiknya dia mengajukan libur/cuti. Berikut adalah tampilan laman libur perawat

rumah sakit.

  34 Gambar 4.3 Tampilan permintaan cuti perawat

Perawat dapat mengajukan cuti/libur sesuai dengan ketentuan rumah sakit, misalnya

dalam satu minggu tidak diperbolehkan ada 10 perawat yang mengajukan cuti/libur.

Kemudian pada panel selanjutnya adalah tabel dimana admin mencetak semua jadwal

yang sudah dikeluarkan oleh sistem penjadwalan berdasarkan data yang sudah diinput

ke dalam sistem penjadwalan rumah sakit. Perhatikan gambar berikut.

  35 Gambar 4.4 Tampilan cetak jadwal

Apabila admin ingin mencetak jadwal, admin dapat langsung mengklik tombol panel

cetak jadwal. Setelah dicetak maka akan di tempel di mading informasi rumah sakit

agar setiap perawat dapat melihat jadwal mereka dalam sebulan penuh.

  36 Namun sebelum admin mencetak hasil dari jadwal. Admin dapat meninjau

ulang/meriview semua jadwal terlebih dahulu sebelum dicetak dan ditempelkan ke

dalam mading informasi rumah sakit. Untuk pratinjau dari jadwal rumah sakit dapat

dilihat pada gambar berikut ini.Gambar 4.5 Tampilan pratinjau pada jadwal perawat

  37 Namun sebelum proses pratinjau. Sistem akan mengeluarkan beberapa sampel jadwal pada admin. Kemudian hak pada admin yang menentukan jadawal mana yang akan

dipilih berdasarkan beberapa sampel hasil yang dikeluarkan oleh sistem. Perahatikan

gambar dibawah ini. Ada terdapat beberapa individu yang dikeluarkan oleh sistem dan

gamber berikut merupakan tampilan sebagian dari individu yang ada.

  Tampilan beberapa sampel jadwal Gambar 4.6

  38

4.2 Hasil Pengujian Sistem Hasil dari seluruh pengujian dapat dilihat seperti pada tabel 4.1 dibawah ini.

  Hasil Uji Analisis Sistem dalam format pdf Tabel 4.1

  

Pada tabel diatas tampak hasil dari penjadwalan dimana biru menandakan shift pagi,

kuning menandakan shift siang, hijau menandakan shift malam dan warna merah

menandakan libur yang dikonvert ke dalam bentuk file “.pdf”. Pada hasil analisis

diatas tampak beberapa perawat yang dijadikan sampel sebagai perawat perawat yang

bekerja dalam sebuah rumah sakit. T1 sampe T31 merupakan hari dalam satu bulan,

dimana hari yang diambil adalah hari yang terbanyak.

BAB 5 KESIMPULAN DAN SARAN

5.1 Kesimpulan

  

Dari hasil pembahasan tentang Perancangan Aplikasi Penjadwalan Perawat dengan

menggunakan algoritma genetika maka diambil kesimpulan sebagai berikut :

  1 Dengan adanya aplikasi penjadwalan ini, maka pihak rumah sakit yang memakai dapat lebih mudah menyajikan informasi tentang jadwal penjadwalan perawat rumah sakit setiap bulannya.

  2 Mempermudah rumah sakit dalam pencarian data, proses evaluasi apabila pihak rumah sakit ingin melihat data-data dalam beberapa bulan terakhir.

  3 Aplikasi sistem penjadwalan perawat rumah sakit ini sudah berjalan menuju 100%.

5.2 Saran

  

Untuk pengembangan lebih lanjut maka penulis memberikan saran yang sangat

bermafaat dan dapat membantu proses penjadwalan rumah sakit bagi peneliti

selanjutnya, yaitu :

Perlunya pengembangan aplikasi agar setiap perawat memiliki ID dan password

sehingga perawat dapat memantau kapan jadwal tugasnya masing-masing dan perawat

dapat mengajukan cuti melalui akunnya masing-masing secara online.

  40 DAFTAR PUSTAKA

Abdennadher, S. and Schlenker, H., 1999. Nurse Scheduling using Constraint Logic

Programming . American Association for Artificial Intelligence.

  

Abdullah, A. 2003. Perangkat Lunak Optimasi Alokasi dan Penjadwalan Perawat

Rumah Sakit. Skripsi. Institut Teknologi Sepuluh Nopember. Surabaya.

  

Ahuja, R.K., Magnanti, T.L., dan Orlin, J.B. 1993.“Network Flows: Theory,

Algorithm, and Applications”, Prentice Hall.

  

Aickelin, U. & Dowsland, K.A., 2000. An Indirect Genetic Algorithm for a Nurse

Scheduling Problem . Computer and Operations Research.

  

Glover, F., Laguna, M., 1997. “Tabu Search”, Dordrecht : Kluwer Academic

Publisher Group.

  

Gunes, E. D., 1999. “Workforce Scheduling”,Department of Industrial Engineering,

Bilkent University.

  

Hernani, S. E., 2002. “Pola Tenaga Keperawatan Rumah Sakit Mardi Rahayu Tahun

2002”, Rumah Sakir Mardi Rahayu Kudus.

  

Hertz, A., Taillard, E., 2000. “A Tutorial on Tabu Search”, University of Montreal,

Centre of Research and Transportation.

  

Miller, H.E., Pierskalla, W.P., and Rath, G.J., 1976. “Nurse Scheduling Using

Mathematical Programming”, Operations Research.

  

Muhammad, A. 2006. Aplikasi Algoritma Genetik Untuk Optimasi Penjadwalan Mata

Kuliah . Universitas Komputer Indonesia.

  41 Nugraha, Ivan. 2008. Aplikasi Algoritma Genetik Untuk Optimasi Penjadwalan Kegiatan Belajar Mengajar. Skripsi. Institut Teknologi Bandung.

  Randy L. Haupt . 2004. Practical Genetic Algorithms. A John Wiley & Sons, Inc.

Suwadi, R., 2003. Alokasi dan Penjadwalan Perawat pada Rumah Sakit Mardi Rahayu

Kudus. Skripsi. Institut Teknologi Surakarta: Surabaya.

  

Wilhelm, E. 2005. A Hybrid Grouping Genetic Algorithm for Examination

. University of Applied Sciences.

  Timetabling

LAMPIRAN LISTING PROGRAM

  Index. Php <?php session_start(); include "koneksi/koneksi.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html ns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="">

  <link href='img/icon.png' rel='shortcut icon'/> <title>Penjadwalan Perawat</title> <!-- Bootstrap Core CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- MetisMenu CSS --> <link href="css/plugins/metisMenu/metisMenu.min.css" rel="stylesheet">

  <!-- Custom CSS --> <link href="css/penjadwalanperawat.css" rel="stylesheet"> <!-- Custom Fonts --> <link href="font-awesome-4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css"> </head> <body style="background-image: url('img/login.jpg');background-repeat: no-repeat; background- position: right top; background-attachment: fixed;"> <? if (!isset($_SESSION[admin])&& !isset($_GET['action'])) { ?>

  <div class="container intro-header"> <div class="row">

  <div class="col-md-6 col-md-offset-3"> <div class="panel-heading text-center" style="color:white;text- shadow: 0px 0px 5px #333;">

  <h1 class="h1-plus"><strong>Penjadwalan Perawat</strong></h1>

  <h3 class="h3-plus">Menggunakan Algoritma Genetika</h3>

  </div> <hr class="intro-divider"> <div class="panel-body">

  <form role="form" action="?action=cek_login" method="post"> <fieldset class="col-md-6 col-md-offset-3">

  <div class="form-group"> <? if(isset($_GET['pesan']) &&

  $_GET['pesan']=="gagal") { echo "<div class='alert alert-warning' role='alert'>Periksa kembali username atau password Anda</div>";

  } ?> </div> <div class="form-group">

  <input class="form-control" placeholder="Username" name="username" type="username" autofocus> </div> <div class="form-group">

  <input class="form-control" placeholder="Password" name="password" type="password" value=""> <input type="submit" name="button" class="btn btn-lg btn-success btn-block" value="Login">

  </fieldset> </form>

  </div> </div>

  </div> </div> <!-- Footer --> <footer>

  <div class="container"> <div class="row text-center">

  <div class="col-lg-12"> <br>

  <p class="copyright text-muted small" style="color:white;text-shadow: 0px 0px 5px #333;">Copyright © Adisty Amelia Daulay 2014. All Rights Reserved</p>

  <br> </div>

  </div> </div>

  </footer> <? } ?> <? if($_GET['action']=="cek_login"){

  $user=$_POST['username']; $pass=md5($_POST['password']); $query=mysql_query("SELECT * FROM tbl_pengguna WHERE password='$pass' limit 1"); $jlh=mysql_num_rows($query); if($jlh>0) {

  $fetch = mysql_fetch_array($query); $_SESSION[admin]=$user; $_SESSION[level]=$fetch[level]; ?>

  <script> setTimeout(function(){document.location.href = "home.php?module=dashboard"}, 2000);

  </script>

  <meta http-equiv="refresh" content="0;home.php?module=dashboard"><?php } else {

  ?><meta http-equiv="refresh" content="0;?pesan=gagal"><?php }

  } elseif(isset($_SESSION[admin])&& !isset($_GET['action'])) { ?> <meta http-equiv="refresh" content="0;home.php?module=dashboard"><?php

  } ?> <!-- jQuery Version 1.11.0 --> <script src="js/jquery-1.11.0.js"></script> <!-- Bootstrap Core JavaScript --> <script src="js/bootstrap.min.js"></script> <!-- Metis Menu Plugin JavaScript --> <script src="js/plugins/metisMenu/metisMenu.min.js"></script> <script src="js/penjadwalanperawat.js"></script> </body> </html>

  Home.php <?php session_start(); if(!isset($_SESSION[admin])){ header('location: ./?Dashboard'); } function status($status){ echo'<script type="text/javascript"> alert("'.$status.'");

  { window.history.go(-1) }

  </script>'; } include "koneksi/koneksi.php"; include "part/head.php"; ?> <body> <div id="wrapper">

  <? include "part/menu.php"; ?> <div id="page-wrapper" style="background-image: url('img/dashboard.jpg');">

  <? include "content.php"; ?> </div> <!-- /#page-wrapper --> <? include "part/footer.php"; ?>

  </div> <!-- /#wrapper --> </body> </html>

  Content.php <?php session_start(); switch($_GET['module']) { case "dashboard": include "modul/dashboard.php"; break; case "dlogout": include "modul/dlogout.php"; break; case "perawat": include "modul/perawat.php"; break; case "libur": include "modul/libur.php"; break; case "cetak_jadwal": include "modul/cetak_jadwal.php"; break; default: echo "Maaf Modul belum tersedia";

  } ?>

  Cetakjadwal.php <? include "koneksi/koneksi.php"; ?> <div class="row">

  <div class="col-lg-12"> <h1 class="page-header">Cetak Jadwal</h1>

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <? /** Function **/ // Random Jadwal function getRJ($length) {

  // Gen = 1, perawat i mendapat shift pagi pada hari ke-t // Gen = 2, perawat i mendapat shift sore pada hari ke-t // Gen = 3, perawat i mendapat shift malam pada hari ke-t // Gen = 4, perawat i mendapat libur spesial atau cuti pada hari ke-t // Gen = A-J, tingkat prioritas perawat i mendapat hari libur dasar pada hari ke-t, J terendah

  (untuk mutasi) $gen = "1234ABCDEFGHIJ"; $validCharNumber = strlen($gen); $result = ""; for ($i = 0; $i < $length; $i++) { $index = mt_rand(0, $validCharNumber - 1);

  $result .= $gen[$index]; } return $result; } // Random Mutation function getRS($length) { $gen = "123"; $validCharNumber = strlen($gen); $result = ""; for ($i = 0; $i < $length; $i++) { $index = mt_rand(0, $validCharNumber - 1);

  $result .= $gen[$index]; } return $result; } function getRL($length) { $gen = "BCDEFGHIJ"; $validCharNumber = strlen($gen); $result = ""; for ($i = 0; $i < $length; $i++) { $index = mt_rand(0, $validCharNumber - 1);

  $result .= $gen[$index]; } return $result; } function str_split_php4($text, $split){ //place each character of the string into and array $array = array(); for($i=0; $i < strlen($text); $i++){ $key = NULL; for ($j = 0; $j < $split; $j++){ $key .= $text[$i]; } } return $array; } // Syarat Batasan 1 - Total perawat libur dalam 1 hari melebihi total perawat yang ditentukan rumah sakit function batasan1($tanggal, $individu) {

  $sqlbatasan1 = mysql_query("SELECT * FROM ga_gen WHERE tanggal = '".$tanggal."' AND id_individu = '".$individu."' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen");

  /* determine number of rows sqlbatasan1 set */ $rowbatasan1 = mysql_num_rows($sqlbatasan1); return $rowbatasan1;

  } // Syarat Batasan 2 - Total hari libur yang diterima 1 perawat selama 31 hari melebihi total hari yang ditentukan rumah sakit function batasan2($kromosom, $individu) {

  $sqlbatasan2 = mysql_query("SELECT * FROM ga_gen WHERE id_kromosom = '".$kromosom."' AND id_individu = '".$individu."' AND nama_gen BETWEEN 'A' AND 'J'");

  /* determine number of rows sqlbatasan2 set */ $rowbatasan2 = mysql_num_rows($sqlbatasan2); return $rowbatasan2;

  } // Syarat Batasan 3 - Total perawat shift pagi dalam 1 hari kurang dari total perawat yang ditentukan rumah sakit yaitu 4 function batasan3($tanggal, $individu) {

  $sqlbatasan3 = mysql_query("SELECT * FROM ga_gen WHERE tanggal = '".$tanggal."' AND id_individu = '".$individu."' AND nama_gen = '1' ORDER BY nama_gen");

  /* determine number of rows sqlbatasan3 set */ $rowbatasan3 = mysql_num_rows($sqlbatasan3); return $rowbatasan3;

  } // Syarat Batasan 4 - Total perawat shift siang dalam 1 hari kurang dari total perawat yang ditentukan rumah sakit yaitu 4 function batasan4($tanggal, $individu) { $sqlbatasan4 = mysql_query("SELECT * FROM ga_gen WHERE tanggal = '".$tanggal."'

  AND id_individu = '".$individu."' AND nama_gen = '2' ORDER BY nama_gen"); /* determine number of rows sqlbatasan4 set */ $rowbatasan4 = mysql_num_rows($sqlbatasan4); return $rowbatasan4;

  } // Syarat Batasan 5 - Total perawat shift malam dalam 1 hari kurang dari total perawat yang ditentukan rumah sakit yaitu 4 function batasan5($tanggal, $individu) {

  $sqlbatasan5 = mysql_query("SELECT * FROM ga_gen WHERE tanggal = '".$tanggal."' AND id_individu = '".$individu."' AND nama_gen = '3' ORDER BY nama_gen");

  /* determine number of rows sqlbatasan5 set */ $rowbatasan5 = mysql_num_rows($sqlbatasan5);

  } ?> <!-- Button trigger modal --> <div class="row">

  <div class="col-lg-12"> <p>

  <button class="btn btn-success" data-toggle="modal" data- target="#myModal"> Lihat Jadwal

  </button> </p> <form method="post" action="modul/jadwal.php">

  <p> <input class="btn btn-success" type="submit" value="Cetak Jadwal" /> </p>

  </form> </div>

  </div> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">

  <div class="modal-dialog modal-lg"> <div class="modal-content"> <? echo "<div class='modal-body centered table-responsive'>"; echo "<table class='table table-bordered' style='font-size:8px;'>"; echo "<caption style='font-size:14px !IMPORTANT;'><strong>Jadwal

  Perawat</strong><br><br>"; echo "<span class='btn btn-blue btn-sm btn- circle'><strong>P</strong></span> <span class='text-blue'>: Pagi     </span>"; echo "<span class='btn btn-yellow btn-sm btn- circle'><strong>S</strong></span> <span class='text-yellow'>: Siang     </span>"; echo "<span class='btn btn-green btn-sm btn- circle'><strong>M</strong></span> <span class='text-green'>: Malam     </span>"; echo "<span class='btn btn-red btn-sm btn- circle'><strong>L</strong></span> <span class='text-red'>: Libur<br><br></span>"; echo "</caption>"; echo "<thead>"; echo "<tr>"; echo "<th></th>"; for($j=1;$j<=31;$j++) { echo "<th>T".$j."</th>"; } echo "</tr>"; echo "</thead>"; echo "<tbody>"; for($l=1;$l<=21;$l++) {

  $result = mysql_query("SELECT * FROM ga_gen WHERE id_kromosom = '".$l."' AND id_individu = '1'"); $namaPerawat = mysql_fetch_array(mysql_query("SELECT *

  FROM tbl_perawat WHERE id_perawat = '".$l."'")); echo "<td>".$namaPerawat[nama_perawat]."</td>"; while($row = mysql_fetch_array($result)) { if($row['nama_gen']==1) { echo "<td class='bg-blue'>P</td>";

  } else if($row['nama_gen']==2) { echo "<td class='bg-yellow'>S</td>"; } else if($row['nama_gen']==3) { echo "<td class='bg-green'>M</td>";

  } else { echo "<td class='bg-red'>L</td>"; }

  } echo "</tr>"; } echo "</tbody>"; echo "</table>"; echo "</div>"; echo "<div class='modal-footer'>"; echo "<button type='button' class='btn btn-default' data- dismiss='modal'>Tutup</button>"; echo "</div>"; ?>

  </div> </div>

  </div> <!-- Tampilkan Form --> <div class="row">

  <div class="col-lg-12"> <div class="panel panel-green panel-default panel-x">

  <form method="post" action="?module=cetak_jadwal&act=proses" role=form"> <div class="panel-heading">

  <strong>Form Cetak Jadwal</strong> </div>

  <!-- /.panel-heading --> <div class="panel-body">

  <table> <tr>

  <div class="form-group"> <td><label class="control- label">Populasi Awal</label></td> <td>  </td> <td><input class="form-control" name="pop_awal" type="text" required></td>

  </table> </div> <!-- /.panel-body --> <div class="panel-footer">

  </div> <!-- /.row --> <!-- Proses --> <? if ($_GET['act']=='proses') { include "koneksi/connection.php";

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.panel -->

  </form> <!-- /.form -->

  </button> </div> <!-- /.panel-footer -->

  <button type="submit" name="button" class="btn btn- success")> Proses

  </div> </tr>

  </div> </tr> <tr>

  <td><label class="control-label">Maks perawat libur</label></td> <td>    </td> <td><input class="form-control" name="pwtlibur" type="text" placeholder="perawat/hari" ></td>

  </tr> <tr> <div class="form-group">

  <tr> <td><br></td>

  </div> </tr>

  <td><label class="control-label">Maks libur perawat</label></td> <td>    </td> <td><input class="form-control"

  <td><br></td> </tr> <tr> <div class="form-group">

  // Hapus data lama dari tabel ga_gen $result = $mysqli->query("TRUNCATE TABLE ga_gen");

  $result = $mysqli->query("FLUSH TABLE ga_gen"); $result = $mysqli->query("TRUNCATE TABLE ga_fitness"); $result = $mysqli->query("FLUSH TABLE ga_fitness"); // Inisialisasi jumlah hari yang dijadwalkan yaitu 1 bulan = 31 hari $hari = 31; // Cari jumlah perawat $sqlPerawat = mysql_query("SELECT * FROM tbl_perawat"); while($rowPerawat = mysql_fetch_array($sqlPerawat)) {

  $a++; $x[$a] = $rowPerawat['id_perawat'];

  } // Inisialisasi junlah perawat $jPerawat = count($x); $Si = $_POST[libur]; // Inisialisasi maksimal perawat libur/hari yaitu 9 perawat $Pt = $_POST[pwtlibur]; // Inisialisasi minimal perawat shift pagi $minPt = 4; // Inisialisasi minimal perawat shift sore $minSt = 4; // Inisialisasi minimal perawat shift malam $minMt = 4; // Inisialisasi populasi $populasi = $_POST[pop_awal]; // Bangkitkan populasi for($i=1;$i<=$populasi;$i++) { echo "<div class='row'>"; echo "<div class='panel panel-green panel-default panel-x'>"; echo "<div class='table-responsive'>"; echo "<table class='table table-bordered'>"; echo "<thead>"; echo "<tr>"; echo "<th class='text-center' colspan='32'>Individu ".$i."</th>"; echo "</tr>"; echo "<tr>"; echo "<th>Pwt</th>"; for($j=1;$j<=$hari;$j++) { echo "<th>$j</th>"; } echo "</tr>"; echo "</thead>"; echo "<tbody>"; for($k=1;$k<=$jPerawat;$k++) { echo "<tr>"; echo "<td>".$k."</td>"; $kromosom = getRJ($hari);

  $skromosom = str_split_php4($kromosom,1); foreach( $skromosom as $key=>$gen ) { $tanggal=$key+1; echo "<td>"; echo $gen; echo "</td>"; if($result=$mysqli->prepare("INSERT INTO ga_gen

  (id_kromosom, id_individu , tanggal, nama_gen) VALUES (?, ?, ?, ?)")) { // Bind your variables to replace the ?s $result->bind_param('iiis', $k, $i, $tanggal, $gen); // Execute query $result->execute(); // Close statement object $result->close(); } else { mysqli_error($mysqli)); }

  } echo "</tr>"; } echo "</tbody>"; echo "</table>"; echo "</div></div></div>";

  } /* close connection */ $mysqli->close(); /* Crossover */ include "koneksi/connection.php"; if($result = $mysqli->query("SELECT * FROM ga_fitness ORDER by fitness DESC LIMIT

  2")) { /* Dua individu terbaik */ while($row = $result->fetch_array(MYSQLI_NUM)) {

  $no++; $parent[$no] = $row[1];

  } /* close result set */ $result->close();

  } if($result = $mysqli->query("create table tmp_t as select * from ga_gen")) { for($x=0;$x<$jPerawat;$x++) {

  $result = $mysqli->query("update tmp_t set nama_gen=(select nama_gen from ga_gen where id_gen = '1+".$x."') where id_gen = '".$x."' and id_individu = '1'"); } $result = $mysqli->query("update ga_gen t1 inner join tmp_t t2 on t1.tanggal = t2.tanggal and t1.id_kromosom = t2.id_kromosom and t1.id_individu = '".$parent[1]."' and t2.id_individu = '".$parent[2]."' set t1.nama_gen = t2.nama_gen");

  $result = $mysqli->query("update ga_gen t1 inner join tmp_t t2 on t1.tanggal = t2.tanggal and t1.id_kromosom = t2.id_kromosom and t1.id_individu = '".$parent[2]."' and t2.id_individu = '".$parent[1]."' set t1.nama_gen = t2.nama_gen");

  $result = $mysqli->query("drop table tmp_t");

  } /* close connection */ $mysqli->close(); /* Pilih Individu dengan Fitness Tertinggi */ /* Mutation */ // Masukkan data tabel cuti(libur yang diinginkan perawat) ke jadwal $sqlcuti = mysql_query("SELECT * FROM tbl_libur"); while($datacuti = mysql_fetch_array($sqlcuti)) { mysql_query("UPDATE ga_gen SET nama_gen='A' WHERE tanggal='".$datacuti[tanggal]."' AND id_kromosom='".$datacuti[id_perawat]."' AND id_individu='1'");

  } for($a=1;$a<=31;$a++) { $batasan3 = batasan3($a,1);

  $limit3 = 4-$batasan3; $sqlchange3 = mysql_query("SELECT * FROM ga_gen WHERE tanggal =

  '".$a."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen DESC LIMIT ".$limit3.""); while($fetchchange3 = mysql_fetch_array($sqlchange3)) { mysql_query("UPDATE ga_gen SET nama_gen='1' WHERE id_gen='".$fetchchange3[id_gen]."'");

  } } if($batasan3>4) {

  $limit3 = $batasan3-4; $sqlchange3 = mysql_query("SELECT * FROM ga_gen WHERE tanggal =

  '".$a."' AND id_individu = '1' AND nama_gen = '1' ORDER BY tanggal DESC LIMIT ".$limit3.""); while($fetchchange3 = mysql_fetch_array($sqlchange3)) { mysql_query("UPDATE ga_gen SET nama_gen='".getRL(1)."'

  WHERE id_gen='".$fetchchange3[id_gen]."'"); }

  } unset($batasan3, $limit3, $sqlchange3, $fetchchange3); } for($b=1;$b<=31;$b++) {

  $batasan4 = batasan4($b,1); if($batasan4<4) { $limit4 = 4-$batasan4; $sqlchange4 = mysql_query("SELECT * FROM ga_gen WHERE tanggal =

  '".$b."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen DESC LIMIT ".$limit4.""); while($fetchchange4 = mysql_fetch_array($sqlchange4)) { mysql_query("UPDATE ga_gen SET nama_gen='2' WHERE id_gen='".$fetchchange4[id_gen]."'");

  } } if($batasan4>4) {

  $limit4 = $batasan4-4; $sqlchange4 = mysql_query("SELECT * FROM ga_gen WHERE tanggal =

  '".$b."' AND id_individu = '1' AND nama_gen = '2' ORDER BY tanggal DESC LIMIT ".$limit4.""); while($fetchchange4 = mysql_fetch_array($sqlchange4)) { mysql_query("UPDATE ga_gen SET nama_gen='".getRL(1)."'

  WHERE id_gen='".$fetchchange4[id_gen]."'");

  } } unset($batasan4, $limit4, $sqlchange4, $fetchchange4);

  } for($c=1;$c<=31;$c++) { $batasan5 = batasan5($c,1); if($batasan5<4) {

  $limit5 = 4-$batasan5; $sqlchange5 = mysql_query("SELECT * FROM ga_gen WHERE tanggal =

  '".$c."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen DESC LIMIT ".$limit5.""); while($fetchchange5 = mysql_fetch_array($sqlchange5)) { mysql_query("UPDATE ga_gen SET nama_gen='3' WHERE id_gen='".$fetchchange5[id_gen]."'");

  } } if($batasan5>4) {

  $sqlchange5 = mysql_query("SELECT * FROM ga_gen WHERE tanggal = '".$c."' AND id_individu = '1' AND nama_gen = '3' ORDER BY tanggal DESC LIMIT ".$limit5.""); while($fetchchange5 = mysql_fetch_array($sqlchange5)) { mysql_query("UPDATE ga_gen SET nama_gen='".getRL(1)."'

  WHERE id_gen='".$fetchchange5[id_gen]."'"); }

  } unset($batasan5, $limit5, $sqlchange5, $fetchchange5); } unset($a, $b, $c); include "koneksi/connection.php"; for($a=1;$a<=$hari;$a++) { if($result = $mysqli->query("create table tmp_t as select * from ga_gen WHERE tanggal = '".$a."' AND id_individu = '1' ORDER BY tanggal")) { if($result = $mysqli->query("SELECT * FROM ga_gen WHERE tanggal =

  '".$a."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen")) { /* determine number of rows result set */ $row_cnt = $result->num_rows;

  } if($result>9) { $result = $mysqli->query("SELECT * FROM tmp_t WHERE tanggal = '".$a."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen DESC LIMIT 1"); while($row = mysqli_fetch_array($result)) {

  $gen1 = $row['nama_gen']; } $result = $mysqli->query("UPDATE tmp_t SET nama_gen='".getRS(1)."' WHERE nama_gen='".$gen2."'"); $result = $mysqli->query("SELECT * FROM tmp_t WHERE tanggal = '".$a."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen DESC LIMIT 1"); while($row = mysqli_fetch_array($result)) {

  $gen2 = $row['nama_gen']; } $result = $mysqli->query("UPDATE tmp_t SET nama_gen='".getRS(1)."' WHERE nama_gen='".$gen2."'");

  }

  $result = $mysqli->query("update ga_gen t1 inner join tmp_t t2 on t1.tanggal = t2.tanggal and t1.id_kromosom = t2.id_kromosom and t1.id_individu = t2.id_individu set t1.nama_gen = t2.nama_gen");

  $result = $mysqli->query("drop table tmp_t"); }

  } /* close connection */ $mysqli->close(); ?> <script> setTimeout(function(){document.location.href = "?module=cetak_jadwal"}, 2000); </script> <?

  } ?> <!-- jQuery Version 1.11.0 --> <script src="js/jquery-1.11.0.js"></script> <!-- Bootstrap Core JavaScript --> <script src="js/bootstrap.min.js"></script> <!-- Metis Menu Plugin JavaScript --> <script src="js/plugins/metisMenu/metisMenu.min.js"></script> <!-- DataTables JavaScript --> <script src="js/plugins/dataTables/jquery.dataTables.js"></script> <script src="js/plugins/dataTables/dataTables.bootstrap.js"></script> <!-- Custom Theme JavaScript --> <script src="js/penjadwalanperawat.js"></script>

  Jadwal.php <?php session_start(); include "../koneksi/koneksi.php"; ini_set("max_execution_time",99999999); require_once("dompdf/dompdf_config.inc.php"); $tbl =

  '<style> body { padding : 15px; margin:10px;

  } h3 { color: white; text-shadow: 0px 0px 2px #8DD241; margin: 0;

  } p { margin: 0;

  } .data { font-size:12px; } .data th,.data td { border:1px solid #000; padding:5px;

  } .bold { font-size:16px; font-weight:bold;

  } .footer { font-size:9px; position:absolute; bottom :10px; right:10px;

  } .bg-blue { background-color: #428bca; color: white;

  } .bg-red { background-color: #b30000; color: white;

  } .bg-green { background-color: green; color: white;

  } .bg-yellow { background-color: yellow; color: white;

  } .blue { color: #428bca; } .yellow { color: yellow; } .green { color: green; } .red { color: #b30000; } </style>'.

  '<h3 >Penjadwalan Perawat</h3>'. '<p>'. '<b><span class="blue">P</span></b> : Pagi '. '<b><span class="yellow">S</span></b> : Siang '. '<b><span class="green">M</span></b> : Malam '.

  '</p>'. '<table class="data" cellpadding="0" cellspacing="0">'. '<tr class="data">'. '<th class="data"></th>'; for($j=1;$j<=31;$j++) {

  $tbl .= '<th class="data">T'.$j.'</th>';

  } $tbl .=

  '</tr>'; for($l=1;$l<=21;$l++) { $result = mysql_query("SELECT * FROM ga_gen WHERE id_kromosom = '".$l."' AND id_individu = '1'"); $namaPerawat = mysql_fetch_array(mysql_query("SELECT * FROM tbl_perawat WHERE id_perawat = '".$l."'")); $tbl .= '<tr class="data">'.

  '<td class="data">'.$namaPerawat[nama_perawat].'</td>'; while($row = mysql_fetch_array($result)) { if($row['nama_gen']==1) {

  $tbl .= '<td class="data bg-blue">P</td>'; } else if($row['nama_gen']==2) {

  $tbl .= '<td class="data bg-yellow">S</td>'; } else if($row['nama_gen']==3) {

  $tbl .= '<td class="data bg-green">M</td>'; } else {

  $tbl .= '<td class="data bg-red">L</td>'; }

  } $tbl .= '</tr>';

  } $tbl .=

  '</table>'; $dompdf = new DOMPDF(); $dompdf->set_paper("a4", 'landscape');

  $dompdf->load_html($tbl); $dompdf->render(); $dompdf->stream("jadwal.pdf"); ?> Libur.php <? include "koneksi/koneksi.php"; ?> <div class="row">

  <div class="col-lg-12"> <h1 class="page-header">Libur</h1>

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <!-- Tampilkan Data --> <div class="row">

  <div class="col-lg-12"> <div class="panel panel-green panel-default panel-x">

  <div class="panel-heading"> <strong>Data Libur</strong>

  </div> <!-- /.panel-heading --> <div class="panel-body">

  <div class="table-responsive"> <table class="table table-striped table-bordered table- hover" id="pdataTables">

  <thead> <tr>

  <th class="text- center">No</th> <th class="text-center">Nama

  Perawat</th> <th class="text- center">Tanggal Libur</th> <th class="text- center">Edit</th> <th class="text- center">Hapus</th>

  </tr> </thead> <tbody> <?

  $sql_libur = "SELECT a.id_libur, b.nama_perawat, a.tanggal FROM tbl_libur a, tbl_perawat b WHERE a.id_perawat=b.id_perawat";

  $row_libur = mysql_query($sql_libur); while($row = mysql_fetch_array($row_libur)) {

  $nomor++; echo' <tr class="text-center">'; echo' <td>'.$nomor.'</td>'; echo'

  <td>'.$row['nama_perawat'].'</td>'; echo' <td>'.$row['tanggal'].'</td>'; echo' <td> <a class="btn btn-info btn-outline btn-circle" onclick=\'document.location.href="?module=libur&act=edit_libur&id_libur='.$row['id_libur'].'"\'><i class="fa fa-wrench"></i></a></td><td>

  <a class="btn btn-danger btn-outline btn-circle" href="?module=libur&act=hapus_libur&id_libur='.$row['id_libur'].'" onclick=\'return confirm(\'Anda yakin ingin menghapus data ini?\')\'><i class="fa fa-trash-o" ></i></a>

  </td>'; echo' </tr>'; } ?>

  </tbody> </table>

  </div> <!-- /.table-responsive -->

  </div> <!-- /.panel-body -->

  <a class="btn btn-outline btn-success" href="?module=libur&act=tambah_libur")> <i class="fa fa-plus"></i> Tambah

  </a> </div> <!-- /.panel-footer -->

  </div> <!-- /.panel -->

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <!-- Tambahkan Data --> <? if ($_GET['act']=='tambah_libur') { ?> <div class="row">

  <div class="col-lg-12 panel-green panel-x"> <div class="panel panel-green panel-primary">

  <form action="?module=libur&act=simpan_libur" method="post"> <div class="panel-heading">

  Tambah libur </div> <div class="panel-body">

  <table> <tr>

  <td class="col-md-1"> <label>Perawat </label>

  </td> <td>

  <select class="form-control" name="tperawat" required> <? $row_perawat = mysql_query("SELECT * FROM tbl_perawat"); while($fetch = mysql_fetch_array($row_perawat)) { echo "<option value='$fetch[id_perawat]'>$fetch[nama_perawat]</option>";

  } ?> </select>

  <td> </td> </tr>

  } else { $angka = hanya_nomor($id_creat['id_libur']); $angka+=1; $angka1=sprintf("%03d", $angka); $id_libur='lbr'.$angka1;

  DESC LIMIT 1")); if(empty($id_creat['id_libur'])){ $id_libur='lbr001';

  } $id_creat=mysql_fetch_array(mysql_query("SELECT * FROM tbl_libur ORDER by id_libur

  </div> <div> <br> <? } ?> <!-- Simpan Data --> <? if ($_GET['act']=='simpan_libur'){ function hanya_nomor($semua) { return preg_replace("/[^0-9]/","", $semua);

  </form> </div>

  <button type="submit" name="button" class="btn btn- outline btn-success"><i class="fa fa-save"></i> Simpan </div>

  </table> </div> <div class="panel-footer">

  </tr> <tr>

  </td> </tr> <tr>

  </select> </td>

  $t++; } ?>

  $t=1; while($t<=31) { value='$t'>$t</option>";

  <select class="form-control" name="ttanggal" required> <?

  </td> <td>

  <td class="col-md-1"> <label>Tanggal </label>

  <td> </td> </tr> <tr>

  } $aaperawat=$_POST['tperawat']; $aatanggal=$_POST['ttanggal'];

  $cek = mysql_fetch_array(mysql_query("SELECT * FROM tbl_libur WHERE id_perawat='".$aaperawat."' AND tanggal='".$aatanggal."'")); if($cek[id_perawat]==$aaperawat AND $cek[tanggal]==$aatanggal) { ?>

  "?module=libur"}, 2000); </script> <?

  } }

  "?module=libur"}, 2000); </script> <?

  <br />'.$id_libur.mysql_error(); ?> </div> <script> setTimeout(function(){document.location.href =

  </button> <? echo '<strong>Gagal menambahkan data... </strong>

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  } else { ?> <div class="alert alert-danger alert-dismissible" role="alert">

  </button> <strong>Sukses!</strong> Berhasil menyimpan data. </div> <script> setTimeout(function(){document.location.href =

  <div class="alert alert-danger alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert">

  <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  <div class="alert alert-success alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert">

  2000); </script><? if(mysql_query("INSERT INTO tbl_libur set id_perawat = '$aaperawat', tanggal = '$aatanggal', id_libur = '$id_libur' ")){ ?>

  </div> <script> setTimeout(function(){document.location.href = "?module=libur"},

  </button> <strong>Gagal!</strong> Perawat sudah mengambil tanggal libur tersebut.

  <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  } ?> <!-- Edit Data --> <? if ($_GET['act']=='edit_libur'){

  $sql_edit = "SELECT * FROM tbl_libur a, tbl_perawat b WHERE a.id_perawat=b.id_perawat AND id_libur='".mysql_real_escape_string($_GET['id_libur'])."'";

  $row_edit = mysql_fetch_array(mysql_query($sql_edit)); ?> <div class="row">

  <div class="panel panel-info"> <form method="post" action="?module=libur&act=simpan_edit_libur">

  <div class="panel-heading"> <label>Edit libur</label>

  </div> <div class="panel-body"> <table>

  <input class="form-control" name="tid_libur" type="hidden" value="<?php echo $row_edit['id_libur'];?>"></td> <tr>

  <td class="col-md-1"> <label>Perawat </label>

  </td> <select class="form-control" name="tid_perawat"> <? $sql_p=mysql_query("SELECT *

  FROM tbl_perawat"); while($data_p=mysql_fetch_array($sql_p)) { if($data_p[id_perawat] ==

  $row_edit[id_perawat]) { echo "<option value='$data_p[id_perawat]' selected='selected'>$data_p[nama_perawat]</option>";

  } else { echo "<option value='$data_p[id_perawat]' >$data_p[nama_perawat]</option>";

  } } ?> </select>

  </td> </tr> <tr>

  <td> </td> </tr> <tr>

  <td class="col-md-1"> <label>Tanggal libur </label>

  </td> <td>

  <select class="form-control" name="ttanggal" required> <? for($tgl=1;$tgl<=30;$tgl++) { if($tgl ==

  $row_edit[tanggal]) { echo "<option value='$row_edit[tanggal]' selected='selected'>$row_edit[tanggal]</option>";

  } else { echo "<option value='$tgl'>$tgl</option>";

  } } ?>

  </select>

  </td> </tr>

  } else { if(mysql_query("UPDATE tbl_libur set id_perawat = '$id_perawat', tanggal = '$tanggal'

  } else { ?> <div class="alert alert-danger alert-dismissible" role="alert">

  2000); </script> <?

  </button> <strong>Sukses!</strong> Berhasil mengubah data. </div> <script> setTimeout(function(){document.location.href = "?module=libur"},

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  ?> <div class="alert alert-success alert-dismissible" role="alert">

  WHERE id_libur = '$id_libur' ")){

  </button> <strong>Gagal!</strong> Perawat sudah mengambil tanggal libur tersebut. </div> <script> setTimeout(function(){document.location.href = "?module=libur"}, 2000); </script><?

  </table> </div> <div class="panel-footer">

  <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  <div class="alert alert-danger alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert">

  $tanggal = $_POST['ttanggal']; $id_libur = $_POST['tid_libur']; $cek = mysql_fetch_array(mysql_query("SELECT * FROM tbl_libur WHERE id_perawat='".$id_perawat."' AND tanggal='".$tanggal."'")); if($cek[id_perawat]==$id_perawat AND $cek[tanggal]==$tanggal) { ?>

  </div> <br> <? } ?> <!-- Simpan Edit Data --> <? if ($_GET['act']=='simpan_edit_libur'){

  </form> </div>

  </tr> </div>

  <tr> <button type="submit" name="button" class="btn btn-outline btn-success"><i class="fa fa-save"></i> Simpan

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  </button> <? echo '<strong>Gagal menambahkan data... </strong> <br

  />'.$id_libur.mysql_error(); ?> </div> <script> setTimeout(function(){document.location.href = "?module=libur"},

  2000); </script> <?

  } }

  } /** <!-- Hapus Data --> **/ else if ($_GET['act']=='hapus_libur'){ if(mysql_query("DELETE FROM tbl_libur WHERE id_libur='".mysql_real_escape_string($_GET['id_libur'])."'")) { echo '<script type="text/javascript"> </script>';

  } } ?> <!-- jQuery Version 1.11.0 --> <script src="js/jquery-1.11.0.js"></script> <!-- Bootstrap Core JavaScript --> <script src="js/bootstrap.min.js"></script> <!-- Metis Menu Plugin JavaScript --> <script src="js/plugins/metisMenu/metisMenu.min.js"></script> <!-- DataTables JavaScript --> <script src="js/plugins/dataTables/jquery.dataTables.js"></script> <script src="js/plugins/dataTables/dataTables.bootstrap.js"></script> <!-- Custom Theme JavaScript --> <script src="js/penjadwalanlibur.js"></script> <!-- Page-Level Demo Scripts - Tables - Use for reference --> <script> $(document).ready(function() {

  $('#pdataTables').dataTable(); }); </script> Hitung.php <? include "koneksi/connection.php";

  // Hitung total perawat libur selama satu hari for($a=1;$a<=31;$a++) { if($result = $mysqli->query("SELECT * FROM ga_gen WHERE tanggal =

  '".$a."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J' ORDER BY nama_gen")) { /* determine number of rows result set */ $row_cnt = $result->num_rows; printf("Tanggal %d : %d perawat", $a, $row_cnt); printf("<br>"); /* close result set */ $result->close();

  } } // Hitung total hari libur yang diterima 1 perawat selama 31 hari for($b=1;$b<=21;$b++) { if($result = $mysqli->query("SELECT * FROM ga_gen WHERE id_kromosom = '".$b."' AND id_individu = '1' AND nama_gen BETWEEN 'A' AND 'J'")) {

  $total = $result-num_rows; /* determine number of rows result set */ $row_cnt = $result->num_rows; printf("Perawat %d : %d hari", $b, $row_cnt); printf("<br>"); /* close result set */ $result->close();

  } } /* close connection */ $mysqli->close();

  ?> Perawat.php <? include "koneksi/koneksi.php"; ?> <div class="row">

  <div class="col-lg-12"> <h1 class="page-header">Perawat</h1>

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <!-- Tampilkan Data --> <div class="row">

  <div class="col-lg-12"> <div class="panel panel-green panel-default panel-x">

  <div class="panel-heading"> <strong>Data Perawat</strong>

  </div> <!-- /.panel-heading --> <div class="panel-body">

  <div class="table-responsive"> <table class="table table-striped table-bordered table- hover" id="pdataTables">

  <thead> <tr>

  <th class="text- center">No</th> <th class="text-center">Nama

  Perawat</th> <th class="text- center">Edit</th> <th class="text- center">Hapus</th>

  </tr> </thead> <tbody> <?

  $sql_perawat = "SELECT * FROM tbl_perawat"; $row_perawat = mysql_query($sql_perawat); while($row = mysql_fetch_array($row_perawat)) {

  $nomor++; echo' <tr class="text-center">'; echo' <td>'.$nomor.'</td>'; echo'

  <td>'.$row['nama_perawat'].'</td>'; echo' <td> <a class="btn btn-info btn-outline btn-circle" onclick=\'document.location.href="?module=perawat&act=edit_perawat&id_perawat='.$row['id_peraw at'].'"\'><i class="fa fa-wrench"></i></a></td><td>

  <a class="btn btn-danger btn-outline btn-circle" href="?module=perawat&act=hapus_perawat&id_perawat='.$row['id_perawat'].'" onclick=\'return confirm(\'Anda yakin ingin menghapus data ini?\')\'><i class="fa fa-trash-o" ></i></a> </td>'; echo' </tr>';

  } ?> </tbody>

  <table> <tr>

  <button type="submit" name="button" class="btn btn- outline btn-success"><i class="fa fa-save"></i> Simpan </div>

  </table> </div> <div class="panel-footer">

  <td> </td> </tr>

  </tr> <tr>

  <input class="form-control" name="tnama" type="text" required> </td>

  </td> <td>

  <td class="col-md-1"> <label>Nama </label>

  Tambah Perawat </div> <div class="panel-body">

  </table> </div> <!-- /.table-responsive -->

  <form action="?module=perawat&act=simpan_perawat" method="post"> <div class="panel-heading">

  <div class="col-lg-12 panel-green panel-x"> <div class="panel panel-green panel-primary">

  </div> <!-- /.row --> <!-- Tambahkan Data --> <? if ($_GET['act']=='tambah_perawat') { ?> <div class="row">

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.panel -->

  </a> </div>

  <a class="btn btn-outline btn-success" href="?module=perawat&act=tambah_perawat")> <i class="fa fa-plus"></i> Tambah

  </div> <!-- /.panel-body --> <div class="panel-footer">

  </form> </div>

  </div> <div> <br> <? } ?> <!-- Simpan Data --> <? if ($_GET['act']=='simpan_perawat'){

  <input class="form-control" name="id_perawat" type="hidden" value="<?php echo $row_edit['id_perawat'];?>"></td> <tr>

  <tr> <button type="submit" name="button" class="btn btn-outline btn-success"><i class="fa fa-save"></i> Simpan

  </table> </div> <div class="panel-footer">

  <td> </td> </tr>

  </tr> <tr>

  <input class="form-control" name="tnama" type="text" value="<?php echo $row_edit['nama_perawat']?>"> </td>

  </td> <td>

  <td class="col-md-1"> <label>Nama </label>

  </div> <div class="panel-body"> <table>

  $aanama=$_POST['tnama']; if(mysql_query("INSERT INTO tbl_perawat set nama_perawat = '$aanama', id_perawat = '' ")){ echo '

  <div class="panel-heading"> <label>Edit Perawat</label>

  <div class="panel panel-info"> <form method="post" action="?module=perawat&act=simpan_edit_perawat">

  $row_edit = mysql_fetch_array(mysql_query($sql_edit)); ?> <div class="row">

  $sql_edit = "SELECT * FROM tbl_perawat WHERE id_perawat = '".mysql_real_escape_string($_GET['id_perawat'])."'";

  } ?> <!-- Edit Data --> <? if ($_GET['act']=='edit_perawat'){

  } else { }

  <script type="text/javascript"> document.location.href = \'?module=perawat\' </script>';

  </tr>

  </div> </form>

  </div> </div> <br> <?

  } ?> <!-- Simpan Edit Data --> <? if ($_GET['act']=='simpan_edit_perawat'){

  $nama_perawat = $_POST['tnama']; $id_perawat = $_POST['id_perawat']; if(mysql_query("UPDATE tbl_perawat SET nama_perawat='$nama_perawat'

  WHERE id_perawat='$id_perawat'")) { ?> <div class="alert alert-success alert-dismissible" role="alert">

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span>

  </button> <strong>Sukses!</strong> Berhasil mengubah data. </div> <script> setTimeout(function(){document.location.href = "?module=perawat"},

  2000); </script>

  <? } else { ?> <div class="alert alert-warning alert-dismissible" role="alert">

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  </button> <strong>Gagal!</strong> Tidak berhasil mengubah data. </div> <script> setTimeout(function(){document.location.href = "?module=perawat"},

  2000); </script>

  <? } } /** <!-- Hapus Data --> **/ else if ($_GET['act']=='hapus_perawat'){ if(mysql_query("DELETE FROM tbl_perawat WHERE id_perawat='".mysql_real_escape_string($_GET['id_perawat'])."'")) { echo '<script type="text/javascript"> document.location.href = \'?module=perawat\' </script>';

  } } ?> <!-- jQuery Version 1.11.0 --> <script src="js/jquery-1.11.0.js"></script> <!-- Bootstrap Core JavaScript --> <script src="js/bootstrap.min.js"></script>

  <!-- Metis Menu Plugin JavaScript --> <script src="js/plugins/metisMenu/metisMenu.min.js"></script> <!-- DataTables JavaScript --> <script src="js/plugins/dataTables/jquery.dataTables.js"></script> <script src="js/plugins/dataTables/dataTables.bootstrap.js"></script> <!-- Custom Theme JavaScript --> <script src="js/penjadwalanperawat.js"></script> <!-- Page-Level Demo Scripts - Tables - Use for reference --> <script> $(document).ready(function() {

  $('#pdataTables').dataTable(); }); </script> Ruangan.php <? include "koneksi/koneksi.php"; ?> <div class="row">

  <div class="col-lg-12"> <h1 class="page-header">Ruangan</h1>

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <!-- Tampilkan Data --> <div class="row">

  <div class="col-lg-12"> <div class="panel panel-green panel-default panel-x">

  <div class="panel-heading"> <strong>Data Ruangan</strong>

  </div> <!-- /.panel-heading --> <div class="panel-body">

  <div class="table-responsive"> <table class="table table-striped table-bordered table- hover" id="pdataTables">

  <thead> <tr>

  <th class="text- center">No</th> <th class="text-center">Nama

  Ruangan</th> <th class="text- center">Edit</th> <th class="text- center">Hapus</th>

  </tr> </thead> <tbody> <?

  $sql_ruangan = "SELECT * FROM tbl_ruangan"; $row_ruangan = mysql_query($sql_ruangan); while($row = mysql_fetch_array($row_ruangan)) {

  $nomor++; echo' <tr class="text-center">'; echo' <td>'.$nomor.'</td>'; echo'

  <td>'.$row['nama_ruangan'].'</td>'; echo' <td> <a class="btn btn-info btn-outline btn-circle" onclick=\'document.location.href="?module=ruangan&act=edit_ruangan&id_ruangan='.$row['id_ruang an'].'"\'>

  <i class="fa fa-wrench"></i> </a></td><td>

  <a class="btn btn-danger btn-outline btn-circle" href="?module=ruangan&act=hapus_ruangan&id_ruangan='.$row['id_ruangan'].'" onclick=\'return confirm(\'Anda yakin ingin menghapus data ini?\')\'>

  <i class="fa fa-trash-o"></i> </a>

  </td>'; echo' </tr>'; } ?>

  </tbody> </table>

  </div> <!-- /.table-responsive -->

  </div> <!-- /.panel-body --> <div class="panel-footer"> href="?module=ruangan&act=tambah_ruangan")>

  <i class="fa fa-plus"></i> Tambah </a>

  </div> <!-- /.panel-footer -->

  </div> <!-- /.panel -->

  </div> <!-- /.col-lg-12 -->

  </div> <!-- /.row --> <!-- Tambahkan Data --> <? if ($_GET['act']=='tambah_ruangan') { ?> <div class="row">

  <div class="col-lg-12 panel-green panel-x"> <div class="panel panel-green panel-primary">

  <form action="?module=ruangan&act=simpan_ruangan" method="post"> <div class="panel-heading">

  Tambah Ruangan </div> <div class="panel-body">

  <table> <tr>

  <td class="col-md-1"> <label>Nama </label>

  </td> <td>

  <input class="form-control" name="tnama" type="text" required> </td>

  </tr> <tr>

  <td> </td> </tr>

  </table> </div>

  <div class="panel-footer"> <button type="submit" name="button" class="btn btn- outline btn-success"><i class="fa fa-save"></i> Simpan

  </div> </form>

  </div> </div>

  <div> <br> <? } ?> <!-- Simpan Data --> <? if ($_GET['act']=='simpan_ruangan'){

  $aanama=$_POST['tnama']; if(mysql_query("INSERT INTO tbl_ruangan set nama_ruangan = '$aanama', id_ruangan = '' echo '

  <script type="text/javascript"> document.location.href = \'?module=ruangan\' </script>';

  } else { echo '<b>Gagal menambahkan data...</b> <br />'.$id_ruangan.mysql_error(); }

  } ?> <!-- Edit Data --> <? if ($_GET['act']=='edit_ruangan'){

  $sql_edit = "SELECT * FROM tbl_ruangan WHERE id_ruangan = '".mysql_real_escape_string($_GET['id_ruangan'])."'";

  $row_edit = mysql_fetch_array(mysql_query($sql_edit)); ?> <div class="row">

  <div class="panel panel-info"> <form method="post" action="?module=ruangan&act=simpan_edit_ruangan">

  <div class="panel-heading"> <label>Edit Ruangan</label>

  </div> <div class="panel-body"> <table class="table table-striped table-bordered table-hover" id="dataTables">

  <input class="form-control" name="id_ruangan" type="hidden" value="<?php echo $row_edit['id_ruangan'];?>"></td> <tr>

  <td class="col-md-1"> <label>Nama </label>

  </td> <td>

  <input class="form-control" name="tnama" type="text" value="<?php echo $row_edit['nama_ruangan']?>"> </td>

  </tr> <tr>

  <td> </td> </tr>

  </table> </div> <div class="panel-footer">

  <tr> <button type="submit" name="button" class="btn btn-outline btn-success"><i class="fa fa-save"></i> Simpan

  </tr> </div>

  </form> </div>

  </div> <br> <? } ?> <!-- Simpan Edit Data --> <? if ($_GET['act']=='simpan_edit_ruangan'){

  $nama_ruangan = $_POST['tnama']; $id_ruangan = $_POST['id_ruangan'];

  WHERE id_ruangan='$id_ruangan'")) { ?> <div class="alert alert-success alert-dismissible" role="alert">

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  </button> <strong>Sukses!</strong> Berhasil mengubah data. </div> <script> setTimeout(function(){document.location.href = "?module=ruangan"},

  2000); </script>

  <? } else { ?> <div class="alert alert-warning alert-dismissible" role="alert">

  <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span>

  </button> <strong>Gagal!</strong> Tidak berhasil mengubah data. </div> <script> setTimeout(function(){document.location.href = "?module=ruangan"},

  2000); </script>

  <? } } /** <!-- Hapus Data --> **/ else if ($_GET['act']=='hapus_ruangan'){ if(mysql_query("DELETE FROM tbl_ruangan WHERE id_ruangan='".mysql_real_escape_string($_GET['id_ruangan'])."'")) { echo '<script type="text/javascript"> document.location.href = \'?module=ruangan\' </script>';

  } } ?>

  <!-- jQuery Version 1.11.0 --> <script src="js/jquery-1.11.0.js"></script> <!-- Bootstrap Core JavaScript --> <script src="js/bootstrap.min.js"></script> <!-- Metis Menu Plugin JavaScript --> <script src="js/plugins/metisMenu/metisMenu.min.js"></script> <!-- DataTables JavaScript --> <script src="js/plugins/dataTables/jquery.dataTables.js"></script> <script src="js/plugins/dataTables/dataTables.bootstrap.js"></script> <!-- Custom Theme JavaScript --> <script src="js/penjadwalanperawat.js"></script> <!-- Page-Level Demo Scripts - Tables - Use for reference --> $(document).ready(function() {

  $('#pdataTables').dataTable(); }); </script> <?php /**

  • @package dompdf
  • @link http://dompdf.github.com/
  • @author Benj Carson <benjcarson@digitaljunkies.ca>
  • @author Helmut Tischer <htischer@weihenstephan.org>
  • @author Fabien Ménager <fabien.menager@gmail.com>
  • @autho Brian Sweeney <eclecticgeek@gmail.com>
  • @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ if ( class_exists( 'DOMPDF' , false ) ) { return; } PHP_VERSION >= 5.0 or die("DOMPDF requires PHP 5.0+"); /**
  • The root of your DOMPDF installation
  • / define("DOMPDF_DIR", str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__)))); /**
  • The location of the DOMPDF include directory
  • / define("DOMPDF_INC_DIR", DOMPDF_DIR . "/include"); /**
  • The location of the DOMPDF lib directory
  • / define("DOMPDF_LIB_DIR", DOMPDF_DIR . "/lib"); /**
  • Some installations don't have $_SERVER['DOCUMENT_ROOT']
  • http://fyneworks.blogspot.com/2007/08/php-documentroot-in-iis-windows-servers.html
    • / if( !isset($_SERVER['DOCUMENT_ROOT']) ) { $path = ""; if ( isset($_SERVER['SCRIPT_FILENAME']) ) $path = $_SERVER['SCRIPT_FILENAME']; elseif ( isset($_SERVER['PATH_TRANSLATED']) ) $path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']); $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($path, 0, 0- strlen($_SERVER['PHP_SELF']))); }

      /** Include the custom config file if it exists */ if ( file_exists(DOMPDF_DIR . "/dompdf_config.custom.inc.php") ){ require_once(DOMPDF_DIR . "/dompdf_config.custom.inc.php"); } //FIXME: Some function definitions rely on the constants defined by DOMPDF. However, might this location prove problematic? require_once(DOMPDF_INC_DIR . "/functions.inc.php"); /**

    • Username and password used by the configuration utility in www/
    • / def("DOMPDF_ADMIN_USERNAME", "user"); def("DOMPDF_ADMIN_PASSWORD", "password"); /**
    • The location of the DOMPDF font directory
    • The location of the directory where DOMPDF will store fonts and font metrics * Note: This directory must exist and be writable by the webserver process.
    • Please note the trailing slash.*
    • Notes regarding fonts: * Additional .afm font metrics can be added by executing load_font.php from command line.
    • Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must
    • be embedded in the pdf file or the PDF may not display correctly. This can significantly
    • increase file size unless font subsetting is enabled. Before embedding a font please * review your rights under the font license.
    • Any font specification in the source HTML is translated to the closest font available * in the font directory.
    • >The pdf standard "Base 14 fonts" are:
    • Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique,
    • Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique,
    • Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, * Symbol, ZapfDingbats.
    • / def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/"); /**
    • The location of the DOMPDF font cache directory
      • This directory contains the cached font metrics for the fonts used by DOMPDF.
      • This directory can be the same as DOMPDF_FONT_DIR
      • Note: This directory must exist and be writable by the webserver process.
      • / def("DOMPDF_FONT_CACHE", DOMPDF_FONT_DIR); /** * The location of a temporary directory.
      • The directory specified must be writeable by the webserver process.
      • The temporary directory is required to download remote images and when * using the PFDLib back end.
      • / def("DOMPDF_TEMP_DIR", sys_get_temp_dir()); /**
      • dompdf's "chroot": Prevents dompdf from accessing system files or other
      • files on the webserver. All local files opened by dompdf must be in a
      • subdirectory of this directory. DO NOT set it to '/' since this could
      • allow an attacker to use dompdf to read any files on the server. This * should be an absolute path.
      • This is only checked on command line call by dompdf.php, but not by
      • direct class use like:
      • $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output();
      • / def("DOMPDF_CHROOT", realpath(DOMPDF_DIR)); /** * Whether to use Unicode fonts or not.
      • When set to true the PDF backend must be set to "CPDF" and fonts must be * loaded via load_font.php.
      • When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a * document must be present in your fonts, however.
      • / def("DOMPDF_UNICODE_ENABLED", true); /** * Whether to enable font subsetting or not.
      • / def("DOMPDF_ENABLE_FONTSUBSETTING", false); /**
      • The PDF rendering backend to use
      • Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and
      • 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will
      • fall back on CPDF. 'GD' renders PDFs to graphic files. {@link
      • Canvas_Factory} ultimately determines which rendering class to instantiate * based on this setting.
      • Both PDFLib & CPDF rendering backends provide sufficient rendering
      • capabilities for dompdf, however additional features (e.g. object,
      • image and font support, etc.) differ between backends. Please see
      • {@link PDFLib_Adapter} for more information on the PDFLib backend
      • and {@link CPDF_Adapter} and lib/class.pdf.php for more information
      • on CPDF. Also see the documentation for each backend at the links * below.

      • The GD rendering backend is a little different than PDFLib and
      • CPDF. Several features of CPDF and PDFLib are not supported or do
      • not make any sense when creating image files. For example,
      • multiple pages are not supported, nor are PDF 'objects'. Have a
      • look at {@link GD_Adapter} for more information. GD support is * experimental, so use it at your own risk.
      • @link http://www.pdflib.com
      • @link http://www.ros.co.nz/pdf
      • @link http://www.php.net/image def("DOMPDF_PDF_BACKEND", "CPDF"); /**
      • PDFlib license key
      • If you are using a licensed, commercial version of PDFlib, specify
      • your license key here. If you are using PDFlib-Lite or are evaluating * the commercial version of PDFlib, comment out this setting.
      • @link http://www.pdflib.com
      • If pdflib present in web server and auto or selected explicitely above,
      • a real license code must exist!
      • / //def("DOMPDF_PDFLIB_LICENSE", "your license key here"); /** * html target media view which should be rendered into pdf.
      • List of types and parsing rules for future extensions:
      • http://www.w3.org/TR/REC-html40/types.html
      • screen, tty, tv, projection, handheld, print, braille, aural, all * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3.
      • Note, even though the generated pdf file is intended for print output, * the desired content might be different (e.g. screen or projection view of html file).
      • Therefore allow specification of content here.
      • / def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen"); /** * The default paper size.
      • North America standard is "letter"; other countries generally "a4"
      • >@see CPDF_Adapter::PAPER_SIZES for valid sizes
      • / def("DOMPDF_DEFAULT_PAPER_SIZE", "letter"); /**
      • The default font family
        • Used if no suitable fonts can be found. This must exist in the font folder.
        • @var string
        • / def("DOMPDF_DEFAULT_FONT", "serif"); /**
        • Image DPI setting
        • This setting determines the default DPI setting for images and fonts. The * DPI may be overridden for inline images by explictly setting the
        • image's width & height style attributes (i.e. if the image's native
        • width is 600 pixels and you specify the image's width as 72 points,
        • the image will have a DPI of 600 in the rendered PDF. The DPI of
        • background images can not be overridden and is controlled entirely * via this parameter.
        • If a size in html is given as px (or without unit as image size), * this tells the corresponding size in pt at 72 DPI.
        • This adjusts the relative sizes to be similar to the rendering of the * html page in a reference browser.
        • In pdf, always 1 pt = 1/72 inch
        • Rendering resolution of various browsers in px per inch:
        • Windows Firefox and Internet Explorer:
        • SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:?
        • Linux Firefox:
        • about:config *resolution: Default:96
        • (xorg screen dimension in mm and Desktop font dpi settings are ignored)
        • Take care about extra font/image zoom factor of browser.
        • In images, <img> size in pixel attribute, img css style, are overriding * the real image dimension in px for rendering.
        • @var int
        • / def("DOMPDF_DPI", 96); /**
        • Enable inline PHP
        • If this setting is set to true then DOMPDF will automatically evaluate * inline PHP contained within <script type="text/php"> ... </script> tags.
        • Enabling this for documents you do not trust (e.g. arbitrary remote html
        • pages) is a security risk. Set this option to false if you wish to process * untrusted documents.
        • >@var bool
        • / def("DOMPDF_ENABLE_PHP", false); /**
        • Enable inline Javascript
          • If this setting is set to true then DOMPDF will automatically insert * JavaScript code contained within <script type="text/javascript"> ... </script> tags.
          • @var bool
          • / def("DOMPDF_ENABLE_JAVASCRIPT", true); /**
          • Enable remote file access
          • If this setting is set to true, DOMPDF will access remote sites for * images and CSS files as required.
          • This is required for part of test case www/test/image_variants.html through www/examples.php
          • Attention!
          • This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and
          • $dompdf = new DOMPDF(); $dompdf->load_html(...);
          • This allows anonymous users to download legally doubtful internet content which on
          • tracing back appears to being downloaded by your server, or allows malicious php code * in remote html pages to be executed by your server with your account privileges.
          • @var bool
          • / def("DOMPDF_ENABLE_REMOTE", false); /**
          • The debug output log
          • @var string
          • / def("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm"); /**
          • A ratio applied to the fonts height to be more like browsers' line height
          • / def("DOMPDF_FONT_HEIGHT_RATIO", 1.1); /**
          • Enable CSS float
          • Allows people to disabled CSS float support
          • @var bool
          • / def("DOMPDF_ENABLE_CSS_FLOAT", false); /**
          • Enable the built in DOMPDF autoloader
          • @var bool
          • / def("DOMPDF_ENABLE_AUTOLOAD", true); /**
          • Prepend the DOMPDF autoload function to the spl_autoload stack
          • @var bool
          • / def("DOMPDF_AUTOLOAD_PREPEND", false); /**
          • Use the more-than-experimental HTML5 Lib parser
          • / def("DOMPDF_ENABLE_HTML5PARSER", false); require_once(DOMPDF_LIB_DIR . "/html5lib/Parser.php"); // ### End of user-configurable options ### /**
          • Load autoloader
          • / if (DOMPDF_ENABLE_AUTOLOAD) { require_once(DOMPDF_INC_DIR . "/autoload.inc.php"); require_once(DOMPDF_LIB_DIR . "/php-font-lib/classes/Font.php"); /** * Ensure that PHP is working with text internally using UTF8 character encoding.
          • / mb_internal_encoding('UTF-8'); /**
          • Global array of warnings generated by DomDocument parser and
          • stylesheet class

          • @var array
          • / global $_dompdf_warnings; $_dompdf_warnings = array(); /**
          • If true, $_dompdf_warnings is dumped on script termination when using * dompdf/dompdf.php or after rendering when using the DOMPDF class.
          • When using the class, setting this value to true will prevent you from * streaming the PDF.
          • @var bool
          • / global $_dompdf_show_warnings; $_dompdf_show_warnings = false; /** * If true, the entire tree is dumped to stdout in dompdf.cls.php.
          • Setting this value to true will prevent you from streaming the PDF.
          • @var bool
          • / global $_dompdf_debug; $_dompdf_debug = false; /**
          • Array of enabled debug message types
          • @var array
          • / global $_DOMPDF_DEBUG_TYPES; $_DOMPDF_DEBUG_TYPES = array(); //array("page-break" => 1); /* Optionally enable different classes of debug output before the pdf content.
          • Visible if displaying pdf as text,
          • E.g. on repeated display of same pdf in browser when pdf is not taken out of * the browser cache and the premature output prevents setting of the mime type.
          • / def('DEBUGPNG', false); def('DEBUGKEEPTEMP', false); def('DEBUGCSS', false); /* Layout debugging. Will display rectangles around different block levels.
          • Visible in the PDF itself.
          • / def('DEBUG_LAYOUT', false); def('DEBUG_LAYOUT_BLOCKS', true); def('DEBUG_LAYOUT_INLINE', true); def('DEBUG_LAYOUT_PADDINGBOX', true); <?php /** * Command line utility to use dompdf.
          • Can also be used with HTTP GET parameters

          • @package dompdf
          • @link http://dompdf.github.com/
          • @author Benj Carson <benjcarson@digitaljunkies.ca>
          • @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /**
          • Display command line usage
          • / function dompdf_usage() { $default_paper_size = DOMPDF_DEFAULT_PAPER_SIZE; echo <<<EOD Usage: {$_SERVER["argv"][0]} [options] html_file html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' character to read from standard input. Options:
            • h Show this message
            • l List available paper sizes -p size Paper size; something like 'letter', 'A4', 'legal', etc. The default is '$default_paper_size'
            • o orientation Either 'portrait' or 'landscape'. Default is 'portrait' -b path Set the 'document root' of the html_file. Relative urls (for stylesheets) are resolved using this directory. Default is the directory of html_file.
            • f file The output filename. Default is the input [html_file].pdf -v Verbose: display html parsing warnings and file not found errors.
            • d Very verbose: display oodles of debugging output: every frame
            • in the tree printed to stdout.

            • t Comma separated list of debugging types (page-break,reflow,split) EOD; exit; } /**
              • Parses command line options
              • @return array The command line options
              • / function getoptions() { $opts = array(); if ( $_SERVER["argc"] == 1 ) $i = 1; while ($i < $_SERVER["argc"]) { switch ($_SERVER["argv"][$i]) { case "--help": case "-h": $opts["h"] = true; $i++; break; case "-l": $opts["l"] = true;

              $i++; break; case "-p": if ( !isset($_SERVER["argv"][$i+1]) ) die("-p switch requires a size parameter\n"); $opts["p"] = $_SERVER["argv"][$i+1]; $i += 2; break; case "-o": if ( !isset($_SERVER["argv"][$i+1]) ) die("-o switch requires an orientation parameter\n"); $opts["o"] = $_SERVER["argv"][$i+1]; $i += 2; break; case "-b": if ( !isset($_SERVER["argv"][$i+1]) ) die("-b switch requires a path parameter\n"); $opts["b"] = $_SERVER["argv"][$i+1]; $i += 2; break; case "-f": if ( !isset($_SERVER["argv"][$i+1]) ) die("-f switch requires a filename parameter\n"); $opts["f"] = $_SERVER["argv"][$i+1]; $i += 2; break; case "-v": $opts["v"] = true; $i++; break; case "-d": $opts["d"] = true; $i++; break; case "-t": die("-t switch requires a comma separated list of types\n"); $opts["t"] = $_SERVER['argv'][$i+1]; $i += 2; break; default: $opts["filename"] = $_SERVER["argv"][$i]; $i++; break; } } return $opts; } require_once("dompdf_config.inc.php"); global $_dompdf_show_warnings, $_dompdf_debug, $_DOMPDF_DEBUG_TYPES; $sapi = php_sapi_name(); $options = array(); switch ( $sapi ) { case "cli": $opts = getoptions(); if ( isset($opts["h"]) || (!isset($opts["filename"]) && !isset($opts["l"])) ) { dompdf_usage(); exit; } if ( isset($opts["l"]) ) { echo "\nUnderstood paper sizes:\n"; foreach (array_keys(CPDF_Adapter::$PAPER_SIZES) as $size) echo " " . mb_strtoupper($size) . "\n"; exit; }

              $file = $opts["filename"]; if ( isset($opts["p"]) ) $paper = $opts["p"]; else $paper = DOMPDF_DEFAULT_PAPER_SIZE; if ( isset($opts["o"]) ) $orientation = $opts["o"]; else $orientation = "portrait"; if ( isset($opts["b"]) ) $base_path = $opts["b"]; if ( isset($opts["f"]) ) $outfile = $opts["f"]; if ( $file === "-" ) $outfile = "dompdf_out.pdf"; else $outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf"; } if ( isset($opts["v"]) ) $_dompdf_show_warnings = true; if ( isset($opts["d"]) ) { $_dompdf_show_warnings = true; $_dompdf_debug = true; } if ( isset($opts['t']) ) { $arr = split(',',$opts['t']); $types = array(); foreach ($arr as $type) $types[ trim($type) ] = 1; $_DOMPDF_DEBUG_TYPES = $types; } $save_file = true; break; default: if ( isset($_GET["input_file"]) ) $file = rawurldecode($_GET["input_file"]); else throw new DOMPDF_Exception("An input file is required (i.e. input_file _GET variable)."); if ( isset($_GET["paper"]) ) $paper = rawurldecode($_GET["paper"]); else $paper = DOMPDF_DEFAULT_PAPER_SIZE; if ( isset($_GET["orientation"]) )

              $orientation = rawurldecode($_GET["orientation"]); else $orientation = "portrait"; if ( isset($_GET["base_path"]) ) { $base_path = rawurldecode($_GET["base_path"]); $file = $base_path . $file; # Set the input file } if ( isset($_GET["options"]) ) { $options = $_GET["options"]; } $file_parts = explode_url($file); /* Check to see if the input file is local and, if so, that the base path falls within that specified by DOMDPF_CHROOT */ $file = realpath($file); if ( strpos($file, DOMPDF_CHROOT) !== 0 ) { throw new DOMPDF_Exception("Permission denied on $file. The file could not be found under the directory specified by DOMPDF_CHROOT."); } } if($file_parts['protocol'] === 'php://') { throw new DOMPDF_Exception("Permission denied on $file. This script does not allow PHP streams."); } $outfile = "dompdf_out.pdf"; # Don't allow them to set the output file $save_file = false; # Don't save the file break; } $dompdf = new DOMPDF(); if ( $file === "-" ) { $str = ""; while ( !feof(STDIN) ) $str .= fread(STDIN, 4096); $dompdf->load_html($str); } else $dompdf->load_html_file($file); if ( isset($base_path) ) { $dompdf->set_base_path($base_path); } $dompdf->set_paper($paper, $orientation); $dompdf->render(); if ( $_dompdf_show_warnings ) { global $_dompdf_warnings; foreach ($_dompdf_warnings as $msg) echo $msg . "\n"; echo $dompdf->get_canvas()->get_cpdf()->messages; flush(); } if ( $save_file ) { // if ( !is_writable($outfile) ) // throw new DOMPDF_Exception("'$outfile' is not writable."); if ( strtolower(DOMPDF_PDF_BACKEND) === "gd" ) $outfile = str_replace(".pdf", ".png", $outfile); list($proto, $host, $path, $file) = explode_url($outfile); if ( $proto != "" ) // i.e. not file:// $outfile = $file; // just save it locally, FIXME? could save it like wget: ./host/basepath/file if ( strpos($outfile, DOMPDF_CHROOT) !== 0 ) throw new DOMPDF_Exception("Permission denied."); file_put_contents($outfile, $dompdf->output( array("compress" => 0) )); exit(0); } if ( !headers_sent() ) { $dompdf->stream($outfile, $options); } <?php /**

            • @package dompdf
            • @link http://dompdf.github.com/
            • @author Benj Carson <benjcarson@digitaljunkies.ca>
            • @author Helmut Tischer <htischer@weihenstephan.org>
            • @author Fabien Ménager <fabien.menager@gmail.com>
            • @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /**
            • Base renderer class
            • @access private
            • @package dompdf
            • / abstract class Abstract_Renderer { /**
            • Rendering backend
            • >@var Canvas */ protected $_canvas; /**
            • Current dompdf instance
              • @var DOMPDF
              • / protected $_dompdf; /**
              • Class constructor
              • @param DOMPDF $dompdf The current dompdf instance
              • / function __construct(DOMPDF $dompdf) { $this->_dompdf = $dompdf; $this->_canvas = $dompdf->get_canvas(); } /** * Render a frame.
              • Specialized in child classes
              • @param Frame $frame The frame to render
              • / abstract function render(Frame $frame); //........................................................................ /**
              • Render a background image over a rectangular area
              • @param string $url The background image to load
              • @param float $x The left edge of the rectangular area
              • @param float $y The top edge of the rectangular area
              • @param float $width The width of the rectangular area
              • @param float $height The height of the rectangular area
              • @param Style $style The associated Style object
              • @throws Exception */ protected function _background_image($url, $x, $y, $width, $height, $style) { if ( !function_exists("imagecreatetruecolor") ) { throw new Exception("The PHP GD extension is required, but is not installed."); } $sheet = $style->get_stylesheet(); // Skip degenerate cases if ( $width == 0 || $height == 0 ) { return; }

                $box_width = $width; $box_height = $height; //debugpng if (DEBUGPNG) print '[_background_image '.$url.']'; list($img, $type, /*$msg*/) = Image_Cache::resolve_url(

                $url, $sheet->get_protocol(), $sheet->get_host(), $sheet->get_base_path(), $this->_dompdf ); // Bail if the image is no good if ( Image_Cache::is_broken($img) ) { return; } //Try to optimize away reading and composing of same background multiple times //Postponing read with imagecreatefrom ...() //final composition parameters and name not known yet //Therefore read dimension directly from file, instead of creating gd object first.

                //$img_w = imagesx($src); $img_h = imagesy($src); list($img_w, $img_h) = dompdf_getimagesize($img); if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) { return; } $repeat = $style->background_repeat; $dpi = $this->_dompdf->get_option("dpi"); //Increase background resolution and dependent box size according to image resolution to be placed in //Then image can be copied in without resize $bg_width = round((float)($width * $dpi) / 72); $bg_height = round((float)($height * $dpi) / 72); //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel list($bg_x, $bg_y) = $style->background_position; if ( is_percent($bg_x) ) { // The point $bg_x % from the left edge of the image is placed // $bg_x % from the left edge of the background rectangle $p = ((float)$bg_x)/100.0; $x1 = $p * $img_w; $x2 = $p * $bg_width; $bg_x = $x2 - $x1; } else { $bg_x = (float)($style->length_in_pt($bg_x)*$dpi) / 72; } $bg_x = round($bg_x + $style->length_in_pt($style->border_left_width)*$dpi / 72); if ( is_percent($bg_y) ) { // The point $bg_y % from the left edge of the image is placed // $bg_y % from the left edge of the background rectangle $p = ((float)$bg_y)/100.0; $y1 = $p * $img_h; $y2 = $p * $bg_height;

                $bg_y = $y2 - $y1; } else { $bg_y = (float)($style->length_in_pt($bg_y)*$dpi) / 72; } $bg_y = round($bg_y + $style->length_in_pt($style->border_top_width)*$dpi / 72); //clip background to the image area on partial repeat. Nothing to do if img off area //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area //On no repeat with positive offset: move size/start to have offset==0 //Handle x/y Dimensions separately if ( $repeat !== "repeat" && $repeat !== "repeat-x" ) { //No repeat x if ($bg_x < 0) { } else { $x += ($bg_x * 72)/$dpi; $bg_width = $bg_width - $bg_x; if ($bg_width > $img_w) { $bg_width = $img_w; } $bg_x = 0; } if ($bg_width <= 0) { return; } $width = (float)($bg_width * 72)/$dpi; } else { //repeat x if ($bg_x < 0) { $bg_x = - ((-$bg_x) % $img_w); } else { $bg_x = $bg_x % $img_w; if ($bg_x > 0) { $bg_x -= $img_w; } } } if ( $repeat !== "repeat" && $repeat !== "repeat-y" ) { //no repeat y if ($bg_y < 0) { $bg_height = $img_h + $bg_y; } else { $y += ($bg_y * 72)/$dpi; $bg_height = $bg_height - $bg_y; if ($bg_height > $img_h) { $bg_height = $img_h;

                } $bg_y = 0; } if ($bg_height <= 0) { return; } $height = (float)($bg_height * 72)/$dpi; } else { //repeat y if ($bg_y < 0) { $bg_y = - ((-$bg_y) % $img_h); } else { $bg_y = $bg_y % $img_h; if ($bg_y > 0) { $bg_y -= $img_h; } } //Optimization, if repeat has no effect if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) { $repeat = "repeat-x"; } if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) { $repeat = "repeat-y"; } if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) || ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) { $repeat = "no-repeat"; } //Use filename as indicator only //different names for different variants to have different copies in the pdf //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) //Note: Here, bg_* are the start values, not end values after going through the tile loops! $filedummy = $img; $is_png = false; $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat; //Optimization to avoid multiple times rendering the same image.

                //If check functions are existing and identical image already cached, //then skip creation of duplicate, because it is not needed by addImagePng if ( $this->_canvas instanceof CPDF_Adapter && $this->_canvas->get_cpdf()->image_iscached($filedummy) ) { $bg = null; } else { // Create a new image to fit over the background rectangle

                $bg = imagecreatetruecolor($bg_width, $bg_height); switch (strtolower($type)) { case IMAGETYPE_PNG: $is_png = true; imagesavealpha($bg, true); imagealphablending($bg, false); $src = imagecreatefrompng($img); break; case IMAGETYPE_JPEG: $src = imagecreatefromjpeg($img); break; case IMAGETYPE_GIF: $src = imagecreatefromgif($img); break; case IMAGETYPE_BMP: $src = imagecreatefrombmp($img); break; default: return; // Unsupported image type } if ( $src == null ) { return; } //Background color if box is not relevant here //Non transparent image: box clipped to real size. Background non relevant. //Transparent image: The image controls the transparency and lets shine through whatever background. //However on transparent image preset the composed image with the transparency color, //to keep the transparency when copying over the non transparent parts of the tiles. $ti = imagecolortransparent($src); if ( $ti >= 0 ) { $tc = imagecolorsforindex($src, $ti); $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']); imagefill($bg, 0, 0, $ti); imagecolortransparent($bg, $ti); } //This has only an effect for the non repeatable dimension. //compute start of src and dest coordinates of the single copy if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; } else { $src_x = 0; $dst_x = $bg_x; } if ( $bg_y < 0 ) {

                $dst_y = 0; $src_y = -$bg_y; } else { $src_y = 0; $dst_y = $bg_y; } //For historical reasons exchange meanings of variables: //start_* will be the start values, while bg_* will be the temporary start values in the loops $start_x = $bg_x; $start_y = $bg_y; // Copy regions from the source image to the background if ( $repeat === "no-repeat" ) { // Simply place the image on the background } else if ( $repeat === "repeat-x" ) { for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; $w = $img_w + $bg_x; } else { $dst_x = $bg_x; $src_x = 0; $w = $img_w; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); } } else if ( $repeat === "repeat-y" ) { for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { if ( $bg_y < 0 ) { $dst_y = 0; $src_y = -$bg_y; $h = $img_h + $bg_y; } else { $dst_y = $bg_y; $src_y = 0; $h = $img_h; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); } } else if ( $repeat === "repeat" ) { for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; $w = $img_w + $bg_x; } else { $dst_x = $bg_x; $src_x = 0; $w = $img_w; } if ( $bg_y < 0 ) { $dst_y = 0; $src_y = -$bg_y; } else { $dst_y = $bg_y; $src_y = 0; $h = $img_h; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); } } } else { print 'Unknown repeat!'; } imagedestroy($src); } /* End optimize away creation of duplicates */ $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height); //img: image url string //img_w, img_h: original image size in px //width, height: box size in pt //bg_width, bg_height: box size in px //x, y: left/top edge of box on page in pt //start_x, start_y: placement of image relative to pattern //$repeat: repeat mode //$bg: GD object of result image //$src: GD object of original image //When using cpdf and optimization to direct png creation from gd object is available, //don't create temp file, but place gd object directly into the pdf if ( !$is_png && $this->_canvas instanceof CPDF_Adapter ) { // Note: CPDF_Adapter image converts y position $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg); } else {

                $tmp_dir = $this->_dompdf->get_option("temp_dir"); $tmp_name = tempnam($tmp_dir, "bg_dompdf_img_"); @unlink($tmp_name); $tmp_file = "$tmp_name.png"; //debugpng if (DEBUGPNG) print '[_background_image '.$tmp_file.']'; imagepng($bg, $tmp_file); $this->_canvas->image($tmp_file, $x, $y, $width, $height); imagedestroy($bg); //debugpng if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']'; if (!DEBUGKEEPTEMP) { unlink($tmp_file); } $this->_canvas->clipping_end(); } protected function _get_dash_pattern($style, $width) { $pattern = array(); switch ($style) { default: /*case "solid": case "double": case "groove": case "inset": case "outset": case "ridge":*/ case "none": break; case "dotted": if ( $width <= 1 ) $pattern = array($width, $width*2); else $pattern = array($width); break; case "dashed": $pattern = array(3 * $width); break; } return $pattern; } protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { return; } protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { return; } // Border rendering functions protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2); } protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2); } protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { // TODO: Solve rendering where one corner is beveled (radius == 0), one corner isn't. if ( $corner_style !== "bevel" || $r1 > 0 || $r2 > 0 ) { // do it the simple way $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2); return; } list($top, $right, $bottom, $left) = $widths; // All this polygon business is for beveled corners... switch ($side) { case "top": $points = array($x, $y, $x + $length, $y, $x + $length - $right, $y + $top, $x + $left, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; case "bottom": $points = array($x, $y, $x + $length, $y, $x + $length - $right, $y - $bottom, $x + $left, $y - $bottom); $this->_canvas->polygon($points, $color, null, null, true); break; case "left": $points = array($x, $y, $x, $y + $length, $x + $left, $y + $length - $bottom, $x + $left, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; case "right":

                $points = array($x, $y, $x, $y + $length, $x - $right, $y + $length - $bottom, $x - $right, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; default: return; } } protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) { switch ($side) { case "top": $r2 -= $right * $ratio; $x += $left * $ratio; $y += $top * $ratio; $length -= $left * $ratio + $right * $ratio; break; case "bottom": $r1 -= $right * $ratio; $r2 -= $left * $ratio; $x += $left * $ratio; $y -= $bottom * $ratio; $length -= $left * $ratio + $right * $ratio; break; case "left": $r1 -= $top * $ratio; $r2 -= $bottom * $ratio; $x += $left * $ratio; $y += $top * $ratio; $length -= $top * $ratio + $bottom * $ratio; break; case "right": $r1 -= $bottom * $ratio; $r2 -= $top * $ratio; $x -= $right * $ratio; $y += $top * $ratio; $length -= $top * $ratio + $bottom * $ratio; break; default: return; } } protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths;

                $third_widths = array($top / 3, $right / 3, $bottom / 3, $left / 3); // draw the outer border $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); $this->_apply_ratio($side, 2/3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); } protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); } protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); } protected function _tint($c) { if ( !is_numeric($c) ) return $c; return min(1, $c + 0.16); } protected function _shade($c) { if ( !is_numeric($c) ) return $c; return max(0, $c - 0.33); } protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { switch ($side) { case "top": case "left": $shade = array_map(array($this, "_shade"), $color); $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); break; case "bottom": case "right": $tint = array_map(array($this, "_tint"), $color); $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); break; default: return; } } protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 switch ($side) { case "top": case "left": $tint = array_map(array($this, "_tint"), $color); $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); break; case "bottom": case "right": $shade = array_map(array($this, "_shade"), $color); $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); break; default: return; } } // Draws a solid, dotted, or dashed line, observing the border radius protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name, $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $width = $$side; $pattern = $this->_get_dash_pattern($pattern_name, $width); $half_width = $width/2; $r1 -= $half_width; $r2 -= $half_width; $adjust = $r1/80; $length -= $width; switch ($side) { case "top": $x += $half_width; $y += $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 90-$adjust, 135+$adjust, $color, $width, $pattern);

                } $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $length - $r2, $y + $r2, $r2, $r2, 45-$adjust, 90+$adjust, $color, $width, $pattern); } break; case "bottom": $x += $half_width; $y -= $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y - $r1, $r1, $r1, 225-$adjust, 270+$adjust, $color, $width, $pattern); $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $length - $r2, $y - $r2, $r2, $r2, 270-$adjust, 315+$adjust, $color, $width, $pattern); } break; case "left": $y += $half_width; $x += $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 135-$adjust, 180+$adjust, $color, $width, $pattern); } $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $r2, $y + $length - $r2, $r2, $r2, 180-$adjust, 225+$adjust, $color, $width, $pattern); } break; case "right": $y += $half_width; $x -= $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x - $r1, $y + $r1, $r1, $r1, 0-$adjust, 45+$adjust, $color, $width, $pattern); } $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x - $r2, $y + $length - $r2, $r2, $r2, 315-$adjust, 360+$adjust, $color, $width, $pattern);

                } break; } } protected function _set_opacity($opacity) { if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) { $this->_canvas->set_opacity( $opacity ); } } protected function _debug_layout($box, $color = "red", $style = array()) { $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style); } }

Dokumen baru

Dokumen yang terkait

Gambaran Humanity pada Perawat Rumah Sakit
1
54
131
Perancangan Applikasi Internet Commerce Pada Rumah Sepatu Shop
3
44
79
Implementasi Dan Perancangan Applikasi Penyusunan Jadwal Kerja Perawat Rumah Sakit
6
55
117
Dimensi-Dimensi Kepuasan Kerja Perawat di Rumah Sakit Umum Bunda Thamrin Medan
1
67
76
Gambaran Stresor Dan Stres Kerja Perawat Kamar Bedah Di Rumah Sakit Umum Daerah Dr. Pirngadi Kota Medan
35
119
115
Pengaruh Formalisasi Dan Motivasi Kerja Terhadap Produktivitas Kerja Perawat Di Rumah Sakit Herna Medan Tahun 2000
2
37
62
Pengaruh Kemampuan Dan Motivasi Kerja Perawat Terhadap Kualitas Pelayanan Keperawatan Di Rumah Sakit Tembakau Deli Medan Tahun 2003
4
56
90
Pengaruh Karakteristik Perawat Dan Lingkungan Kerja Terhadap Keinginan Pindah Kerja (Intention Turnover) Perawat Di Rumah Sakit Swasta Di Kota Medan Tahun 2009
2
90
127
Pengaruh Motivasi Kerja Terhadap Kinerja Asuhan Keperawatan Dalam Pengkajian Dan Implementasi Perawat Pelaksana Di Rumah Sakit Bhayangkara Medan Tahun 2008
0
55
89
Perancangan Alat Pemanggil Perawat Pada Rumah Sakit Berbasis Mikrokontroller AT89S51 Dengan Tampilan Lcd
4
64
70
Kepuasan Kerja Dan Hubungannya Dengan Kinerja Perawat Dibagian Rawat Inap Rumah Sakit Permata Bunda Medan
0
25
153
Analisis Anteseden Dan Konsekuensi Kepuasan Kerja (Studi Pada Perawat Rumah Sakit Dr. Oen Solo Baru)
0
0
135
Gambaran Humanity pada Perawat Rumah Sakit
0
0
14
Dimensi-Dimensi Kepuasan Kerja Perawat di Rumah Sakit Umum Bunda Thamrin Medan
0
3
26
Hubungan Budaya Organisasi dengan Produktivitas Kerja Perawat Pelaksana di Rumah Sakit Kota Medan
0
0
7
Show more