5) { sleep(1); header("Location:" . $WebSite . "login/login_form.php"); exit; } include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php'; // 첫 화면 표시 문구 $title_message = '거래처 원장(VAT 포함)'; ?> <?=$title_message?> '; // echo '이월잔액 기간 lastMonthEnd: '; // print_r($lastMonthEnd); // echo ''; $searchsecondordnum = ''; if(!empty($search)) { $sql = "SELECT secondordnum FROM ".$DB.".".$tablenamephonebook." WHERE (is_deleted IS NULL OR is_deleted = 0 or is_deleted ='' ) AND represent='대표코드' AND (vendor_name LIKE '%$search%')"; $stmt = $pdo->prepare($sql); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); $searchsecondordnum = $row['secondordnum']; } // 거래처별 매출 및 수금 데이터 계산 (이월잔액) // 주일 work 테이블의 컬럼을 추가해야 함. $salesBeforeSql = " SELECT o.secondordnum, SUM(COALESCE(e.ET_total, 0)) AS total_sales FROM {$DB}.work o LEFT JOIN {$DB}.output_extra e ON o.num = e.parent_num WHERE o.outdate <= :lastMonthEnd AND (o.is_deleted IS NULL or o.is_deleted=0 or o.is_deleted ='') GROUP BY o.secondordnum "; $paymentBeforeSql = " SELECT secondordnum, SUM(CAST(REPLACE(amount, ',', '') AS SIGNED)) AS total_payment FROM {$DB}.account_juil WHERE registDate <= :lastMonthEnd AND (is_deleted IS NULL or is_deleted=0 or is_deleted ='' ) 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); $paymentBeforeStmt = $pdo->prepare($paymentBeforeSql); $paymentBeforeStmt->execute([':lastMonthEnd' => $lastMonthEnd]); $paymentBeforeData = $paymentBeforeStmt->fetchAll(PDO::FETCH_ASSOC); // 거래처별로 매출과 수금을 비교해 이월 잔액을 계산 foreach ($salesBeforeData as $row) { $secondordnum = $row['secondordnum']; $total_sales = (float)$row['total_sales']; if (!isset($initialBalances[$secondordnum])) { $initialBalances[$secondordnum] = 0; } $initialBalances[$secondordnum] += $total_sales; } // echo '
';
// print_r($initialBalances);
// echo '
'; // 수금 데이터를 이용해 이월 잔액에서 수금을 차감 foreach ($paymentBeforeData as $row) { $secondordnum = $row['secondordnum']; $total_payment = (float)$row['total_payment']; if (!isset($initialBalances[$secondordnum])) { $initialBalances[$secondordnum] = 0; } $initialBalances[$secondordnum] -= $total_payment; } // echo '
';
// print_r($initialBalances);
// echo '
'; // 매출이 발생한 거래처 필터링 및 매출액 계산 $salesSql = " SELECT o.secondordnum, COALESCE(e.ET_total, 0) as ET_total FROM {$DB}.work o LEFT JOIN {$DB}.output_extra e ON o.num = e.parent_num WHERE (o.outdate BETWEEN date('$fromdate') AND date('$Transtodate')) AND (o.is_deleted IS NULL OR o.is_deleted = 0 or o.is_deleted ='') "; $salesStmt = $pdo->prepare($salesSql); $salesStmt->execute(); $salesData = $salesStmt->fetchAll(PDO::FETCH_ASSOC); $salesResults = []; foreach ($salesData as $row) { $secondordnum = $row['secondordnum']; $total_sales = (float)$row['ET_total']; if (!isset($salesResults[$secondordnum])) { $salesResults[$secondordnum] = 0; } $salesResults[$secondordnum] += $total_sales; } // echo '
';
// echo '매출발생 시작 fromdate: ';
// print_r($fromdate);
// echo '
'; // echo '
';
// echo '매출발생 종료 Transtodate: ';
// print_r($Transtodate);
// echo '
'; // echo '
';
// echo '이월잔액배열 디오이엔시 추적 initialBalances: ';
// print_r($initialBalances['56']);
// echo '
'; // 모든 거래처 목록을 처리하기 전에 거래처 이름을 저장하는 배열 초기화 $vendorNames = []; // 모든 거래처 목록을 생성 (매출, 기초채권) $allResults = array_unique(array_merge(array_keys($salesResults), array_keys($initialBalances))); // 매출 금액 기준으로 역순으로 정렬 usort($allResults, function($a, $b) use ($salesResults) { $salesA = isset($salesResults[$a]) ? $salesResults[$a] : 0; $salesB = isset($salesResults[$b]) ? $salesResults[$b] : 0; return round($salesA - $salesB); }); // 합계를 저장할 변수들 $totalInitialReceivable = 0; $totalSalesAmount = 0; $totalPaymentAmount = 0; $totalBalanceDue = 0; try { $start_num = 1; foreach ($allResults as $ordnum) { // 이월 잔액 설정 $initialReceivable = isset($initialBalances[$ordnum]) ? $initialBalances[$ordnum] : 0; // 수금 내역 가져오기 $paymentSql = "SELECT SUM(CAST(REPLACE(amount, ',', '') AS SIGNED)) as total_payment FROM ".$DB.".account_juil WHERE secondordnum = '$ordnum' AND registDate BETWEEN '1970-01-01' AND date('$Transtodate') AND (is_deleted IS NULL OR is_deleted = 0 or is_deleted ='' ) AND content = '거래처 수금' AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '')"; $paymentStmt = $pdo->prepare($paymentSql); $paymentStmt->execute(); $paymentData = $paymentStmt->fetch(PDO::FETCH_ASSOC); $total_payment = isset($paymentData['total_payment']) ? (int)str_replace(',', '', $paymentData['total_payment']) : 0; $total_sales = isset($salesResults[$ordnum]) ? $salesResults[$ordnum] : 0; // 조건: 기초채권이 있거나 매출이 있는 경우만 표시 if ($initialReceivable != 0 || $total_sales != 0 ) { // 매출이 있는 것을 추출 $sql = "SELECT * FROM $DB.$tablenamephonebook WHERE secondordnum = '$ordnum' AND (is_deleted IS NULL OR is_deleted = 0 or is_deleted ='' ) AND represent='대표코드'"; $stmh = $pdo->query($sql); while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) { include $_SERVER['DOCUMENT_ROOT'] . '/phonebook/_row.php'; if (intval($ordnum) > 0) { $savenum = $ordnum; // 거래처 이름 저장 $vendorNames[$ordnum] =$vendor_name ; } else $savenum = $num; $total_amount = round($total_sales ) ; // 잔액 계산 $balance_due = round($initialReceivable) + $total_amount - round($total_payment); $totalInitialReceivable += $initialReceivable; $totalSalesAmount += $total_amount; $totalPaymentAmount += $total_payment; $totalBalanceDue += $balance_due; } } } } catch (PDOException $Exception) { print "오류: ".$Exception->getMessage(); } // echo '
';
// print_r($vendorNames);
// echo '
'; // 거래처 이름으로 정렬 usort($allResults, function($a, $b) use ($vendorNames) { // 거래처 이름이 없는 경우 빈 문자열로 처리 $nameA = $vendorNames[$a] ?? ''; $nameB = $vendorNames[$b] ?? ''; return strcmp($nameA, $nameB); }); // echo $sql; // echo '
';
// print_r($allResults);
// echo '
'; // $search값이 있다면 // 특정 숫자 67만 남기고 필터링 // echo 'searchsecondordnum : ' . $searchsecondordnum; if (!empty($search)) { $allResults = array_filter($allResults, function ($value) use ($searchsecondordnum) { return $value === intval($searchsecondordnum); }); // array_values로 인덱스 재정렬 $allResults = array_values($allResults); } // 중복 제거 $allResults = array_unique($allResults); // 중복 제거 $allResults = array_unique($allResults); // 빈 값 제거 $allResults = array_filter($allResults, function ($value) { return $value !== null && $value !== ''; }); // 배열 키 재정렬 $allResults = array_values($allResults); // echo '
';
// print_r($allResults);
// echo '
'; ?>
* 출고완료일 기준      
  기간  
기간 설정
  ~    
 
 
거래처 Code'; ?> '; // 이월잔액 설정 $initialReceivable = isset($initialBalances[$initnum]) ? intval($initialBalances[$initnum]) : 0; // 마지막 자릿수가 1인지 확인 if (floatval($initialReceivable) % 10 === 1) { // 마지막 자릿수를 제거 (정수로 처리) $initialReceivable = floor($initialReceivable / 10); } // echo '거래처 $initnum' . $initnum . ' : ', $initialReceivable . '
' ; // 수금 내역 가져오기 $paymentSql = "SELECT SUM(CAST(REPLACE(amount, ',', '') AS SIGNED)) as total_payment FROM $DB.account_juil WHERE secondordnum = '$initnum' AND registDate BETWEEN date('$fromdate') AND date('$Transtodate') AND (is_deleted IS NULL OR is_deleted = 0 or is_deleted ='' ) AND content = '거래처 수금' AND (dueDate = '0000-00-00' OR dueDate IS NULL OR dueDate = '')"; $paymentStmt = $pdo->prepare($paymentSql); $paymentStmt->execute(); $paymentData = $paymentStmt->fetch(PDO::FETCH_ASSOC); $total_payment = isset($paymentData['total_payment']) ? (int)str_replace(',', '', $paymentData['total_payment']) : 0; $total_sales = isset($salesResults[$initnum]) ? $salesResults[$initnum] : 0; // print $total_sales; // 조건: 이월잔액이 있거나 매출이 있는 경우만 표시 // 검색어가 있는 경우 검색어 있는 것만 나오게 함 // echo 'searchsecondordnum : ' . $searchsecondordnum; if ( ($initialReceivable != 0 or $total_sales != 0) and intval($initnum) > 1 ) { $sql = "SELECT * FROM $DB.$tablenamephonebook WHERE secondordnum = '$initnum' AND (is_deleted IS NULL OR is_deleted = 0 or is_deleted ='' ) AND represent='대표코드'"; $total_amount = round($total_sales,2); // 잔액 계산 $balance_due = $initialReceivable + $total_amount - $total_payment; $memo = ''; // if($balance_due>0 && $initialReceivable>0 ) // (주)한빛에스티는 25일 마감 예외처리해야함. // if($vendor_name === '㈜ 한빛에스티') // $vendor_name = '㈜ 한빛에스티(월마감25일)'; // 마지막 단위 원단위 중 1은 제거하는 로직 // 당월매출 마지막 1원 삭제 // 마지막 자리가 1로 끝나는 경우, 0으로 변경 // print_r($total_payment); // $totalSalesAmount -= 5; if (round($total_amount,2) % 10 === 1) { $total_amount -= 1; // 1을 빼서 마지막 자리를 0으로 만듭니다. } if ($balance_due % 10 === 1) { $balance_due -= 1; // 1을 빼서 마지막 자리를 0으로 만듭니다. } // print_r($balance_due); if (intval($balance_due) !== 0 || $total_sales > 0 ) { ?> ' . $initnum . ' '; ?>
번호 거래처명 이월잔액 매출 수금 잔액 결제일 적요
합계      
getMessage(); } ?>