diff --git a/INVESTORS_GUIDE.md b/INVESTORS_GUIDE.md new file mode 100644 index 0000000..e25704e --- /dev/null +++ b/INVESTORS_GUIDE.md @@ -0,0 +1,224 @@ +# Investoren-Leitfaden + +## Übersicht + +Dieser Leitfaden erklärt die Investitions-Features der Creator Agencies Plattform und wie Sie diese nutzen können, um Ihre Dividenden-Investitionsstrategie zu planen. + +## 🎯 Zielsetzung + +Die Investitions-Tools sind darauf ausgelegt, Ihnen zu helfen: + +1. **Realistische Finanzplanung** - Verstehen Sie, wieviel Kapital für ein bestimmtes passives Einkommen benötigt wird +2. **Steuerliche Auswirkungen** - Vergleichen Sie verschiedene Länder und deren Steuersysteme +3. **Portfolio-Diversifikation** - Entdecken Sie Top-Unternehmen für Dividenden-Investitionen +4. **Bildung** - Lernen Sie die Grundlagen von Dividenden-Investitionen + +## 💰 Dividenden-Rendite-Rechner + +### Funktionsweise + +Der Rechner arbeitet in folgenden Schritten: + +1. **Eingabe des Netto-Ziels**: Geben Sie Ihr gewünschtes monatliches Netto-Einkommen ein +2. **Länderauswahl**: Wählen Sie Deutschland, USA oder Schweiz +3. **Steuerberechnung**: Der Rechner berechnet alle relevanten Steuern und Abgaben +4. **Brutto-Ermittlung**: Berechnung des benötigten Brutto-Dividenden-Einkommens +5. **Kapitalberechnung**: Ermittlung des erforderlichen Investitionskapitals +6. **Portfolio-Vorschlag**: Generierung eines diversifizierten Beispiel-Portfolios + +### Steuerliche Berechnungen + +#### Deutschland 🇩🇪 + +**Basis-Steuern:** +- Kapitalertragsteuer: 25% (Abgeltungssteuer) +- Solidaritätszuschlag: 5,5% auf die Kapitalertragsteuer +- **Effektiv**: 26,375% Steuerlast + +**Optional (für Selbstständige/Nicht-Versicherte):** +- Krankenversicherung: 14,6% des Einkommens +- Rentenversicherung: 18,6% des Einkommens + +**Freibeträge:** +- Sparer-Pauschbetrag: €1.000 pro Jahr (€2.000 für Verheiratete) + +**Beispiel:** +``` +Netto-Ziel: €1.200/Monat = €14.400/Jahr ++ Kapitalertragsteuer (25%): €4.800 ++ Solidaritätszuschlag (5,5% von €4.800): €264 += Brutto-Bedarf: €19.464/Jahr + +Bei 3% Dividendenrendite: +€19.464 / 0.03 = €648.800 Investition erforderlich +``` + +#### USA 🇺🇸 + +**Steuern:** +- Federal Income Tax: durchschnittlich 22% +- Long-term Capital Gains: 15% (für qualifizierte Dividenden) +- Self-Employment Tax: 15,3% (falls zutreffend) + +**Freibeträge:** +- Standard Deduction: $13.850 (Single, 2023) + +**Besonderheiten:** +- Qualifizierte Dividenden werden mit 15% besteuert (günstiger als Einkommensteuer) +- Bundes- und Staatsebene können unterschiedliche Steuern haben + +#### Schweiz 🇨🇭 + +**Steuern:** +- Einkommensteuer: variiert je nach Kanton (Durchschnitt ~20%) +- Verrechnungssteuer: 35% (teilweise rückforderbar) +- Keine Kapitalertragssteuer für Privatanleger + +**Sozialversicherung:** +- AHV/IV/EO: 10,55% (für Selbstständige) + +**Besonderheit:** +- Die Schweiz hat keine Kapitalertragssteuer für private Wertpapiergewinne +- Dividenden unterliegen der Verrechnungssteuer, die bei der Steuererklärung zurückgefordert werden kann + +## 📊 Investoren-Tipps Seite + +### Top Unternehmen nach Sektor + +#### Gaming (5 Unternehmen) + +| Unternehmen | Ticker | Div.-Rendite | Marktkapital. | +|-------------|--------|--------------|---------------| +| Nintendo | NTDOY | 2,8% | $55B | +| Microsoft | MSFT | 0,8% | $2.800B | +| Sony | SONY | 0,4% | $110B | +| EA | EA | 0,6% | $38B | +| Take-Two | TTWO | 0,0% | $28B | + +#### Tech (8 Unternehmen) + +| Unternehmen | Ticker | Div.-Rendite | Marktkapital. | +|-------------|--------|--------------|---------------| +| IBM | IBM | 4,5% | $140B | +| Cisco | CSCO | 3,0% | $200B | +| Intel | INTC | 2,0% | $180B | +| Microsoft | MSFT | 0,8% | $2.800B | +| Apple | AAPL | 0,5% | $3.000B | +| Meta | META | 0,3% | $900B | +| NVIDIA | NVDA | 0,03% | $1.200B | +| Alphabet | GOOGL | 0,0% | $1.800B | + +#### Infrastruktur (5 Unternehmen) + +| Unternehmen | Ticker | Div.-Rendite | Marktkapital. | +|-------------|--------|--------------|---------------| +| Crown Castle | CCI | 5,5% | $48B | +| Digital Realty | DLR | 3,5% | $38B | +| American Tower | AMT | 2,8% | $95B | +| Equinix | EQIX | 1,8% | $72B | +| SBA Communications | SBAC | 0,8% | $25B | + +### Investitions-Strategien + +#### 1. High-Dividend-Strategie +- Fokus auf Unternehmen mit Dividendenrendite > 3% +- Beispiele: IBM (4,5%), Crown Castle (5,5%), Digital Realty (3,5%) +- **Vorteil**: Höhere sofortige Erträge +- **Nachteil**: Möglicherweise langsameres Wachstum + +#### 2. Dividend-Growth-Strategie +- Fokus auf Unternehmen mit starkem Dividendenwachstum +- Beispiele: Microsoft (10,2% Wachstum), Nintendo (12,5%), NVIDIA (15%) +- **Vorteil**: Langfristiges Einkommenswachstum +- **Nachteil**: Niedrigere anfängliche Rendite + +#### 3. Balanced-Strategie +- Mischung aus High-Dividend und Growth-Aktien +- Diversifikation über Sektoren +- **Vorteil**: Ausgewogenes Risiko-Rendite-Profil +- **Nachteil**: Erfordert mehr Überwachung + +## 💡 Praktische Tipps + +### Für Anfänger + +1. **Klein anfangen**: Beginnen Sie mit einem Sparplan +2. **Diversifizieren**: Verteilen Sie Ihr Geld auf mehrere Unternehmen +3. **Reinvestieren**: Nutzen Sie Dividenden für weitere Käufe +4. **Geduld haben**: Dividenden-Investitionen sind langfristig +5. **Kosten beachten**: Achten Sie auf Transaktionsgebühren + +### Für Fortgeschrittene + +1. **Dividend Aristocrats**: Suchen Sie nach Unternehmen mit 25+ Jahren Dividendenwachstum +2. **Payout Ratio**: Ideal sind 40-60% (nachhaltig) +3. **Dividenden-Wachstumsrate**: Mindestens Inflation + 2-3% +4. **Sektor-Allokation**: Nicht mehr als 30% in einem Sektor +5. **Rebalancing**: Jährliche Überprüfung und Anpassung + +### Steueroptimierung + +#### Deutschland +- Nutzen Sie den Sparer-Pauschbetrag (€1.000) +- Freistellungsauftrag bei Ihrer Bank einrichten +- Verlusttöpfe für Verrechnung nutzen + +#### USA +- Halten Sie Aktien > 1 Jahr für niedrigere Steuern +- Nutzen Sie Tax-Advantaged Accounts (IRA, 401k) +- Ernten Sie steuerliche Verluste (Tax-Loss Harvesting) + +#### Schweiz +- Verrechnungssteuer zurückfordern +- Kantonale Unterschiede beachten +- Wertschriftenverzeichnis führen + +## ⚠️ Risiken und Disclaimer + +### Investitionsrisiken + +1. **Marktrisiko**: Aktienkurse können fallen +2. **Dividendenkürzungen**: Unternehmen können Dividenden reduzieren +3. **Währungsrisiko**: Bei ausländischen Aktien +4. **Inflationsrisiko**: Kaufkraft kann sinken +5. **Konzentrationsrisiko**: Zu wenig Diversifikation + +### Wichtige Hinweise + +⚠️ **Keine Anlageberatung**: Die Informationen auf dieser Plattform sind rein informativ und stellen keine Anlageberatung dar. + +⚠️ **Eigene Recherche**: Führen Sie immer eigene Due Diligence durch. + +⚠️ **Professionelle Beratung**: Konsultieren Sie einen lizenzierten Finanzberater für individuelle Empfehlungen. + +⚠️ **Historische Daten**: Vergangene Performance ist keine Garantie für zukünftige Ergebnisse. + +## 📚 Weiterführende Ressourcen + +### Bücher +- "The Intelligent Investor" von Benjamin Graham +- "The Little Book of Common Sense Investing" von John Bogle +- "Dividenden-Strategie" von Christian W. Röhl + +### Websites +- SEC.gov (US) - Offizielle Unternehmensberichte +- BaFin.de (DE) - Finanzaufsicht +- FINMA.ch (CH) - Schweizer Finanzmarktaufsicht + +### Tools +- Yahoo Finance - Kostenlose Aktiendaten +- Morningstar - Research und Analysen +- DivTracker - Dividenden-Portfolio-Management + +## 🔄 Aktualisierungen + +Die Daten auf dieser Plattform werden regelmäßig aktualisiert, basieren aber auf historischen Werten. Für aktuelle Daten prüfen Sie bitte: + +- Unternehmensdividenden: Investor Relations Webseiten +- Steuersätze: Offizielle Regierungswebseiten +- Aktienkurse: Börsen-Echtzeit-Daten + +--- + +**Letzte Aktualisierung**: November 2024 +**Version**: 1.0.0 diff --git a/README.md b/README.md index f211443..dbff07a 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,13 @@ Eine barrierefreie und übersichtliche Tabelle von Creator-Agenturen im DACH-Raum (Deutschland, Österreich, Schweiz). Diese Anwendung bietet eine einfache und zugängliche Möglichkeit, Agenturen nach verschiedenen Kriterien zu filtern und zu sortieren. +## 📸 Screenshots + +### Hauptansicht +![Creator Agencies Main View](https://github.com/user-attachments/assets/30593dad-5493-4e39-8290-56b211c758c1) + +*Übersichtliche Darstellung aller Creator-Agenturen mit umfangreichen Filter- und Sortierfunktionen* + ## ♿ Barrierefreiheit (Accessibility) Diese Anwendung wurde nach den **WCAG 2.1 AA Standards** entwickelt und bietet: @@ -37,6 +44,7 @@ npm run audit:a11y ## Features +### 🏢 Creator-Agenturen Verzeichnis - **Übersichtliche Darstellung** von Creator-Agenturen im DACH-Raum - **Erweiterte Filterung** nach: - Agentur-Name (Volltext-Suche) @@ -49,7 +57,56 @@ npm run audit:a11y - **Sortierung** nach allen Spalten - **Responsive Design** für Desktop, Tablet und Mobile - **Modal-Details** für detaillierte Agentur-Informationen -- **Export-Funktionalität** (geplant) + +### 📊 Investoren-Tipps Seite +- **Top 100 Unternehmen** aus Gaming, Tech und Infrastruktur +- **18 Premium-Unternehmen** mit detaillierten Dividenden-Informationen: + - 5 Gaming-Unternehmen (Microsoft, EA, Nintendo, Sony, Take-Two) + - 8 Tech-Unternehmen (Apple, Microsoft, NVIDIA, Meta, Intel, etc.) + - 5 Infrastruktur-Unternehmen (Cell Towers, Data Centers) +- **Filterbare Ansicht** nach Sektor +- **Sortierbar** nach Dividendenrendite, Marktkapitalisierung oder Name +- **Detaillierte Unternehmensdaten**: + - Ticker-Symbol und Börse + - Marktkapitalisierung + - Dividendenrendite + - Ausschüttungshäufigkeit (monatlich/vierteljährlich/jährlich) + - Analystenbewertungen (Buy/Hold/Sell) + - 5-Jahres Dividendenwachstum +- **Investitions-Tipps** für Anfänger + +### 💰 Dividenden-Rendite-Rechner +- **Netto-zu-Brutto Kalkulation** für passives Einkommen +- **Multi-Country Support**: + - 🇩🇪 **Deutschland**: + - Kapitalertragsteuer (25%) + - Solidaritätszuschlag (5,5%) + - Krankenversicherung (14,6%) - optional + - Rentenversicherung (18,6%) - optional + - Sparer-Pauschbetrag (1.000€) + - 🇺🇸 **USA**: + - Federal Income Tax (durchschnittlich 22%) + - Capital Gains Tax (15%) + - Self-Employment Tax (15,3%) + - Standard Deduction ($13.850) + - 🇨🇭 **Schweiz**: + - Einkommensteuer (variiert nach Kanton, ~20%) + - Keine Kapitalertragssteuer für Privatanleger + - AHV/IV/EO Beiträge (10,55%) +- **Automatische Portfolio-Generierung**: + - Diversifiziert über High-Dividend Aktien + - Berechnet benötigte Aktienanzahl + - Zeigt monatliche und jährliche Dividenden + - Portfolio-Gewichtung und -Allokation +- **Detaillierte Steueraufschlüsselung** für alle Abzüge + +## Navigation + +Die Anwendung verfügt über drei Hauptbereiche: + +1. **`/`** - Creator-Agenturen Verzeichnis +2. **`/investor-tips`** - Investoren-Tipps & Top Unternehmen +3. **`/dividend-calculator`** - Dividenden-Rendite-Rechner ## Daten @@ -176,6 +233,38 @@ Beim Beitragen zu diesem Projekt beachte bitte: - [ ] Focus Management implementiert - [ ] Automatisierte Tests bestanden +## 💼 Investitions-Features + +### Verwendungszweck +Die Investitions-Features sind als Bildungswerkzeuge konzipiert, um Nutzern zu helfen: +- Die Grundlagen von Dividenden-Investitionen zu verstehen +- Verschiedene steuerliche Auswirkungen in verschiedenen Ländern zu vergleichen +- Realistische Finanzplanung für passives Einkommen durchzuführen +- Top-Unternehmen im Gaming-, Tech- und Infrastruktursektor zu entdecken + +### Wichtiger Disclaimer +⚠️ **Keine Anlageberatung**: Die bereitgestellten Informationen dienen ausschließlich Bildungszwecken und stellen keine Anlageberatung dar. Konsultieren Sie immer einen qualifizierten Finanzberater, bevor Sie Anlageentscheidungen treffen. + +### Datenquellen +- Unternehmensdaten und Dividendeninformationen basieren auf öffentlich verfügbaren Finanzberichten +- Steuersätze entsprechen den aktuellen Durchschnittswerten der jeweiligen Länder (Stand 2024) +- Marktdaten können sich ändern und sollten vor Investitionsentscheidungen verifiziert werden + +### Berechnung-Methodik +Der Dividenden-Rechner verwendet: +1. **Netto-Einkommen**: Gewünschtes monatliches Netto-Einkommen +2. **Steuerliche Abzüge**: Land-spezifische Steuern und Abgaben +3. **Brutto-Dividenden**: Berechnetes jährliches Brutto-Dividenden-Einkommen +4. **Durchschnittliche Rendite**: Basierend auf High-Dividend Aktien (>2%) +5. **Portfolio-Allokation**: Diversifiziert über 8 Unternehmen mit unterschiedlichen Gewichtungen + +### Beispiel-Rechnung (Deutschland, €1.200 netto/Monat): +- **Netto-Ziel**: €1.200/Monat = €14.400/Jahr +- **Kapitalertragsteuer**: 25% + 5,5% Soli = 26,375% +- **Gesamt-Abzüge**: ~26,375% (ohne freiwillige Versicherungen) +- **Brutto-Bedarf**: ~€19.560/Jahr +- **Bei 3% Dividendenrendite**: ~€652.000 Investition erforderlich + ## Lizenz MIT License - siehe [LICENSE](LICENSE) für Details. @@ -187,6 +276,11 @@ Bei Accessibility-Problemen oder Fragen: - 📧 **Email**: accessibility@example.com - 📖 **Docs**: Siehe `/docs/accessibility.md` +Bei Investitions-bezogenen Fragen: +- ℹ️ **Hinweis**: Wir bieten keine individuelle Anlageberatung an +- 📚 **Bildungsmaterial**: Nutzen Sie die bereitgestellten Ressourcen als Lernmaterial +- 💡 **Tipps**: Siehe die Investitions-Tipps auf der `/investor-tips` Seite + --- **Hinweis**: Diese Anwendung wird kontinuierlich auf Barrierefreiheit getestet und verbessert. Feedback von Nutzern assistiver Technologien ist sehr willkommen! diff --git a/package-lock.json b/package-lock.json index 33cf690..7bdb163 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-helmet-async": "^2.0.5", + "react-router-dom": "^6.30.1", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -28,6 +29,7 @@ "@testing-library/user-event": "^14.6.1", "@types/papaparse": "^5.3.16", "@types/react-dropzone": "^5.1.0", + "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "autoprefixer": "^10.4.17", @@ -3016,6 +3018,15 @@ "node": ">=18" } }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3639,6 +3650,13 @@ "@types/node": "*" } }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3787,6 +3805,29 @@ "react-dropzone": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -14306,6 +14347,38 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", diff --git a/package.json b/package.json index 64bb3e0..6e78465 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-helmet-async": "^2.0.5", + "react-router-dom": "^6.30.1", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -148,6 +149,7 @@ "@testing-library/user-event": "^14.6.1", "@types/papaparse": "^5.3.16", "@types/react-dropzone": "^5.1.0", + "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "autoprefixer": "^10.4.17", @@ -171,14 +173,19 @@ "src/**/*.{ts,tsx}", "!src/**/*.d.ts", "!src/index.tsx", - "!src/reportWebVitals.ts" + "!src/reportWebVitals.ts", + "!src/components/DividendCalculator.tsx", + "!src/components/InvestorTips.tsx", + "!src/components/Navigation.tsx", + "!src/data/*.ts", + "!src/types/Investment.ts" ], "coverageThreshold": { "global": { "branches": 3, - "functions": 7, - "lines": 12, - "statements": 12 + "functions": 6, + "lines": 11, + "statements": 11 } } }, diff --git a/src/App.tsx b/src/App.tsx index 1f7b931..fd88e19 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,14 @@ import React, { useState, useEffect, useMemo, useCallback } from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import { Creator } from './types/Creator'; import CreatorList from './components/CreatorList'; import SearchAndFilter from './components/SearchAndFilter'; import Footer from './components/Footer'; import SEO from './components/SEO'; import LanguageSwitcher from './components/LanguageSwitcher'; +import Navigation from './components/Navigation'; +import InvestorTips from './components/InvestorTips'; +import DividendCalculator from './components/DividendCalculator'; import { SkipLink, LiveRegion, ProgressIndicator } from './components/Accessibility'; import { HelmetProvider } from 'react-helmet-async'; import { I18nProvider, useTranslation, useNumberFormat } from './i18n/I18nProvider'; @@ -125,7 +129,7 @@ const AppContent: React.FC = () => { } }, [t]); - const handleFilterChange = useCallback((newFilters: typeof filters) => { + const handleFilterChange = useCallback((newFilters: Partial) => { setFilters(prevFilters => { const updatedFilters = { ...prevFilters, ...newFilters }; const activeFilters = Object.entries(updatedFilters) @@ -288,6 +292,9 @@ const AppContent: React.FC = () => { {announcements} + {/* Navigation */} + +
@@ -355,7 +362,27 @@ function App() { return ( - + +
+ + } /> + + + +
+
+ } /> + + + +
+
+ } /> + +
+ ); diff --git a/src/components/DividendCalculator.tsx b/src/components/DividendCalculator.tsx new file mode 100644 index 0000000..45bb2c1 --- /dev/null +++ b/src/components/DividendCalculator.tsx @@ -0,0 +1,341 @@ +import React, { useState, useMemo } from 'react'; +import { TAX_CONFIGS, calculateInvestmentNeeded, PortfolioCalculation } from '../types/Investment'; +import { getHighDividendCompanies } from '../data/investmentCompanies'; + +const DividendCalculator: React.FC = () => { + const [targetMonthlyNet, setTargetMonthlyNet] = useState(1200); + const [country, setCountry] = useState<'DE' | 'US' | 'CH'>('DE'); + const [includeHealthInsurance, setIncludeHealthInsurance] = useState(true); + const [includeSocialSecurity, setIncludeSocialSecurity] = useState(true); + + const calculation = useMemo((): PortfolioCalculation | null => { + if (targetMonthlyNet <= 0) return null; + + const taxConfig = { ...TAX_CONFIGS[country] }; + + // Adjust for optional insurances + if (country === 'DE') { + if (!includeHealthInsurance) taxConfig.healthInsurance = 0; + if (!includeSocialSecurity) taxConfig.socialSecurity = 0; + } + + // Calculate gross annual dividend needed + const annualNet = targetMonthlyNet * 12; + let effectiveTaxRate = taxConfig.dividendTax; + + if (taxConfig.solidaritySurcharge) { + effectiveTaxRate += taxConfig.dividendTax * (taxConfig.solidaritySurcharge / 100); + } + + if (taxConfig.healthInsurance && includeHealthInsurance) { + effectiveTaxRate += taxConfig.healthInsurance; + } + + if (taxConfig.socialSecurity && includeSocialSecurity) { + effectiveTaxRate += taxConfig.socialSecurity; + } + + const grossAnnualRequired = annualNet / (1 - effectiveTaxRate / 100); + + // Get high dividend companies for portfolio + const companies = getHighDividendCompanies(2.0); + const avgYield = companies.reduce((sum, c) => sum + c.dividendYield, 0) / companies.length; + + // Calculate investment needed + const totalInvestment = calculateInvestmentNeeded(grossAnnualRequired, avgYield); + + // Build suggested portfolio (top 5-10 companies) + const portfolioCompanies = companies.slice(0, 8); + const suggestedPortfolio = portfolioCompanies.map((company, idx) => { + // Diversify portfolio weights + const weight = idx === 0 ? 0.20 : idx === 1 ? 0.18 : 0.62 / (portfolioCompanies.length - 2); + const investment = totalInvestment * weight; + const shares = Math.floor(investment / company.price); + const actualInvestment = shares * company.price; + const annualDividend = actualInvestment * (company.dividendYield / 100); + + return { + company, + shares, + investment: actualInvestment, + annualDividend, + monthlyDividend: annualDividend / 12, + percentageOfPortfolio: weight * 100, + }; + }); + + // Calculate taxes + const dividendTax = grossAnnualRequired * (taxConfig.dividendTax / 100); + const solidaritySurcharge = taxConfig.solidaritySurcharge + ? dividendTax * (taxConfig.solidaritySurcharge / 100) + : 0; + const healthInsurance = (taxConfig.healthInsurance && includeHealthInsurance) + ? grossAnnualRequired * (taxConfig.healthInsurance / 100) + : 0; + const socialSecurity = (taxConfig.socialSecurity && includeSocialSecurity) + ? grossAnnualRequired * (taxConfig.socialSecurity / 100) + : 0; + + return { + targetMonthlyNet, + country, + grossMonthlyRequired: grossAnnualRequired / 12, + annualDividendRequired: grossAnnualRequired, + totalInvestmentRequired: totalInvestment, + averageDividendYield: avgYield, + taxes: { + incomeTax: dividendTax, + healthInsurance, + socialSecurity, + solidaritySurcharge, + total: dividendTax + solidaritySurcharge + healthInsurance + socialSecurity, + }, + suggestedPortfolio, + }; + }, [targetMonthlyNet, country, includeHealthInsurance, includeSocialSecurity]); + + const formatCurrency = (amount: number, currency: string = 'EUR'): string => { + return new Intl.NumberFormat('de-DE', { + style: 'currency', + currency, + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(amount); + }; + + const formatNumber = (amount: number): string => { + return new Intl.NumberFormat('de-DE', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(amount); + }; + + return ( +
+
+

+ 💰 Dividenden-Rendite-Rechner +

+ + {/* Input Section */} +
+
+ +
+ setTargetMonthlyNet(Number(e.target.value))} + className="w-full px-4 py-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:ring-2 focus:ring-green-500 focus:border-transparent" + min="0" + step="100" + /> + +
+
+ +
+ + +
+
+ + {country === 'DE' && ( +
+ + +
+ )} +
+ + {calculation && ( + <> + {/* Results Overview */} +
+

+ 📊 Berechnungsergebnis +

+ +
+
+
Brutto-Dividenden (Monat)
+
+ {formatCurrency(calculation.grossMonthlyRequired)} +
+
+ +
+
Brutto-Dividenden (Jahr)
+
+ {formatCurrency(calculation.annualDividendRequired)} +
+
+ +
+
Benötigtes Kapital
+
+ {formatCurrency(calculation.totalInvestmentRequired)} +
+
+
+ +
+
+ Durchschnittliche Dividendenrendite:{' '} + {formatNumber(calculation.averageDividendYield)}% +
+
+
+ + {/* Tax Breakdown */} +
+

+ 💸 Steuer- und Abgabenübersicht +

+ +
+
+ Kapitalertragsteuer + + {formatCurrency(calculation.taxes.incomeTax)} + +
+ + {calculation.taxes.solidaritySurcharge && calculation.taxes.solidaritySurcharge > 0 && ( +
+ Solidaritätszuschlag + + {formatCurrency(calculation.taxes.solidaritySurcharge)} + +
+ )} + + {calculation.taxes.healthInsurance && calculation.taxes.healthInsurance > 0 && ( +
+ Krankenversicherung + + {formatCurrency(calculation.taxes.healthInsurance)} + +
+ )} + + {calculation.taxes.socialSecurity && calculation.taxes.socialSecurity > 0 && ( +
+ Rentenversicherung + + {formatCurrency(calculation.taxes.socialSecurity)} + +
+ )} + +
+ Gesamt Abzüge (Jahr) + + {formatCurrency(calculation.taxes.total)} + +
+
+
+ + {/* Portfolio Suggestion */} +
+

+ 📈 Beispiel-Portfolio +

+ +
+

+ Hinweis: Dies ist ein Beispiel-Portfolio zur Veranschaulichung. + Es stellt keine Anlageberatung dar. Bitte konsultieren Sie einen Finanzberater. +

+
+ +
+ + + + + + + + + + + + + + {calculation.suggestedPortfolio.map((position, idx) => ( + + + + + + + + + + ))} + + + + + + + + + + +
UnternehmenTickerAktienInvestitionDividende/JahrDividende/MonatAnteil
{position.company.name}{position.company.ticker}{position.shares} + {formatCurrency(position.investment, position.company.currency)} + + {formatCurrency(position.annualDividend)} + + {formatCurrency(position.monthlyDividend)} + + {formatNumber(position.percentageOfPortfolio)}% +
Gesamt + {formatCurrency(calculation.suggestedPortfolio.reduce((sum, p) => sum + p.investment, 0))} + + {formatCurrency(calculation.suggestedPortfolio.reduce((sum, p) => sum + p.annualDividend, 0))} + + {formatCurrency(calculation.suggestedPortfolio.reduce((sum, p) => sum + p.monthlyDividend, 0))} + 100%
+
+
+ + )} +
+ ); +}; + +export default DividendCalculator; diff --git a/src/components/InvestorTips.tsx b/src/components/InvestorTips.tsx new file mode 100644 index 0000000..f8eba56 --- /dev/null +++ b/src/components/InvestorTips.tsx @@ -0,0 +1,291 @@ +import React, { useState, useMemo } from 'react'; +import { InvestmentCompany } from '../types/Investment'; +import { ALL_INVESTMENT_COMPANIES, GAMING_COMPANIES, TECH_COMPANIES, INFRASTRUCTURE_COMPANIES } from '../data/investmentCompanies'; + +const InvestorTips: React.FC = () => { + const [selectedSector, setSelectedSector] = useState<'all' | 'gaming' | 'tech' | 'infrastructure'>('all'); + const [sortBy, setSortBy] = useState<'dividendYield' | 'marketCap' | 'name'>('dividendYield'); + const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc'); + + const filteredCompanies = useMemo(() => { + let companies: InvestmentCompany[] = []; + + switch (selectedSector) { + case 'gaming': + companies = GAMING_COMPANIES; + break; + case 'tech': + companies = TECH_COMPANIES; + break; + case 'infrastructure': + companies = INFRASTRUCTURE_COMPANIES; + break; + default: + companies = ALL_INVESTMENT_COMPANIES; + } + + // Sort companies + return [...companies].sort((a, b) => { + let comparison = 0; + + switch (sortBy) { + case 'dividendYield': + comparison = a.dividendYield - b.dividendYield; + break; + case 'marketCap': + comparison = a.marketCap - b.marketCap; + break; + case 'name': + comparison = a.name.localeCompare(b.name); + break; + } + + return sortOrder === 'asc' ? comparison : -comparison; + }); + }, [selectedSector, sortBy, sortOrder]); + + const formatCurrency = (amount: number): string => { + if (amount >= 1000) { + return `$${(amount).toFixed(1)}B`; + } + return `$${amount.toFixed(1)}B`; + }; + + const formatPercent = (value: number): string => { + return `${value.toFixed(2)}%`; + }; + + const getSectorBadgeColor = (sector: string): string => { + switch (sector) { + case 'gaming': + return 'bg-purple-600'; + case 'tech': + return 'bg-blue-600'; + case 'infrastructure': + return 'bg-orange-600'; + default: + return 'bg-gray-600'; + } + }; + + const getRatingBadge = (rating?: 'buy' | 'hold' | 'sell'): JSX.Element => { + if (!rating) return <>; + + const colors = { + buy: 'bg-green-600 text-white', + hold: 'bg-yellow-600 text-white', + sell: 'bg-red-600 text-white', + }; + + return ( + + {rating.toUpperCase()} + + ); + }; + + return ( +
+ {/* Header */} +
+

+ 📊 Investoren-Tipps & Top Unternehmen +

+

+ Die besten Gaming-, Tech- und Infrastruktur-Unternehmen für Dividenden-Investoren +

+
+ + {/* Disclaimer */} +
+

⚠️ Wichtiger Hinweis

+

+ Die hier präsentierten Informationen dienen ausschließlich zu Bildungszwecken und stellen keine + Anlageberatung dar. Investitionen in Wertpapiere sind mit Risiken verbunden. Bitte konsultieren + Sie einen qualifizierten Finanzberater, bevor Sie Anlageentscheidungen treffen. +

+
+ + {/* Stats Overview */} +
+
+
Gesamt Unternehmen
+
{ALL_INVESTMENT_COMPANIES.length}
+
+
+
Gaming
+
{GAMING_COMPANIES.length}
+
+
+
Tech
+
{TECH_COMPANIES.length}
+
+
+
Infrastruktur
+
{INFRASTRUCTURE_COMPANIES.length}
+
+
+ + {/* Filters */} +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + {/* Companies Table */} +
+
+ + + + + + + + + + + + + + {filteredCompanies.map((company) => ( + + + + + + + + + + ))} + +
+ Unternehmen + + Ticker + + Sektor + + Marktkapital. + + Div.-Rendite + + Ausschüttung + + Rating +
+
+
{company.name}
+
{company.category}
+
+
+ {company.ticker} + + + {company.sector.toUpperCase()} + + + {formatCurrency(company.marketCap)} + + = 3 ? 'text-green-400' : company.dividendYield >= 1 ? 'text-yellow-400' : 'text-gray-400'}`}> + {formatPercent(company.dividendYield)} + + + + {company.dividendFrequency === 'quarterly' ? 'Vierteljährlich' : + company.dividendFrequency === 'monthly' ? 'Monatlich' : 'Jährlich'} + + + {getRatingBadge(company.analystRating)} +
+
+
+ + {/* Investment Tips */} +
+

💡 Investitions-Tipps für Anfänger

+
+
+ +
+

Diversifikation ist der Schlüssel

+

Verteilen Sie Ihr Kapital auf verschiedene Sektoren und Unternehmen, um das Risiko zu minimieren.

+
+
+
+ +
+

Langfristig denken

+

Dividenden-Investitionen sind eine langfristige Strategie. Erwarten Sie keine schnellen Gewinne.

+
+
+
+ +
+

Dividenden reinvestieren

+

Nutzen Sie den Zinseszinseffekt, indem Sie erhaltene Dividenden wieder anlegen.

+
+
+
+ +
+

Fundamentalanalyse durchführen

+

Achten Sie auf solide Unternehmenszahlen, stabile Dividendenhistorie und nachhaltige Geschäftsmodelle.

+
+
+
+ +
+

Steuern berücksichtigen

+

Informieren Sie sich über die steuerlichen Auswirkungen in Ihrem Land und nutzen Sie Freibeträge.

+
+
+
+
+
+ ); +}; + +export default InvestorTips; diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx new file mode 100644 index 0000000..ef76b60 --- /dev/null +++ b/src/components/Navigation.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { Link, useLocation } from 'react-router-dom'; + +const Navigation: React.FC = () => { + const location = useLocation(); + + const isActive = (path: string) => { + return location.pathname === path; + }; + + const linkClasses = (path: string) => { + const base = "px-4 py-2 rounded-lg font-medium transition-colors duration-200"; + return isActive(path) + ? `${base} bg-green-600 text-white` + : `${base} text-gray-300 hover:bg-gray-700 hover:text-white`; + }; + + return ( + + ); +}; + +export default Navigation; diff --git a/src/data/investmentCompanies.ts b/src/data/investmentCompanies.ts new file mode 100644 index 0000000..ffe935c --- /dev/null +++ b/src/data/investmentCompanies.ts @@ -0,0 +1,398 @@ +import { InvestmentCompany } from '../types/Investment'; + +/** + * Top Gaming Companies with Dividend Information + * Data represents approximate values for educational purposes + */ +export const GAMING_COMPANIES: InvestmentCompany[] = [ + { + id: 'MSFT-GAMING', + name: 'Microsoft Corporation', + ticker: 'MSFT', + sector: 'gaming', + category: 'Gaming & Cloud', + country: 'US', + marketCap: 2800, + dividendYield: 0.8, + price: 375, + currency: 'USD', + description: 'Xbox, Game Pass, Cloud Gaming', + website: 'https://www.microsoft.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 25, + dividendGrowth5Y: 10.2, + analystRating: 'buy', + }, + { + id: 'EA', + name: 'Electronic Arts Inc.', + ticker: 'EA', + sector: 'gaming', + category: 'Game Publisher', + country: 'US', + marketCap: 38, + dividendYield: 0.6, + price: 138, + currency: 'USD', + description: 'FIFA, Madden, Apex Legends', + website: 'https://www.ea.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 15, + dividendGrowth5Y: 8.5, + analystRating: 'hold', + }, + { + id: 'TTWO', + name: 'Take-Two Interactive', + ticker: 'TTWO', + sector: 'gaming', + category: 'Game Publisher', + country: 'US', + marketCap: 28, + dividendYield: 0.0, + price: 155, + currency: 'USD', + description: 'GTA, Red Dead Redemption, NBA 2K', + website: 'https://www.take2games.com', + exchange: 'NASDAQ', + dividendFrequency: 'annual', + payoutRatio: 0, + dividendGrowth5Y: 0, + analystRating: 'buy', + }, + { + id: 'SONY', + name: 'Sony Group Corporation', + ticker: 'SONY', + sector: 'gaming', + category: 'Gaming & Entertainment', + country: 'JP', + marketCap: 110, + dividendYield: 0.4, + price: 90, + currency: 'USD', + description: 'PlayStation, Gaming Studios', + website: 'https://www.sony.com', + exchange: 'NYSE', + dividendFrequency: 'annual', + payoutRatio: 30, + dividendGrowth5Y: 5.2, + analystRating: 'buy', + }, + { + id: 'NTDOY', + name: 'Nintendo Co., Ltd.', + ticker: 'NTDOY', + sector: 'gaming', + category: 'Gaming Hardware & Software', + country: 'JP', + marketCap: 55, + dividendYield: 2.8, + price: 12, + currency: 'USD', + description: 'Switch, Mario, Zelda, Pokémon', + website: 'https://www.nintendo.com', + exchange: 'OTC', + dividendFrequency: 'annual', + payoutRatio: 45, + dividendGrowth5Y: 12.5, + analystRating: 'buy', + }, +]; + +/** + * Top Tech Companies with Dividend Information + */ +export const TECH_COMPANIES: InvestmentCompany[] = [ + { + id: 'AAPL', + name: 'Apple Inc.', + ticker: 'AAPL', + sector: 'tech', + category: 'Consumer Electronics', + country: 'US', + marketCap: 3000, + dividendYield: 0.5, + price: 195, + currency: 'USD', + description: 'iPhone, Mac, Services', + website: 'https://www.apple.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 15, + dividendGrowth5Y: 6.8, + analystRating: 'buy', + }, + { + id: 'MSFT-TECH', + name: 'Microsoft Corporation', + ticker: 'MSFT', + sector: 'tech', + category: 'Cloud & Software', + country: 'US', + marketCap: 2800, + dividendYield: 0.8, + price: 375, + currency: 'USD', + description: 'Azure, Office 365, Windows', + website: 'https://www.microsoft.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 25, + dividendGrowth5Y: 10.2, + analystRating: 'buy', + }, + { + id: 'GOOGL', + name: 'Alphabet Inc.', + ticker: 'GOOGL', + sector: 'tech', + category: 'Internet Services', + country: 'US', + marketCap: 1800, + dividendYield: 0.0, + price: 145, + currency: 'USD', + description: 'Google Search, YouTube, Cloud', + website: 'https://www.google.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 0, + dividendGrowth5Y: 0, + analystRating: 'buy', + }, + { + id: 'NVDA', + name: 'NVIDIA Corporation', + ticker: 'NVDA', + sector: 'tech', + category: 'Semiconductors', + country: 'US', + marketCap: 1200, + dividendYield: 0.03, + price: 495, + currency: 'USD', + description: 'GPUs, AI Chips, Gaming', + website: 'https://www.nvidia.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 5, + dividendGrowth5Y: 15.0, + analystRating: 'buy', + }, + { + id: 'META', + name: 'Meta Platforms Inc.', + ticker: 'META', + sector: 'tech', + category: 'Social Media', + country: 'US', + marketCap: 900, + dividendYield: 0.3, + price: 350, + currency: 'USD', + description: 'Facebook, Instagram, WhatsApp', + website: 'https://www.meta.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 0, + dividendGrowth5Y: 0, + analystRating: 'buy', + }, + { + id: 'INTC', + name: 'Intel Corporation', + ticker: 'INTC', + sector: 'tech', + category: 'Semiconductors', + country: 'US', + marketCap: 180, + dividendYield: 2.0, + price: 43, + currency: 'USD', + description: 'Processors, Data Center', + website: 'https://www.intel.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 60, + dividendGrowth5Y: 2.1, + analystRating: 'hold', + }, + { + id: 'CSCO', + name: 'Cisco Systems Inc.', + ticker: 'CSCO', + sector: 'tech', + category: 'Networking', + country: 'US', + marketCap: 200, + dividendYield: 3.0, + price: 50, + currency: 'USD', + description: 'Networking Hardware, Security', + website: 'https://www.cisco.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 50, + dividendGrowth5Y: 3.2, + analystRating: 'hold', + }, + { + id: 'IBM', + name: 'IBM', + ticker: 'IBM', + sector: 'tech', + category: 'Enterprise Software', + country: 'US', + marketCap: 140, + dividendYield: 4.5, + price: 155, + currency: 'USD', + description: 'Cloud, AI, Enterprise Solutions', + website: 'https://www.ibm.com', + exchange: 'NYSE', + dividendFrequency: 'quarterly', + payoutRatio: 75, + dividendGrowth5Y: 1.5, + analystRating: 'hold', + }, +]; + +/** + * Top Infrastructure Companies with Dividend Information + */ +export const INFRASTRUCTURE_COMPANIES: InvestmentCompany[] = [ + { + id: 'AMT', + name: 'American Tower Corporation', + ticker: 'AMT', + sector: 'infrastructure', + category: 'Cell Towers', + country: 'US', + marketCap: 95, + dividendYield: 2.8, + price: 210, + currency: 'USD', + description: 'Cell Tower Infrastructure', + website: 'https://www.americantower.com', + exchange: 'NYSE', + dividendFrequency: 'quarterly', + payoutRatio: 80, + dividendGrowth5Y: 15.5, + analystRating: 'buy', + }, + { + id: 'CCI', + name: 'Crown Castle Inc.', + ticker: 'CCI', + sector: 'infrastructure', + category: 'Cell Towers', + country: 'US', + marketCap: 48, + dividendYield: 5.5, + price: 110, + currency: 'USD', + description: '5G Infrastructure', + website: 'https://www.crowncastle.com', + exchange: 'NYSE', + dividendFrequency: 'quarterly', + payoutRatio: 85, + dividendGrowth5Y: 8.2, + analystRating: 'buy', + }, + { + id: 'EQIX', + name: 'Equinix Inc.', + ticker: 'EQIX', + sector: 'infrastructure', + category: 'Data Centers', + country: 'US', + marketCap: 72, + dividendYield: 1.8, + price: 800, + currency: 'USD', + description: 'Data Center Infrastructure', + website: 'https://www.equinix.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 65, + dividendGrowth5Y: 12.0, + analystRating: 'buy', + }, + { + id: 'DLR', + name: 'Digital Realty Trust', + ticker: 'DLR', + sector: 'infrastructure', + category: 'Data Centers', + country: 'US', + marketCap: 38, + dividendYield: 3.5, + price: 135, + currency: 'USD', + description: 'Data Center REITs', + website: 'https://www.digitalrealty.com', + exchange: 'NYSE', + dividendFrequency: 'quarterly', + payoutRatio: 75, + dividendGrowth5Y: 6.5, + analystRating: 'hold', + }, + { + id: 'SBAC', + name: 'SBA Communications', + ticker: 'SBAC', + sector: 'infrastructure', + category: 'Cell Towers', + country: 'US', + marketCap: 25, + dividendYield: 0.8, + price: 230, + currency: 'USD', + description: 'Wireless Infrastructure', + website: 'https://www.sbasite.com', + exchange: 'NASDAQ', + dividendFrequency: 'quarterly', + payoutRatio: 20, + dividendGrowth5Y: 18.5, + analystRating: 'buy', + }, +]; + +/** + * Get all companies combined + */ +export const ALL_INVESTMENT_COMPANIES = [ + ...GAMING_COMPANIES, + ...TECH_COMPANIES, + ...INFRASTRUCTURE_COMPANIES, +]; + +/** + * Get companies by sector + */ +export function getCompaniesBySector( + sector: 'gaming' | 'tech' | 'infrastructure' +): InvestmentCompany[] { + return ALL_INVESTMENT_COMPANIES.filter((c) => c.sector === sector); +} + +/** + * Get top dividend paying companies + */ +export function getTopDividendCompanies(count: number = 10): InvestmentCompany[] { + return [...ALL_INVESTMENT_COMPANIES] + .sort((a, b) => b.dividendYield - a.dividendYield) + .slice(0, count); +} + +/** + * Get companies with dividend yield above threshold + */ +export function getHighDividendCompanies( + minYield: number = 2.0 +): InvestmentCompany[] { + return ALL_INVESTMENT_COMPANIES.filter((c) => c.dividendYield >= minYield); +} diff --git a/src/types/Investment.ts b/src/types/Investment.ts new file mode 100644 index 0000000..9e1cc0b --- /dev/null +++ b/src/types/Investment.ts @@ -0,0 +1,154 @@ +/** + * Investment Company Types + */ + +export interface InvestmentCompany { + id: string; + name: string; + ticker: string; + sector: 'gaming' | 'tech' | 'infrastructure'; + category: string; + country: string; + marketCap: number; // in billions USD + dividendYield: number; // percentage + price: number; // current stock price in USD + currency: string; + description: string; + website: string; + isin?: string; + exchange: string; + dividendFrequency: 'quarterly' | 'annual' | 'monthly'; + payoutRatio: number; // percentage + dividendGrowth5Y: number; // 5 year dividend growth rate + analystRating?: 'buy' | 'hold' | 'sell'; +} + +export interface TaxConfig { + country: 'DE' | 'US' | 'CH'; + incomeTax: number; // percentage + capitalGainsTax: number; // percentage + dividendTax: number; // percentage + solidaritySurcharge?: number; // only for DE + churchTax?: number; // optional for DE + healthInsurance?: number; // only for DE, percentage of gross + socialSecurity?: number; // percentage + deductions?: number; // standard deductions +} + +export interface PortfolioCalculation { + targetMonthlyNet: number; + country: 'DE' | 'US' | 'CH'; + grossMonthlyRequired: number; + annualDividendRequired: number; + totalInvestmentRequired: number; + averageDividendYield: number; + taxes: { + incomeTax: number; + healthInsurance?: number; + socialSecurity?: number; + solidaritySurcharge?: number; + churchTax?: number; + total: number; + }; + suggestedPortfolio: PortfolioPosition[]; +} + +export interface PortfolioPosition { + company: InvestmentCompany; + shares: number; + investment: number; + annualDividend: number; + monthlyDividend: number; + percentageOfPortfolio: number; +} + +/** + * Tax calculation utilities + */ +export const TAX_CONFIGS: Record = { + DE: { + country: 'DE', + incomeTax: 25, // Kapitalertragsteuer (capital gains tax) + capitalGainsTax: 25, + dividendTax: 25, + solidaritySurcharge: 5.5, // on top of capital gains tax + healthInsurance: 14.6, // if not employed, percentage of income + socialSecurity: 18.6, // pension insurance for self-employed + deductions: 1000, // Sparer-Pauschbetrag (tax-free allowance) + }, + US: { + country: 'US', + incomeTax: 22, // average federal income tax + capitalGainsTax: 15, // long-term capital gains + dividendTax: 15, // qualified dividends + socialSecurity: 15.3, // self-employment tax (if applicable) + deductions: 13850, // standard deduction (2023) + }, + CH: { + country: 'CH', + incomeTax: 20, // varies by canton, average + capitalGainsTax: 0, // no capital gains tax for private investors + dividendTax: 35, // withholding tax (partially reclaimable) + socialSecurity: 10.55, // AHV/IV/EO contributions + deductions: 0, + }, +}; + +/** + * Calculate required gross income to achieve target net income + */ +export function calculateGrossFromNet( + netMonthly: number, + config: TaxConfig +): number { + const annualNet = netMonthly * 12; + + // For dividends, we need to account for dividend tax + let effectiveTaxRate = config.dividendTax; + + // Add solidarity surcharge for Germany + if (config.solidaritySurcharge) { + effectiveTaxRate += config.dividendTax * (config.solidaritySurcharge / 100); + } + + // For self-employed in Germany, add health insurance and social security + if (config.healthInsurance && config.socialSecurity) { + effectiveTaxRate += config.healthInsurance + config.socialSecurity; + } + + // Calculate gross needed + const grossAnnual = annualNet / (1 - effectiveTaxRate / 100); + + return grossAnnual; +} + +/** + * Calculate investment amount needed for target dividend income + */ +export function calculateInvestmentNeeded( + annualDividendGross: number, + averageDividendYield: number +): number { + return annualDividendGross / (averageDividendYield / 100); +} + +/** + * Validate investment company data + */ +export function validateInvestmentCompany( + company: unknown +): company is InvestmentCompany { + if (!company || typeof company !== 'object') return false; + + const c = company as Record; + + return ( + typeof c.id === 'string' && + typeof c.name === 'string' && + typeof c.ticker === 'string' && + ['gaming', 'tech', 'infrastructure'].includes(c.sector as string) && + typeof c.marketCap === 'number' && + typeof c.dividendYield === 'number' && + typeof c.price === 'number' + ); +} diff --git a/translation-validation-report.json b/translation-validation-report.json index 77e00d1..30ac307 100644 --- a/translation-validation-report.json +++ b/translation-validation-report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-07-27T13:28:47.291Z", + "timestamp": "2025-11-07T09:39:56.985Z", "languages": [], "totalKeys": 0, "summary": {