update tgl 20 april
This commit is contained in:
parent
3c5f96f420
commit
70aadac250
|
@ -6,83 +6,235 @@
|
|||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
public function index()
|
||||
private function getKodeAkun($kategori)
|
||||
{
|
||||
// Get current month data
|
||||
$currentMonth = Carbon::now()->month;
|
||||
$currentYear = Carbon::now()->year;
|
||||
$kategori = trim(strtolower($kategori));
|
||||
|
||||
// Calculate total saldo
|
||||
$totalSaldo = HomeModel::selectRaw('SUM(uang_masuk - uang_keluar) as saldo')->first()->saldo ?? 0;
|
||||
// Pendapatan Operasional (41)
|
||||
if (str_contains($kategori, 'pendapatan penjualan')) return '241001';
|
||||
if (str_contains($kategori, 'pendapatan jasa')) return '241002';
|
||||
|
||||
// Calculate total uang masuk dan uang keluar
|
||||
$totalUangMasuk = HomeModel::sum('uang_masuk');
|
||||
$totalUangKeluar = HomeModel::sum('uang_keluar');
|
||||
// Pendapatan Non-Operasional (42)
|
||||
if (str_contains($kategori, 'pendapatan bunga')) return '242001';
|
||||
if (str_contains($kategori, 'pendapatan sewa')) return '242002';
|
||||
if (str_contains($kategori, 'pendapatan komisi')) return '242003';
|
||||
if (str_contains($kategori, 'pendapatan lain')) return '242004';
|
||||
|
||||
// Calculate current month's income and expenses
|
||||
$currentMonthUangMasuk = HomeModel::whereMonth('Tanggal', $currentMonth)
|
||||
->whereYear('Tanggal', $currentYear)
|
||||
->sum('uang_masuk');
|
||||
// Beban Operasional (51)
|
||||
if (str_contains($kategori, 'beban gaji')) return '251001';
|
||||
if (str_contains($kategori, 'beban sewa')) return '251002';
|
||||
if (str_contains($kategori, 'beban utilitas')) return '251003';
|
||||
if (str_contains($kategori, 'beban penyusutan')) return '251004';
|
||||
if (str_contains($kategori, 'beban supplies')) return '251005';
|
||||
if (str_contains($kategori, 'beban iklan')) return '251006';
|
||||
|
||||
$currentMonthUangKeluar = HomeModel::whereMonth('Tanggal', $currentMonth)
|
||||
->whereYear('Tanggal', $currentYear)
|
||||
->sum('uang_keluar');
|
||||
// Beban Non-Operasional (52)
|
||||
if (str_contains($kategori, 'beban bunga')) return '252001';
|
||||
if (str_contains($kategori, 'beban lain')) return '252002';
|
||||
|
||||
// Calculate profit/loss
|
||||
$labaRugiTotal = $totalUangMasuk - $totalUangKeluar;
|
||||
$labaRugiBulanIni = $currentMonthUangMasuk - $currentMonthUangKeluar;
|
||||
return null;
|
||||
}
|
||||
|
||||
private function prosesKategori($kategori, $uang_masuk, $uang_keluar, &$pendapatan, &$beban)
|
||||
{
|
||||
$kodeAkun = $this->getKodeAkun($kategori);
|
||||
if ($kodeAkun) {
|
||||
if (str_starts_with($kodeAkun, '24')) {
|
||||
// Untuk pendapatan
|
||||
$nominal = $uang_masuk;
|
||||
$data = [
|
||||
'kategori' => $kategori,
|
||||
'kode_akun' => $kodeAkun,
|
||||
'nominal' => $nominal
|
||||
];
|
||||
|
||||
if (isset($pendapatan[$kategori])) {
|
||||
$pendapatan[$kategori]['nominal'] += $nominal;
|
||||
} else {
|
||||
$pendapatan[$kategori] = $data;
|
||||
}
|
||||
} elseif (str_starts_with($kodeAkun, '25')) {
|
||||
// Untuk beban
|
||||
$nominal = $uang_keluar;
|
||||
$data = [
|
||||
'kategori' => $kategori,
|
||||
'kode_akun' => $kodeAkun,
|
||||
'nominal' => $nominal
|
||||
];
|
||||
|
||||
if (isset($beban[$kategori])) {
|
||||
$beban[$kategori]['nominal'] += $nominal;
|
||||
} else {
|
||||
$beban[$kategori] = $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
// Default date range
|
||||
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
|
||||
$endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d'));
|
||||
|
||||
// Inisialisasi array untuk menyimpan data
|
||||
$pendapatan = [];
|
||||
$beban = [];
|
||||
|
||||
try {
|
||||
// Ambil semua transaksi dalam periode
|
||||
$transaksis = DB::table('laporan_transaksis')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->get();
|
||||
|
||||
// Reset total
|
||||
$totalUangMasuk = 0;
|
||||
$totalUangKeluar = 0;
|
||||
|
||||
foreach ($transaksis as $transaksi) {
|
||||
// Proses kategori1
|
||||
if (!empty($transaksi->kategori)) {
|
||||
$this->prosesKategori(
|
||||
$transaksi->kategori,
|
||||
$transaksi->uang_masuk ?? 0,
|
||||
$transaksi->uang_keluar ?? 0,
|
||||
$pendapatan,
|
||||
$beban
|
||||
);
|
||||
|
||||
// Tambahkan ke total
|
||||
$totalUangMasuk += $transaksi->uang_masuk ?? 0;
|
||||
$totalUangKeluar += $transaksi->uang_keluar ?? 0;
|
||||
}
|
||||
|
||||
// Proses kategori2-5
|
||||
for ($i = 2; $i <= 5; $i++) {
|
||||
$kategori = $transaksi->{"kategori$i"};
|
||||
if (!empty($kategori)) {
|
||||
$this->prosesKategori(
|
||||
$kategori,
|
||||
$transaksi->{"uang_masuk$i"} ?? 0,
|
||||
$transaksi->{"uang_keluar$i"} ?? 0,
|
||||
$pendapatan,
|
||||
$beban
|
||||
);
|
||||
|
||||
// Tambahkan ke total
|
||||
$totalUangMasuk += $transaksi->{"uang_masuk$i"} ?? 0;
|
||||
$totalUangKeluar += $transaksi->{"uang_keluar$i"} ?? 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate current month totals
|
||||
$currentMonthUangMasuk = $totalUangMasuk;
|
||||
$currentMonthUangKeluar = $totalUangKeluar;
|
||||
|
||||
// Calculate last month totals for growth percentage
|
||||
$lastMonthStart = Carbon::parse($startDate)->subMonth()->startOfMonth();
|
||||
$lastMonthEnd = Carbon::parse($startDate)->subMonth()->endOfMonth();
|
||||
|
||||
$lastMonthTransaksis = DB::table('laporan_transaksis')
|
||||
->whereBetween('Tanggal', [$lastMonthStart, $lastMonthEnd])
|
||||
->get();
|
||||
|
||||
$lastMonthUangMasuk = 0;
|
||||
$lastMonthUangKeluar = 0;
|
||||
|
||||
foreach ($lastMonthTransaksis as $transaksi) {
|
||||
$lastMonthUangMasuk += $transaksi->uang_masuk ?? 0;
|
||||
$lastMonthUangKeluar += $transaksi->uang_keluar ?? 0;
|
||||
|
||||
for ($i = 2; $i <= 5; $i++) {
|
||||
$lastMonthUangMasuk += $transaksi->{"uang_masuk$i"} ?? 0;
|
||||
$lastMonthUangKeluar += $transaksi->{"uang_keluar$i"} ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
$lastMonthTotal = $lastMonthUangMasuk - $lastMonthUangKeluar;
|
||||
$currentMonthTotal = $totalUangMasuk - $totalUangKeluar;
|
||||
|
||||
// Calculate growth percentage
|
||||
$growthPercentage = $lastMonthTotal != 0 ?
|
||||
(($currentMonthTotal - $lastMonthTotal) / abs($lastMonthTotal)) * 100 :
|
||||
100;
|
||||
|
||||
// Calculate total saldo dan laba rugi sesuai format di Labarugi blade
|
||||
$totalSaldo = -($totalUangMasuk) - $totalUangKeluar;
|
||||
$labaRugiTotal = -($totalUangMasuk) - $totalUangKeluar;
|
||||
$labaRugiBulanIni = -($currentMonthUangMasuk) - $currentMonthUangKeluar;
|
||||
|
||||
// Get category breakdown
|
||||
$categoryTotals = collect($pendapatan)->map(function($item) {
|
||||
return [
|
||||
'kategori' => $item['kategori'],
|
||||
'total_debit' => $item['nominal'],
|
||||
'total_kredit' => 0
|
||||
];
|
||||
})->merge(
|
||||
collect($beban)->map(function($item) {
|
||||
return [
|
||||
'kategori' => $item['kategori'],
|
||||
'total_debit' => 0,
|
||||
'total_kredit' => $item['nominal']
|
||||
];
|
||||
})
|
||||
)->values();
|
||||
|
||||
// Get monthly totals for chart
|
||||
$monthlyTotals = HomeModel::selectRaw('
|
||||
DATE_FORMAT(Tanggal, "%Y-%m") as periode,
|
||||
SUM(uang_masuk) as total_debit,
|
||||
SUM(uang_keluar) as total_kredit,
|
||||
SUM(uang_masuk - uang_keluar) as laba_rugi
|
||||
')
|
||||
$monthlyTotals = DB::table('laporan_transaksis')
|
||||
->select(
|
||||
DB::raw('DATE_FORMAT(Tanggal, "%Y-%m") as periode'),
|
||||
DB::raw('SUM(uang_masuk) + SUM(COALESCE(uang_masuk2, 0)) + SUM(COALESCE(uang_masuk3, 0)) + SUM(COALESCE(uang_masuk4, 0)) + SUM(COALESCE(uang_masuk5, 0)) as total_debit'),
|
||||
DB::raw('SUM(uang_keluar) + SUM(COALESCE(uang_keluar2, 0)) + SUM(COALESCE(uang_keluar3, 0)) + SUM(COALESCE(uang_keluar4, 0)) + SUM(COALESCE(uang_keluar5, 0)) as total_kredit')
|
||||
)
|
||||
->groupBy('periode')
|
||||
->orderBy('periode')
|
||||
->get();
|
||||
|
||||
// Get category breakdown
|
||||
$categoryTotals = HomeModel::selectRaw('
|
||||
kategori,
|
||||
SUM(uang_masuk) as total_debit,
|
||||
SUM(uang_keluar) as total_kredit,
|
||||
SUM(uang_masuk - uang_keluar) as laba_rugi
|
||||
')
|
||||
->groupBy('kategori')
|
||||
->orderBy('total_debit', 'desc')
|
||||
->get();
|
||||
|
||||
// Get recent transactions
|
||||
$recentTransactions = HomeModel::orderBy('Tanggal', 'desc')
|
||||
$recentTransactions = DB::table('laporan_transaksis')
|
||||
->orderBy('Tanggal', 'desc')
|
||||
->limit(10)
|
||||
->get();
|
||||
|
||||
// Calculate month-over-month growth
|
||||
$lastMonthTotal = HomeModel::whereMonth('Tanggal', Carbon::now()->subMonth()->month)
|
||||
->whereYear('Tanggal', Carbon::now()->subMonth()->year)
|
||||
->sum('uang_masuk');
|
||||
|
||||
$growthPercentage = $lastMonthTotal != 0
|
||||
? (($currentMonthUangMasuk - $lastMonthTotal) / $lastMonthTotal) * 100
|
||||
: 0;
|
||||
// Debug log untuk memeriksa nilai
|
||||
Log::info("Total Uang Masuk: " . $totalUangMasuk);
|
||||
Log::info("Total Uang Keluar: " . $totalUangKeluar);
|
||||
Log::info("Total Saldo: " . $totalSaldo);
|
||||
Log::info("Laba Rugi Total: " . $labaRugiTotal);
|
||||
Log::info("Laba Rugi Bulan Ini: " . $labaRugiBulanIni);
|
||||
|
||||
return view('home', compact(
|
||||
'totalSaldo',
|
||||
'startDate',
|
||||
'endDate',
|
||||
'totalUangMasuk',
|
||||
'totalUangKeluar',
|
||||
'currentMonthUangMasuk',
|
||||
'currentMonthUangKeluar',
|
||||
'totalSaldo',
|
||||
'growthPercentage',
|
||||
'labaRugiTotal',
|
||||
'labaRugiBulanIni',
|
||||
'monthlyTotals',
|
||||
'categoryTotals',
|
||||
'recentTransactions',
|
||||
'growthPercentage'
|
||||
'pendapatan',
|
||||
'beban'
|
||||
));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error in HomeController: " . $e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function filter(Request $request)
|
||||
{
|
||||
return $this->index($request);
|
||||
}
|
||||
}
|
|
@ -2,138 +2,136 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\LabarugiModel;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\LabarugiModel;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class LabarugiController extends Controller
|
||||
{
|
||||
private function getKodeAkun($kategori)
|
||||
{
|
||||
$kategori = trim(strtolower($kategori));
|
||||
|
||||
// Pendapatan Operasional (41)
|
||||
if (str_contains($kategori, 'pendapatan penjualan')) return '241001';
|
||||
if (str_contains($kategori, 'pendapatan jasa')) return '241002';
|
||||
|
||||
// Pendapatan Non-Operasional (42)
|
||||
if (str_contains($kategori, 'pendapatan bunga')) return '242001';
|
||||
if (str_contains($kategori, 'pendapatan sewa')) return '242002';
|
||||
if (str_contains($kategori, 'pendapatan komisi')) return '242003';
|
||||
if (str_contains($kategori, 'pendapatan lain')) return '242004';
|
||||
|
||||
// Beban Operasional (51)
|
||||
if (str_contains($kategori, 'beban gaji')) return '251001';
|
||||
if (str_contains($kategori, 'beban sewa')) return '251002';
|
||||
if (str_contains($kategori, 'beban utilitas')) return '251003';
|
||||
if (str_contains($kategori, 'beban penyusutan')) return '251004';
|
||||
if (str_contains($kategori, 'beban supplies')) return '251005';
|
||||
if (str_contains($kategori, 'beban iklan')) return '251006';
|
||||
|
||||
// Beban Non-Operasional (52)
|
||||
if (str_contains($kategori, 'beban bunga')) return '252001';
|
||||
if (str_contains($kategori, 'beban lain')) return '252002';
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
// Default periode adalah bulan ini
|
||||
// Default date range
|
||||
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
|
||||
$endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d'));
|
||||
|
||||
$model = new LabarugiModel();
|
||||
// Inisialisasi array untuk menyimpan data
|
||||
$pendapatan = [];
|
||||
$beban = [];
|
||||
|
||||
// Helper function untuk menjumlahkan uang masuk
|
||||
$sumUangMasuk = "COALESCE(uang_masuk, 0) + COALESCE(uang_masuk2, 0) + COALESCE(uang_masuk3, 0) + COALESCE(uang_masuk4, 0) + COALESCE(uang_masuk5, 0)";
|
||||
|
||||
// Helper function untuk menjumlahkan uang keluar
|
||||
$sumUangKeluar = "COALESCE(uang_keluar, 0) + COALESCE(uang_keluar2, 0) + COALESCE(uang_keluar3, 0) + COALESCE(uang_keluar4, 0) + COALESCE(uang_keluar5, 0)";
|
||||
|
||||
// Mengambil data pendapatan operasional (41)
|
||||
$pendapatanPenjualan = $model->where('kode', '241001')
|
||||
try {
|
||||
// Ambil semua transaksi dalam periode
|
||||
$transaksis = DB::table('laporan_transaksis')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
->get();
|
||||
|
||||
$pendapatanJasa = $model->where('kode', '241002')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
foreach ($transaksis as $transaksi) {
|
||||
// Proses kategori1
|
||||
if (!empty($transaksi->kategori)) {
|
||||
$this->prosesKategori(
|
||||
$transaksi->kategori,
|
||||
$transaksi->uang_masuk ?? 0,
|
||||
$transaksi->uang_keluar ?? 0,
|
||||
$pendapatan,
|
||||
$beban
|
||||
);
|
||||
}
|
||||
|
||||
// Mengambil data pendapatan non-operasional (42)
|
||||
$pendapatanBunga = $model->where('kode', '242001')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
// Proses kategori2-5
|
||||
for ($i = 2; $i <= 5; $i++) {
|
||||
$kategori = $transaksi->{"kategori$i"};
|
||||
if (!empty($kategori)) {
|
||||
$this->prosesKategori(
|
||||
$kategori,
|
||||
$transaksi->{"uang_masuk$i"} ?? 0,
|
||||
$transaksi->{"uang_keluar$i"} ?? 0,
|
||||
$pendapatan,
|
||||
$beban
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$pendapatanSewa = $model->where('kode', '242002')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
// Hitung total
|
||||
$total_pendapatan = array_sum(array_column($pendapatan, 'nominal'));
|
||||
$total_beban = abs(array_sum(array_column($beban, 'nominal')));
|
||||
$laba_rugi = $total_pendapatan - $total_beban;
|
||||
|
||||
$pendapatanKomisi = $model->where('kode', '242003')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
return view('Labarugi', [
|
||||
'startDate' => $startDate,
|
||||
'endDate' => $endDate,
|
||||
'pendapatan' => $pendapatan,
|
||||
'beban' => $beban,
|
||||
'total_pendapatan' => $total_pendapatan,
|
||||
'total_beban' => $total_beban,
|
||||
'laba_rugi' => $laba_rugi
|
||||
]);
|
||||
|
||||
$pendapatanLain = $model->where('kode', '242004')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangMasuk) as total"))
|
||||
->value('total') ?? 0;
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error in LabarugiController: " . $e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
// Mengambil data beban operasional (51)
|
||||
$bebanGaji = $model->where('kode', '251001')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
private function prosesKategori($kategori, $uang_masuk, $uang_keluar, &$pendapatan, &$beban)
|
||||
{
|
||||
$kodeAkun = $this->getKodeAkun($kategori);
|
||||
if ($kodeAkun) {
|
||||
$nominal = $uang_masuk - $uang_keluar;
|
||||
$data = [
|
||||
'kategori' => $kategori,
|
||||
'kode_akun' => $kodeAkun,
|
||||
'nominal' => $nominal
|
||||
];
|
||||
|
||||
$bebanSewa = $model->where('kode', '251002')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
if (str_starts_with($kodeAkun, '24')) {
|
||||
if (isset($pendapatan[$kategori])) {
|
||||
$pendapatan[$kategori]['nominal'] += $nominal;
|
||||
} else {
|
||||
$pendapatan[$kategori] = $data;
|
||||
}
|
||||
} elseif (str_starts_with($kodeAkun, '25')) {
|
||||
if (isset($beban[$kategori])) {
|
||||
$beban[$kategori]['nominal'] += $nominal;
|
||||
} else {
|
||||
$beban[$kategori] = $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$bebanUtilitas = $model->where('kode', '251003')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
$bebanPenyusutan = $model->where('kode', '251004')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
$bebanSupplies = $model->where('kode', '251005')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
$bebanIklan = $model->where('kode', '251006')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
// Mengambil data beban non-operasional (52)
|
||||
$bebanBunga = $model->where('kode', '252001')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
$bebanLain = $model->where('kode', '252002')
|
||||
->whereBetween('Tanggal', [$startDate, $endDate])
|
||||
->select(DB::raw("SUM($sumUangKeluar) as total"))
|
||||
->value('total') ?? 0;
|
||||
|
||||
// Menghitung total pendapatan
|
||||
$totalPendapatanOperasional = $pendapatanPenjualan + $pendapatanJasa;
|
||||
$totalPendapatanNonOperasional = $pendapatanBunga + $pendapatanSewa + $pendapatanKomisi + $pendapatanLain;
|
||||
$totalPendapatan = $totalPendapatanOperasional + $totalPendapatanNonOperasional;
|
||||
|
||||
// Menghitung total beban
|
||||
$totalBebanOperasional = $bebanGaji + $bebanSewa + $bebanUtilitas + $bebanPenyusutan + $bebanSupplies + $bebanIklan;
|
||||
$totalBebanNonOperasional = $bebanBunga + $bebanLain;
|
||||
$totalBeban = $totalBebanOperasional + $totalBebanNonOperasional;
|
||||
|
||||
// Menghitung laba rugi
|
||||
$totalLabaRugi = $totalPendapatan - $totalBeban;
|
||||
|
||||
return view('Labarugi', compact(
|
||||
'startDate',
|
||||
'endDate',
|
||||
'pendapatanPenjualan',
|
||||
'pendapatanJasa',
|
||||
'pendapatanBunga',
|
||||
'pendapatanSewa',
|
||||
'pendapatanKomisi',
|
||||
'pendapatanLain',
|
||||
'bebanGaji',
|
||||
'bebanSewa',
|
||||
'bebanUtilitas',
|
||||
'bebanPenyusutan',
|
||||
'bebanSupplies',
|
||||
'bebanIklan',
|
||||
'bebanBunga',
|
||||
'bebanLain',
|
||||
'totalPendapatanOperasional',
|
||||
'totalPendapatanNonOperasional',
|
||||
'totalBebanOperasional',
|
||||
'totalBebanNonOperasional',
|
||||
'totalPendapatan',
|
||||
'totalBeban',
|
||||
'totalLabaRugi'
|
||||
));
|
||||
public function filter(Request $request)
|
||||
{
|
||||
return $this->index($request);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,81 +9,17 @@ class LabarugiModel extends Model
|
|||
protected $table = 'laporan_transaksis';
|
||||
protected $guarded = ['id'];
|
||||
|
||||
// Konstanta untuk kode akun pendapatan (uang masuk)
|
||||
const KODE_PENDAPATAN = [
|
||||
'OPERASIONAL' => [
|
||||
'241001' => 'pendapatan penjualan',
|
||||
'241002' => 'pendapatan jasa'
|
||||
],
|
||||
'NON_OPERASIONAL' => [
|
||||
'242001' => 'pendapatan bunga',
|
||||
'242002' => 'pendapatan sewa',
|
||||
'242003' => 'pendapatan komisi',
|
||||
'242004' => 'pendapatan lain'
|
||||
]
|
||||
protected $casts = [
|
||||
'Tanggal' => 'date',
|
||||
'uang_masuk' => 'decimal:2',
|
||||
'uang_masuk2' => 'decimal:2',
|
||||
'uang_masuk3' => 'decimal:2',
|
||||
'uang_masuk4' => 'decimal:2',
|
||||
'uang_masuk5' => 'decimal:2',
|
||||
'uang_keluar' => 'decimal:2',
|
||||
'uang_keluar2' => 'decimal:2',
|
||||
'uang_keluar3' => 'decimal:2',
|
||||
'uang_keluar4' => 'decimal:2',
|
||||
'uang_keluar5' => 'decimal:2',
|
||||
];
|
||||
|
||||
// Konstanta untuk kode akun beban (uang keluar)
|
||||
const KODE_BEBAN = [
|
||||
'OPERASIONAL' => [
|
||||
'251001' => 'beban gaji',
|
||||
'251002' => 'beban sewa',
|
||||
'251003' => 'beban utilitas',
|
||||
'251004' => 'beban penyusutan',
|
||||
'251005' => 'beban supplies',
|
||||
'251006' => 'beban iklan'
|
||||
],
|
||||
'NON_OPERASIONAL' => [
|
||||
'252001' => 'beban bunga',
|
||||
'252002' => 'beban lain'
|
||||
]
|
||||
];
|
||||
|
||||
// Scope untuk filter berdasarkan periode
|
||||
public function scopePeriode($query, $startDate, $endDate)
|
||||
{
|
||||
return $query->whereBetween('Tanggal', [$startDate, $endDate]);
|
||||
}
|
||||
|
||||
// Scope untuk pendapatan operasional (uang masuk)
|
||||
public function scopePendapatanOperasional($query)
|
||||
{
|
||||
return $query->whereIn('kode', array_keys(self::KODE_PENDAPATAN['OPERASIONAL']));
|
||||
}
|
||||
|
||||
// Scope untuk pendapatan non-operasional (uang masuk)
|
||||
public function scopePendapatanNonOperasional($query)
|
||||
{
|
||||
return $query->whereIn('kode', array_keys(self::KODE_PENDAPATAN['NON_OPERASIONAL']));
|
||||
}
|
||||
|
||||
// Scope untuk beban operasional (uang keluar)
|
||||
public function scopeBebanOperasional($query)
|
||||
{
|
||||
return $query->whereIn('kode', array_keys(self::KODE_BEBAN['OPERASIONAL']));
|
||||
}
|
||||
|
||||
// Scope untuk beban non-operasional (uang keluar)
|
||||
public function scopeBebanNonOperasional($query)
|
||||
{
|
||||
return $query->whereIn('kode', array_keys(self::KODE_BEBAN['NON_OPERASIONAL']));
|
||||
}
|
||||
|
||||
// Helper untuk mengecek apakah kode termasuk pendapatan
|
||||
public static function isPendapatan($kode)
|
||||
{
|
||||
return in_array($kode, array_merge(
|
||||
array_keys(self::KODE_PENDAPATAN['OPERASIONAL']),
|
||||
array_keys(self::KODE_PENDAPATAN['NON_OPERASIONAL'])
|
||||
));
|
||||
}
|
||||
|
||||
// Helper untuk mengecek apakah kode termasuk beban
|
||||
public static function isBeban($kode)
|
||||
{
|
||||
return in_array($kode, array_merge(
|
||||
array_keys(self::KODE_BEBAN['OPERASIONAL']),
|
||||
array_keys(self::KODE_BEBAN['NON_OPERASIONAL'])
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('transaksi', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->date('tanggal');
|
||||
$table->string('kode_akun');
|
||||
$table->enum('jenis', ['masuk', 'keluar']);
|
||||
$table->decimal('nominal', 15, 2);
|
||||
$table->string('keterangan')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('transaksi');
|
||||
}
|
||||
};
|
|
@ -11,20 +11,27 @@
|
|||
|
||||
<div class="max-w-full bg-gradient-to-br from-indigo-50 to-blue-50 rounded-lg shadow-md dark:bg-gray-800 p-6">
|
||||
<!-- Filter Section -->
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div class="flex flex-wrap items-center gap-4 mb-6">
|
||||
<h2 class="text-xl font-bold text-indigo-700 dark:text-white">Dashboard Keuangan</h2>
|
||||
<select id="period-selector" class="sm:ml-auto mt-3 sm:mt-0 sm:w-auto form-select box bg-white border border-indigo-200 rounded-lg text-indigo-600 font-medium focus:ring-2 focus:ring-indigo-300 focus:border-indigo-300">
|
||||
<option value="daily">Harian</option>
|
||||
<option value="weekly">Mingguan</option>
|
||||
<option value="monthly" selected>Bulanan</option>
|
||||
<option value="yearly">Tahunan</option>
|
||||
</select>
|
||||
<form action="{{ route('home.filter') }}" method="GET" class="flex flex-wrap items-center gap-4 sm:ml-auto">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-sm text-gray-600">Tanggal Awal</span>
|
||||
<input type="date" name="start_date" class="form-input box bg-white border border-indigo-200 rounded-lg text-gray-600" value="{{ $startDate }}">
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-sm text-gray-600">Tanggal Akhir</span>
|
||||
<input type="date" name="end_date" class="form-input box bg-white border border-indigo-200 rounded-lg text-gray-600" value="{{ $endDate }}">
|
||||
</div>
|
||||
<button type="submit" class="btn bg-indigo-500 text-white px-4 py-2 rounded-lg hover:bg-indigo-600">
|
||||
Filter
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Main Metrics -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
||||
<!-- Total Saldo Card -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<!-- <div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 rounded-lg bg-indigo-100 flex items-center justify-center me-3">
|
||||
<svg class="w-6 h-6 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
@ -39,9 +46,9 @@
|
|||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- Total Debit Card -->
|
||||
<!-- Total Pendapatan Card -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 rounded-lg bg-green-100 flex items-center justify-center me-3">
|
||||
|
@ -50,14 +57,14 @@
|
|||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm text-gray-500 mb-1">Total Debit</p>
|
||||
<p class="text-sm text-gray-500 mb-1">Total Pendapatan</p>
|
||||
<h3 class="text-2xl font-bold text-gray-800">Rp {{ number_format($totalUangMasuk, 0, ',', '.') }}</h3>
|
||||
<p class="text-sm text-gray-500">Bulan Ini: Rp {{ number_format($currentMonthUangMasuk, 0, ',', '.') }}</p>
|
||||
<p class="text-sm text-gray-500">Periode: {{ date('d/m/Y', strtotime($startDate)) }} - {{ date('d/m/Y', strtotime($endDate)) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Total Kredit Card -->
|
||||
<!-- Total Beban Card -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 rounded-lg bg-red-100 flex items-center justify-center me-3">
|
||||
|
@ -66,9 +73,52 @@
|
|||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-sm text-gray-500 mb-1">Total Kredit</p>
|
||||
<p class="text-sm text-gray-500 mb-1">Total Beban</p>
|
||||
<h3 class="text-2xl font-bold text-gray-800">Rp {{ number_format($totalUangKeluar, 0, ',', '.') }}</h3>
|
||||
<p class="text-sm text-gray-500">Bulan Ini: Rp {{ number_format($currentMonthUangKeluar, 0, ',', '.') }}</p>
|
||||
<p class="text-sm text-gray-500">Periode: {{ date('d/m/Y', strtotime($startDate)) }} - {{ date('d/m/Y', strtotime($endDate)) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Detail Section -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
|
||||
<!-- Rincian Pendapatan -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Rincian Pendapatan</h4>
|
||||
@foreach($pendapatan as $item)
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<div class="flex items-center">
|
||||
<span class="text-sm text-gray-600">{{ ucwords($item['kategori']) }}</span>
|
||||
<span class="text-xs text-gray-400 ml-2">({{ $item['kode_akun'] }})</span>
|
||||
</div>
|
||||
<span class="text-sm font-medium text-green-600">Rp {{ number_format(abs($item['nominal']), 0, ',', '.') }}</span>
|
||||
</div>
|
||||
@endforeach
|
||||
<div class="mt-4 pt-4 border-t">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="font-semibold">Total Pendapatan</span>
|
||||
<span class="font-semibold text-green-600">Rp {{ number_format($totalUangMasuk, 0, ',', '.') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rincian Beban -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Rincian Beban</h4>
|
||||
@foreach($beban as $item)
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<div class="flex items-center">
|
||||
<span class="text-sm text-gray-600">{{ ucwords($item['kategori']) }}</span>
|
||||
<span class="text-xs text-gray-400 ml-2">({{ $item['kode_akun'] }})</span>
|
||||
</div>
|
||||
<span class="text-sm font-medium text-red-600">Rp {{ number_format(abs($item['nominal']), 0, ',', '.') }}</span>
|
||||
</div>
|
||||
@endforeach
|
||||
<div class="mt-4 pt-4 border-t">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="font-semibold">Total Beban</span>
|
||||
<span class="font-semibold text-red-600">Rp {{ number_format($totalUangKeluar, 0, ',', '.') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -76,9 +126,9 @@
|
|||
|
||||
<!-- Profit/Loss Section -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
|
||||
<!-- Total Profit/Loss Card -->
|
||||
<!-- Total Laba/Rugi Card -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Selisih Total (Debit - Kredit)</h4>
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Laba/Rugi Total</h4>
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 rounded-lg {{ $labaRugiTotal >= 0 ? 'bg-green-100' : 'bg-red-100' }} flex items-center justify-center me-3">
|
||||
<svg class="w-6 h-6 {{ $labaRugiTotal >= 0 ? 'text-green-600' : 'text-red-600' }}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
@ -89,14 +139,14 @@
|
|||
<h3 class="text-2xl font-bold {{ $labaRugiTotal >= 0 ? 'text-green-600' : 'text-red-600' }}">
|
||||
Rp {{ number_format(abs($labaRugiTotal), 0, ',', '.') }}
|
||||
</h3>
|
||||
<p class="text-sm text-gray-500">{{ $labaRugiTotal >= 0 ? 'Debit Lebih Besar' : 'Kredit Lebih Besar' }}</p>
|
||||
<p class="text-sm text-gray-500">{{ $labaRugiTotal >= 0 ? 'Laba' : 'Rugi' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Current Month Balance Card -->
|
||||
<!-- Laba/Rugi Bulan Ini Card -->
|
||||
<div class="bg-white rounded-xl p-6 shadow-sm">
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Selisih Bulan Ini</h4>
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Laba/Rugi Periode Ini</h4>
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 rounded-lg {{ $labaRugiBulanIni >= 0 ? 'bg-green-100' : 'bg-red-100' }} flex items-center justify-center me-3">
|
||||
<svg class="w-6 h-6 {{ $labaRugiBulanIni >= 0 ? 'text-green-600' : 'text-red-600' }}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
|
@ -107,7 +157,7 @@
|
|||
<h3 class="text-2xl font-bold {{ $labaRugiBulanIni >= 0 ? 'text-green-600' : 'text-red-600' }}">
|
||||
Rp {{ number_format(abs($labaRugiBulanIni), 0, ',', '.') }}
|
||||
</h3>
|
||||
<p class="text-sm text-gray-500">{{ $labaRugiBulanIni >= 0 ? 'Debit Lebih Besar' : 'Kredit Lebih Besar' }}</p>
|
||||
<p class="text-sm text-gray-500">{{ $labaRugiBulanIni >= 0 ? 'Laba' : 'Rugi' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -117,7 +167,7 @@
|
|||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
||||
<!-- Bar Chart -->
|
||||
<div class="bg-white p-6 rounded-xl shadow-sm">
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Tren Debit & Kredit</h4>
|
||||
<h4 class="text-lg font-semibold text-gray-700 mb-4">Tren Pendapatan & Beban</h4>
|
||||
<div class="chart-container">
|
||||
<canvas id="financial-trend-chart"></canvas>
|
||||
</div>
|
||||
|
@ -145,8 +195,8 @@
|
|||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Kode</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Kategori</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Keterangan</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Debit</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Kredit</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Pendapatan</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Beban</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="bg-white divide-y divide-gray-200">
|
||||
|
@ -183,14 +233,6 @@
|
|||
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
console.log('DOM Loaded');
|
||||
|
||||
// Debug data
|
||||
const monthlyData = @json($monthlyTotals);
|
||||
const categoryData = @json($categoryTotals);
|
||||
console.log('Monthly Data:', monthlyData);
|
||||
console.log('Category Data:', categoryData);
|
||||
|
||||
// Format number to Rupiah
|
||||
function formatRupiah(number) {
|
||||
return 'Rp ' + number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
||||
|
@ -199,38 +241,37 @@ function formatRupiah(number) {
|
|||
try {
|
||||
// Financial Trend Chart
|
||||
const trendCtx = document.getElementById('financial-trend-chart');
|
||||
console.log('Trend Chart Element:', trendCtx);
|
||||
|
||||
if (trendCtx) {
|
||||
const monthlyData = @json($monthlyTotals);
|
||||
const labels = monthlyData.map(item => {
|
||||
const [year, month] = item.periode.split('-');
|
||||
const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des'];
|
||||
return `${monthNames[parseInt(month)-1]} ${year}`;
|
||||
});
|
||||
const debitData = monthlyData.map(item => parseFloat(item.total_debit) || 0);
|
||||
const kreditData = monthlyData.map(item => parseFloat(item.total_kredit) || 0);
|
||||
const pendapatanData = monthlyData.map(item => parseFloat(item.total_debit) || 0);
|
||||
const bebanData = monthlyData.map(item => parseFloat(item.total_kredit) || 0);
|
||||
|
||||
new Chart(trendCtx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: labels,
|
||||
datasets: [{
|
||||
label: 'Debit',
|
||||
data: debitData,
|
||||
label: 'Pendapatan',
|
||||
data: pendapatanData,
|
||||
backgroundColor: 'rgba(34, 197, 94, 0.5)',
|
||||
borderColor: 'rgb(34, 197, 94)',
|
||||
borderWidth: 1,
|
||||
order: 2
|
||||
}, {
|
||||
label: 'Kredit',
|
||||
data: kreditData,
|
||||
label: 'Beban',
|
||||
data: bebanData,
|
||||
backgroundColor: 'rgba(239, 68, 68, 0.5)',
|
||||
borderColor: 'rgb(239, 68, 68)',
|
||||
borderWidth: 1,
|
||||
order: 2
|
||||
}, {
|
||||
label: 'Selisih',
|
||||
data: debitData.map((debit, index) => debit - kreditData[index]),
|
||||
label: 'Laba/Rugi',
|
||||
data: pendapatanData.map((pendapatan, index) => pendapatan - bebanData[index]),
|
||||
type: 'line',
|
||||
borderColor: 'rgb(59, 130, 246)',
|
||||
borderWidth: 2,
|
||||
|
@ -270,26 +311,25 @@ function formatRupiah(number) {
|
|||
|
||||
// Category Distribution Chart
|
||||
const categoryCtx = document.getElementById('category-distribution-chart');
|
||||
console.log('Category Chart Element:', categoryCtx);
|
||||
|
||||
if (categoryCtx) {
|
||||
const categoryData = @json($categoryTotals);
|
||||
const categories = categoryData.map(item => item.kategori);
|
||||
const totalDebitPerCategory = categoryData.map(item => parseFloat(item.total_debit) || 0);
|
||||
const totalKreditPerCategory = categoryData.map(item => parseFloat(item.total_kredit) || 0);
|
||||
const pendapatanPerKategori = categoryData.map(item => parseFloat(item.total_debit) || 0);
|
||||
const bebanPerKategori = categoryData.map(item => parseFloat(item.total_kredit) || 0);
|
||||
|
||||
new Chart(categoryCtx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: categories,
|
||||
datasets: [{
|
||||
label: 'Debit',
|
||||
data: totalDebitPerCategory,
|
||||
label: 'Pendapatan',
|
||||
data: pendapatanPerKategori,
|
||||
backgroundColor: 'rgba(34, 197, 94, 0.5)',
|
||||
borderColor: 'rgb(34, 197, 94)',
|
||||
borderWidth: 1
|
||||
}, {
|
||||
label: 'Kredit',
|
||||
data: totalKreditPerCategory,
|
||||
label: 'Beban',
|
||||
data: bebanPerKategori,
|
||||
backgroundColor: 'rgba(239, 68, 68, 0.5)',
|
||||
borderColor: 'rgb(239, 68, 68)',
|
||||
borderWidth: 1
|
||||
|
|
|
@ -9,166 +9,91 @@
|
|||
<!-- CSRF Token -->
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<!-- <div class="p-4"> -->
|
||||
<!-- Header Controls -->
|
||||
<!-- <form action="{{ route('labarugi.filter') }}" method="GET" class="flex items-center gap-4 mb-4">
|
||||
<div class="flex items-center gap-2">
|
||||
<span>Tanggal Awal</span>
|
||||
<input type="date" name="start_date" class="border rounded px-2 py-1" value="{{ $startDate }}">
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span>Tanggal Akhir</span>
|
||||
<input type="date" name="end_date" class="border rounded px-2 py-1" value="{{ $endDate }}">
|
||||
</div>
|
||||
<button type="submit" class="bg-blue-500 text-white px-4 py-1 rounded">Filter</button>
|
||||
</form> -->
|
||||
|
||||
<div class="box p-4 intro-y mt-5">
|
||||
<div class="intro-y">
|
||||
<!-- Header -->
|
||||
<div class="mb-4 bg-blue-600 text-white p-4 rounded-lg shadow-md">
|
||||
<h1 class="text-2xl font-bold text-center">CV. Budivespaendut</h1>
|
||||
<h2 class="text-xl font-semibold text-center mt-2">Laporan Laba Rugi</h2>
|
||||
<p class="text-center">Periode: {{ date('d F Y', strtotime($startDate)) }} - {{ date('d F Y', strtotime($endDate)) }}</p>
|
||||
<h1 class="text-2xl font-bold">Laporan Laba Rugi</h1>
|
||||
<p class="text-sm mt-1">PT EXAMPLE</p>
|
||||
<p class="text-sm">Periode: {{ date('F Y', strtotime($startDate)) }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Filter Tanggal -->
|
||||
<!-- <div class="mb-4">
|
||||
<form method="GET" action="{{ url('/laporan-laba-rugi') }}" class="flex gap-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700">Tanggal Awal</label>
|
||||
<input type="date" name="start_date" value="{{ $startDate }}" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm">
|
||||
<div class="p-4">
|
||||
<!-- Header Controls -->
|
||||
<form action="{{ route('labarugi.filter') }}" method="GET" class="flex items-center gap-4 mb-4">
|
||||
<div class="flex items-center gap-2">
|
||||
<span>Tanggal Awal</span>
|
||||
<input type="date" name="start_date" class="border rounded px-2 py-1" value="{{ $startDate }}">
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700">Tanggal Akhir</label>
|
||||
<input type="date" name="end_date" value="{{ $endDate }}" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm">
|
||||
</div>
|
||||
<div class="self-end">
|
||||
<button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-md hover:bg-blue-600">
|
||||
Filter
|
||||
</button>
|
||||
<div class="flex items-center gap-2">
|
||||
<span>Tanggal Akhir</span>
|
||||
<input type="date" name="end_date" class="border rounded px-2 py-1" value="{{ $endDate }}">
|
||||
</div>
|
||||
<button type="submit" class="bg-blue-500 text-white px-4 py-1 rounded">Filter</button>
|
||||
</form>
|
||||
</div> -->
|
||||
|
||||
<!-- Tabel Laporan Laba Rugi -->
|
||||
<!-- Table -->
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full bg-white border-collapse">
|
||||
<!-- Pendapatan Operasional -->
|
||||
<tr class="bg-gray-100 font-bold">
|
||||
<td colspan="3" class="border p-2">Pendapatan Operasional</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Penjualan</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanPenjualan ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Jasa</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanJasa ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr class="font-bold bg-gray-50">
|
||||
<td class="border p-2">Total Pendapatan Operasional</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalPendapatanOperasional ?? 0, 0, ',', '.') }}</td>
|
||||
<table class="w-full border-collapse border border-gray-300">
|
||||
<tr class="bg-purple-600 text-white">
|
||||
<th class="text-left p-2 border border-gray-300">Keterangan</th>
|
||||
<th class="text-right p-2 border border-gray-300">Nominal</th>
|
||||
</tr>
|
||||
|
||||
<!-- Pendapatan Non-Operasional -->
|
||||
<tr class="bg-gray-100 font-bold">
|
||||
<td colspan="3" class="border p-2">Pendapatan Non-Operasional</td>
|
||||
<!-- Pendapatan -->
|
||||
<tr class="bg-gray-100">
|
||||
<td class="p-2 border border-gray-300 font-bold" colspan="2">Pendapatan</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Bunga</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanBunga ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
@foreach($pendapatan as $item)
|
||||
<tr class="border-b border-gray-300">
|
||||
<td class="p-2 border border-gray-300 pl-8">{{ ucwords($item['kategori']) }} ({{ $item['kode_akun'] }})</td>
|
||||
<td class="text-right p-2 border border-gray-300">
|
||||
{{ number_format(abs($item['nominal']), 0, ',', '.') }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Sewa</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanSewa ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Komisi</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanKomisi ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Pendapatan Lain</td>
|
||||
<td class="border p-2 text-right">{{ number_format($pendapatanLain ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr class="font-bold bg-gray-50">
|
||||
<td class="border p-2">Total Pendapatan Non-Operasional</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalPendapatanNonOperasional ?? 0, 0, ',', '.') }}</td>
|
||||
@endforeach
|
||||
<tr class="border-b border-gray-300 font-semibold bg-gray-50">
|
||||
<td class="p-2 border border-gray-300">Total Pendapatan</td>
|
||||
<td class="text-right p-2 border border-gray-300">{{ number_format(abs($total_pendapatan), 0, ',', '.') }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- Total Seluruh Pendapatan -->
|
||||
<tr class="font-bold bg-blue-50">
|
||||
<td class="border p-2">Total Pendapatan</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalPendapatan ?? 0, 0, ',', '.') }}</td>
|
||||
<!-- Beban -->
|
||||
<tr class="bg-gray-100">
|
||||
<td class="p-2 border border-gray-300 font-bold" colspan="2">Beban</td>
|
||||
</tr>
|
||||
@foreach($beban as $item)
|
||||
<tr class="border-b border-gray-300">
|
||||
<td class="p-2 border border-gray-300 pl-8">{{ ucwords($item['kategori']) }} ({{ $item['kode_akun'] }})</td>
|
||||
<td class="text-right p-2 border border-gray-300">
|
||||
{{ number_format(abs($item['nominal']), 0, ',', '.') }}
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
<tr class="border-b border-gray-300 font-semibold bg-gray-50">
|
||||
<td class="p-2 border border-gray-300">Total Beban</td>
|
||||
<td class="text-right p-2 border border-gray-300">{{ number_format($total_beban, 0, ',', '.') }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- Beban Operasional -->
|
||||
<tr class="bg-gray-100 font-bold">
|
||||
<td colspan="3" class="border p-2">Beban Operasional</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Gaji</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanGaji ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Sewa</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanSewa ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Utilitas</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanUtilitas ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Penyusutan</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanPenyusutan ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Supplies</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanSupplies ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Iklan</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanIklan ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr class="font-bold bg-gray-50">
|
||||
<td class="border p-2">Total Beban Operasional</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalBebanOperasional ?? 0, 0, ',', '.') }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- Beban Non-Operasional -->
|
||||
<tr class="bg-gray-100 font-bold">
|
||||
<td colspan="3" class="border p-2">Beban Non-Operasional</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Bunga</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanBunga ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border p-2 pl-4">Beban Lain</td>
|
||||
<td class="border p-2 text-right">{{ number_format($bebanLain ?? 0, 0, ',', '.') }}</td>
|
||||
<td class="border p-2"></td>
|
||||
</tr>
|
||||
<tr class="font-bold bg-gray-50">
|
||||
<td class="border p-2">Total Beban Non-Operasional</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalBebanNonOperasional ?? 0, 0, ',', '.') }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- Total Seluruh Beban -->
|
||||
<tr class="font-bold bg-red-50">
|
||||
<td class="border p-2">Total Beban</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalBeban ?? 0, 0, ',', '.') }}</td>
|
||||
</tr>
|
||||
|
||||
<!-- Total Laba/Rugi -->
|
||||
<tr class="font-bold text-lg {{ $totalLabaRugi >= 0 ? 'bg-green-100' : 'bg-red-100' }}">
|
||||
<td class="border p-2">Total Laba/Rugi</td>
|
||||
<td class="border p-2"></td>
|
||||
<td class="border p-2 text-right">{{ number_format($totalLabaRugi ?? 0, 0, ',', '.') }}</td>
|
||||
<!-- Laba/Rugi -->
|
||||
<tr class="bg-purple-100">
|
||||
<td class="p-2 border border-gray-300 font-bold">Laba/Rugi Bersih</td>
|
||||
<td class="text-right p-2 border border-gray-300 font-bold">
|
||||
{{ number_format(-($total_pendapatan) - $total_beban, 0, ',', '.') }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>@yield('title') - Sistem Laporan Keuangan</title>
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<style>
|
||||
body {
|
||||
background-color: #f8f9fa;
|
||||
padding-top: 20px;
|
||||
}
|
||||
.card {
|
||||
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
}
|
||||
.table td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary mb-4">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="#">Sistem Laporan Keuangan</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/labarugi">Laporan Laba Rugi</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
@yield('content')
|
||||
</main>
|
||||
|
||||
<!-- Bootstrap JS -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -53,6 +53,7 @@
|
|||
Route::get('laporan/export-pdf', [LaporanController::class, 'exportPDF'])->name('laporan.export-pdf');
|
||||
Route::delete('/laporan/{id}', [LaporanController::class, 'destroy'])->name('laporan.destroy');
|
||||
Route::get('/home', [HomeController::class, 'index'])->name('home');
|
||||
Route::get('/home/filter', [HomeController::class, 'filter'])->name('home.filter');
|
||||
Route::get('/User', [UserController::class, 'index'])->name('User.index');
|
||||
Route::get('/User/create', [UserController::class, 'create'])->name('User.create');
|
||||
Route::post('/User', [UserController::class, 'store'])->name('User.store');
|
||||
|
@ -70,5 +71,6 @@
|
|||
Route::get('/rekening/export-excel', [RekeningController::class, 'exportExcel'])->name('rekening.export-excel');
|
||||
Route::get('/rekening/export-pdf', [RekeningController::class, 'exportPDF'])->name('rekening.export-pdf');
|
||||
Route::resource('neracasaldo', NeracasaldoController::class);
|
||||
Route::get('/laporan-laba-rugi', [LabarugiController::class, 'index'])->name('labarugi.index');
|
||||
Route::get('/labarugi', [LabarugiController::class, 'index'])->name('labarugi.index');
|
||||
Route::get('/labarugi/filter', [LabarugiController::class, 'filter'])->name('labarugi.filter');
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue