├── public ├── favicon.ico ├── robots.txt ├── img │ ├── exo.jpg │ ├── logo.ico │ ├── favicon.ico │ ├── tutwuri.jpg │ └── logo-white.png ├── mix-manifest.json ├── installer │ ├── img │ │ ├── pattern.png │ │ ├── background.png │ │ └── favicon │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ └── favicon-96x96.png │ ├── fonts │ │ ├── ionicons.eot │ │ ├── ionicons.ttf │ │ ├── ionicons.woff │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ └── css │ │ ├── scss │ │ ├── font-awesome │ │ │ ├── _fixed-width.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _core.scss │ │ │ ├── font-awesome.scss │ │ │ ├── _stacked.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _path.scss │ │ │ └── _animated.scss │ │ └── _variables.scss │ │ └── sass │ │ └── _variables.sass ├── download │ ├── format-sesi-import.xlsx │ ├── format-user-import.xlsx │ ├── format-input-soal-pg.docx │ ├── format-matpel-import.xlsx │ ├── format-input-soal-doc-2.docx │ ├── format-input-soal-doc.docx │ ├── format-input-soal-esay.docx │ ├── format-input-soal-exc.xlsx │ ├── format-peserta-import.xlsx │ └── format-group-member-import.xlsx ├── .htaccess └── web.config ├── bootstrap └── cache │ └── .gitignore ├── storage ├── logs │ └── .gitignore ├── app │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── cache │ ├── data │ │ └── .gitignore │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── database ├── .gitignore ├── seeds │ ├── TokenSeeder.php │ ├── InfoFeatureSeeder.php │ ├── JurusanUmum.php │ ├── UserSeeder.php │ ├── DatabaseSeeder.php │ ├── MatpelSeeder.php │ ├── SettingSeeder.php │ └── AgamaSeeder.php ├── migrations │ ├── 2024_01_28_072638_create_menuses_table.php │ ├── 2024_01_28_072747_create_role_menuses_table.php │ ├── 2020_07_15_145941_create_tokens_table.php │ ├── 2023_09_01_210528_add_label_mark_to_jawaban_soals_table.php │ ├── 2020_07_10_012014_create_agamas_table.php │ ├── 2021_05_12_093907_create_feature_infos_table.php │ ├── 2020_07_10_011228_create_event_ujians_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2020_07_10_011018_create_jurusans_table.php │ ├── 2020_07_10_011355_create_directories_table.php │ ├── 2021_03_09_184343_create_groups_table.php │ ├── 2020_07_10_012151_create_settings_table.php │ ├── 2020_07_15_120620_create_ujians_table.php │ ├── 2022_07_26_080234_create_exo_backups_table.php │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ ├── 2020_10_18_102712_create_sesi_schedules_table.php │ ├── 2020_07_10_011535_create_files_table.php │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2021_07_17_094457_create_banksoal_adaptif_table.php │ ├── 2020_07_10_011826_create_jawaban_soals_table.php │ ├── 2020_07_10_011145_create_matpels_table.php │ ├── 2021_03_09_184914_create_group_members_table.php │ ├── 2020_07_10_011304_create_pesertas_table.php │ ├── 2020_07_10_011745_create_soals_table.php │ ├── 2021_10_11_102624_create_penilaian_argument_table.php │ ├── 2020_07_11_112718_create_siswa_ujians_table.php │ ├── 2020_07_10_011939_create_jawaban_esays_table.php │ └── 2020_07_10_011609_create_jadwals_table.php └── factories │ └── UserFactory.php ├── .rnd ├── Procfile ├── .Procfile.swp ├── app ├── Utils │ ├── HttpUtil.php │ ├── EntityUtil.php │ ├── Error.php │ └── SoalUtil.php ├── Menus.php ├── RoleMenus.php ├── FeatureInfo.php ├── Ujian.php ├── Models │ ├── JadwalConstant.php │ ├── CacheConstant.php │ ├── SoalConstant.php │ ├── BanksoalAdaptif.php │ └── UjianConstant.php ├── GroupMember.php ├── Http │ ├── Controllers │ │ ├── Api │ │ │ ├── Gateway │ │ │ │ ├── GatewayController.php │ │ │ │ ├── AgamaGatewayController.php │ │ │ │ ├── JurusanGatewayController.php │ │ │ │ ├── UserGatewayController.php │ │ │ │ ├── MatpelGatewayController.php │ │ │ │ ├── GroupGatewayController.php │ │ │ │ ├── EventGatewayController.php │ │ │ │ └── BanksoalGatewayController.php │ │ │ ├── v1 │ │ │ │ ├── AgamaController.php │ │ │ │ └── AuthController.php │ │ │ └── v3 │ │ │ │ ├── AgamaController.php │ │ │ │ └── AppInfoController.php │ │ ├── Controller.php │ │ └── System │ │ │ └── SystemController.php │ └── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── CheckForMaintenanceMode.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ ├── Authenticate.php │ │ ├── RedirectIfAuthenticated.php │ │ └── BasicAuth.php ├── Services │ ├── Setting │ │ └── SettingServiceInterface.php │ ├── Banksoal │ │ └── BanksoalService.php │ ├── Ujian │ │ └── TipeSoalInterface.php │ ├── ServiceInterface.php │ ├── PaginationService.php │ └── Agama │ │ └── AgamaService.php ├── ExoBackup.php ├── File.php ├── Agama.php ├── Token.php ├── JawabanSoal.php ├── SesiSchedule.php ├── Repositories │ ├── Banksoal │ │ └── BanksoalRepository.php │ ├── Agama │ │ └── AgamaRepository.php │ ├── User │ │ └── UserRepository.php │ ├── Matpel │ │ └── MatpelRepository.php │ └── Jurusan │ │ └── JurusanRepository.php ├── Group.php ├── Jurusan.php ├── Setting.php ├── Providers │ ├── BroadcastServiceProvider.php │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ └── EventServiceProvider.php ├── Cache │ ├── CacheHandlerInterface.php │ └── CacheHandler.php ├── PenilaianEsay.php ├── EventUjian.php ├── Listeners │ ├── AddFinishedToOputput.php │ └── AddLogoToOutput.php ├── Traits │ └── Uuids.php ├── Console │ ├── Kernel.php │ └── Commands │ │ └── Exo │ │ ├── InstallAppCommand.php │ │ ├── MakeServiceCommand.php │ │ └── MakeRepositoryCommand.php ├── Peserta.php ├── User.php ├── Rules │ └── ArrayUuid.php ├── Directory.php ├── HasilUjian.php ├── Exceptions │ └── Handler.php ├── Imports │ └── UserImport.php └── SiswaUjian.php ├── resources ├── js │ ├── App.vue │ ├── entities │ │ ├── alert.js │ │ └── notif.js │ ├── components │ │ ├── ExpandLineIcon.vue │ │ ├── MinimizeLineIcon.vue │ │ ├── AppLineIcon.vue │ │ ├── NextLineIcon.vue │ │ └── PrevLineIcon.vue │ ├── stores │ │ └── siswa │ │ │ └── channel.js │ ├── api.js │ ├── bootstrap.js │ ├── app.js │ ├── store.js │ └── router.js ├── lang │ ├── id │ │ ├── pagination.php │ │ ├── auth.php │ │ └── password.php │ ├── en │ │ ├── pagination.php │ │ ├── auth.php │ │ └── passwords.php │ ├── zh-CN │ │ └── installer_messages.php │ ├── zh-TW │ │ └── installer_messages.php │ ├── ar │ │ └── installer_messages.php │ ├── fa │ │ └── installer_messages.php │ ├── et │ │ └── installer_messages.php │ ├── pl │ │ └── installer_messages.php │ ├── nl │ │ └── installer_messages.php │ ├── ro │ │ └── installer_messages.php │ ├── it │ │ └── installer_messages.php │ ├── pt-br │ │ └── installer_messages.php │ ├── pt │ │ └── installer_messages.php │ ├── gr │ │ └── installer_messages.php │ ├── de │ │ └── installer_messages.php │ └── es │ │ └── installer_messages.php ├── views │ ├── welcome.blade.php │ ├── vendor │ │ └── installer │ │ │ ├── update │ │ │ ├── finished.blade.php │ │ │ ├── welcome.blade.php │ │ │ └── overview.blade.php │ │ │ ├── welcome.blade.php │ │ │ ├── environment.blade.php │ │ │ ├── finished.blade.php │ │ │ └── permissions.blade.php │ ├── ujian.blade.php │ ├── system │ │ ├── change_ip.blade.php │ │ ├── layoute.blade.php │ │ └── index.blade.php │ └── excel │ │ └── capaian.blade.php ├── sass │ └── app.scss ├── stubs │ ├── RepositoryStub.php │ └── ServiceStub.php └── css │ └── app.css ├── .gitattributes ├── stubs ├── model.stub ├── model.pivot.stub ├── seeder.stub ├── controller.plain.stub ├── test.unit.stub ├── factory.stub ├── policy.plain.stub ├── test.stub ├── middleware.stub ├── migration.stub ├── controller.invokable.stub ├── request.stub ├── job.stub ├── migration.create.stub ├── migration.update.stub ├── rule.stub ├── job.queued.stub ├── console.stub └── controller.api.stub ├── README.md ├── .styleci.yml ├── nginx_app.conf ├── .editorconfig ├── .gitignore ├── tailwind.config.js ├── routes ├── channels.php ├── console.php ├── gateway.php ├── web.php └── api_v2.php ├── server.php ├── webpack.mix.js ├── config ├── cors.php ├── services.php ├── view.php └── exo.php ├── phpunit.xml └── .env.example /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /.rnd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/.rnd -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: vendor/bin/heroku-php-nginx -C nginx_app.conf /public 2 | -------------------------------------------------------------------------------- /.Procfile.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/.Procfile.swp -------------------------------------------------------------------------------- /public/img/exo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/img/exo.jpg -------------------------------------------------------------------------------- /public/img/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/img/logo.ico -------------------------------------------------------------------------------- /app/Utils/HttpUtil.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 | -------------------------------------------------------------------------------- /public/installer/img/pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/img/pattern.png -------------------------------------------------------------------------------- /public/installer/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/ionicons.eot -------------------------------------------------------------------------------- /public/installer/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/ionicons.ttf -------------------------------------------------------------------------------- /public/installer/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/ionicons.woff -------------------------------------------------------------------------------- /public/installer/img/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/img/background.png -------------------------------------------------------------------------------- /public/download/format-sesi-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-sesi-import.xlsx -------------------------------------------------------------------------------- /public/download/format-user-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-user-import.xlsx -------------------------------------------------------------------------------- /public/installer/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /public/download/format-input-soal-pg.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-input-soal-pg.docx -------------------------------------------------------------------------------- /public/download/format-matpel-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-matpel-import.xlsx -------------------------------------------------------------------------------- /public/download/format-input-soal-doc-2.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-input-soal-doc-2.docx -------------------------------------------------------------------------------- /public/download/format-input-soal-doc.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-input-soal-doc.docx -------------------------------------------------------------------------------- /public/download/format-input-soal-esay.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-input-soal-esay.docx -------------------------------------------------------------------------------- /public/download/format-input-soal-exc.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-input-soal-exc.xlsx -------------------------------------------------------------------------------- /public/download/format-peserta-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-peserta-import.xlsx -------------------------------------------------------------------------------- /resources/lang/id/pagination.php: -------------------------------------------------------------------------------- 1 | '« Sebelumnya', 4 | 'next' => 'Berikutnya »', 5 | ]; 6 | -------------------------------------------------------------------------------- /public/installer/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/installer/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/installer/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/installer/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/installer/img/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/img/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /public/download/format-group-member-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/download/format-group-member-import.xlsx -------------------------------------------------------------------------------- /public/installer/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/installer/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellrean-dev/exo-cbt-service/HEAD/public/installer/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /app/Menus.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ExtraordinaryCBT 5 | 6 | 7 | Extraordinary Services is running 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ExtraordinaryCBT Self Versioon 2 | 3 | ExtraordinaryCBT Self version adalah aplikasi ujian online berbasis komputer ( computer based test ) yang dapat dijalankan secara offline di sekolah sekolah. -------------------------------------------------------------------------------- /app/GroupMember.php: -------------------------------------------------------------------------------- 1 | 'Identitas tersebut tidak cocok dengan data kami.', 4 | 'throttle' => 'Terlalu banyak usaha masuk. Silahkan coba lagi dalam :seconds detik.', 5 | ]; 6 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/GatewayController.php: -------------------------------------------------------------------------------- 1 | 'array' 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /stubs/controller.plain.stub: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class {{ class }} extends Controller 13 | { 14 | // 15 | } 16 | -------------------------------------------------------------------------------- /resources/js/entities/alert.js: -------------------------------------------------------------------------------- 1 | function showSweetError(vue, err) { 2 | let message 3 | if (typeof err.message == 'undefined') { 4 | message = 'Terjadi kesalahan yang tidak dapat dijelaskan' 5 | } else { 6 | message = err.message 7 | } 8 | vue.$swal('Kesalahan', message,'error') 9 | } 10 | 11 | export { showSweetError } 12 | -------------------------------------------------------------------------------- /stubs/test.unit.stub: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | /public/*.js 7 | /public/js/app.js 8 | /public/js/*.txt 9 | /public/css/app.css 10 | /public/admin-system 11 | .env 12 | .env.backup 13 | .phpunit.result.cache 14 | Homestead.json 15 | Homestead.yaml 16 | npm-debug.log 17 | yarn-error.log 18 | 19 | .DS_Store 20 | .idea 21 | -------------------------------------------------------------------------------- /app/Repositories/Banksoal/BanksoalRepository.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | final class BanksoalRepository extends AbstractRepository 12 | { 13 | 14 | } -------------------------------------------------------------------------------- /stubs/factory.stub: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | $factory->define({{ model }}::class, function (Faker $faker) { 13 | return [ 14 | // 15 | ]; 16 | }); 17 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 'ZYENG', 17 | 'status' => '0' 18 | ]); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /stubs/policy.plain.stub: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /resources/js/stores/siswa/channel.js: -------------------------------------------------------------------------------- 1 | import io from 'socket.io-client' 2 | 3 | const state = () => ({ 4 | socket: io(process.env.MIX_SOCKET_URL,{ 5 | autoConnect: false, 6 | pingInterval: 1000, 7 | pingTimeout: 5000, 8 | }), 9 | }) 10 | 11 | const mutations = { 12 | 13 | } 14 | 15 | const actions = { 16 | 17 | } 18 | 19 | export default { 20 | namespaced: true, 21 | state, 22 | mutations, 23 | actions 24 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: [ 3 | './resources/**/*.blade.php', 4 | './resources/**/*.js', 5 | './resources/**/*.vue', 6 | ], 7 | darkMode: false, // or 'media' or 'class' 8 | theme: { 9 | extend: { 10 | fontFamily: { 11 | 'poppins': ['Poppins', 'sans-serif'], 12 | }, 13 | }, 14 | }, 15 | variants: { 16 | extend: {}, 17 | }, 18 | plugins: [], 19 | } 20 | -------------------------------------------------------------------------------- /app/Group.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | public function childs() 18 | { 19 | return $this->hasMany(self::class, 'parent_id'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | {{ session('message')['message'] }}

6 |
7 | {{ trans('installer_messages.updater.final.exit') }} 8 |
9 | @stop 10 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Setting.php: -------------------------------------------------------------------------------- 1 | 'array' 24 | ]; 25 | } 26 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /resources/stubs/RepositoryStub.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | final class DummyClass extends AbstractRepository 13 | { 14 | /** 15 | * Table of repository 16 | * @var string $table 17 | */ 18 | protected string $table = ''; 19 | } -------------------------------------------------------------------------------- /resources/lang/id/password.php: -------------------------------------------------------------------------------- 1 | 2 | 'Kata sandi harus minimal enam karakter dan cocok dengan konfirmasi.', 5 | 'reset' => 'Kata sandi Anda sudah di atur ulang!', 6 | 'sent' => 'Kami sudah mengirim email yang berisi tautan untuk mengatur ulang kata sandi Anda!', 7 | 'token' => 'Kata sandi token pengaturan ulang tidak sah.', 8 | 'user' => 'Kami tidak dapat menemukan pengguna dengan alamat surel tersebut.', 9 | ]; 10 | -------------------------------------------------------------------------------- /resources/js/entities/notif.js: -------------------------------------------------------------------------------- 1 | export function successToas() { 2 | return { 3 | title: "Sukses", 4 | variant: 'success', 5 | solid: true 6 | } 7 | } 8 | 9 | export function warningToas() { 10 | return { 11 | title: "Warning", 12 | variant: 'warning', 13 | solid: true 14 | } 15 | } 16 | 17 | export function errorToas() { 18 | return { 19 | title: "Error", 20 | variant: 'danger', 21 | solid: true 22 | } 23 | } -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /stubs/test.stub: -------------------------------------------------------------------------------- 1 | get('/'); 19 | 20 | $response->assertStatus(200); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /resources/views/vendor/installer/update/welcome.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master-update') 2 | 3 | @section('title', trans('installer_messages.updater.welcome.title')) 4 | @section('container') 5 |

6 | {{ trans('installer_messages.updater.welcome.message') }} 7 |

8 |
9 | {{ trans('installer_messages.next') }} 10 |
11 | @stop 12 | -------------------------------------------------------------------------------- /stubs/middleware.stub: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class {{ class }} 12 | { 13 | /** 14 | * Handle an incoming request. 15 | * 16 | * @param \Illuminate\Http\Request $request 17 | * @param \Closure $next 18 | * @return mixed 19 | */ 20 | public function handle($request, Closure $next) 21 | { 22 | return $next($request); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Cache/CacheHandlerInterface.php: -------------------------------------------------------------------------------- 1 | insert($data); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/seeds/JurusanUmum.php: -------------------------------------------------------------------------------- 1 | insert([ 17 | 'id' => Str::uuid()->toString(), 18 | 'kode' => 1945, 19 | 'nama' => 'UMUM (tanpa-jurusan)' 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeds/UserSeeder.php: -------------------------------------------------------------------------------- 1 | 'Administrator', 17 | 'email' => 'admin@shellrean.com', 18 | 'role' => 'admin', 19 | 'password' => bcrypt('criticalpassword') 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /resources/stubs/ServiceStub.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | final class DummyClass extends AbstractService 14 | { 15 | /** 16 | * Dependency injection 17 | */ 18 | public function __construct(CacheHandler $cache) 19 | { 20 | $this->cache = $cache; 21 | } 22 | } -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | class Error 9 | { 10 | /** 11 | * Get error logging 12 | * @param \Exception $e 13 | * @return array 14 | */ 15 | public static function get(\Exception $e) 16 | { 17 | return [ 18 | 'code' => $e->getCode(), 19 | 'line' => $e->getLine(), 20 | 'file' => $e->getFile(), 21 | 'message'=> $e->getMessage() 22 | ]; 23 | } 24 | } -------------------------------------------------------------------------------- /resources/views/vendor/installer/update/overview.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master-update') 2 | 3 | @section('title', trans('installer_messages.updater.welcome.title')) 4 | @section('container') 5 |

{{ trans_choice('installer_messages.updater.overview.message', $numberOfUpdatesPending, ['number' => $numberOfUpdatesPending]) }}

6 |
7 | {{ trans('installer_messages.updater.overview.install_updates') }} 8 |
9 | @stop 10 | -------------------------------------------------------------------------------- /stubs/controller.invokable.stub: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class {{ class }} extends Controller 13 | { 14 | /** 15 | * Handle the incoming request. 16 | * 17 | * @param \Illuminate\Http\Request $request 18 | * @return \Illuminate\Http\Response 19 | */ 20 | public function __invoke(Request $request) 21 | { 22 | // 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Services/Banksoal/BanksoalService.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | final class BanksoalService extends AbstractService 14 | { 15 | /** 16 | * Dependency injection 17 | */ 18 | public function __construct(CacheHandler $cache) 19 | { 20 | $this->cache = $cache; 21 | } 22 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Api/v1/AgamaController.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | class AgamaController extends Controller 14 | { 15 | /** 16 | * @Route(path="api/v1/agamas", method={"GET"}) 17 | */ 18 | public function index() 19 | { 20 | $agamas = Agama::orderBy('id')->get(); 21 | return SendResponse::acceptData($agamas); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/PenilaianEsay.php: -------------------------------------------------------------------------------- 1 | hasOne('App\Soal','id','soal_id'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/EventUjian.php: -------------------------------------------------------------------------------- 1 | hasMany(Jadwal::class, 'event_id'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /app/Listeners/AddFinishedToOputput.php: -------------------------------------------------------------------------------- 1 | output->writeln(''); 19 | $event->output->writeln($message); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UserSeeder::class); 15 | $this->call(AgamaSeeder::class); 16 | $this->call(TokenSeeder::class); 17 | $this->call(SettingSeeder::class); 18 | $this->call(InfoFeatureSeeder::class); 19 | $this->call(JurusanUmum::class); 20 | $this->call(CreateRoleMenus::class); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Models/CacheConstant.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /stubs/job.stub: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class {{ class }} 13 | { 14 | use Dispatchable, Queueable; 15 | 16 | /** 17 | * Create a new job instance. 18 | * 19 | * @return void 20 | */ 21 | public function __construct() 22 | { 23 | // 24 | } 25 | 26 | /** 27 | * Execute the job. 28 | * 29 | * @return void 30 | */ 31 | public function handle() 32 | { 33 | // 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js("resources/js/app.js", "public/js") 15 | .postCss("resources/css/app.css", "public/css", [ 16 | require("tailwindcss"), 17 | ]); 18 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/v3/AgamaController.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class AgamaController extends Controller 15 | { 16 | /** 17 | * @Route(path="api/v3/agamas", method={"GET"}) 18 | */ 19 | public function index(AgamaService $agamaService) 20 | { 21 | $agamas = $agamaService->fetchAll(); 22 | return SendResponse::acceptData($agamas ? $agamas : []); 23 | } 24 | } -------------------------------------------------------------------------------- /app/Models/SoalConstant.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 16 | ]; 17 | 18 | /** 19 | * Register any authentication / authorization services. 20 | * 21 | * @return void 22 | */ 23 | public function boot() 24 | { 25 | $this->registerPolicies(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /resources/views/vendor/installer/welcome.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master') 2 | 3 | @section('template_title') 4 | Extraordinary | Instalasi 5 | @endsection 6 | 7 | @section('title') 8 | ExtraordinaryCBT Installer 9 | @endsection 10 | 11 | @section('container') 12 |

13 | {{ trans('installer_messages.welcome.message') }} 14 |

15 |

16 | 17 | {{ trans('installer_messages.welcome.next') }} 18 | 19 | 20 |

21 | @endsection 22 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->describe('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 22 | return redirect(RouteServiceProvider::HOME); 23 | } 24 | 25 | return $next($request); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /stubs/migration.create.stub: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | Schema::dropIfExists('{{ table }}'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /stubs/migration.update.stub: -------------------------------------------------------------------------------- 1 | insert([ 16 | ['kode_mapel' => '00019101', 'jurusan_id' => 0, 'agama_id' => 0, 'correctors' => '[1]', 'nama' => 'Pendidikan Agama'], 17 | ['kode_mapel' => '00019102', 'jurusan_id' => 0, 'agama_id' => 0, 'correctors' => '[1]', 'nama' => 'Bahasa Indonesia'], 18 | ['kode_mapel' => '00019103', 'jurusan_id' => 0, 'agama_id' => 0, 'correctors' => '[1]', 'nama' => 'Matematika'] 19 | ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/migrations/2024_01_28_072638_create_menuses_table.php: -------------------------------------------------------------------------------- 1 | string('code')->primary(); 18 | $table->string('name'); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | Schema::dropIfExists('menuses'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /stubs/rule.stub: -------------------------------------------------------------------------------- 1 | string('role'); 18 | $table->string('code'); 19 | 20 | $table->primary(['role', 'code']); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('role_menuses'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have emailed your password reset link!', 18 | 'throttled' => 'Please wait before retrying.', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that email address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /stubs/job.queued.stub: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class {{ class }} implements ShouldQueue 16 | { 17 | use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 18 | 19 | /** 20 | * Create a new job instance. 21 | * 22 | * @return void 23 | */ 24 | public function __construct() 25 | { 26 | // 27 | } 28 | 29 | /** 30 | * Execute the job. 31 | * 32 | * @return void 33 | */ 34 | public function handle() 35 | { 36 | // 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/AgamaGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class AgamaGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/agamas/all", methods={"GET"}) 18 | * 19 | * @return Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function allData() 24 | { 25 | $agamas = DB::table('agamas as t_0') 26 | ->orderBy('nama') 27 | ->get(); 28 | return SendResponse::acceptData($agamas); 29 | } 30 | } -------------------------------------------------------------------------------- /database/migrations/2020_07_15_145941_create_tokens_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('token'); 19 | $table->enum('status',[0,1]); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('tokens'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/JurusanGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class JurusanGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/jurusans/all", methods={"GET"}) 18 | * 19 | * @return Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function allData() 24 | { 25 | $jurusans = DB::table('jurusans as t_0') 26 | ->orderBy('nama') 27 | ->get(); 28 | return SendResponse::acceptData($jurusans); 29 | } 30 | } -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /stubs/console.stub: -------------------------------------------------------------------------------- 1 | string('label_mark')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('jawaban_soals', function (Blueprint $table) { 29 | $table->dropColumn('label_mark'); 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_012014_create_agamas_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('kode'); 19 | $table->string('nama'); 20 | $table->timestamps(); 21 | 22 | $table->index(['kode']); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('agamas'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /public/installer/css/scss/font-awesome/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /routes/gateway.php: -------------------------------------------------------------------------------- 1 | 'Api\Gateway'], function() { 5 | Route::group(['middleware' => 'auth:sanctum'], function() { 6 | Route::get('jurusans/all', 'JurusanGatewayController@allData'); 7 | Route::get('agamas/all', 'AgamaGatewayController@allData'); 8 | Route::get('matpels/all', 'MatpelGatewayController@allData'); 9 | Route::get('groups/all', 'GroupGatewayController@allData'); 10 | Route::get('banksoals/all', 'BanksoalGatewayController@allData'); 11 | Route::get('events/all', 'EventGatewayController@allData'); 12 | 13 | Route::get('ujians/all', 'JadwalGatewayController@allData'); 14 | Route::get('ujians/active-status', 'JadwalGatewayController@activeStatus'); 15 | 16 | Route::get('users/correctors', 'UserGatewayController@correctors'); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /app/Http/Middleware/BasicAuth.php: -------------------------------------------------------------------------------- 1 | {$model->getKeyName()})) { 17 | $model->{$model->getKeyName()} = Str::uuid()->toString(); 18 | } 19 | }); 20 | } 21 | 22 | /** 23 | * Get the value indicating whether the IDs are incrementing 24 | * 25 | * @return bool 26 | */ 27 | public function getIncrementing() 28 | { 29 | return false; 30 | } 31 | 32 | /** 33 | * Get the auto-incrementing key type. 34 | * 35 | * @return string 36 | */ 37 | public function getKeyType() 38 | { 39 | return 'string'; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Models/BanksoalAdaptif.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class BanksoalAdaptif extends Model 15 | { 16 | use Uuids; 17 | 18 | /** 19 | * declare table name 20 | * @var string 21 | */ 22 | protected $table = 'banksoal_adaptif'; 23 | 24 | /** 25 | * set fillable that can 26 | * access and insert to it 27 | * @var array 28 | */ 29 | protected $fillable = [ 30 | 'matpel_id', 'name', 'code', 'max_pg' 31 | ]; 32 | 33 | /** 34 | * get matpel relationship 35 | * @return BelongsTo 36 | */ 37 | public function matpel() 38 | { 39 | return $this->belongsTo(\App\Matpel::class, 'matpel_id'); 40 | } 41 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Api/v3/AppInfoController.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class AppInfoController extends Controller 15 | { 16 | /** 17 | * @Route(path="api/v3/info-feature", methods={"GET"}) 18 | */ 19 | public function info(Request $request) 20 | { 21 | $name = $request->query('name'); 22 | $info = DB::table('feature_infos') 23 | ->where('name', $name) 24 | ->orderByDesc('id') 25 | ->first(); 26 | if (!$info) { 27 | return SendResponse::acceptData(['content' => 'informasi tidak ditemukan']); 28 | } 29 | return SendResponse::acceptData($info); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /resources/js/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import store from './store.js' 3 | import router from './router.js' 4 | 5 | const $axios = axios.create({ 6 | baseURL: '/api/v2', 7 | headers: { 8 | 'Accept': 'application/json' 9 | } 10 | }) 11 | 12 | $axios.interceptors.request.use ( 13 | function ( config ) { 14 | config.headers.Authorization = 'Bearer '+store.state.token; 15 | return config; 16 | }, 17 | function ( error ) { 18 | return Promise.reject( error ) 19 | } 20 | ) 21 | 22 | $axios.interceptors.response.use((response) => { 23 | return response 24 | }, (error) => { 25 | if (error.response.status == 401) { 26 | new Promise((resolve, reject) => { 27 | localStorage.removeItem('token') 28 | resolve() 29 | }).then(() => { 30 | store.state.token = localStorage.getItem('token') 31 | router.push({ name: 'login' }) 32 | }) 33 | } 34 | return Promise.reject(error); 35 | }) 36 | 37 | export default $axios -------------------------------------------------------------------------------- /database/migrations/2021_05_12_093907_create_feature_infos_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('code'); 20 | $table->text('content'); 21 | $table->timestamps(); 22 | 23 | $table->index(['name']); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('feature_infos'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | /* @import 'https://fonts.googleapis.com/css?family=Poppins:100,200,300,400,500,600,700,800,900&display=swap'; */ 2 | 3 | @tailwind base; 4 | input[type="radio"] + label span { 5 | transition: background .2s, transform .2s; 6 | } 7 | 8 | input[type="radio"] + label span:hover, 9 | input[type="radio"] + label:hover span{ 10 | transform: scale(1.2); 11 | } 12 | 13 | input[type="radio"]:checked + label span { 14 | background-color: #3490DC; 15 | box-shadow: 0px 0px 0px 2px white inset; 16 | } 17 | 18 | input[type="radio"]:checked + label{ 19 | color: #3490DC; 20 | } 21 | 22 | input:checked + svg { 23 | display: block; 24 | } 25 | 26 | button:focus, a:focus, input:focus, select:focus, textarea:focus { 27 | @apply outline-none; 28 | } 29 | 30 | .swal2-popup { 31 | font-size: 0.7rem !important; 32 | } 33 | .swal2-popup { 34 | border: 2px solid #676565; 35 | } 36 | 37 | @tailwind components; 38 | @tailwind utilities; 39 | 40 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011228_create_event_ujians_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('name'); 19 | 20 | $table->uuid('deleted_by')->nullable(); 21 | $table->timestamp('deleted_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('event_ujians'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->text('connection'); 19 | $table->text('queue'); 20 | $table->longText('payload'); 21 | $table->longText('exception'); 22 | $table->timestamp('failed_at')->useCurrent(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('failed_jobs'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/UserGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class UserGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/users/correctors", methods={"GET"}) 18 | * 19 | * @return Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function correctors() 24 | { 25 | $users = DB::table('users as t_0') 26 | ->orderBy('name') 27 | ->select([ 28 | 't_0.id', 29 | 't_0.name', 30 | 't_0.email' 31 | ]) 32 | ->get(); 33 | return SendResponse::acceptData($users); 34 | } 35 | } -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | //window._ = require('lodash'); 2 | 3 | /** 4 | * We'll load the axios HTTP library which allows us to easily issue requests 5 | * to our Laravel back-end. This library automatically handles sending the 6 | * CSRF token as a header based on the value of the "XSRF" token cookie. 7 | */ 8 | 9 | //window.axios = require('axios'); 10 | 11 | //window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 12 | 13 | /** 14 | * Echo exposes an expressive API for subscribing to channels and listening 15 | * for events that are broadcast by Laravel. Echo and event broadcasting 16 | * allows your team to easily build robust real-time web applications. 17 | */ 18 | 19 | // import Echo from 'laravel-echo'; 20 | 21 | // window.Pusher = require('pusher-js'); 22 | 23 | // window.Echo = new Echo({ 24 | // broadcaster: 'pusher', 25 | // key: process.env.MIX_PUSHER_APP_KEY, 26 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 27 | // encrypted: true 28 | // }); 29 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/MatpelGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class MatpelGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/matpels/all", methods={"GET"}) 18 | * 19 | * @return Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function allData() 24 | { 25 | $matpels = DB::table('matpels as t_0') 26 | ->orderBy('nama') 27 | ->select( 28 | 'id', 29 | DB::Raw("CONCAT(kode_mapel, ' | ',nama) AS nama") 30 | ) 31 | ->get(); 32 | return SendResponse::acceptData($matpels); 33 | } 34 | } -------------------------------------------------------------------------------- /app/Repositories/Agama/AgamaRepository.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | final class AgamaRepository extends AbstractRepository 16 | { 17 | /** 18 | * Table of repository 19 | * @var string 20 | */ 21 | protected string $table = 'agamas'; 22 | 23 | /** 24 | * Fetch all data 25 | * @return self 26 | */ 27 | public function fetchAll(): self 28 | { 29 | try { 30 | $data = DB::table($this->table) 31 | ->orderBy('nama') 32 | ->get(); 33 | 34 | $this->entities = $data; 35 | } catch (\Exception $e) { 36 | array_push($this->errors, Error::get($e)); 37 | } 38 | return $this; 39 | } 40 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/GroupGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class GroupGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/groups/all", methods={"GET"}) 18 | * 19 | * @return Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function allData() 24 | { 25 | $groups = DB::table('groups as t_0') 26 | ->orderBy('created_at') 27 | ->select([ 28 | 't_0.id', 29 | 't_0.parent_id', 30 | 't_0.name' 31 | ]) 32 | ->get(); 33 | return SendResponse::acceptData($groups); 34 | } 35 | } -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(User::class, function (Faker $faker) { 21 | return [ 22 | 'name' => $faker->name, 23 | 'email' => $faker->unique()->safeEmail, 24 | 'email_verified_at' => now(), 25 | 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 26 | 'remember_token' => Str::random(10), 27 | ]; 28 | }); 29 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011018_create_jurusans_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('kode')->unique('kode'); 19 | $table->string('nama'); 20 | 21 | $table->uuid('deleted_by')->nullable(); 22 | $table->timestamp('deleted_at')->nullable(); 23 | 24 | $table->index(['kode']); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('jurusans'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 28 | } 29 | 30 | /** 31 | * Register the commands for the application. 32 | * 33 | * @return void 34 | */ 35 | protected function commands() 36 | { 37 | $this->load(__DIR__.'/Commands'); 38 | 39 | require base_path('routes/console.php'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/EventGatewayController.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.1.0 12 | * @year 2021 13 | */ 14 | final class EventGatewayController extends Controller 15 | { 16 | /** 17 | * @route(path="api/gateway/events/all", methods={"GET"}) 18 | * 19 | * @return \Illuminate\Http\Response 20 | * @author shellrean 21 | * @since 3.1.0 22 | */ 23 | public function allData() 24 | { 25 | $events = DB::table('event_ujians as t_0') 26 | ->orderBy('t_0.created_at') 27 | ->orderBy('t_0.name') 28 | ->select([ 29 | 't_0.id', 30 | 't_0.name' 31 | ]) 32 | ->get(); 33 | return SendResponse::acceptData($events); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011355_create_directories_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('name'); 19 | $table->string('slug'); 20 | 21 | $table->uuid('deleted_by')->nullable(); 22 | $table->timestamp('deleted_at')->nullable(); 23 | $table->timestamps(); 24 | 25 | $table->index(['slug']); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('directories'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /resources/js/components/NextLineIcon.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import router from './router.js' 3 | import store from './store.js' 4 | import App from './App.vue' 5 | 6 | import VueSweetalert2 from 'vue-sweetalert2' 7 | import 'sweetalert2/dist/sweetalert2.min.css'; 8 | 9 | Vue.use(VueSweetalert2) 10 | 11 | import { mapActions, mapGetters } from 'vuex' 12 | import { showSweetError } from './entities/alert.js' 13 | 14 | const app = new Vue({ 15 | el: '#app', 16 | router, 17 | store, 18 | components: { 19 | App 20 | }, 21 | computed: { 22 | ...mapGetters(['isAuth']) 23 | }, 24 | methods: { 25 | ...mapActions('siswa_user', ['getUserLogin','getSettingSekolah']), 26 | showError(err) { 27 | showSweetError(this, err) 28 | } 29 | }, 30 | async created() { 31 | await this.getSettingSekolah() 32 | if (this.isAuth) { 33 | this.getUserLogin() 34 | .catch((error) => { 35 | this.showError(error) 36 | }) 37 | } 38 | } 39 | }) 40 | -------------------------------------------------------------------------------- /app/Peserta.php: -------------------------------------------------------------------------------- 1 | 22 | */ 23 | public function agama() 24 | { 25 | return $this->belongsTo(Agama::class); 26 | } 27 | 28 | /** 29 | * Peserta's jurusan 30 | * @return object 31 | * @author shellrean 32 | */ 33 | public function jurusan() 34 | { 35 | return $this->belongsTo(Jurusan::class); 36 | } 37 | 38 | /** 39 | * Group member 40 | * @return object 41 | * @author shellrean 42 | */ 43 | public function group() 44 | { 45 | return $this->belongsTo(GroupMember::class,'id', 'student_id'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /database/migrations/2021_03_09_184343_create_groups_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('parent_id')->nullable()->default(null); 19 | $table->string('name'); 20 | 21 | $table->uuid('deleted_by')->nullable(); 22 | $table->timestamp('deleted_at')->nullable(); 23 | $table->timestamps(); 24 | 25 | $table->index(['parent_id', 'name']); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('groups'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Listeners/AddLogoToOutput.php: -------------------------------------------------------------------------------- 1 | output->write(" 18 | ______ __ ___ __ __ 19 | / ____/ __/ /__________ _____ _________/ (_)___ ____ ________ __ _____/ /_ / /_ 20 | / __/ | |/_/ __/ ___/ __ `/ __ \/ ___/ __ / / __ \/ __ `/ ___/ / / / / ___/ __ \/ __/ 21 | / /____> uuid('id')->primary(); 18 | $table->string('name'); 19 | $table->string('type'); 20 | $table->text('value'); 21 | 22 | $table->uuid('deleted_by')->nullable(); 23 | $table->timestamp('deleted_at')->nullable(); 24 | $table->timestamps(); 25 | 26 | $table->index(['name']); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::dropIfExists('settings'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/migrations/2020_07_15_120620_create_ujians_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('jadwal_id'); 19 | $table->enum('status',['aktif','selesai'])->default('aktif'); 20 | 21 | $table->uuid('deleted_by')->nullable(); 22 | $table->timestamp('deleted_at')->nullable(); 23 | $table->timestamps(); 24 | 25 | $table->index(['jadwal_id', 'status']); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('ujians'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /database/migrations/2022_07_26_080234_create_exo_backups_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('filename'); 19 | $table->string('version'); 20 | $table->text('detail'); 21 | $table->string('generated_date'); 22 | $table->string('bak_type')->default('BACKUP'); 23 | $table->string('status')->default("SUCCESS"); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('exo_backups'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /resources/js/components/PrevLineIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->uuidMorphs('tokenable'); 19 | $table->string('name'); 20 | $table->string('token', 64)->unique(); 21 | $table->text('abilities')->nullable(); 22 | $table->timestamp('last_used_at')->nullable(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('personal_access_tokens'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /resources/views/vendor/installer/environment.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master') 2 | 3 | @section('template_title') 4 | {{ trans('installer_messages.environment.menu.templateTitle') }} 5 | @endsection 6 | 7 | @section('title') 8 | 9 | {!! trans('installer_messages.environment.menu.title') !!} 10 | @endsection 11 | 12 | @section('container') 13 | 14 |

15 | {!! trans('installer_messages.environment.menu.desc') !!} 16 |

17 | 25 | 26 | @endsection 27 | -------------------------------------------------------------------------------- /resources/views/ujian.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Extraordinary CBT 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | Kami sedang menyiapkan halaman untuk anda.... 24 | 25 |
26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/Models/UjianConstant.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('jadwal_id'); 19 | $table->integer('sesi')->default(1); 20 | $table->text('peserta_ids'); 21 | 22 | $table->uuid('deleted_by')->nullable(); 23 | $table->timestamp('deleted_at')->nullable(); 24 | $table->timestamps(); 25 | 26 | $table->index(['jadwal_id', 'sesi']); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::dropIfExists('sesi_schedules'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | group(function () { 17 | Route::get('/system-administration-exo-cbt', 'System\SystemController@index')->name('system.exo.index'); 18 | Route::get('/system-administration-exo-cbt/change-ip', 'System\SystemController@changeIP')->name('system.exo.change.ip'); 19 | Route::post('/system-administration-exo-cbt/change-ip', 'System\SystemController@storeChangeIP')->name('system.exo.change.ip.store'); 20 | Route::get('/system-administration-exo-cbt/check-update', 'System\SystemController@checkUpdate')->name('system.exo.check.update'); 21 | }); 22 | 23 | Route::view('/{any}', 'ujian')->where('any','.*'); -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | 'datetime', 47 | ]; 48 | } 49 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011535_create_files_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('directory_id'); 19 | $table->string('dirname'); 20 | $table->string('filename'); 21 | $table->string('path'); 22 | $table->string('exstension'); 23 | $table->string('size'); 24 | 25 | $table->uuid('deleted_by')->nullable(); 26 | $table->timestamp('deleted_at')->nullable(); 27 | $table->timestamps(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | * 34 | * @return void 35 | */ 36 | public function down() 37 | { 38 | Schema::dropIfExists('files'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Rules/ArrayUuid.php: -------------------------------------------------------------------------------- 1 | validate($v)) { 35 | return false; 36 | } 37 | } 38 | return true; 39 | } 40 | 41 | /** 42 | * Get the validation error message. 43 | * 44 | * @return string 45 | */ 46 | public function message() 47 | { 48 | return 'The :attribute must be valid array of uuid.'; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/Services/ServiceInterface.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | interface ServiceInterface 14 | { 15 | /** 16 | * Fetach data from repository 17 | * @param int $limit 18 | * @param int $offset 19 | */ 20 | public function fetch(int $limit, int $offset); 21 | 22 | /** 23 | * Store data to repository 24 | * @param stdClass $data 25 | * @return self 26 | */ 27 | public function store(stdClass $data): ?stdClass; 28 | 29 | /** 30 | * Update data to repository 31 | * @param stdClass $data 32 | * @return self 33 | */ 34 | public function update(stdClass $data): ?stdClass; 35 | 36 | /** 37 | * Find data from repository 38 | * @param mixed $id 39 | * @return self 40 | */ 41 | public function find(mixed $id): ?stdClass; 42 | 43 | /** 44 | * Destroy data from repository 45 | * @param mixed $id 46 | * @return self 47 | */ 48 | public function destroy(mixed $id): bool; 49 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Api/v1/AuthController.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class AuthController extends Controller 15 | { 16 | /** 17 | * @Route(path="api/v1/login", methods={"POST"}) 18 | * 19 | * Get api token 20 | */ 21 | public function login(Request $request) 22 | { 23 | $request->validate([ 24 | 'email' => 'required|email', 25 | 'password' => 'required|string', 26 | ]); 27 | 28 | $credentials = request(['email', 'password']); 29 | if (Auth::attempt($credentials)) { 30 | $user = Auth::user(); 31 | $token = $user->createToken('personal-token')->plainTextToken; 32 | return SendResponse::acceptCustom([ 33 | 'status' => 'success', 34 | 'token' => $token 35 | ]); 36 | } 37 | return SendResponse::acceptData('invalid-credentials'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /resources/views/system/change_ip.blade.php: -------------------------------------------------------------------------------- 1 | @extends("system.layoute") 2 | @section("content") 3 |
4 | @csrf 5 |
6 | 7 | 8 |
9 |
10 | 11 | 12 |
13 |
14 | Kembali 15 | 16 |
17 |
18 | @endsection -------------------------------------------------------------------------------- /resources/views/system/layoute.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Extraordinary CBT Administration 8 | 9 | 10 | 11 | 25 |
26 |
27 | @yield("content") 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /app/Directory.php: -------------------------------------------------------------------------------- 1 | hasMany(File::class); 41 | } 42 | 43 | /** 44 | * [getSizeAttribute description] 45 | * @return [type] [description] 46 | */ 47 | public function getSizeAttribute() 48 | { 49 | return File::where('directory_id', $this->id)->get()->sum('size'); 50 | } 51 | 52 | public function banksoal() 53 | { 54 | return $this->hasOne(Banksoal::class); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /app/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 21 | SendEmailVerificationNotification::class, 22 | ], 23 | \Illuminate\Console\Events\CommandStarting::class => [ 24 | AddLogoToOutput::class, 25 | ], 26 | \Illuminate\Console\Events\CommandFinished::class => [ 27 | AddFinishedToOputput::class, 28 | ] 29 | ]; 30 | 31 | /** 32 | * Register any events for your application. 33 | * 34 | * @return void 35 | */ 36 | public function boot() 37 | { 38 | parent::boot(); 39 | 40 | // 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password'); 22 | $table->string('role')->default('guru'); 23 | 24 | $table->uuid('deleted_by')->nullable(); 25 | $table->timestamp('deleted_at')->nullable(); 26 | $table->timestamps(); 27 | 28 | $table->index(['email', 'role']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('users'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Repositories/User/UserRepository.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | final class UserRepository extends AbstractRepository 15 | { 16 | /** 17 | * Table of repository 18 | * @var string $table 19 | */ 20 | protected string $table = 'users'; 21 | 22 | /** 23 | * Get repository's table 24 | * @return string 25 | */ 26 | public function getTable() 27 | { 28 | return $this->table; 29 | } 30 | 31 | /** 32 | * Delete multiple data 33 | * @param array $user_ids 34 | * @return self 35 | */ 36 | public function deletes(array $user_ids): self 37 | { 38 | try { 39 | DB::table($this->table) 40 | ->whereIn($this->primary_key, $user_ids) 41 | ->delete(); 42 | } catch(\Exception $e) { 43 | array_push($this->errors, Error::get($e)); 44 | } 45 | return $this; 46 | } 47 | } -------------------------------------------------------------------------------- /database/migrations/2021_07_17_094457_create_banksoal_adaptif_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('matpel_id'); 19 | $table->string('code'); 20 | $table->string('name'); 21 | $table->integer('max_pg'); 22 | 23 | $table->index(['matpel_id']); 24 | 25 | $table->uuid('deleted_by')->nullable(); 26 | $table->timestamp('deleted_at')->nullable(); 27 | $table->timestamps(); 28 | 29 | $table->index(['matpel_id', 'code']); 30 | }); 31 | } 32 | 33 | /** 34 | * Reverse the migrations. 35 | * 36 | * @return void 37 | */ 38 | public function down() 39 | { 40 | Schema::dropIfExists('banksoal_adaptif'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011826_create_jawaban_soals_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('soal_id'); 19 | $table->longText('text_jawaban'); 20 | $table->char('correct', 1); 21 | 22 | $table->uuid('deleted_by')->nullable(); 23 | $table->timestamp('deleted_at')->nullable(); 24 | $table->timestamps(); 25 | 26 | $table->foreign('soal_id')->references('id')->on('soals')->onDelete('cascade'); 27 | 28 | $table->index(['soal_id', 'correct']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('jawaban_soals'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /resources/views/excel/capaian.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @foreach(range(1, $soals->count()) as $index) 5 | 6 | @endforeach 7 | 8 | 9 | @foreach($pesertas as $fil) 10 | 11 | 15 | @php 16 | $benar = 0; 17 | @endphp 18 | @foreach($soals as $soal) 19 | 28 | @endforeach 29 | 32 | 33 | @endforeach 34 |
No{{ $index }}Benar
12 | {{ $fil['peserta']['nama'] }}
13 | {{ $fil['peserta']['no_ujian'] }} 14 |
20 | @php 21 | $filtered = collect($fil['data'])->firstWhere('soal_id', $soal->id); 22 | if($filtered != '') { 23 | $benar += $filtered->iscorrect; 24 | } 25 | @endphp 26 | {{ $filtered != '' ? $filtered->iscorrect : '-' }} 27 | 30 | {{ $benar }} 31 |
-------------------------------------------------------------------------------- /app/Http/Controllers/Api/Gateway/BanksoalGatewayController.php: -------------------------------------------------------------------------------- 1 | 16 | * @since 3.1.0 17 | */ 18 | public function allData(Request $request) 19 | { 20 | $user = $request->user(); 21 | $banksoals = DB::table('banksoals as t_0') 22 | ->join('matpels as t_1', 't_0.matpel_id', 't_1.id') 23 | ->orderByDesc('t_0.created_at') 24 | ->select( 25 | 't_0.id', 26 | DB::Raw("CONCAT(t_0.kode_banksoal, ' | ', t_1.nama) AS kode_banksoal") 27 | ); 28 | if ($user->role == 'guru') { 29 | $banksoals = $banksoals->where('t_0.author', $user->id); 30 | } 31 | $banksoals = $banksoals->get(); 32 | return SendResponse::acceptData($banksoals); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011145_create_matpels_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('kode_mapel', 100); 19 | $table->text('jurusan_id')->nullable(); 20 | $table->text('agama_id')->nullable()->default(null); 21 | $table->string('correctors')->nullable(); 22 | $table->string('nama'); 23 | 24 | $table->uuid('deleted_by')->nullable(); 25 | $table->timestamp('deleted_at')->nullable(); 26 | $table->timestamps(); 27 | 28 | $table->index(['kode_mapel']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('matpels'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /resources/views/vendor/installer/finished.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master') 2 | 3 | @section('template_title') 4 | {{ trans('installer_messages.final.templateTitle') }} 5 | @endsection 6 | 7 | @section('title') 8 | 9 | {{ trans('installer_messages.final.title') }} 10 | @endsection 11 | 12 | @section('container') 13 | 14 | @if(session('message')['dbOutputLog']) 15 |

{{ trans('installer_messages.final.migration') }}

16 |
{{ session('message')['dbOutputLog'] }}
17 | @endif 18 | 19 |

{{ trans('installer_messages.final.console') }}

20 |
{{ $finalMessages }}
21 | 22 |

{{ trans('installer_messages.final.log') }}

23 |
{{ $finalStatusMessage }}
24 | 25 |

{{ trans('installer_messages.final.env') }}

26 |
{{ $finalEnvFile }}
27 | 28 | 31 | 32 | @endsection 33 | -------------------------------------------------------------------------------- /database/migrations/2021_03_09_184914_create_group_members_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('group_id'); 19 | $table->uuid('student_id'); 20 | 21 | $table->uuid('deleted_by')->nullable(); 22 | $table->timestamp('deleted_at')->nullable(); 23 | $table->timestamps(); 24 | 25 | $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade'); 26 | $table->foreign('student_id')->references('id')->on('pesertas')->onDelete('cascade'); 27 | 28 | $table->index(['group_id', 'student_id']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('group_members'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /resources/lang/zh-CN/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel安装程序', 11 | 'next' => '下一步', 12 | 'finish' => '安装', 13 | 14 | /* 15 | * 16 | * Home page translations. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => '欢迎来到Laravel安装程序', 21 | 'message' => '欢迎来到安装向导.', 22 | ], 23 | 24 | /* 25 | * 26 | * Requirements page translations. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => '环境要求', 31 | ], 32 | 33 | /* 34 | * 35 | * Permissions page translations. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => '权限', 40 | ], 41 | 42 | /* 43 | * 44 | * Environment page translations. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => '环境设置', 49 | 'save' => '保存 .env', 50 | 'success' => '.env 文件保存成功.', 51 | 'errors' => '无法保存 .env 文件, 请手动创建它.', 52 | ], 53 | 54 | /* 55 | * 56 | * Final page translations. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => '完成', 61 | 'finished' => '应用已成功安装.', 62 | 'exit' => '点击退出', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /resources/lang/zh-TW/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel安裝程序', 11 | 'next' => '下一步', 12 | 'finish' => '安裝', 13 | 14 | /* 15 | * 16 | * Home page translations. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => '歡迎來到Laravel安裝程序', 21 | 'message' => '歡迎來到安裝嚮導.', 22 | ], 23 | 24 | /* 25 | * 26 | * Requirements page translations. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => '環境要求', 31 | ], 32 | 33 | /* 34 | * 35 | * Permissions page translations. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => '權限', 40 | ], 41 | 42 | /* 43 | * 44 | * Environment page translations. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => '環境設置', 49 | 'save' => '保存 .env', 50 | 'success' => '.env 文件保存成功.', 51 | 'errors' => '無法保存 .env 文件, 請手動創建它.', 52 | ], 53 | 54 | /* 55 | * 56 | * Final page translations. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => '完成', 61 | 'finished' => '應用已成功安裝.', 62 | 'exit' => '點擊退出', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /public/installer/css/sass/_variables.sass: -------------------------------------------------------------------------------- 1 | //colors 2 | $color_0: #ff0 3 | $color_1: #000 4 | $color_2: silver 5 | $color_3: #666 6 | $color_4: #111 7 | $color_5: #1d73a2 8 | $color_6: #175c82 9 | $color_7: rgba(0, 0, 0, .19) 10 | $color_8: rgba(0, 0, 0, .23) 11 | $color_9: #357295 12 | $color_10: #fff 13 | $color_11: #cacfd2 14 | $color_12: #34a0db 15 | $color_13: rgba(0, 0, 0, .12) 16 | $color_14: rgba(0, 0, 0, .24) 17 | $color_15: #2490cb 18 | $color_16: #eee 19 | $color_17: #222 20 | $color_18: rgba(0, 0, 0, .16) 21 | $color_19: #2ecc71 22 | $color_20: #e74c3c 23 | $color_21: #f5f5f5 24 | $color_22: rgba(0, 0, 0, .2) 25 | 26 | //fonts 27 | $font_0: Ionicons 28 | $font_1: sans-serif 29 | $font_2: monospace 30 | $font_3: Roboto 31 | $font_4: Helvetica Neue 32 | $font_5: Helvetica 33 | $font_6: Arial 34 | $font_7: Courier New 35 | $font_8: Courier 36 | $font_9: Lucida Sans Typewriter 37 | $font_10: Lucida Typewriter 38 | 39 | //urls 40 | $url_0: url(https://fonts.googleapis.com/css?family=Roboto:400,300,500,700,900) 41 | $url_1: url(../fonts/ionicons.eot?v=2.0.1) 42 | $url_2: url(../fonts/ionicons.eot?v=2.0.1#iefix) 43 | $url_3: url(../fonts/ionicons.ttf?v=2.0.1) 44 | $url_4: url(../fonts/ionicons.woff?v=2.0.1) 45 | $url_5: url(../fonts/ionicons.svg?v=2.0.1#Ionicons) 46 | $url_6: url(../img/background.png) -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/HasilUjian.php: -------------------------------------------------------------------------------- 1 | 'array' 32 | ]; 33 | 34 | /** 35 | * [peserta description] 36 | * @return [type] [description] 37 | */ 38 | public function peserta() 39 | { 40 | return $this->hasOne(Peserta::class, 'id', 'peserta_id'); 41 | } 42 | 43 | /** 44 | * 45 | */ 46 | public function group() 47 | { 48 | return $this->hasOne(GroupMember::class, 'student_id', 'peserta_id'); 49 | } 50 | 51 | public function jawabans() 52 | { 53 | return $this->hasMany(JawabanPeserta::class,'id'); 54 | } 55 | 56 | public function banksoal() 57 | { 58 | return $this->belongsTo(Banksoal::class); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /resources/views/system/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends("system.layoute") 2 | @section("content") 3 | @if(Session::has('updated')) 4 |
5 |

Versi terbaru telah rilis v3.0.1.

6 | Update 7 |
8 | @endif 9 | 10 | @if(Session::has('changeip')) 11 |
12 |

IP / Domain berhasil diubah

13 |
14 | @endif 15 | 25 | @endsection -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests/Unit 10 | 11 | 12 | ./tests/Feature 13 | 14 | 15 | 16 | 17 | ./app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /database/seeds/SettingSeeder.php: -------------------------------------------------------------------------------- 1 | 'set_sekolah', 18 | 'value' => [ 19 | 'logo' => '', 20 | 'nama_sekolah' => '', 21 | 'email' => '', 22 | 'alamat' => '', 23 | 'kepala_sekolah' => '', 24 | 'nip_kepsek' => '', 25 | 'tingkat' => 'SMK-SMA' 26 | ], 27 | 'type' => 'sekolah' 28 | ]); 29 | 30 | Setting::create([ 31 | 'name' => 'token', 32 | 'value' => 900, 33 | 'type' => 'general' 34 | ]); 35 | 36 | Setting::create([ 37 | 'name' => 'ujian', 38 | 'type' => 'general', 39 | 'value' => [ 40 | 'reset' => false 41 | ] 42 | ]); 43 | 44 | Setting::create([ 45 | 'name' => 'user-agent-whitelist', 46 | 'type' => 'general', 47 | 'value' => '*' 48 | ]); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /resources/views/vendor/installer/permissions.blade.php: -------------------------------------------------------------------------------- 1 | @extends('vendor.installer.layouts.master') 2 | 3 | @section('template_title') 4 | {{ trans('installer_messages.permissions.templateTitle') }} 5 | @endsection 6 | 7 | @section('title') 8 | 9 | {{ trans('installer_messages.permissions.title') }} 10 | @endsection 11 | 12 | @section('container') 13 | 14 |
    15 | @foreach($permissions['permissions'] as $permission) 16 |
  • 17 | {{ $permission['folder'] }} 18 | 19 | 20 | {{ $permission['permission'] }} 21 | 22 |
  • 23 | @endforeach 24 |
25 | 26 | @if ( ! isset($permissions['errors'])) 27 | 33 | @endif 34 | 35 | @endsection 36 | -------------------------------------------------------------------------------- /app/Console/Commands/Exo/InstallAppCommand.php: -------------------------------------------------------------------------------- 1 | confirm('Extraordinary CBT akan dilakukan fresh installation, with to continue?')) { 41 | 42 | $this->call('migrate:fresh'); 43 | 44 | $this->call('db:seed'); 45 | 46 | $this->call('storage:link'); 47 | 48 | $this->call('cache:clear'); 49 | 50 | $this->call('route:clear'); 51 | 52 | $this->call('config:clear'); 53 | } 54 | return 0; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /database/seeds/AgamaSeeder.php: -------------------------------------------------------------------------------- 1 | $sclr_0, 'updated_at' => $sclr_0]; 27 | 28 | DB::table('agamas')->insert(array_map(function($item) use ($timestamps) { 29 | return array_merge($item, $timestamps); 30 | },[ 31 | [ 'id' => $sclrs[0], 'kode' => 'ISLAM','nama' => 'Islam' ], 32 | [ 'id' => $sclrs[1], 'kode' => 'PROTESTAN','nama' => 'Protestan' ], 33 | [ 'id' => $sclrs[2], 'kode' => 'KATOLIK','nama' => 'Katolik' ], 34 | [ 'id' => $sclrs[3], 'kode' => 'HINDU','nama' => 'Hindu' ], 35 | [ 'id' => $sclrs[4], 'kode' => 'BUDHA','nama' => 'Budha'] 36 | ],)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /resources/lang/ar/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'تنصيب Laravel', 11 | 'next' => 'متابعة', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'تنصيب Laravel', 20 | 'message' => 'أهلا بك في صفحة تنصيب Laravel', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'المتطلبات', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'تراخيص المجلدات', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'الإعدادات', 48 | 'save' => 'حفظ ملف .env', 49 | 'success' => 'تم حفظ الإعدادات بنجاح', 50 | 'errors' => 'حدث خطأ أثناء إنشاء ملف .env. رجاءا قم بإنشاءه يدويا', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'النهاية', 60 | 'finished' => 'تم تنصيب البرنامج بنجاح...', 61 | 'exit' => 'إضغط هنا للخروج', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | cache($name, $key, null, -5); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/Imports/UserImport.php: -------------------------------------------------------------------------------- 1 | filter()->isNotEmpty()) { 19 | array_push($users, [ 20 | 'id' => Str::uuid()->toString(), 21 | 'name' => $row[0], 22 | 'email' => $row[1], 23 | 'password' => bcrypt($row[2]) 24 | ]); 25 | } 26 | } 27 | $in_array = DB::table('users')->whereIn('email', array_map(function($item) { 28 | return $item['email']; 29 | }, $users))->count(); 30 | if ($in_array) { 31 | throw new \Exception('duplicate email in excel'); 32 | } 33 | 34 | DB::table('users')->insert($users); 35 | } 36 | 37 | public function startRow(): int 38 | { 39 | return 2; 40 | } 41 | 42 | public function rules(): array 43 | { 44 | return [ 45 | '1' => 'unique:users,email|email' 46 | ]; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Console/Commands/Exo/MakeServiceCommand.php: -------------------------------------------------------------------------------- 1 | 'نصب کننده لاراول', 11 | 'next' => 'قدم بعدی', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'به نصب کننده خوش آمدید', 20 | 'message' => 'به جادوگر نصب خوش آمدید .', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'نیازمندی ها', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'مجوز های دسترسی', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'تنظیمات پیکربندی', 48 | 'save' => 'ذخیره کردن .env', 49 | 'success' => 'فایل .env برای شما ذخیره شد.', 50 | 'errors' => 'ذخیره کردن فایل .env امکان پذیر نیست، لطفا آن را به صورت دستی ایجاد کنید.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'تمام شد', 60 | 'finished' => 'اپلیکیشن با موفقیت نصب شد.', 61 | 'exit' => 'برای خروج اینجا را کلیک کنید', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /config/exo.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'name' => env('EXO_APP_VERSION_NAME', 'ristretto'), 12 | 'code' => env('EXO_APP_VERSION_CODE', '3.0.0'), 13 | ], 14 | 15 | /* 16 | |-------------------------------------------------------------------------- 17 | | Konfigurasi ujian default 18 | |-------------------------------------------------------------------------- 19 | | 20 | | Pengaturan ini mengatur tentang bagaimana cara ujian berlangsung dan 21 | | bagaimana cara memanage nya dengan rapih dan terstruktur 22 | | 23 | */ 24 | 'token_expired' => env('EXO_TOKEN_EXAM_EXPIRES', 600), 25 | 26 | 'log' => env('EXO_ALLOW_LOG_ERROR', true), 27 | 28 | 'enable_cache' => env('EXO_ENABLE_CACHING', false), 29 | 30 | 'enable_socket' => env('EXO_ENABLE_SOCKET', false), 31 | 32 | 'softdel' => env('EXO_ENABLE_SOFTDEL', true), 33 | 34 | /* 35 | |-------------------------------------------------------------------------- 36 | | Konfigurasi oauth 37 | |-------------------------------------------------------------------------- 38 | | 39 | | Pengaturan ini mengatur tentang bagaimana cara login ke sistem 40 | | melalui metode oauth 41 | | 42 | */ 43 | 'oauth_server_url' => env('EXO_OAUTH_SERVER_URL', 'http://localhost'), 44 | ]; 45 | -------------------------------------------------------------------------------- /resources/lang/et/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laraveli installer', 11 | 'next' => 'Järgmine samm', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'Tere tulemast Laraveli installerisse', 20 | 'message' => 'Tere tulemast installatsiooniviisardisse.', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'Nõuded', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'Õigused', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'Keskkonna seaded', 48 | 'save' => 'Salvesta .env', 49 | 'success' => 'Sinu .env faili seaded on salvestatud.', 50 | 'errors' => 'Ei saanud .env faili salvesta, palun loo see manuaalselt.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'Lõpetatud', 60 | 'finished' => 'Laravel on edukalt installitud', 61 | 'exit' => 'Väljumiseks vajuta siia', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /app/Console/Commands/Exo/MakeRepositoryCommand.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->integer('sesi'); 19 | $table->string('no_ujian', 50)->unique(); 20 | $table->uuid('agama_id'); 21 | $table->uuid('jurusan_id', 10); 22 | $table->string('nama'); 23 | $table->string('password'); 24 | $table->string('api_token')->nullable(); 25 | $table->integer('status')->default(1); 26 | $table->string('block_reason')->nullable(); 27 | $table->boolean('antiblock')->default(false); 28 | 29 | $table->uuid('deleted_by')->nullable(); 30 | $table->timestamp('deleted_at')->nullable(); 31 | $table->timestamps(); 32 | 33 | $table->index(['no_ujian', 'api_token']); 34 | }); 35 | } 36 | 37 | /** 38 | * Reverse the migrations. 39 | * 40 | * @return void 41 | */ 42 | public function down() 43 | { 44 | Schema::dropIfExists('pesertas'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /resources/lang/pl/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel Instalator', 11 | 'next' => 'Następny krok', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'Instalacja Laravel', 20 | 'message' => 'Witaj w kreatorze instalacji.', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'Wymagania systemowe ', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'Uprawnienia', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'Ustawnienia środowiska', 48 | 'save' => 'Zapisz .env', 49 | 'success' => 'Plik .env został poprawnie zainstalowany.', 50 | 'errors' => 'Nie można zapisać pliku .env, Proszę utworzyć go ręcznie.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'Instalacja zakończona', 60 | 'finished' => 'Aplikacja została poprawnie zainstalowana.', 61 | 'exit' => 'Kliknij aby zakończyć', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /app/Utils/SoalUtil.php: -------------------------------------------------------------------------------- 1 | 11 | * @since 3.0.1 12 | */ 13 | class SoalUtil 14 | { 15 | /** 16 | * get tipe soal text 17 | * 18 | * @author shellrean 19 | * @since 3.0.1 20 | * @param int $tipe_soal 21 | * @return string 22 | */ 23 | public static function tipeSoalTextOf(int $tipe_soal) 24 | { 25 | switch ($tipe_soal) { 26 | case SoalConstant::TIPE_PG: 27 | return "PG"; 28 | case SoalConstant::TIPE_ESAY: 29 | return "ESAY"; 30 | case SoalConstant::TIPE_LISTENING: 31 | return "LISTENING"; 32 | case SoalConstant::TIPE_PG_KOMPLEK: 33 | return "PG_KOMPLEK"; 34 | case SoalConstant::TIPE_MENJODOHKAN: 35 | return "MENJODOHKAN"; 36 | case SoalConstant::TIPE_ISIAN_SINGKAT: 37 | return "ISIAN_SINGKAT"; 38 | case SoalConstant::TIPE_MENGURUTKAN: 39 | return "MENGURUTKAN"; 40 | case SoalConstant::TIPE_BENAR_SALAH: 41 | return "BENAR_SALAH"; 42 | case SoalConstant::TIPE_SETUJU_TIDAK: 43 | return "SETUJU_TIDAK"; 44 | default: 45 | return "UNKNOWN"; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /resources/lang/nl/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel Installer', 11 | 'next' => 'Volgende stap', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'Welkom bij het installatie proces...', 20 | 'message' => 'Welkom bij de installatiewizard', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'Vereisten', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'Permissies', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'Environment Settings', 48 | 'save' => '.env Opslaan', 49 | 'success' => 'Uw .env bestand is opgeslagen.', 50 | 'errors' => 'Het is niet mogelijk om een .env bestand aan te maken, maak a.u.b het bestand zelf aan.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'Voltooid', 60 | 'finished' => 'Applicatie is succesvol geïnstalleerd.', 61 | 'exit' => 'Klik hier om af te sluiten.', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /public/installer/css/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | //colors 2 | $color_0: #ff0; 3 | $color_1: #000; 4 | $color_2: silver; 5 | $color_3: #666; 6 | $color_4: #111; 7 | $color_5: #1d73a2; 8 | $color_6: #175c82; 9 | $color_7: rgba(0, 0, 0, .19); 10 | $color_8: rgba(0, 0, 0, .23); 11 | $color_9: #357295; 12 | $color_10: #fff; 13 | $color_11: #cacfd2; 14 | $color_12: #34a0db; 15 | $color_13: #3d657b; 16 | $color_14: rgba(0, 0, 0, .12); 17 | $color_15: rgba(0, 0, 0, .24); 18 | $color_16: #2490cb; 19 | $color_17: #eee; 20 | $color_18: #222; 21 | $color_19: rgba(0, 0, 0, .16); 22 | $color_20: #2ecc71; 23 | $color_21: #e74c3c; 24 | $color_22: #f5f5f5; 25 | $color_23: rgba(0, 0, 0, .2); 26 | $color_24: #ff0000; 27 | $color_25: #000000; 28 | $color_26: red; 29 | $color_27: #dddddd; 30 | $color_28: #ddd; 31 | $color_29: #333; 32 | $color_30: #ffff00; 33 | $color_31: #008000; 34 | $color_32: darkgray; 35 | $color_33: #008080; 36 | $color_34: #144242; 37 | $color_35: #a9a9a9; 38 | $color_36: rgba(0, 0, 0, 0.1); 39 | $color_37: #ccc; 40 | $color_38: rgba(0, 0, 0, 0.3); 41 | $color_39: #ffffff; 42 | 43 | //fonts 44 | $font_0: sans-serif; 45 | $font_1: monospace; 46 | $font_2: Roboto; 47 | $font_3: Helvetica Neue; 48 | $font_4: Helvetica; 49 | $font_5: Arial; 50 | $font_6: Courier New; 51 | $font_7: Courier; 52 | $font_8: Lucida Sans Typewriter; 53 | $font_9: Lucida Typewriter; 54 | $font_10: Ionicons; 55 | 56 | //urls 57 | $url_0: 'https://fonts.googleapis.com/css?family=Roboto:400,300,500,700,900'; 58 | $url_1: '../img/background.png'; -------------------------------------------------------------------------------- /resources/lang/ro/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Procesul de instalare Laravel', 11 | 'next' => 'Pasul următor', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'Bun venit în procesul de instalare...', 20 | 'message' => 'Bun venit în configurarea asistată.', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'Cerințe', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'Permisiuni', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'Settări ale mediului', 48 | 'save' => 'Salvează fișier .env', 49 | 'success' => 'Setările tale au fost salvate în fișierul .env.', 50 | 'errors' => 'Nu am putut salva fișierul .env, Te rugăm să-l creezi manual.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'Am terminat', 60 | 'finished' => 'Aplicația a fost instalată cu succes.', 61 | 'exit' => 'Click aici pentru a ieși', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /resources/js/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | import siswa_auth from './stores/siswa/auth.js' 5 | import siswa_user from './stores/siswa/user.js' 6 | import siswa_ujian from './stores/siswa/ujian.js' 7 | import siswa_jadwal from './stores/siswa/jadwal.js' 8 | import siswa_channel from './stores/siswa/channel.js' 9 | 10 | Vue.use(Vuex) 11 | 12 | const store = new Vuex.Store({ 13 | modules: { 14 | siswa_auth, 15 | siswa_user, 16 | siswa_ujian, 17 | siswa_jadwal, 18 | siswa_channel 19 | }, 20 | state: { 21 | token: localStorage.getItem('token'), 22 | errors: [], 23 | isLoading: false, 24 | isLoadinger: false, 25 | setting: [] 26 | }, 27 | getters: { 28 | isAuth: state => { 29 | return state.token != 'null' && state.token != null 30 | }, 31 | isLoading: state => { 32 | return state.isLoading 33 | }, 34 | isLoadinger: state => { 35 | return state.isLoadinger 36 | }, 37 | setting: state => { 38 | return state.setting 39 | } 40 | }, 41 | mutations: { 42 | SET_TOKEN(state, payload) { 43 | state.token = payload 44 | }, 45 | SET_ERRORS(state, payload) { 46 | state.errors = payload 47 | }, 48 | CLEAR_ERRORS(state) { 49 | state.errors = [] 50 | }, 51 | SET_LOADING(state, payload) { 52 | state.isLoading = payload 53 | }, 54 | SET_LOADINGER(state, payload) { 55 | state.isLoadinger = payload 56 | }, 57 | SET_SETTING(state, payload) { 58 | state.setting = payload 59 | } 60 | } 61 | }) 62 | 63 | export default store -------------------------------------------------------------------------------- /resources/lang/it/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel Installer', 10 | 'next' => 'Passo successivo', 11 | 'finish' => 'Installa', 12 | /* 13 | * 14 | * Home page translations. 15 | * 16 | */ 17 | 'welcome' => [ 18 | 'title' => 'Benvenuto al programma di installazione', 19 | 'message' => 'Benvenuto alla configurazione guidata.', 20 | ], 21 | /* 22 | * 23 | * Requirements page translations. 24 | * 25 | */ 26 | 'requirements' => [ 27 | 'title' => 'Requisiti', 28 | ], 29 | /* 30 | * 31 | * Permissions page translations. 32 | * 33 | */ 34 | 'permissions' => [ 35 | 'title' => 'Permessi', 36 | ], 37 | /* 38 | * 39 | * Environment page translations. 40 | * 41 | */ 42 | 'environment' => [ 43 | 'title' => 'Configurazione ambiente', 44 | 'save' => 'Salva .env', 45 | 'success' => 'La configurazione del file .env è stata salvata correttamente.', 46 | 'errors' => 'Impossibile salvare il file .env, per favore crealo manualmente.', 47 | ], 48 | /* 49 | * 50 | * Final page translations. 51 | * 52 | */ 53 | 'final' => [ 54 | 'title' => 'Finito', 55 | 'finished' => 'L\'applicazione è stata configurata correttamente.', 56 | 'exit' => 'Clicca qui per uscire', 57 | ], 58 | ]; 59 | -------------------------------------------------------------------------------- /resources/lang/pt-br/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Instalador Laravel', 11 | 'next' => 'Próximo Passo', 12 | 'finish' => 'Instalar', 13 | 14 | /* 15 | * 16 | * Home page translations. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => 'Bem-vindo ao Instalador', 21 | 'message' => 'Bem-vindo ao assistente de configuração.', 22 | ], 23 | 24 | /* 25 | * 26 | * Requirements page translations. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => 'Requisitos', 31 | ], 32 | 33 | /* 34 | * 35 | * Permissions page translations. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => 'Permissões', 40 | ], 41 | 42 | /* 43 | * 44 | * Environment page translations. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => 'Configurações de Ambiente', 49 | 'save' => 'Salvar .env', 50 | 'success' => 'Suas configurações de arquivo .env foram salvas.', 51 | 'errors' => 'Não foi possível salvar o arquivo .env, por favor crie-o manualmente.', 52 | ], 53 | 54 | /* 55 | * 56 | * Final page translations. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => 'Terminado', 61 | 'finished' => 'Aplicação foi instalada com sucesso', 62 | 'exit' => 'Clique aqui para sair', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /resources/lang/pt/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Instalação de Laravel', 11 | 'next' => 'Próximo Passo', 12 | 'finish' => 'Instalar', 13 | 14 | /* 15 | * 16 | * Home page translations. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => 'Bem-vindo ao Instalador', 21 | 'message' => 'Bem-vindo ao assistente de configuração.', 22 | ], 23 | 24 | /* 25 | * 26 | * Requirements page translations. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => 'Requisitos', 31 | ], 32 | 33 | /* 34 | * 35 | * Permissions page translations. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => 'Permissões', 40 | ], 41 | 42 | /* 43 | * 44 | * Environment page translations. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => 'Configurações de Ambiente', 49 | 'save' => 'Salvar .env', 50 | 'success' => 'As configurações de seu arquivo .env foram gravadas.', 51 | 'errors' => 'Não foi possível gravar o arquivo .env, por favor crie-o manualmente.', 52 | ], 53 | 54 | /* 55 | * 56 | * Final page translations. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => 'Terminado', 61 | 'finished' => 'Aplicação foi instalada com sucesso', 62 | 'exit' => 'Clique aqui para sair', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /app/SiswaUjian.php: -------------------------------------------------------------------------------- 1 | hasOne('App\Peserta','id','peserta_id'); 30 | } 31 | 32 | /** 33 | * [getStatusAttribute description] 34 | * @return [type] [description] 35 | */ 36 | public function getStatusAttribute() 37 | { 38 | switch(trim($this->status_ujian)) { 39 | case '0': 40 | $res = 'Belum mulai'; 41 | break; 42 | case '3': 43 | $res = 'Sedang mengerjakan'; 44 | break; 45 | case '1': 46 | $res = 'Test selesai'; 47 | break; 48 | default: 49 | $res = 'Untrace'; 50 | } 51 | 52 | return $res; 53 | } 54 | 55 | /** 56 | * [hasil description] 57 | * @return [type] [description] 58 | */ 59 | public function hasil() 60 | { 61 | return $this->hasOne('App\HasilUjian','peserta_id','peserta_id'); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /resources/lang/gr/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Εγκατάσταση Laravel', 11 | 'next' => 'Επόμενο', 12 | 13 | /* 14 | * 15 | * Home page translations. 16 | * 17 | */ 18 | 'welcome' => [ 19 | 'title' => 'Καλωσήρθαστε στο Installer', 20 | 'message' => 'Καλωσήρθατε στον οδηγό εγκατάστασης.', 21 | ], 22 | 23 | /* 24 | * 25 | * Requirements page translations. 26 | * 27 | */ 28 | 'requirements' => [ 29 | 'title' => 'Απαιτήσεις συστήματος', 30 | ], 31 | 32 | /* 33 | * 34 | * Permissions page translations. 35 | * 36 | */ 37 | 'permissions' => [ 38 | 'title' => 'Δικαιώματα', 39 | ], 40 | 41 | /* 42 | * 43 | * Environment page translations. 44 | * 45 | */ 46 | 'environment' => [ 47 | 'title' => 'Ρυθμίσεις Περιβάλλοντος', 48 | 'save' => 'Αποθήκευση .env αρχείου', 49 | 'success' => 'Το αρχείο ρυθμίσεων .env έχει αποθηκευτεί με επιτυχία.', 50 | 'errors' => 'Το αρχείο ρυθμίσεων .env ΔΕΝ μπόρεσε να αποθηκευτεί με επιτυχία. Παρακαλώ δημιουργίστε το χειροκίνητα.', 51 | ], 52 | 53 | /* 54 | * 55 | * Final page translations. 56 | * 57 | */ 58 | 'final' => [ 59 | 'title' => 'Ολοκληρώθηκε', 60 | 'finished' => 'Το πρόγραμμά σας εγκαταστάθηκε με επιτυχία.', 61 | 'exit' => 'Πατήστε εδώ για έξοδο.', 62 | ], 63 | ]; 64 | -------------------------------------------------------------------------------- /resources/lang/de/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Laravel Installer', 11 | 'next' => 'Nächster Schritt', 12 | 'finish' => 'Installieren', 13 | 14 | /* 15 | * 16 | * Home page translations. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => 'Willkommen zum Installer', 21 | 'message' => 'Willkommen zum Laravel Installationsassistent.', 22 | ], 23 | 24 | /* 25 | * 26 | * Requirements page translations. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => 'Vorraussetzungen', 31 | ], 32 | 33 | /* 34 | * 35 | * Permissions page translations. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => 'Berechtigungen', 40 | ], 41 | 42 | /* 43 | * 44 | * Environment page translations. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => 'Umgebungsvariablen', 49 | 'save' => 'Speichere .env', 50 | 'success' => 'Ihre .env Konfiguration wurde gespeichert.', 51 | 'errors' => 'Ihre .env Konfiguration konnte nicht gespeichert werden. Bitte erstellen Sie diese manuell.', 52 | ], 53 | 54 | /* 55 | * 56 | * Final page translations. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => 'Fertig!', 61 | 'finished' => 'Die Anwendung wurde erfolgreich installiert.', 62 | 'exit' => 'Hier klicken zum Beenden', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /routes/api_v2.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | Route::namespace('Api\v2')->group(function() { 12 | 13 | Route::post('logedin','PesertaLoginController@login'); 14 | Route::get('setting', 'PesertaLoginController@getSetting'); 15 | 16 | Route::group(['middleware' => 'peserta'], function() { 17 | Route::get('peserta-authenticated', 'PesertaLoginController@authenticated'); 18 | Route::get('peserta/logout','PesertaLoginController@logout'); 19 | Route::get('jadwals/peserta', 'JadwalController@getJadwalPeserta'); 20 | Route::get('ujians/uncomplete','UjianAktifController@uncompleteUjian'); 21 | Route::get('ujians/peserta', 'UjianAktifController@getUjianPesertaAktif'); 22 | Route::post('ujians/start', 'UjianAktifController@startUjian'); 23 | Route::post('ujians/start/time', 'UjianAktifController@startUjianTime'); 24 | Route::get('ujians/filled', 'UjianAktifController@getJawabanPeserta'); 25 | Route::post('ujian/hasils', 'UjianAktifController@getHasilUjian'); 26 | Route::post('ujian','UjianController@store'); 27 | Route::post('ujian/ragu-ragu', 'UjianController@setRagu'); 28 | Route::get('ujian/selesai', 'UjianController@selesai'); 29 | Route::post('ujians/leave-counter', 'UjianAktifController@leaveCounter'); 30 | Route::post('ujians/block-me-please', 'UjianAktifController@blockMePlease'); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /stubs/controller.api.stub: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class {{ class }} extends Controller 13 | { 14 | /** 15 | * Display a listing of the resource. 16 | * 17 | * @return \Illuminate\Http\Response 18 | */ 19 | public function index() 20 | { 21 | // 22 | } 23 | 24 | /** 25 | * Store a newly created resource in storage. 26 | * 27 | * @param \Illuminate\Http\Request $request 28 | * @return \Illuminate\Http\Response 29 | */ 30 | public function store(Request $request) 31 | { 32 | // 33 | } 34 | 35 | /** 36 | * Display the specified resource. 37 | * 38 | * @param int $id 39 | * @return \Illuminate\Http\Response 40 | */ 41 | public function show($id) 42 | { 43 | // 44 | } 45 | 46 | /** 47 | * Update the specified resource in storage. 48 | * 49 | * @param \Illuminate\Http\Request $request 50 | * @param int $id 51 | * @return \Illuminate\Http\Response 52 | */ 53 | public function update(Request $request, $id) 54 | { 55 | // 56 | } 57 | 58 | /** 59 | * Remove the specified resource from storage. 60 | * 61 | * @param int $id 62 | * @return \Illuminate\Http\Response 63 | */ 64 | public function destroy($id) 65 | { 66 | // 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /resources/lang/es/installer_messages.php: -------------------------------------------------------------------------------- 1 | 'Instalador de Laravel', 11 | 'next' => 'Siguiente', 12 | 'finish' => 'Instalar', 13 | 14 | /* 15 | * 16 | * Traducciones de la página principal. 17 | * 18 | */ 19 | 'welcome' => [ 20 | 'title' => 'Bienvenido al instalador', 21 | 'message' => 'Bienvenido al asistente de configuración', 22 | ], 23 | 24 | /* 25 | * 26 | * Tranducciones de la página de requisitos. 27 | * 28 | */ 29 | 'requirements' => [ 30 | 'title' => 'Requisitos', 31 | ], 32 | 33 | /* 34 | * 35 | * Traducciones de la pagina de permisos. 36 | * 37 | */ 38 | 'permissions' => [ 39 | 'title' => 'Permisos', 40 | ], 41 | 42 | /* 43 | * 44 | * Traducciones de la página de entorno. 45 | * 46 | */ 47 | 'environment' => [ 48 | 'title' => 'Configuraciones del entorno', 49 | 'save' => 'Guardar archivo .env', 50 | 'success' => 'Los cambios en tu archivo .env han sido guardados.', 51 | 'errors' => 'No es posible crear el archivo .env, por favor intentalo manualmente.', 52 | ], 53 | 54 | /* 55 | * 56 | * Traducciones de la página final. 57 | * 58 | */ 59 | 'final' => [ 60 | 'title' => 'Finalizado.', 61 | 'finished' => 'La aplicación ha sido instalada con éxito!', 62 | 'exit' => 'Haz click aquí para salir.', 63 | ], 64 | ]; 65 | -------------------------------------------------------------------------------- /resources/js/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import store from './store.js' 4 | 5 | const LoginUjian = () => import('./pages/siswa/LoginUjian.vue') 6 | import IndexUjian from './pages/siswa/Index' 7 | import UjianKonfirm from './pages/siswa/UjianKonfirm' 8 | import UjianPrepare from './pages/siswa/UjianPrepare' 9 | import Ujian from './pages/siswa/Ujian' 10 | import UjianSelesai from './pages/siswa/UjianSelesai' 11 | 12 | Vue.use(Router) 13 | 14 | const router = new Router({ 15 | mode: 'hash', 16 | routes: [ 17 | { 18 | path: '/', 19 | name: 'login', 20 | component: LoginUjian, 21 | }, 22 | { 23 | path: '/ujian', 24 | component: IndexUjian, 25 | meta: { requiresAuth: true }, 26 | children: [ 27 | { 28 | path: 'konfirm', 29 | name: 'ujian.konfirm', 30 | component: UjianKonfirm 31 | }, 32 | { 33 | path: 'prepare', 34 | name: 'ujian.prepare', 35 | component: UjianPrepare 36 | }, 37 | { 38 | path: 'extraordinary', 39 | name: 'ujian.while', 40 | component: Ujian 41 | }, 42 | { 43 | path: 'selesai', 44 | name: 'ujian.selesai', 45 | component: UjianSelesai 46 | } 47 | ] 48 | } 49 | ] 50 | }) 51 | 52 | router.beforeEach((to, from , next) => { 53 | store.commit('CLEAR_ERRORS') 54 | if (to.matched.some(record => record.meta.requiresAuth)) { 55 | let auth = store.getters.isAuth 56 | if (!auth) { 57 | next({ name: 'login' }) 58 | } 59 | else { 60 | next() 61 | } 62 | } 63 | else { 64 | next() 65 | } 66 | }) 67 | export default router 68 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011745_create_soals_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('banksoal_id'); 19 | $table->integer('tipe_soal')->comment('1: Pilihan Ganda | 2: Esay | 3: Listening'); 20 | $table->integer('case_sensitive')->default(1); 21 | $table->longText('pertanyaan'); 22 | $table->longText('rujukan')->nullable(); 23 | $table->string('audio')->nullable(); 24 | $table->string('direction')->nullable(); 25 | $table->longText('analys')->nullable(); 26 | $table->integer('layout')->default(1); 27 | 28 | $table->uuid('deleted_by')->nullable(); 29 | $table->timestamp('deleted_at')->nullable(); 30 | $table->timestamps(); 31 | 32 | $table->foreign('banksoal_id')->references('id')->on('banksoals')->onDelete('cascade'); 33 | 34 | $table->index(['banksoal_id', 'tipe_soal']); 35 | }); 36 | } 37 | 38 | /** 39 | * Reverse the migrations. 40 | * 41 | * @return void 42 | */ 43 | public function down() 44 | { 45 | Schema::dropIfExists('soals'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Services/PaginationService.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | final class PaginationService 17 | { 18 | /** 19 | * Cache handler 20 | * @var CacheHandler $cache 21 | */ 22 | private $cache; 23 | 24 | /** 25 | * @param CacheHandler $cache 26 | * @return void 27 | */ 28 | public function __construct(CacheHandler $cache) 29 | { 30 | $this->cache = $cache; 31 | } 32 | 33 | /** 34 | * Create pagination data 35 | * @param RepositoryInterface $repository 36 | * @param array $conditions 37 | * @param int $perPage 38 | * @return LengthAwarePaginator 39 | */ 40 | public function build(RepositoryInterface $repository, array $conditions, int $perPage = 10): ?LengthAwarePaginator 41 | { 42 | try { 43 | $data = DB::table($repository->getTable()); 44 | if ($conditions) { 45 | $data = $data->where($conditions); 46 | } 47 | $data = $data->paginate($perPage); 48 | } catch (\Exception $e) { 49 | if (config('exo.log')) { 50 | Log::emergency([Error::get($e)]); 51 | } 52 | return null; 53 | } 54 | 55 | return $data; 56 | } 57 | } -------------------------------------------------------------------------------- /app/Repositories/Matpel/MatpelRepository.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | final class MatpelRepository extends AbstractRepository 14 | { 15 | /** 16 | * Table name of repository 17 | * @var string 18 | */ 19 | protected string $table = 'matpels'; 20 | 21 | /** 22 | * Get table repository name 23 | * @return string 24 | */ 25 | public function getTable() 26 | { 27 | return $this->table; 28 | } 29 | 30 | /** 31 | * Get all data source 32 | * @return self 33 | */ 34 | public function fetchAll(): self 35 | { 36 | try { 37 | $data = DB::table($this->table) 38 | ->get(); 39 | 40 | $this->entities = $data; 41 | } catch (\Exception $e) { 42 | array_push($this->errors, Error::get($e)); 43 | } 44 | 45 | return $this; 46 | } 47 | 48 | /** 49 | * Delete multi data source 50 | * @param array $ids 51 | * @return self 52 | */ 53 | public function deletes(array $ids): self 54 | { 55 | try { 56 | DB::table($this->table) 57 | ->whereIn($this->primary_key, $ids) 58 | ->delete(); 59 | } catch (\Exception $e) { 60 | array_push($this->errors, Error::get($e)); 61 | } 62 | 63 | return $this; 64 | } 65 | } -------------------------------------------------------------------------------- /database/migrations/2021_10_11_102624_create_penilaian_argument_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('banksoal_id'); 19 | $table->uuid('peserta_id'); 20 | $table->uuid('jawab_id'); 21 | $table->uuid('corrected_by'); 22 | $table->float('point'); 23 | 24 | $table->uuid('deleted_by')->nullable(); 25 | $table->timestamp('deleted_at')->nullable(); 26 | $table->timestamps(); 27 | 28 | $table->foreign('banksoal_id')->references('id')->on('banksoals')->onDelete('cascade'); 29 | $table->foreign('peserta_id')->references('id')->on('pesertas')->onDelete('cascade'); 30 | $table->foreign('jawab_id')->references('id')->on('jawaban_pesertas')->onDelete('cascade'); 31 | $table->foreign('corrected_by')->references('id')->on('users')->onDelete('cascade'); 32 | 33 | $table->index(['banksoal_id', 'peserta_id', 'jawab_id']); 34 | }); 35 | } 36 | 37 | /** 38 | * Reverse the migrations. 39 | * 40 | * @return void 41 | */ 42 | public function down() 43 | { 44 | Schema::dropIfExists('penilaian_argument'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /database/migrations/2020_07_11_112718_create_siswa_ujians_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('peserta_id'); 19 | $table->uuid('jadwal_id'); 20 | $table->string('mulai_ujian'); 21 | $table->string('mulai_ujian_shadow'); 22 | $table->string('selesai_ujian')->nullable(); 23 | $table->integer('uploaded')->default('0'); 24 | $table->integer('sisa_waktu'); 25 | $table->char('status_ujian'); 26 | $table->integer('out_ujian_counter')->default(0); 27 | $table->uuid('deleted_by')->nullable(); 28 | $table->timestamp('deleted_at')->nullable(); 29 | $table->timestamps(); 30 | 31 | $table->foreign('peserta_id')->references('id')->on('pesertas')->onDelete('cascade'); 32 | $table->foreign('jadwal_id')->references('id')->on('jadwals')->onDelete('cascade'); 33 | 34 | $table->index(['peserta_id', 'jadwal_id', 'status_ujian']); 35 | }); 36 | } 37 | 38 | /** 39 | * Reverse the migrations. 40 | * 41 | * @return void 42 | */ 43 | public function down() 44 | { 45 | Schema::dropIfExists('siswa_ujians'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Repositories/Jurusan/JurusanRepository.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | final class JurusanRepository extends AbstractRepository 14 | { 15 | /** 16 | * Table of repository 17 | * @var string 18 | */ 19 | protected string $table = 'jurusans'; 20 | 21 | protected bool $timestamps = false; 22 | 23 | /** 24 | * Get table 25 | * @return string 26 | */ 27 | public function getTable(): string 28 | { 29 | return $this->table; 30 | } 31 | 32 | /** 33 | * Fetch all data 34 | * @return self 35 | */ 36 | public function fetchAll(): self 37 | { 38 | try { 39 | $data = DB::table($this->table) 40 | ->orderBy('nama') 41 | ->get(); 42 | 43 | $this->entities = $data; 44 | } catch (\Exception $e) { 45 | array_push($this->errors, Error::get($e)); 46 | } 47 | return $this; 48 | } 49 | 50 | /** 51 | * Delete multiple data 52 | * @return self 53 | */ 54 | public function deletes(array $ids): self 55 | { 56 | try { 57 | DB::table($this->table) 58 | ->whereIn('id', $ids) 59 | ->delete(); 60 | 61 | } catch (\Exception $e) { 62 | array_push($this->errors, Error::get($e)); 63 | } 64 | return $this; 65 | } 66 | } -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011939_create_jawaban_esays_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->uuid('banksoal_id'); 19 | $table->uuid('peserta_id'); 20 | $table->uuid('jawab_id'); 21 | $table->uuid('corrected_by'); 22 | $table->float('point'); 23 | 24 | $table->uuid('deleted_by')->nullable(); 25 | $table->timestamp('deleted_at')->nullable(); 26 | $table->timestamps(); 27 | 28 | $table->foreign('banksoal_id')->references('id')->on('banksoals')->onDelete('cascade'); 29 | $table->foreign('peserta_id')->references('id')->on('pesertas')->onDelete('cascade'); 30 | $table->foreign('jawab_id')->references('id')->on('jawaban_pesertas')->onDelete('cascade'); 31 | $table->foreign('corrected_by')->references('id')->on('users')->onDelete('cascade'); 32 | 33 | $table->index(['banksoal_id', 'peserta_id', 'jawab_id', 'corrected_by'], 'penilaian_esay_indexees0'); 34 | }); 35 | } 36 | 37 | /** 38 | * Reverse the migrations. 39 | * 40 | * @return void 41 | */ 42 | public function down() 43 | { 44 | Schema::dropIfExists('penilaian_esay'); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /database/migrations/2020_07_10_011609_create_jadwals_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->text('banksoal_id'); 19 | $table->text('group_ids')->nullable(); 20 | $table->string('alias', 50); 21 | $table->date('tanggal'); 22 | $table->time('mulai'); 23 | $table->integer('lama'); 24 | $table->integer('min_test')->default(0); 25 | $table->char('status_ujian',1); 26 | $table->uuid('event_id')->nullable()->default(null); 27 | $table->integer('sesi')->default(1); 28 | $table->text('setting'); 29 | $table->text('mulai_sesi')->nullable(); 30 | $table->integer('view_result')->default(0); 31 | 32 | $table->uuid('deleted_by')->nullable(); 33 | $table->timestamp('deleted_at')->nullable(); 34 | $table->uuid('created_by')->nullable(); 35 | $table->timestamps(); 36 | 37 | $table->index(['tanggal', 'status_ujian', 'event_id']); 38 | }); 39 | } 40 | 41 | /** 42 | * Reverse the migrations. 43 | * 44 | * @return void 45 | */ 46 | public function down() 47 | { 48 | Schema::dropIfExists('jadwals'); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/Http/Controllers/System/SystemController.php: -------------------------------------------------------------------------------- 1 | validate([ 23 | 'protocol' => 'required|in:http,https', 24 | 'ip_address' => 'required' 25 | ]); 26 | 27 | $app_url = $request->protocol.'//'.$request->ip_address; 28 | $this->setEnvironmentValue('APP_URL', $app_url); 29 | 30 | return redirect(route('system.exo.index'))->with('changeip', true); 31 | } 32 | 33 | public function checkUpdate() 34 | { 35 | return redirect(route('system.exo.index'))->with('updated', true); 36 | } 37 | 38 | private function setEnvironmentValue($envKey, $envValue) 39 | { 40 | $envFile = app()->environmentFilePath(); 41 | $str = file_get_contents($envFile); 42 | 43 | $str .= "\n"; 44 | $keyPosition = strpos($str, "{$envKey}="); 45 | $endOfLinePosition = strpos($str, PHP_EOL, $keyPosition); 46 | $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition); 47 | $str = str_replace($oldLine, "{$envKey}={$envValue}", $str); 48 | $str = substr($str, 0, -1); 49 | 50 | $fp = fopen($envFile, 'w'); 51 | fwrite($fp, $str); 52 | fclose($fp); 53 | } 54 | } -------------------------------------------------------------------------------- /app/Services/Agama/AgamaService.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | final class AgamaService extends AbstractService 17 | { 18 | /** 19 | * Dependenc injection 20 | */ 21 | public function __construct(CacheHandler $cache, AgamaRepository $repository) 22 | { 23 | $this->cache = $cache; 24 | $this->repository = $repository; 25 | } 26 | 27 | /** 28 | * Get all data source 29 | * @return iterable 30 | */ 31 | public function fetchAll(): ?iterable 32 | { 33 | // First we want to check is there existence cache 34 | $key = sprintf('%s:%s:%s', get_class($this->repository), 'agamas', 'all-data'); 35 | if ($this->cache->isCached($key)) { 36 | $data = $this->cache->getItem($key); 37 | } else { 38 | // retreive data from repository 39 | $fetch = $this->repository->fetchAll(); 40 | // check if there any error message 41 | if ($fetch->getErrors()) { 42 | if (config('exo.allow_loggin')) { 43 | Log::emergency($fetch->getErrors()); 44 | } 45 | return null; 46 | } 47 | 48 | $data = $fetch->getEntities(); 49 | 50 | // cache data result 51 | $this->cache->cache($key, $data); 52 | } 53 | return $data; 54 | } 55 | } --------------------------------------------------------------------------------