gcx/frontend/admin-web/src/pages/compliance/TaxCompliancePage.tsx

273 lines
16 KiB
TypeScript
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.

import React from 'react';
/**
* Tax Compliance Management - 税务合规管理
*
* 管理平台在各司法管辖区的税务义务,追踪联邦和州级税务申报,
* 包括所得税、销售税、预扣税、交易税等以及IRS表格提交进度。
*/
const taxStats = [
{ label: '应纳税额', value: '$1,245,890', color: 'var(--color-primary)' },
{ label: '已缴税额', value: '$982,450', color: 'var(--color-success)' },
{ label: '税务合规率', value: '96.8%', color: 'var(--color-info)' },
{ label: '待处理事项', value: '5', color: 'var(--color-warning)' },
];
const taxObligations = [
{ jurisdiction: 'Federal', taxType: 'Corporate Income Tax', period: 'FY 2025', amount: '$425,000', paid: '$425,000', status: '已缴', dueDate: '2026-04-15' },
{ jurisdiction: 'Federal', taxType: 'Employment Tax (FICA)', period: 'Q4 2025', amount: '$68,200', paid: '$68,200', status: '已缴', dueDate: '2026-01-31' },
{ jurisdiction: 'California', taxType: 'State Income Tax', amount: '$187,500', paid: '$187,500', period: 'FY 2025', status: '已缴', dueDate: '2026-04-15' },
{ jurisdiction: 'California', taxType: 'Sales & Use Tax', amount: '$42,300', paid: '$42,300', period: 'Q4 2025', status: '已缴', dueDate: '2026-01-31' },
{ jurisdiction: 'New York', taxType: 'State Income Tax', amount: '$156,800', paid: '$120,000', period: 'FY 2025', status: '部分缴纳', dueDate: '2026-04-15' },
{ jurisdiction: 'New York', taxType: 'Metropolitan Commuter Tax', amount: '$12,400', paid: '$0', period: 'FY 2025', status: '待缴', dueDate: '2026-04-15' },
{ jurisdiction: 'Texas', taxType: 'Franchise Tax', amount: '$34,600', paid: '$34,600', period: 'FY 2025', status: '已缴', dueDate: '2026-05-15' },
{ jurisdiction: 'Florida', taxType: 'Sales Tax', amount: '$28,900', paid: '$28,900', period: 'Q4 2025', status: '已缴', dueDate: '2026-01-31' },
{ jurisdiction: 'Federal', taxType: 'Estimated Tax (Q1 2026)', amount: '$263,190', paid: '$0', period: 'Q1 2026', status: '待缴', dueDate: '2026-04-15' },
];
const taxTypeBreakdown = [
{ type: 'Income Tax (所得税)', federal: '$425,000', state: '$344,300', total: '$769,300', percentage: 61.7 },
{ type: 'Sales/Use Tax (销售税)', federal: '-', state: '$71,200', total: '$71,200', percentage: 5.7 },
{ type: 'Employment/Withholding Tax (预扣税)', federal: '$68,200', state: '$45,600', total: '$113,800', percentage: 9.1 },
{ type: 'Transaction Tax (交易税)', federal: '$28,400', state: '$0', total: '$28,400', percentage: 2.3 },
{ type: 'Estimated Tax (预估税)', federal: '$263,190', state: '$0', total: '$263,190', percentage: 21.2 },
];
const irsFilings = [
{ form: 'Form 1120', description: '公司所得税申报', taxYear: '2025', deadline: '2026-04-15', status: '准备中', filedDate: '-' },
{ form: 'Form 1099-K', description: '支付卡和第三方网络交易', taxYear: '2025', deadline: '2026-01-31', status: '已提交', filedDate: '2026-01-28' },
{ form: 'Form 1099-MISC', description: '杂项收入(承包商支付)', taxYear: '2025', deadline: '2026-01-31', status: '已提交', filedDate: '2026-01-29' },
{ form: 'Form 1099-NEC', description: '非雇员报酬', taxYear: '2025', deadline: '2026-01-31', status: '已提交', filedDate: '2026-01-30' },
{ form: 'Form 941', description: '雇主季度联邦税', taxYear: 'Q4 2025', deadline: '2026-01-31', status: '已提交', filedDate: '2026-01-25' },
{ form: 'Form W-2', description: '工资与税务声明', taxYear: '2025', deadline: '2026-01-31', status: '已提交', filedDate: '2026-01-27' },
{ form: 'Form 1042-S', description: '外国人预扣所得', taxYear: '2025', deadline: '2026-03-15', status: '准备中', filedDate: '-' },
{ form: 'Form 8300', description: '现金支付超$10,000报告', taxYear: '2025', deadline: '交易后15天', status: '按需提交', filedDate: '-' },
];
const taxDeadlines = [
{ date: '2026-01-31', event: 'Form 1099-K/1099-MISC/W-2 提交截止', done: true },
{ date: '2026-01-31', event: 'Q4 Employment Tax (Form 941) 截止', done: true },
{ date: '2026-03-15', event: 'Form 1042-S 外国人预扣税申报截止', done: false },
{ date: '2026-04-15', event: 'Form 1120 公司所得税申报截止', done: false },
{ date: '2026-04-15', event: 'Q1 2026 Estimated Tax Payment', done: false },
{ date: '2026-04-15', event: 'CA/NY State Income Tax 截止', done: false },
{ date: '2026-05-15', event: 'Texas Franchise Tax 截止', done: false },
{ date: '2026-06-15', event: 'Q2 2026 Estimated Tax Payment', done: false },
];
const getPaymentStatusStyle = (status: string) => {
switch (status) {
case '已缴':
return { background: 'var(--color-success-light)', color: 'var(--color-success)' };
case '部分缴纳':
return { background: 'var(--color-warning-light)', color: 'var(--color-warning)' };
case '待缴':
return { background: 'var(--color-error-light)', color: 'var(--color-error)' };
default:
return { background: 'var(--color-gray-100)', color: 'var(--color-text-tertiary)' };
}
};
const getFilingStatusStyle = (status: string) => {
switch (status) {
case '已提交':
return { background: 'var(--color-success-light)', color: 'var(--color-success)' };
case '准备中':
return { background: 'var(--color-warning-light)', color: 'var(--color-warning)' };
case '按需提交':
return { background: 'var(--color-info-light)', color: 'var(--color-info)' };
case '逾期':
return { background: 'var(--color-error-light)', color: 'var(--color-error)' };
default:
return { background: 'var(--color-gray-100)', color: 'var(--color-text-tertiary)' };
}
};
export const TaxCompliancePage: React.FC = () => {
return (
<div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 24 }}>
<h1 style={{ font: 'var(--text-h1)', color: 'var(--color-text-primary)' }}></h1>
<button style={{
padding: '8px 16px',
border: 'none',
borderRadius: 'var(--radius-full)',
background: 'var(--color-primary)',
color: 'white',
cursor: 'pointer',
font: 'var(--text-label-sm)',
}}>
</button>
</div>
{/* Stats */}
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 16, marginBottom: 24 }}>
{taxStats.map(s => (
<div key={s.label} style={{
background: 'var(--color-surface)', borderRadius: 'var(--radius-md)',
border: '1px solid var(--color-border-light)', padding: 20,
}}>
<div style={{ font: 'var(--text-body-sm)', color: 'var(--color-text-tertiary)', marginBottom: 8 }}>{s.label}</div>
<div style={{ font: 'var(--text-h1)', color: s.color }}>{s.value}</div>
</div>
))}
</div>
{/* Tax Obligations by Jurisdiction */}
<div style={{
background: 'var(--color-surface)', borderRadius: 'var(--radius-md)',
border: '1px solid var(--color-border-light)', overflow: 'hidden', marginBottom: 24,
}}>
<div style={{ padding: '16px 20px', borderBottom: '1px solid var(--color-border-light)' }}>
<h2 style={{ font: 'var(--text-h2)', color: 'var(--color-text-primary)' }}></h2>
</div>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ background: 'var(--color-gray-50)' }}>
{['管辖区', '税种', '期间', '应缴金额', '已缴金额', '截止日期', '状态'].map(h => (
<th key={h} style={{ font: 'var(--text-label-sm)', color: 'var(--color-text-tertiary)', padding: '10px 14px', textAlign: 'left' }}>{h}</th>
))}
</tr>
</thead>
<tbody>
{taxObligations.map((t, i) => (
<tr key={i} style={{ borderBottom: '1px solid var(--color-border-light)' }}>
<td style={{ padding: '10px 14px' }}>
<span style={{
padding: '2px 8px', borderRadius: 'var(--radius-full)',
background: t.jurisdiction === 'Federal' ? 'var(--color-primary-light)' : 'var(--color-info-light)',
color: t.jurisdiction === 'Federal' ? 'var(--color-primary)' : 'var(--color-info)',
font: 'var(--text-caption)', fontWeight: 600,
}}>{t.jurisdiction}</span>
</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-primary)' }}>{t.taxType}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-tertiary)' }}>{t.period}</td>
<td style={{ font: 'var(--text-label-sm)', padding: '10px 14px', color: 'var(--color-text-primary)' }}>{t.amount}</td>
<td style={{ font: 'var(--text-label-sm)', padding: '10px 14px', color: 'var(--color-success)' }}>{t.paid}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-tertiary)' }}>{t.dueDate}</td>
<td style={{ padding: '10px 14px' }}>
<span style={{
padding: '2px 8px', borderRadius: 'var(--radius-full)', font: 'var(--text-caption)', fontWeight: 600,
...getPaymentStatusStyle(t.status),
}}>{t.status}</span>
</td>
</tr>
))}
</tbody>
</table>
</div>
{/* Tax Type Breakdown + IRS Filings */}
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 24, marginBottom: 24 }}>
{/* Tax Type Breakdown */}
<div style={{
background: 'var(--color-surface)', borderRadius: 'var(--radius-md)',
border: '1px solid var(--color-border-light)', overflow: 'hidden',
}}>
<div style={{ padding: '16px 20px', borderBottom: '1px solid var(--color-border-light)' }}>
<h2 style={{ font: 'var(--text-h2)', color: 'var(--color-text-primary)' }}></h2>
</div>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ background: 'var(--color-gray-50)' }}>
{['税种', '联邦', '州级', '合计', '占比'].map(h => (
<th key={h} style={{ font: 'var(--text-label-sm)', color: 'var(--color-text-tertiary)', padding: '10px 14px', textAlign: 'left' }}>{h}</th>
))}
</tr>
</thead>
<tbody>
{taxTypeBreakdown.map((row, i) => (
<tr key={i} style={{ borderBottom: '1px solid var(--color-border-light)' }}>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-primary)' }}>{row.type}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-secondary)' }}>{row.federal}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-secondary)' }}>{row.state}</td>
<td style={{ font: 'var(--text-label-sm)', padding: '10px 14px', color: 'var(--color-text-primary)' }}>{row.total}</td>
<td style={{ padding: '10px 14px' }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
<div style={{ flex: 1, height: 6, background: 'var(--color-gray-100)', borderRadius: 'var(--radius-full)', overflow: 'hidden' }}>
<div style={{ width: `${row.percentage}%`, height: '100%', background: 'var(--color-primary)', borderRadius: 'var(--radius-full)' }} />
</div>
<span style={{ font: 'var(--text-caption)', color: 'var(--color-text-tertiary)', minWidth: 40, textAlign: 'right' }}>{row.percentage}%</span>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
{/* Tax Calendar / Deadlines */}
<div style={{ background: 'var(--color-surface)', borderRadius: 'var(--radius-md)', border: '1px solid var(--color-border-light)', padding: 20 }}>
<h2 style={{ font: 'var(--text-h2)', marginBottom: 16 }}></h2>
{taxDeadlines.map((evt, i) => (
<div key={i} style={{ display: 'flex', alignItems: 'flex-start', padding: '10px 0', borderBottom: '1px solid var(--color-border-light)' }}>
<div style={{
width: 20, height: 20, borderRadius: '50%', marginRight: 12, marginTop: 2, flexShrink: 0,
display: 'flex', alignItems: 'center', justifyContent: 'center',
background: evt.done ? 'var(--color-success)' : 'var(--color-error)',
color: 'white', fontSize: 10,
}}>
{evt.done ? '✓' : '!'}
</div>
<div style={{ flex: 1 }}>
<div style={{ font: 'var(--text-body)', color: 'var(--color-text-primary)' }}>{evt.event}</div>
<div style={{ font: 'var(--text-caption)', color: 'var(--color-text-tertiary)', marginTop: 2 }}>{evt.date}</div>
</div>
<span style={{
font: 'var(--text-caption)',
color: evt.done ? 'var(--color-success)' : 'var(--color-error)',
}}>
{evt.done ? '已完成' : '待处理'}
</span>
</div>
))}
</div>
</div>
{/* IRS Filing Tracker */}
<div style={{
background: 'var(--color-surface)', borderRadius: 'var(--radius-md)',
border: '1px solid var(--color-border-light)', overflow: 'hidden',
}}>
<div style={{ padding: '16px 20px', borderBottom: '1px solid var(--color-border-light)' }}>
<h2 style={{ font: 'var(--text-h2)', color: 'var(--color-text-primary)' }}>IRS表格提交追踪</h2>
</div>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ background: 'var(--color-gray-50)' }}>
{['表格', '说明', '税务年度', '截止日期', '提交日期', '状态'].map(h => (
<th key={h} style={{ font: 'var(--text-label-sm)', color: 'var(--color-text-tertiary)', padding: '10px 14px', textAlign: 'left' }}>{h}</th>
))}
</tr>
</thead>
<tbody>
{irsFilings.map((f, i) => (
<tr key={i} style={{ borderBottom: '1px solid var(--color-border-light)' }}>
<td style={{ padding: '10px 14px' }}>
<span style={{
padding: '2px 10px', borderRadius: 'var(--radius-full)',
background: 'var(--color-primary-light)', color: 'var(--color-primary)',
font: 'var(--text-label-sm)', fontWeight: 600,
}}>{f.form}</span>
</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-primary)' }}>{f.description}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-tertiary)' }}>{f.taxYear}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-secondary)' }}>{f.deadline}</td>
<td style={{ font: 'var(--text-body-sm)', padding: '10px 14px', color: 'var(--color-text-tertiary)' }}>{f.filedDate}</td>
<td style={{ padding: '10px 14px' }}>
<span style={{
padding: '2px 8px', borderRadius: 'var(--radius-full)', font: 'var(--text-caption)', fontWeight: 600,
...getFilingStatusStyle(f.status),
}}>{f.status}</span>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
);
};