Merge branch 'main' of https://github.com/J-oi-0nlyB/web-dinda
This commit is contained in:
commit
69f9a842bf
|
@ -19,49 +19,76 @@ class DashboardController extends Controller
|
||||||
// Menampilkan dashboard pimpinan.
|
// Menampilkan dashboard pimpinan.
|
||||||
public function pimpinan(Request $request)
|
public function pimpinan(Request $request)
|
||||||
{
|
{
|
||||||
$currentYear = now()->year;
|
[$start, $end] = $this->getDateRange($request);
|
||||||
$start = $request->get('start_date')
|
$kloters = $this->getAllKloters();
|
||||||
? Carbon::parse($request->get('start_date'))
|
$kloterData = $this->getKloterChartData($request->get('kloter'), $kloters);
|
||||||
: Carbon::create($currentYear, 1, 1)->startOfDay();
|
$grafikBulanan = $this->getMonthlyChartData($start, $end);
|
||||||
$end = $request->get('end_date')
|
$keuangan = $this->getTotalPendapatanPengeluaran($start, $end);
|
||||||
? Carbon::parse($request->get('end_date'))
|
$bulanAktif = $start->translatedFormat('d M Y') . ' - ' . $end->translatedFormat('d M Y');
|
||||||
: Carbon::create($currentYear, 12, 31)->endOfDay();
|
$listKloter = HistoryGajiKloter::orderBy('id', 'asc')->get();
|
||||||
|
|
||||||
$kloters = HistoryGajiKloter::whereNotNull('tanggal_awal')
|
return view('dashboard.pimpinan', array_merge(
|
||||||
|
$grafikBulanan,
|
||||||
|
['keuangan' => $keuangan],
|
||||||
|
['bulanAktif' => $bulanAktif],
|
||||||
|
['kloters' => $kloters],
|
||||||
|
['listKloter' => $listKloter],
|
||||||
|
$kloterData,
|
||||||
|
[
|
||||||
|
'startDate' => $start->toDateString(),
|
||||||
|
'endDate' => $end->toDateString()
|
||||||
|
]
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// fungsi untuk mendapatkan rentang tanggal awal dan akhir
|
||||||
|
protected function getDateRange(Request $request)
|
||||||
|
{
|
||||||
|
$bulan = $request->get('bulan') ?? now()->month;
|
||||||
|
$tahun = $request->get('tahun') ?? now()->year;
|
||||||
|
|
||||||
|
// Ambil transaksi terakhir di bulan dan tahun yang dipilih
|
||||||
|
$lastTransactionDate = Transaksi::whereYear('waktu_transaksi', $tahun)
|
||||||
|
->whereMonth('waktu_transaksi', $bulan)
|
||||||
|
->orderBy('waktu_transaksi', 'desc')
|
||||||
|
->value('waktu_transaksi');
|
||||||
|
|
||||||
|
if ($lastTransactionDate) {
|
||||||
|
$end = Carbon::parse($lastTransactionDate)->endOfDay();
|
||||||
|
$start = $end->copy()->subMonth()->startOfDay();
|
||||||
|
} else {
|
||||||
|
// Jika tidak ada transaksi, gunakan awal dan akhir bulan
|
||||||
|
$start = Carbon::create($tahun, $bulan, 1)->startOfMonth();
|
||||||
|
$end = Carbon::create($tahun, $bulan, 1)->endOfMonth();
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$start, $end];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// fungsi untuk mendapatkan semua kloter yang memiliki tanggal awal dan akhir
|
||||||
|
protected function getAllKloters()
|
||||||
|
{
|
||||||
|
return HistoryGajiKloter::whereNotNull('tanggal_awal')
|
||||||
->whereNotNull('tanggal_akhir')
|
->whereNotNull('tanggal_akhir')
|
||||||
->orderBy('id', 'desc')
|
->orderBy('id', 'desc')
|
||||||
->get();
|
->get();
|
||||||
|
}
|
||||||
|
|
||||||
$kloterId = $request->get('kloter');
|
// fungsi untuk mendapatkan data chart berdasarkan kloter
|
||||||
|
protected function getKloterChartData($kloterId, $kloters)
|
||||||
|
{
|
||||||
$labelsKloter = [];
|
$labelsKloter = [];
|
||||||
$pendapatanKloter = [];
|
$pendapatanKloter = [];
|
||||||
$pengeluaranKloter = [];
|
$pengeluaranKloter = [];
|
||||||
|
|
||||||
if ($kloterId) {
|
$kloterList = $kloterId
|
||||||
$selectedKloter = HistoryGajiKloter::find($kloterId);
|
? [$kloters->where('id', $kloterId)->first()]
|
||||||
|
: $kloters;
|
||||||
|
|
||||||
if ($selectedKloter) {
|
foreach ($kloterList as $kloter) {
|
||||||
$labelsKloter[] = $selectedKloter->nama ?? 'Kloter ' . $selectedKloter->id;
|
if (!$kloter) continue;
|
||||||
|
|
||||||
$pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
|
||||||
$selectedKloter->tanggal_awal,
|
|
||||||
$selectedKloter->tanggal_akhir
|
|
||||||
])
|
|
||||||
->whereNotNull('pemasukan_id')
|
|
||||||
->sum('jumlahRp');
|
|
||||||
|
|
||||||
$pengeluaranKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
|
||||||
$selectedKloter->tanggal_awal,
|
|
||||||
$selectedKloter->tanggal_akhir
|
|
||||||
])
|
|
||||||
->where(function ($q) {
|
|
||||||
$q->whereNotNull('pengeluaran_id')
|
|
||||||
->orWhereNotNull('history_gaji_kloter_id');
|
|
||||||
})
|
|
||||||
->sum('jumlahRp');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach ($kloters as $kloter) {
|
|
||||||
$labelsKloter[] = $kloter->nama ?? 'Kloter ' . $kloter->id;
|
$labelsKloter[] = $kloter->nama ?? 'Kloter ' . $kloter->id;
|
||||||
|
|
||||||
$pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
$pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
||||||
|
@ -81,8 +108,13 @@ public function pimpinan(Request $request)
|
||||||
})
|
})
|
||||||
->sum('jumlahRp');
|
->sum('jumlahRp');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return compact('labelsKloter', 'pendapatanKloter', 'pengeluaranKloter');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fungsi untuk mendapatkan data chart bulanan
|
||||||
|
protected function getMonthlyChartData($start, $end)
|
||||||
|
{
|
||||||
$dates = CarbonPeriod::create($start, $end);
|
$dates = CarbonPeriod::create($start, $end);
|
||||||
$labels = [];
|
$labels = [];
|
||||||
$pendapatanBulanan = [];
|
$pendapatanBulanan = [];
|
||||||
|
@ -103,8 +135,12 @@ public function pimpinan(Request $request)
|
||||||
->sum('jumlahRp');
|
->sum('jumlahRp');
|
||||||
}
|
}
|
||||||
|
|
||||||
$bulanAktif = $start->translatedFormat('d M Y') . ' - ' . $end->translatedFormat('d M Y');
|
return compact('labels', 'pendapatanBulanan', 'pengeluaranBulanan');
|
||||||
|
}
|
||||||
|
|
||||||
|
// fungsi untuk mendapatkan total pendapatan dan pengeluaran dalam rentang tanggal
|
||||||
|
protected function getTotalPendapatanPengeluaran($start, $end)
|
||||||
|
{
|
||||||
$totalPendapatan = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
|
$totalPendapatan = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
|
||||||
->whereNotNull('pemasukan_id')
|
->whereNotNull('pemasukan_id')
|
||||||
->sum('jumlahRp');
|
->sum('jumlahRp');
|
||||||
|
@ -116,36 +152,76 @@ public function pimpinan(Request $request)
|
||||||
})
|
})
|
||||||
->sum('jumlahRp');
|
->sum('jumlahRp');
|
||||||
|
|
||||||
$keuangan = [
|
return [
|
||||||
'pendapatan' => $totalPendapatan,
|
'pendapatan' => $totalPendapatan,
|
||||||
'pengeluaran' => $totalPengeluaran
|
'pengeluaran' => $totalPengeluaran
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
|
||||||
* Mengambil seluruh data dari tabel HistoryGajiKloter dan mengurutkannya berdasarkan kolom 'id' secara menurun (desc).
|
|
||||||
*
|
|
||||||
* Fungsi kode ini adalah untuk mendapatkan daftar kloter gaji terbaru terlebih dahulu,
|
|
||||||
* sehingga data yang paling baru akan berada di urutan teratas pada hasil query.
|
|
||||||
*
|
|
||||||
* @var \Illuminate\Database\Eloquent\Collection $listKloter Koleksi data kloter gaji yang telah diurutkan.
|
|
||||||
*/
|
|
||||||
$listKloter = HistoryGajiKloter::orderBy('id', 'asc')->get();
|
|
||||||
// $listKloter = HistoryGajiKloter::orderBy('id', 'desc')->get();
|
|
||||||
|
|
||||||
return view('dashboard.pimpinan', compact(
|
|
||||||
'labels',
|
|
||||||
'pendapatanBulanan',
|
|
||||||
'pengeluaranBulanan',
|
|
||||||
'keuangan',
|
|
||||||
'bulanAktif',
|
|
||||||
'kloters',
|
|
||||||
'listKloter',
|
|
||||||
'labelsKloter',
|
|
||||||
'pendapatanKloter',
|
|
||||||
'pengeluaranKloter'
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function ajaxData(Request $request)
|
||||||
|
{
|
||||||
|
$start = Carbon::parse($request->get('start_date'))->startOfDay();
|
||||||
|
$end = Carbon::parse($request->get('end_date'))->endOfDay();
|
||||||
|
|
||||||
|
$kloterId = $request->get('kloter_id');
|
||||||
|
$labelsKloter = [];
|
||||||
|
$pendapatanKloter = [];
|
||||||
|
$pengeluaranKloter = [];
|
||||||
|
|
||||||
|
if ($kloterId) {
|
||||||
|
$selectedKloter = HistoryGajiKloter::find($kloterId);
|
||||||
|
if ($selectedKloter) {
|
||||||
|
$labelsKloter[] = $selectedKloter->nama ?? 'Kloter ' . $selectedKloter->id;
|
||||||
|
|
||||||
|
$pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
||||||
|
$selectedKloter->tanggal_awal,
|
||||||
|
$selectedKloter->tanggal_akhir
|
||||||
|
])
|
||||||
|
->whereNotNull('pemasukan_id')
|
||||||
|
->sum('jumlahRp');
|
||||||
|
|
||||||
|
$pengeluaranKloter[] = Transaksi::whereBetween('waktu_transaksi', [
|
||||||
|
$selectedKloter->tanggal_awal,
|
||||||
|
$selectedKloter->tanggal_akhir
|
||||||
|
])
|
||||||
|
->where(function ($q) {
|
||||||
|
$q->whereNotNull('pengeluaran_id')
|
||||||
|
->orWhereNotNull('history_gaji_kloter_id');
|
||||||
|
})
|
||||||
|
->sum('jumlahRp');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$dates = CarbonPeriod::create($start, $end);
|
||||||
|
$labels = [];
|
||||||
|
$pendapatanBulanan = [];
|
||||||
|
$pengeluaranBulanan = [];
|
||||||
|
|
||||||
|
foreach ($dates as $date) {
|
||||||
|
$labels[] = $date->format('d M');
|
||||||
|
$pendapatanBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
|
||||||
|
->whereNotNull('pemasukan_id')
|
||||||
|
->sum('jumlahRp');
|
||||||
|
|
||||||
|
$pengeluaranBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
|
||||||
|
->where(function ($q) {
|
||||||
|
$q->whereNotNull('pengeluaran_id')
|
||||||
|
->orWhereNotNull('history_gaji_kloter_id');
|
||||||
|
})
|
||||||
|
->sum('jumlahRp');
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'labels' => $labels,
|
||||||
|
'pendapatanBulanan' => $pendapatanBulanan,
|
||||||
|
'pengeluaranBulanan' => $pengeluaranBulanan,
|
||||||
|
'labelsKloter' => $labelsKloter,
|
||||||
|
'pendapatanKloter' => $pendapatanKloter,
|
||||||
|
'pengeluaranKloter' => $pengeluaranKloter
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Menampilkan dashboard operator
|
// Menampilkan dashboard operator
|
||||||
public function operator()
|
public function operator()
|
||||||
{
|
{
|
||||||
|
@ -228,4 +304,5 @@ public function tambahUangMakanHarian()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
use Carbon\CarbonPeriod;
|
use Carbon\CarbonPeriod;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Barryvdh\DomPDF\Facade\Pdf;
|
||||||
|
|
||||||
use App\Models\Karyawan;
|
use App\Models\Karyawan;
|
||||||
use App\Models\Kloter;
|
use App\Models\Kloter;
|
||||||
|
@ -259,4 +260,87 @@ public function export($id)
|
||||||
|
|
||||||
return Excel::download(new GajiKloterExport($data, $tanggalUnik), 'detail_gaji_' . $kloter->nama_kloter . '.xlsx');
|
return Excel::download(new GajiKloterExport($data, $tanggalUnik), 'detail_gaji_' . $kloter->nama_kloter . '.xlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function unduhSlipGaji($id)
|
||||||
|
{
|
||||||
|
$kloter = Kloter::with(['presensis.karyawan', 'tonIkan'])->findOrFail($id);
|
||||||
|
|
||||||
|
$tanggalUnik = $kloter->presensis
|
||||||
|
->pluck('tanggal')
|
||||||
|
->unique()
|
||||||
|
->sort()
|
||||||
|
->map(fn ($tgl) => Carbon::parse($tgl))
|
||||||
|
->values();
|
||||||
|
|
||||||
|
$dataKaryawan = $kloter->presensis->groupBy('karyawan_id');
|
||||||
|
$banyakPekerja = $dataKaryawan->count();
|
||||||
|
|
||||||
|
$jumlahTon = $kloter->tonIkan->jumlah_ton ?? 0;
|
||||||
|
$hargaPerTon = $kloter->tonIkan->harga_ikan_per_ton ?? 1000000;
|
||||||
|
|
||||||
|
$gajiPerJamGlobal = $banyakPekerja > 0 ? ($jumlahTon * $hargaPerTon) / $banyakPekerja : 0;
|
||||||
|
|
||||||
|
$slipData = [];
|
||||||
|
|
||||||
|
foreach ($dataKaryawan as $karyawanId => $presensis) {
|
||||||
|
$karyawan = $presensis->first()->karyawan;
|
||||||
|
|
||||||
|
$jamPerTanggal = [];
|
||||||
|
$totalJam = 0;
|
||||||
|
|
||||||
|
foreach ($tanggalUnik as $tanggal) {
|
||||||
|
$presensi = $presensis->firstWhere('tanggal', $tanggal->toDateString());
|
||||||
|
$jamKerja = 0;
|
||||||
|
|
||||||
|
if ($presensi && $presensi->jam_masuk && $presensi->jam_pulang) {
|
||||||
|
$jamMasuk = strtotime($presensi->jam_masuk);
|
||||||
|
$jamPulang = strtotime($presensi->jam_pulang);
|
||||||
|
$jamKerja = ($jamPulang - $jamMasuk) / 3600;
|
||||||
|
}
|
||||||
|
|
||||||
|
$jamPerTanggal[$tanggal->format('d-M-Y')] = $jamKerja;
|
||||||
|
$totalJam += $jamKerja;
|
||||||
|
}
|
||||||
|
|
||||||
|
$gajiPerJam = $karyawan->jenis_kelamin === 'P'
|
||||||
|
? $gajiPerJamGlobal * 0.6
|
||||||
|
: $gajiPerJamGlobal;
|
||||||
|
|
||||||
|
$totalGaji = $gajiPerJam * $totalJam;
|
||||||
|
|
||||||
|
$slipData[] = [
|
||||||
|
'karyawan' => $karyawan,
|
||||||
|
'jam_per_tanggal' => $jamPerTanggal,
|
||||||
|
'total_jam' => $totalJam,
|
||||||
|
'gaji_per_jam' => round($gajiPerJam),
|
||||||
|
'total_gaji' => round($totalGaji),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$tanggalCetak = now()->translatedFormat('d F Y');
|
||||||
|
|
||||||
|
$pdf = Pdf::loadView('operator.gaji.slip', [
|
||||||
|
'kloter' => $kloter,
|
||||||
|
'tanggalCetak' => $tanggalCetak,
|
||||||
|
'slipData' => $slipData,
|
||||||
|
// bila template butuh periode:
|
||||||
|
'tanggalMulai' => Carbon::parse($kloter->tanggal_mulai),
|
||||||
|
'tanggalAkhir' => Carbon::parse($kloter->tanggal_akhir),
|
||||||
|
])
|
||||||
|
->setPaper('A4', 'portrait');
|
||||||
|
|
||||||
|
// Untuk mengunduh file PDF
|
||||||
|
return $pdf->download('slip_gaji_kloter_'.$kloter->id.'.pdf');
|
||||||
|
|
||||||
|
// Jika ingin menampilkan di browser, gunakan:
|
||||||
|
// return view('operator.gaji.slip', [
|
||||||
|
// 'kloter' => $kloter,
|
||||||
|
// 'tanggalCetak' => $tanggalCetak,
|
||||||
|
// 'slipData' => $slipData,
|
||||||
|
// // bila template butuh periode:
|
||||||
|
// 'tanggalMulai' => Carbon::parse($kloter->tanggal_mulai),
|
||||||
|
// 'tanggalAkhir' => Carbon::parse($kloter->tanggal_akhir),
|
||||||
|
// ]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,11 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
}).then((result) => {
|
}).then((result) => {
|
||||||
if (result.isConfirmed) {
|
if (result.isConfirmed) {
|
||||||
form.submit();
|
form.submit();
|
||||||
|
const kloterId = form.getAttribute('data-kloter-id');
|
||||||
|
const tombolUnduh = document.getElementById(`unduh-kloter-${kloterId}`);
|
||||||
|
if (tombolUnduh) {
|
||||||
|
tombolUnduh.style.display = 'inline-block';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -43,10 +43,10 @@
|
||||||
</h2>
|
</h2>
|
||||||
<form id="date-filter-form" class="flex items-center gap-2" style="padding-top: 10px">
|
<form id="date-filter-form" class="flex items-center gap-2" style="padding-top: 10px">
|
||||||
<input style="width: fit-content" type="date" name="start_date" id="start_date"
|
<input style="width: fit-content" type="date" name="start_date" id="start_date"
|
||||||
value="{{ request('start_date', now()->startOfMonth()->toDateString()) }}"
|
value="{{ request('start_date', $startDate) }}"
|
||||||
class="filter-info border px-2 py-1 rounded text-sm">
|
class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
<input style="width: fit-content" type="date" name="end_date" id="end_date"
|
<input style="width: fit-content" type="date" name="end_date" id="end_date"
|
||||||
value="{{ request('end_date', now()->endOfMonth()->toDateString()) }}"
|
value="{{ request('end_date', $endDate) }}"
|
||||||
class="filter-info border px-2 py-1 rounded text-sm">
|
class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -148,11 +148,12 @@ class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
});
|
});
|
||||||
|
|
||||||
// Grafik Kloter
|
// Grafik Kloter
|
||||||
|
let kloterChart;
|
||||||
const ctxKloter = document.getElementById('kloterChart').getContext('2d');
|
const ctxKloter = document.getElementById('kloterChart').getContext('2d');
|
||||||
const kloterChart = new Chart(ctxKloter, {
|
kloterChart = new Chart(ctxKloter, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: {!! json_encode(array_reverse($labelsKloter)) !!}, // diurut terbalik
|
labels: {!! json_encode(array_reverse($labelsKloter)) !!},
|
||||||
datasets: [
|
datasets: [
|
||||||
{
|
{
|
||||||
label: 'Pendapatan',
|
label: 'Pendapatan',
|
||||||
|
@ -191,7 +192,6 @@ class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
spanGaps: true,
|
spanGaps: true,
|
||||||
scales: {
|
scales: {
|
||||||
y: {
|
y: {
|
||||||
// type: 'logarithmic',
|
|
||||||
beginAtZero: true,
|
beginAtZero: true,
|
||||||
ticks: {
|
ticks: {
|
||||||
callback: function(value) {
|
callback: function(value) {
|
||||||
|
@ -207,24 +207,125 @@ class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
const form = document.getElementById('date-filter-form');
|
const form = document.getElementById('date-filter-form');
|
||||||
const startInput = document.getElementById('start_date');
|
const startInput = document.getElementById('start_date');
|
||||||
const endInput = document.getElementById('end_date');
|
const endInput = document.getElementById('end_date');
|
||||||
|
|
||||||
[startInput, endInput].forEach(input => {
|
[startInput, endInput].forEach(input => {
|
||||||
input.addEventListener('change', () => {
|
input.addEventListener('change', () => {
|
||||||
const startDate = startInput.value;
|
const startDate = startInput.value;
|
||||||
const endDate = endInput.value;
|
const endDate = endInput.value;
|
||||||
if (startDate && endDate && startDate <= endDate) {
|
if (startDate && endDate && startDate <= endDate) {
|
||||||
form.submit();
|
fetchChartData();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('kloterFilter').addEventListener('change', function () {
|
document.getElementById('kloterFilter').addEventListener('change', function () {
|
||||||
const selected = this.options[this.selectedIndex];
|
const selected = this.options[this.selectedIndex];
|
||||||
const start = selected.getAttribute('data-start');
|
const start = selected.getAttribute('data-start');
|
||||||
const end = selected.getAttribute('data-end');
|
const end = selected.getAttribute('data-end');
|
||||||
if (start && end) {
|
if (start && end) {
|
||||||
document.getElementById('start_date').value = start;
|
startInput.value = start;
|
||||||
document.getElementById('end_date').value = end;
|
endInput.value = end;
|
||||||
}
|
}
|
||||||
form.submit();
|
fetchChartData();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// AJAX Chart Update
|
||||||
|
const updateCharts = (data) => {
|
||||||
|
// Update Chart Tanggal
|
||||||
|
financeChart.data.labels = data.labels;
|
||||||
|
financeChart.data.datasets[0].data = data.pendapatanBulanan;
|
||||||
|
financeChart.data.datasets[1].data = data.pengeluaranBulanan;
|
||||||
|
financeChart.update();
|
||||||
|
|
||||||
|
// Update Chart Kloter
|
||||||
|
if (kloterChart) {
|
||||||
|
kloterChart.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
const kloterId = document.getElementById('kloterFilter').value;
|
||||||
|
const chartType = kloterId ? 'bar' : 'line';
|
||||||
|
|
||||||
|
// Buat ulang chart kloter dengan tipe sesuai filter
|
||||||
|
const ctxKloter = document.getElementById('kloterChart').getContext('2d');
|
||||||
|
kloterChart = new Chart(ctxKloter, {
|
||||||
|
type: chartType,
|
||||||
|
data: {
|
||||||
|
labels: data.labelsKloter.reverse(),
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label: 'Pendapatan',
|
||||||
|
data: data.pendapatanKloter.reverse(),
|
||||||
|
borderColor: 'blue',
|
||||||
|
backgroundColor: 'rgba(0, 123, 255, 0.6)',
|
||||||
|
fill: chartType === 'bar',
|
||||||
|
tension: 0.4,
|
||||||
|
pointRadius: 4,
|
||||||
|
pointBackgroundColor: 'blue',
|
||||||
|
borderWidth: 3,
|
||||||
|
showLine: chartType === 'line',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Pengeluaran',
|
||||||
|
data: data.pengeluaranKloter.reverse(),
|
||||||
|
borderColor: 'red',
|
||||||
|
backgroundColor: 'rgba(255, 99, 132, 0.6)',
|
||||||
|
fill: chartType === 'bar',
|
||||||
|
tension: 0.4,
|
||||||
|
pointRadius: 4,
|
||||||
|
pointBackgroundColor: 'red',
|
||||||
|
borderWidth: 4,
|
||||||
|
showLine: chartType === 'line',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
maintainAspectRatio: false,
|
||||||
|
elements: {
|
||||||
|
line: {
|
||||||
|
cubicInterpolationMode: 'monotone',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
spanGaps: true,
|
||||||
|
scales: {
|
||||||
|
y: {
|
||||||
|
beginAtZero: true,
|
||||||
|
ticks: {
|
||||||
|
callback: function(value) {
|
||||||
|
return 'Rp ' + value.toLocaleString('id-ID');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const fetchChartData = () => {
|
||||||
|
const startDate = startInput.value;
|
||||||
|
const endDate = endInput.value;
|
||||||
|
const kloterId = document.getElementById('kloterFilter').value;
|
||||||
|
|
||||||
|
fetch("{{ route('dashboard.pimpinan.data') }}", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': '{{ csrf_token() }}',
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
start_date: startDate,
|
||||||
|
end_date: endDate,
|
||||||
|
kloter_id: kloterId
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(res => res.json())
|
||||||
|
.then(updateCharts)
|
||||||
|
.catch(err => console.error('Gagal fetch data:', err));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Event listener input
|
||||||
|
startInput.addEventListener('change', fetchChartData);
|
||||||
|
endInput.addEventListener('change', fetchChartData);
|
||||||
|
document.getElementById('kloterFilter').addEventListener('change', fetchChartData);
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
@extends('layouts.app_operator')
|
|
||||||
|
|
||||||
@section('title', 'Dashboard Operator')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="container mt-4">
|
|
||||||
<div class="title-box">
|
|
||||||
<h3 class="fw-bold m-0">Dashboard</h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Box Pendapatan -->
|
|
||||||
<div class="dashboard-container" style="height: 100%;">
|
|
||||||
<div class="info-box flex justify-end mb-6">
|
|
||||||
<div class="bg-yellow-100 p-4 rounded shadow text-right w-64">
|
|
||||||
<h2 class="font-semibold">Jumlah Total Barang</h2>
|
|
||||||
<p class="text-lg font-bold"> {{ $jumlahBarang }} </p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Aktivitas Terbaru -->
|
|
||||||
<div class="subtitle-box bg-yellow-100 p-6 rounded shadow">
|
|
||||||
<h2 class="font-bold mb-4">Aktivitas Terbaru</h2>
|
|
||||||
|
|
||||||
<div class="info-row">
|
|
||||||
<div class="box-custom">
|
|
||||||
<h3>Barang</h3>
|
|
||||||
<table class="w-full text-sm bg-white rounded shadow">
|
|
||||||
<thead class="bg-blue-500 text-white">
|
|
||||||
<tr>
|
|
||||||
<th class="p-2 text-left">No</th>
|
|
||||||
<th class="p-2 text-left">Kode</th>
|
|
||||||
<th class="p-2 text-left">Nama Barang</th>
|
|
||||||
<th class="p-2 text-left">Qty</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach ($barangTerbaru as $i => $brg)
|
|
||||||
@php
|
|
||||||
$kode = '-';
|
|
||||||
if ($brg->pendukung) {
|
|
||||||
$kode = $brg->pendukung->kode;
|
|
||||||
} elseif ($brg->produk) {
|
|
||||||
$kode = $brg->produk->kode;
|
|
||||||
}
|
|
||||||
@endphp
|
|
||||||
<tr>
|
|
||||||
<td class="p-2">{{ $i + 1 }}</td>
|
|
||||||
<td class="p-2">{{ $kode }}</td>
|
|
||||||
<td class="p-2">{{ $brg->nama_barang }}</td>
|
|
||||||
<td class="p-2">{{ number_format($brg->qty, 0, ',', '.') }} kg</td>
|
|
||||||
</tr>
|
|
||||||
@endforeach
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<a href="{{ route('operator.barang.index') }}" class="info-all text-blue-500 mt-2 inline-block">Selengkapnya</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tabel Transaksi -->
|
|
||||||
<div class="box-custom">
|
|
||||||
<h3>Aktivitas Transaksi</h3>
|
|
||||||
<table class="w-full text-sm bg-white rounded shadow">
|
|
||||||
<thead class="bg-blue-500 text-white">
|
|
||||||
<tr>
|
|
||||||
<th class="p-2 text-left">No</th>
|
|
||||||
<th class="p-2 text-left">Waktu</th>
|
|
||||||
<th class="p-2 text-left">Nama</th>
|
|
||||||
<th class="p-2 text-left">Kategori</th>
|
|
||||||
<th class="p-2 text-left">Harga</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach ($transaksiTerbaru as $i => $trx)
|
|
||||||
<tr>
|
|
||||||
<td class="p-2">{{ $i + 1 }}</td>
|
|
||||||
<td class="p-2">{{ \Carbon\Carbon::parse($trx['waktu'])->format('d-m-Y H:i') }}</td>
|
|
||||||
<td class="p-2">{{ $trx['nama_barang'] }}</td>
|
|
||||||
<td class="p-2">{{ $trx['kategori'] }}</td>
|
|
||||||
<td class="b-pri p-2">{{ $trx['harga'] }}</td>
|
|
||||||
</tr>
|
|
||||||
@endforeach
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<a href="{{ route('operator.transaksi.index') }}" class="info-all text-blue-500 mt-2 inline-block">Selengkapnya</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
|
|
@ -64,11 +64,20 @@
|
||||||
|
|
||||||
@if ($isSelesai)
|
@if ($isSelesai)
|
||||||
<span class="badge bg-success">Selesai</span>
|
<span class="badge bg-success">Selesai</span>
|
||||||
|
<a href="{{ route('gaji.unduh', $kloter->id) }}" class="btn btn-success btn-sm mt-1">
|
||||||
|
Unduh Slip Gaji
|
||||||
|
</a>
|
||||||
@else
|
@else
|
||||||
<form action="{{ route('gaji.kloter.selesai', $kloter->id) }}" method="POST" class="d-inline form-kloter-selesai">
|
<form action="{{ route('gaji.kloter.selesai', $kloter->id) }}" method="POST" class="d-inline form-kloter-selesai" data-kloter-id="{{ $kloter->id }}">
|
||||||
@csrf
|
@csrf
|
||||||
<button type="submit" class="btn btn-primary btn-sm">Proses Gaji</button>
|
<button type="submit" class="btn btn-primary btn-sm">Proses Gaji</button>
|
||||||
</form>
|
</form>
|
||||||
|
<a href="{{ route('gaji.unduh', $kloter->id) }}"
|
||||||
|
class="btn btn-success btn-sm mt-1 btn-unduh-gaji"
|
||||||
|
id="unduh-kloter-{{ $kloter->id }}"
|
||||||
|
style="display: none;">
|
||||||
|
Unduh Slip Gaji
|
||||||
|
</a>
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="id">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Slip Gaji Kloter {{ $kloter->id }}</title>
|
||||||
|
<style>
|
||||||
|
@page {
|
||||||
|
size: A4;
|
||||||
|
margin: 2.54cm; /* standar Word */
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Times New Roman', Times, serif;
|
||||||
|
font-size: 12pt;
|
||||||
|
line-height: 1;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kop {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
line-height: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kop h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 16pt;
|
||||||
|
line-height: 3; /* 3 spasi untuk judul */
|
||||||
|
}
|
||||||
|
|
||||||
|
.kop p {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 12pt;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: 1px solid black;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
text-align: center;
|
||||||
|
margin: 10px 0;
|
||||||
|
font-size: 14pt;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info p {
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table, th, td {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 6px;
|
||||||
|
text-align: left;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature div {
|
||||||
|
width: 45%;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signature p {
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.signature-table, .signature-table td {
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-break {
|
||||||
|
page-break-after: always;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
@foreach ($slipData as $slip)
|
||||||
|
<div class="container">
|
||||||
|
<div class="kop">
|
||||||
|
<h2>UD. DNL PUTRA</h2>
|
||||||
|
<p>KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo</p>
|
||||||
|
<p>Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com</p>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>SLIP GAJI KARYAWAN<br>Periode: {{ $tanggalMulai->format('d M Y') }} - {{ $tanggalAkhir->format('d M Y') }}</h3>
|
||||||
|
|
||||||
|
<table style="margin: 15px 0 15px 0; width: auto; border: none;">
|
||||||
|
<tr>
|
||||||
|
<td style="border: none; padding: 2px 8px 2px 0;">Nama Karyawan</td>
|
||||||
|
<td style="border: none; padding: 2px 8px;">:</td>
|
||||||
|
<td style="border: none; padding: 2px 0;"><strong>{{ $slip['karyawan']->nama }}</strong></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: none; padding: 2px 8px 2px 0;">Jenis Kelamin</td>
|
||||||
|
<td style="border: none; padding: 2px 8px;">:</td>
|
||||||
|
<td style="border: none; padding: 2px 0;"><strong>{{ $slip['karyawan']->jenis_kelamin == 'L' ? 'Laki-laki' : 'Perempuan' }}</strong></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: none; padding: 2px 8px 2px 0;">Kloter</td>
|
||||||
|
<td style="border: none; padding: 2px 8px;">:</td>
|
||||||
|
<td style="border: none; padding: 2px 0;"><strong>{{ $kloter->id }}</strong></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: none; padding: 2px 8px 2px 0;">Tanggal Cetak</td>
|
||||||
|
<td style="border: none; padding: 2px 8px;">:</td>
|
||||||
|
<td style="border: none; padding: 2px 0;"><strong>{{ $tanggalCetak }}</strong></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr><th>Tanggal</th><th>Jam Kerja</th></tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($slip['jam_per_tanggal'] as $tanggal => $jam)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $tanggal }}</td>
|
||||||
|
<td>{{ floor($jam) }} jam {{ round(($jam - floor($jam)) * 60) }} menit</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
<tr>
|
||||||
|
<th>Total</th>
|
||||||
|
<th>{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit</th>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><td>Gaji per Jam</td><td>Rp{{ number_format($slip['gaji_per_jam'], 0, ',', '.') }}</td></tr>
|
||||||
|
<tr><td>Total Jam Kerja</td><td>{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit</td></tr>
|
||||||
|
<tr><td><strong>Total Gaji</strong></td><td><strong>Rp{{ number_format($slip['total_gaji'], 0, ',', '.') }}</strong></td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table class="signature-table" style="width: 100%; margin: 30px 0 0 0; border: none;">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 50%; text-align: left; border: none;">
|
||||||
|
Mengetahui,<br><br><br><br><br>
|
||||||
|
<strong>Poniman</strong>
|
||||||
|
</td>
|
||||||
|
<td style="width: 50%; text-align: right; border: none;">
|
||||||
|
Diterima oleh,<br><br><br><br><br>
|
||||||
|
<strong>{{ $slip['karyawan']->nama }}</strong>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="page-break"></div>
|
||||||
|
@endforeach
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,114 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="id">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Slip Gaji Karyawan</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Times New Roman', Times, serif;
|
||||||
|
margin: 40px;
|
||||||
|
}
|
||||||
|
.kop {
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 2px solid black;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.kop h2 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
table, th, td {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
th, td {
|
||||||
|
padding: 8px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.signature {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
.signature div {
|
||||||
|
text-align: center;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="kop">
|
||||||
|
<h2>UD. DNL PUTRA</h2>
|
||||||
|
<p>KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo <br>Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com</p>
|
||||||
|
<hr>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 style="text-align:center;">SLIP GAJI KARYAWAN<br>Periode: 07 - 12 Juni 2025</h3>
|
||||||
|
|
||||||
|
<div class="info">
|
||||||
|
<!-- di ganti dengan nama setiap karyawan yang berkerja dalam kloter -->
|
||||||
|
<p>Nama Karyawan: <strong>Jibno</strong></p>
|
||||||
|
<!-- di ganti dengan jenis kelamin setiap karyawan yang berkerja dalam kloter -->
|
||||||
|
<p>Jenis Kelamin: <strong>Laki-laki</strong></p>
|
||||||
|
<!-- di sesuaikan dengan id kloter -->
|
||||||
|
<p>Kloter: <strong>6</strong></p>
|
||||||
|
<!-- di sesuaikan dengan tanggal ini dicetak (now) -->
|
||||||
|
<p>Tanggal Cetak: <strong>25 Juni 2025</strong></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Tanggal</th>
|
||||||
|
<th>Jam Kerja</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<!-- data diambil dari tanggal yang terhubung dengan kloter yang terhubung dengan karyawan yang bekerja di kloter tersebut -->
|
||||||
|
<tr><td>07-Jun-2025</td><td>13 jam 5 menit</td></tr>
|
||||||
|
<tr><td>08-Jun-2025</td><td>13 jam 5 menit</td></tr>
|
||||||
|
<tr><td>09-Jun-2025</td><td>13 jam 5 menit</td></tr>
|
||||||
|
<tr><td>12-Jun-2025</td><td>0 jam 0 menit</td></tr>
|
||||||
|
<!-- jumlah kan jam nya -->
|
||||||
|
<tr><th>Total</th><th>39 jam 16 menit</th></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<!-- hitung -->
|
||||||
|
<td>Gaji per Jam</td>
|
||||||
|
<td>Rp2.273</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<!-- hasil penjumlahan jam kerja -->
|
||||||
|
<td>Total Jam Kerja</td>
|
||||||
|
<td>39 jam 16 menit</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<!-- hitung -->
|
||||||
|
<td><strong>Total Gaji</strong></td>
|
||||||
|
<td><strong>Rp89.259</strong></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="signature">
|
||||||
|
<div>
|
||||||
|
<p>Mengetahui,</p>
|
||||||
|
<br><br><br>
|
||||||
|
<p><strong>Poniman</strong></p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p>Diterima oleh,</p>
|
||||||
|
<br><br><br>
|
||||||
|
<p><strong>Jibno</strong></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,77 +0,0 @@
|
||||||
@extends('layouts.app_pimpinan')
|
|
||||||
|
|
||||||
@section('title', 'Dashboard Pimpinan')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="container mt-4">
|
|
||||||
<div class="title-box">
|
|
||||||
<h3 class="fw-bold m-0">Dashboard</h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dashboard-container">
|
|
||||||
<div class="info-row">
|
|
||||||
<div class="info-box">
|
|
||||||
<div>Pendapatan</div>
|
|
||||||
<div class="text-success mt-2">
|
|
||||||
Rp {{ number_format($keuangan['pendapatan'], 0, ',', '.') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="info-box">
|
|
||||||
<div>Pengeluaran</div>
|
|
||||||
<div class="text-danger mt-2">
|
|
||||||
Rp {{ number_format($keuangan['pengeluaran'], 0, ',', '.') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chart-card">
|
|
||||||
<div class="chart-title mb-2">Grafik Pendapatan <span class="text-dark">vs</span> Pengeluaran</div>
|
|
||||||
<canvas id="financeChart" height="100"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Chart.js -->
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
||||||
<script>
|
|
||||||
const ctx = document.getElementById('financeChart').getContext('2d');
|
|
||||||
const financeChart = new Chart(ctx, {
|
|
||||||
type: 'line',
|
|
||||||
data: {
|
|
||||||
labels: {!! json_encode($labels) !!},
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
label: 'Pendapatan',
|
|
||||||
data: {!! json_encode($pendapatanBulanan) !!},
|
|
||||||
borderColor: 'blue',
|
|
||||||
backgroundColor: 'blue',
|
|
||||||
fill: false,
|
|
||||||
tension: 0.4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Pengeluaran',
|
|
||||||
data: {!! json_encode($pengeluaranBulanan) !!},
|
|
||||||
borderColor: 'red',
|
|
||||||
backgroundColor: 'red',
|
|
||||||
fill: false,
|
|
||||||
tension: 0.4
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
responsive: true,
|
|
||||||
maintainAspectRatio: false,
|
|
||||||
scales: {
|
|
||||||
y: {
|
|
||||||
beginAtZero: true,
|
|
||||||
ticks: {
|
|
||||||
callback: function(value) {
|
|
||||||
return 'Rp ' + value.toLocaleString('id-ID');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@endsection
|
|
|
@ -97,10 +97,14 @@
|
||||||
// Pimpinan
|
// Pimpinan
|
||||||
// Route::middleware(['auth', 'role:pimpinan'])->group(function () {
|
// Route::middleware(['auth', 'role:pimpinan'])->group(function () {
|
||||||
Route::get('/pimpinan/dashboard', [DashboardController::class, 'pimpinan'])->name('dashboard.pimpinan');
|
Route::get('/pimpinan/dashboard', [DashboardController::class, 'pimpinan'])->name('dashboard.pimpinan');
|
||||||
|
Route::post('/dashboard-pimpinan/data', [DashboardController::class, 'ajaxData'])->name('dashboard.pimpinan.data');
|
||||||
|
|
||||||
Route::get('/pimpinan/laporan-barang', [LaporanController::class, 'barang'])->name('laporan.barang');
|
Route::get('/pimpinan/laporan-barang', [LaporanController::class, 'barang'])->name('laporan.barang');
|
||||||
Route::get('/pimpinan/laporan-karyawan', [LaporanController::class, 'karyawan'])->name('laporan.karyawan');
|
Route::get('/pimpinan/laporan-karyawan', [LaporanController::class, 'karyawan'])->name('laporan.karyawan');
|
||||||
Route::get('/pimpinan/laporan-supplier', [LaporanController::class, 'supplier'])->name('laporan.supplier');
|
Route::get('/pimpinan/laporan-supplier', [LaporanController::class, 'supplier'])->name('laporan.supplier');
|
||||||
Route::get('/pimpinan/laporan-transaksi', [LaporanController::class, 'transaksi'])->name('laporan.transaksi');
|
Route::get('/pimpinan/laporan-transaksi', [LaporanController::class, 'transaksi'])->name('laporan.transaksi');
|
||||||
|
|
||||||
|
|
||||||
// });
|
// });
|
||||||
|
|
||||||
// Operator
|
// Operator
|
||||||
|
@ -185,9 +189,10 @@
|
||||||
|
|
||||||
// export
|
// export
|
||||||
Route::get('/gaji/kloter/{id}/export', [GajiController::class, 'export'])->name('gaji.kloter.export');
|
Route::get('/gaji/kloter/{id}/export', [GajiController::class, 'export'])->name('gaji.kloter.export');
|
||||||
|
Route::get('/gaji/{kloter}/unduh-slip', [GajiController::class, 'unduhSlipGaji'])->name('gaji.unduh');
|
||||||
|
|
||||||
Route::get('operator/transaksi/export', [TransaksiController::class, 'exportExcel'])->name('operator.transaksi.export');
|
Route::get('operator/transaksi/export', [TransaksiController::class, 'exportExcel'])->name('operator.transaksi.export');
|
||||||
Route::get('/laporan/transaksi/export-pdf', [TransaksiController::class, 'exportPDF'])->name('operator.transaksi.export_pdf');
|
Route::get('/laporan/transaksi/export-pdf', [TransaksiController::class, 'exportPDF'])->name('operator.transaksi.export_pdf');
|
||||||
|
|
||||||
|
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue