/** * TrusteeImportProcessView * * Tab-based wrapper for the "Import & Verarbeitung" page. Consolidates the * three import-related entry points under a single navigation item: * - receipts : Belege verarbeiten (SharePoint -> Buchhaltung pipeline) * - upload : Beleg hochladen (scan/manual upload) * - sync : Daten einlesen (redirects to accounting settings, * tab 'import-data' for the actual sync UI) * * The tab is controlled via the URL query parameter `?tab=...`, so * QuickActions and deep links stay stable. */ import React, { useCallback, useEffect } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { useLanguage } from '../../../providers/language/LanguageContext'; import styles from './TrusteeViews.module.css'; import { TrusteeExpenseImportView } from './TrusteeExpenseImportView'; import { TrusteeScanUploadView } from './TrusteeScanUploadView'; interface TabDef { id: string; icon: string; color: string; } const _TABS: TabDef[] = [ { id: 'receipts', icon: '\uD83D\uDCC4', color: '#4CAF50' }, { id: 'upload', icon: '\uD83D\uDCF7', color: '#607D8B' }, { id: 'sync', icon: '\uD83D\uDD04', color: '#FF9800' }, ]; function _tabLabel(tabId: string, t: (k: string) => string): string { switch (tabId) { case 'receipts': return t('Belege verarbeiten'); case 'upload': return t('Beleg hochladen'); case 'sync': return t('Daten einlesen'); default: return tabId; } } function _tabDescription(tabId: string, t: (k: string) => string): string { switch (tabId) { case 'receipts': return t('Belege aus SharePoint importieren, klassifizieren und verbuchen.'); case 'upload': return t('Beleg scannen oder als Datei hochladen.'); case 'sync': return t('Buchhaltungsdaten aus dem externen System einlesen.'); default: return ''; } } export const TrusteeImportProcessView: React.FC = () => { const { t } = useLanguage(); const navigate = useNavigate(); const { mandateId, featureCode, instanceId } = useParams<{ mandateId: string; featureCode: string; instanceId: string }>(); const [searchParams, setSearchParams] = useSearchParams(); const activeTab = searchParams.get('tab') || _TABS[0].id; const _setActiveTab = useCallback((tab: string) => { setSearchParams({ tab }, { replace: true }); }, [setSearchParams]); useEffect(() => { if (activeTab !== 'sync') return; if (!mandateId || !featureCode || !instanceId) return; const target = `/mandates/${mandateId}/${featureCode}/${instanceId}/settings?tab=import-data`; navigate(target, { replace: true }); }, [activeTab, mandateId, featureCode, instanceId, navigate]); return (
{_tabDescription(activeTab, t)}
{activeTab === 'receipts' &&{t('Weiterleitung zu den Buchhaltungs-Einstellungen…')}