- 52개 이상의 컴포넌트에 isNextRedirectError 처리 추가 - Server Action의 redirect() 에러가 catch 블록에서 삼켜지는 문제 해결 - access_token + refresh_token 모두 만료 시 정상적으로 로그인 페이지로 리다이렉트 수정된 영역: - accounting: 10개 컴포넌트 - production: 12개 컴포넌트 - hr: 5개 컴포넌트 - settings: 8개 컴포넌트 - approval: 5개 컴포넌트 - items: 20개+ 컴포넌트 - board: 5개 컴포넌트 - quality: 4개 컴포넌트 - material, outbound, quotes 등 기타 컴포넌트 Co-Authored-By: Claude <noreply@anthropic.com>
231 lines
9.2 KiB
TypeScript
231 lines
9.2 KiB
TypeScript
import type { DetailModalConfig } from '../types';
|
|
|
|
/**
|
|
* 접대비 상세 공통 모달 config (et2, et3, et4 공통)
|
|
*/
|
|
const entertainmentDetailConfig: DetailModalConfig = {
|
|
title: '접대비 상세',
|
|
summaryCards: [
|
|
// 첫 번째 줄: 당해년도
|
|
{ label: '당해년도 접대비 총한도', value: 3123000, unit: '원' },
|
|
{ label: '당해년도 접대비 잔여한도', value: 6000000, unit: '원' },
|
|
{ label: '당해년도 접대비 사용금액', value: 6000000, unit: '원' },
|
|
{ label: '당해년도 접대비 사용잔액', value: 0, unit: '원' },
|
|
// 두 번째 줄: 분기별
|
|
{ label: '1사분기 접대비 총한도', value: 3123000, unit: '원' },
|
|
{ label: '1사분기 접대비 잔여한도', value: 6000000, unit: '원' },
|
|
{ label: '1사분기 접대비 사용금액', value: 6000000, unit: '원' },
|
|
{ label: '1사분기 접대비 초과금액', value: 6000000, unit: '원' },
|
|
],
|
|
barChart: {
|
|
title: '월별 접대비 사용 추이',
|
|
data: [
|
|
{ name: '1월', value: 3500000 },
|
|
{ name: '2월', value: 4200000 },
|
|
{ name: '3월', value: 2300000 },
|
|
{ name: '4월', value: 3800000 },
|
|
{ name: '5월', value: 4500000 },
|
|
{ name: '6월', value: 3200000 },
|
|
{ name: '7월', value: 2800000 },
|
|
],
|
|
dataKey: 'value',
|
|
xAxisKey: 'name',
|
|
color: '#60A5FA',
|
|
},
|
|
pieChart: {
|
|
title: '사용자별 접대비 사용 비율',
|
|
data: [
|
|
{ name: '홍길동', value: 15000000, percentage: 53, color: '#60A5FA' },
|
|
{ name: '김철수', value: 10000000, percentage: 31, color: '#34D399' },
|
|
{ name: '이영희', value: 10000000, percentage: 10, color: '#FBBF24' },
|
|
{ name: '기타', value: 2000000, percentage: 6, color: '#F87171' },
|
|
],
|
|
},
|
|
table: {
|
|
title: '월별 접대비 사용 내역',
|
|
columns: [
|
|
{ key: 'no', label: 'No.', align: 'center' },
|
|
{ key: 'cardName', label: '카드명', align: 'left' },
|
|
{ key: 'user', label: '사용자', align: 'center' },
|
|
{ key: 'useDate', label: '사용일시', align: 'center', format: 'date' },
|
|
{ key: 'transDate', label: '거래일시', align: 'center', format: 'date' },
|
|
{ key: 'amount', label: '사용금액', align: 'right', format: 'currency' },
|
|
{ key: 'purpose', label: '사용용도', align: 'left' },
|
|
],
|
|
data: [
|
|
{ cardName: '카드명', user: '홍길동', useDate: '2025-12-12 12:12', transDate: '가맹점명', amount: 1000000, purpose: '사용용도' },
|
|
{ cardName: '카드명', user: '홍길동', useDate: '2025-12-12 12:12', transDate: '가맹점명', amount: 1000000, purpose: '사용용도' },
|
|
{ cardName: '카드명', user: '홍길동', useDate: '2025-12-12 12:12', transDate: '가맹점명', amount: 1000000, purpose: '사용용도' },
|
|
{ cardName: '카드명', user: '홍길동', useDate: '2025-10-14 12:12', transDate: '가맹점명', amount: 1000000, purpose: '사용용도' },
|
|
{ cardName: '카드명', user: '홍길동', useDate: '2025-12-12 12:12', transDate: '가맹점명', amount: 1000000, purpose: '사용용도' },
|
|
],
|
|
filters: [
|
|
{
|
|
key: 'user',
|
|
options: [
|
|
{ value: 'all', label: '전체' },
|
|
{ value: '홍길동', label: '홍길동' },
|
|
{ value: '김철수', label: '김철수' },
|
|
{ value: '이영희', label: '이영희' },
|
|
],
|
|
defaultValue: 'all',
|
|
},
|
|
{
|
|
key: 'sortOrder',
|
|
options: [
|
|
{ value: 'latest', label: '최신순' },
|
|
{ value: 'oldest', label: '등록순' },
|
|
{ value: 'amountDesc', label: '금액 높은순' },
|
|
{ value: 'amountAsc', label: '금액 낮은순' },
|
|
],
|
|
defaultValue: 'latest',
|
|
},
|
|
],
|
|
showTotal: true,
|
|
totalLabel: '합계',
|
|
totalValue: 11000000,
|
|
totalColumnKey: 'amount',
|
|
},
|
|
// 접대비 손금한도 계산 - 기본한도 / 수입금액별 추가한도
|
|
referenceTables: [
|
|
{
|
|
title: '접대비 손금한도 계산 - 기본한도',
|
|
columns: [
|
|
{ key: 'type', label: '구분', align: 'left' },
|
|
{ key: 'limit', label: '기본한도', align: 'right' },
|
|
],
|
|
data: [
|
|
{ type: '일반법인', limit: '3,600만원 (연 1,200만원)' },
|
|
{ type: '중소기업', limit: '5,400만원 (연 3,600만원)' },
|
|
],
|
|
},
|
|
{
|
|
title: '수입금액별 추가한도',
|
|
columns: [
|
|
{ key: 'range', label: '수입금액', align: 'left' },
|
|
{ key: 'rate', label: '적용률', align: 'center' },
|
|
],
|
|
data: [
|
|
{ range: '100억원 이하', rate: '0.3%' },
|
|
{ range: '100억원 초과 ~ 500억원 이하', rate: '0.2%' },
|
|
{ range: '500억원 초과', rate: '0.03%' },
|
|
],
|
|
},
|
|
],
|
|
// 접대비 계산
|
|
calculationCards: {
|
|
title: '접대비 계산',
|
|
cards: [
|
|
{ label: '기본한도', value: 36000000 },
|
|
{ label: '추가한도', value: 91170000, operator: '+' },
|
|
{ label: '접대비 손금한도', value: 127170000, operator: '=' },
|
|
],
|
|
},
|
|
// 접대비 현황 (분기별)
|
|
quarterlyTable: {
|
|
title: '접대비 현황',
|
|
rows: [
|
|
{ label: '접대비 한도', q1: 31792500, q2: 31792500, q3: 31792500, q4: 31792500, total: 127170000 },
|
|
{ label: '접대비 사용', q1: 10000000, q2: 0, q3: 0, q4: 0, total: 10000000 },
|
|
{ label: '접대비 잔여', q1: 21792500, q2: 31792500, q3: 31792500, q4: 31792500, total: 117170000 },
|
|
],
|
|
},
|
|
};
|
|
|
|
/**
|
|
* 접대비 현황 모달 설정
|
|
* et1: 당해 매출 상세
|
|
* et2, et3, et4: 접대비 상세 (공통)
|
|
*/
|
|
export function getEntertainmentModalConfig(cardId: string): DetailModalConfig | null {
|
|
const configs: Record<string, DetailModalConfig> = {
|
|
et1: {
|
|
title: '당해 매출 상세',
|
|
summaryCards: [
|
|
{ label: '당해년도 매출', value: 600000000, unit: '원' },
|
|
{ label: '전년 대비', value: '-12.5%', isComparison: true, isPositive: false },
|
|
{ label: '당월 매출', value: 6000000, unit: '원' },
|
|
],
|
|
barChart: {
|
|
title: '월별 매출 추이',
|
|
data: [
|
|
{ name: '1월', value: 85000000 },
|
|
{ name: '2월', value: 92000000 },
|
|
{ name: '3월', value: 78000000 },
|
|
{ name: '4월', value: 95000000 },
|
|
{ name: '5월', value: 88000000 },
|
|
{ name: '6월', value: 102000000 },
|
|
{ name: '7월', value: 60000000 },
|
|
],
|
|
dataKey: 'value',
|
|
xAxisKey: 'name',
|
|
color: '#60A5FA',
|
|
},
|
|
horizontalBarChart: {
|
|
title: '당해년도 거래처별 매출',
|
|
data: [
|
|
{ name: '(주)세우', value: 120000000 },
|
|
{ name: '대한건설', value: 95000000 },
|
|
{ name: '삼성테크', value: 78000000 },
|
|
{ name: '현대상사', value: 65000000 },
|
|
{ name: '기타', value: 42000000 },
|
|
],
|
|
color: '#60A5FA',
|
|
},
|
|
table: {
|
|
title: '일별 매출 내역',
|
|
columns: [
|
|
{ key: 'no', label: 'No.', align: 'center' },
|
|
{ key: 'date', label: '매출일', align: 'center', format: 'date' },
|
|
{ key: 'vendor', label: '거래처', align: 'left' },
|
|
{ key: 'amount', label: '매출금액', align: 'right', format: 'currency' },
|
|
{ key: 'type', label: '매출유형', align: 'center', highlightValue: '미설정' },
|
|
],
|
|
data: [
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '상품 매출' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '부품 매출' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '공사 매출' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '미설정' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '미설정' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '미설정' },
|
|
{ date: '2025-12-12', vendor: '회사명', amount: 11000000, type: '상품 매출' },
|
|
],
|
|
filters: [
|
|
{
|
|
key: 'type',
|
|
options: [
|
|
{ value: 'all', label: '전체' },
|
|
{ value: '상품 매출', label: '상품 매출' },
|
|
{ value: '부품 매출', label: '부품 매출' },
|
|
{ value: '공사 매출', label: '공사 매출' },
|
|
{ value: '임대 수익', label: '임대 수익' },
|
|
{ value: '기타 매출', label: '기타 매출' },
|
|
{ value: '미설정', label: '미설정' },
|
|
],
|
|
defaultValue: 'all',
|
|
},
|
|
{
|
|
key: 'sortOrder',
|
|
options: [
|
|
{ value: 'latest', label: '최신순' },
|
|
{ value: 'oldest', label: '등록순' },
|
|
{ value: 'amountDesc', label: '금액 높은순' },
|
|
{ value: 'amountAsc', label: '금액 낮은순' },
|
|
],
|
|
defaultValue: 'latest',
|
|
},
|
|
],
|
|
showTotal: true,
|
|
totalLabel: '합계',
|
|
totalValue: 111000000,
|
|
totalColumnKey: 'amount',
|
|
},
|
|
},
|
|
// et2, et3, et4는 모두 동일한 접대비 상세 모달
|
|
et2: entertainmentDetailConfig,
|
|
et3: entertainmentDetailConfig,
|
|
et4: entertainmentDetailConfig,
|
|
};
|
|
|
|
return configs[cardId] || null;
|
|
} |