Commit 026208ce authored by Christo Gustawan Nugraha's avatar Christo Gustawan Nugraha
Browse files

frontend

frontend
parent ac8fab16
No related merge requests found
Showing with 1641 additions and 0 deletions
+1641 -0
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4
APP_NAME="Abdi Anti Prei"
APP_ENV=development
APP_KEY=base64:Do17IxkOxk0M82DYjVuq330OvldVRsV0DbZ4D/TRCn0=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=v3422071_kominfo
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MAPBOX_ACCESS_TOKEN=pk.eyJ1IjoibmF3ZnJhYSIsImEiOiJjbGt6cjBqem8xb3BuM2Vyem05ZXFkY2xoIn0.ujVckzF0BKawDiiAhlIa1g
FIREBASE_AUTH_KEY=AAAAeKNI2kg:APA91bHSk8lC6WbZ9ijZZx6R16PpIMoIiNkj8IxolGzMokpP9QCfAqUOwzXFlsMD5SZ3wJPl_LzUcB8NEegLxxrqkri_z4HEjVIBoSdxIRiIlzTXA8s5LOxyt057Wc50uIRhwUm_ozzM
RECAPTCHA_SITE_KEY=6Lda94spAAAAAApW3rBVx8U758Ayi2-m7UWTdAvs
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
* text=auto eol=lf
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
# .env
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
.DS_Store
\ No newline at end of file
# START MultiPHP Version
<FilesMatch "\.(php4|php5|php3|php2|php|phtml)$">
SetHandler application/x-httpd-alt-php81___lsphp
</FilesMatch>
# END MultiPHP Version
<IfModule mod_rewrite.c>
# That was ONLY to protect you from 500 errors
# if your server did not have mod_rewrite enabled
RewriteEngine On
# RewriteBase /
# NOT needed unless you're using mod_alias to redirect
RewriteCond %{REQUEST_URI} !/public
RewriteRule ^(.*)$ public/$1 [L]
# Direct all requests to /public folder
</IfModule>
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Cubet Techno Labs](https://cubettech.com)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[Many](https://www.many.co.uk)**
- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**
- **[DevSquad](https://devsquad.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[OP.GG](https://op.gg)**
- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)**
- **[Lendio](https://lendio.com)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*/
protected function commands(): void
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* The list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*/
public function register(): void
{
$this->reportable(function (Throwable $e) {
//
});
}
}
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\Test;
use Illuminate\Http\Request;
class ReportController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Test $test)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Test $test)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Test $test)
{
//
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
class AuthController extends Controller
{
use ApiResponse;
protected $sanctum_token = Customer::SANCTUM_TOKEN;
public function login(Request $request) {
$customer = Customer::where('email', $request->email)->firstOrFail();
if (!Hash::check($request->password, $customer->password)) {
return $this->responseError('Password salah.');
}
if ($request->firebase_token) {
$customer->forceFill(['token' => $request->firebase_token])->save();
}
$token = $customer->createToken($this->sanctum_token);
return $this->responseOK([
'user' => $customer,
'token' => $token->plainTextToken,
]);
}
public function register(Request $request) {
$validator = Validator::make($request->all(), [
'nama' => 'required|string',
'email' => 'required|email|unique:customers,email',
'nohp' => 'required|numeric',
'firebase_token' => 'required|string',
'password' => 'nullable|string',
'password_confirm' => 'nullable|string|same:password',
], [
'email.unique' => "Alamat email sudah terdaftar.",
'nohp' => "Nomor HP tidak valid",
]);
if ($validator->fails()) {
return $this->responseError($validator->errors()->first());
}
$data = $request->except('password', 'password_confirm');
$password = $request->input('password', $request->firebase_token); // Default password dari token
$data['password'] = Hash::make($password);
$data['nohp'] = showPhone($data['nohp'], '62');
$data['verified_at'] = now();
DB::beginTransaction();
try {
$customer = new Customer();
$customer->forceFill($data)->save();
$token = $customer->createToken($this->sanctum_token);
DB::commit();
return $this->responseOK([
'user' => $customer,
'token' => $token->plainTextToken,
]);
} catch (\Exception $e) {
DB::rollBack();
return $this->responseError("Tidak dapat mendaftarkan akun. Coba lagi.");
}
}
public function byEmailToken(Request $request) {
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'firebase_token' => 'required|string',
], [
'email' => "Alamat email tidak valid.",
]);
if ($validator->fails()) {
return $this->responseError($validator->errors()->first());
}
DB::beginTransaction();
try {
$customer = Customer::where('email', $request->email)->firstOrNew([
'email' => $request->email,
]);
$customer->forceFill([
'nama' => Str::before($request->email, '@'),
'email' => $request->email,
'token' => $request->firebase_token,
'password' => Hash::make($request->firebase_token),
'verified_at' => now(),
])->save();
$token = $customer->createToken($this->sanctum_token);
DB::commit();
return $this->responseOK([
'user' => $customer,
'token' => $token->plainTextToken,
]);
} catch (\Exception $e) {
DB::rollBack();
return $this->responseError("Tidak dapat menyimpan akun. Coba lagi." . "\n" . $e->getMessage());
}
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Http\Resources\BroadcastAPICollection;
use App\Models\Broadcast;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class BroadcastAPIController extends Controller
{
use ApiResponse;
public function index(Request $request, $tipe = null) {
$query = Broadcast::query()
->with('bencana');
$whereTipe = Str::replace('-', '_', $tipe);
if ($whereTipe === Broadcast::TIPE_DINI) {
$query->where('tipe', Broadcast::TIPE_DINI);
} elseif ($whereTipe === Broadcast::TIPE_BENCANA) {
$query->where('tipe', Broadcast::TIPE_BENCANA);
}
$mapKejadianBencana = function($item) {
return [
'id' => $item->id,
'latitude' => $item->lat,
'longitude' => $item->lng,
'jenis_kejadian' => !$item->bencana ? null : $item->bencana->nama,
'kronologi_kejadian' => $item->kronologi,
'tanggal' => $item->tanggal,
'created_at' => $item->created_at,
];
};
$mapPeringatanDini = function($item) {
return [
'id' => $item->id,
'judul' => $item->judul,
'pesan' => $item->pesan,
'tanggal' => !$item->tanggal ? null : $item->tanggal->format('Y-m-d'),
'waktu' => $item->tanggal ? $item->tanggal->format('H:i:s') : null,
'created_at' => $item->created_at,
];
};
return $this->responseOK($query->get()->map($whereTipe !== Broadcast::TIPE_DINI ? $mapKejadianBencana : $mapPeringatanDini));
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class CustomerAPIController extends Controller
{
use ApiResponse;
protected $sanctum_token = Customer::SANCTUM_TOKEN;
public function profile(Request $request) {
return $this->responseOK($request->user());
}
public function profileUpdate(Request $request) {
$user = $request->user();
$validator = Validator::make($request->all(), [
'email' => 'nullable|email|unique:customers,email,' . $user->id,
'nohp' => 'required|numeric',
'sex' => [
'nullable',
Rule::in(Customer::SEX_MALE, Customer::SEX_FEMALE),
],
], [
'email.unique' => "Alamat email sudah terdaftar.",
'nohp' => "Nomor HP tidak valid.",
'sex' => "Gender yang dipilih tidak valid.",
]);
if ($validator->fails()) {
return $this->responseError($validator->errors()->first());
}
DB::beginTransaction();
try {
$user->forceFill([
'email' => $request->input('email', $user->email),
'nohp' => showPhone($request->input('nohp', $user->nohp), '62'),
'sex' => $request->input('sex', $user->sex),
'token' => $request->input('newToken', $user->token),
]);
$user->save();
DB::commit();
return $this->responseOK($user);
} catch (\Exception $e) {
DB::rollBack();
return $this->responseError($e->getMessage());
}
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Models\Bencana;
use App\Models\Kejadian;
use App\Models\Marker;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class KejadianAPIController extends Controller
{
use ApiResponse;
public function index(Request $request) {
$query = Kejadian::query()->with('bencana')->orderByDesc('tahun');
$kejadians = $query->get();
$bencanas = Bencana::get()->map(function($item) {
return (object) [
'id' => $item->id,
'nama' => $item->nama,
'column' => Str::snake($item->nama),
];
});
$data = collect([]);
foreach ($kejadians->groupBy('tahun') as $tahun => $items) {
$row = [
'id' => $tahun,
'tahun_kejadian' => $tahun,
'banjir' => 0,
'cuaca_ekstrim' => 0,
'longsor' => 0,
'kebakaran_lahan' => 0,
'kekeringan' => 0,
'kk' => $items->sum('kk'),
'meninggal' => $items->sum('meninggal'),
'luka_berat' => $items->sum('luka_berat'),
'luka_ringan' => $items->sum('luka_ringan'),
'hilang' => $items->sum('hilang'),
'rumah' => $items->sum('rumah'),
'lainnya' => $items->sum('lainnya'),
'rekap_kejadian' => $items->count(),
'rekap_korban' => $items->sum(function($item) {
$total = 0;
foreach (['kk', 'meninggal', 'luka_berat', 'luka_ringan', 'hilang', 'rumah', 'lainnya'] as $field) {
$total += $item->$field ?? 0;
}
return $total;
}),
];
foreach ($bencanas as $bencana) {
$row[$bencana->column] = $items->where('bencana_id', $bencana->id)->count();
}
$data->push($row);
}
return $this->responseOK($data);
}
public function marker(Request $request, string $bencana) {
$query = Marker::query()
->with(['bencana', 'kelurahan', 'attachment'])
->whereHas('bencana', function($query) use ($bencana) {
$query->where('nama', Str::title(str_replace('-', ' ', $bencana)));
});
$markers = $query->get();
$data = collect([]);
foreach ($markers as $marker) {
$kejadian = $marker->kejadian ?? new Kejadian();
$row = [
'id' => $marker->id,
'latitude' => $marker->lat,
'longitude' => $marker->lng,
'jenis_kejadian' => !$marker->bencana ? null : $marker->bencana->nama,
'nama_kecamatan' => !$marker->kelurahan ? null : $marker->kelurahan->kecamatan_nama,
'nama_kelurahan' => !$marker->kelurahan ? null : $marker->kelurahan->kelurahan,
'tanggal_kejadian' => !$marker->kejadian_at ? null : $marker->kejadian_at->format('Y-m-d'),
'tanggal_kejadian_selesai' => !$marker->selesai_at ? null : $marker->selesai_at->format('Y-m-d'),
'waktu_kejadian' => !$marker->kejadian_at ? null : $marker->kejadian_at->format('H:i:s'),
'waktu_kejadian_selesai' => !$marker->selesai_at ? null : $marker->selesai_at->format('H:i:s'),
'nama_kejadian' => $marker->judul,
'penyebab_kejadian' => $marker->penyebab,
'kronologi_kejadian' => $marker->kronologi,
'gambar_kejadian' => !$marker->attachment ? null : $marker->attachment->link_url,
'kk' => $kejadian->kk ?? 0,
'meninggal' => $kejadian->meninggal ?? 0,
'luka_berat' => $kejadian->luka_berat ?? 0,
'luka_ringan' => $kejadian->luka_ringan ?? 0,
'hilang' => $kejadian->hilang ?? 0,
'rumah' => $kejadian->rumah ?? 0,
'lainnya' => $kejadian->lainnya ?? 0,
];
$data->push($row);
}
return $this->responseOK($data);
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Models\PetaPotensi;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class PetaPotensiAPIController extends Controller
{
use ApiResponse;
public function index(Request $request, string $bencana) {
$query = PetaPotensi::query()
->with(['bencana', 'kelurahan'])
->whereHas('bencana', function($query) use ($bencana) {
$query->where('nama', Str::title(str_replace('-', ' ', $bencana)));
});
$potensis = $query->get();
$data = collect([]);
foreach ($potensis as $potensi) {
$row = [
'id' => $potensi->id,
'nama_kecamatan' => !$potensi->kelurahan ? null : $potensi->kelurahan->kecamatan_nama,
'nama_kelurahan' => !$potensi->kelurahan ? null : $potensi->kelurahan->kelurahan,
'bencana' => !$potensi->bencana ? null : $potensi->bencana->nama,
'potensi' => $potensi->potensi_text,
];
$data->push($row);
}
return $this->responseOK($data);
}
}
<?php
namespace App\Http\Controllers\API\V1;
use App\Http\Controllers\Controller;
use App\Models\Sarpras;
use App\Support\Traits\ApiResponse;
use Illuminate\Http\Request;
class SarprasAPIController extends Controller
{
use ApiResponse;
public function index(Request $request, $tipe = null) {
$sarprasQuery = Sarpras::query();
if (in_array($tipe, array_keys(Sarpras::TIPE_LABEL))) {
$sarprasQuery->where('tipe', $tipe);
}
if (in_array($request->kondisi, array_keys(Sarpras::KONDISI_LABEL))) {
$sarprasQuery->where('kondisi', $request->kondisi);
}
$sarprases = $sarprasQuery->get()->map(function($item) {
return [
'id' => $item->id,
'nama_sarpras' => $item->nama,
'jumlah' => $item->qty,
'kondisi' => $item->kondisi_text,
'created_at' => $item->created_at,
];
});
return $this->responseOK($sarprases);
}
}
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Broadcast;
use App\Models\Kecamatan;
use App\Models\Kejadian;
use App\Models\KejadianRekap;
use App\Models\Sarpras;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
class AdminController extends Controller
{
public function dashboard(Request $request)
{
Gate::authorize('read dashboard');
$year = $request->get('tahun', date('Y'));
$years = Kejadian::select('tahun')->orderByDesc('tahun')->distinct()->pluck('tahun');
$kejadianRekap = KejadianRekap::where('tahun', $year)->first();
$peringatanDini = Broadcast::where('tipe', Broadcast::TIPE_DINI)
->whereBetween('tanggal', [$year . '-01-01', $year . '-12-31'])
->count();
$sarpras = Sarpras::count();
$kejadianCount = Kejadian::query()
->selectRaw('SUM(kk) as kk')
->selectRaw('SUM(meninggal) as meninggal')
->selectRaw('SUM(luka_berat) as luka_berat')
->selectRaw('SUM(luka_ringan) as luka_ringan')
->selectRaw('SUM(hilang) as hilang')
->selectRaw('SUM(rumah) as rumah')
->selectRaw('SUM(lainnya) as lainnya')
->whereBetween('tahun', [$year . '-01-01', $year . '-12-31'])
->first();
$kecamatans = Kecamatan::query()
->with([
'markers' => function($query) use ($year) {
$query->whereHas('kejadian');
$query->whereBetween('kejadian_at', [$year . '-01-01', $year . '-12-31']);
},
'markers.kejadian',
])
->get();
$kejadianBar = [
'labels' => $kecamatans->pluck('kecamatan'),
'series' => [
[
'name' => "Kejadian",
'color' => '#299e53',
'data' => $kecamatans->map(function($item) {
return $item->markers->count();
})->toArray(),
],
[
'name' => "Korban",
'color' => '#d82e2e',
'data' => $kecamatans->map(function($item) {
$total = 0;
foreach ($item->markers as $marker) {
$kejadian = $marker->kejadian ?? new Kejadian;
foreach(['kk', 'meninggal', 'luka_berat', 'luka_ringan', 'hilang', 'rumah', 'lainnya'] as $key) {
$total += $kejadian->{$key} ?? 0;
}
}
return $total;
})->toArray(),
],
],
];
$kejadianCountPie = [
['name' => 'KK', 'y' => $kejadianCount->kk, 'color' => '#91cc75'],
['name' => 'Meninggal', 'y' => $kejadianCount->meninggal, 'color' => '#ee6666'],
['name' => 'Luka Berat', 'y' => $kejadianCount->luka_berat, 'color' => '#ea7ccc'],
['name' => 'Luka Ringan', 'y' => $kejadianCount->luka_ringan, 'color' => '#5470c6'],
['name' => 'Hilang', 'y' => $kejadianCount->hilang, 'color' => '#73c0de'],
['name' => 'Rumah Rusak', 'y' => $kejadianCount->rumah, 'color' => '#a74c21'],
];
if ($request->ajax()) {
return response()->json([
'success' => true,
'data' => [
'kejadian_total' => !$kejadianRekap ? 0 : $kejadianRekap->kejadian_total,
'korban_total' => !$kejadianRekap ? 0 : $kejadianRekap->korban_total,
'peringatan_dini' => $peringatanDini,
'sarpras' => $sarpras,
'kejadian_count' => $kejadianCount,
'kejadian_count_pie' => $kejadianCountPie,
'kejadian_bar' => $kejadianBar,
],
]);
}
return view('admin.dashboard', compact('years', 'year', 'peringatanDini', 'sarpras', 'kejadianRekap', 'kejadianCount', 'kejadianCountPie', 'kejadianBar'));
}
}
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Bencana;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use RealRashid\SweetAlert\Facades\Alert;
use Yajra\DataTables\Facades\DataTables;
class BencanaController extends Controller
{
public function source(Request $request)
{
Gate::authorize('read bencanas');
$user = $request->user();
$query = Bencana::query()
->selectRaw('bencanas.*')
->selectRaw('CONCAT_WS(" ", bencanas.nama) as `searchable`');
if ($user->hasRole('superadmin')) {
$query->withTrashed();
}
$order = $request->order;
if (is_array($order) && count($order)) {
$sortBy = $order[0]['column'] ?? null;
$sort = $order[0]['dir'] ?? null;
if ($sortBy == 1) {
$query->orderBy('bencanas.nama', $sort == 'asc' ? 'asc' : 'desc');
} else {
$query->orderBy('bencanas.nama');
}
}
return DataTables::eloquent($query)
->filter(function ($query) {
if ($search = request()->input('search.value')) {
$query->having('searchable', 'like', "%" . $search . "%");
}
})
->addIndexColumn()
->addColumn('action', 'admin.bencanas.index-actions')
->rawColumns(['action'])
->toJson();
}
/**
* Display a listing of the resource.
*/
public function index()
{
Gate::authorize('read bencanas');
return view('admin.bencanas.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
Gate::authorize('create bencanas');
return view('admin.bencanas.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
Gate::authorize('create bencanas');
$request->validate([
'nama' => 'required|string|unique:bencanas,nama',
]);
$user = $request->user();
DB::beginTransaction();
try {
$bencana = new Bencana();
$bencana->forceFill([
'nama' => $request->nama,
'created_by' => $user->id,
])->save();
DB::commit();
Alert::success('Success', 'Bencana berhasil disimpan');
return redirect()->route('admin.bencana.index');
} catch (\Exception $e) {
DB::rollback();
return redirect()->back()->with('error-message', $e->getMessage())->withInput();
}
}
/**
* Display the specified resource.
*/
public function show(Bencana $bencana)
{
Gate::authorize('denied');
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Bencana $bencana)
{
Gate::authorize('update bencanas');
return view('admin.bencanas.edit', compact('bencana'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Bencana $bencana)
{
Gate::authorize('update bencanas');
$request->validate([
'nama' => 'required|string|unique:bencanas,nama,'.$bencana->id,
]);
$user = $request->user();
DB::beginTransaction();
try {
$bencana->forceFill([
'nama' => $request->nama,
'created_by' => $user->id,
])->save();
DB::commit();
Alert::success('Success', 'Bencana berhasil disimpan');
return redirect()->route('admin.bencana.index');
} catch (\Exception $e) {
DB::rollback();
return redirect()->back()->with('error-message', $e->getMessage())->withInput();
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Request $request, $id)
{
Gate::authorize('delete bencanas');
$query = Bencana::query();
if ($isSuperadmin = $request->user()->hasRole('superadmin')) {
$query->withTrashed();
}
$bencana = $query->findOrFail($id);
if ($request->restore == '1' && $isSuperadmin) {
$bencana->forceFill([ 'deleted_at' => null ])->save();
} else {
$bencana->delete();
}
if ($request->ajax()) {
return response()->json(['success' => true]);
}
Alert::success('Success', 'Bencana berhasil di hapus');
return redirect()->route('admin.bencana.index');
}
}
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Broadcast;
use App\Models\Customer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Http;
use Illuminate\Validation\Rule;
use RealRashid\SweetAlert\Facades\Alert;
use Yajra\DataTables\Facades\DataTables;
class BroadcastController extends Controller
{
public function source(Request $request)
{
Gate::authorize('read broadcasts');
if (!in_array($request->tipe, array_keys(Broadcast::TIPE_LABEL))) {
abort(404);
}
$datatables = $request->tipe === Broadcast::TIPE_DINI ? $this->sourcePeringatanDini($request) : $this->sourceKejadianBencana($request);
return $datatables
->filter(function ($query) {
if ($search = request()->input('search.value')) {
$query->having('searchable', 'like', "%" . $search . "%");
}
})
->addIndexColumn()
->addColumn('action', 'admin.broadcasts.index-actions')
->toJson();
}
protected function sourcePeringatanDini(Request $request): \Yajra\DataTables\EloquentDataTable
{
$user = $request->user();
/**
* @var \Illuminate\Database\Query\Builder $query
*/
$query = Broadcast::query()
->with('creator')
->selectRaw('broadcasts.*')
->selectRaw('CONCAT_WS(" ", broadcasts.judul, broadcasts.pesan) as `searchable`')
->where('tipe', 'peringatan_dini');
if ($user->hasRole('superadmin')) {
$query->withTrashed();
}
$order = $request->order;
if (is_array($order) && count($order)) {
$sortBy = $order[0]['column'] ?? null;
$sort = $order[0]['dir'] ?? null;
if ($sortBy == 1) {
$query->orderBy('broadcasts.judul', $sort == 'asc' ? 'asc' : 'desc');
} elseif ($sortBy == 2) {
$query->orderByRaw('CONVERT(DATE, broadcasts.tanggal), broadcasts.tanggal', $sort == 'asc' ? 'asc' : 'desc');
} elseif ($sortBy == 3) {
$query->orderBy('broadcasts.tanggal', $sort == 'asc' ? 'asc' : 'desc');
} else {
$query->orderByDesc('broadcasts.tanggal');
}
}
return DataTables::eloquent($query)
->editColumn('tanggal', function($item) {
return !$item->tanggal ? '-' : $item->tanggal->format('j M Y H:i');
})
->addColumn('creator', function($item) {
return !$item->creator ? '-' : $item->creator->name;
})
->rawColumns(['action']);
}
protected function sourceKejadianBencana(Request $request): \Yajra\DataTables\EloquentDataTable
{
$user = $request->user();
/**
* @var \Illuminate\Database\Query\Builder $query
*/
$query = Broadcast::query()
->selectRaw('broadcasts.*')
->selectRaw('bencanas.nama as bencana')
->selectRaw('CONCAT_WS(" ", broadcasts.kronologi, bencanas.nama) as `searchable`')
->leftJoin('bencanas', 'bencanas.id', '=', 'broadcasts.bencana_id')
->where('tipe', 'kejadian_bencana');
if ($user->hasRole('superadmin')) {
$query->withTrashed();
}
if ($request->bencana_id) {
$query->where('bencana_id', $request->bencana_id);
}
$order = $request->order;
if (is_array($order) && count($order)) {
$sortBy = $order[0]['column'] ?? null;
$sort = $order[0]['dir'] ?? null;
if ($sortBy == 1) {
$query->orderBy('bencanas.nama', $sort == 'asc' ? 'asc' : 'desc');
} else {
$query->orderByDesc('broadcasts.created_at');
}
}
return DataTables::eloquent($query)
->addColumn('action', 'admin.broadcasts.index-actions')
->rawColumns(['action']);
}
/**
* Display a listing of the resource.
*/
public function index()
{
Gate::authorize('read broadcasts');
$tipeLabel = collect(Broadcast::TIPE_LABEL);
return view('admin.broadcasts.index', compact('tipeLabel'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
Gate::authorize('create broadcasts');
return view('admin.broadcasts.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
Gate::authorize('create broadcasts');
if ($request->tipe !== Broadcast::TIPE_DINI) {
return abort(404);
}
$request->validate([
'judul' => 'required|string',
'pesan' => 'required|string',
'tipe' => [
'required',
Rule::in(array_keys(Broadcast::TIPE_LABEL))
],
]);
$user = $request->user();
DB::beginTransaction();
try {
$broadcast = new Broadcast();
$broadcast->forceFill([
'judul' => $request->judul,
'pesan' => $request->pesan,
'tipe' => $request->tipe,
'tanggal' => now(),
'created_by' => $user->id,
])->save();
if ($broadcast->tipe === Broadcast::TIPE_DINI) {
$fcm_auth_key = env('FIREBASE_AUTH_KEY');
$response = Http::withHeaders([
'Content-type' => 'application/json',
'Authorization' => 'key='.$fcm_auth_key,
])->post('https://fcm.googleapis.com/fcm/send', [
'notification' => [
'title' => $broadcast->judul,
'body' => $broadcast->pesan,
'icon' => asset('assets/images/icons/bpbdmini.png'),
'click_action' => "",
],
'registration_ids' => Customer::whereNotNull('token')->get()->pluck('token')->toArray(),
]);
if (!$response->successful()) {
\Log::info("Broadcast FCM: Response Error", [
'broadcast' => $broadcast,
'successful' => $response->successful(),
'json' => $response->json(),
]);
}
}
DB::commit();
Alert::success('Success', 'Broadcast berhasil dikirim');
return redirect()->route('admin.broadcast.index');
} catch (\Exception $e) {
DB::rollback();
return redirect()->back()->with('error-message', $e->getMessage())->withInput();
}
}
/**
* Display the specified resource.
*/
public function show(Broadcast $broadcast)
{
Gate::authorize('denied');
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Broadcast $broadcast)
{
Gate::authorize('denied');
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Broadcast $broadcast)
{
Gate::authorize('denied');
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Request $request, $id)
{
Gate::authorize('delete broadcasts');
$query = Broadcast::query();
if ($isSuperadmin = $request->user()->hasRole('superadmin')) {
$query->withTrashed();
}
$broadcast = $query->findOrFail($id);
if ($request->restore == '1' && $isSuperadmin) {
$broadcast->forceFill([ 'deleted_at' => null ])->save();
} else {
$broadcast->delete();
}
if ($request->ajax()) {
return response()->json(['success' => true]);
}
Alert::success('Success', 'Sarana prasarana berhasil di hapus');
return redirect()->route('admin.sarpras.index');
}
}
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Support\Traits\Modelable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Yajra\DataTables\Facades\DataTables;
class CustomerController extends Controller
{
use Modelable;
public function source(Request $request)
{
Gate::authorize('read customers');
$query = Customer::query()
->selectRaw('customers.*')
->selectRaw('CONCAT_WS(" ", customers.nama, customers.email, customers.nohp) as `searchable`');
if ($request->status === 'verified') {
$query->whereNotNull('verified_at');
}
if ($request->status === 'unverified') {
$query->whereNull('verified_at');
}
if ($request->status === 'blocked') {
$query->whereNotNull('blocked_at');
} else {
$query->whereNull('blocked_at');
}
$order = $request->order;
if (is_array($order) && count($order)) {
$sortBy = $order[0]['column'] ?? null;
$sort = $order[0]['dir'] ?? null;
if ($sortBy == 1) {
$query->orderBy('customers.nama', $sort == 'asc' ? 'asc' : 'desc');
} else if ($sortBy == 2) {
$query->orderBy('customers.nohp', $sort == 'asc' ? 'asc' : 'desc');
} else {
$query->orderByDesc('customers.created_at');
}
}
return DataTables::eloquent($query)
->filter(function ($query) {
if ($search = request()->input('search.value')) {
$query->having('searchable', 'like', "%" . $search . "%");
}
})
->addIndexColumn()
->editColumn('nama', function($item) {
return implode('', [
'<div class="row gx-2 flex-nowrap">',
'<div class="col-auto">',
!$item->image_url
? '<div class="img-datatables small bg-gray-200"><i class="fa fa-user"></i></div>'
: '<img src="'.$item->image_url.'" alt="Image User" class="img-datatables small" />',
'</div>',
'<div class="col">',
'<p class="mb-0 small fw-bold">',
'<span class="text-primary">'.$item->nama.'</span>',
'<p class="mb-0 small text-muted">'.$item->email.'</p>',
'</div>',
'</div>',
]);
})
->editColumn('nohp', function($item) {
return implode('', [
'<p class="mb-0">',
'<a href="tel:'.showPhone($item->nohp, '+62').'">',
showPhone($item->nohp, '0'),
'</a>',
'</p>',
]);
})
->editColumn('sex', function($item) {
$color = !$item->sex ? 'text-muted opacity-50' : '';
return implode('', [
'<p class="mb-0 text-center '.$color.'">'.(
[
'male' => "Laki-laki",
'female' => "Perempuan",
][$item->sex] ?? "Kosong"
).'</p>',
]);
})
->editColumn('verified_at', function($item) {
$verified_color = !$item->verified_at ? 'text-danger' : 'text-success';
return implode('', [
'<p class="mb-0 text-center '.$verified_color.'">',
$item->verified_at ? "Ya" : "Tidak",
'</p>',
]);
})
->addColumn('action', 'admin.customers.index-actions')
->rawColumns(['action', 'nama', 'nohp', 'sex', 'verified_at'])
->toJson();
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
Gate::authorize('read customers');
$counters = $this->getCustomerCountQuery($request)->distinct()->first() ?? (object) [
'total' => 0,
'verified' => 0,
'unverified' => 0,
'blocked' => 0,
];
return view('admin.customers.index', compact('counters'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
Gate::authorize('denied');
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
Gate::authorize('denied');
//
}
/**
* Display the specified resource.
*
* @param \App\Models\Customer $customer
* @return \Illuminate\Http\Response
*/
public function show(Customer $customer)
{
Gate::authorize('denied');
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Customer $customer
* @return \Illuminate\Http\Response
*/
public function edit(Customer $customer)
{
Gate::authorize('denied');
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Customer $customer
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Customer $customer)
{
Gate::authorize('update customers');
if ($request->toggle) {
return $this->updateToggle($request, $customer);
}
}
public function updateToggle(Request $request, Customer $customer)
{
DB::beginTransaction();
try {
$update = [];
if ($request->toggle == 'block') {
$update['blocked_at'] = !$customer->blocked_at ? Date::now() : null;
}
if (count($update)) $customer->update($update);
DB::commit();
if ($request->ajax()) {
return response()->json(['success' => true]);
}
Alert::success('Success', 'Status customer berhasil diupdate');
return redirect()->route('admin.customer.index');
} catch (\Exception $e) {
DB::rollback();
if ($request->ajax()) {
return response()->json(['success' => false]);
}
return redirect()->back()->with('error-message', $e->getMessage())->withInput();
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Customer $customer
* @return \Illuminate\Http\Response
*/
public function destroy(Customer $customer)
{
//
}
private function getCustomerCountQuery(Request $request)
{
$start_at = null;
$end_at = null;
if ($request->start_at && $request->end_at) {
$start_at = Date::parse($request->start_at)->startOfDay()->format('Y-m-d H:i:s');
$end_at = Date::parse($request->end_at)->endOfDay()->format('Y-m-d H:i:s');
}
$query = DB::table('customers');
foreach ([
'total' => "blocked_at IS NULL",
'verified' => "verified_at IS NOT NULL AND blocked_at IS NULL",
'unverified' => "verified_at IS NULL AND blocked_at IS NULL",
'blocked' => "blocked_at IS NOT NULL",
] as $field => $where) {
$wheres = !$where ? [] : [$where];
$wheres[] = "deleted_at IS NULL";
if ($start_at && $end_at) {
$wheres[] = "created_at BETWEEN '$start_at' AND '$end_at'";
}
$condition = !count($wheres) ? '' : ("WHERE " . implode(" AND ", $wheres));
$query->selectRaw("(SELECT COUNT(*) FROM customers $condition) AS " . $field . "");
}
return $query;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment