회사의 수입검사 리스트에서 그래프 및 통계를 작성하는 코드를 만든 과정을 옮겨봅니다.
아래의 결과 화면을 얻는 코드입니다.
아래는 주어진 두 코드(수입검사 통계와 수입검사 관리대장)를 참고하여, 경동기업의 수입검사 금액(매입가) 통계를 나타내는 예시 PHP 코드를 작성한 것입니다.
이 코드는
- 접속 권한 확인 및 DB 연결
- 기간(날짜) 입력값을 받아서 instock 테이블의 검사일(inspection_date) 기준으로 집계
- 각 납품업체별(테이블의 supplier 컬럼)로 매입가(VAT별도, purchase_price_excl_vat)의 합계를 구함
- 집계 결과를 표와 Highcharts 차트(컬럼 차트)로 출력합니다.
아래 코드를 참고하세요.
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
// 접근 권한 체크
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '금액 통계';
$title_prefix = '수입검사 금액 통계자료';
?>
<title><?= $title_prefix ?> <?= $title_message ?></title>
</head>
<body>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/mymodal.php');
?>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
// 날짜 기본값 설정 (최근 1개월)
$currentDate = date("Y-m-d");
$defaultFromDate = date("Y-m-d", strtotime("-1 month"));
$fromdate = isset($_REQUEST['fromdate']) && $_REQUEST['fromdate'] ? $_REQUEST['fromdate'] : $defaultFromDate;
$todate = isset($_REQUEST['todate']) && $_REQUEST['todate'] ? $_REQUEST['todate'] : $currentDate;
$tablename = 'instock';
try {
// instock 테이블에서 검사일(inspection_date) 기준, 납품업체별로 매입가(VAT별도)의 합계 집계
$sql = "SELECT supplier, SUM(purchase_price_excl_vat) as total_amount
FROM {$DB}.{$tablename}
WHERE inspection_date BETWEEN :fromdate AND :todate
AND is_deleted IS NULL
GROUP BY supplier
ORDER BY total_amount DESC";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':fromdate', $fromdate);
$stmh->bindValue(':todate', $todate);
$stmh->execute();
$rows = $stmh->fetchAll(PDO::FETCH_ASSOC);
// 차트 데이터 생성 (Highcharts용)
$chartData = [];
foreach ($rows as $row) {
$chartData[] = [
"name" => $row['supplier'],
"y" => (float)$row['total_amount']
];
}
$jsonChartData = json_encode($chartData, JSON_UNESCAPED_UNICODE);
} catch (PDOException $Exception) {
die("오류: " . $Exception->getMessage());
}
?>
<!-- 기간 설정 폼 -->
<form id="board_form" name="board_form" method="post" action="statistics_amount.php">
<div class="container mt-3 mb-5">
<div class="card mb-2 mt-2">
<div class="card-body">
<div class="d-flex p-1 m-1 mt-1 mb-3 justify-content-center align-items-center">
<h5><?= $title_message ?></h5>
<button type="button" class="btn btn-dark btn-sm mx-3" onclick="location.reload();" title="새로고침">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
<span id="showdate" class="btn btn-dark btn-sm"> 기간 </span>
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?= $fromdate ?>"> ~
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?= $todate ?>">
<button id="searchBtn" type="submit" class="btn btn-dark btn-sm">
<ion-icon name="search"></ion-icon>
</button>
</div>
</div>
</div>
</div>
</form>
<!-- 통계 결과 표 -->
<div class="container mt-4">
<div class="card">
<div class="card-header text-center">
<h5>납품업체별 매입가 합계 (VAT별도)</h5>
</div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>납품업체</th>
<th>매입가 합계</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row): ?>
<tr>
<td><?= htmlspecialchars($row['supplier']) ?></td>
<td><?= number_format($row['total_amount']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<!-- 금액 통계 차트 (Highcharts) -->
<div class="container mt-4">
<div class="card">
<div class="card-header text-center">
<h5>납품업체별 매입가 합계 차트</h5>
</div>
<div class="card-body">
<div id="amountChart" style="height: 500px;"></div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const chartData = <?= $jsonChartData ?>;
Highcharts.chart('amountChart', {
chart: {
type: 'column'
},
title: {
text: ''
},
xAxis: {
type: 'category',
title: {
text: '납품업체'
}
},
yAxis: {
min: 0,
title: {
text: '매입가 합계'
}
},
tooltip: {
pointFormat: '<span style="color:{point.color}">{point.name}</span>: <b>{point.y}</b><br/>'
},
series: [{
name: '매입가 합계',
data: chartData
}]
});
});
</script>
<script>
// 로딩 오버레이 제거
document.addEventListener('DOMContentLoaded', function() {
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
</script>
<script>
// 방문기록 남김 (예시 함수)
$(document).ready(function(){
var title_message = '<?php echo $title_message ; ?>';
saveMenuLog(title_message);
});
</script>
</body>
</html>
코드 설명
- 접근 및 헤더 설정
- 로그인 및 권한 체크 후, 공통 헤더와 모달, 메뉴 등을 포함합니다.
- 날짜 처리 및 DB 조회
- 기본적으로 최근 1개월 동안의 데이터를 조회하며, 사용자가 입력한 fromdate와 todate를 활용합니다.
- instock 테이블에서 inspection_date 기준으로, is_deleted가 null인 데이터만을 대상으로 납품업체별(supplier)로 purchase_price_excl_vat의 합계를 구합니다.
- 차트 데이터 생성
- 조회한 데이터를 Highcharts에서 사용할 수 있는 JSON 형태로 변환합니다.
- 화면 출력
- 기간 선택 폼, 결과 테이블(납품업체별 매입가 합계), 그리고 Highcharts 차트를 출력합니다.
이와 같이 코드를 수정하면 경동기업의 수입검사 금액 통계를 쉽게 확인할 수 있습니다. 필요에 따라 추가적인 집계(예: 품목별, 날짜별 등)나 디자인 수정이 가능합니다.
아래는 기존 statistics.php 파일을 기반으로,
- 매입가 합계가 0인 업체는 제외하도록 HAVING 절을 추가하고,
- 각 납품업체별로 해당 기간 내의 구매 내역(품목명, 수량, 매입가)을 별도 테이블로 출력하는 코드를 추가한 예시입니다.
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
// 접근 권한 체크
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '구매 자재 매입 통계';
$title_prefix = '구매 자재 매입 통계자료';
?>
<title><?= $title_prefix ?> <?= $title_message ?></title>
</head>
<body>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/mymodal.php');
?>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
// 날짜 기본값 설정 (최근 1개월)
$currentDate = date("Y-m-d");
$defaultFromDate = date("Y-m-d", strtotime("-1 month"));
$fromdate = isset($_REQUEST['fromdate']) && $_REQUEST['fromdate'] ? $_REQUEST['fromdate'] : $defaultFromDate;
$todate = isset($_REQUEST['todate']) && $_REQUEST['todate'] ? $_REQUEST['todate'] : $currentDate;
$tablename = 'instock';
try {
// instock 테이블에서 검사일(inspection_date) 기준, 납품업체별로 매입가(VAT별도)의 합계를 구하고,
// 합계가 0인 업체는 제외(HAVING 절 사용)
$sql = "SELECT supplier, SUM(purchase_price_excl_vat) as total_amount
FROM {$DB}.{$tablename}
WHERE inspection_date BETWEEN :fromdate AND :todate
AND is_deleted IS NULL
GROUP BY supplier
HAVING SUM(purchase_price_excl_vat) > 0
ORDER BY total_amount DESC";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':fromdate', $fromdate);
$stmh->bindValue(':todate', $todate);
$stmh->execute();
$rows = $stmh->fetchAll(PDO::FETCH_ASSOC);
// 차트 데이터 생성 (Highcharts용)
$chartData = [];
foreach ($rows as $row) {
$chartData[] = [
"name" => $row['supplier'],
"y" => (float)$row['total_amount']
];
}
$jsonChartData = json_encode($chartData, JSON_UNESCAPED_UNICODE);
} catch (PDOException $Exception) {
die("오류: " . $Exception->getMessage());
}
?>
<!-- 기간 설정 폼 -->
<form id="board_form" name="board_form" method="post" action="statistics_amount.php">
<div class="container mt-3 mb-5">
<div class="card mb-2 mt-2">
<div class="card-body">
<div class="d-flex p-1 m-1 mt-1 mb-3 justify-content-center align-items-center">
<h5><?= $title_message ?></h5>
<button type="button" class="btn btn-dark btn-sm mx-3" onclick="location.reload();" title="새로고침">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
<span id="showdate" class="btn btn-dark btn-sm"> 기간 </span>
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?= $fromdate ?>"> ~
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?= $todate ?>">
<button id="searchBtn" type="submit" class="btn btn-dark btn-sm">
<ion-icon name="search"></ion-icon>
</button>
</div>
</div>
</div>
</div>
</form>
<!-- 통계 결과 표 (납품업체별 매입가 합계) -->
<div class="container mt-4">
<div class="card">
<div class="card-header text-center">
<h5>납품업체별 매입가 합계 (VAT별도)</h5>
</div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>납품업체</th>
<th>매입가 합계</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row): ?>
<tr>
<td><?= htmlspecialchars($row['supplier']) ?></td>
<td><?= number_format($row['total_amount']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<!-- 금액 통계 차트 (Highcharts) -->
<div class="container mt-4">
<div class="card">
<div class="card-header text-center">
<h5>납품업체별 매입가 합계 차트</h5>
</div>
<div class="card-body">
<div id="amountChart" style="height: 500px;"></div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const chartData = <?= $jsonChartData ?>;
Highcharts.chart('amountChart', {
chart: {
type: 'column'
},
title: {
text: ''
},
xAxis: {
type: 'category',
title: {
text: '납품업체'
}
},
yAxis: {
min: 0,
title: {
text: '매입가 합계'
}
},
tooltip: {
pointFormat: '<span style="color:{point.color}">{point.name}</span>: <b>{point.y}</b><br/>'
},
series: [{
name: '매입가 합계',
data: chartData
}]
});
});
</script>
<!-- 로딩 오버레이 제거 및 방문기록 남김 -->
<script>
document.addEventListener('DOMContentLoaded', function() {
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
$(document).ready(function(){
var title_message = '<?php echo $title_message ; ?>';
saveMenuLog(title_message);
});
</script>
<!-- 업체별 구매 내역 상세 테이블 -->
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h5>업체별 구매 내역</h5>
</div>
<div class="card-body">
<?php foreach ($rows as $row): ?>
<?php
$supplierName = $row['supplier'];
// 해당 업체의 구매 내역 조회 (품목명, 수량, 매입가)
$sqlDetail = "SELECT item_name, received_qty, purchase_price_excl_vat
FROM {$DB}.{$tablename}
WHERE supplier = :supplier
AND inspection_date BETWEEN :fromdate AND :todate
AND is_deleted IS NULL
ORDER BY inspection_date DESC";
$stmtDetail = $pdo->prepare($sqlDetail);
$stmtDetail->bindValue(':supplier', $supplierName);
$stmtDetail->bindValue(':fromdate', $fromdate);
$stmtDetail->bindValue(':todate', $todate);
$stmtDetail->execute();
$details = $stmtDetail->fetchAll(PDO::FETCH_ASSOC);
?>
<h6 class="mt-4"><?= htmlspecialchars($supplierName) ?> (총 매입가: <?= number_format($row['total_amount']) ?>)</h6>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>품목명</th>
<th>수량</th>
<th>매입가 (VAT별도)</th>
</tr>
</thead>
<tbody>
<?php if(count($details) > 0): ?>
<?php foreach ($details as $detail): ?>
<tr>
<td><?= htmlspecialchars($detail['item_name']) ?></td>
<td>
<?= is_numeric($detail['received_qty']) ? number_format($detail['received_qty']) : htmlspecialchars($detail['received_qty']) ?>
</td>
<td>
<?= is_numeric($detail['purchase_price_excl_vat']) ? number_format($detail['purchase_price_excl_vat']) : htmlspecialchars($detail['purchase_price_excl_vat']) ?>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="3" class="text-center">구매 내역이 없습니다.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<?php endforeach; ?>
</div>
</div>
</div>
</body>
</html>
주요 수정 사항
- 금액 0인 업체 제외
- SQL 집계 쿼리에서 HAVING SUM(purchase_price_excl_vat) > 0 조건을 추가하여 매입가 합계가 0인 납품업체는 결과에서 제외하였습니다.
- 업체별 구매 내역 상세 테이블 추가
- 각 납품업체별로 별도의 상세 구매 내역을 조회하여, 품목명, 수량, 매입가(VAT별도)를 표시하는 테이블을 출력합니다.
이와 같이 코드를 작성하면, 기간 내에 매입가 합계가 0 이상인 업체만 집계 및 차트에 표시되고, 각 업체별 구매 내역도 상세히 확인할 수 있습니다. 필요에 따라 디자인이나 추가 조건을 수정하실 수 있습니다.
반응형
'IT tech Coding > php' 카테고리의 다른 글
PHP 경고 메시지 "A non well formed numeric value encountered" 해결 방법 (0) | 2025.03.25 |
---|---|
PHP에서 JSON 데이터를 활용해 각 항목의 상태를 자동으로 판정하는 방법 (0) | 2025.03.23 |
json형태로 가이드레일 형태의 정보 및 이미지 저장하는 로직개발 (0) | 2025.03.10 |
PHP에서 특정 단어가 포함되었는지 확인하는 방법 (0) | 2025.03.04 |
계층형 카테고리 관리: MySQL과 PHP로 트리 구조 만들기 (0) | 2025.02.26 |