@extends('layouts.app') @section('content') @php $chartLabels = []; $chartBiayaData = []; $chartProfitData = []; foreach($proyeks as $proyek) { // [PERBAIKAN] Pastikan data untuk chart juga float $totalBiaya = (float) ($proyek->total_pengeluaran ?? 0) + (float) ($proyek->total_upah ?? 0); $profitLoss = (float) ($proyek->nilai_kontrak ?? 0) - $totalBiaya; // Hanya masukkan ke chart jika ada datanya if ($totalBiaya > 0 || $profitLoss !== 0) { $chartLabels[] = $proyek->nama_proyek; $chartBiayaData[] = $totalBiaya; $chartProfitData[] = $profitLoss; } } @endphp
{{-- Bagian Judul Halaman --}}

Laporan Proyek

Dokumentasi dan ringkasan finansial dari seluruh proyek.

@if (session('error')) @endif {{-- Bagian Filter --}}
{{-- Filter Proyek --}}
{{-- Filter Status --}}
{{-- Filter Periode (Tanggal) --}}
-
{{-- Tombol Aksi --}}
Reset Filter
{{-- Bagian Summary Cards --}}

Total Nilai Kontrak

Rp. {{ number_format($summary['total_nilai_kontrak'] ?? 0, 0, ',', '.') }}

Total Biaya Proyek

Rp. {{ number_format($summary['total_biaya_proyek'] ?? 0, 0, ',', '.') }}

Estimasi Profit / Loss

Rp. {{ number_format($summary['total_profit_loss'] ?? 0, 0, ',', '.') }}

{{-- Bagian Chart --}}

Distribusi Biaya per Proyek

Profit / Loss per Proyek

{{-- Bagian Tabel Laporan --}}
@forelse($proyeks as $proyek) @php // [PERBAIKAN] Paksa (cast) data ke float untuk matematika JS $totalPengeluaran = (float) ($proyek->total_pengeluaran ?? 0); $totalUpah = (float) ($proyek->total_upah ?? 0); $nilaiKontrak = (float) ($proyek->nilai_kontrak ?? 0); // Kalkulasi ini (sekarang) sudah benar $totalBiaya = $totalPengeluaran + $totalUpah; $profitLoss = $nilaiKontrak - $totalBiaya; // [PERBAIKAN] Buat objek data manual untuk modal, pastikan semua float // [MODIFIKASI] Ambil relasi tukangs dengan kolom yang benar $modalData = [ 'nama_proyek' => $proyek->nama_proyek, 'klien' => $proyek->klien, 'nilai_kontrak' => (float) $nilaiKontrak, 'total_pengeluaran' => (float) $totalPengeluaran, 'total_upah' => (float) $totalUpah, 'pengeluarans' => $proyek->pengeluarans, // [PENTING] Kirim data tukangs yang relevan ke modal 'tukangs' => $proyek->tukangs->map(function($t) { return [ 'id_tukang' => $t->id_tukang, 'nama_mandor' => $t->nama_mandor, 'tanggal_jatuh_tempo' => $t->tanggal_jatuh_tempo ? $t->tanggal_jatuh_tempo->format('Y-m-d') : null, 'total_pembayaran' => (float) $t->total_pembayaran, // pastikan float 'status_pembayaran' => $t->status_pembayaran ]; }) ]; @endphp {{-- Baris Data Utama (Tidak Berubah) --}} {{-- Baris Tombol Aksi --}} @empty @endforelse
Nama Proyek Status Nilai Kontrak Total Biaya Profit/Loss
{{ $proyek->nama_proyek ?? 'Nama Proyek Tidak Tersedia' }} @php $statusClass = ''; switch ($proyek->status ?? '') { case 'Selesai': $statusClass = 'bg-green-100 text-green-800'; break; case 'Sedang Berjalan': $statusClass = 'bg-yellow-100 text-yellow-800'; break; default: $statusClass = 'bg-gray-100 text-gray-800'; } @endphp {{ $proyek->status ?? 'Status Tidak Diketahui' }} Rp. {{ number_format($nilaiKontrak, 0, ',', '.') }} Rp. {{ number_format($totalBiaya, 0, ',', '.') }} Rp. {{ number_format($profitLoss, 0, ',', '.') }}

Opsi Laporan

{{-- [PERBAIKAN] Menggunakan json_encode($modalData) --}} Eksport CSV Eksport PDF

Tidak ada data proyek.

Silakan ubah filter atau tambahkan data proyek baru.

@endsection @push('scripts') {{-- Ini adalah CSS untuk flatpickr --}} {{-- Ini adalah JS untuk flatpickr --}} {{-- Ini adalah JS untuk Chart.js --}} @endpush