5) { sleep(1); header("Location:" . $WebSite . "login/login_form.php"); exit; } // 에러 표시 설정 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php'; $title_message = '일일 일보'; ?> <?=$title_message?> '; // print_r($accountNames); // echo ''; // 2. 검색 시작일 이전의 계좌별 기초 잔액 계산 (전일이월의 기초값) $runningBalances = []; foreach ($accountNames as $bankbookName) { $initialBalanceSql = "SELECT (SUM(CASE WHEN inoutsep = '수입' OR inoutsep = '최초전월이월' THEN REPLACE(amount, ',', '') ELSE 0 END) - SUM(CASE WHEN inoutsep = '지출' THEN REPLACE(amount, ',', '') ELSE 0 END)) AS balance FROM $tablename WHERE (is_deleted = '0' OR is_deleted IS NULL) AND registDate < :fromdate AND bankbook = :bankbook "; //AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '')"; $initialStmh = $pdo->prepare($initialBalanceSql); $initialStmh->execute([':fromdate' => $fromdate, ':bankbook' => $bankbookName]); $result = $initialStmh->fetch(PDO::FETCH_ASSOC); $runningBalances[$bankbookName] = $result['balance'] ?? 0; } // 3. 기간 내 모든 현금성 거래내역 한번에 조회 후 날짜별로 그룹화 $allTransactionsSql = "SELECT * FROM $tablename WHERE registDate BETWEEN :fromdate AND :todate AND (is_deleted = 0 OR is_deleted IS NULL) ORDER BY registDate ASC, num ASC"; // AND content != '외상매출채권(전자어음)' // AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '') $allTransactionsStmh = $pdo->prepare($allTransactionsSql); $allTransactionsStmh->execute([':fromdate' => $fromdate, ':todate' => $todate]); $allTransactions = $allTransactionsStmh->fetchAll(PDO::FETCH_ASSOC); $dataByDate = []; foreach ($allTransactions as $tx) { $dataByDate[$tx['registDate']][] = $tx; } // 4. 외상매출채권(전자어음) 잔액 계산 - 배서일자 기준으로 수입/지출 구분 $notesReceivableSql = "SELECT SUBSTRING( content_detail, LOCATE('(', content_detail) + 1, LOCATE(')', content_detail) - LOCATE('(', content_detail) - 1 ) AS bill_no, MIN(content_detail) as content_detail, MIN(registDate) as issue_date, MIN(dueDate) as due_date, SUM( CASE WHEN (endorsementDate IS NULL OR endorsementDate = '0000-00-00' OR endorsementDate = '') THEN REPLACE(amount, ',', '') ELSE -REPLACE(amount, ',', '') END ) as outstanding_balance FROM $tablename WHERE (dueDate IS NOT NULL) AND (is_deleted IS NULL OR is_deleted = 0) AND bankbook = '전자어음' GROUP BY bill_no HAVING outstanding_balance > 0 ORDER BY due_date ASC"; $notesStmh = $pdo->query($notesReceivableSql); $notesReceivable = $notesStmh->fetchAll(PDO::FETCH_ASSOC); // // 디버그: 전자어음 수입/지출 상세 데이터 확인 // $debugDetailSql = "SELECT // content_detail, // registDate, // dueDate, // endorsementDate, // amount, // inoutsep, // bankbook, // CASE // WHEN (endorsementDate IS NULL OR endorsementDate = '0000-00-00' OR endorsementDate = '') THEN '수입' // ELSE '지출' // END as calculated_type, // CASE // WHEN (endorsementDate IS NULL OR endorsementDate = '0000-00-00' OR endorsementDate = '') THEN REPLACE(amount, ',', '') // ELSE -REPLACE(amount, ',', '') // END as calculated_amount // FROM $tablename // WHERE bankbook = '전자어음' // AND (dueDate != '0000-00-00' AND dueDate IS NOT NULL AND dueDate != '') // AND (is_deleted IS NULL OR is_deleted = 0) // ORDER BY content_detail, registDate"; // $debugDetailStmh = $pdo->query($debugDetailSql); // $debugDetailData = $debugDetailStmh->fetchAll(PDO::FETCH_ASSOC); // echo '
'; // echo '

디버그: 전자어음 상세 데이터

'; // echo ''; // echo ''; // echo ''; // echo ''; // foreach($debugDetailData as $row) { // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // echo ''; // } // echo '
내용등록일만기일배서일자금액수입/지출계산타입계산금액
' . htmlspecialchars($row['content_detail']) . '' . $row['registDate'] . '' . $row['dueDate'] . '' . $row['endorsementDate'] . '' . $row['amount'] . '' . $row['inoutsep'] . '' . $row['calculated_type'] . '' . $row['calculated_amount'] . '
'; // echo '
'; // echo '
';
// print_r($notesReceivable);
// echo '
'; // 5. 날짜별로 모든 데이터 계산 후 배열에 저장 (메모리에서 처리) $reportData = []; $current = strtotime($fromdate); $end = strtotime($todate); while ($current <= $end) { $currentDateStr = date('Y-m-d', $current); $dailyTransactions = $dataByDate[$currentDateStr] ?? []; // 거래가 있는 날만 리포트 데이터 생성 if (!empty($dailyTransactions)) { $dailySummaries = []; foreach ($accountNames as $bankbookName) { $prevBalance = $runningBalances[$bankbookName]; $dailyIncome = 0; $dailyExpense = 0; foreach ($dailyTransactions as $tx) { if ($tx['bankbook'] === $bankbookName) { $amount = floatval(str_replace(',', '', $tx['amount'])); if ($tx['inoutsep'] === '지출') { $dailyExpense += $amount; } else { $dailyIncome += $amount; } } } $endOfDayBalance = $prevBalance + $dailyIncome - $dailyExpense; $dailySummaries[$bankbookName] = [ 'prev' => $prevBalance, 'income' => $dailyIncome, 'expense' => $dailyExpense, 'balance' => $endOfDayBalance ]; } $reportData[$currentDateStr] = [ 'summaries' => $dailySummaries, 'transactions' => $dailyTransactions ]; } // 전일이월액 업데이트는 거래가 없는 날도 매일 수행해야 함 foreach ($accountNames as $bankbookName) { $dailyIncome = 0; $dailyExpense = 0; $currentDayTx = $dataByDate[$currentDateStr] ?? []; foreach ($currentDayTx as $tx) { if ($tx['bankbook'] === $bankbookName) { $amount = floatval(str_replace(',', '', $tx['amount'])); if ($tx['inoutsep'] === '지출') $dailyExpense += $amount; else $dailyIncome += $amount; } } $runningBalances[$bankbookName] += ($dailyIncome - $dailyExpense); } $current = strtotime('+1 day', $current); } // 날짜 역순으로 출력하기 위해 배열 뒤집기 $reportData = array_reverse($reportData, true); // echo '
';
// print_r($reportData);
// echo '
'; ?>
~

어음 및 외상매출채권 현황

내용 현재잔액 최초발행일 만기일자
해당 내역이 없습니다.
합계
$dayData): ?>
format(strtotime($date)); ?>
일자:   /   작성자 : 우지영
은행 별칭 계좌번호 전일이월 수입 지출 잔액
현금성 자산 합계

<예금 입출금 내역>

$transactions): ?>
입금내역 금액 출금내역 금액
입금 합계 출금 합계