5) { sleep(1); header("Location:" . $WebSite . "login/login_form.php"); exit; } include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php'; // 첫 화면 표시 문구 $title_message = '미수금 현황'; ?>
'; // 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 ''; ?>