update tgl 20 april

This commit is contained in:
whywdd 2025-04-20 03:39:21 +07:00
parent 3c5f96f420
commit 70aadac250
8 changed files with 588 additions and 454 deletions

View File

@ -6,83 +6,235 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
class HomeController extends Controller class HomeController extends Controller
{ {
public function index() private function getKodeAkun($kategori)
{ {
// Get current month data $kategori = trim(strtolower($kategori));
$currentMonth = Carbon::now()->month;
$currentYear = Carbon::now()->year;
// Calculate total saldo // Pendapatan Operasional (41)
$totalSaldo = HomeModel::selectRaw('SUM(uang_masuk - uang_keluar) as saldo')->first()->saldo ?? 0; if (str_contains($kategori, 'pendapatan penjualan')) return '241001';
if (str_contains($kategori, 'pendapatan jasa')) return '241002';
// Calculate total uang masuk dan uang keluar // Pendapatan Non-Operasional (42)
$totalUangMasuk = HomeModel::sum('uang_masuk'); if (str_contains($kategori, 'pendapatan bunga')) return '242001';
$totalUangKeluar = HomeModel::sum('uang_keluar'); 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 // Beban Operasional (51)
$currentMonthUangMasuk = HomeModel::whereMonth('Tanggal', $currentMonth) if (str_contains($kategori, 'beban gaji')) return '251001';
->whereYear('Tanggal', $currentYear) if (str_contains($kategori, 'beban sewa')) return '251002';
->sum('uang_masuk'); 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) // Beban Non-Operasional (52)
->whereYear('Tanggal', $currentYear) if (str_contains($kategori, 'beban bunga')) return '252001';
->sum('uang_keluar'); if (str_contains($kategori, 'beban lain')) return '252002';
// Calculate profit/loss return null;
$labaRugiTotal = $totalUangMasuk - $totalUangKeluar; }
$labaRugiBulanIni = $currentMonthUangMasuk - $currentMonthUangKeluar;
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 // Get monthly totals for chart
$monthlyTotals = HomeModel::selectRaw(' $monthlyTotals = DB::table('laporan_transaksis')
DATE_FORMAT(Tanggal, "%Y-%m") as periode, ->select(
SUM(uang_masuk) as total_debit, DB::raw('DATE_FORMAT(Tanggal, "%Y-%m") as periode'),
SUM(uang_keluar) as total_kredit, 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'),
SUM(uang_masuk - uang_keluar) as laba_rugi 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') ->groupBy('periode')
->orderBy('periode') ->orderBy('periode')
->get(); ->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 // Get recent transactions
$recentTransactions = HomeModel::orderBy('Tanggal', 'desc') $recentTransactions = DB::table('laporan_transaksis')
->orderBy('Tanggal', 'desc')
->limit(10) ->limit(10)
->get(); ->get();
// Calculate month-over-month growth // Debug log untuk memeriksa nilai
$lastMonthTotal = HomeModel::whereMonth('Tanggal', Carbon::now()->subMonth()->month) Log::info("Total Uang Masuk: " . $totalUangMasuk);
->whereYear('Tanggal', Carbon::now()->subMonth()->year) Log::info("Total Uang Keluar: " . $totalUangKeluar);
->sum('uang_masuk'); Log::info("Total Saldo: " . $totalSaldo);
Log::info("Laba Rugi Total: " . $labaRugiTotal);
$growthPercentage = $lastMonthTotal != 0 Log::info("Laba Rugi Bulan Ini: " . $labaRugiBulanIni);
? (($currentMonthUangMasuk - $lastMonthTotal) / $lastMonthTotal) * 100
: 0;
return view('home', compact( return view('home', compact(
'totalSaldo', 'startDate',
'endDate',
'totalUangMasuk', 'totalUangMasuk',
'totalUangKeluar', 'totalUangKeluar',
'currentMonthUangMasuk', 'currentMonthUangMasuk',
'currentMonthUangKeluar', 'currentMonthUangKeluar',
'totalSaldo',
'growthPercentage',
'labaRugiTotal', 'labaRugiTotal',
'labaRugiBulanIni', 'labaRugiBulanIni',
'monthlyTotals', 'monthlyTotals',
'categoryTotals', 'categoryTotals',
'recentTransactions', '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);
} }
} }

View File

@ -2,138 +2,136 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\LabarugiModel;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\LabarugiModel;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class LabarugiController extends Controller 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) 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')); $startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->endOfMonth()->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 try {
$sumUangMasuk = "COALESCE(uang_masuk, 0) + COALESCE(uang_masuk2, 0) + COALESCE(uang_masuk3, 0) + COALESCE(uang_masuk4, 0) + COALESCE(uang_masuk5, 0)"; // Ambil semua transaksi dalam periode
$transaksis = DB::table('laporan_transaksis')
// 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')
->whereBetween('Tanggal', [$startDate, $endDate]) ->whereBetween('Tanggal', [$startDate, $endDate])
->select(DB::raw("SUM($sumUangMasuk) as total")) ->get();
->value('total') ?? 0;
$pendapatanJasa = $model->where('kode', '241002') foreach ($transaksis as $transaksi) {
->whereBetween('Tanggal', [$startDate, $endDate]) // Proses kategori1
->select(DB::raw("SUM($sumUangMasuk) as total")) if (!empty($transaksi->kategori)) {
->value('total') ?? 0; $this->prosesKategori(
$transaksi->kategori,
$transaksi->uang_masuk ?? 0,
$transaksi->uang_keluar ?? 0,
$pendapatan,
$beban
);
}
// Mengambil data pendapatan non-operasional (42) // Proses kategori2-5
$pendapatanBunga = $model->where('kode', '242001') for ($i = 2; $i <= 5; $i++) {
->whereBetween('Tanggal', [$startDate, $endDate]) $kategori = $transaksi->{"kategori$i"};
->select(DB::raw("SUM($sumUangMasuk) as total")) if (!empty($kategori)) {
->value('total') ?? 0; $this->prosesKategori(
$kategori,
$transaksi->{"uang_masuk$i"} ?? 0,
$transaksi->{"uang_keluar$i"} ?? 0,
$pendapatan,
$beban
);
}
}
}
$pendapatanSewa = $model->where('kode', '242002') // Hitung total
->whereBetween('Tanggal', [$startDate, $endDate]) $total_pendapatan = array_sum(array_column($pendapatan, 'nominal'));
->select(DB::raw("SUM($sumUangMasuk) as total")) $total_beban = abs(array_sum(array_column($beban, 'nominal')));
->value('total') ?? 0; $laba_rugi = $total_pendapatan - $total_beban;
$pendapatanKomisi = $model->where('kode', '242003') return view('Labarugi', [
->whereBetween('Tanggal', [$startDate, $endDate]) 'startDate' => $startDate,
->select(DB::raw("SUM($sumUangMasuk) as total")) 'endDate' => $endDate,
->value('total') ?? 0; 'pendapatan' => $pendapatan,
'beban' => $beban,
'total_pendapatan' => $total_pendapatan,
'total_beban' => $total_beban,
'laba_rugi' => $laba_rugi
]);
$pendapatanLain = $model->where('kode', '242004') } catch (\Exception $e) {
->whereBetween('Tanggal', [$startDate, $endDate]) Log::error("Error in LabarugiController: " . $e->getMessage());
->select(DB::raw("SUM($sumUangMasuk) as total")) throw $e;
->value('total') ?? 0; }
}
// Mengambil data beban operasional (51) private function prosesKategori($kategori, $uang_masuk, $uang_keluar, &$pendapatan, &$beban)
$bebanGaji = $model->where('kode', '251001') {
->whereBetween('Tanggal', [$startDate, $endDate]) $kodeAkun = $this->getKodeAkun($kategori);
->select(DB::raw("SUM($sumUangKeluar) as total")) if ($kodeAkun) {
->value('total') ?? 0; $nominal = $uang_masuk - $uang_keluar;
$data = [
'kategori' => $kategori,
'kode_akun' => $kodeAkun,
'nominal' => $nominal
];
$bebanSewa = $model->where('kode', '251002') if (str_starts_with($kodeAkun, '24')) {
->whereBetween('Tanggal', [$startDate, $endDate]) if (isset($pendapatan[$kategori])) {
->select(DB::raw("SUM($sumUangKeluar) as total")) $pendapatan[$kategori]['nominal'] += $nominal;
->value('total') ?? 0; } 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') public function filter(Request $request)
->whereBetween('Tanggal', [$startDate, $endDate]) {
->select(DB::raw("SUM($sumUangKeluar) as total")) return $this->index($request);
->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'
));
} }
} }

View File

@ -9,81 +9,17 @@ class LabarugiModel extends Model
protected $table = 'laporan_transaksis'; protected $table = 'laporan_transaksis';
protected $guarded = ['id']; protected $guarded = ['id'];
// Konstanta untuk kode akun pendapatan (uang masuk) protected $casts = [
const KODE_PENDAPATAN = [ 'Tanggal' => 'date',
'OPERASIONAL' => [ 'uang_masuk' => 'decimal:2',
'241001' => 'pendapatan penjualan', 'uang_masuk2' => 'decimal:2',
'241002' => 'pendapatan jasa' 'uang_masuk3' => 'decimal:2',
], 'uang_masuk4' => 'decimal:2',
'NON_OPERASIONAL' => [ 'uang_masuk5' => 'decimal:2',
'242001' => 'pendapatan bunga', 'uang_keluar' => 'decimal:2',
'242002' => 'pendapatan sewa', 'uang_keluar2' => 'decimal:2',
'242003' => 'pendapatan komisi', 'uang_keluar3' => 'decimal:2',
'242004' => 'pendapatan lain' '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'])
));
}
} }

View File

@ -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');
}
};

View File

@ -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"> <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 --> <!-- 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> <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"> <form action="{{ route('home.filter') }}" method="GET" class="flex flex-wrap items-center gap-4 sm:ml-auto">
<option value="daily">Harian</option> <div class="flex items-center gap-2">
<option value="weekly">Mingguan</option> <span class="text-sm text-gray-600">Tanggal Awal</span>
<option value="monthly" selected>Bulanan</option> <input type="date" name="start_date" class="form-input box bg-white border border-indigo-200 rounded-lg text-gray-600" value="{{ $startDate }}">
<option value="yearly">Tahunan</option> </div>
</select> <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> </div>
<!-- Main Metrics --> <!-- Main Metrics -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6"> <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
<!-- Total Saldo Card --> <!-- 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="flex items-center">
<div class="w-12 h-12 rounded-lg bg-indigo-100 flex items-center justify-center me-3"> <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"> <svg class="w-6 h-6 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@ -39,9 +46,9 @@
</p> </p>
</div> </div>
</div> </div>
</div> </div> -->
<!-- Total Debit Card --> <!-- Total Pendapatan 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="flex items-center">
<div class="w-12 h-12 rounded-lg bg-green-100 flex items-center justify-center me-3"> <div class="w-12 h-12 rounded-lg bg-green-100 flex items-center justify-center me-3">
@ -50,14 +57,14 @@
</svg> </svg>
</div> </div>
<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> <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> </div>
</div> </div>
<!-- Total Kredit Card --> <!-- Total Beban 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="flex items-center">
<div class="w-12 h-12 rounded-lg bg-red-100 flex items-center justify-center me-3"> <div class="w-12 h-12 rounded-lg bg-red-100 flex items-center justify-center me-3">
@ -66,9 +73,52 @@
</svg> </svg>
</div> </div>
<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> <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> </div>
</div> </div>
@ -76,9 +126,9 @@
<!-- Profit/Loss Section --> <!-- Profit/Loss Section -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6"> <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"> <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="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"> <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"> <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' }}"> <h3 class="text-2xl font-bold {{ $labaRugiTotal >= 0 ? 'text-green-600' : 'text-red-600' }}">
Rp {{ number_format(abs($labaRugiTotal), 0, ',', '.') }} Rp {{ number_format(abs($labaRugiTotal), 0, ',', '.') }}
</h3> </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> </div>
</div> </div>
<!-- Current Month Balance Card --> <!-- Laba/Rugi Bulan Ini Card -->
<div class="bg-white rounded-xl p-6 shadow-sm"> <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="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"> <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"> <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' }}"> <h3 class="text-2xl font-bold {{ $labaRugiBulanIni >= 0 ? 'text-green-600' : 'text-red-600' }}">
Rp {{ number_format(abs($labaRugiBulanIni), 0, ',', '.') }} Rp {{ number_format(abs($labaRugiBulanIni), 0, ',', '.') }}
</h3> </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> </div>
</div> </div>
@ -117,7 +167,7 @@
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6"> <div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
<!-- Bar Chart --> <!-- Bar Chart -->
<div class="bg-white p-6 rounded-xl shadow-sm"> <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"> <div class="chart-container">
<canvas id="financial-trend-chart"></canvas> <canvas id="financial-trend-chart"></canvas>
</div> </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">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">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">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">Pendapatan</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">Beban</th>
</tr> </tr>
</thead> </thead>
<tbody class="bg-white divide-y divide-gray-200"> <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 src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { 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 // Format number to Rupiah
function formatRupiah(number) { function formatRupiah(number) {
return 'Rp ' + number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "."); return 'Rp ' + number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
@ -199,38 +241,37 @@ function formatRupiah(number) {
try { try {
// Financial Trend Chart // Financial Trend Chart
const trendCtx = document.getElementById('financial-trend-chart'); const trendCtx = document.getElementById('financial-trend-chart');
console.log('Trend Chart Element:', trendCtx);
if (trendCtx) { if (trendCtx) {
const monthlyData = @json($monthlyTotals);
const labels = monthlyData.map(item => { const labels = monthlyData.map(item => {
const [year, month] = item.periode.split('-'); const [year, month] = item.periode.split('-');
const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des']; const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des'];
return `${monthNames[parseInt(month)-1]} ${year}`; return `${monthNames[parseInt(month)-1]} ${year}`;
}); });
const debitData = monthlyData.map(item => parseFloat(item.total_debit) || 0); const pendapatanData = monthlyData.map(item => parseFloat(item.total_debit) || 0);
const kreditData = monthlyData.map(item => parseFloat(item.total_kredit) || 0); const bebanData = monthlyData.map(item => parseFloat(item.total_kredit) || 0);
new Chart(trendCtx, { new Chart(trendCtx, {
type: 'bar', type: 'bar',
data: { data: {
labels: labels, labels: labels,
datasets: [{ datasets: [{
label: 'Debit', label: 'Pendapatan',
data: debitData, data: pendapatanData,
backgroundColor: 'rgba(34, 197, 94, 0.5)', backgroundColor: 'rgba(34, 197, 94, 0.5)',
borderColor: 'rgb(34, 197, 94)', borderColor: 'rgb(34, 197, 94)',
borderWidth: 1, borderWidth: 1,
order: 2 order: 2
}, { }, {
label: 'Kredit', label: 'Beban',
data: kreditData, data: bebanData,
backgroundColor: 'rgba(239, 68, 68, 0.5)', backgroundColor: 'rgba(239, 68, 68, 0.5)',
borderColor: 'rgb(239, 68, 68)', borderColor: 'rgb(239, 68, 68)',
borderWidth: 1, borderWidth: 1,
order: 2 order: 2
}, { }, {
label: 'Selisih', label: 'Laba/Rugi',
data: debitData.map((debit, index) => debit - kreditData[index]), data: pendapatanData.map((pendapatan, index) => pendapatan - bebanData[index]),
type: 'line', type: 'line',
borderColor: 'rgb(59, 130, 246)', borderColor: 'rgb(59, 130, 246)',
borderWidth: 2, borderWidth: 2,
@ -270,26 +311,25 @@ function formatRupiah(number) {
// Category Distribution Chart // Category Distribution Chart
const categoryCtx = document.getElementById('category-distribution-chart'); const categoryCtx = document.getElementById('category-distribution-chart');
console.log('Category Chart Element:', categoryCtx);
if (categoryCtx) { if (categoryCtx) {
const categoryData = @json($categoryTotals);
const categories = categoryData.map(item => item.kategori); const categories = categoryData.map(item => item.kategori);
const totalDebitPerCategory = categoryData.map(item => parseFloat(item.total_debit) || 0); const pendapatanPerKategori = categoryData.map(item => parseFloat(item.total_debit) || 0);
const totalKreditPerCategory = categoryData.map(item => parseFloat(item.total_kredit) || 0); const bebanPerKategori = categoryData.map(item => parseFloat(item.total_kredit) || 0);
new Chart(categoryCtx, { new Chart(categoryCtx, {
type: 'bar', type: 'bar',
data: { data: {
labels: categories, labels: categories,
datasets: [{ datasets: [{
label: 'Debit', label: 'Pendapatan',
data: totalDebitPerCategory, data: pendapatanPerKategori,
backgroundColor: 'rgba(34, 197, 94, 0.5)', backgroundColor: 'rgba(34, 197, 94, 0.5)',
borderColor: 'rgb(34, 197, 94)', borderColor: 'rgb(34, 197, 94)',
borderWidth: 1 borderWidth: 1
}, { }, {
label: 'Kredit', label: 'Beban',
data: totalKreditPerCategory, data: bebanPerKategori,
backgroundColor: 'rgba(239, 68, 68, 0.5)', backgroundColor: 'rgba(239, 68, 68, 0.5)',
borderColor: 'rgb(239, 68, 68)', borderColor: 'rgb(239, 68, 68)',
borderWidth: 1 borderWidth: 1

View File

@ -9,166 +9,91 @@
<!-- CSRF Token --> <!-- CSRF Token -->
<meta name="csrf-token" content="{{ 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="box p-4 intro-y mt-5">
<div class="intro-y"> <div class="intro-y">
<!-- Header --> <!-- Header -->
<div class="mb-4 bg-blue-600 text-white p-4 rounded-lg shadow-md"> <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> <h1 class="text-2xl font-bold">Laporan Laba Rugi</h1>
<h2 class="text-xl font-semibold text-center mt-2">Laporan Laba Rugi</h2> <p class="text-sm mt-1">PT EXAMPLE</p>
<p class="text-center">Periode: {{ date('d F Y', strtotime($startDate)) }} - {{ date('d F Y', strtotime($endDate)) }}</p> <p class="text-sm">Periode: {{ date('F Y', strtotime($startDate)) }}</p>
</div> </div>
<!-- Filter Tanggal --> <div class="p-4">
<!-- <div class="mb-4"> <!-- Header Controls -->
<form method="GET" action="{{ url('/laporan-laba-rugi') }}" class="flex gap-4"> <form action="{{ route('labarugi.filter') }}" method="GET" class="flex items-center gap-4 mb-4">
<div> <div class="flex items-center gap-2">
<label class="block text-sm font-medium text-gray-700">Tanggal Awal</label> <span>Tanggal Awal</span>
<input type="date" name="start_date" value="{{ $startDate }}" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm"> <input type="date" name="start_date" class="border rounded px-2 py-1" value="{{ $startDate }}">
</div> </div>
<div> <div class="flex items-center gap-2">
<label class="block text-sm font-medium text-gray-700">Tanggal Akhir</label> <span>Tanggal Akhir</span>
<input type="date" name="end_date" value="{{ $endDate }}" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm"> <input type="date" name="end_date" class="border rounded px-2 py-1" value="{{ $endDate }}">
</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> </div>
<button type="submit" class="bg-blue-500 text-white px-4 py-1 rounded">Filter</button>
</form> </form>
</div> -->
<!-- Tabel Laporan Laba Rugi --> <!-- Table -->
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="min-w-full bg-white border-collapse"> <table class="w-full border-collapse border border-gray-300">
<!-- Pendapatan Operasional --> <tr class="bg-purple-600 text-white">
<tr class="bg-gray-100 font-bold"> <th class="text-left p-2 border border-gray-300">Keterangan</th>
<td colspan="3" class="border p-2">Pendapatan Operasional</td> <th class="text-right p-2 border border-gray-300">Nominal</th>
</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>
</tr> </tr>
<!-- Pendapatan Non-Operasional --> <!-- Pendapatan -->
<tr class="bg-gray-100 font-bold"> <tr class="bg-gray-100">
<td colspan="3" class="border p-2">Pendapatan Non-Operasional</td> <td class="p-2 border border-gray-300 font-bold" colspan="2">Pendapatan</td>
</tr> </tr>
<tr> @foreach($pendapatan as $item)
<td class="border p-2 pl-4">Pendapatan Bunga</td> <tr class="border-b border-gray-300">
<td class="border p-2 text-right">{{ number_format($pendapatanBunga ?? 0, 0, ',', '.') }}</td> <td class="p-2 border border-gray-300 pl-8">{{ ucwords($item['kategori']) }} ({{ $item['kode_akun'] }})</td>
<td class="border p-2"></td> <td class="text-right p-2 border border-gray-300">
{{ number_format(abs($item['nominal']), 0, ',', '.') }}
</td>
</tr> </tr>
<tr> @endforeach
<td class="border p-2 pl-4">Pendapatan Sewa</td> <tr class="border-b border-gray-300 font-semibold bg-gray-50">
<td class="border p-2 text-right">{{ number_format($pendapatanSewa ?? 0, 0, ',', '.') }}</td> <td class="p-2 border border-gray-300">Total Pendapatan</td>
<td class="border p-2"></td> <td class="text-right p-2 border border-gray-300">{{ number_format(abs($total_pendapatan), 0, ',', '.') }}</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>
</tr> </tr>
<!-- Total Seluruh Pendapatan --> <!-- Beban -->
<tr class="font-bold bg-blue-50"> <tr class="bg-gray-100">
<td class="border p-2">Total Pendapatan</td> <td class="p-2 border border-gray-300 font-bold" colspan="2">Beban</td>
<td class="border p-2"></td> </tr>
<td class="border p-2 text-right">{{ number_format($totalPendapatan ?? 0, 0, ',', '.') }}</td> @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> </tr>
<!-- Beban Operasional --> <!-- Laba/Rugi -->
<tr class="bg-gray-100 font-bold"> <tr class="bg-purple-100">
<td colspan="3" class="border p-2">Beban Operasional</td> <td class="p-2 border border-gray-300 font-bold">Laba/Rugi Bersih</td>
</tr> <td class="text-right p-2 border border-gray-300 font-bold">
<tr> {{ number_format(-($total_pendapatan) - $total_beban, 0, ',', '.') }}
<td class="border p-2 pl-4">Beban Gaji</td> </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>
</tr> </tr>
</table> </table>
</div> </div>

View File

@ -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>

View File

@ -53,6 +53,7 @@
Route::get('laporan/export-pdf', [LaporanController::class, 'exportPDF'])->name('laporan.export-pdf'); Route::get('laporan/export-pdf', [LaporanController::class, 'exportPDF'])->name('laporan.export-pdf');
Route::delete('/laporan/{id}', [LaporanController::class, 'destroy'])->name('laporan.destroy'); Route::delete('/laporan/{id}', [LaporanController::class, 'destroy'])->name('laporan.destroy');
Route::get('/home', [HomeController::class, 'index'])->name('home'); 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', [UserController::class, 'index'])->name('User.index');
Route::get('/User/create', [UserController::class, 'create'])->name('User.create'); Route::get('/User/create', [UserController::class, 'create'])->name('User.create');
Route::post('/User', [UserController::class, 'store'])->name('User.store'); 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-excel', [RekeningController::class, 'exportExcel'])->name('rekening.export-excel');
Route::get('/rekening/export-pdf', [RekeningController::class, 'exportPDF'])->name('rekening.export-pdf'); Route::get('/rekening/export-pdf', [RekeningController::class, 'exportPDF'])->name('rekening.export-pdf');
Route::resource('neracasaldo', NeracasaldoController::class); 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');
}); });