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(); 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 { { "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 }); } } } }