Skip to content

Commit 1a7f956

Browse files
committed
feat: enhance PulsaKegiatan model with relationships and policies; update Nova resource and migration for new fields
1 parent 5cb7f1c commit 1a7f956

File tree

12 files changed

+239
-33
lines changed

12 files changed

+239
-33
lines changed

.devcontainer/docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,5 @@ services:
2929
- 8080:80
3030
environment:
3131
- PMA_ARBITRARY=1
32+
- UPLOAD_LIMIT=64M
33+

.devcontainer/setup.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ sed -i "s/^DB_USERNAME=.*/${new_db_username}/" .env
2323
sed -i "s/^DB_PASSWORD=.*/${new_db_password}/" .env
2424

2525
echo "--- Install dependencies ..."
26-
composer install
26+
composer update
2727

2828
echo "--- Generate the application key ..."
2929
php artisan key:generate

app/Helpers/Helper.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
use App\Models\HonorKegiatan;
1313
use App\Models\JenisKontrak;
1414
use App\Models\JenisNaskah;
15+
use App\Models\JenisPulsa;
1516
use App\Models\KamusAnggaran;
1617
use App\Models\KepkaMitra;
1718
use App\Models\KerangkaAcuan;
1819
use App\Models\KodeArsip;
1920
use App\Models\KodeBank;
2021
use App\Models\KodeNaskah;
22+
use App\Models\LimitPulsa;
2123
use App\Models\MasterPersediaan;
2224
use App\Models\MasterWilayah;
2325
use App\Models\MataAnggaran;
@@ -1885,6 +1887,17 @@ public static function getLatestHargaSatuanId($tanggal)
18851887
return optional(self::getLatestHargaSatuan($tanggal))->id;
18861888
}
18871889

1890+
/**
1891+
* Get the latest Limit Pulsa ID based on the given date.
1892+
*
1893+
* @param string $tanggal
1894+
* @return string|null The latest Limit Pulsa ID or null if not found.
1895+
*/
1896+
public static function getLatestLimitPulsaId($tanggal)
1897+
{
1898+
return optional(self::getLatestLimitPulsa($tanggal))->id;
1899+
}
1900+
18881901
/**
18891902
* Get the latest Harga Satuan based on the given date.
18901903
*
@@ -1896,6 +1909,20 @@ public static function getLatestHargaSatuan($tanggal)
18961909
return HargaSatuan::cache()->get('all')->where('tanggal', '<=', $tanggal)->sortByDesc('tanggal')->first();
18971910
}
18981911

1912+
/**
1913+
* Retrieves the latest LimitPulsa record with a 'tanggal' less than or equal to the specified date.
1914+
*
1915+
* This method fetches all LimitPulsa records from cache, filters them by the given date,
1916+
* sorts them in descending order by 'tanggal', and returns the first (latest) record.
1917+
*
1918+
* @param string|\DateTime $tanggal The date to filter records by (inclusive).
1919+
* @return LimitPulsa|null The latest LimitPulsa record matching the criteria, or null if none found.
1920+
*/
1921+
public static function getLatestLimitPulsa($tanggal)
1922+
{
1923+
return LimitPulsa::cache()->get('all')->where('tanggal', '<=', $tanggal)->sortByDesc('tanggal')->first();
1924+
}
1925+
18991926
/**
19001927
* Create option values for the Derajat Naskah select field based on the given date.
19011928
*
@@ -2025,6 +2052,11 @@ public static function setOptionJenisKontrak($tanggal)
20252052
return self::setOptions(JenisKontrak::cache()->get('all')->where('harga_satuan_id', self::getLatestHargaSatuanId($tanggal)), 'id', 'jenis');
20262053
}
20272054

2055+
public static function setOptionJenisPulsa($tanggal)
2056+
{
2057+
return self::setOptions(JenisPulsa::cache()->get('all')->where('limit_pulsa_id', self::getLatestLimitPulsaId($tanggal)), 'id', 'jenis');
2058+
}
2059+
20282060
/**
20292061
* Create option values for the DIPA year select field.
20302062
*

app/Models/PulsaKegiatan.php

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,81 @@
22

33
namespace App\Models;
44

5+
use Laravel\Nova\Nova;
6+
use App\Helpers\Helper;
7+
use Illuminate\Support\Str;
58
use Illuminate\Database\Eloquent\Model;
9+
use Laravel\Nova\Http\Requests\NovaRequest;
10+
use Illuminate\Database\Eloquent\Relations\HasMany;
611
use Illuminate\Database\Eloquent\Relations\BelongsTo;
712

813
class PulsaKegiatan extends Model
914
{
10-
public function kerangkaAcuan(): BelongsTo
15+
protected function casts(): array
1116
{
12-
return $this->belongsTo(KerangkaAcuan::class);
17+
return [
18+
'tanggal' => 'date',
19+
];
20+
}
21+
22+
public function mataAnggaran(): BelongsTo
23+
{
24+
return $this->belongsTo(MataAnggaran::class);
25+
}
26+
27+
public function jenisPulsa(): BelongsTo
28+
{
29+
return $this->belongsTo(JenisPulsa::class);
30+
}
31+
32+
public function unitKerja(): BelongsTo
33+
{
34+
return $this->belongsTo(UnitKerja::class);
35+
}
36+
37+
/**
38+
* Get the daftar pulsa mitra.
39+
*/
40+
public function daftarPulsaMitra(): HasMany
41+
{
42+
return $this->hasMany(DaftarPulsaMitra::class);
43+
}
44+
45+
private function replicateDaftarPulsaMitra(): void
46+
{
47+
Nova::whenServing(function (NovaRequest $request) {
48+
$fromResourceId = $request->input('fromResourceId');
49+
50+
if ($fromResourceId) {
51+
$sourceKak = PulsaKegiatan::find($fromResourceId);
52+
$this->copyDaftar($fromResourceId);
53+
}
54+
});
55+
}
56+
57+
private function copyDaftar($fromResourceId): void
58+
{
59+
$daftar = DaftarPulsaMitra::where('pulsa_kegiatan_id', $fromResourceId)->get();
60+
foreach ($daftar as $item) {
61+
$copyItem = $item->replicate();
62+
$copyItem->pulsa_kegiatan_id = $this->id;
63+
$copyItem->save();
64+
}
1365
}
1466

1567
protected static function booted(): void
1668
{
1769
static::creating(function (PulsaKegiatan $pulsa) {
1870
$pulsa->tahun = session('year');
71+
$token = uniqid(Str::random(19));
72+
$pulsa->token = $token;
73+
$pulsa->link = url(config('nova.path')).'/pulsa/'.$token;
74+
$dataKetua = Helper::getDataPegawaiByUserId($pulsa->koordinator_user_id, $pulsa->tanggal);
75+
$pulsa->unit_kerja_id = optional($dataKetua)->unit_kerja_id;
76+
});
77+
static::deleting(function (PulsaKegiatan $pulsa) {
78+
$DaftarPulsaMitraIds = DaftarPulsaMitra::where('pulsa_kegiatan_id', $pulsa->id)->pluck('id');
79+
DaftarPulsaMitra::destroy($DaftarPulsaMitraIds);
1980
});
2081
}
2182
}

app/Models/ShareLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ShareLink extends Model
1111
protected static function booted(): void
1212
{
1313
static::saving(function (ShareLink $shareLink) {
14-
$token = Str::random(32);
14+
$token = uniqid(Str::random(19));
1515
$shareLink->token = $token;
1616
$shareLink->link = url(config('nova.path')).'/arsip-dokumen/'.$token;
1717
});

app/Nova/KerangkaAcuan.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use Laravel\Nova\Http\Requests\NovaRequest;
2929
use Laravel\Nova\Panel;
3030
use Laravel\Nova\Tabs\Tab;
31+
use Laravelwebdev\Numeric\Numeric;
3132

3233
class KerangkaAcuan extends Resource
3334
{
@@ -40,7 +41,7 @@ public static function label()
4041

4142
public static function indexQuery(NovaRequest $request, $query)
4243
{
43-
$query->whereYear('tanggal', session('year'));
44+
$query->withSum('anggaranKerangkaAcuan as anggaran', 'perkiraan')->whereYear('tanggal', session('year'));
4445
if (Policy::make()->allowedFor('ppk,arsiparis,bendahara,kpa,ppspm')->get()) {
4546
return $query;
4647
} elseif (Policy::make()->allowedFor('koordinator,anggota')->get()) {
@@ -96,7 +97,8 @@ public function fieldsForIndex(NovaRequest $request)
9697
Date::make('Tanggal KAK', 'tanggal')->displayUsing(fn ($tanggal) => Helper::terbilangTanggal($tanggal)),
9798
])->sortable(),
9899
Text::make('Rincian'),
99-
Text::make('Kegiatan'),
100+
Numeric::make('Perkiraan', 'anggaran')
101+
->sortable(),
100102
BelongsTo::make('Unit Kerja')
101103
->filterable(),
102104
Status::make('Status', 'status')

app/Nova/PulsaKegiatan.php

Lines changed: 94 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,16 @@
22

33
namespace App\Nova;
44

5+
use App\Helpers\Helper;
6+
use App\Helpers\Policy;
7+
use App\Nova\UnitKerja;
8+
use Laravel\Nova\Fields\BelongsTo;
9+
use Laravel\Nova\Fields\Date;
10+
use Laravel\Nova\Fields\FormData;
11+
use Laravel\Nova\Fields\Select;
12+
use Laravel\Nova\Fields\Text;
513
use Laravel\Nova\Http\Requests\NovaRequest;
14+
use Laravel\Nova\Panel;
615

716
class PulsaKegiatan extends Resource
817
{
@@ -13,20 +22,23 @@ class PulsaKegiatan extends Resource
1322
*/
1423
public static $model = \App\Models\PulsaKegiatan::class;
1524

25+
public static $with = ['mataAnggaran', 'jenisPulsa', 'unitKerja'];
26+
1627
public static function label()
1728
{
18-
return 'PulsaKegiatan';
29+
return 'Pulsa Kegiatan';
1930
}
2031

2132
/**
2233
* The single value that should be used to represent the resource when being displayed.
2334
*
2435
* @var string
2536
*/
26-
public static $title = 'id';
37+
public static $title = 'kegiatan';
2738

28-
public function subtitle(){
29-
return $this->id;
39+
public function subtitle()
40+
{
41+
return Helper::terbilangBulan($this->bulan).' '.$this->tahun;
3042
}
3143

3244
/**
@@ -35,26 +47,100 @@ public function subtitle(){
3547
* @var array
3648
*/
3749
public static $search = [
38-
'id',
50+
'kegiatan', 'bulan', 'mataAnggaran.mak',
3951
];
4052

53+
public static function indexQuery(NovaRequest $request, $query)
54+
{
55+
$query->where('tahun', session('year'));
56+
if (Policy::make()->allowedFor('ppk,arsiparis,bendahara,kpa,ppspm')->get()) {
57+
return $query;
58+
} elseif (Policy::make()->allowedFor('koordinator,anggota')->get()) {
59+
return $query->where('unit_kerja_id', Helper::getDataPegawaiByUserId($request->user()->id, now())->unit_kerja_id);
60+
}
61+
62+
return $query;
63+
}
64+
4165
/**
4266
* Get the fields displayed by the resource.
4367
*
44-
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
4568
* @return array
4669
*/
4770
public function fields(NovaRequest $request)
4871
{
4972
return [
50-
73+
Panel::make('Keterangan SPJ', [
74+
Text::make('Nama Kegiatan', 'kegiatan')
75+
->rules('required', 'max:255')
76+
->sortable()
77+
->help('Nama Kegiatan yang akan dibayarkan pulsanya. Contoh: Pelatihan Sakernas Februri 2025'),
78+
Date::make('Tanggal SPJ Tanda Terima', 'tanggal')
79+
->rules('required')
80+
->hideFromIndex()
81+
->displayUsing(fn ($tanggal) => Helper::terbilangTanggal($tanggal)),
82+
BelongsTo::make('Unit Kerja', 'unitKerja', UnitKerja::class)
83+
->showOnIndex(fn () => Policy::make()->allowedFor('ppk,ppspm,bendahara')->get())
84+
->exceptOnForms(),
85+
]),
86+
Panel::make('Keterangan Pembayaran Pulsa', [
87+
Select::make('Bulan Pelaksanaan', 'bulan')
88+
->options(Helper::BULAN)
89+
->displayUsingLabels()
90+
->rules('required')
91+
->sortable()
92+
->searchable()
93+
->filterable(),
94+
Select::make('Jenis Kegiatan', 'jenis_pulsa_id')
95+
->dependsOn(['tanggal'], function (Select $field, NovaRequest $request, FormData $form) {
96+
$field
97+
->options(Helper::setOptionJenisPulsa($form->tanggal));
98+
99+
})
100+
->rules('required')
101+
->searchable()
102+
->onlyOnForms(),
103+
Text::make('Link Upload Tanda Terima Pulsa', 'link')
104+
->displayUsing(fn () => 'Salin')
105+
->exceptOnForms()
106+
->copyable(),
107+
]),
108+
Panel::make('Anggaran', [
109+
BelongsTo::make('Item Mata Anggaran', 'mataAnggaran', MataAnggaran::class)
110+
->hideFromIndex()
111+
->withSubtitles()
112+
->searchable()
113+
->rules('required'),
114+
]),
115+
Panel::make('Penanda Tangan', [
116+
Select::make('Pembuat Daftar', 'koordinator_user_id')
117+
->searchable()
118+
->hideFromIndex()
119+
->rules('required')
120+
->displayUsing(fn ($id) => optional(Helper::getPegawaiByUserId($id))->name)
121+
->dependsOn(['tanggal'], function (Select $field, NovaRequest $request, FormData $formData) {
122+
$field->options(Helper::setOptionPengelola('koordinator', $formData->date('tanggal')))
123+
->default(Helper::setDefaultPengelola('koordinator', $formData->date('tanggal')));
124+
125+
}),
126+
Select::make('Pejabat Pembuat Komitmen', 'ppk_user_id')
127+
->searchable()
128+
->hideFromIndex()
129+
->rules('required')
130+
->displayUsing(fn ($id) => optional(Helper::getPegawaiByUserId($id))->name)
131+
->dependsOn(['tanggal'], function (Select $field, NovaRequest $request, FormData $formData) {
132+
$field->options(Helper::setOptionPengelola('ppk', $formData->date('tanggal')))
133+
->default(Helper::setDefaultPengelola('ppk', $formData->date('tanggal')));
134+
135+
}),
136+
]),
137+
51138
];
52139
}
53140

54141
/**
55142
* Get the cards available for the request.
56143
*
57-
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
58144
* @return array
59145
*/
60146
public function cards(NovaRequest $request)
@@ -65,7 +151,6 @@ public function cards(NovaRequest $request)
65151
/**
66152
* Get the filters available for the resource.
67153
*
68-
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
69154
* @return array
70155
*/
71156
public function filters(NovaRequest $request)
@@ -76,7 +161,6 @@ public function filters(NovaRequest $request)
76161
/**
77162
* Get the lenses available for the resource.
78163
*
79-
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
80164
* @return array
81165
*/
82166
public function lenses(NovaRequest $request)
@@ -87,7 +171,6 @@ public function lenses(NovaRequest $request)
87171
/**
88172
* Get the actions available for the resource.
89173
*
90-
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
91174
* @return array
92175
*/
93176
public function actions(NovaRequest $request)

app/Policies/HonorKegiatanPolicy.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function viewAny(): bool
2525
public function view(User $user, HonorKegiatan $honor): bool
2626
{
2727
return Policy::make()
28-
->allowedFor('ppk,arsiparis,bendahara,kpa,ppspm,koor,anggota')
28+
->allowedFor('ppk,arsiparis,bendahara,kpa,ppspm,koordinator,anggota')
2929
->withYear($honor->tahun)
3030
->get();
3131
}

0 commit comments

Comments
 (0)