# output_head.php 개발자 가이드 ## 📋 개요 `output_head.php`는 방화셔터 견적 시스템의 거래명세표 출력 페이지 헤더를 담당하는 핵심 PHP 컴포넌트입니다. 이 파일은 거래명세표 화면의 상단 부분을 구성하며, 견적 정보 조회, 헤더 출력, 할인율 적용, 금액 계산 테이블 등을 포함합니다. 특히 인정제품과 비인정제품의 구분, 할인율 적용, VAT 포함 계산 등 거래명세표 특화 기능을 제공합니다. ## 🏗️ 파일 구조 ### 📁 파일 위치 ``` /estimate/common/output_head.php ``` ### 📊 파일 정보 - **파일 크기**: 10.2KB (263 lines) - **주요 언어**: PHP + HTML + CSS - **의존성**: Bootstrap, jQuery, MySQL/PDO - **주요 기능**: 거래명세표 헤더, 할인율 적용, 금액 계산 ## 🔧 핵심 기능 ### 1. **헤더 및 의존성 로드** ```php <?=$title_message?> ``` ### 2. **견적 정보 조회** ```php $num = isset($_REQUEST['num']) ? $_REQUEST['num'] : ''; $option = isset($_REQUEST['option']) ? $_REQUEST['option'] : 'option'; // 기본 option 견적서와 산출서의 다른점을 표현하는 것 require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/estimate/fetch_unitprice.php"); $pdo = db_connect(); try { $sql = "select * from {$DB}.{$tablename} where num = ? "; $stmh = $pdo->prepare($sql); $stmh->bindValue(1, $num, PDO::PARAM_STR); $stmh->execute(); $count = $stmh->rowCount(); if ($count < 1) { print "검색결과가 없습니다.
"; } else { $row = $stmh->fetch(PDO::FETCH_ASSOC); include $_SERVER['DOCUMENT_ROOT'] . "/output/_row.php"; // output_extra 불러오기 $sql_extra = "SELECT * FROM {$DB}.output_extra WHERE parent_num = ?"; $stmh_extra = $pdo->prepare($sql_extra); $stmh_extra->bindValue(1, $num, PDO::PARAM_STR); $stmh_extra->execute(); $row_extra = $stmh_extra->fetch(PDO::FETCH_ASSOC); if ($row_extra) { include $_SERVER['DOCUMENT_ROOT'] . "/output/_row_extra.php"; } } } catch (PDOException $Exception) { print "오류: " . $Exception->getMessage(); } ``` ### 3. **견적 데이터 디코딩** ```php // JSON 문자열을 PHP 배열로 디코딩합니다. if($major_category == '스크린') $decodedEstimateList = json_decode($estimateList, true); if($major_category == '철재') $decodedEstimateList = json_decode($estimateSlatList, true); // 디코딩된 데이터가 배열인지 확인합니다. if (!is_array($decodedEstimateList)) { echo "데이터가 정상적이지 않습니다. 확인바랍니다."; exit; } echo ''; ``` ## 📋 폼 구조 ### 🎯 **숨겨진 입력 필드** ```html
``` ## 🎨 UI 구성 요소 ### 📊 **헤더 네비게이션** ```html
( 거래명세표) > > >  
``` ### ⚠️ **알림 메시지** ```html
할인율 적용      %
💬 수정금액이 있으면 자동금액보다 수정금액이 우선됨. (VAT포함)
``` ### 💰 **금액 계산 테이블** ```html
자동 견적금액 수정 견적금액 견적 차액 견적확정액 할인금액 최종 결정금액
``` ## 📄 거래명세표 헤더 ### 🏢 **거래명세표 기본 정보** ```html
'; else echo ' ' . $title_message_sub . ' '; ?>
' . $title_message . '
``` ### 👥 **업체 정보 테이블** ```html
업체명 (귀하) 공 급 자 상호 ㈜ 경동기업
제품명 등록번호 139-87-00333 대표자
이 경 호  
현장명 사업장주소 경기도 김포시 통진읍 옹정로 45-22
담당자 업 태 제조업 종목 방화셔터, 금속창호
연락처 TEL. 031-983-5130 FAX 02-6911-6315
``` ### 💵 **합계 금액 표시 (VAT 포함)** ```html
( ₩ ) (VAT 포함)
``` ## 📊 데이터 변수 ### 🎯 **주요 PHP 변수** - `$num`: 견적 번호 - `$option`: 견적서/산출서 구분 옵션 (기본값: 'option') - `$major_category`: 주요 카테고리 (스크린/철재) - `$title_message`: 제목 메시지 - `$title_message_sub`: 서브 제목 메시지 - `$secondord`: 발주처명 - `$subTitle`: 제품명 - `$outworkplace`: 현장명 - `$secondordman`: 담당자명 - `$secondordmantel`: 연락처 ### 💰 **금액 관련 변수** - `$EstimateFirstSum`: 자동 견적금액 - `$EstimateUpdatetSum`: 수정 견적금액 - `$EstimateDiffer`: 견적 차액 - `$EstimateFixAmount`: 견적확정액 - `$EstimateDiscount`: 할인금액 - `$EstimateFinalSum`: 최종 결정금액 - `$EstimateDiscountRate`: 할인율 - `$estimateSurang`: 견적 수량 - `$estimateTotal`: 인정제품 금액 - `$ET_unapproved`: 비인정제품 금액 - `$ET_total`: 총 금액 ### 📋 **데이터베이스 관련 변수** - `$estimateList`: 스크린 견적 리스트 (JSON) - `$estimateSlatList`: 철재 견적 리스트 (JSON) - `$detailJson`: 상세 견적 데이터 (JSON) - `$shutterboxMsg`: 셔터박스 오류 메시지 ## 🔧 개발자 사용법 ### 📝 **기본 사용법** ```php // 파일 포함 include_once('/estimate/common/output_head.php'); // 견적 번호 설정 $_REQUEST['num'] = '견적번호'; // 옵션 설정 (거래명세표 모드) $_REQUEST['option'] = 'option'; ``` ### 🎯 **데이터 조회** ```php // 견적 정보 조회 $sql = "SELECT * FROM {$DB}.{$tablename} WHERE num = ?"; $stmt = $pdo->prepare($sql); $stmt->bindValue(1, $num, PDO::PARAM_STR); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); // 추가 정보 조회 $sql_extra = "SELECT * FROM {$DB}.output_extra WHERE parent_num = ?"; $stmt_extra = $pdo->prepare($sql_extra); $stmt_extra->bindValue(1, $num, PDO::PARAM_STR); $stmt_extra->execute(); $row_extra = $stmt_extra->fetch(PDO::FETCH_ASSOC); ``` ### 📊 **JSON 데이터 처리** ```php // 스크린/철재 구분하여 데이터 디코딩 if($major_category == '스크린') { $decodedEstimateList = json_decode($estimateList, true); } else if($major_category == '철재') { $decodedEstimateList = json_decode($estimateSlatList, true); } // JavaScript 변수로 전달 echo ''; ``` ## 🚨 주의사항 ### ⚠️ **필수 의존성** - PHP 7.4+ - MySQL/PDO - Bootstrap 5.x - jQuery 3.x ### 🔒 **보안 고려사항** - SQL 인젝션 방지를 위한 prepared statements 사용 - 입력값 검증 및 이스케이프 처리 - 세션 기반 인증 확인 ### 📱 **성능 최적화** - 데이터베이스 쿼리 최적화 - JSON 데이터 크기 제한 - 불필요한 데이터베이스 호출 최소화 ## 🐛 디버깅 가이드 ### 🔍 **일반적인 문제 해결** #### 1. 견적 정보가 표시되지 않는 경우 ```php // 데이터베이스 연결 확인 if (!$pdo) { echo "데이터베이스 연결 실패"; exit; } // 쿼리 결과 확인 $stmt = $pdo->prepare($sql); $stmt->bindValue(1, $num, PDO::PARAM_STR); $stmt->execute(); $count = $stmt->rowCount(); echo "조회된 행 수: " . $count; if ($count > 0) { $row = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row); // 결과 확인 } ``` #### 2. JSON 데이터 오류 ```php // JSON 디코딩 오류 확인 if($major_category == '스크린') { $decodedEstimateList = json_decode($estimateList, true); } else if($major_category == '철재') { $decodedEstimateList = json_decode($estimateSlatList, true); } if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON 디코딩 오류: " . json_last_error_msg(); echo "원본 데이터: " . ($major_category == '스크린' ? $estimateList : $estimateSlatList); } ``` #### 3. 추가 정보 조회 오류 ```php // output_extra 테이블 조회 확인 $sql_extra = "SELECT * FROM {$DB}.output_extra WHERE parent_num = ?"; $stmt_extra = $pdo->prepare($sql_extra); $stmt_extra->bindValue(1, $num, PDO::PARAM_STR); $stmt_extra->execute(); $row_extra = $stmt_extra->fetch(PDO::FETCH_ASSOC); if ($row_extra) { echo "추가 정보 존재: "; var_dump($row_extra); } else { echo "추가 정보 없음"; } ``` #### 4. 변수가 정의되지 않은 경우 ```php // 변수 존재 여부 확인 if (!isset($title_message)) { echo "title_message 변수가 정의되지 않았습니다."; } // 기본값 설정 $title_message = $title_message ?? '기본 제목'; $major_category = $major_category ?? '스크린'; $option = $option ?? 'option'; ``` ## 📚 관련 파일 ### 🔗 **의존성 파일** - `load_header.php`: 헤더 로드 - `mydb.php`: 데이터베이스 연결 - `fetch_unitprice.php`: 단가 조회 함수 - `_row.php`: 행 데이터 처리 - `_row_extra.php`: 추가 행 데이터 처리 ### 🔗 **연관 파일** - `lastJS.php`: 거래명세표 JavaScript - `compare_lastJS.php`: 견적 비교 JavaScript - `estimate_compare_head.php`: 견적 비교 헤더 - `common_screen.php`: 스크린 테이블 생성 - `common_slat.php`: 철재 테이블 생성 ### 🔗 **CSS 클래스** - `yellowBold`: 노란색 굵은 글씨 - `lightgray`: 연한 회색 배경 - `table-secondary`: 테이블 헤더 배경 - `w100px`: 100px 너비 ### 🔗 **JavaScript 변수** - `dataList`: 견적 데이터 배열 - `EstimateFirstSum`: 자동 견적금액 - `EstimateUpdatetSum`: 수정 견적금액 - `EstimateDiffer`: 견적 차액 - `EstimateFixAmount`: 견적확정액 - `EstimateDiscount`: 할인금액 - `EstimateFinalSum`: 최종 결정금액 - `EstimateDiscountRate`: 할인율 ## 🎯 향후 개선 방향 ### 🔄 **코드 리팩토링** - 클래스 기반 구조로 변경 - 설정 파일 분리 - 의존성 주입 패턴 도입 ### 🎨 **UI/UX 개선** - 반응형 디자인 개선 - 다크 모드 지원 - 접근성 향상 ### ⚡ **성능 최적화** - 데이터베이스 쿼리 최적화 - 캐싱 시스템 도입 - 이미지 최적화 ### 🔧 **기능 확장** - 다국어 지원 - 템플릿 시스템 도입 - 실시간 업데이트 ## 📊 거래명세표 구조 ### 🎯 **거래명세표 구성 요소** 1. **헤더 정보**: 제목, 업체 정보 2. **금액 계산**: 자동/수정/차액/확정/할인/최종 금액 3. **할인율 적용**: 사용자 입력 할인율 4. **VAT 포함**: 부가세 포함 금액 표시 ### 📈 **데이터 흐름** 1. **견적 번호 입력** → 데이터베이스 조회 2. **견적 정보 로드** → 변수에 할당 3. **추가 정보 조회** → output_extra 테이블 4. **JSON 데이터 디코딩** → JavaScript 변수로 전달 5. **헤더 출력** → HTML 렌더링 ### 🔄 **금액 계산 프로세스** 1. **자동 견적금액** → 시스템 자동 계산 2. **수정 견적금액** → 사용자 수정 3. **견적 차액** → 수정금액 - 자동금액 4. **견적확정액** → 우선순위에 따른 확정 5. **할인금액** → 확정액 × 할인율 6. **최종 결정금액** → 확정액 - 할인금액 ### 💰 **VAT 포함 계산** - 거래명세표는 VAT 포함 금액으로 표시 - 견적서와 달리 부가세가 포함된 최종 금액 - 할인율 적용 후 VAT 계산 --- **📅 문서 버전**: 1.0 **👨‍💻 작성자**: 개발팀 **📝 최종 수정일**: 2024-12-24 **🔗 관련 문서**: [견적 시스템 전체 가이드](./README.md), [common_addrowJS 개발자 가이드](./common_addrowJS_developer_guide.md), [common_screen 개발자 가이드](./common_screen_developer_guide.md), [common_slat 개발자 가이드](./common_slat_developer_guide.md), [compare_lastJS 개발자 가이드](./compare_lastJS_developer_guide.md), [compare_price_edit_table 개발자 가이드](./compare_price_edit_table_developer_guide.md), [estimate_compare_head 개발자 가이드](./estimate_compare_head_developer_guide.md), [lastJS 개발자 가이드](./lastJS_developer_guide.md)