Files
sam-docs/projects/quotation/phase-1-5130-analysis/ui-analysis.md
hskwon 1066ea25b2 docs: Phase 5 API 문서 추가 (사용자 초대, 알림설정, 계정관리)
- erp-api-list.md: Phase 5 섹션 추가 (12개 API)
- erp-api-detail.md: Phase 5 상세 스펙 추가
  - 13. 사용자 초대 (5개): 목록, 발송, 수락, 취소, 재발송
  - 14. 알림 설정 (3개): 조회, 수정, 일괄수정
  - 15. 계정 관리 (4개): 탈퇴, 사용중지, 약관조회, 약관수정
2025-12-19 15:35:41 +09:00

382 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UI/화면 분석
> **분석 대상:** 5130 레거시 견적 시스템 화면
> **분석 일자:** 2025-12-19
---
## 화면 목록
### 메인 화면
| 파일 | 화면명 | 설명 |
|------|--------|------|
| `list.php` | 견적 목록 | 견적서 리스트, 검색, 필터링 |
| `write_form.php` | 견적 작성 | 견적서 작성/수정 폼 (103KB, 핵심 파일) |
| `viewEstimate.php` | 견적서 보기 | 견적서 조회/출력 |
| `statistics.php` | 견적 통계 | 통계 대시보드 |
### 견적 유형별 화면
| 파일 | 화면명 | 설명 |
|------|--------|------|
| `estimate.php` | 스크린 견적 | 스크린 견적서 메인 |
| `estimateSlat.php` | 슬랫 견적 | 슬랫(철재) 견적서 메인 |
| `estimateUnit.php` | 단가 견적 | 단가 기반 견적서 |
| `screen_view_original.php` | 스크린 상세 | 스크린 견적 상세 뷰 |
| `slat_view_original.php` | 슬랫 상세 | 슬랫 견적 상세 뷰 |
### 상세/수정 화면
| 파일 | 화면명 | 설명 |
|------|--------|------|
| `edit.php` | 견적 수정 | 스크린 견적 수정 |
| `edit_slat.php` | 슬랫 수정 | 슬랫 견적 수정 |
| `viewEstimateDetail.php` | 상세 보기 | 견적 상세 정보 |
| `EsDetail_screen.php` | 스크린 상세 | 스크린 항목 상세 |
| `EsDetail_slat.php` | 슬랫 상세 | 슬랫 항목 상세 |
| `compare.php` | 견적 비교 | 견적 버전 비교 |
### 출력/다운로드
| 파일 | 화면명 | 설명 |
|------|--------|------|
| `print_list.php` | 목록 인쇄 | 견적 목록 인쇄용 |
| `downloadExcel.php` | 엑셀 다운로드 | 견적서 엑셀 내보내기 |
| `saveExcel.php` | 엑셀 저장 | 엑셀 파일 저장 |
---
## 1. 견적 목록 (list.php)
### 화면 구조
```
┌─────────────────────────────────────────────────────────────┐
│ 견적 List [새로고침] │
├─────────────────────────────────────────────────────────────┤
│ ▷ 123건 접수일 [2025-02-19] ~ [2025-12-19] │
│ [전체] [스크린] [철재] 제품모델▼ 검색[______] [검색] │
│ [신규] │
├─────────────────────────────────────────────────────────────┤
│ 번호│접수일 │견적번호 │구분 │제품│수량│금액 │발주처...│
│─────│────────│────────────│──────│────│────│──────│─────────│
│ 123 │25-12-19│KD-PR-251219│스크린│KSS01│ 5 │5,000K│(주)ABC │
│ 122 │25-12-18│KD-PR-251218│철재 │KFS01│ 3 │3,200K│(주)DEF │
│ ... │ │ │ │ │ │ │ │
└─────────────────────────────────────────────────────────────┘
```
### 필터/검색 조건
| 항목 | 타입 | 설명 |
|------|------|------|
| `fromdate` | date | 시작일 (기본: -10개월) |
| `todate` | date | 종료일 (기본: +1개월) |
| `major_category` | radio | 전체/스크린/철재 |
| `model_name` | select | 제품 모델 선택 |
| `search` | text | 전체 컬럼 검색 |
### 테이블 컬럼
| 컬럼 | 폭 | 설명 |
|------|-----|------|
| 번호 | 30px | 일련번호 (역순) |
| 접수일 | 100px | indate |
| 견적번호 | 100px | pjnum |
| 구분 | 80px | major_category (스크린/철재) |
| 제품코드 | 80px | model_name |
| 수량 | 80px | estimateSurang |
| 금액 | 80px | estimateTotal |
| 발주처 | 150px | secondord |
| 담당자 | 80px | secondordman |
| 연락처 | 120px | secondordmantel |
| 현장명 | 200px | outworkplace |
| 작성자 | 80px | orderman |
| 비고 | 300px | comment |
### 기능 버튼
- **새로고침**: `location.reload()`
- **검색**: 필터 조건으로 목록 갱신
- **신규**: `write_form.php` 이동
---
## 2. 견적 작성 폼 (write_form.php)
### 화면 모드
| 모드 | 설명 |
|------|------|
| 신규 (`mode=''`) | 새 견적 작성 |
| 수정 (`mode=modify`) | 기존 견적 수정 |
| 복사 (`mode=copy`) | 기존 견적 복사하여 신규 생성 |
| 발주 (`header=header`) | 수주에서 발주 산출 |
| 스크린 수정 (`itemoption=screen`) | 스크린 발주서 수정 |
| 슬랫 수정 (`itemoption=slat`) | 철재스라트 발주서 수정 |
### 화면 구조 (추정)
```
┌─────────────────────────────────────────────────────────────┐
│ 견적 산출 │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────── 기본 정보 ────────────┐ │
│ │ 접수일: [2025-12-19] │ │
│ │ 견적번호: KD-PR-251219-01 │ │
│ │ 담당자: 홍길동 │ │
│ │ 현장명: (주)ABC 빌딩 │ │
│ └───────────────────────────────────┘ │
│ │
│ ┌──────────── 발주처 정보 ──────────┐ │
│ │ 발주처: ____________ │ │
│ │ 담당자: ____________ 연락처: ____│ │
│ └───────────────────────────────────┘ │
│ │
│ ┌──────────── 제품 정보 ────────────┐ │
│ │ 대분류: (●)스크린 (○)철재 │ │
│ │ 모델명: [KSS01 ▼] │ │
│ │ 제작폭: [160] 제작높이: [350] │ │
│ │ 마구리윙: [50] │ │
│ └───────────────────────────────────┘ │
│ │
│ ┌──────────── 옵션 체크 ────────────┐ │
│ │ [✓] 절곡 [✓] 모터 [✓] 보증 │ │
│ │ [✓] 슬랫 [✓] 부자재 │ │
│ └───────────────────────────────────┘ │
│ │
│ ┌──────────── 견적 항목 ────────────┐ │
│ │ 검사비: [50,000] │ │
│ │ │ │
│ │ [스크린 견적 테이블] │ │
│ │ [슬랫 견적 테이블] │ │
│ └───────────────────────────────────┘ │
│ │
│ ┌──────────── 금액 합계 ────────────┐ │
│ │ 수량: 5 합계: 5,000,000 │ │
│ │ 할인율: 10% 할인액: 500,000 │ │
│ │ 최종금액: 4,500,000 │ │
│ └───────────────────────────────────┘ │
│ │
│ [저장] [취소] [삭제] │
└─────────────────────────────────────────────────────────────┘
```
### 주요 입력 필드
#### 기본 정보
| 필드 | 변수명 | 타입 | 기본값 |
|------|--------|------|--------|
| 접수일 | `indate` | date | 오늘 |
| 견적번호 | `pjnum` | text | 자동생성 |
| 담당자 | `orderman` | text | 로그인 사용자 |
| 현장명 | `outworkplace` | text | - |
#### 발주처 정보
| 필드 | 변수명 | 타입 |
|------|--------|------|
| 발주처 | `secondord` | text |
| 담당자 | `secondordman` | text |
| 연락처 | `secondordmantel` | text |
#### 제품 정보
| 필드 | 변수명 | 타입 | 기본값 |
|------|--------|------|--------|
| 대분류 | `major_category` | radio | 스크린 |
| 모델명 | `model_name` | select | - |
| 제작폭 | `makeWidth` | number | 160 (스크린), 110 (슬랫) |
| 제작높이 | `makeHeight` | number | 350 |
| 마구리윙 | `maguriWing` | number | 50 |
#### 옵션 체크박스
| 필드 | 변수명 | 영향 |
|------|--------|------|
| 절곡 | `steel` | 케이스, 레일, 연기차단재, 하장바, L바, 보강평철 |
| 모터 | `motor` | 모터 가격 포함 |
| 보증 | `warranty` | 보증기간 표시 |
| 슬랫 | `slatcheck` | 주자재(슬랫), 조인트바 |
| 부자재 | `partscheck` | 샤프트, 각파이프, 앵글 |
#### 금액 정보
| 필드 | 변수명 | 설명 |
|------|--------|------|
| 검사비 | `inspectionFee` | 인정검사비 (기본: 50,000) |
| 수량 | `estimateSurang` | 총 수량 |
| 합계 | `estimateTotal` | 견적 총액 |
| 최초합계 | `EstimateFirstSum` | 최초 견적 합계 |
| 수정합계 | `EstimateUpdatetSum` | 수정 견적 합계 |
| 차액 | `EstimateDiffer` | 최초-수정 차액 |
| 할인율 | `EstimateDiscountRate` | % |
| 할인액 | `EstimateDiscount` | 원 |
| 최종금액 | `EstimateFinalSum` | 최종 결정 금액 |
### CSS 클래스
```css
/* 수동 편집된 셀 강조 */
.manually-edited {
background-color: #f8d7da !important;
}
/* readonly 체크박스 */
.readonly-checkbox,
.readonly-radio {
pointer-events: none;
opacity: 1;
}
/* 커스텀 너비 */
.w-40, .w-50, .w-60, .w-85 { ... }
```
---
## 3. 견적 항목 테이블
### 스크린 견적 테이블 (estimateList)
| 열 | 필드명 | 설명 |
|----|--------|------|
| 항목명 | `item_name` | 품목 이름 |
| 규격 | `specification` | 규격/사양 |
| 단위 | `unit` | EA, m², m, kg |
| 수량 | `quantity` | 수량 |
| 단가 | `unit_price` | 단가 |
| 금액 | `amount` | quantity × unit_price |
| 비고 | `remark` | 메모 |
### 슬랫 견적 테이블 (estimateSlatList)
스크린과 동일 구조
### 자동계산 테이블 (estimateList_auto, estimateSlatList_auto)
| 열 | 필드명 | 설명 |
|----|--------|------|
| 항목코드 | `item_code` | 자동계산 항목 코드 |
| 항목명 | `item_name` | 품목 이름 |
| 계산타입 | `calc_type` | per_meter, per_area 등 |
| 기준값 | `base_value` | 계산 기준 수치 |
| 단가 | `unit_price` | 단가 |
| 금액 | `amount` | 계산 결과 |
---
## 4. API 엔드포인트 (AJAX 호출)
### 데이터 조회
| 엔드포인트 | 용도 |
|------------|------|
| `fetch_unitprice.php` | 단가 조회 |
| `fetch_date.php` | 날짜 정보 |
| `fetch_receiver.php` | 수신자 정보 |
| `fetch_outworkplace.php` | 현장 목록 |
| `fetch_length_data.php` | 길이 데이터 |
| `fetch_price.php` | 가격 정보 |
### 금액 계산
| 엔드포인트 | 용도 |
|------------|------|
| `get_estimate_amount.php` | 견적 금액 라우터 |
| `get_screen_amount.php` | 스크린 금액 계산 |
| `get_slat_amount.php` | 슬랫 금액 계산 |
| `recalc_row.php` | 행 재계산 |
### 데이터 저장
| 엔드포인트 | 용도 |
|------------|------|
| `insert.php` | 견적 저장 (신규) |
| `update.php` | 견적 수정 |
| `delete.php` | 견적 삭제 |
| `insert_estimate.php` | 견적 등록 |
| `insert_detail.php` | 상세 저장 |
### 기타
| 엔드포인트 | 용도 |
|------------|------|
| `generate_serial_pjnum.php` | 견적번호 생성 |
| `get_initial_pjnum.php` | 초기 견적번호 |
| `insert_logmenu.php` | 로그 기록 |
---
## 5. JavaScript 처리
### 공통 스크립트 (common/)
| 파일 | 용도 |
|------|------|
| `calculation.js` | 행 계산 로직 |
| `lastJS.php` | 페이지 공통 JS |
| `common_screen.php` | 스크린 공통 |
| `common_slat.php` | 슬랫 공통 |
### 주요 이벤트 처리
```javascript
// 수량/단가 변경 시 금액 재계산
function calculateRowTotal(row) { ... }
// 옵션 체크박스 변경 시 항목 재계산
$('input[name="steel"]').change(function() { ... });
// 모델 변경 시 단가 조회
$('#model_name').change(function() {
// AJAX: fetch_unitprice.php
});
// 크기 변경 시 전체 재계산
$('#makeWidth, #makeHeight').change(function() {
// AJAX: get_estimate_amount.php
});
```
---
## 6. 사용자 권한
### 접근 레벨
```php
// 레벨 5 이하만 접근 가능
if(!isset($_SESSION["level"]) || $_SESSION["level"]>5) {
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
```
### 작성 권한자
```php
$authorities = [
"개발자", "전진", "노완호", "이세희",
"함신옥", "손금주", "이은진", "이경호"
];
```
---
## SAM 이관 시 UI 고려사항
### 1. Livewire + Blade 전환
| 5130 | SAM |
|------|-----|
| jQuery AJAX | Livewire wire:click |
| PHP 직접 렌더링 | Blade 컴포넌트 |
| 전역 변수 | Livewire 프로퍼티 |
| form submit | wire:submit |
### 2. 컴포넌트 분리
```
resources/views/livewire/quotation/
├── quote-list.blade.php # 목록
├── quote-form.blade.php # 작성/수정
├── quote-detail.blade.php # 상세
├── components/
│ ├── quote-table.blade.php # 견적 테이블
│ ├── option-checkboxes.blade.php # 옵션 체크박스
│ └── amount-summary.blade.php # 금액 요약
```
### 3. 반응형 개선
- 현재: 고정 너비 테이블
- 개선: Tailwind 반응형 그리드
### 4. UX 개선점
- 실시간 금액 계산 (debounce 적용)
- 자동저장 (draft 기능)
- 견적 버전 비교 UI
- 모바일 최적화
---
## 참조 파일
- `list.php:111-192` - 목록 테이블 구조
- `write_form.php:1-300` - 폼 초기화 로직
- `common/calculation.js` - 행 계산 로직
- `_row.php` - 행 렌더링 공통
- `_request.php` - 요청 파라미터 처리