# Questionnaire Aplikasi berbasis web untuk publikasi kuesioner pada lingkup Yayasan Widya Anindya (Perguruan Tinggi, SMK dan lainnya). ## Latar Belakang Guna melancarkan akreditasi Perguruan Tinggi LEPISI pada 2018, aplikasi ini dibuat untuk memenuhi kebutuhan akan dokumen-dokumen: - instrumen kepuasan mahasiswa terhadap tenaga pengajar & staf perguruan tinggi - instrumen evaluasi lulusan - monitoring & evaluasi SDM - trace studi alumni perguruan tinggi ### Kebutuhan Perangkat Lunak #### Server Produksi - PHP 7.0 - nginx - mariadb #### Developmen - composer - phpunit - behat - npm ## Design ### UC Diagram pembuatan kuesioner ```plantuml left to right direction actor Admin Admin -- (Membuat Kuesioner) Admin -- (Mengubah Kuesioner) Admin -- (Membuat Seksi) Admin -- (Mengubah Seksi) Admin -- (Membuat Pertanyaan) Admin -- (Mengubah Pertanyaan) Admin -- (Membuat Pilihan) Admin -- (Mengubah Pilihan) (Membuat Seksi) .> (Membuat Kuesioner) : extends (Membuat Pertanyaan) .> (Membuat Seksi) : extends (Membuat Pilihan) .> (Membuat Pertanyaan) : extends ``` #### Membuat Kuesioner Skenario utama: 1. Admin telah login ke dalam sistem 2. Admin mengisi form pembuatan kuesioner baru yang terdiri dari `title`, `descriptions`, `released_at` 3. sistem menyimpan nilai form yang diisi dan menambahkan data `id`, `created_at`, `updated_at` dan `creator_id` ke dalam database 4. sistem mengembalikan Admin ke tampilan daftar kuesioner Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan kuesioner baru dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Mengubah Kuesioner Skenario utama: 1. Admin telah login ke dalam sistem 2. Admin mengisi form edit kuesioner yang terdiri dari `title`, `descriptions`, dan `released_at` 3. sistem menyimpan nilai form yang diisi sesuai dengan `id` dari kuesioner yang sedang diedit ke dalam database 4. sistem mengembalikan Admin ke tampilan daftar kuesioner Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan kuesioner baru dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 2. b. tanggal `released_at` telah lewat dari tanggal hari mengubah - sistem menampilkan pesan bahwa tanggal `released_at` tidak dapat diubah lagi 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Membuat Seksi Seksi hanya dapat dibuat setelah membuat kuesioner. Skenario utama: 1. Admin telah login ke dalam sistem dan memilih kuesioner yang akan dibuatkan seksinya 2. Admin mengisi form pembuatan seksi baru yang terdiri dari `title`, `descriptions` 3. sistem menyimpan nilai form yang diisi dan menambahkan data `id`, `created_at`, `updated_at`, `questionnaire_id` dan `creator_id` ke dalam table `sections` 4. sistem mengembalikan Admin ke tampilan daftar seksi dari kuesioner yang sedang diedit Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan seksi baru dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Mengubah Seksi Skenario utama: 1. Admin telah login ke dalam sistem dan memilih kuesioner yang akan diedit seksinya 2. Admin mengisi form edit seksi yang terdiri dari `title`, `descriptions` 3. sistem menyimpan nilai form yang diisi sesuai dengan `id` dari seksi yang sedang diedit ke dalam database 4. sistem mengembalikan Admin ke tampilan daftar seksi kuesioner Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form mengubah seksi dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Membuat Pertanyaan Pertanyaan hanya dapat dibuat setelah membuat seksi. Jadi Pertanyaan ada di dalam seksi dan seksi ada di dalam kuesioner. skenario utama: 1. admin telah login ke dalam sistem dan memilih kuesioner dan seksi yang akan dibuatkan pertanyaan 2. admin mengisi form pembuatan pertanyaan baru yang terdiri dari `title`, `descriptions`, `question_type`, `text`, `number`, dan `expected_length` jika tipe pertanyaan adalah text atau isian 3. sistem menyimpan nilai form yang diisi dan menambahkan data `id`, `created_at`, `updated_at`, `section_id` dan `creator_id` ke dalam table `questions` 4. sistem mengembalikan admin ke tampilan daftar pertanyaan dari kuesioner dan seksi yang sedang diedit ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan seksi baru dan menampilkan pesan kesalahan - admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 2. b. field `expected_length` muncul jika tipe pertanyaan adalah text 3. a. sistem tidak dapat menyimpan data ke database: - admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Mengubah Pertanyaan Skenario utama: 1. Admin telah login ke dalam sistem dan memilih kuesioner dan seksi yang akan diedit pertanyaannya 2. Admin mengisi form edit pertanyaan yang terdiri dari `title`, `descriptions`, `question_type`, `text`, dan `number` 3. sistem menyimpan nilai form yang diisi sesuai dengan `id` dari pertanyaan yang sedang diedit ke dalam database 4. sistem mengembalikan Admin ke tampilan daftar pertanyaan kuesioner Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan pertanyaan baru dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Membuat Pilihan Pilihan bersifat opsional dan hanya dapat dibuat setelah membuat pertanyaan. skenario utama: 1. admin telah login ke dalam sistem dan memilih pertanyaan yang akan dibuatkan pilihan 2. admin mengisi form pembuatan pilihan baru yang terdiri dari `descriptions`, `text`, `number` 3. sistem menyimpan nilai form yang diisi dan menambahkan data `id`, `created_at`, `updated_at`, `questions_id` dan `creator_id` ke dalam table `question_choices` 4. sistem mengembalikan admin ke tampilan daftar pilihan dari pertanyaan yang sedang diedit ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan pilihan baru dan menampilkan pesan kesalahan - admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Mengubah Pilihan Skenario utama: 1. Admin telah login ke dalam sistem dan memilih pilihan pertanyaan yang akan diedit 2. Admin mengisi form edit pilihan yang terdiri dari `title`, `descriptions`, `question_type`, `text`, dan `number` 3. sistem menyimpan nilai form yang diisi sesuai dengan `id` dari pertanyaan yang sedang diedit ke dalam database 4. sistem mengembalikan Admin ke tampilan daftar pertanyaan kuesioner Ekstensi: 2. a. form tidak diisi lengkap: - sistem mengembalikan admin ke halaman form pembuatan pertanyaan baru dan menampilkan pesan kesalahan - Admin dapat mencoba mengirim form kembali setelah mengisi dengan lengkap 3. a. sistem tidak dapat menyimpan data ke database: - Admin dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan ### UC Diagram pengisian kuesioner ```plantuml left to right direction actor Responden actor Admin Responden -- (Mengisi identitas) Responden -- (Mengisi kuesioner) Responden -- (Menyelesaikan kuesioner) (Menerima notifikasi pengisian) .> (Menyelesaikan kuesioner) : extends (Mengisi kuesioner) .> (Mengisi identitas) : require (Menyelesaikan kuesioner) .> (Mengisi kuesioner) : require (Menerima notifikasi pengisian) -- Admin Responden -- (Menerima notifikasi pengisian) ``` #### Mengisi Identitas skenario utama: 1. responden memilih kuesioner yang akan diisinya 2. responden memilih tombol isi kuesioner 3. responden mengisi data diri pada halaman pendaftaran responden yang terdiri dari `nama`, `email`, `gender`, `handphone`, dan `occupation` 4. responden mengklik tombol simpan 5. sistem menyimpan nilai form yang diisi dan menambahkan data `created_at`, `updated_at` ke dalam table `respondents` 6. responden dibukakan tampilan pengisian kuesioner ekstensi: 3. a. form tidak diisi lengkap: - sistem mengembalikan responden ke halaman form pendaftaran dan menampilkan pesan kesalahan - responden dapat mencoba mengirim form kembali setelah memperbaiki kesalahan 5. a. sistem tidak dapat menyimpan data ke database: - responden dikembalikan ke halaman pengisian form dan diberi peringatan kesalahan #### Mengisi Kuesioner skenario utama: 1. responden telah berhasil mengisi identitas 2. sistem menampilkan pertanyaan sekaligus pilihan jawaban jika tersedia kepada responden untuk diisi 3. responden mengisi/memilih pilihan jawaban atas pertanyaan yang diberikan lalu mengklik tombol lanjut 4. sistem menampilkan pertanyaan selanjutnya dan berulang ke langkah no. 1 hingga semua pertanyaan terisi ekstensi: 3. a. form tidak diisi lengkap: - sistem memberikan peringatan bahwa tiap pertanyaan wajib diisi dengan lengkap - responden dapat mencoba mengirim form kembali setelah memperbaiki kesalahan 3. b. panjang jawaban kurang dari yang diharapkan - sistem memberikan peringatan bahwa panjang jawaban kurang dari yang diharapkan dan memberitahu berapa panjang jawaban minimal yang diharapkan #### Menyelesaikan Kuesioner skenario utama: 1. responden telah menjawab seluruh pertanyaan dan berada pada halaman pertanyaan terakhir 2. responden menekan tombol simpan jawaban pada pertanyaan terakhir 3. sistem menampilkan rekap jawaban responden sekaligus menanyakan konfirmasi pengiriman jawaban 4. responden memberikan centang pada pernyataan mengisi dengan data sebenarnya lalu menekan tombol simpan 5. sistem menyimpan data jawaban untuk tiap-tiap pertanyaan dan menambahkan data `id`, `respondent_id`, `question_id`, `created_at` dan `updated_at` pada tabel `answers` ekstensi: 4. a. responden tidak memberikan centang pada pernyataan mengisi dengan data sebenarnya: - sistem memberika pesan kesalahan bahwa data yang diisi harus benar dan responden wajib menyetujui pernyataan pada layar 5. a. sistem tidak dapat menyimpan data ke database: - responden dikembalikan ke halaman pengisian kuesioner dan diberi peringatan kesalahan untuk kemudian dapat mencoba mengirim kembali #### Menerima Notifikasi Pengisian skenario utama: 1. sistem mengirimkan email berupa rekap jawaban responden ekstensi: 1. a. sistem gagal mengirim email: - sistem menyimpan rekap pada file teks yang kemudian dapat dikirimkan pada responden nantinya ### UC Diagram pencetakan laporan kuesioner ```plantuml left to right direction actor Admin Admin -- (Mencetak rekap pengisian kuesioner) Admin -- (Mencetak laporan hasil pengolahan kuesioner) ``` #### Mencetak rekap pengisian kuesioner skenario utama: 1. admin telah login lalu memilih kuesioner yang akan dicetak laporannya 2. sistem mencetak laporan rekap pengisian kuesioner yang isinya akan ditentukan selanjutnya pada layar, jika diperlukan, laporan dapat dicetak pada kertas ekstensi: 2. a. belum ada data pengisian kuesioner: - sistem tidak menampilkan tombol cetak laporan rekap #### Mencetak laporan hasil pengolahan kuesioner skenario utama: 1. admin telah login lalu memilih kuesioner yang akan dicetak laporannya 2. sistem mencetak laporan hasil pengolahan kuesioner yang isinya akan ditentukan selanjutnya pada layar, jika diperlukan, laporan dapat dicetak pada kertas ekstensi: 2. a. belum ada data pengisian kuesioner: - sistem tidak menampilkan tombol cetak laporan rekap ### Class Diagram ```plantuml class Questionnaire { id : int title : varchar [100] descriptions : text creator_id : int reviewer_by : int released_at : datetime created_at : datetime updated_at : datetime deleted_at : datetime } class Section { id : int questionnaire_id : int title : varchar [100] descriptions : text creator_id : int created_at : datetime updated_at : datetime deleted_at : datetime } class Question { id : int section_id : int number : int text : varchar [300] descriptions : text expected_length : int question_type : enum ['text', 'choice', 'number'] creator_id : int created_at : datetime updated_at : datetime deleted_at : datetime } class QuestionChoice { id : int question_id : int number : int text : varchar [300] descriptions : text creator_id : int created_at : datetime updated_at : datetime deleted_at : datetime } class Respondent { id : int name : varchar [100] handphone : varchar [100] email : varchar [100] gender : enum ['m', 'f'] occupation : varchar [100] created_at : datetime updated_at : datetime deleted_at : datetime } class Answer { id : int respondent_id : int question_id: int text : text choice : int created_at : datetime updated_at : datetime deleted_at : datetime } Questionnaire "1" -- "1..*" Section Section "1" -- "1..*" Question Question "1" -- "0..*" QuestionChoice Respondent "1" -- "1..*" Answer Question "1" - "1" Answer ``` ### API End Points