feat: slicing laporan capaian bps rw per wilayah
parent
913fcc0643
commit
01fd84c273
|
|
@ -0,0 +1,264 @@
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace BpsRwApp.Controllers
|
||||||
|
{
|
||||||
|
public class LaporanCapaianWilayahController : AppControllerBase
|
||||||
|
{
|
||||||
|
public IActionResult Index()
|
||||||
|
{
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public IActionResult GetData(string bulanAwal, string bulanAkhir, string wilayah)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Default date range
|
||||||
|
DateTime startDate = DateTime.Now.AddMonths(-2);
|
||||||
|
DateTime endDate = DateTime.Now;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(bulanAwal))
|
||||||
|
{
|
||||||
|
if (!DateTime.TryParse(bulanAwal + "-01", out startDate))
|
||||||
|
{
|
||||||
|
startDate = DateTime.Now.AddMonths(-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(bulanAkhir))
|
||||||
|
{
|
||||||
|
if (!DateTime.TryParse(bulanAkhir + "-01", out endDate))
|
||||||
|
{
|
||||||
|
endDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var periode = $"{startDate.ToString("MMMM", new System.Globalization.CultureInfo("id-ID"))} - {endDate.ToString("MMMM yyyy", new System.Globalization.CultureInfo("id-ID"))}";
|
||||||
|
|
||||||
|
// Labels bulan
|
||||||
|
var monthLabels = new List<string>();
|
||||||
|
var currentMonth = startDate;
|
||||||
|
while (currentMonth <= endDate)
|
||||||
|
{
|
||||||
|
monthLabels.Add(currentMonth.ToString("MMMM yyyy", new System.Globalization.CultureInfo("id-ID")));
|
||||||
|
currentMonth = currentMonth.AddMonths(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
string locationText;
|
||||||
|
if (!string.IsNullOrEmpty(wilayah))
|
||||||
|
{
|
||||||
|
locationText = $"Kota Administrasi {wilayah}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
locationText = "DKI Jakarta";
|
||||||
|
}
|
||||||
|
|
||||||
|
var random = new Random();
|
||||||
|
|
||||||
|
var data = new
|
||||||
|
{
|
||||||
|
bulanAwal = startDate.ToString("yyyy-MM"),
|
||||||
|
bulanAkhir = endDate.ToString("yyyy-MM"),
|
||||||
|
periode,
|
||||||
|
countMonthLabels = monthLabels.Count,
|
||||||
|
wilayah = wilayah ?? "",
|
||||||
|
locationText,
|
||||||
|
|
||||||
|
// Tingkat Kepatuhan PJLP
|
||||||
|
tingkatKepatuhanPjlp = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
ceklis = random.Next(40, 80),
|
||||||
|
belumCeklis = random.Next(10, 30)
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.ceklis,
|
||||||
|
x.belumCeklis,
|
||||||
|
total = x.ceklis + x.belumCeklis,
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// Status Validasi SATPEL
|
||||||
|
statusValidasiSatpel = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
sudah = random.Next(300, 600),
|
||||||
|
belum = random.Next(0, 150)
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.sudah,
|
||||||
|
x.belum,
|
||||||
|
total = x.sudah + x.belum,
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// Status Validasi SUDIN
|
||||||
|
statusValidasiSudin = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
sudah = random.Next(300, 600),
|
||||||
|
belum = random.Next(0, 100)
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.sudah,
|
||||||
|
x.belum,
|
||||||
|
total = x.sudah + x.belum,
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// Capaian Rumah Memilah
|
||||||
|
capaianRumahMemilah = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
konsisten = random.Next(2000, 5000),
|
||||||
|
tidakKonsisten = random.Next(500, 1500),
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.konsisten,
|
||||||
|
x.tidakKonsisten,
|
||||||
|
total = x.konsisten + x.tidakKonsisten,
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// Volume Timbulan Sampah
|
||||||
|
volumeTimbulanSampah = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
terurai = Math.Round(random.NextDouble() * 0.3 + 0.1, 2),
|
||||||
|
tidakTerurai = Math.Round(random.NextDouble() * 0.2 + 0.05, 2),
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.terurai,
|
||||||
|
x.tidakTerurai,
|
||||||
|
total = Math.Round(x.terurai + x.tidakTerurai, 2)
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// Realisasi Terhadap Target
|
||||||
|
realisasiTarget = monthLabels.Select(m => new
|
||||||
|
{
|
||||||
|
bulan = m,
|
||||||
|
rmKonsisten = random.Next(3000, 6000),
|
||||||
|
rmTidakKonsisten = random.Next(-4000, -1000),
|
||||||
|
target = random.Next(6000, 8000)
|
||||||
|
}).Select(x => new
|
||||||
|
{
|
||||||
|
x.bulan,
|
||||||
|
x.rmKonsisten,
|
||||||
|
x.rmTidakKonsisten,
|
||||||
|
x.target,
|
||||||
|
}).ToList(),
|
||||||
|
|
||||||
|
// volume sampah
|
||||||
|
volumeSampahInfo = new
|
||||||
|
{
|
||||||
|
jumlahRumah = random.Next(5000, 6000),
|
||||||
|
periode,
|
||||||
|
totalVolume = Math.Round(random.NextDouble() * 10000 + 20000, 2).ToString("N2")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Json(data);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return StatusCode(500, new { error = ex.Message, stackTrace = ex.StackTrace });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public IActionResult GetDataKepatuhanPeriode(string bulan, string wilayah)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// default bulan
|
||||||
|
DateTime selectedDate = DateTime.Now;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(bulan))
|
||||||
|
{
|
||||||
|
if (!DateTime.TryParse(bulan + "-01", out selectedDate))
|
||||||
|
{
|
||||||
|
selectedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var periode = selectedDate.ToString("MMMM yyyy", new System.Globalization.CultureInfo("id-ID"));
|
||||||
|
|
||||||
|
// Data kecamatan
|
||||||
|
var kecamatanData = new Dictionary<string, string[]>
|
||||||
|
{
|
||||||
|
{ "Jakarta Pusat", new[] { "Gambir", "Tanah Abang", "Menteng", "Senen", "Cempaka Putih", "Johar Baru", "Kemayoran", "Sawah Besar" } },
|
||||||
|
{ "Jakarta Utara", new[] { "Penjaringan", "Pademangan", "Tanjung Priok", "Koja", "Kelapa Gading", "Cilincing" } },
|
||||||
|
{ "Jakarta Barat", new[] { "Cengkareng", "Grogol Petamburan", "Taman Sari", "Tambora", "Kebon Jeruk", "Kalideres", "Palmerah", "Kembangan" } },
|
||||||
|
{ "Jakarta Selatan", new[] { "Kebayoran Baru", "Kebayoran Lama", "Pesanggrahan", "Cilandak", "Pasar Minggu", "Jagakarsa", "Mampang Prapatan", "Pancoran", "Tebet", "Setiabudi" } },
|
||||||
|
{ "Jakarta Timur", new[] { "Matraman", "Pulo Gadung", "Jatinegara", "Kramat Jati", "Pasar Rebo", "Cakung", "Duren Sawit", "Makasar", "Ciracas", "Cipayung" } },
|
||||||
|
{ "Kepulauan Seribu", new[] { "Kepulauan Seribu Utara", "Kepulauan Seribu Selatan" } }
|
||||||
|
};
|
||||||
|
|
||||||
|
string[] kecamatanLabels;
|
||||||
|
string locationText;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(wilayah) && kecamatanData.ContainsKey(wilayah))
|
||||||
|
{
|
||||||
|
kecamatanLabels = kecamatanData[wilayah];
|
||||||
|
locationText = $"Kota Administrasi {wilayah}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kecamatanLabels = kecamatanData["Jakarta Barat"];
|
||||||
|
locationText = "DKI Jakarta";
|
||||||
|
}
|
||||||
|
|
||||||
|
var random = new Random();
|
||||||
|
|
||||||
|
// Tingkat Kepatuhan PJLP Periode
|
||||||
|
var tingkatKepatuhanPeriode = kecamatanLabels.Select(w => new
|
||||||
|
{
|
||||||
|
wilayah = w,
|
||||||
|
ceklis = random.Next(40, 60),
|
||||||
|
belumCeklis = random.Next(40, 60),
|
||||||
|
total = random.Next(90, 100)
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
// Total Pjlp
|
||||||
|
var totalPjlp = tingkatKepatuhanPeriode.Sum(x => x.total);
|
||||||
|
var totalSudahCeklis = tingkatKepatuhanPeriode.Sum(x => x.ceklis);
|
||||||
|
var totalBelumCeklis = tingkatKepatuhanPeriode.Sum(x => x.belumCeklis);
|
||||||
|
var persentaseSudah = totalPjlp > 0 ? Math.Round((double)totalSudahCeklis / totalPjlp * 100, 0) : 0;
|
||||||
|
var persentaseBelum = totalPjlp > 0 ? Math.Round((double)totalBelumCeklis / totalPjlp * 100, 0) : 0;
|
||||||
|
|
||||||
|
var data = new
|
||||||
|
{
|
||||||
|
bulan = selectedDate.ToString("yyyy-MM"),
|
||||||
|
periode,
|
||||||
|
wilayah = wilayah ?? "",
|
||||||
|
locationText,
|
||||||
|
|
||||||
|
// Tingkat Kepatuhan PJLP Periode
|
||||||
|
tingkatKepatuhanPeriode,
|
||||||
|
|
||||||
|
// Data cards PJLP
|
||||||
|
pjlpStats = new
|
||||||
|
{
|
||||||
|
total = totalPjlp,
|
||||||
|
sudahCeklis = totalSudahCeklis,
|
||||||
|
belumCeklis = totalBelumCeklis,
|
||||||
|
persentaseSudah = (int)persentaseSudah,
|
||||||
|
persentaseBelum = (int)persentaseBelum
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Json(data);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return StatusCode(500, new { error = ex.Message, stackTrace = ex.StackTrace });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -91,7 +91,11 @@
|
||||||
<script>
|
<script>
|
||||||
Chart.register(ChartDataLabels);
|
Chart.register(ChartDataLabels);
|
||||||
|
|
||||||
Chart.defaults.animation = { duration: 1500, easing: 'easeOutQuart' };
|
Chart.defaults.animation = { duration: 500, easing: 'easeOutQuart' };
|
||||||
|
Chart.defaults.animations = {
|
||||||
|
numbers: { duration: 500, easing: 'easeOutQuart' },
|
||||||
|
colors: { duration: 500, easing: 'easeOutQuart' }
|
||||||
|
};
|
||||||
|
|
||||||
let chartInstances = {
|
let chartInstances = {
|
||||||
pieTotal: null,
|
pieTotal: null,
|
||||||
|
|
@ -168,6 +172,11 @@
|
||||||
options: {
|
options: {
|
||||||
responsive: true,
|
responsive: true,
|
||||||
maintainAspectRatio: false,
|
maintainAspectRatio: false,
|
||||||
|
layout: {
|
||||||
|
padding: {
|
||||||
|
top: 20
|
||||||
|
}
|
||||||
|
},
|
||||||
scales: { y: { beginAtZero: true } },
|
scales: { y: { beginAtZero: true } },
|
||||||
plugins: {
|
plugins: {
|
||||||
legend: { position: 'bottom', labels: { usePointStyle: true, pointStyle: "circle" } },
|
legend: { position: 'bottom', labels: { usePointStyle: true, pointStyle: "circle" } },
|
||||||
|
|
@ -317,6 +326,11 @@
|
||||||
options: {
|
options: {
|
||||||
responsive: true,
|
responsive: true,
|
||||||
maintainAspectRatio: false,
|
maintainAspectRatio: false,
|
||||||
|
layout: {
|
||||||
|
padding: {
|
||||||
|
top: 20
|
||||||
|
}
|
||||||
|
},
|
||||||
scales: { y: { beginAtZero: true } },
|
scales: { y: { beginAtZero: true } },
|
||||||
plugins: {
|
plugins: {
|
||||||
legend: { position: 'bottom', labels: { usePointStyle: true, pointStyle: "circle" } },
|
legend: { position: 'bottom', labels: { usePointStyle: true, pointStyle: "circle" } },
|
||||||
|
|
|
||||||
|
|
@ -93,10 +93,10 @@
|
||||||
<script>
|
<script>
|
||||||
Chart.register(ChartDataLabels);
|
Chart.register(ChartDataLabels);
|
||||||
|
|
||||||
Chart.defaults.animation = { duration: 1500, easing: 'easeOutQuart' };
|
Chart.defaults.animation = { duration: 500, easing: 'easeOutQuart' };
|
||||||
Chart.defaults.animations = {
|
Chart.defaults.animations = {
|
||||||
numbers: { duration: 1500, easing: 'easeOutQuart' },
|
numbers: { duration: 500, easing: 'easeOutQuart' },
|
||||||
colors: { duration: 1500, easing: 'easeOutQuart' }
|
colors: { duration: 500, easing: 'easeOutQuart' }
|
||||||
};
|
};
|
||||||
|
|
||||||
const chartInstances = {
|
const chartInstances = {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue