Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PendidikanPelatihan;
|
||||
|
||||
enum PelatihanGAP: string
|
||||
{
|
||||
case PEMANGKASAN = 'Pemangkasan atau perawatan tanaman';
|
||||
case PEMUPUKAN = 'Pemupukan atau nutrisi tanah';
|
||||
case PENGENDALIAN = 'Pengendalian hama dan penyakit';
|
||||
case PRAKTIK = 'Praktik Berkebun yang Baik (GAP)';
|
||||
case PENGOLAHAN = 'Pengolahan/pascapanen';
|
||||
case PENYERBUKAN = 'Penyerbukan manual (Vanili)';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Dashboard;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\SurveyPelatihan;
|
||||
use App\Models\Pertanian\SurveySertifikasi;
|
||||
|
||||
use BackedEnum;
|
||||
|
||||
class SurveyPetaniController extends Controller
|
||||
{
|
||||
private const GAP_ENUM_CLASS = 'App\\Enums\\PendidikanPelatihan\\PelatihanGap';
|
||||
public function index()
|
||||
{
|
||||
$colors = $this->colors();
|
||||
|
||||
// Progres per enumerator
|
||||
|
||||
$enumerators = User::query()
|
||||
->where('role', 'fasilitator')
|
||||
->withCount([
|
||||
'petaniDibuat as done',
|
||||
])
|
||||
->orderByDesc('done')
|
||||
->get()
|
||||
->map(function ($enumerator) use ($colors) {
|
||||
$color = $colors[array_rand($colors)];
|
||||
|
||||
return [
|
||||
'name' => $enumerator->name,
|
||||
'done' => (int) $enumerator->done,
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Tabel dan nama model
|
||||
|
||||
$petaniTable = (new Petani())->getTable();
|
||||
$komoditasTable = (new Komoditas())->getTable();
|
||||
$lahanTable = (new Lahan())->getTable();
|
||||
|
||||
// Distribusi petani berdasarkan komoditas
|
||||
|
||||
$komoditasCollection = DB::table("{$petaniTable} as p")
|
||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama")
|
||||
->selectRaw('COUNT(p.id) as petani_count')
|
||||
->groupBy('k.id', 'k.nama')
|
||||
->orderByDesc('petani_count')
|
||||
->get();
|
||||
|
||||
$totalPetani = (int) $komoditasCollection->sum('petani_count');
|
||||
$circumference = 2 * pi() * 46;
|
||||
|
||||
$komoditas = $komoditasCollection
|
||||
->map(function ($item, $index) use (
|
||||
$colors,
|
||||
$totalPetani,
|
||||
$circumference
|
||||
) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
|
||||
$ratio = $totalPetani > 0
|
||||
? (int) $item->petani_count / $totalPetani
|
||||
: 0;
|
||||
|
||||
return [
|
||||
'label' => $item->nama,
|
||||
'total' => (int) $item->petani_count,
|
||||
'pct' => round($ratio * 100, 1),
|
||||
'arc' => $ratio * $circumference,
|
||||
'color' => $color['color'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Progres pengisian data per petani
|
||||
|
||||
$progressPetani = Petani::query()
|
||||
->select([
|
||||
'id',
|
||||
'nama',
|
||||
])
|
||||
->withExists([
|
||||
'lahans as has_lahan',
|
||||
'praktikBudidaya as has_praktik_budidaya',
|
||||
'sosialEkonomi as has_sosial_ekonomi',
|
||||
'aksesPasar as has_akses_pasar',
|
||||
])
|
||||
->orderBy('nama')
|
||||
->get()
|
||||
->map(function ($petani) {
|
||||
$status = [
|
||||
'lahan' => [
|
||||
'label' => 'Lahan',
|
||||
'done' => (bool) $petani->has_lahan,
|
||||
],
|
||||
'praktik_budidaya' => [
|
||||
'label' => 'Praktik Budidaya',
|
||||
'done' => (bool) $petani->has_praktik_budidaya,
|
||||
],
|
||||
'sosial_ekonomi' => [
|
||||
'label' => 'Sosial Ekonomi',
|
||||
'done' => (bool) $petani->has_sosial_ekonomi,
|
||||
],
|
||||
'akses_pasar' => [
|
||||
'label' => 'Akses Pasar',
|
||||
'done' => (bool) $petani->has_akses_pasar,
|
||||
],
|
||||
];
|
||||
|
||||
$totalModul = count($status);
|
||||
|
||||
$modulSelesai = collect($status)
|
||||
->where('done', true)
|
||||
->count();
|
||||
|
||||
return [
|
||||
'id' => $petani->id,
|
||||
'name' => $petani->nama,
|
||||
'status' => $status,
|
||||
'done' => $modulSelesai,
|
||||
'total' => $totalModul,
|
||||
'percent' => $totalModul > 0
|
||||
? (int) round(($modulSelesai / $totalModul) * 100)
|
||||
: 0,
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Ringkasan lahan
|
||||
|
||||
$totalLuasLahan = (float) Lahan::query()
|
||||
->sum('luas_lahan');
|
||||
|
||||
$totalJumlahTanaman = (int) Lahan::query()
|
||||
->sum('jumlah_tanaman');
|
||||
|
||||
// Jumlah tanaman berdasarkan komoditas petani
|
||||
|
||||
$tanamanPerKomoditasCollection = DB::table("{$lahanTable} as l")
|
||||
->join("{$petaniTable} as p", 'p.id', '=', 'l.petani_id')
|
||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||
->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total')
|
||||
->groupBy('k.id', 'k.nama')
|
||||
->orderByDesc('total')
|
||||
->get();
|
||||
|
||||
$tanamanPerKomoditas = $tanamanPerKomoditasCollection
|
||||
->map(function ($item, $index) use ($colors, $totalJumlahTanaman) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
$total = (int) $item->total;
|
||||
|
||||
return [
|
||||
'label' => $item->label,
|
||||
'total' => $total,
|
||||
'pct' => $totalJumlahTanaman > 0
|
||||
? round(($total / $totalJumlahTanaman) * 100, 1)
|
||||
: 0,
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Distribusi peserta pelatihan GAP
|
||||
|
||||
$gapOptions = collect($this->pelatihanGapOptions());
|
||||
|
||||
$knownGapOptions = $gapOptions->reject(function ($label, $value) {
|
||||
return $this->normalizeText((string) $value) === 'lainnya'
|
||||
|| $this->normalizeText((string) $label) === 'lainnya';
|
||||
});
|
||||
|
||||
$gapLookup = [];
|
||||
|
||||
foreach ($knownGapOptions as $value => $label) {
|
||||
$gapLookup[$this->normalizeText((string) $value)] = (string) $label;
|
||||
$gapLookup[$this->normalizeText((string) $label)] = (string) $label;
|
||||
}
|
||||
|
||||
$pelatihanPairs = SurveyPelatihan::query()
|
||||
->whereNotNull('petani_id')
|
||||
->whereNotNull('jenis_pelatihan')
|
||||
->where('jenis_pelatihan', '!=', '')
|
||||
->get([
|
||||
'petani_id',
|
||||
'jenis_pelatihan',
|
||||
])
|
||||
->map(function ($row) use ($gapLookup) {
|
||||
$normalized = $this->normalizeText((string) $row->jenis_pelatihan);
|
||||
|
||||
return [
|
||||
'petani_id' => $row->petani_id,
|
||||
'label' => $gapLookup[$normalized] ?? 'Lainnya',
|
||||
];
|
||||
})
|
||||
->unique(fn ($item) => $item['petani_id'] . '|' . $item['label'])
|
||||
->values();
|
||||
|
||||
$pelatihanCounts = $pelatihanPairs->countBy('label');
|
||||
|
||||
$pelatihanLabels = $knownGapOptions
|
||||
->values()
|
||||
->unique()
|
||||
->push('Lainnya')
|
||||
->values();
|
||||
|
||||
$pelatihanGap = $pelatihanLabels
|
||||
->map(function ($label, $index) use ($pelatihanCounts, $colors) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
|
||||
return [
|
||||
'label' => $label,
|
||||
'total' => (int) $pelatihanCounts->get($label, 0),
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
$totalPetaniPelatihan = $pelatihanPairs
|
||||
->pluck('petani_id')
|
||||
->unique()
|
||||
->count();
|
||||
|
||||
// Sertifikasi
|
||||
|
||||
$totalPetaniBersertifikat = SurveySertifikasi::query()
|
||||
->whereNotNull('petani_id')
|
||||
->distinct()
|
||||
->count('petani_id');
|
||||
|
||||
$totalPetaniSertifikatAktif = SurveySertifikasi::query()
|
||||
->whereNotNull('petani_id')
|
||||
->where('is_aktif', true)
|
||||
->distinct()
|
||||
->count('petani_id');
|
||||
|
||||
return view('dashboard.survey-petani', [
|
||||
'enumerators' => $enumerators,
|
||||
'komoditas' => $komoditas,
|
||||
'totalPetani' => $totalPetani,
|
||||
'circumference' => $circumference,
|
||||
'progressPetani' => $progressPetani,
|
||||
'totalLuasLahan' => $totalLuasLahan,
|
||||
'totalJumlahTanaman' => $totalJumlahTanaman,
|
||||
'tanamanPerKomoditas' => $tanamanPerKomoditas,
|
||||
'pelatihanGap' => $pelatihanGap,
|
||||
'totalPetaniPelatihan' => $totalPetaniPelatihan,
|
||||
'totalPetaniBersertifikat' => $totalPetaniBersertifikat,
|
||||
'totalPetaniSertifikatAktif' => $totalPetaniSertifikatAktif,
|
||||
]);
|
||||
}
|
||||
|
||||
private function pelatihanGapOptions(): array
|
||||
{
|
||||
$enumClass = self::GAP_ENUM_CLASS;
|
||||
|
||||
if (enum_exists($enumClass)) {
|
||||
if (method_exists($enumClass, 'options')) {
|
||||
return collect($enumClass::options())
|
||||
->mapWithKeys(function ($option, $key) {
|
||||
if (is_array($option)) {
|
||||
$value = (string) ($option['value'] ?? $key);
|
||||
$label = (string) (
|
||||
$option['label']
|
||||
?? $option['name']
|
||||
?? $option['value']
|
||||
?? $key
|
||||
);
|
||||
|
||||
return [$value => $label];
|
||||
}
|
||||
|
||||
return [(string) $key => (string) $option];
|
||||
})
|
||||
->all();
|
||||
}
|
||||
|
||||
return collect($enumClass::cases())
|
||||
->mapWithKeys(function ($case) {
|
||||
$value = $case instanceof BackedEnum
|
||||
? (string) $case->value
|
||||
: (string) $case->name;
|
||||
|
||||
$label = method_exists($case, 'label')
|
||||
? (string) $case->label()
|
||||
: Str::headline($case->name);
|
||||
|
||||
return [$value => $label];
|
||||
})
|
||||
->all();
|
||||
}
|
||||
|
||||
return [
|
||||
'pemangkasan_perawatan_tanaman'
|
||||
=> 'Pemangkasan/perawatan tanaman',
|
||||
'pemupukan_nutrisi_tanah'
|
||||
=> 'Pemupukan/nutrisi tanah',
|
||||
'pengendalian_hama_penyakit'
|
||||
=> 'Pengendalian hama & penyakit',
|
||||
'praktik_berkebun_baik_gap'
|
||||
=> 'Praktik Berkebun yang Baik (GAP)',
|
||||
'pengolahan_pascapanen'
|
||||
=> 'Pengolahan/pascapanen',
|
||||
'penyerbukan_manual_vanili'
|
||||
=> 'Penyerbukan manual (vanili)',
|
||||
'lainnya'
|
||||
=> 'Lainnya',
|
||||
];
|
||||
}
|
||||
|
||||
private function normalizeText(string $value): string
|
||||
{
|
||||
return Str::lower(Str::squish($value));
|
||||
}
|
||||
|
||||
private function colors(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
'color' => '#28a745',
|
||||
'bg' => 'rgba(40,167,69,.15)',
|
||||
'tx' => '#28a745',
|
||||
],
|
||||
[
|
||||
'color' => '#007bff',
|
||||
'bg' => 'rgba(0,123,255,.15)',
|
||||
'tx' => '#007bff',
|
||||
],
|
||||
[
|
||||
'color' => '#fd7e14',
|
||||
'bg' => 'rgba(253,126,20,.15)',
|
||||
'tx' => '#fd7e14',
|
||||
],
|
||||
[
|
||||
'color' => '#dc3545',
|
||||
'bg' => 'rgba(220,53,69,.15)',
|
||||
'tx' => '#dc3545',
|
||||
],
|
||||
[
|
||||
'color' => '#6f42c1',
|
||||
'bg' => 'rgba(111,66,193,.15)',
|
||||
'tx' => '#6f42c1',
|
||||
],
|
||||
[
|
||||
'color' => '#20c997',
|
||||
'bg' => 'rgba(32,201,151,.15)',
|
||||
'tx' => '#20c997',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -141,7 +141,8 @@ class PetaniLahanController extends Controller
|
||||
$lahanCount = Lahan::where('petani_id', $petaniId)
|
||||
->count();
|
||||
$lahanUid = strtoupper(Str::random(10));
|
||||
|
||||
|
||||
$foto = null;
|
||||
if ($request->hasFile('foto')) {
|
||||
$foto = [];
|
||||
foreach ($request->file('foto') as $file) {
|
||||
@@ -188,6 +189,14 @@ class PetaniLahanController extends Controller
|
||||
Tanaman::insert($chunk->toArray());
|
||||
});
|
||||
|
||||
if ($request->ajax()) {
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'redirect' => route('petani.lahan-tanaman.index', $petaniId),
|
||||
'message' => 'Lahan berhasil ditambahkan.'
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Produktivitas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class SkorPetaniController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(string $petaniId)
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$skor = $petani->skor;
|
||||
|
||||
return view('produktivitas.petani.skor.index', compact('petani', 'skor'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $petaniId, string $id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,10 @@ namespace App\Models\Pertanian;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use App\Models\Master\JenisKomoditas;
|
||||
use App\Models\Master\Varietas;
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class Komoditas extends Model
|
||||
{
|
||||
@@ -42,4 +44,9 @@ class Komoditas extends Model
|
||||
{
|
||||
return $this->hasMany(Varietas::class, 'komoditas_id');
|
||||
}
|
||||
|
||||
public function petani(): HasMany
|
||||
{
|
||||
return $this->hasMany(Petani::class, 'komoditas_id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,9 @@ namespace App\Models\Pertanian;
|
||||
|
||||
use App\Enums\Pendidikan;
|
||||
use App\Enums\Pernikahan;
|
||||
use App\Models\User;
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\PraktikBudidaya;
|
||||
use App\Models\Pertanian\SurveyPanen;
|
||||
@@ -368,4 +370,32 @@ class Petani extends Model
|
||||
|
||||
return 'Belum tersegmentasi';
|
||||
}
|
||||
|
||||
public function keteranganSegmen(): ?string
|
||||
{
|
||||
$skor = $this->skor;
|
||||
|
||||
if (!$skor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($skor->skor_kesiapan_adopsi >= 4.0) {
|
||||
return 'Siap menjadi peserta agrolab utama dan panutan bagi petani lain';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 3.0) {
|
||||
return 'Berpotensi berkembang menjadi Penggerak dengan dukungan yang tepat';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 2.0) {
|
||||
return 'Perlu melihat bukti hasil nyata dari Penggerak sebelum mau bergerak';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 1.0) {
|
||||
return 'Butuh penanganan hambatan dasar terlebih dahulu sebelum intervensi teknis';
|
||||
} else {
|
||||
return 'Belum tersegmentasi, data belum lengkap';
|
||||
}
|
||||
|
||||
return 'Belum tersegmentasi, data belum lengkap';
|
||||
}
|
||||
|
||||
public function creator(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,11 @@ use App\Enums\Role;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class User extends Authenticatable
|
||||
{
|
||||
use HasFactory, Notifiable, HasApiTokens, SoftDeletes;
|
||||
@@ -44,4 +47,9 @@ class User extends Authenticatable
|
||||
{
|
||||
return $this->hasOne(\App\Models\Profile::class);
|
||||
}
|
||||
|
||||
public function petaniDibuat(): HasMany
|
||||
{
|
||||
return $this->hasMany(Petani::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,821 @@
|
||||
@extends('layout.main')
|
||||
|
||||
@push('style')
|
||||
<style>
|
||||
.tk-stat {
|
||||
border-left: 4px solid transparent;
|
||||
transition: transform .2s ease, box-shadow .2s ease;
|
||||
}
|
||||
|
||||
.tk-stat:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 .25rem 1rem rgba(34, 48, 62, .08);
|
||||
}
|
||||
|
||||
.tk-stat.green { border-left-color: #28a745; }
|
||||
.tk-stat.blue { border-left-color: #007bff; }
|
||||
.tk-stat.amber { border-left-color: #fd7e14; }
|
||||
|
||||
.tk-stat-lbl {
|
||||
font-size: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .7px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.tk-stat-val {
|
||||
font-size: 20px;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.tk-stat-top {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.tk-pb {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.tk-pbt {
|
||||
flex: 1;
|
||||
height: 6px;
|
||||
background: rgba(128, 128, 128, .15);
|
||||
border-radius: 3px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.tk-pbf {
|
||||
height: 100%;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.tk-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.tk-bar:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.tk-bar-lbl {
|
||||
width: 105px;
|
||||
font-size: 11px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.tk-bar-trk {
|
||||
flex: 1;
|
||||
height: 7px;
|
||||
background: rgba(128, 128, 128, .15);
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.tk-bar-fil {
|
||||
height: 100%;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.tk-bar-val {
|
||||
font-size: 11px;
|
||||
min-width: 58px;
|
||||
}
|
||||
|
||||
.tk-erow {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 9px 0;
|
||||
border-bottom: 1px solid rgba(128, 128, 128, .1);
|
||||
}
|
||||
|
||||
.tk-erow:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.tk-av {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.tk-leg {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
margin-bottom: 7px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.tk-leg:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.tk-leg-dot {
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.tk-leg-val {
|
||||
margin-left: auto;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.tk-divider {
|
||||
height: 1px;
|
||||
background: rgba(128, 128, 128, .1);
|
||||
margin: 12px 0;
|
||||
}
|
||||
|
||||
.tk-donut-num {
|
||||
fill: var(--bs-body-color);
|
||||
font-size: 15px;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.tk-donut-sub {
|
||||
fill: var(--bs-secondary-color, #6c757d);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.enumerator-scroll {
|
||||
max-height: 244px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.progress-petani-scroll {
|
||||
max-height: 575px;
|
||||
overflow-y: auto;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.progress-petani-scroll thead th {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 3;
|
||||
background: var(--bs-table-bg, #f8f9fa);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.tk-training-scroll {
|
||||
max-height: 330px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.enumerator-scroll::-webkit-scrollbar,
|
||||
.progress-petani-scroll::-webkit-scrollbar,
|
||||
.tk-training-scroll::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.enumerator-scroll::-webkit-scrollbar-thumb,
|
||||
.progress-petani-scroll::-webkit-scrollbar-thumb,
|
||||
.tk-training-scroll::-webkit-scrollbar-thumb {
|
||||
background: rgba(128, 128, 128, .28);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.enumerator-scroll::-webkit-scrollbar-track,
|
||||
.progress-petani-scroll::-webkit-scrollbar-track,
|
||||
.tk-training-scroll::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="container-xxl flex-grow-1 container-p-y">
|
||||
|
||||
{{-- Ringkasan utama --}}
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-md-4">
|
||||
<div class="card tk-stat green h-100">
|
||||
<div class="card-body">
|
||||
<div class="tk-stat-top">
|
||||
<div>
|
||||
<div class="tk-stat-lbl text-muted mb-2">
|
||||
Total Petani
|
||||
</div>
|
||||
|
||||
<div class="tk-stat-val">
|
||||
{{ number_format($totalPetani, 0, ',', '.') }}
|
||||
|
||||
<span class="text-muted fw-normal" style="font-size: 12px">
|
||||
petani
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded bg-label-success">
|
||||
<i class="ti tabler-users"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
Seluruh petani yang sudah masuk ke sistem
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card tk-stat blue h-100">
|
||||
<div class="card-body">
|
||||
<div class="tk-stat-top">
|
||||
<div>
|
||||
<div class="tk-stat-lbl text-muted mb-2">
|
||||
Total Luas Lahan
|
||||
</div>
|
||||
|
||||
<div class="tk-stat-val">
|
||||
{{ number_format($totalLuasLahan, 2, ',', '.') }}
|
||||
|
||||
<span class="text-muted fw-normal" style="font-size: 12px">
|
||||
ha
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded bg-label-primary">
|
||||
<i class="ti tabler-map-2"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
Akumulasi luas seluruh lahan petani
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card tk-stat amber h-100">
|
||||
<div class="card-body">
|
||||
<div class="tk-stat-top">
|
||||
<div>
|
||||
<div class="tk-stat-lbl text-muted mb-2">
|
||||
Total Tanaman
|
||||
</div>
|
||||
|
||||
<div class="tk-stat-val">
|
||||
{{ number_format($totalJumlahTanaman, 0, ',', '.') }}
|
||||
|
||||
<span class="text-muted fw-normal" style="font-size: 12px">
|
||||
tanaman
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded bg-label-warning">
|
||||
<i class="ti tabler-trees"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
Akumulasi jumlah tanaman seluruh lahan
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-3">
|
||||
{{-- Kolom utama --}}
|
||||
<div class="col-xl-8">
|
||||
{{-- Progres enumerator --}}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0 fw-bold">
|
||||
<i class="ti tabler-chart-bar me-2 text-success"></i>
|
||||
Progres per Enumerator
|
||||
</h6>
|
||||
|
||||
<span class="badge bg-label-secondary text-secondary">
|
||||
{{ now()->format('M Y') }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@php
|
||||
$maxDone = $enumerators->max('done') ?: 1;
|
||||
@endphp
|
||||
|
||||
@if ($enumerators->isNotEmpty())
|
||||
<div class="enumerator-scroll">
|
||||
@foreach ($enumerators as $e)
|
||||
@php
|
||||
$pct = round(($e['done'] / $maxDone) * 100);
|
||||
@endphp
|
||||
|
||||
<div class="tk-erow">
|
||||
<div
|
||||
class="tk-av rounded"
|
||||
style="
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
background: {{ $e['bg'] }};
|
||||
color: {{ $e['tx'] }};
|
||||
"
|
||||
>
|
||||
{{ strtoupper(substr($e['name'], 0, 2)) }}
|
||||
</div>
|
||||
|
||||
<div class="flex-grow-1">
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<span class="fw-semibold" style="font-size: 13px">
|
||||
{{ $e['name'] }}
|
||||
</span>
|
||||
|
||||
<small class="text-muted">
|
||||
{{ number_format($e['done'], 0, ',', '.') }} survei
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="tk-pb">
|
||||
<div class="tk-pbt">
|
||||
<div
|
||||
class="tk-pbf"
|
||||
style="
|
||||
width: {{ $pct }}%;
|
||||
background: {{ $e['color'] }};
|
||||
"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@else
|
||||
<div class="text-center text-muted py-3">
|
||||
Belum ada data enumerator.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Progres data petani --}}
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0 fw-bold">
|
||||
<i class="ti tabler-list-check me-2 text-success"></i>
|
||||
Progres Data Petani
|
||||
</h6>
|
||||
|
||||
<span class="badge bg-label-secondary text-secondary">
|
||||
{{ $progressPetani->count() }} petani
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive progress-petani-scroll">
|
||||
<table class="table table-hover mb-0" style="font-size: 12.5px">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Petani
|
||||
</th>
|
||||
|
||||
<th class="text-center"
|
||||
style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Lahan
|
||||
</th>
|
||||
|
||||
<th class="text-center"
|
||||
style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Praktik Budidaya
|
||||
</th>
|
||||
|
||||
<th class="text-center"
|
||||
style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Sosial Ekonomi
|
||||
</th>
|
||||
|
||||
<th class="text-center"
|
||||
style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Akses Pasar
|
||||
</th>
|
||||
|
||||
<th style="
|
||||
min-width: 140px;
|
||||
font-size: 10px;
|
||||
letter-spacing: .7px;
|
||||
text-transform: uppercase;
|
||||
">
|
||||
Progres
|
||||
</th>
|
||||
|
||||
<th style="font-size:10px;letter-spacing:.7px;text-transform:uppercase">
|
||||
Status
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@forelse ($progressPetani as $petani)
|
||||
@php
|
||||
$barColor = match (true) {
|
||||
$petani['percent'] === 100 => '#28a745',
|
||||
$petani['percent'] >= 50 => '#007bff',
|
||||
$petani['percent'] >= 20 => '#fd7e14',
|
||||
default => '#dc3545',
|
||||
};
|
||||
|
||||
$initial = collect(explode(' ', trim($petani['name'])))
|
||||
->filter()
|
||||
->take(2)
|
||||
->map(fn ($word) => strtoupper(substr($word, 0, 1)))
|
||||
->implode('');
|
||||
@endphp
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<div
|
||||
class="tk-av rounded"
|
||||
style="
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
background: rgba(40,167,69,.15);
|
||||
color: #28a745;
|
||||
"
|
||||
>
|
||||
{{ $initial ?: 'PT' }}
|
||||
</div>
|
||||
|
||||
<span class="fw-semibold">
|
||||
{{ $petani['name'] }}
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
@foreach ($petani['status'] as $status)
|
||||
<td class="text-center">
|
||||
@if ($status['done'])
|
||||
<span
|
||||
class="badge rounded-pill bg-label-success text-success"
|
||||
title="{{ $status['label'] }} sudah diisi"
|
||||
>
|
||||
<i class="ti tabler-check"></i>
|
||||
</span>
|
||||
@else
|
||||
<span
|
||||
class="badge rounded-pill bg-label-secondary text-secondary"
|
||||
title="{{ $status['label'] }} belum diisi"
|
||||
>
|
||||
<i class="ti tabler-minus"></i>
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
@endforeach
|
||||
|
||||
<td style="min-width: 140px">
|
||||
<div class="tk-pb">
|
||||
<div class="tk-pbt">
|
||||
<div
|
||||
class="tk-pbf"
|
||||
style="
|
||||
width: {{ $petani['percent'] }}%;
|
||||
background: {{ $barColor }};
|
||||
"
|
||||
></div>
|
||||
</div>
|
||||
|
||||
<small
|
||||
class="text-muted"
|
||||
style="min-width: 30px; text-align: right"
|
||||
>
|
||||
{{ $petani['percent'] }}%
|
||||
</small>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
@if ($petani['percent'] === 100)
|
||||
<span class="badge bg-label-success text-success">
|
||||
Selesai
|
||||
</span>
|
||||
@elseif ($petani['percent'] > 0)
|
||||
<span class="badge bg-label-primary text-primary">
|
||||
Sedang diisi
|
||||
</span>
|
||||
@else
|
||||
<span class="badge bg-label-warning text-warning">
|
||||
Draft
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="text-center text-muted py-4">
|
||||
Belum ada data petani.
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Kolom samping --}}
|
||||
<div class="col-xl-4">
|
||||
{{-- Distribusi komoditas petani --}}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0 fw-bold">
|
||||
<i class="ti tabler-plant me-2 text-success"></i>
|
||||
Distribusi Komoditas
|
||||
</h6>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if ($komoditas->isNotEmpty())
|
||||
@php
|
||||
$donutOff = 0;
|
||||
@endphp
|
||||
|
||||
<div class="d-flex justify-content-center py-2">
|
||||
<svg
|
||||
width="120"
|
||||
height="120"
|
||||
viewBox="0 0 120 120"
|
||||
role="img"
|
||||
aria-label="Distribusi komoditas petani"
|
||||
>
|
||||
<circle
|
||||
cx="60"
|
||||
cy="60"
|
||||
r="46"
|
||||
fill="none"
|
||||
stroke="rgba(128,128,128,.15)"
|
||||
stroke-width="16"
|
||||
/>
|
||||
|
||||
@foreach ($komoditas as $k)
|
||||
<circle
|
||||
cx="60"
|
||||
cy="60"
|
||||
r="46"
|
||||
fill="none"
|
||||
stroke="{{ $k['color'] }}"
|
||||
stroke-width="16"
|
||||
stroke-dasharray="
|
||||
{{ $k['arc'] }}
|
||||
{{ $circumference - $k['arc'] }}
|
||||
"
|
||||
stroke-dashoffset="{{ -$donutOff }}"
|
||||
transform="rotate(-90 60 60)"
|
||||
/>
|
||||
|
||||
@php
|
||||
$donutOff += $k['arc'];
|
||||
@endphp
|
||||
@endforeach
|
||||
|
||||
<text
|
||||
x="60"
|
||||
y="56"
|
||||
text-anchor="middle"
|
||||
class="tk-donut-num"
|
||||
>
|
||||
{{ $totalPetani }}
|
||||
</text>
|
||||
|
||||
<text
|
||||
x="60"
|
||||
y="70"
|
||||
text-anchor="middle"
|
||||
class="tk-donut-sub"
|
||||
>
|
||||
petani
|
||||
</text>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
@foreach ($komoditas as $k)
|
||||
<div class="tk-leg">
|
||||
<div
|
||||
class="tk-leg-dot"
|
||||
style="background: {{ $k['color'] }}"
|
||||
></div>
|
||||
|
||||
<span class="text-muted">
|
||||
{{ $k['label'] }}
|
||||
</span>
|
||||
|
||||
<span class="tk-leg-val">
|
||||
{{ number_format($k['total'], 0, ',', '.') }}
|
||||
|
||||
<span
|
||||
class="text-muted fw-normal"
|
||||
style="font-size: 10px"
|
||||
>
|
||||
{{ $k['pct'] }}%
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<div class="text-center text-muted py-4">
|
||||
Belum ada data distribusi komoditas.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Jumlah tanaman per komoditas --}}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0 fw-bold">
|
||||
<i class="ti tabler-trees me-2 text-primary"></i>
|
||||
Tanaman per Komoditas
|
||||
</h6>
|
||||
|
||||
<span class="badge bg-label-primary text-primary">
|
||||
{{ number_format($totalJumlahTanaman, 0, ',', '.') }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if ($tanamanPerKomoditas->isNotEmpty())
|
||||
@foreach ($tanamanPerKomoditas as $tanaman)
|
||||
<div class="tk-bar">
|
||||
<span
|
||||
class="tk-bar-lbl text-muted text-truncate"
|
||||
title="{{ $tanaman['label'] }}"
|
||||
>
|
||||
{{ $tanaman['label'] }}
|
||||
</span>
|
||||
|
||||
<div class="tk-bar-trk">
|
||||
<div
|
||||
class="tk-bar-fil"
|
||||
style="
|
||||
width: {{ $tanaman['pct'] }}%;
|
||||
background: {{ $tanaman['color'] }};
|
||||
"
|
||||
></div>
|
||||
</div>
|
||||
|
||||
<span class="tk-bar-val fw-semibold text-end">
|
||||
{{ number_format($tanaman['total'], 0, ',', '.') }}
|
||||
</span>
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<div class="text-center text-muted py-4">
|
||||
Belum ada data jumlah tanaman.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Pelatihan GAP --}}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0 fw-bold">
|
||||
<i class="ti tabler-school me-2 text-warning"></i>
|
||||
Pelatihan GAP
|
||||
</h6>
|
||||
|
||||
<span class="badge bg-label-warning text-warning">
|
||||
{{ number_format($totalPetaniPelatihan, 0, ',', '.') }} petani
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
@if ($pelatihanGap->isNotEmpty())
|
||||
<div class="tk-training-scroll">
|
||||
@foreach ($pelatihanGap as $pelatihan)
|
||||
<div class="tk-erow">
|
||||
<div
|
||||
class="tk-av rounded"
|
||||
style="
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
background: {{ $pelatihan['bg'] }};
|
||||
color: {{ $pelatihan['tx'] }};
|
||||
"
|
||||
>
|
||||
<i class="ti tabler-certificate"></i>
|
||||
</div>
|
||||
|
||||
<div class="flex-grow-1">
|
||||
<div class="d-flex justify-content-between align-items-center gap-2">
|
||||
<span
|
||||
class="fw-semibold"
|
||||
style="font-size: 12px"
|
||||
>
|
||||
{{ $pelatihan['label'] }}
|
||||
</span>
|
||||
|
||||
<span
|
||||
class="badge flex-shrink-0"
|
||||
style="
|
||||
background: {{ $pelatihan['bg'] }};
|
||||
color: {{ $pelatihan['tx'] }};
|
||||
"
|
||||
>
|
||||
{{ $pelatihan['total'] }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="tk-divider"></div>
|
||||
|
||||
<small class="text-muted">
|
||||
Satu petani dapat tercatat pada lebih dari satu jenis pelatihan.
|
||||
</small>
|
||||
@else
|
||||
<div class="text-center text-muted py-4">
|
||||
Belum ada data pelatihan.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Sertifikasi --}}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center justify-content-between gap-3">
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<div class="avatar">
|
||||
<span class="avatar-initial rounded bg-label-success">
|
||||
<i class="ti tabler-rosette-discount-check"></i>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="tk-stat-lbl text-muted mb-1">
|
||||
Petani Bersertifikasi
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-baseline gap-1">
|
||||
<span class="tk-stat-val">
|
||||
{{ number_format(
|
||||
$totalPetaniBersertifikat,
|
||||
0,
|
||||
',',
|
||||
'.'
|
||||
) }}
|
||||
</span>
|
||||
|
||||
<span class="text-muted" style="font-size: 12px">
|
||||
petani
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="badge bg-label-success text-success">
|
||||
{{ number_format(
|
||||
$totalPetaniSertifikatAktif,
|
||||
0,
|
||||
',',
|
||||
'.'
|
||||
) }}
|
||||
aktif
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="tk-divider"></div>
|
||||
|
||||
<small class="text-muted">
|
||||
Petani unik yang memiliki minimal satu riwayat sertifikasi.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -51,15 +51,12 @@
|
||||
|
||||
@if(in_array($userRole, ['super_admin', 'admin', 'fasilitator']) && env('APP_NAME') == 'AgroMonev')
|
||||
<ul class="menu-sub">
|
||||
<li class="menu-item {{ request()->routeIs('dashboard.survey') ? 'active' : '' }}">
|
||||
<a href="{{ route('dashboard.survey') }}" class="menu-link">
|
||||
<div data-i18n="Survey">Survey</div>
|
||||
<li class="menu-item {{ request()->routeIs('dashboard.survey-petani') ? 'active' : '' }}">
|
||||
<a href="{{ route('dashboard.survey-petani') }}" class="menu-link">
|
||||
<div data-i18n="Survey Petani">Survey Petani</div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@endif
|
||||
|
||||
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev')
|
||||
<ul class="menu-sub">
|
||||
<li class="menu-item {{ request()->routeIs('dashboard.petani') ? 'active' : '' }}">
|
||||
<a href="{{ route('dashboard.petani') }}" class="menu-link">
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<div class=" d-flex align-items-center flex-column">
|
||||
<img id="fotoPreview"
|
||||
class="img-fluid rounded mb-4"
|
||||
src="{{ isset($petani) && $petani?->foto ? asset('storage/' . $petani->foto) : '../../assets/img/avatars/1.png' }}"
|
||||
src="{{ isset($petani) && $petani?->foto ? asset('storage/' . $petani->foto) : asset('assets/img/avatars/1.png') }}"
|
||||
height="120" width="120"
|
||||
alt="Foto profil petani"
|
||||
data-bs-toggle="tooltip" data-bs-placement="top"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<div class=" d-flex align-items-center flex-column">
|
||||
<img id="fotoPreview"
|
||||
class="img-fluid rounded mb-4"
|
||||
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : '../../assets/img/avatars/1.png' }}"
|
||||
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/1.png') }}"
|
||||
height="120" width="120"
|
||||
alt="Foto profil petani"
|
||||
data-bs-toggle="tooltip" data-bs-placement="top"
|
||||
|
||||
@@ -6,7 +6,12 @@
|
||||
<h6 class="card-title mb-2">Profil Petani</h6>
|
||||
<div class="d-flex justify-content-start align-items-center mb-3">
|
||||
<div class="avatar me-2">
|
||||
<img src="../../assets/img/avatars/1.png" alt="Avatar" class="rounded-circle" />
|
||||
@if (!isset($petani))
|
||||
<img src="{{ asset('assets/img/avatars/1.png') }}" alt="Foto Petani" class="rounded-circle" />
|
||||
@else
|
||||
<img class="rounded-circle" alt="Foto Petani"
|
||||
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/1.png') }}" />
|
||||
@endif
|
||||
</div>
|
||||
<div class="d-flex flex-column">
|
||||
<h6 class="mb-0" style="font-size: 0.9rem;">{{ isset($petani) ? $petani->nama : 'Tambah Petani Baru' }}</h6>
|
||||
@@ -308,30 +313,35 @@
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled tooltip="Lahan & Tanaman, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Lahan & Tanaman, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-trees me-1_5 icon-sm"></i>Lahan & Tanaman
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled tooltip="Praktik Budidaya, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Praktik Budidaya, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-seedling me-1_5 icon-sm"></i>Praktik Budidaya
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled tooltip="Pendidikan & Pelatihan, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Pendidikan & Pelatihan, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-books me-1_5 icon-sm"></i>Pendidikan & Pelatihan
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled tooltip="Sosial Ekonomi, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Sosial Ekonomi, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-social me-1_5 icon-sm"></i>Sosial Ekonomi
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled tooltip="Akses Pasar, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Akses Pasar, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-building-store me-1_5 icon-sm"></i>Akses Pasar
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" disabled data-bs-original-title="Kesiapan Adopsi, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||
<i class="icon-base ti tabler-star me-1_5 icon-sm"></i>Kesiapan Adopsi
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@else
|
||||
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2">
|
||||
@@ -365,6 +375,11 @@
|
||||
<i class="icon-base ti tabler-building-store me-1_5 icon-sm"></i>Akses Pasar
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ request()->routeIs('petani.skor.*') ? 'active' : '' }}" href="{{ route('petani.skor.index', $petani->id) }}">
|
||||
<i class="icon-base ti tabler-star me-1_5 icon-sm"></i>Kesiapan Adopsi
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@@ -753,7 +753,9 @@
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function(res) {
|
||||
console.log(res);
|
||||
if (res.redirect) {
|
||||
window.location.href = res.redirect;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -320,12 +320,12 @@
|
||||
@elseif($item->penyakit_tanaman == \App\Enums\PenyakitTanaman::DAUN_BERCAK)
|
||||
<span class="badge bg-label-warning">Daun Bercak</span>
|
||||
@elseif($item->penyakit_tanaman == \App\Enums\PenyakitTanaman::TANAMAN_LAYU)
|
||||
<span class="badge bg-label-danger">Tanaman Layu</span>
|
||||
<span class="badge bg-label-info">Tanaman Layu</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="td-keparahan">
|
||||
@if($item->keparahan_serangan == \App\Enums\KeparahanSerangan::RINGAN)
|
||||
<span class="badge bg-label-success">Ringan</span>
|
||||
<span class="badge bg-label-info">Ringan</span>
|
||||
@elseif($item->keparahan_serangan == \App\Enums\KeparahanSerangan::SEDANG)
|
||||
<span class="badge bg-label-warning">Sedang</span>
|
||||
@elseif($item->keparahan_serangan == \App\Enums\KeparahanSerangan::BERAT)
|
||||
|
||||
@@ -32,40 +32,39 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label for="latitude" class="form-label">Latitude</label>
|
||||
<input type="number" class="form-control" id="latitude" name="latitude">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label for="longitude" class="form-label">Longitude</label>
|
||||
<input type="number" class="form-control" id="longitude" name="longitude">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label for="kondisi" class="form-label">Kondisi Tanaman</label>
|
||||
<select class="form-select" id="kondisi" name="kondisi_tanaman" required>
|
||||
<select class="form-select" id="tnm_kondisi_tanaman" name="kondisi_tanaman" required>
|
||||
<option value="">Pilih Kondisi Tanaman</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::BAIK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BAIK->value ? 'selected' : '' }}>Baik</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::SEDANG }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::SEDANG->value ? 'selected' : '' }}>Sedang</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::BURUK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BURUK->value ? 'selected' : '' }}>Buruk</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::BAIK->value }}">Baik</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::SEDANG->value }}">Sedang</option>
|
||||
<option value="{{ \App\Enums\KondisiTanaman::BURUK->value }}">Buruk</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label class="form-label">Serangan Hama</label>
|
||||
<select id="serangan_hama" name="serangan_hama" class="form-select @error('serangan_hama') is-invalid @enderror">
|
||||
<select id="tnm_serangan_hama" name="serangan_hama" class="form-select">
|
||||
<option value="">Pilih Serangan Hama</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::ULAT }}" {{ old('serangan_hama', $lahanSelected->serangan_hama) == \App\Enums\SeranganHama::ULAT->value ? 'selected' : '' }}>Ulat</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::BELALANG }}" {{ old('serangan_hama', $lahanSelected->serangan_hama) == \App\Enums\SeranganHama::BELALANG->value ? 'selected' : '' }}>Belalang</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::KUTU }}" {{ old('serangan_hama', $lahanSelected->serangan_hama) == \App\Enums\SeranganHama::KUTU->value ? 'selected' : '' }}>Kutu</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::ULAT }}">Ulat</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::BELALANG }}">Belalang</option>
|
||||
<option value="{{ \App\Enums\SeranganHama::KUTU }}">Kutu</option>
|
||||
</select>
|
||||
@error('serangan_hama')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label class="form-label">Penyakit Tanaman</label>
|
||||
<select id="penyakit_tanaman" name="penyakit_tanaman" class="form-select @error('penyakit_tanaman') is-invalid @enderror">
|
||||
<select id="tnm_penyakit_tanaman" name="penyakit_tanaman">
|
||||
<option value="">Pilih Penyakit</option>
|
||||
<option value="{{ \App\Enums\PenyakitTanaman::BUSUK_BUAH }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::BUSUK_BUAH->value ? 'selected' : '' }}>Busuk Buah</option>
|
||||
<option value="{{ \App\Enums\PenyakitTanaman::DAUN_MENGUNING }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::DAUN_MENGUNING->value ? 'selected' : '' }}>Daun Menguning</option>
|
||||
@@ -76,7 +75,7 @@
|
||||
</div>
|
||||
<div class="col-md-6 form-control-validation">
|
||||
<label class="form-label">Keparahan Serangan</label>
|
||||
<select id="keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
||||
<select id="tnm_keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
||||
<option value="">Pilih Keparahan Serangan</option>
|
||||
<option value="{{ \App\Enums\KeparahanSerangan::RINGAN }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::RINGAN->value ? 'selected' : '' }}>Ringan</option>
|
||||
<option value="{{ \App\Enums\KeparahanSerangan::SEDANG }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::SEDANG->value ? 'selected' : '' }}>Sedang</option>
|
||||
@@ -110,15 +109,21 @@
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
console.log(response);
|
||||
$('#tnm_kondisi_tanaman,#tnm_serangan_hama,#tnm_penyakit_tanaman,#tnm_keparahan_serangan')
|
||||
.val(null)
|
||||
.trigger('change');
|
||||
|
||||
$('#komoditas').val(response.data.komoditas.nama);
|
||||
$('#jenis_komoditas').val(response.data.jenis_komoditas.nama);
|
||||
$('#varietas').val(response.data.varietas.nama);
|
||||
$('#latitude').val(response.data.latitude);
|
||||
$('#longitude').val(response.data.longitude);
|
||||
$('#kondisi').val(response.data.kondisi_tanaman);
|
||||
$('#serangan_hama').val(response.data.serangan_hama);
|
||||
$('#penyakit_tanaman').val(response.data.penyakit_tanaman);
|
||||
$('#keparahan_serangan').val(response.data.keparahan_serangan);
|
||||
|
||||
$('#tnm_kondisi_tanaman').val(response.data.kondisi_tanaman).trigger('change');
|
||||
$('#tnm_serangan_hama').val(response.data.serangan_hama).trigger('change');
|
||||
$('#tnm_penyakit_tanaman').val(response.data.penyakit_tanaman).trigger('change');
|
||||
$('#tnm_keparahan_serangan').val(response.data.keparahan_serangan).trigger('change');
|
||||
|
||||
$('#editTanamanFormId').val(response.data.id);
|
||||
|
||||
$('#tanamanModal').modal('show');
|
||||
@@ -129,6 +134,13 @@
|
||||
});
|
||||
});
|
||||
|
||||
console.log(document.querySelectorAll('#serangan_hama'));
|
||||
|
||||
$('#tnm_kondisi_tanaman,#tnm_serangan_hama,#tnm_penyakit_tanaman,#tnm_keparahan_serangan').select2({
|
||||
dropdownParent: $('#tanamanModal'),
|
||||
width: '100%'
|
||||
});
|
||||
|
||||
$('#editTanamanForm').validate({
|
||||
rules: {
|
||||
latitude: {
|
||||
@@ -150,7 +162,6 @@
|
||||
},
|
||||
submitHandler: function(form) {
|
||||
var url = form.action.replace(':id', $('#editTanamanFormId').val());
|
||||
console.log(url);
|
||||
|
||||
$.ajax({
|
||||
url: url,
|
||||
@@ -177,6 +188,35 @@
|
||||
currentRow.find('.td-kondisi').html('<span class="badge bg-label-dark">Mati</span>');
|
||||
}
|
||||
}
|
||||
if (response.data.serangan_hama) {
|
||||
if (response.data.serangan_hama === 'ulat') {
|
||||
currentRow.find('.td-hama').html('<span class="badge bg-label-success">Ulat</span>');
|
||||
} else if (response.data.serangan_hama === 'belalang') {
|
||||
currentRow.find('.td-hama').html('<span class="badge bg-label-danger">Belalang</span>');
|
||||
} else if (response.data.serangan_hama === 'kutu') {
|
||||
currentRow.find('.td-hama').html('<span class="badge bg-label-warning">Kutu</span>');
|
||||
}
|
||||
}
|
||||
if (response.data.penyakit_tanaman) {
|
||||
if (response.data.penyakit_tanaman === 'busuk_buah') {
|
||||
currentRow.find('.td-penyakit').html('<span class="badge bg-label-success">Busuk Buah</span>');
|
||||
} else if (response.data.penyakit_tanaman === 'daun_menguning') {
|
||||
currentRow.find('.td-penyakit').html('<span class="badge bg-label-danger">Daun Menguning</span>');
|
||||
} else if (response.data.penyakit_tanaman === 'daun_bercak') {
|
||||
currentRow.find('.td-penyakit').html('<span class="badge bg-label-warning">Daun Bercak</span>');
|
||||
} else if (response.data.penyakit_tanaman === 'tanaman_layu') {
|
||||
currentRow.find('.td-penyakit').html('<span class="badge bg-label-info">Tanaman Layu</span>');
|
||||
}
|
||||
}
|
||||
if (response.data.keparahan_serangan) {
|
||||
if (response.data.keparahan_serangan === 'baik') {
|
||||
currentRow.find('.td-keparahan').html('<span class="badge bg-label-info">Ringan</span>');
|
||||
} else if (response.data.keparahan_serangan === 'sedang') {
|
||||
currentRow.find('.td-keparahan').html('<span class="badge bg-label-warning">Sedang</span>');
|
||||
} else if (response.data.keparahan_serangan === 'buruk') {
|
||||
currentRow.find('.td-keparahan').html('<span class="badge bg-label-danger">Berat</span>');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,284 @@
|
||||
@extends('layout.main')
|
||||
|
||||
@section('content')
|
||||
<div class="container-xxl flex-grow-1 container-p-y">
|
||||
@if (session('success'))
|
||||
<div class="alert alert-success">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="alert alert-danger">
|
||||
<ul class="mb-0">
|
||||
@foreach ($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
@include('produktivitas.petani.header', ['petani' => $petani])
|
||||
|
||||
<div class="row g-6">
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div class="card card-border-shadow-primary h-100">
|
||||
<div class="card-body">
|
||||
@php
|
||||
$segmen = 'Belum tersegmentasi';
|
||||
@endphp
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<h4 class="mb-0">{{ $petani->segmen() }} ({{ number_format($skor->skor_kesiapan_adopsi, 1, ',', '.') }})</h4>
|
||||
</div>
|
||||
<p class="mb-1 text-wrapped">{{ $petani->keteranganSegmen() }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8 col-sm-6">
|
||||
<div class="card card-border-shadow-primary h-100">
|
||||
<div class="card-body d-flex align-items-end">
|
||||
<div class="w-100">
|
||||
<div class="row gy-3">
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_d2_sistem_praktik_budidaya, 1, ',', '.') }}</h5></h5>
|
||||
<small>Sistem & Praktik Budidaya</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_d4_sosial_ekonomi, 1, ',', '.') }}</h5>
|
||||
<small>Sosial Ekonomi Rumah Tangga</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_d6_rantai_nilai_akses_pasar, 1, ',', '.') }}</h5>
|
||||
<small>Rantai Nilai & Akses Pasar</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-6 pt-4">
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div class="card card-border-shadow-primary">
|
||||
<div class="card-body d-flex align-items-end">
|
||||
<div class="w-100">
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 1, ',', '.') }}</h5></h5>
|
||||
<small>Motivasi & Kapasitas Adopsi</small><br/>
|
||||
<small class="text-body-secondary">Kemauan dan kapasitas kognitif untuk mengadopsi perubahan</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 1, ',', '.') }}</h5></h5>
|
||||
<small>Kondisi Ekonomi Rumah Tangga</small><br/>
|
||||
<small class="text-body-secondary">Kapasitas material petani untuk berinvestasi dalam perubahan</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_3_d2_praktik_budidaya_gap, 1, ',', '.') }}</h5></h5>
|
||||
<small>Praktik Budidaya & Skor GAP</small><br/>
|
||||
<small class="text-body-secondary">Kualitas praktik budidaya aktual petani dibandingkan praktik terbaik yang dituju</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_4_d4_k4_keterlibatan_kelembagaan, 1, ',', '.') }}</h5></h5>
|
||||
<small>Keterlibatan Kelembagaan</small><br/>
|
||||
<small class="text-body-secondary">Kapasitas sosial petani untuk berubah</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, 1, ',', '.') }}</h5></h5>
|
||||
<small>Akses & Kebebasan Keuangan</small><br/>
|
||||
<small class="text-body-secondary">Akses yang memperluas ruang gerak investasi dan membatasi pengambilan keputusan</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gy-3">
|
||||
<div class="col-12">
|
||||
<div class="card-info">
|
||||
<h5 class="mb-0">{{ number_format($skor->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar, 1, ',', '.') }}</h5></h5>
|
||||
<small>Posisi & Akses Pasar</small><br/>
|
||||
<small class="text-body-secondary">Posisi petani dalam rantai nilai dan akses pasar</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8 col-sm-6">
|
||||
<div class="card card-border-shadow-primary">
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-borderless">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Variabel</th>
|
||||
<th scope="col" class="w-10 text-end">Skor</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kemampuan mencoba praktik baru</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k3_1_praktik_baru, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pemahaman kaitan mutu dan harga</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k3_4_pemahaman_mutu_harga, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Keberadaan role model</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k3_5_role_model, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kemauan terlibat dalam program</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k3_6_kemampuan_keterlibatan_program, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Orientasi jangka panjang</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k3_7_orientasi_jangka_panjang, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Stabilitas penghasilan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k2_5_stabilitas_penghasilan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kemampuan menabung</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k2_8_kemampuan_menabung, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Persepsi kecukupan penghasilan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k2_9_kecukupan_penghasilan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Rasio biaya produksi terhadap pendapatan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kejelasan hak kelola lahan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k2_11_hak_kelola_lahan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Praktik pemangkasan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_3_praktik_pemangkasan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Praktik pemupukan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_4_praktik_pemupukan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pengendalian OPT</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_5_pengendalian_opt, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Sanitasi kebun</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_6_sanitasi_kebun, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pengelolaan gulma</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_6b_pengelolaan_gulma, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pengelolaan air & irigasi</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_7_penglolaan_air_irigasi, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Praktik konservasi tanah</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k2_8_praktik_konservasi_tanah, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Penentuan kematangan saat panen</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k3_1_penentuan_pematangan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Sortasi awal dan pemisahan kualitas</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d2_k3_5_sortasi_awal_pemisahan_kualitas, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Keaktifan menghadiri pertemuan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k4_2_keaktifan_pertemuan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Peran dalam kelompok</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k4_3_peran_dalam_kelompok, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Manfaat yang dirasakan dari kelompok</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k4_4_manfaat_dirasakan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kepemilikan rekening bank</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_1_kepemilikan_rekening, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pengalaman kredit formal</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_2_pengalaman_kredit_formal, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kepemilikan aset produktif</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kepemilikan aset tidak produktif</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_kepemilikan_aset_tidak_produktif, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Akses program bantuan</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_5_akses_program_bantuan, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Keberadaan hutang terkait panen</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k6_3_keberadaan_hutang_terkait_panen, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Praktik ijon</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k6_5a_praktik_ijon, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kebebasan memilih pembeli</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d4_k6_5b_kebebasan_memilih_pembeli, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Pengalaman menjual ke saluran yang berbeda</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Kesadaran dan akses pasar premium</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d6_k4_1_kesadaran_akses_pasar_premium, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-wrapped">Hambatan mutu sebagai penghalang pasar</td>
|
||||
<td class="text-end">{{ number_format($skor->skor_d6_k5_1_hambatan_mutu, 1, ',', '.') }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+5
-1
@@ -16,7 +16,7 @@ Route::get('/', function() {
|
||||
$userRole = auth()->check() ? (auth()->user()->role instanceof \App\Enums\Role ? auth()->user()->role->value : auth()->user()->role) : null;
|
||||
|
||||
if ($userRole == 'fasilitator') {
|
||||
return redirect()->route('dashboard.survey');
|
||||
return redirect()->route('dashboard.survey-petani');
|
||||
}
|
||||
return redirect()->route('dashboard.produktivitas');
|
||||
})->name('home');
|
||||
@@ -24,6 +24,8 @@ Route::get('/', function() {
|
||||
Route::middleware('auth')
|
||||
->group(function () {
|
||||
|
||||
Route::get('/dashboard/survey-petani', [App\Http\Controllers\Web\Dashboard\SurveyPetaniController::class, 'index'])->name('dashboard.survey-petani');
|
||||
|
||||
Route::get('/tekad', function () {
|
||||
return view('dashboard.dashboard');
|
||||
})->name('dashboard.survey');
|
||||
@@ -216,4 +218,6 @@ Route::middleware('auth')
|
||||
|
||||
Route::resource('petani.sosial-ekonomi', App\Http\Controllers\Web\Produktivitas\SosialEkonomiController::class)->whereNumber('petani');
|
||||
Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani');
|
||||
|
||||
Route::resource('petani.skor', App\Http\Controllers\Web\Produktivitas\SkorPetaniController::class)->only(['index']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user