Skip to content

Commit 7b79752

Browse files
committed
Add Triwulan filter and Form Rencana Aksi lens; refactor Bukti Dukung fields in Nova resources
1 parent 5fd2d3a commit 7b79752

File tree

6 files changed

+209
-18
lines changed

6 files changed

+209
-18
lines changed

app/Nova/AnalisisSakip.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@
88
use App\Nova\Metrics\MetricPartition;
99
use App\Nova\Metrics\MetricValue;
1010
use Illuminate\Http\Request;
11-
use Illuminate\Support\Facades\Storage;
1211
use Laravel\Nova\Fields\BelongsTo;
1312
use Laravel\Nova\Fields\BelongsToMany;
1413
use Laravel\Nova\Fields\Select;
1514
use Laravel\Nova\Fields\Text;
1615
use Laravel\Nova\Fields\Textarea;
17-
use Laravel\Nova\Fields\URL;
1816
use Laravel\Nova\Http\Requests\NovaRequest;
1917
use Laravel\Nova\Query\Search\SearchableText;
2018
use Laravelwebdev\Filepond\Filepond;
@@ -104,12 +102,9 @@ public function fields(NovaRequest $request)
104102
->limit(10)
105103
->path(session('year').'/'.static::uriKey())
106104
->prunable(),
107-
$this->bukti_solusi ?
108-
URL::make('Bukti Dukung', fn () => Storage::disk('sakip')
109-
->url($this->bukti_solusi))
110-
->displayUsing(fn () => 'Lihat')->exceptOnForms()
111-
:
112-
Text::make('Bukti Dukung', fn () => null)->exceptOnForms(),
105+
Text::make('Bukti Dukung', 'bukti_solusi')
106+
->displayUsing(fn ($value) => empty($value) ? null : count($value).' File')
107+
->onlyOnIndex(),
113108
BelongsToMany::make('Indikator Kinerja Terdampak', 'perjanjianKinerja', PerjanjianKinerja::class)
114109
->rules('required'),
115110
];
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace App\Nova\Filters;
4+
5+
use Illuminate\Contracts\Database\Eloquent\Builder;
6+
use Illuminate\Http\Request;
7+
use Laravel\Nova\Filters\Filter;
8+
9+
class TriwulanFilter extends Filter
10+
{
11+
/**
12+
* The filter's component.
13+
*
14+
* @var string
15+
*/
16+
public $component = 'select-filter';
17+
18+
/**
19+
* Apply the filter to the given query.
20+
*/
21+
public function apply(Request $request, Builder $query, mixed $value): Builder
22+
{
23+
return $query;
24+
}
25+
26+
/**
27+
* Get the filter's available options.
28+
*
29+
* @return array<string, string>
30+
*/
31+
public function options(Request $request): array
32+
{
33+
return [
34+
'Triwulan 1' => '1',
35+
'Triwulan 2' => '2',
36+
'Triwulan 3' => '3',
37+
'Triwulan 4' => '4',
38+
];
39+
}
40+
41+
public function default()
42+
{
43+
$triwulan = now()->quarter;
44+
45+
return (string) $triwulan;
46+
}
47+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
<?php
2+
3+
namespace App\Nova\Lenses;
4+
5+
use App\Helpers\Helper;
6+
use App\Models\PerjanjianKinerja;
7+
use App\Nova\Filters\TriwulanFilter;
8+
use App\Nova\Metrics\MetricKeberadaan;
9+
use Illuminate\Contracts\Database\Eloquent\Builder;
10+
use Illuminate\Contracts\Pagination\Paginator;
11+
use Illuminate\Support\Facades\DB;
12+
use Laravel\Nova\Fields\Boolean;
13+
use Laravel\Nova\Fields\Number;
14+
use Laravel\Nova\Fields\Text;
15+
use Laravel\Nova\Http\Requests\LensRequest;
16+
use Laravel\Nova\Http\Requests\NovaRequest;
17+
use Laravel\Nova\Lenses\Lens;
18+
19+
class FormRencanaAksi extends Lens
20+
{
21+
/**
22+
* The columns that should be searched.
23+
*
24+
* @var array
25+
*/
26+
public static $search = ['indikator'];
27+
28+
/**
29+
* Get the query builder / paginator for the lens.
30+
*/
31+
public static function query(LensRequest $request, Builder $query): Builder|Paginator
32+
{
33+
$triwulan = Helper::parseFilter($request->query->get('filters'), 'App\\Nova\\Filters\\TriwulanFilter', '1') ?: (string) now()->quarter;
34+
$model = self::modelQuery($query, $triwulan);
35+
36+
return $request->withOrdering($request->withFilters(
37+
$model
38+
));
39+
}
40+
41+
/**
42+
* Get the fields available to the lens.
43+
*
44+
* @return array<int, \Laravel\Nova\Fields\Field>
45+
*/
46+
public function fields(NovaRequest $request): array
47+
{
48+
return [
49+
Text::make('Indikator', 'indikator'),
50+
Number::make('Realisasi Triwulan', 'realisasi_triwulan'),
51+
Number::make('Realisasi Tahunan', 'realisasi_tahun'),
52+
Boolean::make('Realisasi', 'jumlah_realisasi_tw')->falseValue(0),
53+
Boolean::make('Analisis', 'jumlah_analisis')->falseValue(0),
54+
Boolean::make('Tindak Lanjut', 'jumlah_tindak_lanjut')->falseValue(0),
55+
];
56+
}
57+
58+
/**
59+
* Get the cards available on the lens.
60+
*
61+
* @return array<int, \Laravel\Nova\Card>
62+
*/
63+
public function cards(NovaRequest $request): array
64+
{
65+
$triwulan = (string) now()->quarter;
66+
$model = self::modelQuery(PerjanjianKinerja::query(), $triwulan);
67+
68+
return [
69+
MetricKeberadaan::make('Realisasi TW '.$triwulan, $model, 'jumlah_realisasi_tw', 'keberadaan-realisasi-tw')
70+
->nullStrict(false)
71+
->setAdaLabel('Terisi Lengkap')
72+
->setTidakAdaLabel('Belum Lengkap')
73+
->refreshWhenFiltersChange(),
74+
MetricKeberadaan::make('Analisis TW '.$triwulan, $model, 'jumlah_analisis', 'keberadaan-analisis-tw')
75+
->nullStrict(false)
76+
->refreshWhenFiltersChange(),
77+
MetricKeberadaan::make('Tindak Lanjut TW '.$triwulan, $model, 'jumlah_tindak_lanjut', 'keberadaan-tindak-lanjut-tw')
78+
->nullStrict(false)
79+
->refreshWhenFiltersChange(),
80+
];
81+
82+
}
83+
84+
private static function modelQuery($model, $triwulan)
85+
{
86+
$bulan = match ($triwulan) {
87+
'1' => [1, 2, 3],
88+
'2' => [4, 5, 6],
89+
'3' => [7, 8, 9],
90+
'4' => [10, 11, 12],
91+
};
92+
93+
return $model->select(
94+
'perjanjian_kinerjas.id',
95+
'perjanjian_kinerjas.indikator',
96+
DB::raw('ROUND(AVG(CASE WHEN realisasi_kinerjas.realisasi_tw'.$triwulan.' / realisasi_kinerjas.target_tw'.$triwulan.' * 100 > 120 THEN 120 ELSE realisasi_kinerjas.realisasi_tw'.$triwulan.' / realisasi_kinerjas.target_tw'.$triwulan.' * 100 END), 2) AS realisasi_triwulan'),
97+
DB::raw('ROUND(AVG(CASE WHEN realisasi_kinerjas.realisasi_tw'.$triwulan.' / realisasi_kinerjas.target_tw4 * 100 > 120 THEN 120 ELSE realisasi_kinerjas.realisasi_tw'.$triwulan.' / realisasi_kinerjas.target_tw4 * 100 END), 2) AS realisasi_tahun'),
98+
DB::raw('IF(COUNT(CASE WHEN realisasi_kinerjas.realisasi_tw'.$triwulan.' IS NULL THEN 1 END) > 0, 0, 1) AS jumlah_realisasi_tw'),
99+
DB::raw('COUNT(DISTINCT tindak_lanjuts.id) AS jumlah_tindak_lanjut'),
100+
DB::raw('COUNT(DISTINCT analisis_sakips.id) AS jumlah_analisis')
101+
)
102+
->leftJoin('realisasi_kinerjas', function ($join) {
103+
$join->on('perjanjian_kinerjas.id', '=', 'realisasi_kinerjas.perjanjian_kinerja_id')
104+
->where('realisasi_kinerjas.is_indikator', true);
105+
})
106+
->leftJoin('tindak_lanjuts', function ($join) use ($triwulan) {
107+
$join->on('realisasi_kinerjas.unit_kerja_id', '=', 'tindak_lanjuts.unit_kerja_id')
108+
->where('tindak_lanjuts.triwulan', $triwulan);
109+
})
110+
->leftJoin('analisis_sakip_perjanjian_kinerja', 'perjanjian_kinerjas.id', '=', 'analisis_sakip_perjanjian_kinerja.perjanjian_kinerja_id')
111+
->leftJoin('analisis_sakips', function ($join) use ($bulan) {
112+
$join->on('analisis_sakip_perjanjian_kinerja.analisis_sakip_id', '=', 'analisis_sakips.id')
113+
->whereIn('bulan', $bulan);
114+
})
115+
->where('perjanjian_kinerjas.tahun', session('year'))
116+
->groupBy('perjanjian_kinerjas.id', 'perjanjian_kinerjas.indikator');
117+
}
118+
119+
/**
120+
* Get the filters available for the lens.
121+
*
122+
* @return array<int, \Laravel\Nova\Filters\Filter>
123+
*/
124+
public function filters(NovaRequest $request): array
125+
{
126+
return [
127+
TriwulanFilter::make(),
128+
];
129+
}
130+
131+
/**
132+
* Get the actions available on the lens.
133+
*
134+
* @return array<int, \Laravel\Nova\Actions\Action>
135+
*/
136+
public function actions(NovaRequest $request): array
137+
{
138+
return parent::actions($request);
139+
}
140+
141+
/**
142+
* Get the URI key for the lens.
143+
*/
144+
public function uriKey(): string
145+
{
146+
return 'form-rencana-aksi';
147+
}
148+
}

app/Nova/PelaksanaanTindakLanjut.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33
namespace App\Nova;
44

55
use App\Helpers\Helper;
6-
use Illuminate\Support\Facades\Storage;
76
use Laravel\Nova\Fields\Select;
87
use Laravel\Nova\Fields\Text;
98
use Laravel\Nova\Fields\Textarea;
10-
use Laravel\Nova\Fields\URL;
119
use Laravel\Nova\Http\Requests\NovaRequest;
1210
use Laravel\Nova\Query\Search\SearchableText;
1311
use Laravelwebdev\Filepond\Filepond;
1412

1513
class PelaksanaanTindakLanjut extends Resource
1614
{
1715
public static $with = ['tindakLanjut'];
16+
1817
/**
1918
* The model the resource corresponds to.
2019
*
@@ -94,12 +93,9 @@ public function fields(NovaRequest $request)
9493
->limit(10)
9594
->path(session('year').'/'.static::uriKey())
9695
->prunable(),
97-
$this->bukti_dukung ?
98-
URL::make('Bukti Dukung', fn () => Storage::disk('sakip')
99-
->url($this->bukti_dukung))
100-
->displayUsing(fn () => 'Lihat')->exceptOnForms()
101-
:
102-
Text::make('Bukti Dukung', fn () => null)->exceptOnForms(),
96+
Text::make('Bukti Dukung')
97+
->displayUsing(fn ($value) => empty($value) ? null : count($value).' File')
98+
->onlyOnIndex(),
10399
];
104100
}
105101

app/Nova/PerjanjianKinerja.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Nova;
44

5+
use App\Nova\Lenses\FormRencanaAksi;
56
use Laravel\Nova\Fields\BelongsToMany;
67
use Laravel\Nova\Fields\HasMany;
78
use Laravel\Nova\Fields\Number;
@@ -114,7 +115,9 @@ public function filters(NovaRequest $request)
114115
*/
115116
public function lenses(NovaRequest $request)
116117
{
117-
return [];
118+
return [
119+
FormRencanaAksi::make('Form Rencana Aksi'),
120+
];
118121
}
119122

120123
/**

app/Providers/NovaServiceProvider.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use App\Nova\KerangkaAcuan;
2222
use App\Nova\KodeBank;
2323
use App\Nova\KontrakMitra;
24+
use App\Nova\Lenses\FormRencanaAksi;
2425
use App\Nova\Lenses\PemeliharaanBarang;
2526
use App\Nova\Lenses\RekapBarangPersediaan;
2627
use App\Nova\Lenses\RekapHonorMitra;
@@ -98,6 +99,7 @@ public function boot()
9899
->icon('calendar'),
99100

100101
MenuSection::make('Monitoring', [
102+
Menuitem::lens(PerjanjianKinerja::class, FormRencanaAksi::class),
101103
MenuItem::lens(RealisasiAnggaran::class, RencanaPenarikanDana::class),
102104
MenuItem::link('Realisasi Anggaran', '/resources/realisasi-anggarans/lens/realisasi-anggaran'),
103105
MenuItem::lens(MasterPersediaan::class, RekapBarangPersediaan::class),
@@ -168,6 +170,7 @@ public function boot()
168170
MenuItem::resource(KepkaMitra::class),
169171
MenuItem::resource(MasterBarangPemeliharaan::class),
170172
MenuItem::resource(MasterPersediaan::class),
173+
MenuItem::resource(PerjanjianKinerja::class),
171174
MenuItem::resource(SkTranslok::class),
172175
MenuItem::resource(TataNaskah::class),
173176
// MenuItem::resource(UserEksternal::class),
@@ -176,7 +179,6 @@ public function boot()
176179
->icon('book-open'),
177180

178181
MenuSection::make('SAKIP', [
179-
MenuItem::resource(PerjanjianKinerja::class),
180182
MenuItem::resource(RealisasiKinerja::class),
181183
MenuItem::resource(AnalisisSakip::class),
182184
MenuItem::resource(TindakLanjut::class),

0 commit comments

Comments
 (0)