# 회계 (Accounting) 분석

## 개요
- **디렉토리**: `/account/`
- **DB 테이블**: `account` (메인), `recordlist` (미수금 약속이력)
- **주요 기능**: 금전출납, 미수금 관리, 매출채권 관리, 거래처별 잔액

## 디렉토리 구조
```
/account/
├── _request.php               # 요청 파라미터 (17개)
├── _row.php                   # 행 렌더링
├── insert.php                 # 회계 저장
├── insert_bulk.php            # 대량 저장
├── list.php                   # 회계 목록 (92KB)
├── list_daily.php             # 일별 목록 (23KB)
├── detail.php                 # 상세 보기
├── modal.php                  # 모달 팝업
├── fetch_modal.php            # 모달 데이터 조회 (21KB)
├── fetch_balance.php          # 잔액 조회
├── fetch_options.php          # 옵션 조회
├── fetch_todoMonthly.php      # 월별 할일
│
├── receivable.php             # 미수금 현황 (35KB)
├── receivablelist.php         # 미수금 목록 (28KB)
├── baddebt.php                # 대손 관리 (29KB)
│
├── S_transaction.php          # 거래 내역 (30KB)
├── s_transaction_sheet.php    # 거래 시트 (26KB)
├── month_sales.php            # 월별 매출 (31KB)
├── monthly_balance_popup.php  # 월별 잔액 팝업
│
├── customer_last.php          # 거래처 최근 거래 (23KB)
├── schedule.php               # 일정 관리 (14KB)
├── settings.php               # 설정 (15KB)
│
├── saveExcel.php              # 엑셀 저장
├── downloadExcel.php          # 엑셀 다운로드
├── order_saveExcel.php        # 주문 엑셀 저장
├── customer_saveExcel.php     # 거래처 엑셀 저장
│
├── accoutlist.php             # 계정 목록
├── cardlist.php               # 카드 목록
├── get_electronic_bills.php   # 전자세금계산서 조회
│
├── accountContents.json       # 계정과목 설정 (6KB)
├── accoutlist.json            # 계정 목록 JSON
├── cardlist.json              # 카드 목록 JSON
├── bankbook.txt               # 통장 목록
│
├── css/                       # 스타일시트
├── excel/                     # 엑셀 출력
└── json/                      # JSON 데이터
```

## DB 스키마

### account 테이블
```sql
CREATE TABLE account (
    num INT AUTO_INCREMENT PRIMARY KEY,

    -- 기본 정보
    registDate DATE,               -- 거래일
    dueDate DATE,                  -- 만기일/결제예정일
    endorsementDate DATE,          -- 배서일 (전자어음)

    -- 입출 구분
    inoutsep VARCHAR(20),          -- 입출구분 (수입/지출)

    -- 내용 정보
    content VARCHAR(200),          -- 내용 (대분류: 거래처 수금, 자재비 등)
    contentSub VARCHAR(200),       -- 내용 상세 (중분류)
    content_detail TEXT,           -- 상세 내용 (적요)

    -- 금액
    amount DECIMAL(15,0),          -- 금액 (콤마 제거 후 저장)

    -- 은행/결제 정보
    bankbook VARCHAR(100),         -- 통장/결제수단

    -- 거래처 정보
    secondordnum VARCHAR(50),      -- 거래처 번호 (발주번호)
    parentEBNum VARCHAR(50),       -- 부모 전자어음 번호

    -- 시스템 필드
    first_writer VARCHAR(100),     -- 최초 작성자 (날짜 + 이름)
    update_log TEXT,               -- 수정이력
    searchtag TEXT,                -- 검색태그
    is_deleted TINYINT DEFAULT 0,  -- 삭제플래그

    INDEX idx_registDate (registDate),
    INDEX idx_inoutsep (inoutsep),
    INDEX idx_content (content),
    INDEX idx_secondordnum (secondordnum)
);
```

### recordlist 테이블 (미수금 약속 이력)
```sql
CREATE TABLE recordlist (
    num INT AUTO_INCREMENT PRIMARY KEY,
    secondordnum VARCHAR(50),      -- 거래처 번호
    primisedate DATE,              -- 약속일
    comment TEXT,                  -- 코멘트
    is_deleted TINYINT DEFAULT 0,  -- 삭제플래그

    INDEX idx_secondordnum (secondordnum)
);
```

## 계정과목 구조 (accountContents.json)

### 수입 계정
```json
{
    "수입": {
        "거래처 수금": {
            "description": "거래처에서 입금한 금액",
            "level": 1,
            "하위계정": ["외상매출금"]
        },
        "차입금": {
            "description": "대출금(개인,은행 등)",
            "level": 1
        },
        "이자": {
            "description": "결산이자",
            "level": 1,
            "하위계정": ["이자수익"]
        },
        "최초전월이월": {
            "description": "금전출납부 시작",
            "level": 1
        },
        "잡이익": {
            "description": "잡이익",
            "level": 1
        }
    }
}
```

### 지출 계정
```json
{
    "지출": {
        "자재비": {"하위계정": ["외상매입금"]},
        "급여": {"하위계정": ["임직원급여", "상여금"]},
        "복리후생비": {"description": "직원 식대외 직원 작업복등"},
        "소모품비": {"description": "각종 소모품 비용"},
        "차량유지비": {"description": "유류대, 통행료"},
        "운반비": {"description": "택배운반비외 각종운반비"},
        "통신비": {"description": "전화요금, 인터넷요금"},
        "수도요금": {"하위계정": ["수도광열비"]},
        "전기요금": {"하위계정": ["수도광열비"]},
        "보험료": {"description": "차량보험료, 화재보험료등"},
        "세금과공과금": {"description": "등록면허세, 취득세, 재산세등"},
        "접대비": {"description": "경조사비용"},
        "교통비": {"하위계정": ["여비교통비"]},
        "카드대금": {"하위계정": ["미지급비용"]},
        "이자비용": {"하위계정": ["국민은행"]},
        "차입금상환": {"description": "대출에 의한 차입금"},
        "임차료": {"description": "지급임차료"},
        "렌트비용": {"하위계정": ["지급임차료"]},
        "수선비": {"description": "수선비"},
        "개발비": {"description": "프로그램 개발비용"},
        "기계장치": {"description": "기계구입"},
        "선급금": {"description": "미리 지급하는 금액"},
        "예치금": {"description": "예치금"},
        "보증금": {"하위계정": ["기타보증금"]},
        "수수료": {"하위계정": ["지급수수료"]},
        "외상매출채권(전자어음)": {"description": "외상매출채권(전자어음)"}
    }
}
```

## 비즈니스 로직

### 회계 등록 (insert.php)
```php
// 검색태그 생성
$searchtag = $registDate . ' ' . $inoutsep . ' ' . $content . ' ' .
             $contentSub . ' ' . $amount . $content_detail;

// INSERT
$sql = "INSERT INTO account (
    registDate, inoutsep, content, content_detail, amount,
    dueDate, searchtag, update_log, first_writer, bankbook,
    secondordnum, contentSub, endorsementDate, parentEBNum
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

// 금액에서 콤마 제거
$amount = str_replace(',', '', $amount);
```

### 미수금 계산 (receivable.php)
```php
// 이월 잔액 계산
$previousMonthFromDate = date("Y-m-01", strtotime($previousMonth . '01'));
$previousMonthToDate = date("Y-m-t", strtotime($previousMonth . '01'));

// recordlist에서 약속일/코멘트 조회
$recordSql = "
    SELECT secondordnum, primisedate, comment
    FROM recordlist
    WHERE (is_deleted IS NULL or is_deleted = 0)
    ORDER BY num DESC
";

// 거래처별 미수금 = 청구금액 - 입금금액
```

### 잔액 조회 (fetch_balance.php)
- 월별 이월 잔액 계산
- 거래처별 채권/채무 현황
- 전자어음 만기 관리

## 회계 유형

### 1. 금전출납 (Daily Cash)
- **파일**: `list.php`, `list_daily.php`
- **특징**: 일자별 입출금 기록
- **주요 기능**: 일계표, 월계표

### 2. 미수금 관리 (Receivable)
- **파일**: `receivable.php`, `receivablelist.php`
- **특징**: 거래처별 미수금 추적
- **주요 기능**: 이월잔액, 약속일 관리, 대손 처리

### 3. 거래 내역 (Transaction)
- **파일**: `S_transaction.php`, `s_transaction_sheet.php`
- **특징**: 거래처별 거래 이력
- **주요 기능**: 거래처 원장, 거래 명세

### 4. 월별 매출 (Monthly Sales)
- **파일**: `month_sales.php`
- **특징**: 월별 매출 집계
- **주요 기능**: 매출 통계, 추이 분석

## work 테이블 회계 연동

### work 테이블 내 금액 필드
```sql
-- 견적/청구 금액
sum_estimate DECIMAL(15,0),        -- 견적합계
decided_estimate DECIMAL(15,0),    -- 확정견적

-- 청구/발행 금액
sum_bill DECIMAL(15,0),            -- 청구합계
totalbill DECIMAL(15,0),           -- 총청구액
issued_amount DECIMAL(15,0),       -- 발행금액

-- 입금/미수금
sum_deposit DECIMAL(15,0),         -- 입금합계
total_deposit DECIMAL(15,0),       -- 총입금액
sum_receivable DECIMAL(15,0),      -- 미수금
total_receivable DECIMAL(15,0),    -- 총미수금
receivable DECIMAL(15,0),          -- 미수잔액
issued_receivable DECIMAL(15,0),   -- 발행미수금

-- 클레임
sum_claimamount DECIMAL(15,0),     -- 클레임금액

-- JSON 리스트
accountList TEXT,                   -- 회계 리스트 (JSON)
estimateList TEXT,                  -- 견적 리스트 (JSON)
```

### accountList JSON 구조
```json
[
    {
        "date": "2025-01-15",
        "type": "입금",
        "amount": 5000000,
        "memo": "1차 입금"
    },
    {
        "date": "2025-02-15",
        "type": "청구",
        "amount": 10000000,
        "memo": "세금계산서 발행"
    }
]
```

## SAM 마이그레이션 포인트

### 1. 회계 테이블 정규화
```sql
-- SAM: 회계 전표
journal_entries (
    id,
    tenant_id,
    entry_number,              -- 전표번호
    entry_date,                -- 전표일자
    entry_type,                -- income, expense, transfer

    -- 계정 정보
    account_code,              -- 계정코드 (계정과목 테이블 참조)
    sub_account_code,          -- 하위계정코드

    -- 금액
    debit_amount,              -- 차변
    credit_amount,             -- 대변

    -- 상대방
    counterpart_id,            -- 거래처 ID
    counterpart_name,

    -- 결제 정보
    payment_method,            -- cash, bank, card, note
    bank_account,
    due_date,

    -- 참조
    reference_type,            -- project, shipment, purchase
    reference_id,

    description,
    created_by,
    created_at
)
```

### 2. 계정과목 테이블
```sql
-- SAM: 계정과목 마스터
account_codes (
    id,
    tenant_id,
    code,                      -- 계정코드
    name,                      -- 계정명
    parent_id,                 -- 상위 계정
    level,                     -- 계층 레벨

    account_type,              -- asset, liability, equity, income, expense
    is_cash_account,           -- 현금성 계정 여부
    is_receivable,             -- 매출채권 여부
    is_payable,                -- 매입채무 여부

    description,
    is_active,
    sort_order
)
```

### 3. 미수금 관리 분리
```sql
-- SAM: 채권 관리
receivables (
    id,
    tenant_id,
    receivable_number,
    customer_id,

    -- 채권 정보
    original_amount,           -- 원금
    paid_amount,               -- 입금액
    balance,                   -- 잔액 (computed)

    -- 일자
    invoice_date,              -- 청구일
    due_date,                  -- 만기일

    -- 상태
    status,                    -- open, partial, paid, overdue, bad_debt

    -- 약속 관리
    promised_date,
    promised_memo,

    -- 참조
    project_id,
    invoice_id,

    created_at,
    closed_at
)

-- SAM: 채권 이력
receivable_histories (
    id,
    receivable_id,
    action,                    -- created, payment, promise, overdue, bad_debt
    amount,
    note,
    created_by,
    created_at
)
```

### 4. 전자어음 관리
```sql
-- SAM: 전자어음
electronic_notes (
    id,
    tenant_id,
    note_number,               -- 어음번호

    -- 어음 정보
    drawer,                    -- 발행인
    payee,                     -- 수취인
    amount,
    issue_date,                -- 발행일
    due_date,                  -- 만기일

    -- 배서 정보
    endorsement_date,          -- 배서일
    endorsee,                  -- 피배서인

    -- 상태
    status,                    -- issued, endorsed, collected, dishonored

    -- 참조
    parent_note_id,            -- 분할 시 부모
    receivable_id,

    created_at
)
```

### 5. 통합 재무 현황
```sql
-- SAM: 월별 재무 요약 (캐시 테이블)
monthly_financial_summaries (
    id,
    tenant_id,
    year_month,                -- YYYYMM

    -- 수입
    total_income,
    income_by_category JSON,

    -- 지출
    total_expense,
    expense_by_category JSON,

    -- 채권/채무
    receivables_balance,
    payables_balance,

    -- 현금 흐름
    cash_beginning,
    cash_ending,

    calculated_at
)
```

## 특이사항

### 계정과목 JSON 관리
- 계정과목이 `accountContents.json` 파일로 관리됨
- 2단계 계층구조 (대분류 → 하위계정)
- SAM에서는 DB 테이블로 정규화 권장

### 미수금-약속일 연동
- `recordlist` 테이블로 거래처별 약속일/코멘트 관리
- 최신 약속만 표시 (ORDER BY num DESC)
- SAM에서는 이력 관리로 확장 필요

### work 테이블 금액 동기화
- 공사별 회계 정보가 work 테이블에 집계됨
- `accountList` JSON으로 상세 내역 저장
- SAM에서는 정규화된 테이블로 관계 설정

## 참고 파일
- `/account/insert.php` - 회계 저장 로직
- `/account/_request.php` - 17개 요청 변수
- `/account/accountContents.json` - 계정과목 설정
- `/account/receivable.php` - 미수금 계산 로직
- `/account/fetch_balance.php` - 잔액 조회
