5) { sleep(1); header("Location:" . $WebSite . "login/login_form.php"); exit; } include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php'; // 첫 화면 표시 문구 $title_message = '미수금 현황'; ?> <?=$title_message?> prepare($recordSql); $recordStmt->execute(); $recordData = $recordStmt->fetchAll(PDO::FETCH_ASSOC); foreach ($recordData as $row) { $secondordnum = $row['secondordnum']; $primisedate = $row['primisedate']; $comment = $row['comment']; // 가장 최신의 약속일과 메모만 저장 if (!isset($promisedate[$secondordnum])) { $promisedate[$secondordnum] = $primisedate; $memo[$secondordnum] = $comment; } } // 이월 잔액을 동적으로 계산하기 위한 로직 $previousMonthFromDate = date("Y-m-01", strtotime($previousMonth . '01')); $previousMonthToDate = date("Y-m-t", strtotime($previousMonth . '01')); // echo '
';
// print_r($previousMonthFromDate);
// echo ', ';
// print_r($previousMonthToDate);
// echo '
'; // 전월 매출 및 수금 데이터 가져오기 $previousMonthSalesSql = " SELECT o.secondordnum, COALESCE(e.ET_total, 0) AS ET_total FROM output o LEFT JOIN output_extra e ON o.num = e.parent_num WHERE (o.outdate BETWEEN date('$previousMonthFromDate') AND date('$previousMonthToDate')) AND (o.is_deleted IS NULL or o.is_deleted = 0) "; $previousMonthSalesStmt = $pdo->prepare($previousMonthSalesSql); $previousMonthSalesStmt->execute(); $previousMonthSalesData = $previousMonthSalesStmt->fetchAll(PDO::FETCH_ASSOC); $previousMonthSales = []; foreach ($previousMonthSalesData as $row) { $secondordnum = $row['secondordnum']; $total_sales_prev = (float)$row['ET_total']; if (!isset($previousMonthSales[$secondordnum])) { $previousMonthSales[$secondordnum] = 0; } $previousMonthSales[$secondordnum] += round($total_sales_prev, 2); // ET_total은 부가세 포함 } // 당월 매출 데이터 가져오기 $salesSql = " SELECT o.secondordnum, COALESCE(e.ET_total, 0) AS ET_total FROM output o LEFT JOIN output_extra e ON o.num = e.parent_num WHERE (o.outdate BETWEEN date('$fromdate') AND date('$todate')) AND (o.is_deleted IS NULL or o.is_deleted = 0) "; $salesStmt = $pdo->prepare($salesSql); $salesStmt->execute(); $salesData = $salesStmt->fetchAll(PDO::FETCH_ASSOC); $currentMonthSales = []; foreach ($salesData as $row) { $secondordnum = $row['secondordnum']; $total_sales = (float)$row['ET_total']; if (!isset($currentMonthSales[$secondordnum])) { $currentMonthSales[$secondordnum] = 0; } $currentMonthSales[$secondordnum] += round($total_sales, 2); } // 전월까지의 매출 및 수금 데이터를 기반으로 이월 잔액을 계산 $initialBalances = []; $lastMonthEnd = date("Y-m-t", strtotime($fromdate . " -1 month")); $salesBeforeSql = " SELECT o.secondordnum, SUM(COALESCE(e.ET_total, 0)) AS total_sales FROM output o LEFT JOIN output_extra e ON o.num = e.parent_num WHERE o.outdate <= :lastMonthEnd AND (o.is_deleted IS NULL or o.is_deleted = 0) GROUP BY o.secondordnum "; $paymentBeforeSql = " SELECT secondordnum, SUM(CAST(REPLACE(amount, ',', '') AS SIGNED)) AS total_payment FROM account_juil WHERE registDate <= :lastMonthEnd AND (is_deleted IS NULL or is_deleted = 0) AND content = '거래처 수금' AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '') GROUP BY secondordnum "; $salesBeforeStmt = $pdo->prepare($salesBeforeSql); $salesBeforeStmt->execute([':lastMonthEnd' => $lastMonthEnd]); $salesBeforeData = $salesBeforeStmt->fetchAll(PDO::FETCH_ASSOC); // echo '
';
// print_r($lastMonthEnd);
// echo '
'; $paymentEnddate = date("Y-m-t", strtotime($todate)); $paymentBeforeStmt = $pdo->prepare($paymentBeforeSql); $paymentBeforeStmt->execute([':lastMonthEnd' => $paymentEnddate]); $paymentBeforeData = $paymentBeforeStmt->fetchAll(PDO::FETCH_ASSOC); foreach ($salesBeforeData as $row) { $secondordnum = $row['secondordnum']; $total_sales_before = round((float)$row['total_sales'], 2); if (!isset($initialBalances[$secondordnum])) { $initialBalances[$secondordnum] = 0; } $initialBalances[$secondordnum] += $total_sales_before; } foreach ($paymentBeforeData as $row) { $secondordnum = $row['secondordnum']; $total_payment_before = (float)$row['total_payment']; if (!isset($initialBalances[$secondordnum])) { $initialBalances[$secondordnum] = 0; } $initialBalances[$secondordnum] -= $total_payment_before; } // 거래처별 잔액을 계산 $balances = fetch_balances($DB, $fromdate, $todate); // 모든 거래처 목록을 생성 (이월 잔액, 전월 매출, 당월 매출, 잔고) $allResults = array_unique(array_merge(array_keys($initialBalances), array_keys($currentMonthSales), array_keys($previousMonthSales), array_keys($balances))); // ksort($allResults); // echo '
';
// print_r($allResults[23]);
// echo '
'; // 이번달 수금 금액 계산 $currentMonthPayments = []; $currentMonthStart = date("Y-m-01", strtotime($todate)); $currentMonthEnd = date("Y-m-t", strtotime($todate)); $currentPaymentSql = " SELECT secondordnum, SUM(CAST(REPLACE(amount, ',', '') AS SIGNED)) AS total_payment FROM account_juil WHERE registDate BETWEEN :currentMonthStart AND :currentMonthEnd AND (is_deleted IS NULL or is_deleted = 0) AND content = '거래처 수금' AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '') GROUP BY secondordnum "; $currentPaymentStmt = $pdo->prepare($currentPaymentSql); $currentPaymentStmt->execute([ ':currentMonthStart' => $currentMonthStart, ':currentMonthEnd' => $currentMonthEnd ]); $currentPaymentData = $currentPaymentStmt->fetchAll(PDO::FETCH_ASSOC); foreach ($currentPaymentData as $row) { $secondordnum = $row['secondordnum']; $total_payment_current = (float)$row['total_payment']; if (!isset($currentMonthPayments[$secondordnum])) { $currentMonthPayments[$secondordnum] = 0; } $currentMonthPayments[$secondordnum] += $total_payment_current; } // 미수금 계산 $receivables = []; // 미수금을 저장할 배열 $vendorNames = []; // 거래처 이름을 저장할 배열 $paydates = []; // 결제일을 저장할 배열 // 거래처 이름을 저장하는 배열 초기화 $vendorNames = []; $paydates = []; foreach ($allResults as $secondordnum) { // 잔고, 전월매출, 당월매출, 이월 잔액 및 미수금을 계산 $previousMonthSale = isset($previousMonthSales[$secondordnum]) ? $previousMonthSales[$secondordnum] : 0; $currentMonthSale = isset($currentMonthSales[$secondordnum]) ? $currentMonthSales[$secondordnum] : 0; $balance = isset($balances[$secondordnum]) ? $balances[$secondordnum] : 0; $currentMonthPayment = isset($currentMonthPayments[$secondordnum]) ? $currentMonthPayments[$secondordnum] : 0; // 최종 잔고 계산 (이번달 수금액을 차감) // $finalBalance = $balance - $currentMonthPayment; // 이코드 보류함 250414 수정 이중으로 차감됨 $finalBalance = $balance ; if ($finalBalance > 0) { $receivableAmount = $finalBalance - $currentMonthSale - $previousMonthSale; if($receivableAmount > 0) $receivables[$secondordnum] = $receivableAmount; else $receivables[$secondordnum] = 0; } else { $receivables[$secondordnum] = 0; } // 거래처 정보 가져오기 $dueDateSql = "SELECT paydate, vendor_name, note FROM {$DB}.phonebook WHERE secondordnum = '$secondordnum' AND (is_deleted IS NULL or is_deleted = 0)"; $dueDateStmt = $pdo->prepare($dueDateSql); $dueDateStmt->execute(); $dueDateRow = $dueDateStmt->fetch(PDO::FETCH_ASSOC); // 거래처 이름과 결제일을 저장 $vendorNames[$secondordnum] = $dueDateRow['vendor_name'] ?? ''; $paydates[$secondordnum] = $dueDateRow['paydate'] ?? ''; } // 거래처 이름으로 정렬 usort($allResults, function($a, $b) use ($vendorNames) { return strcmp($vendorNames[$a], $vendorNames[$b]); }); // echo '
';
// print_r($receivables);
// echo '
'; ?>
* 잔고(거래원장 잔액) - 당월매출 - 전월매출 = 미수금 (계산서 발행 후 결재일 넘기면 미수금)
Code'; ?> 0 ) { ?> ' . $secondordnum . ' '; ?> getMessage(); } ?> '; ?>
번호 거래처명 결제일 미수금 전월매출 당월매출 잔고 결제약속일 적요 원장
40) { echo mb_substr($memoText, 0, 40, 'UTF-8') . '...'; } else { echo $memoText; } } else { echo ''; } ?> 보기
합계