# compare_price_edit_table.php 개발자 가이드
## 📋 개요
`compare_price_edit_table.php`는 방화셔터 견적 시스템의 단가 수정 기능을 담당하는 핵심 PHP 컴포넌트입니다. 이 파일은 스크린 원단과 절곡판의 단가를 실시간으로 수정하고 적용할 수 있는 인터페이스를 제공하며, 데이터베이스에서 최신 단가 정보를 조회하여 표시합니다.
## 🏗️ 파일 구조
### 📁 파일 위치
```
/estimate/common/compare_price_edit_table.php
```
### 📊 파일 정보
- **파일 크기**: 3.2KB (103 lines)
- **주요 언어**: PHP + HTML + JavaScript
- **의존성**: Bootstrap, jQuery, MySQL/PDO
- **주요 기능**: 단가 조회, 단가 수정, 실시간 적용
## 🔧 핵심 기능
### 1. **데이터베이스 연결 및 의존성**
```php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/estimate/fetch_unitprice.php");
$pdo = db_connect();
```
### 2. **단가 변수 초기화**
```php
// 스크린 원단 가격
$price_screen = 0;
// 절곡판 단가 4종
$price_egi_1_2t = 0; // EGI 1.15T, 1.2T
$price_egi_1_6t = 0; // EGI 1.55T, 1.6T
$price_sus_1_2t = 0;
$price_sus_1_5t = 0;
```
## 📊 데이터베이스 조회 시스템
### 🗄️ **스크린 원단 가격 조회**
```php
// price_raw_materials 테이블에서 스크린 실리카 가격
$query = "SELECT itemList FROM {$DB}.price_raw_materials WHERE is_deleted IS NULL OR is_deleted = 0 ORDER BY num DESC LIMIT 1";
$stmt = $pdo->prepare($query);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
$itemList = json_decode($row['itemList'], true);
$price_screen = slatPrice($itemList, '스크린', '실리카');
}
```
### 🗄️ **절곡판 단가 조회**
```php
// BDmodels 테이블에서 절곡판 단가 4종 로딩
$query = "SELECT * FROM {$DB}.BDmodels WHERE seconditem = '절곡판' AND is_deleted IS NULL ORDER BY num DESC";
$stmt = $pdo->prepare($query);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$spec = $row['spec'] ?? '';
$finishing = $row['finishing_type'] ?? '';
$unitprice = intval(str_replace(',', '', $row['unitprice'] ?? 0));
if (in_array($spec, ['1.15T', '1.2T']) && $finishing === 'EGI') $price_egi_1_2t = $unitprice;
if (in_array($spec, ['1.55T', '1.6T']) && $finishing === 'EGI') $price_egi_1_6t = $unitprice;
if ($spec === '1.2T' && $finishing === 'SUS') $price_sus_1_2t = $unitprice;
if ($spec === '1.5T' && $finishing === 'SUS') $price_sus_1_5t = $unitprice;
}
```
## 🎨 UI 구조
### 📋 **테이블 구조**
```html
```
### 📊 **단가 항목 구조**
```html
| 스크린 원단 (㎡) |
|
|
| EGI 1.15T / 1.2T |
|
|
| EGI 1.55T / 1.6T |
|
|
| SUS 1.2T |
|
|
| SUS 1.5T |
|
|
```
## 🔧 JavaScript 기능
### 🎯 **단가 적용 기능**
```javascript
$(document).ready(function () {
$('.apply-price').on('click', function () {
const targetId = $(this).data('target');
const price = parseFloat($('#' + targetId).val().replace(/,/g, '')) || 0;
$('.unit-price-input').each(function () {
const $this = $(this);
if ($this.data('target') === targetId) {
const row = $this.closest('tr');
const su = parseFloat(row.find('.su-input').val().replace(/,/g, '')) || 0;
const total = price * su;
$this.val(price.toLocaleString());
row.find('.total-price').text(total.toLocaleString());
}
});
});
});
```
## 📊 단가 항목 분류
### 🎯 **단가 항목별 상세**
#### **1. 스크린 원단**
- **ID**: `price_screen`
- **단위**: ㎡ (제곱미터)
- **데이터 소스**: `price_raw_materials` 테이블
- **조건**: 스크린, 실리카
#### **2. EGI 절곡판 1.15T/1.2T**
- **ID**: `price_egi_1_2t`
- **규격**: 1.15T, 1.2T
- **마감**: EGI
- **데이터 소스**: `BDmodels` 테이블
#### **3. EGI 절곡판 1.55T/1.6T**
- **ID**: `price_egi_1_6t`
- **규격**: 1.55T, 1.6T
- **마감**: EGI
- **데이터 소스**: `BDmodels` 테이블
#### **4. SUS 절곡판 1.2T**
- **ID**: `price_sus_1_2t`
- **규격**: 1.2T
- **마감**: SUS
- **데이터 소스**: `BDmodels` 테이블
#### **5. SUS 절곡판 1.5T**
- **ID**: `price_sus_1_5t`
- **규격**: 1.5T
- **마감**: SUS
- **데이터 소스**: `BDmodels` 테이블
## 🗄️ 데이터베이스 스키마
### 📋 **price_raw_materials 테이블**
```sql
-- 스크린 원단 가격 조회
SELECT itemList
FROM price_raw_materials
WHERE is_deleted IS NULL OR is_deleted = 0
ORDER BY num DESC
LIMIT 1
```
### 📋 **BDmodels 테이블**
```sql
-- 절곡판 단가 조회
SELECT *
FROM BDmodels
WHERE seconditem = '절곡판'
AND is_deleted IS NULL
ORDER BY num DESC
```
### 📊 **필드 구조**
- **spec**: 규격 (1.15T, 1.2T, 1.55T, 1.6T, 1.5T)
- **finishing_type**: 마감 타입 (EGI, SUS)
- **unitprice**: 단가 (콤마 포함 문자열)
- **is_deleted**: 삭제 여부
## 🔧 개발자 사용법
### 📝 **기본 사용법**
```php
// 파일 포함
include_once('/estimate/common/compare_price_edit_table.php');
// 단가 변수 사용
echo "스크린 단가: " . number_format($price_screen);
echo "EGI 1.2T 단가: " . number_format($price_egi_1_2t);
```
### 🎯 **단가 적용 로직**
```javascript
// 특정 단가 적용
function applySpecificPrice(targetId, newPrice) {
const price = parseFloat(newPrice.replace(/,/g, '')) || 0;
$('.unit-price-input').each(function () {
const $this = $(this);
if ($this.data('target') === targetId) {
const row = $this.closest('tr');
const su = parseFloat(row.find('.su-input').val().replace(/,/g, '')) || 0;
const total = price * su;
$this.val(price.toLocaleString());
row.find('.total-price').text(total.toLocaleString());
}
});
}
```
### 🔄 **데이터베이스 업데이트**
```php
// 단가 업데이트 예시
function updatePrice($table, $spec, $finishing, $newPrice) {
global $pdo, $DB;
$query = "UPDATE {$DB}.BDmodels
SET unitprice = :price
WHERE spec = :spec
AND finishing_type = :finishing
AND is_deleted IS NULL";
$stmt = $pdo->prepare($query);
$stmt->bindParam(':price', $newPrice);
$stmt->bindParam(':spec', $spec);
$stmt->bindParam(':finishing', $finishing);
return $stmt->execute();
}
```
## 🚨 주의사항
### ⚠️ **필수 의존성**
- PHP 7.4+
- MySQL/PDO
- jQuery 3.x
- Bootstrap 5.x
### 🔒 **보안 고려사항**
- SQL 인젝션 방지를 위한 prepared statements 사용
- 입력값 검증 및 이스케이프 처리
- 세션 기반 인증 확인
### 📱 **성능 최적화**
- 데이터베이스 쿼리 최적화
- 캐싱 전략 고려
- 불필요한 데이터베이스 호출 최소화
## 🐛 디버깅 가이드
### 🔍 **일반적인 문제 해결**
#### 1. 단가가 표시되지 않는 경우
```php
// 데이터베이스 연결 확인
if (!$pdo) {
echo "데이터베이스 연결 실패";
exit;
}
// 쿼리 결과 확인
$stmt = $pdo->prepare($query);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row); // 결과 확인
```
#### 2. 단가 적용이 안 되는 경우
```javascript
// JavaScript 디버깅
$('.apply-price').on('click', function () {
const targetId = $(this).data('target');
const price = parseFloat($('#' + targetId).val().replace(/,/g, '')) || 0;
console.log('Target ID:', targetId);
console.log('Price:', price);
// 대상 요소 확인
const targetElements = $('.unit-price-input[data-target="' + targetId + '"]');
console.log('Target elements found:', targetElements.length);
});
```
#### 3. 데이터베이스 오류
```php
// PDO 오류 처리
try {
$stmt = $pdo->prepare($query);
$stmt->execute();
} catch (PDOException $e) {
echo "데이터베이스 오류: " . $e->getMessage();
error_log("PDO Error: " . $e->getMessage());
}
```
## 📚 관련 파일
### 🔗 **의존성 파일**
- `session.php`: 세션 관리
- `mydb.php`: 데이터베이스 연결
- `fetch_unitprice.php`: 단가 조회 함수
### 🔗 **연관 파일**
- `compare_lastJS.php`: 견적 비교 JavaScript
- `common_screen.php`: 스크린 테이블 생성
- `common_slat.php`: 철재 테이블 생성
### 🔗 **데이터베이스 테이블**
- `price_raw_materials`: 원자재 가격 정보
- `BDmodels`: 제품 모델 및 단가 정보
### 🔗 **JavaScript 연동**
- `apply-price`: 단가 적용 버튼
- `price-input`: 단가 입력 필드
- `unit-price-input`: 단가 표시 필드
## 🎯 향후 개선 방향
### 🔄 **코드 리팩토링**
- 클래스 기반 구조로 변경
- 설정 파일 분리
- 의존성 주입 패턴 도입
### 🎨 **UI/UX 개선**
- 실시간 단가 검증
- 단가 변경 히스토리
- 드래그 앤 드롭 단가 적용
### ⚡ **성능 최적화**
- 단가 캐싱 시스템
- 비동기 단가 업데이트
- 데이터베이스 인덱스 최적화
### 🔧 **기능 확장**
- 다중 통화 지원
- 단가 버전 관리
- 자동 단가 업데이트
## 📊 단가 관리 시스템
### 🎯 **단가 업데이트 프로세스**
1. **데이터베이스 조회**: 최신 단가 정보 조회
2. **사용자 입력**: 새로운 단가 입력
3. **실시간 적용**: 선택된 항목에 단가 적용
4. **총액 재계산**: 수량 × 단가로 총액 계산
### 📈 **단가 변동 추적**
- 기존 단가와 신규 단가 비교
- 단가 변동 비율 계산
- 단가 변경 이력 관리
### 🔄 **자동화 기능**
- 정기적인 단가 업데이트
- 단가 변동 알림
- 단가 유효성 검증
---
**📅 문서 버전**: 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)