본문 바로가기
IT tech Coding/php

수입검사 품목에 대한 통계자료 작성 코드

by Coding Life 2025. 3. 13.

회사의 수입검사 리스트에서 그래프 및 통계를 작성하는 코드를 만든 과정을 옮겨봅니다.

아래의 결과 화면을 얻는 코드입니다.

아래는 주어진 두 코드(수입검사 통계와 수입검사 관리대장)를 참고하여, 경동기업의 수입검사 금액(매입가) 통계를 나타내는 예시 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> &nbsp;
                        <input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?= $fromdate ?>"> &nbsp; ~ &nbsp;
                        <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>

코드 설명

  1. 접근 및 헤더 설정
    • 로그인 및 권한 체크 후, 공통 헤더와 모달, 메뉴 등을 포함합니다.
  2. 날짜 처리 및 DB 조회
    • 기본적으로 최근 1개월 동안의 데이터를 조회하며, 사용자가 입력한 fromdate와 todate를 활용합니다.
    • instock 테이블에서 inspection_date 기준으로, is_deleted가 null인 데이터만을 대상으로 납품업체별(supplier)로 purchase_price_excl_vat의 합계를 구합니다.
  3. 차트 데이터 생성
    • 조회한 데이터를 Highcharts에서 사용할 수 있는 JSON 형태로 변환합니다.
  4. 화면 출력
    • 기간 선택 폼, 결과 테이블(납품업체별 매입가 합계), 그리고 Highcharts 차트를 출력합니다.

이와 같이 코드를 수정하면 경동기업의 수입검사 금액 통계를 쉽게 확인할 수 있습니다. 필요에 따라 추가적인 집계(예: 품목별, 날짜별 등)나 디자인 수정이 가능합니다.

 

아래는 기존 statistics.php 파일을 기반으로,

  1. 매입가 합계가 0인 업체는 제외하도록 HAVING 절을 추가하고,
  2. 각 납품업체별로 해당 기간 내의 구매 내역(품목명, 수량, 매입가)을 별도 테이블로 출력하는 코드를 추가한 예시입니다.
<?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> &nbsp;
                        <input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?= $fromdate ?>"> &nbsp; ~ &nbsp;
                        <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>

 

주요 수정 사항

  1. 금액 0인 업체 제외
    • SQL 집계 쿼리에서 HAVING SUM(purchase_price_excl_vat) > 0 조건을 추가하여 매입가 합계가 0인 납품업체는 결과에서 제외하였습니다.
  2. 업체별 구매 내역 상세 테이블 추가
    • 각 납품업체별로 별도의 상세 구매 내역을 조회하여, 품목명, 수량, 매입가(VAT별도)를 표시하는 테이블을 출력합니다.

이와 같이 코드를 작성하면, 기간 내에 매입가 합계가 0 이상인 업체만 집계 및 차트에 표시되고, 각 업체별 구매 내역도 상세히 확인할 수 있습니다. 필요에 따라 디자인이나 추가 조건을 수정하실 수 있습니다.

반응형