{{-- Partial: Periode (Tutup Buku) Tab --}} @php $id_perusahaan = session('id_perusahaan') ?? 1; $allBanks = DB::table('mst_bank')->where('id_perusahaan', $id_perusahaan)->get(); $bankIds = $allBanks->pluck('id_bank')->toArray(); $tutupBukuPeriodes = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->select('periode', 'isactive') ->groupBy('periode', 'isactive') ->orderBy('periode', 'desc') ->get(); $periodesTransaksi = DB::table('trs_header_transaksi as h') ->join('trs_detail_transaksi as d', function ($join) { $join->on('h.id_header', '=', 'd.id_header')->on('h.id_perusahaan', '=', 'd.id_perusahaan'); }) ->where('h.id_perusahaan', $id_perusahaan) ->whereNotNull('h.periode') ->select('h.periode') ->distinct() ->pluck('h.periode') ->toArray(); // Cari periode paling awal (baseline) dari database $earliestPeriodeDb = DB::table('trs_tutup_buku')->where('id_perusahaan', $id_perusahaan)->min('periode'); $earliestPeriodeVal = $earliestPeriodeDb ?: '2025-11'; $allPeriodes = []; //$startDate = \Carbon\Carbon::createFromFormat('Y-m', $earliestPeriodeVal); //$endDate = \Carbon\Carbon::now(); // while ($startDate->lte($endDate)) { //$allPeriodes[] = $startDate->format('Y-m'); // $startDate->addMonth(); // } $startDate = \Carbon\Carbon::createFromFormat('Y-m-d', $earliestPeriodeVal . '-01')->startOfMonth(); $endDate = \Carbon\Carbon::now()->startOfMonth(); while ($startDate->lte($endDate)) { $allPeriodes[] = $startDate->format('Y-m'); $startDate->addMonthNoOverflow(); } $allPeriodes = collect($allPeriodes) ->merge($tutupBukuPeriodes->pluck('periode')->toArray()) ->merge($periodesTransaksi) ->filter(fn($p) => !empty($p)) ->unique() ->sortDesc() ->values(); $earliestPeriode = $allPeriodes->sort()->first(); // Find earliest open period $earliestOpenPeriode = null; foreach ($allPeriodes->sort() as $per) { $isClosed = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('periode', $per) ->where('isactive', '0') ->exists(); if (!$isClosed) { $earliestOpenPeriode = $per; break; } } $periodeRows = []; foreach ($allPeriodes as $per) { $isClosed = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('periode', $per) ->where('isactive', '0') ->exists(); $jmlAdj = DB::table('trs_header_transaksi') ->where('id_perusahaan', $id_perusahaan) ->where('periode', $per) ->where('tipe', 'adjustment') ->count(); $jmlMut = DB::table('trs_header_transaksi') ->where('id_perusahaan', $id_perusahaan) ->where('periode', $per) ->where('tipe', 'mutasi') ->count(); $totalKas = 0; $totalBank = 0; $hideBalance = $earliestOpenPeriode && $per > $earliestOpenPeriode; if (!$hideBalance) { foreach ($allBanks as $bank) { // Check if this bank has a baseline record in a period < $per. $hasPrior = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('id_bank', $bank->id_bank) ->where('periode', '<', $per) ->exists(); if (!$hasPrior) { // Baseline period: get the stored saldo from database $tbBank = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('id_bank', $bank->id_bank) ->where('periode', $per) ->first(); $saldo = $tbBank ? $tbBank->saldo : 0; } else { if ($isClosed) { $tbBank = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('id_bank', $bank->id_bank) ->where('periode', $per) ->first(); $saldo = $tbBank ? $tbBank->saldo : 0; } else { //$prevPer = \Carbon\Carbon::createFromFormat('Y-m', $per)->subMonth()->format('Y-m'); $prevPer = \Carbon\Carbon::createFromFormat('Y-m-d', $per . '-01') ->subMonthNoOverflow() ->format('Y-m'); $prevTb = DB::table('trs_tutup_buku') ->where('id_perusahaan', $id_perusahaan) ->where('id_bank', $bank->id_bank) ->where('periode', $prevPer) ->where('isactive', '0') ->first(); $saldo_awal = $prevTb ? $prevTb->saldo : 0; $mutasi = DB::table('trs_detail_transaksi as d') ->join('trs_header_transaksi as h', function ($join) { $join ->on('d.id_header', '=', 'h.id_header') ->on('d.id_perusahaan', '=', 'h.id_perusahaan'); }) ->where('d.id_perusahaan', $id_perusahaan) ->where('d.id_coa', $bank->id_coa) ->where('h.periode', $per) ->sum('d.jumlah'); if ($bank->mata_uang !== 'IDR') { $kurs = DB::table('mst_kurs') ->where('id_perusahaan', $id_perusahaan) ->where('kode', $bank->mata_uang) ->where('kode_lawan', 'IDR') ->orderByDesc('id_kurs') ->first(); $nk = $kurs && $kurs->nilai > 0 ? $kurs->nilai : 1; $saldo = $saldo_awal + $mutasi / $nk; } else { $saldo = $saldo_awal + $mutasi; } } } $saldoIdr = $saldo; if ($bank->mata_uang !== 'IDR') { $kurs = DB::table('mst_kurs') ->where('id_perusahaan', $id_perusahaan) ->where('kode', $bank->mata_uang) ->where('kode_lawan', 'IDR') ->orderByDesc('id_kurs') ->first(); $nk = $kurs && $kurs->nilai > 0 ? $kurs->nilai : 1; $saldoIdr = $saldo * $nk; } if ($bank->tipe === 'kas') { $totalKas += $saldoIdr; } else { $totalBank += $saldoIdr; } } } $periodeRows[] = (object) [ 'periode' => $per, 'isactive' => $isClosed ? '0' : '1', 'is_earliest' => $per === $earliestPeriode, 'is_closed' => $isClosed, 'jml_adj' => $jmlAdj, 'jml_mut' => $jmlMut, 'saldo_kas' => $totalKas, 'saldo_bank' => $totalBank, 'hide_balance' => $hideBalance, ]; } @endphp
| Periode | Status | Jml Penyesuaian | Jml Mutasi | Total Saldo Kas | Total Saldo Bank | Action |
|---|---|---|---|---|---|---|
| {{ $periodeStr }} ({{ $item->periode }}) | @if ($item->is_closed) Ditutup @else Terbuka @endif | {{ $item->jml_adj }} trx | {{ $item->jml_mut }} trx | @if ($item->hide_balance) - @else Rp {{ number_format($item->saldo_kas, 0, ',', '.') }} @endif | @if ($item->hide_balance) - @else Rp {{ number_format($item->saldo_bank, 0, ',', '.') }} @endif | @if ($item->is_closed && $item->is_earliest) Saldo Awal @elseif($item->is_closed) @else @endif |
| Belum ada data periode. | ||||||