# 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

