@php
/*
|----------------------------------------------------------------------
| TALLY-STYLE PROFIT & LOSS REPORT
| Left = Expenses
| Right = Incomes
|----------------------------------------------------------------------
*/
function renderSide(array $groups, string $fromDate, string $toDate): string
{
$ledgerBase = route('account-ledger-report.index');
$html = '';
static $grpId = 1000; // Offset to avoid clash with other potential counters
foreach ($groups as $grp) {
if (!is_array($grp) || !isset($grp['group_name'])) continue;
$html .= '
';
$html .= '| '
. e($grp['group_name']) . ' | ';
$html .= ''
. number_format($grp['amount'], 2) . ' | ';
$html .= '
';
foreach ($grp as $L3 => $aGrp) {
if (!is_array($aGrp) || !isset($aGrp['a_group_name'])) continue;
if (round(abs($aGrp['amount'] ?? 0), 2) == 0) continue;
$ledgers = array_filter($aGrp, fn($v) =>
is_array($v) && isset($v['ledger_account']) && round(abs($v['amount'] ?? 0), 2) != 0
);
$grpId++;
$hasChildren = count($ledgers) > 0;
$chevron = $hasChildren ? '' : '';
$rowClass = $hasChildren ? 'bs-toggle bs-collapsed' : '';
$html .= '';
$html .= '| ' . $chevron . e($aGrp['a_group_name']) . ' | ';
$html .= ''
. number_format($aGrp['amount'], 2) . ' | ';
$html .= '
';
foreach ($ledgers as $ledger) {
$ledId = $ledger['ledger_id'] ?? null;
$ledName = $ledger['ledger_account'];
$ledAmt = $ledger['amount'];
$link = $ledId
? $ledgerBase . '?ledger_id=' . $ledId
. '&from_date=' . urlencode($fromDate)
. '&to_date=' . urlencode($toDate)
: '#';
$html .= '';
$html .= '| '
. ''
. e($ledName) . ' | ';
$html .= ''
. number_format($ledAmt, 2) . ' | ';
$html .= '
';
}
}
}
return $html;
}
@endphp
Profit & Loss A/c
For the period: {{ date('d-M-Y', strtotime($from_date)) }} to {{ date('d-M-Y', strtotime($to_date)) }}
{{-- ============ LEFT SIDE: Expenses ============ --}}
{{-- TRADING: Opening Stock --}}
|
Opening Stock
|
{{ number_format($data['openingStock'], 2) }}
|
{{-- TRADING: Direct Expenses --}}
{!! renderSide($data['tradingExpenses'], $from_date, $to_date) !!}
{{-- P&L: Indirect Expenses --}}
{!! renderSide($data['pAndLExpenses'], $from_date, $to_date) !!}
{{-- P&L: Net Profit --}}
@if($data['netProfit'] > 0)
| Net Profit |
{{ number_format($data['netProfit'], 2) }} |
@endif
| Total |
{{ number_format($data['finalExpTotal'], 2) }} |
{{-- ============ RIGHT SIDE: Incomes ============ --}}
{{-- TRADING: Closing Stock --}}
|
Closing Stock
|
{{ number_format($data['closingStock'], 2) }}
|
{{-- TRADING: Direct Incomes (Sales etc) --}}
{!! renderSide($data['tradingIncome'], $from_date, $to_date) !!}
{{-- P&L: Indirect Incomes --}}
{!! renderSide($data['pAndLIncome'], $from_date, $to_date) !!}
{{-- P&L: Net Loss --}}
@if($data['netLoss'] > 0)
| Net Loss |
{{ number_format($data['netLoss'], 2) }} |
@endif
| Total |
{{ number_format($data['finalIncTotal'], 2) }} |