refactor(WEB): 회계/견적/설정/생산 등 전반적 코드 개선 및 공통화 2차

- 회계 모듈 전면 개선: 청구/입금/출금/매입/매출/세금계산서/일반전표/거래처원장 등
- 견적 모듈 금액 포맷/할인/수식/미리보기 등 코드 정리
- 설정 모듈: 계정관리/직급/직책/권한 상세 간소화
- 생산 모듈: 작업지시서/작업자화면/검수 문서 코드 정리
- UniversalListPage 엑셀 다운로드 및 필터 기능 확장
- 대시보드/게시판/수주 등 날짜 유틸 공통화 적용
- claudedocs 문서 인덱스 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-20 10:45:47 +09:00
parent 71352923c8
commit f344dc7d00
123 changed files with 877 additions and 789 deletions

View File

@@ -23,6 +23,7 @@ import {
USER_ROLE_LABELS,
USER_ACCOUNT_STATUS_LABELS,
} from './types';
import { formatNumber } from '@/lib/utils/amount';
interface EmployeeDetailProps {
employee: Employee;
@@ -87,7 +88,7 @@ export function EmployeeDetail({ employee, onEdit, onDelete }: EmployeeDetailPro
{employee.salary && (
<div>
<dt className="text-sm font-medium text-muted-foreground"></dt>
<dd className="text-sm mt-1">{employee.salary.toLocaleString()}</dd>
<dd className="text-sm mt-1">{formatNumber(employee.salary)}</dd>
</div>
)}
{employee.bankAccount && (

View File

@@ -255,17 +255,17 @@ export function EmployeeManagement() {
// 테이블 컬럼 정의
const tableColumns = useMemo(() => [
{ key: 'rowNumber', label: '번호', className: 'w-[60px] text-center' },
{ key: 'employeeCode', label: '사원코드', className: 'min-w-[100px]' },
{ key: 'department', label: '부서', className: 'min-w-[100px]' },
{ key: 'position', label: '직책', className: 'min-w-[100px]' },
{ key: 'name', label: '이름', className: 'min-w-[80px]' },
{ key: 'rank', label: '직급', className: 'min-w-[80px]' },
{ key: 'phone', label: '휴대폰', className: 'min-w-[120px]' },
{ key: 'email', label: '이메일', className: 'min-w-[150px]' },
{ key: 'hireDate', label: '입사일', className: 'min-w-[100px]' },
{ key: 'status', label: '상태', className: 'min-w-[80px]' },
{ key: 'userId', label: '사용자아이디', className: 'min-w-[100px]' },
{ key: 'userRole', label: '권한', className: 'min-w-[80px]' },
{ key: 'employeeCode', label: '사원코드', className: 'min-w-[100px]', sortable: true },
{ key: 'department', label: '부서', className: 'min-w-[100px]', sortable: true },
{ key: 'position', label: '직책', className: 'min-w-[100px]', sortable: true },
{ key: 'name', label: '이름', className: 'min-w-[80px]', sortable: true },
{ key: 'rank', label: '직급', className: 'min-w-[80px]', sortable: true },
{ key: 'phone', label: '휴대폰', className: 'min-w-[120px]', sortable: true },
{ key: 'email', label: '이메일', className: 'min-w-[150px]', sortable: true },
{ key: 'hireDate', label: '입사일', className: 'min-w-[100px]', sortable: true },
{ key: 'status', label: '상태', className: 'min-w-[80px]', sortable: true },
{ key: 'userId', label: '사용자아이디', className: 'min-w-[100px]', sortable: true },
{ key: 'userRole', label: '권한', className: 'min-w-[80px]', sortable: true },
{ key: 'actions', label: '작업', className: 'w-[100px] text-right' },
], []);