From 95634d7bb640ad7b83c4650c0e2688d513252e8b Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 7 Jan 2026 17:55:08 +0000 Subject: [PATCH] feat(company-explorer): Initial Web UI & Backend with Enrichment Flow This commit introduces the foundational elements for the new "Company Explorer" web application, marking a significant step away from the legacy Google Sheets / CLI system. Key changes include: - Project Structure: A new directory with separate (FastAPI) and (React/Vite) components. - Data Persistence: Migration from Google Sheets to a local SQLite database () using SQLAlchemy. - Core Utilities: Extraction and cleanup of essential helper functions (LLM wrappers, text utilities) into . - Backend Services: , , for AI-powered analysis, and logic. - Frontend UI: Basic React application with company table, import wizard, and dynamic inspector sidebar. - Docker Integration: Updated and for multi-stage builds and sideloading. - Deployment & Access: Integrated into central Nginx proxy and dashboard, accessible via . Lessons Learned & Fixed during development: - Frontend Asset Loading: Addressed issues with Vite's path and FastAPI's . - TypeScript Configuration: Added and . - Database Schema Evolution: Solved errors by forcing a new database file and correcting override. - Logging: Implemented robust file-based logging (). This new foundation provides a powerful and maintainable platform for future B2B robotics lead generation. --- FRITZbox7530.pdf | Bin 0 -> 548462 bytes MIGRATION_PLAN.md | 80 +++ .../brancheneinstufung2.py | 0 .../build_knowledge_base.py | 0 .../company_deduplicator.py | 0 _legacy_gsheets_system/config.py | 674 ++++++++++++++++++ .../contact_grouping.py | 0 .../data_processor.py | 0 .../expand_knowledge_base.py | 0 .../extract_insights.py | 0 .../generate_knowledge_base.py | 0 .../generate_marketing_text.py | 0 .../google_sheet_handler.py | 0 _legacy_gsheets_system/helpers.py | 412 +++++++++++ .../knowledge_base_builder.py | 0 .../sync_manager.py | 0 .../wikipedia_scraper.py | 0 cat_log.py | 7 + company-explorer/Dockerfile | 36 + company-explorer/backend/app.py | 314 ++++++++ company-explorer/backend/config.py | 63 ++ company-explorer/backend/database.py | 113 +++ company-explorer/backend/interfaces.py | 56 ++ company-explorer/backend/lib/core_utils.py | 144 ++++ company-explorer/backend/lib/logging_setup.py | 39 + company-explorer/backend/repositories/mock.py | 42 ++ .../backend/repositories/superoffice.py | 40 ++ .../backend/scripts/import_legacy.py | 91 +++ .../backend/services/classification.py | 77 ++ .../backend/services/deduplication.py | 209 ++++++ .../backend/services/discovery.py | 126 ++++ company-explorer/backend/services/scraping.py | 82 +++ company-explorer/backend/services/sync.py | 103 +++ company-explorer/frontend/index.html | 12 + company-explorer/frontend/package.json | 31 + company-explorer/frontend/postcss.config.js | 6 + company-explorer/frontend/src/App.tsx | 116 +++ .../frontend/src/components/CompanyTable.tsx | 205 ++++++ .../frontend/src/components/ImportWizard.tsx | 85 +++ .../frontend/src/components/Inspector.tsx | 123 ++++ company-explorer/frontend/src/index.css | 19 + company-explorer/frontend/src/main.tsx | 10 + company-explorer/frontend/src/vite-env.d.ts | 1 + company-explorer/frontend/tailwind.config.js | 11 + company-explorer/frontend/vite.config.ts | 16 + company-explorer/requirements.txt | 15 + create_dashboard.py | 39 + dashboard/index.html | 11 + docker-compose.yml | 26 +- nginx-proxy.conf | 15 + readme.md | 28 + 51 files changed, 3475 insertions(+), 2 deletions(-) create mode 100644 FRITZbox7530.pdf create mode 100644 MIGRATION_PLAN.md rename brancheneinstufung2.py => _legacy_gsheets_system/brancheneinstufung2.py (100%) rename build_knowledge_base.py => _legacy_gsheets_system/build_knowledge_base.py (100%) rename company_deduplicator.py => _legacy_gsheets_system/company_deduplicator.py (100%) create mode 100644 _legacy_gsheets_system/config.py rename contact_grouping.py => _legacy_gsheets_system/contact_grouping.py (100%) rename data_processor.py => _legacy_gsheets_system/data_processor.py (100%) rename expand_knowledge_base.py => _legacy_gsheets_system/expand_knowledge_base.py (100%) rename extract_insights.py => _legacy_gsheets_system/extract_insights.py (100%) rename generate_knowledge_base.py => _legacy_gsheets_system/generate_knowledge_base.py (100%) rename generate_marketing_text.py => _legacy_gsheets_system/generate_marketing_text.py (100%) rename google_sheet_handler.py => _legacy_gsheets_system/google_sheet_handler.py (100%) create mode 100644 _legacy_gsheets_system/helpers.py rename knowledge_base_builder.py => _legacy_gsheets_system/knowledge_base_builder.py (100%) rename sync_manager.py => _legacy_gsheets_system/sync_manager.py (100%) rename wikipedia_scraper.py => _legacy_gsheets_system/wikipedia_scraper.py (100%) create mode 100644 cat_log.py create mode 100644 company-explorer/Dockerfile create mode 100644 company-explorer/backend/app.py create mode 100644 company-explorer/backend/config.py create mode 100644 company-explorer/backend/database.py create mode 100644 company-explorer/backend/interfaces.py create mode 100644 company-explorer/backend/lib/core_utils.py create mode 100644 company-explorer/backend/lib/logging_setup.py create mode 100644 company-explorer/backend/repositories/mock.py create mode 100644 company-explorer/backend/repositories/superoffice.py create mode 100644 company-explorer/backend/scripts/import_legacy.py create mode 100644 company-explorer/backend/services/classification.py create mode 100644 company-explorer/backend/services/deduplication.py create mode 100644 company-explorer/backend/services/discovery.py create mode 100644 company-explorer/backend/services/scraping.py create mode 100644 company-explorer/backend/services/sync.py create mode 100644 company-explorer/frontend/index.html create mode 100644 company-explorer/frontend/package.json create mode 100644 company-explorer/frontend/postcss.config.js create mode 100644 company-explorer/frontend/src/App.tsx create mode 100644 company-explorer/frontend/src/components/CompanyTable.tsx create mode 100644 company-explorer/frontend/src/components/ImportWizard.tsx create mode 100644 company-explorer/frontend/src/components/Inspector.tsx create mode 100644 company-explorer/frontend/src/index.css create mode 100644 company-explorer/frontend/src/main.tsx create mode 100644 company-explorer/frontend/src/vite-env.d.ts create mode 100644 company-explorer/frontend/tailwind.config.js create mode 100644 company-explorer/frontend/vite.config.ts create mode 100644 company-explorer/requirements.txt create mode 100644 create_dashboard.py diff --git a/FRITZbox7530.pdf b/FRITZbox7530.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16b977998d6584ceeb2bf4447a705ddd93932806 GIT binary patch literal 548462 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
    D8J}234us)Z7&5$L(?pUREN=H1KdsujK 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

    Y|ezL%h2{h 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

    JmdIdBN!PWw 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 z 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%0DG90LF?q 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 literal 0 HcmV?d00001 diff --git a/MIGRATION_PLAN.md b/MIGRATION_PLAN.md new file mode 100644 index 00000000..eedb7711 --- /dev/null +++ b/MIGRATION_PLAN.md @@ -0,0 +1,80 @@ +# Migrations-Plan: Legacy GSheets -> Company Explorer (Robotics Edition) + +**Kontext:** Neuanfang für die Branche **Robotik & Facility Management**. +**Ziel:** Ablösung von Google Sheets/CLI durch eine Web-App ("Company Explorer") mit SQLite-Backend. + +## 1. Strategische Neuausrichtung + +| Bereich | Alt (Legacy) | Neu (Robotics Edition) | +| :--- | :--- | :--- | +| **Daten-Basis** | Google Sheets | **SQLite** (Lokal, performant, filterbar). | +| **Ziel-Daten** | Allgemein / Kundenservice | **Robotics-Signale** (SPA-Bereich? Intralogistik? Werkschutz?). | +| **Branchen** | KI-Vorschlag (Freitext) | **Strict Mode:** Mapping auf feste CRM-Liste (z.B. "Hotellerie", "Maschinenbau"). | +| **Texterstellung** | Pain/Gain Matrix (Service) | **Pain/Gain Matrix (Robotics)**. "Übersetzung" des alten Wissens auf Roboter. | +| **Analytics** | Techniker-ML-Modell | **Deaktiviert**. Vorerst keine Relevanz. | +| **Operations** | D365 Sync (Broken) | **Excel-Import & Deduplizierung**. Fokus auf Matching externer Listen gegen Bestand. | + +## 2. Architektur & Komponenten-Mapping + +Das System wird in `company-explorer/` neu aufgebaut. Wir lösen Abhängigkeiten zur Root `helpers.py` auf. + +### A. Core Backend (`backend/`) + +| Komponente | Aufgabe & Neue Logik | Prio | +| :--- | :--- | :--- | +| **Database** | Ersetzt `GoogleSheetHandler`. Speichert Firmen & "Enrichment Blobs". | 1 | +| **Importer** | Ersetzt `SyncManager`. Importiert Excel-Dumps (CRM) und Event-Listen. | 1 | +| **Deduplicator** | Ersetzt `company_deduplicator.py`. **Kern-Feature:** Checkt Event-Listen gegen DB. Muss "intelligent" matchen (Name + Ort + Web). | 1 | +| **Scraper (Base)** | Extrahiert Text von Websites. Basis für alle Analysen. | 1 | +| **Signal Detector** | **NEU.** Analysiert Website-Text auf Roboter-Potential.
    *Logik:* Wenn Branche = Hotel & Keyword = "Wellness" -> Potential: Reinigungsroboter. | 1 | +| **Classifier** | Brancheneinstufung. **Strict Mode:** Prüft gegen `config/allowed_industries.json`. | 2 | +| **Marketing Engine** | Ersetzt `generate_marketing_text.py`. Nutzt neue `marketing_wissen_robotics.yaml`. | 3 | + +### B. Frontend (`frontend/`) - React + +* **View 1: Der "Explorer":** DataGrid aller Firmen. Filterbar nach "Roboter-Potential" und Status. +* **View 2: Der "Inspector":** Detailansicht einer Firma. Zeigt gefundene Signale ("Hat SPA Bereich"). Manuelle Korrektur-Möglichkeit. +* **View 3: "List Matcher":** Upload einer Excel-Liste -> Anzeige von Duplikaten -> Button "Neue importieren". + +## 3. Umgang mit Shared Code (`helpers.py` & Co.) + +Wir kapseln das neue Projekt vollständig ab ("Fork & Clean"). + +* **Quelle:** `helpers.py` (Root) +* **Ziel:** `company-explorer/backend/lib/core_utils.py` +* **Aktion:** Wir kopieren nur: + * OpenAI/Gemini Wrapper (Retry Logic). + * Text Cleaning (`clean_text`, `normalize_string`). + * URL Normalization. + +* **Quelle:** Andere Gemini Apps (`duckdns`, `gtm-architect`, `market-intel`) +* **Aktion:** Wir betrachten diese als Referenz. Nützliche Logik (z.B. die "Grit"-Prompts aus `market-intel`) wird explizit in die neuen Service-Module kopiert. + +## 4. Datenstruktur (SQLite Schema) + +### Tabelle `companies` (Stammdaten) +* `id` (PK) +* `name` (String) +* `website` (String) +* `crm_id` (String, nullable - Link zum D365) +* `industry_crm` (String - Die "erlaubte" Branche) +* `city` (String) +* `country` (String) +* `status` (Enum: NEW, IMPORTED, ENRICHED, QUALIFIED) + +### Tabelle `signals` (Roboter-Potential) +* `company_id` (FK) +* `signal_type` (z.B. "has_spa", "has_large_warehouse", "has_security_needs") +* `confidence` (Float) +* `proof_text` (Snippet von der Website) + +### Tabelle `duplicates_log` +* Speichert Ergebnisse von Listen-Abgleichen ("Upload X enthielt 20 bekannte Firmen"). + +## 5. Phasenplan Umsetzung + +1. **Housekeeping:** Archivierung des Legacy-Codes (`_legacy_gsheets_system`). +2. **Setup:** Init `company-explorer` (Backend + Frontend Skeleton). +3. **Foundation:** DB-Schema + "List Matcher" (Deduplizierung ist Prio A für Operations). +4. **Enrichment:** Implementierung des Scrapers + Signal Detector (Robotics). +5. **UI:** React Interface für die Daten. \ No newline at end of file diff --git a/brancheneinstufung2.py b/_legacy_gsheets_system/brancheneinstufung2.py similarity index 100% rename from brancheneinstufung2.py rename to _legacy_gsheets_system/brancheneinstufung2.py diff --git a/build_knowledge_base.py b/_legacy_gsheets_system/build_knowledge_base.py similarity index 100% rename from build_knowledge_base.py rename to _legacy_gsheets_system/build_knowledge_base.py diff --git a/company_deduplicator.py b/_legacy_gsheets_system/company_deduplicator.py similarity index 100% rename from company_deduplicator.py rename to _legacy_gsheets_system/company_deduplicator.py diff --git a/_legacy_gsheets_system/config.py b/_legacy_gsheets_system/config.py new file mode 100644 index 00000000..4a1848f3 --- /dev/null +++ b/_legacy_gsheets_system/config.py @@ -0,0 +1,674 @@ +#!/usr/bin/env python3 +""" +config.py + +Zentrale Konfiguration für das Projekt "Automatisierte Unternehmensbewertung". +Enthält Dateipfade, API-Schlüssel-Pfade, die globale Config-Klasse +und das Spalten-Mapping für das Google Sheet. +""" + +import os +import re + +import logging + +# ============================================================================== +# 1. GLOBALE KONSTANTEN UND DATEIPFADE +# ============================================================================== + +# --- Dateipfade (NEU: Feste Pfade für Docker-Betrieb) --- +# Das Basisverzeichnis ist im Docker-Kontext immer /app. +BASE_DIR = "/app" + +CREDENTIALS_FILE = os.path.join(BASE_DIR, "service_account.json") +API_KEY_FILE = os.path.join(BASE_DIR, "gemini_api_key.txt") +SERP_API_KEY_FILE = os.path.join(BASE_DIR, "serpapikey.txt") +GENDERIZE_API_KEY_FILE = os.path.join(BASE_DIR, "genderize_API_Key.txt") +BRANCH_MAPPING_FILE = None +LOG_DIR = os.path.join(BASE_DIR, "Log_from_docker") # Log in den gemounteten Ordner schreiben + +# --- ML Modell Artefakte --- +MODEL_FILE = os.path.join(BASE_DIR, "technician_decision_tree_model.pkl") +IMPUTER_FILE = os.path.join(BASE_DIR, "median_imputer.pkl") +PATTERNS_FILE_TXT = os.path.join(BASE_DIR, "technician_patterns.txt") # Alt (Optional beibehalten) +PATTERNS_FILE_JSON = os.path.join(BASE_DIR, "technician_patterns.json") # Neu (Empfohlen) + +# Marker für URLs, die erneut per SERP gesucht werden sollen +URL_CHECK_MARKER = "URL_CHECK_NEEDED" + +# --- User Agents für Rotation --- +USER_AGENTS = [ + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0', + 'Mozilla/5.0 (X11; Linux i686; rv:108.0) Gecko/20100101 Firefox/108.0', + 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0', +] + +# ============================================================================== +# 2. VORAB-HELPER FUNKTION (wird von Config-Klasse benötigt) +# ============================================================================== + +def normalize_for_mapping(text): + """ + Normalisiert einen String aggressiv für Mapping-Zwecke. + Muss VOR der Config-Klasse definiert werden, da sie dort verwendet wird. + """ + if not isinstance(text, str): + return "" + text = text.lower() + text = text.strip() + text = re.sub(r'[^a-z0-9]', '', text) + return text + +# ============================================================================== +# 3. ZENTRALE KONFIGURATIONS-KLASSE +# ============================================================================== + +class Config: + """Zentrale Konfigurationseinstellungen.""" + VERSION = "v2.0.0" # Version hochgezählt nach Refactoring + LANG = "de" # Sprache fuer Wikipedia etc. + # ACHTUNG: SHEET_URL ist hier ein Platzhalter. Ersetzen Sie ihn durch Ihre tatsaechliche URL. + SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" # <<< ERSETZEN SIE DIES! + MAX_RETRIES = 5 + RETRY_DELAY = 10 + REQUEST_TIMEOUT = 20 + SIMILARITY_THRESHOLD = 0.65 + DEBUG = True + WIKIPEDIA_SEARCH_RESULTS = 5 + HTML_PARSER = "html.parser" + TOKEN_MODEL = "gpt-3.5-turbo" + USER_AGENT = 'Mozilla/5.0 (compatible; UnternehmenSkript/1.0; +https://www.example.com/bot)' + + # --- Konfiguration fuer Batching & Parallelisierung --- + PROCESSING_BATCH_SIZE = 20 + OPENAI_BATCH_SIZE_LIMIT = 4 + MAX_SCRAPING_WORKERS = 10 + UPDATE_BATCH_ROW_LIMIT = 50 + MAX_BRANCH_WORKERS = 10 + OPENAI_CONCURRENCY_LIMIT = 3 + PROCESSING_BRANCH_BATCH_SIZE = 20 + SERPAPI_DELAY = 1.5 + + # --- (NEU) GTM Architect: Stilvorgabe für Bildgenerierung --- + CORPORATE_DESIGN_PROMPT = ( + "cinematic industrial photography, sleek high-tech aesthetic, futuristic but grounded reality, " + "volumetric lighting, sharp focus on modern technology, 8k resolution, photorealistic, " + "highly detailed textures, cool steel-blue color grading with subtle safety-yellow accents, " + "wide angle lens, shallow depth of field." + ) + + # --- Plausibilitäts-Schwellenwerte --- + PLAUSI_UMSATZ_MIN_WARNUNG = 50000 + PLAUSI_UMSATZ_MAX_WARNUNG = 200000000000 + PLAUSI_MA_MIN_WARNUNG_ABS = 1 + PLAUSI_MA_MIN_WARNUNG_BEI_UMSATZ = 3 + PLAUSI_UMSATZ_MIN_SCHWELLE_FUER_MA_CHECK = 1000000 + PLAUSI_MA_MAX_WARNUNG = 1000000 + PLAUSI_RATIO_UMSATZ_PRO_MA_MIN = 25000 + PLAUSI_RATIO_UMSATZ_PRO_MA_MAX = 1500000 + PLAUSI_ABWEICHUNG_CRM_WIKI_PROZENT = 30 + + # --- Mapping für Länder-Codes --- + # Übersetzt D365 Country Codes in die im GSheet verwendete Langform. + # WICHTIG: Die Schlüssel (Codes) sollten in Kleinbuchstaben sein für einen robusten Vergleich. + COUNTRY_CODE_MAP = { + 'de': 'Deutschland', + 'gb': 'Vereinigtes Königreich', + 'ch': 'Schweiz', + 'at': 'Österreich', + 'it': 'Italien', + 'es': 'Spanien', + 'dk': 'Dänemark', + 'hu': 'Ungarn', + 'se': 'Schweden', + 'fr': 'Frankreich', + 'us': 'USA', + 'br': 'Brasilien', + 'cz': 'Tschechien', + 'au': 'Australien', + 'mx': 'Mexiko', + 'nl': 'Niederlande', + 'pl': 'Polen', + 'be': 'Belgien', + 'sk': 'Slowakei', + 'nz': 'Neuseeland', + 'in': 'Indien', + 'li': 'Liechtenstein', + 'ae': 'Vereinigte Arabische Emirate', + 'ru': 'Russland', + 'jp': 'Japan', + 'ro': 'Rumänien', + 'is': 'Island', + 'lu': 'Luxemburg', + 'me': 'Montenegro', + 'ph': 'Philippinen', + 'fi': 'Finnland', + 'no': 'Norwegen', + 'ma': 'Marokko', + 'hr': 'Kroatien', + 'ca': 'Kanada', + 'ua': 'Ukraine', + 'sb': 'Salomonen', + 'za': 'Südafrika', + 'ee': 'Estland', + 'cn': 'China', + 'si': 'Slowenien', + 'lt': 'Litauen', +} + + + # --- Branchen-Gruppen Mapping (v2.0 - Angereichert mit Definitionen & Beispielen) --- + # Single Source of Truth für alle Branchen. + BRANCH_GROUP_MAPPING = { + "Maschinenbau": { + "gruppe": "Hersteller / Produzenten", + "definition": "Herstellung von zumeist größeren und komplexen Maschinen. Abgrenzung: Keine Anlagen wie z.B. Aufzüge, Rolltreppen oder komplette Produktionsstraßen.", + "beispiele": "EBM Papst, Kärcher, Winterhalter, Testo, ZwickRoell, Koch Pac, Uhlmann, BHS, Schlie, Kasto, Chiron", + "d365_branch_detail": "Maschinenbau" + }, + "Automobil": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von (Spezial)-Fahrzeugen, die meist in ihrer Bewegung eingeschränkt sind (z.B. Mähdrescher, Pistenraupen). Abgrenzung: Keine Autohändler oder Service an PKWs.", + "beispiele": "Kässbohrer, Aebi Schmidt, Pesko, Nova, PV Automotive", + "d365_branch_detail": "Automobil" + }, + "Anlagenbau": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von komplexen Anlagen, die fest beim Kunden installiert werden (z.B. Fertigungsanlagen) und oft der Herstellung nachgelagerter Erzeugnisse dienen. Abgrenzung: Keine Aufzugsanlagen, keine Rolltreppen.", + "beispiele": "Yaskawa, Good Mills, Jungheinrich, Abus, BWT", + "d365_branch_detail": "Anlagenbau" + }, + "Medizintechnik": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von medizinischen Geräten für Krankenhäuser, (Zahn-)Arztpraxen oder den Privatbereich. Abgrenzung: Keine reinen Dienstleister/Pflegedienste.", + "beispiele": "Carl Zeiss, MMM, Olympus, Sysmex, Henry Schein, Dental Bauer, Vitalaire", + "d365_branch_detail": "Medizintechnik" + }, + "Chemie & Pharma": { + "gruppe": "Hersteller / Produzenten", + "definition": "Unternehmen, die chemische oder pharmazeutische Erzeugnisse herstellen. Abgrenzung: Keine Lebensmittel.", + "beispiele": "Brillux", + "d365_branch_detail": "Chemie & Pharma" + }, + "Elektrotechnik": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Maschinen und Geräten, die sich hauptsächlich durch elektrische Komponenten auszeichnen.", + "beispiele": "Triathlon, SBS BatterieSystem", + "d365_branch_detail": "Elektrotechnik" + }, + "Lebensmittelproduktion": { + "gruppe": "Hersteller / Produzenten", + "definition": "Unternehmen, die Lebensmittel im industriellen Maßstab produzieren.", + "beispiele": "Ferrero, Lohmann, Mars, Fuchs, Teekanne, Frischli", + "d365_branch_detail": "Lebensmittelproduktion" + }, + "IT / Telekommunikation": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Telekommunikations-Hardware und -Equipment. Abgrenzung: Keine Telekommunikations-Netzbetreiber.", + "beispiele": "NDI Nordisk Daek Import Danmark", + "d365_branch_detail": "IT / Telekommunikation" + }, + "Bürotechnik": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Geräten für die Büro-Infrastruktur wie Drucker, Kopierer oder Aktenvernichter.", + "beispiele": "Ricoh, Rosskopf", + "d365_branch_detail": "Bürotechnik" + }, + "Automaten (Vending / Slot)": { + "gruppe": "Hersteller / Produzenten", + "definition": "Reine Hersteller von Verkaufs-, Service- oder Spielautomaten, die mitunter einen eigenen Kundenservice haben.", + "beispiele": "Coffema, Melitta, Tchibo, Selecta", + "d365_branch_detail": "Automaten (Vending, Slot)" + }, + "Gebäudetechnik Heizung / Lüftung / Klima": { + "gruppe": "Hersteller / Produzenten", + "definition": "Reine Hersteller von Heizungs-, Lüftungs- und Klimaanlagen (HLK), die mitunter einen eigenen Kundenservice haben.", + "beispiele": "Wolf, ETA, Fröling, Ochsner, Windhager, DKA", + "d365_branch_detail": "Gebäudetechnik Heizung, Lüftung, Klima" + }, + "Gebäudetechnik Allgemein": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Produkten, die fest in Gebäuden installiert werden (z.B. Sicherheitstechnik, Türen, Sonnenschutz).", + "beispiele": "Geze, Bothe Hild, Warema, Hagleitner", + "d365_branch_detail": "Gebäudetechnik Allgemein" + }, + "Schädlingsbekämpfung": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Systemen und Produkten zur Schädlingsbekämpfung.", + "beispiele": "BioTec, RSD Systems", + "d365_branch_detail": "Schädlingsbekämpfung" + }, + "Braune & Weiße Ware": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Haushaltsgroßgeräten (Weiße Ware) und Unterhaltungselektronik (Braune Ware).", + "beispiele": "BSH", + "d365_branch_detail": "Braune & Weiße Ware" + }, + "Fenster / Glas": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von Fenstern, Türen oder Glaselementen.", + "beispiele": "", + "d365_branch_detail": "Fenster / Glas" + }, + "Getränke": { + "gruppe": "Hersteller / Produzenten", + "definition": "Industrielle Hersteller von Getränken.", + "beispiele": "Wesergold, Schlossquelle, Winkels", + "d365_branch_detail": "Getränke" + }, + "Möbel": { + "gruppe": "Hersteller / Produzenten", + "definition": "Industrielle Hersteller von Möbeln.", + "beispiele": "mycs", + "d365_branch_detail": "Möbel" + }, + "Agrar / Pellets": { + "gruppe": "Hersteller / Produzenten", + "definition": "Hersteller von landwirtschaftlichen Produkten, Maschinen oder Brennstoffen wie Holzpellets.", + "beispiele": "KWB Energiesysteme", + "d365_branch_detail": "Agrar, Pellets" + }, + "Stadtwerke": { + "gruppe": "Versorger", + "definition": "Lokale Stadtwerke, die die lokale Infrastruktur für die Energieversorgung (Strom, Gas, Wasser) betreiben.", + "beispiele": "Badenova, Drewag, Stadtwerke Leipzig, Stadtwerke Kiel", + "d365_branch_detail": "Stadtwerke" + }, + "Verteilnetzbetreiber": { + "gruppe": "Versorger", + "definition": "Überregionale Betreiber von Verteilnetzen (Strom, Gas), die oft keine direkten Endkundenversorger sind.", + "beispiele": "Rheinenergie, Open Grid, ENBW", + "d365_branch_detail": "Verteilnetzbetreiber" + }, + "Telekommunikation": { + "gruppe": "Versorger", + "definition": "Betreiber von Telekommunikations-Infrastruktur und Netzen (z.B. Telefon, Internet, Mobilfunk).", + "beispiele": "M-Net, NetCologne, Thiele, Willy.tel", + "d365_branch_detail": "Telekommunikation" + }, + "Gase & Mineralöl": { + "gruppe": "Versorger", + "definition": "Unternehmen, die Gas- oder Mineralölprodukte an Endkunden oder Unternehmen liefern.", + "beispiele": "Westfalen AG, GasCom", + "d365_branch_detail": "Gase & Mineralöl" + }, + "Messdienstleister": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Unternehmen, die sich auf die Ablesung und Abrechnung von Verbrauchszählern (Heizung, Wasser) spezialisiert haben. Abgrenzung: Kein Versorger.", + "beispiele": "Brunata, Ista, Telent", + "d365_branch_detail": "Messdienstleister" + }, + "Facility Management": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Anbieter von Dienstleistungen rund um Immobilien, von der technischen Instandhaltung bis zur Reinigung.", + "beispiele": "Wisag, Vonovia, Infraserv, Gewofag, B&O, Sprint Sanierungen, BWTS", + "d365_branch_detail": "Facility Management" + }, + "Healthcare/Pflegedienste": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Erbringen von reinen Dienstleistungen an medizinischen Geräten (z.B. Wartung, Lieferung) oder direkt an Menschen (Pflege). Abgrenzung: Keine Hersteller.", + "beispiele": "Sanimed, Fuchs+Möller, Strehlow, Healthcare at Home", + "d365_branch_detail": "Healthcare/Pflegedienste" + }, + "Servicedienstleister / Reparatur ohne Produktion": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Reine Service-Organisationen, die technische Geräte warten und reparieren, aber nicht selbst herstellen.", + "beispiele": "HSR, FFB", + "d365_branch_detail": "Servicedienstleister / Reparatur ohne Produktion" + }, + "Aufzüge und Rolltreppen": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Hersteller und Unternehmen, die Service, Wartung und Installation von Aufzügen und Rolltreppen anbieten.", + "beispiele": "TKE, Liftstar, Lifta", + "d365_branch_detail": "Aufzüge und Rolltreppen" + }, + "Feuer- und Sicherheitssysteme": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Dienstleister für die Wartung, Installation und Überprüfung von Brandmelde- und Sicherheitssystemen.", + "beispiele": "Minimax, Securiton", + "d365_branch_detail": "Feuer- und Sicherheitssysteme" + }, + "Personentransport": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Unternehmen, die Personen befördern (z.B. Busunternehmen, Taxi-Zentralen) und eine eigene Fahrzeugflotte warten.", + "beispiele": "Rhein-Sieg-Verkehrsgesellschaft", + "d365_branch_detail": "Personentransport" + }, + "Entsorgung": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Unternehmen der Abfall- und Entsorgungswirtschaft mit komplexer Logistik und Fahrzeugmanagement.", + "beispiele": "", + "d365_branch_detail": "Entsorgung" + }, + "Catering Services": { + "gruppe": "Service provider (Dienstleister)", + "definition": "Anbieter von Verpflegungsdienstleistungen, oft mit komplexer Logistik und Wartung von Küchengeräten.", + "beispiele": "Café+Co International", + "d365_branch_detail": "Catering Services" + }, + "Auslieferdienste": { + "gruppe": "Handel & Logistik", + "definition": "Unternehmen, deren Kerngeschäft der Transport und die Logistik von Waren zum Endkunden ist (Lieferdienste). Abgrenzung: Keine reinen Logistik-Dienstleister.", + "beispiele": "Edeka, Rewe, Saturn, Gamma Reifen", + "d365_branch_detail": "Auslieferdienste" + }, + "Energie (Brennstoffe)": { + "gruppe": "Handel & Logistik", + "definition": "Unternehmen, deren Kerngeschäft der Transport und die Logistik von Brennstoffen wie Heizöl zum Endkunden ist.", + "beispiele": "Eckert & Ziegler", + "d365_branch_detail": "Energie (Brennstoffe)" + }, + "Großhandel": { + "gruppe": "Handel & Logistik", + "definition": "Großhandelsunternehmen, bei denen der Transport und die Logistik eine zentrale Rolle spielen.", + "beispiele": "Hairhaus, NDI Nordisk", + "d365_branch_detail": "Großhandel" + }, + "Einzelhandel": { + "gruppe": "Handel & Logistik", + "definition": "Einzelhandelsunternehmen, oft mit eigener Lieferlogistik zum Endkunden.", + "beispiele": "Cactus, mertens, Teuto", + "d365_branch_detail": "Einzelhandel" + }, + "Logistik": { + "gruppe": "Handel & Logistik", + "definition": "Allgemeine Logistikdienstleister, die nicht in eine der spezifischeren Kategorien passen.", + "beispiele": "Gerdes + Landwehr, Rüdebusch, Winner", + "d365_branch_detail": "Logistik - Sonstige" + }, + "Baustoffhandel": { + "gruppe": "Baubranche", + "definition": "Großhandel mit Baustoffen wie Zement, Kies, Holz oder Fliesen – oft mit eigenen Fuhrparks und komplexer Filiallogistik.", + "beispiele": "Kemmler Baustoffe, Henri Benthack", + "d365_branch_detail": "Baustoffhandel" + }, + "Baustoffindustrie": { + "gruppe": "Baubranche", + "definition": "Produktion von Baustoffen wie Beton, Ziegeln, Gips oder Dämmmaterial – häufig mit werkseigener Logistik.", + "beispiele": "Heidelberg Materials, Saint Gobain Weber", + "d365_branch_detail": "Baustoffindustrie" + }, + "Logistiker Baustoffe": { + "gruppe": "Baubranche", + "definition": "Spezialisierte Transportdienstleister für Baustoffe – häufig im Nahverkehr, mit engen Zeitfenstern und Baustellenbelieferung.", + "beispiele": "C.Bergmann, HENGE Baustoff GmbH", + "d365_branch_detail": "Logistiker Baustoffe" + }, + "Baustoffindustrie": { + "gruppe": "Baubranche", + "definition": "Produktion von Baustoffen wie Beton, Ziegeln, Gips oder Dämmmaterial – häufig mit werkseigener Logistik.", + "beispiele": "Heidelberg Materials, Saint Gobain Weber", + "d365_branch_detail": "Baustoffindustrie" + }, + "Bauunternehmen": { + "gruppe": "Baubranche", + "definition": "Ausführung von Bauprojekten, oft mit eigenem Materialtransport – hoher Koordinationsaufwand bei Fahrzeugen, Maschinen und Baustellen.", + "beispiele": "Max Bögl, Leonhard Weiss", + "d365_branch_detail": "Bauunternehmen" + }, + "Versicherungsgutachten": { + "gruppe": "Gutachter / Versicherungen", + "definition": "Gutachter, die im Auftrag von Versicherungen Schäden prüfen und bewerten.", + "beispiele": "DEVK, Allianz", + "d365_branch_detail": "Versicherungsgutachten" + }, + "Technische Gutachten": { + "gruppe": "Gutachter / Versicherungen", + "definition": "Sachverständige und Organisationen, die technische Prüfungen, Inspektionen und Gutachten durchführen.", + "beispiele": "TÜV, Audatex, Value, MDK", + "d365_branch_detail": "Technische Gutachten" + }, + "Medizinische Gutachten": { + "gruppe": "Gutachter / Versicherungen", + "definition": "Sachverständige und Organisationen (z.B. MDK), die medizinische Gutachten erstellen.", + "beispiele": "MDK", + "d365_branch_detail": "Medizinische Gutachten" + }, + "Baugutachter": { + "gruppe": "Gutachter / Versicherungen", + "definition": "Sachverständige, die Bauschäden oder den Wert von Immobilien begutachten.", + "beispiele": "", + "d365_branch_detail": "Baugutachter" + }, + "Wohnungswirtschaft": { + "gruppe": "Housing", + "definition": "Wohnungsbaugesellschaften oder -genossenschaften, die ihre Immobilien instand halten.", + "beispiele": "GEWOFAG", + "d365_branch_detail": "Wohnungswirtschaft" + }, + "Renovierungsunternehmen": { + "gruppe": "Housing", + "definition": "Dienstleister, die auf die Renovierung und Sanierung von Wohnimmobilien spezialisiert sind.", + "beispiele": "", + "d365_branch_detail": "Renovierungsunternehmen" + }, + "Sozialbau Unternehmen": { + "gruppe": "Housing", + "definition": "Unternehmen, die im Bereich des sozialen Wohnungsbaus tätig sind.", + "beispiele": "", + "d365_branch_detail": "Anbieter für Soziales Wohnen" + }, + "IT Beratung": { + "gruppe": "Sonstige", + "definition": "Beratungsunternehmen mit Fokus auf IT-Strategie und -Implementierung. Abgrenzung: Keine Systemhäuser mit eigenem Außendienst.", + "beispiele": "", + "d365_branch_detail": "IT Beratung" + }, + "Unternehmensberatung": { + "gruppe": "Sonstige", + "definition": "Klassische Management- und Strategieberatungen.", + "beispiele": "", + "d365_branch_detail": "Unternehmensberatung (old)" + }, + "Engineering": { + "gruppe": "Sonstige", + "definition": "Ingenieurbüros und technische Planungsdienstleister.", + "beispiele": "", + "d365_branch_detail": "Engineering" + }, + "Öffentliche Verwaltung": { + "gruppe": "Sonstige", + "definition": "Behörden und öffentliche Einrichtungen, oft mit eigenen technischen Abteilungen (z.B. Bauhöfe).", + "beispiele": "", + "d365_branch_detail": "Öffentliche Verwaltung" + }, + "Sonstiger Service": { + "gruppe": "Sonstige", + "definition": "Auffangkategorie für Dienstleistungen, die keiner anderen Kategorie zugeordnet werden können.", + "beispiele": "", + "d365_branch_detail": "Sonstiger Service (old)" + } + } + + # Branchenübergreifende Top-Referenzen als Fallback + FALLBACK_REFERENCES = [ + "Jungheinrich (weltweit >4.000 Techniker)", + "Vivawest (Kundenzufriedenheit > 95%)", + "TK Elevators (1.500 Techniker)", + "NetCologne" + ] + + # --- API Schlüssel Speicherung (werden in main() geladen) --- + API_KEYS = {} + + @classmethod + def load_api_keys(cls): + """Laedt API-Schluessel aus den definierten Dateien.""" + logger = logging.getLogger(__name__) + logger.info("Lade API-Schluessel...") + cls.API_KEYS['openai'] = cls._load_key_from_file(API_KEY_FILE) + cls.API_KEYS['serpapi'] = cls._load_key_from_file(SERP_API_KEY_FILE) + cls.API_KEYS['genderize'] = cls._load_key_from_file(GENDERIZE_API_KEY_FILE) + + if cls.API_KEYS.get('openai'): + # Hier nehmen wir an, dass 'openai' für Gemini verwendet wird (Legacy) + # Falls in helpers.py direkt auf 'gemini' zugegriffen wird, müsste das hier auch gesetzt werden. + logger.info("Gemini API Key (via 'openai' slot) erfolgreich geladen.") + else: + logger.warning("Gemini API Key konnte nicht geladen werden. KI-Funktionen sind deaktiviert.") + + if not cls.API_KEYS.get('serpapi'): + logger.warning("SerpAPI Key konnte nicht geladen werden. Suchfunktionen sind deaktiviert.") + if not cls.API_KEYS.get('genderize'): + logger.warning("Genderize API Key konnte nicht geladen werden. Geschlechtserkennung ist eingeschraenkt.") + + @staticmethod + def _load_key_from_file(filepath): + """Hilfsfunktion zum Laden eines Schluessels aus einer Datei.""" + logger = logging.getLogger(__name__) + abs_path = os.path.abspath(filepath) + try: + with open(abs_path, "r", encoding="utf-8") as f: + key = f.read().strip() + if key: + return key + else: + logger.warning(f"API key file is empty: '{abs_path}'") + return None + except FileNotFoundError: + logger.warning(f"API key file not found at path: '{abs_path}'") + return None + except Exception as e: + logger.error(f"Error reading key file '{abs_path}': {e}") + return None + +# ============================================================================== +# 4. GLOBALE DATENSTRUKTUR-VARIABLEN +# ============================================================================== + +# NEU: Definiert die exakte und garantierte Reihenfolge der Spalten. +# Dies ist die neue "Single Source of Truth" für alle Index-Berechnungen. +COLUMN_ORDER = [ + "ReEval Flag", "CRM Name", "CRM Kurzform", "Parent Account Name", "CRM Website", "CRM Ort", "CRM Land", + "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", + "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", "System Vorschlag Parent Account", "Parent Vorschlag Status", + "Parent Vorschlag Timestamp", "Wiki URL", "Wiki Sitz Stadt", "Wiki Sitz Land", "Wiki Absatz", "Wiki Branche", + "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Wikipedia Timestamp", "Wiki Verif. Timestamp", + "SerpAPI Wiki Search Timestamp", "Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", + "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung", "Website Rohtext", "Website Zusammenfassung", + "Website Meta-Details", "Website Scrape Timestamp", "URL Prüfstatus", "Chat Vorschlag Branche", + "Chat Branche Konfidenz", "Chat Konsistenz Branche", "Chat Begruendung Abweichung Branche", + "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", "Chat Schätzung Anzahl Mitarbeiter", + "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begruendung Abweichung Mitarbeiterzahl", + "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", + "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz", "FSM Pitch", "FSM Pitch Timestamp", + "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", + "Linked Disponent gefunden", "Contact Search Timestamp", "Finaler Umsatz (Wiki>CRM)", + "Finaler Mitarbeiter (Wiki>CRM)", "Geschaetzter Techniker Bucket", "Plausibilität Umsatz", + "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio", "Abweichung Umsatz CRM/Wiki", + "Abweichung MA CRM/Wiki", "Plausibilität Begründung", "Plausibilität Prüfdatum", + "Archiviert", "SyncConflict", "Timestamp letzte Pruefung", "Version", "Tokens", "CRM ID" +] + +# --- Spalten-Mapping (Single Source of Truth) --- +# Version 1.8.0 - 68 Spalten (A-BP) +COLUMN_MAP = { + # A-E: Stammdaten & Prozesssteuerung + "ReEval Flag": {"Titel": "A", "index": 0}, + "CRM Name": {"Titel": "B", "index": 1}, + "CRM Kurzform": {"Titel": "C", "index": 2}, + "Parent Account Name": {"Titel": "D", "index": 3}, + "CRM Website": {"Titel": "E", "index": 4}, + # F-M: CRM-Daten + "CRM Ort": {"Titel": "F", "index": 5}, + "CRM Land": {"Titel": "G", "index": 6}, + "CRM Beschreibung": {"Titel": "H", "index": 7}, + "CRM Branche": {"Titel": "I", "index": 8}, + "CRM Beschreibung Branche extern": {"Titel": "J", "index": 9}, + "CRM Anzahl Techniker": {"Titel": "K", "index": 10}, + "CRM Umsatz": {"Titel": "L", "index": 11}, + "CRM Anzahl Mitarbeiter": {"Titel": "M", "index": 12}, + # N-Q: System & Parent Vorschläge + "CRM Vorschlag Wiki URL": {"Titel": "N", "index": 13}, + "System Vorschlag Parent Account": {"Titel": "O", "index": 14}, + "Parent Vorschlag Status": {"Titel": "P", "index": 15}, + "Parent Vorschlag Timestamp": {"Titel": "Q", "index": 16}, + # R-AB: Wikipedia Extraktion + "Wiki URL": {"Titel": "R", "index": 17}, + "Wiki Sitz Stadt": {"Titel": "S", "index": 18}, + "Wiki Sitz Land": {"Titel": "T", "index": 19}, + "Wiki Absatz": {"Titel": "U", "index": 20}, + "Wiki Branche": {"Titel": "V", "index": 21}, + "Wiki Umsatz": {"Titel": "W", "index": 22}, + "Wiki Mitarbeiter": {"Titel": "X", "index": 23}, + "Wiki Kategorien": {"Titel": "Y", "index": 24}, + "Wikipedia Timestamp": {"Titel": "Z", "index": 25}, + "Wiki Verif. Timestamp": {"Titel": "AA", "index": 26}, + "SerpAPI Wiki Search Timestamp": {"Titel": "AB", "index": 27}, + # AC-AF: ChatGPT Wiki Verifizierung + "Chat Wiki Konsistenzpruefung": {"Titel": "AC", "index": 28}, + "Chat Begründung Wiki Inkonsistenz": {"Titel": "AD", "index": 29}, + "Chat Vorschlag Wiki Artikel": {"Titel": "AE", "index": 30}, + "Begründung bei Abweichung": {"Titel": "AF", "index": 31}, + # AG-AK: Website Scraping + "Website Rohtext": {"Titel": "AG", "index": 32}, + "Website Zusammenfassung": {"Titel": "AH", "index": 33}, + "Website Meta-Details": {"Titel": "AI", "index": 34}, + "Website Scrape Timestamp": {"Titel": "AJ", "index": 35}, + "URL Prüfstatus": {"Titel": "AK", "index": 36}, + # AL-AU: ChatGPT Branchen & FSM Analyse + "Chat Vorschlag Branche": {"Titel": "AL", "index": 37}, + "Chat Branche Konfidenz": {"Titel": "AM", "index": 38}, + "Chat Konsistenz Branche": {"Titel": "AN", "index": 39}, + "Chat Begruendung Abweichung Branche": {"Titel": "AO", "index": 40}, + "Chat Prüfung FSM Relevanz": {"Titel": "AP", "index": 41}, + "Chat Begründung für FSM Relevanz": {"Titel": "AQ", "index": 42}, + "Chat Schätzung Anzahl Mitarbeiter": {"Titel": "AR", "index": 43}, + "Chat Konsistenzprüfung Mitarbeiterzahl": {"Titel": "AS", "index": 44}, + "Chat Begruendung Abweichung Mitarbeiterzahl": {"Titel": "AT", "index": 45}, + "Chat Einschätzung Anzahl Servicetechniker": {"Titel": "AU", "index": 46}, + # AV-AZ: ChatGPT Fortsetzung & FSM Pitch + "Chat Begründung Abweichung Anzahl Servicetechniker": {"Titel": "AV", "index": 47}, + "Chat Schätzung Umsatz": {"Titel": "AW", "index": 48}, + "Chat Begründung Abweichung Umsatz": {"Titel": "AX", "index": 49}, + "FSM Pitch": {"Titel": "AY", "index": 50}, + "FSM Pitch Timestamp": {"Titel": "AZ", "index": 51}, + # BA-BE: LinkedIn Kontaktsuche + "Linked Serviceleiter gefunden": {"Titel": "BA", "index": 52}, + "Linked It-Leiter gefunden": {"Titel": "BB", "index": 53}, + "Linked Management gefunden": {"Titel": "BC", "index": 54}, + "Linked Disponent gefunden": {"Titel": "BD", "index": 55}, + "Contact Search Timestamp": {"Titel": "BE", "index": 56}, + # BF-BH: Konsolidierte Daten & ML + "Finaler Umsatz (Wiki>CRM)": {"Titel": "BF", "index": 57}, + "Finaler Mitarbeiter (Wiki>CRM)": {"Titel": "BG", "index": 58}, + "Geschaetzter Techniker Bucket": {"Titel": "BH", "index": 59}, + # BI-BO: Plausibilitäts-Checks + "Plausibilität Umsatz": {"Titel": "BI", "index": 60}, + "Plausibilität Mitarbeiter": {"Titel": "BJ", "index": 61}, + "Plausibilität Umsatz/MA Ratio": {"Titel": "BK", "index": 62}, + "Abweichung Umsatz CRM/Wiki": {"Titel": "BL", "index": 63}, + "Abweichung MA CRM/Wiki": {"Titel": "BM", "index": 64}, + "Plausibilität Begründung": {"Titel": "BN", "index": 65}, + "Plausibilität Prüfdatum": {"Titel": "BO", "index": 66}, + "Archiviert": {"Titel": "BP", "index": 67}, + "SyncConflict": {"Titel": "BQ", "index": 68}, + # BR-BU: Metadaten (Indizes verschoben) + "Timestamp letzte Pruefung": {"Titel": "BR", "index": 69}, + "Version": {"Titel": "BS", "index": 70}, + "Tokens": {"Titel": "BT", "index": 71}, + "CRM ID": {"Titel": "BU", "index": 72} +} + +# ============================================================================== +# 5. DEALFRONT AUTOMATION CONFIGURATION +# ============================================================================== +DEALFRONT_CREDENTIALS_FILE = os.path.join(BASE_DIR, "dealfront_credentials.json") +DEALFRONT_LOGIN_URL = "https://app.dealfront.com/login" + +# Die direkte URL zum 'Target'-Bereich. Dies hat sich als der robusteste Weg erwiesen. +DEALFRONT_TARGET_URL = "https://app.dealfront.com/t/prospector/companies" + +# WICHTIG: Der exakte Name der vordefinierten Suche, die nach der Navigation geladen werden soll. +TARGET_SEARCH_NAME = "Facility Management" # <-- PASSEN SIE DIESEN NAMEN AN IHRE ZIEL-LISTE AN + + +# --- END OF FILE config.py --- \ No newline at end of file diff --git a/contact_grouping.py b/_legacy_gsheets_system/contact_grouping.py similarity index 100% rename from contact_grouping.py rename to _legacy_gsheets_system/contact_grouping.py diff --git a/data_processor.py b/_legacy_gsheets_system/data_processor.py similarity index 100% rename from data_processor.py rename to _legacy_gsheets_system/data_processor.py diff --git a/expand_knowledge_base.py b/_legacy_gsheets_system/expand_knowledge_base.py similarity index 100% rename from expand_knowledge_base.py rename to _legacy_gsheets_system/expand_knowledge_base.py diff --git a/extract_insights.py b/_legacy_gsheets_system/extract_insights.py similarity index 100% rename from extract_insights.py rename to _legacy_gsheets_system/extract_insights.py diff --git a/generate_knowledge_base.py b/_legacy_gsheets_system/generate_knowledge_base.py similarity index 100% rename from generate_knowledge_base.py rename to _legacy_gsheets_system/generate_knowledge_base.py diff --git a/generate_marketing_text.py b/_legacy_gsheets_system/generate_marketing_text.py similarity index 100% rename from generate_marketing_text.py rename to _legacy_gsheets_system/generate_marketing_text.py diff --git a/google_sheet_handler.py b/_legacy_gsheets_system/google_sheet_handler.py similarity index 100% rename from google_sheet_handler.py rename to _legacy_gsheets_system/google_sheet_handler.py diff --git a/_legacy_gsheets_system/helpers.py b/_legacy_gsheets_system/helpers.py new file mode 100644 index 00000000..ade7d9ac --- /dev/null +++ b/_legacy_gsheets_system/helpers.py @@ -0,0 +1,412 @@ +#!/usr/bin/env python3 +""" +helpers.py + +Sammlung von globalen, wiederverwendbaren Hilfsfunktionen für das Projekt +"Automatisierte Unternehmensbewertung". Enthält Decorators, Text-Normalisierung, +API-Wrapper und andere Dienstprogramme. +""" + +__version__ = "v2.4.0_Final_Fix" + +ALLOWED_TARGET_BRANCHES = [] + +# ============================================================================== +# 1. IMPORTS +# ============================================================================== +# Standardbibliotheken +import os +import time +import re +import csv +import json +import random +import logging +import traceback +import unicodedata +from datetime import datetime +from urllib.parse import urlparse, unquote +from difflib import SequenceMatcher +import base64 +import sys + +# Externe Bibliotheken +try: + import gspread + GSPREAD_AVAILABLE = True +except ImportError: + GSPREAD_AVAILABLE = False + gspread = None +try: + import wikipedia + WIKIPEDIA_AVAILABLE = True +except ImportError: + WIKIPEDIA_AVAILABLE = False + wikipedia = None +import requests +from bs4 import BeautifulSoup +try: + import pandas as pd + PANDAS_AVAILABLE = True +except Exception as e: + logging.warning(f"Pandas import failed: {e}") + PANDAS_AVAILABLE = False + pd = None + +# --- KI UMSCHALTUNG: Google Generative AI (Dual Support) --- +HAS_NEW_GENAI = False +HAS_OLD_GENAI = False + +# 1. Neue Bibliothek (google-genai) +try: + from google import genai + from google.genai import types + HAS_NEW_GENAI = True + logging.info("Bibliothek 'google.genai' (v1.0+) geladen.") +except ImportError: + logging.warning("Bibliothek 'google.genai' nicht gefunden. Versuche Fallback.") + +# 2. Alte Bibliothek (google-generativeai) +try: + import google.generativeai as old_genai + HAS_OLD_GENAI = True + logging.info("Bibliothek 'google.generativeai' (Legacy) geladen.") +except ImportError: + logging.warning("Bibliothek 'google.generativeai' nicht gefunden.") + +HAS_GEMINI = HAS_NEW_GENAI or HAS_OLD_GENAI + +# OpenAI Imports (Legacy) +try: + import openai + from openai.error import AuthenticationError, OpenAIError, RateLimitError, APIError, Timeout, InvalidRequestError, ServiceUnavailableError + OPENAI_AVAILABLE = True +except ImportError: + OPENAI_AVAILABLE = False + class AuthenticationError(Exception): pass + class OpenAIError(Exception): pass + class RateLimitError(Exception): pass + class APIError(Exception): pass + class Timeout(Exception): pass + class InvalidRequestError(Exception): pass + class ServiceUnavailableError(Exception): pass + +from config import (Config, BRANCH_MAPPING_FILE, URL_CHECK_MARKER, USER_AGENTS, LOG_DIR) +from config import Config, COLUMN_MAP, COLUMN_ORDER + +# Optionale Bibliotheken +try: + import tiktoken +except ImportError: + tiktoken = None + +gender = None +gender_detector = None + +def get_col_idx(key): + try: + return COLUMN_ORDER.index(key) + except ValueError: + return None + +# ============================================================================== +# 2. RETRY DECORATOR +# ============================================================================== +decorator_logger = logging.getLogger(__name__ + ".Retry") + +def retry_on_failure(func): + def wrapper(*args, **kwargs): + func_name = func.__name__ + self_arg = args[0] if args and hasattr(args[0], func_name) and isinstance(args[0], object) else None + effective_func_name = f"{self_arg.__class__.__name__}.{func_name}" if self_arg else func_name + + max_retries_config = getattr(Config, 'MAX_RETRIES', 3) + base_delay = getattr(Config, 'RETRY_DELAY', 5) + + if max_retries_config <= 0: + return func(*args, **kwargs) + + for attempt in range(max_retries_config): + try: + if attempt > 0: + decorator_logger.warning(f"Wiederhole Versuch {attempt + 1}/{max_retries_config} fuer '{effective_func_name}'...") + return func(*args, **kwargs) + + except Exception as e: + permanent_errors = [ValueError] + if GSPREAD_AVAILABLE: + permanent_errors.append(gspread.exceptions.SpreadsheetNotFound) + + if any(isinstance(e, error_type) for error_type in permanent_errors): + raise e + + if attempt < max_retries_config - 1: + wait_time = base_delay * (2 ** attempt) + random.uniform(0, 1) + time.sleep(wait_time) + else: + raise e + raise RuntimeError(f"Retry loop error for {effective_func_name}") + + return wrapper + +# ============================================================================== +# 3. LOGGING & UTILS +# ============================================================================== + +def token_count(text, model=None): + if not text or not isinstance(text, str): return 0 + return len(str(text).split()) + +def log_module_versions(modules_to_log): + pass + +def create_log_filename(mode): + try: + now = datetime.now().strftime("%Y-%m-%d_%H-%M") + ver_short = getattr(Config, 'VERSION', 'unknown').replace(".", "") + return os.path.join(LOG_DIR, f"{now}_{ver_short}_Modus-{mode}.txt") + except Exception: + return None + +# ============================================================================== +# 4. TEXT, STRING & URL UTILITIES +# ============================================================================== +def simple_normalize_url(url): return url if url else "k.A." +def normalize_string(s): return s +def clean_text(text): return str(text).strip() if text else "k.A." +def normalize_company_name(name): return name.lower().strip() if name else "" +def _get_col_letter(col_num): return "" +def fuzzy_similarity(str1, str2): return 0.0 +def extract_numeric_value(raw_value, is_umsatz=False): return "k.A." +def get_numeric_filter_value(value_str, is_umsatz=False): return 0.0 +@retry_on_failure +def _call_genderize_api(name, api_key): return {} +def get_gender(firstname): return "unknown" +def get_email_address(firstname, lastname, website): return "" + +# ============================================================================== +# 8. GEMINI API WRAPPERS +# ============================================================================== + +def _get_gemini_api_key(): + api_key = Config.API_KEYS.get('gemini') or Config.API_KEYS.get('openai') + if api_key: return api_key + api_key = os.environ.get("GEMINI_API_KEY") or os.environ.get("OPENAI_API_KEY") + if api_key: return api_key + raise ValueError("API Key missing.") + +@retry_on_failure +def call_gemini_flash(prompt, system_instruction=None, temperature=0.3, json_mode=False): + """ + Ruft Gemini auf (Text). Nutzt gemini-2.0-flash als Standard. + """ + logger = logging.getLogger(__name__) + api_key = _get_gemini_api_key() + + # Priorität 1: Alte Bibliothek (bewährt für Text in diesem Setup) + if HAS_OLD_GENAI: + try: + old_genai.configure(api_key=api_key) + generation_config = { + "temperature": temperature, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 8192, + } + if json_mode: + generation_config["response_mime_type"] = "application/json" + + # WICHTIG: Nutze 2.0, da 1.5 nicht verfügbar war + model = old_genai.GenerativeModel( + model_name="gemini-2.0-flash", + generation_config=generation_config, + system_instruction=system_instruction + ) + contents = [prompt] if isinstance(prompt, str) else prompt + response = model.generate_content(contents) + return response.text.strip() + except Exception as e: + logger.error(f"Fehler mit alter GenAI Lib: {e}") + if not HAS_NEW_GENAI: raise e + # Fallthrough to new lib + + # Priorität 2: Neue Bibliothek + if HAS_NEW_GENAI: + try: + client = genai.Client(api_key=api_key) + config = { + "temperature": temperature, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 8192, + } + if json_mode: + config["response_mime_type"] = "application/json" + + response = client.models.generate_content( + model="gemini-2.0-flash", + contents=[prompt] if isinstance(prompt, str) else prompt, + config=config + ) + return response.text.strip() + except Exception as e: + logger.error(f"Fehler mit neuer GenAI Lib: {e}") + raise e + + raise ImportError("Keine Gemini Bibliothek verfügbar.") + +@retry_on_failure +def call_gemini_image(prompt, reference_image_b64=None, aspect_ratio=None): + """ + Generiert ein Bild. + - Mit Referenzbild: Gemini 2.5 Flash Image. + - Ohne Referenzbild: Imagen 4.0. + - NEU: Akzeptiert `aspect_ratio` (z.B. "16:9"). + - NEU: Wendet einen zentralen Corporate Design Prompt an. + """ + logger = logging.getLogger(__name__) + api_key = _get_gemini_api_key() + + if HAS_NEW_GENAI: + try: + client = genai.Client(api_key=api_key) + + # --- FALL A: REFERENZBILD VORHANDEN (Gemini 2.5) --- + if reference_image_b64: + try: + from PIL import Image + import io + except ImportError: + raise ImportError("Pillow (PIL) fehlt. Bitte 'pip install Pillow' ausführen.") + + logger.info(f"Start Image-to-Image Generation mit gemini-2.5-flash-image. Seitenverhältnis: {aspect_ratio or 'default'}") + + # Base64 zu PIL Image + try: + if "," in reference_image_b64: + reference_image_b64 = reference_image_b64.split(",")[1] + image_data = base64.b64decode(reference_image_b64) + raw_image = Image.open(io.BytesIO(image_data)) + except Exception as e: + logger.error(f"Fehler beim Laden des Referenzbildes: {e}") + raise ValueError("Ungültiges Referenzbild.") + + # Strengerer Prompt + full_prompt = ( + "Use the provided reference image as the absolute truth. " + f"Place EXACTLY this product into the scene: {prompt}. " + "Do NOT alter the product's design, shape, or colors. " + "Keep the product 100% identical to the reference. " + "Only adjust lighting and perspective to match the scene." + ) + + # Hier können wir das Seitenverhältnis nicht direkt steuern, + # da es vom Referenzbild abhängt. Wir könnten es aber in den Prompt einbauen. + if aspect_ratio: + full_prompt += f" The final image composition should have an aspect ratio of {aspect_ratio}." + + response = client.models.generate_content( + model='gemini-2.5-flash-image', + contents=[raw_image, full_prompt] + ) + + if response.candidates and response.candidates[0].content.parts: + for part in response.candidates[0].content.parts: + if part.inline_data: + return base64.b64encode(part.inline_data.data).decode('utf-8') + + raise ValueError("Gemini 2.5 hat kein Bild zurückgeliefert.") + + # --- FALL B: KEIN REFERENZBILD (Imagen 4) --- + else: + img_config = { + "number_of_images": 1, + "output_mime_type": "image/jpeg", + } + # Füge Seitenverhältnis hinzu, falls vorhanden + if aspect_ratio in ["16:9", "9:16", "1:1", "4:3"]: + img_config["aspect_ratio"] = aspect_ratio + logger.info(f"Seitenverhältnis auf {aspect_ratio} gesetzt.") + + # Wende zentralen Stil an + final_prompt = f"{Config.CORPORATE_DESIGN_PROMPT}\n\nTask: {prompt}" + + method = getattr(client.models, 'generate_images', None) + if not method: + available_methods = [m for m in dir(client.models) if not m.startswith('_')] + raise AttributeError(f"Client hat keine Image-Methode. Verfügbar: {available_methods}") + + candidates = [ + 'imagen-4.0-generate-001', + 'imagen-4.0-fast-generate-001', + 'imagen-4.0-ultra-generate-001' + ] + + last_error = None + for model_name in candidates: + try: + logger.info(f"Versuche Text-zu-Bild mit Modell: {model_name}") + response = method( + model=model_name, + prompt=final_prompt, + config=img_config + ) + + if response.generated_images: + image_bytes = response.generated_images[0].image.image_bytes + return base64.b64encode(image_bytes).decode('utf-8') + except Exception as e: + logger.warning(f"Modell {model_name} fehlgeschlagen: {e}") + last_error = e + + if last_error: raise last_error + raise ValueError("Kein Modell konnte Bilder generieren.") + + except Exception as e: + logger.error(f"Fehler bei Image Gen: {e}") + raise e + else: + logger.error("Image Generation erfordert die neue 'google-genai' Bibliothek.") + raise ImportError("Installieren Sie 'google-genai' für Bildgenerierung.") + +@retry_on_failure +def call_openai_chat(prompt, temperature=0.3, model=None, response_format_json=False): + return call_gemini_flash( + prompt=prompt, + temperature=temperature, + json_mode=response_format_json, + system_instruction=None + ) + +def summarize_website_content(raw_text, company_name): return "k.A." +def summarize_wikipedia_article(full_text, company_name): return "k.A." +def evaluate_branche_chatgpt(company_name, website_summary, wiki_absatz): return {} +def evaluate_branches_batch(companies_data): return [] +def verify_wiki_article_chatgpt(company_name, parent_name, website, wiki_title, wiki_summary): return {} +def generate_fsm_pitch(company_name, company_short_name, ki_branche, website_summary, wiki_absatz, anzahl_ma, anzahl_techniker, techniker_bucket_ml): return "" +def serp_website_lookup(company_name): return "k.A." +def search_linkedin_contacts(company_name, website, position_query, crm_kurzform, num_results=10): return [] +def get_website_raw(url, max_length=30000, verify_cert=False): return "k.A." + +def scrape_website_details(url): + logger = logging.getLogger(__name__) + if not url or not isinstance(url, str) or not url.startswith('http'): + return "Keine gültige URL angegeben." + try: + headers = {'User-Agent': random.choice(USER_AGENTS)} + response = requests.get(url, headers=headers, timeout=getattr(Config, 'REQUEST_TIMEOUT', 15), verify=False) + response.raise_for_status() + if 'text/html' not in response.headers.get('Content-Type', ''): return "Kein HTML." + soup = BeautifulSoup(response.content, 'html.parser') + for element in soup(['script', 'style', 'noscript', 'iframe', 'svg', 'header', 'footer', 'nav', 'aside', 'form', 'button', 'a']): + element.decompose() + body = soup.find('body') + text = body.get_text(separator=' ', strip=True) if body else soup.get_text(separator=' ', strip=True) + text = re.sub(r'\s+', ' ', text).strip() + return text[:25000] if text else "Leer." + except Exception as e: + logger.error(f"Fehler URL {url}: {e}") + return "Fehler beim Scraping." + +def is_valid_wikipedia_article_url(url): return False +def alignment_demo(sheet_handler): pass \ No newline at end of file diff --git a/knowledge_base_builder.py b/_legacy_gsheets_system/knowledge_base_builder.py similarity index 100% rename from knowledge_base_builder.py rename to _legacy_gsheets_system/knowledge_base_builder.py diff --git a/sync_manager.py b/_legacy_gsheets_system/sync_manager.py similarity index 100% rename from sync_manager.py rename to _legacy_gsheets_system/sync_manager.py diff --git a/wikipedia_scraper.py b/_legacy_gsheets_system/wikipedia_scraper.py similarity index 100% rename from wikipedia_scraper.py rename to _legacy_gsheets_system/wikipedia_scraper.py diff --git a/cat_log.py b/cat_log.py new file mode 100644 index 00000000..292cdcfb --- /dev/null +++ b/cat_log.py @@ -0,0 +1,7 @@ +import sys +try: + file_path = sys.argv[1] if len(sys.argv) > 1 else 'company-explorer/logs_debug/company_explorer_debug.log' + with open(file_path, 'r') as f: + print(f.read()) +except Exception as e: + print(f"Error reading {file_path}: {e}") \ No newline at end of file diff --git a/company-explorer/Dockerfile b/company-explorer/Dockerfile new file mode 100644 index 00000000..cb05cbf1 --- /dev/null +++ b/company-explorer/Dockerfile @@ -0,0 +1,36 @@ +# --- STAGE 1: Build Frontend --- +FROM node:20-slim AS frontend-builder +WORKDIR /build +COPY frontend/package*.json ./ +RUN npm install +COPY frontend/ ./ +RUN npm run build + +# --- STAGE 2: Backend & Runtime --- +FROM python:3.11-slim +WORKDIR /app + +# System Dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +# Copy Requirements & Install +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy Built Frontend from Stage 1 (To a safe location outside /app) +COPY --from=frontend-builder /build/dist /frontend_static + +# Copy Backend Source +COPY backend ./backend + +# Environment Variables +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 + +# Expose Port +EXPOSE 8000 + +# Start FastAPI +CMD ["uvicorn", "backend.app:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/company-explorer/backend/app.py b/company-explorer/backend/app.py new file mode 100644 index 00000000..6e21eaa1 --- /dev/null +++ b/company-explorer/backend/app.py @@ -0,0 +1,314 @@ +from fastapi import FastAPI, Depends, HTTPException, Query, BackgroundTasks +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse +from sqlalchemy.orm import Session, joinedload +from typing import List, Optional, Dict, Any +from pydantic import BaseModel +from datetime import datetime +import os +import sys + +from .config import settings +from .lib.logging_setup import setup_logging + +# Setup Logging first +setup_logging() +import logging +logger = logging.getLogger(__name__) + +from .database import init_db, get_db, Company, Signal, EnrichmentData +from .services.deduplication import Deduplicator +from .services.discovery import DiscoveryService +from .services.scraping import ScraperService +from .services.classification import ClassificationService + +# Initialize App +app = FastAPI( + title=settings.APP_NAME, + version=settings.VERSION, + description="Backend for Company Explorer (Robotics Edition)", + root_path="/ce" +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Service Singletons +scraper = ScraperService() +classifier = ClassificationService() +discovery = DiscoveryService() + +# --- Pydantic Models --- +class CompanyCreate(BaseModel): + name: str + city: Optional[str] = None + country: str = "DE" + website: Optional[str] = None + +class BulkImportRequest(BaseModel): + names: List[str] + +class AnalysisRequest(BaseModel): + company_id: int + force_scrape: bool = False + +# --- Events --- +@app.on_event("startup") +def on_startup(): + logger.info("Startup Event: Initializing Database...") + try: + init_db() + logger.info("Database initialized successfully.") + except Exception as e: + logger.critical(f"Database init failed: {e}", exc_info=True) + +# --- Routes --- + +@app.get("/api/health") +def health_check(): + return {"status": "ok", "version": settings.VERSION, "db": settings.DATABASE_URL} + +@app.get("/api/companies") +def list_companies( + skip: int = 0, + limit: int = 50, + search: Optional[str] = None, + db: Session = Depends(get_db) +): + try: + query = db.query(Company) + if search: + query = query.filter(Company.name.ilike(f"%{search}%")) + + total = query.count() + # Sort by ID desc (newest first) + items = query.order_by(Company.id.desc()).offset(skip).limit(limit).all() + + return {"total": total, "items": items} + except Exception as e: + logger.error(f"List Companies Error: {e}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/api/companies/{company_id}") +def get_company(company_id: int, db: Session = Depends(get_db)): + company = db.query(Company).options(joinedload(Company.signals)).filter(Company.id == company_id).first() + if not company: + raise HTTPException(status_code=404, detail="Company not found") + return company + +@app.post("/api/companies/bulk") +def bulk_import_names(req: BulkImportRequest, db: Session = Depends(get_db)): + """ + Quick import for testing. Just a list of names. + """ + logger.info(f"Starting bulk import of {len(req.names)} names.") + try: + added = 0 + skipped = 0 + + # Deduplicator init + try: + dedup = Deduplicator(db) + logger.info("Deduplicator initialized.") + except Exception as e: + logger.warning(f"Deduplicator init failed: {e}") + dedup = None + + for name in req.names: + clean_name = name.strip() + if not clean_name: continue + + # 1. Simple Deduplication (Exact Name) + exists = db.query(Company).filter(Company.name == clean_name).first() + if exists: + skipped += 1 + continue + + # 2. Smart Deduplication (if available) + if dedup: + matches = dedup.find_duplicates({"name": clean_name}) + if matches and matches[0]['score'] > 95: + logger.info(f"Duplicate found for {clean_name}: {matches[0]['name']}") + skipped += 1 + continue + + # 3. Create + new_comp = Company( + name=clean_name, + status="NEW" # This triggered the error before + ) + db.add(new_comp) + added += 1 + + db.commit() + logger.info(f"Import success. Added: {added}, Skipped: {skipped}") + return {"added": added, "skipped": skipped} + except Exception as e: + logger.error(f"Bulk Import Failed: {e}", exc_info=True) + db.rollback() + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/api/enrich/discover") +def discover_company(req: AnalysisRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db)): + """ + Triggers Stage 1: Discovery (Website Search + Wikipedia Search) + """ + try: + company = db.query(Company).filter(Company.id == req.company_id).first() + if not company: + raise HTTPException(404, "Company not found") + + # Run in background + background_tasks.add_task(run_discovery_task, company.id) + + return {"status": "queued", "message": f"Discovery started for {company.name}"} + except Exception as e: + logger.error(f"Discovery Error: {e}") + raise HTTPException(status_code=500, detail=str(e)) + +def run_discovery_task(company_id: int): + # New Session for Background Task + from .database import SessionLocal + db = SessionLocal() + try: + company = db.query(Company).filter(Company.id == company_id).first() + if not company: return + + logger.info(f"Running Discovery Task for {company.name}") + + # 1. Website Search + if not company.website or company.website == "k.A.": + found_url = discovery.find_company_website(company.name, company.city) + if found_url and found_url != "k.A.": + company.website = found_url + logger.info(f"-> Found URL: {found_url}") + + # 2. Wikipedia Search + wiki_url = discovery.find_wikipedia_url(company.name) + company.last_wiki_search_at = datetime.utcnow() + + existing_wiki = db.query(EnrichmentData).filter( + EnrichmentData.company_id == company.id, + EnrichmentData.source_type == "wikipedia_url" + ).first() + + if not existing_wiki: + db.add(EnrichmentData(company_id=company.id, source_type="wikipedia_url", content={"url": wiki_url})) + else: + existing_wiki.content = {"url": wiki_url} + existing_wiki.updated_at = datetime.utcnow() + + if company.status == "NEW" and company.website and company.website != "k.A.": + company.status = "DISCOVERED" + + db.commit() + logger.info(f"Discovery finished for {company.id}") + except Exception as e: + logger.error(f"Background Task Error: {e}", exc_info=True) + db.rollback() + finally: + db.close() + +@app.post("/api/enrich/analyze") +def analyze_company(req: AnalysisRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db)): + company = db.query(Company).filter(Company.id == req.company_id).first() + if not company: + raise HTTPException(404, "Company not found") + + if not company.website or company.website == "k.A.": + return {"error": "No website to analyze. Run Discovery first."} + + background_tasks.add_task(run_analysis_task, company.id, company.website) + return {"status": "queued"} + +def run_analysis_task(company_id: int, url: str): + from .database import SessionLocal + db = SessionLocal() + try: + company = db.query(Company).filter(Company.id == company_id).first() + if not company: return + + logger.info(f"Running Analysis Task for {company.name}") + + # 1. Scrape Website + scrape_result = scraper.scrape_url(url) + + # Save Scrape Data + existing_scrape_data = db.query(EnrichmentData).filter( + EnrichmentData.company_id == company.id, + EnrichmentData.source_type == "website_scrape" + ).first() + + if "text" in scrape_result and scrape_result["text"]: + if not existing_scrape_data: + db.add(EnrichmentData(company_id=company.id, source_type="website_scrape", content=scrape_result)) + else: + existing_scrape_data.content = scrape_result + existing_scrape_data.updated_at = datetime.utcnow() + elif "error" in scrape_result: + logger.warning(f"Scraping failed for {company.name}: {scrape_result['error']}") + + # 2. Classify Robotics Potential + if "text" in scrape_result and scrape_result["text"]: + analysis = classifier.analyze_robotics_potential( + company_name=company.name, + website_text=scrape_result["text"] + ) + + if "error" in analysis: + logger.error(f"Robotics classification failed for {company.name}: {analysis['error']}") + else: + industry = analysis.get("industry") + if industry: + company.industry_ai = industry + + # Delete old signals + db.query(Signal).filter(Signal.company_id == company.id).delete() + + # Save new signals + potentials = analysis.get("potentials", {}) + for signal_type, data in potentials.items(): + new_signal = Signal( + company_id=company.id, + signal_type=f"robotics_{signal_type}_potential", + confidence=data.get("score", 0), + value="High" if data.get("score", 0) > 70 else "Medium" if data.get("score", 0) > 30 else "Low", + proof_text=data.get("reason") + ) + db.add(new_signal) + + company.status = "ENRICHED" + company.last_classification_at = datetime.utcnow() + logger.info(f"Robotics analysis complete for {company.name}.") + + db.commit() + logger.info(f"Analysis finished for {company.id}") + except Exception as e: + logger.error(f"Analyze Task Error: {e}", exc_info=True) + db.rollback() + finally: + db.close() + +# --- Serve Frontend --- +# Priority 1: Container Path (outside of /app volume) +static_path = "/frontend_static" + +# Priority 2: Local Dev Path (relative to this file) +if not os.path.exists(static_path): + static_path = os.path.join(os.path.dirname(__file__), "../static") + +if os.path.exists(static_path): + logger.info(f"Serving frontend from {static_path}") + app.mount("/", StaticFiles(directory=static_path, html=True), name="static") +else: + logger.warning(f"Frontend static files not found at {static_path} or local fallback.") + +if __name__ == "__main__": + import uvicorn + uvicorn.run("backend.app:app", host="0.0.0.0", port=8000, reload=True) \ No newline at end of file diff --git a/company-explorer/backend/config.py b/company-explorer/backend/config.py new file mode 100644 index 00000000..0651eec6 --- /dev/null +++ b/company-explorer/backend/config.py @@ -0,0 +1,63 @@ +import os +import logging +from typing import Optional + +# Versuche Pydantic zu nutzen, Fallback auf os.environ +try: + from pydantic_settings import BaseSettings + + class Settings(BaseSettings): + # App Info + APP_NAME: str = "Company Explorer" + VERSION: str = "0.2.2" + DEBUG: bool = True + + # Database (Store in App dir for simplicity) + DATABASE_URL: str = "sqlite:////app/companies_v3_final.db" + + # API Keys + GEMINI_API_KEY: Optional[str] = None + OPENAI_API_KEY: Optional[str] = None + SERP_API_KEY: Optional[str] = None + + # Paths + LOG_DIR: str = "/app/logs_debug" + + class Config: + env_file = ".env" + + settings = Settings() + +except ImportError: + # Fallback wenn pydantic-settings nicht installiert ist + class Settings: + APP_NAME = "Company Explorer" + VERSION = "0.2.1" + DEBUG = True + DATABASE_URL = "sqlite:////app/logs_debug/companies_debug.db" + GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") + OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") + SERP_API_KEY = os.getenv("SERP_API_KEY") + LOG_DIR = "/app/logs_debug" + + settings = Settings() + +# Ensure Log Dir +os.makedirs(settings.LOG_DIR, exist_ok=True) + +# API Key Loading Helper (from file if env missing) +def load_api_key_from_file(filename: str) -> Optional[str]: + try: + if os.path.exists(filename): + with open(filename, 'r') as f: + return f.read().strip() + except Exception as e: + print(f"Could not load key from {filename}: {e}") # Print because logging might not be ready + return None + +# Auto-load keys if not in env +if not settings.GEMINI_API_KEY: + settings.GEMINI_API_KEY = load_api_key_from_file("/app/gemini_api_key.txt") + +if not settings.SERP_API_KEY: + settings.SERP_API_KEY = load_api_key_from_file("/app/serpapikey.txt") \ No newline at end of file diff --git a/company-explorer/backend/database.py b/company-explorer/backend/database.py new file mode 100644 index 00000000..9b7874da --- /dev/null +++ b/company-explorer/backend/database.py @@ -0,0 +1,113 @@ +from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, ForeignKey, Float, Boolean, JSON +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship +from datetime import datetime +from .config import settings + +# Setup +engine = create_engine(settings.DATABASE_URL, connect_args={"check_same_thread": False}) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) +Base = declarative_base() + +# ============================================================================== +# MODELS +# ============================================================================== + +class Company(Base): + __tablename__ = "companies" + + id = Column(Integer, primary_key=True, index=True) + + # Core Identity + name = Column(String, index=True) + website = Column(String, index=True) # Normalized Domain preferred + crm_id = Column(String, unique=True, index=True, nullable=True) # Link to D365 + + # Classification + industry_crm = Column(String, nullable=True) # The "allowed" industry + industry_ai = Column(String, nullable=True) # The AI suggested industry + + # Location + city = Column(String, nullable=True) + country = Column(String, default="DE") + + # Workflow Status + status = Column(String, default="NEW", index=True) + + # Granular Process Tracking (Timestamps) + created_at = Column(DateTime, default=datetime.utcnow) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + + last_scraped_at = Column(DateTime, nullable=True) + last_wiki_search_at = Column(DateTime, nullable=True) + last_classification_at = Column(DateTime, nullable=True) + last_signal_check_at = Column(DateTime, nullable=True) + + # Relationships + signals = relationship("Signal", back_populates="company", cascade="all, delete-orphan") + enrichment_data = relationship("EnrichmentData", back_populates="company", cascade="all, delete-orphan") + + +class Signal(Base): + """ + Represents a specific sales signal or potential. + Example: type='has_spa', value='true', proof='Wellnessbereich mit 2000qm' + """ + __tablename__ = "signals" + + id = Column(Integer, primary_key=True, index=True) + company_id = Column(Integer, ForeignKey("companies.id")) + + signal_type = Column(String, index=True) # e.g. "robotics_cleaning_potential" + confidence = Column(Float, default=0.0) # 0.0 to 1.0 + value = Column(String) # "High", "Medium", "Yes", "No" + proof_text = Column(Text, nullable=True) # Snippet from website/source + + created_at = Column(DateTime, default=datetime.utcnow) + + company = relationship("Company", back_populates="signals") + + +class EnrichmentData(Base): + """ + Stores raw data blobs (HTML, API responses) to allow re-processing. + """ + __tablename__ = "enrichment_data" + + id = Column(Integer, primary_key=True, index=True) + company_id = Column(Integer, ForeignKey("companies.id")) + + source_type = Column(String) # "website_scrape", "wikipedia_api", "google_serp" + content = Column(JSON) # The raw data + + created_at = Column(DateTime, default=datetime.utcnow) + + company = relationship("Company", back_populates="enrichment_data") + +class ImportLog(Base): + """ + Logs bulk imports (e.g. from Excel lists). + """ + __tablename__ = "import_logs" + + id = Column(Integer, primary_key=True) + filename = Column(String) + import_type = Column(String) # "crm_dump" or "event_list" + total_rows = Column(Integer) + imported_rows = Column(Integer) + duplicate_rows = Column(Integer) + created_at = Column(DateTime, default=datetime.utcnow) + +# ============================================================================== +# UTILS +# ============================================================================== + +def init_db(): + Base.metadata.create_all(bind=engine) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() \ No newline at end of file diff --git a/company-explorer/backend/interfaces.py b/company-explorer/backend/interfaces.py new file mode 100644 index 00000000..b510dfc7 --- /dev/null +++ b/company-explorer/backend/interfaces.py @@ -0,0 +1,56 @@ +from abc import ABC, abstractmethod +from typing import List, Optional, Dict, Any +from pydantic import BaseModel + +# --- Generisches Datenmodell --- +# Damit ist unsere App unabhängig davon, wie SuperOffice Felder benennt. +class LeadData(BaseModel): + name: str + website: Optional[str] = None + city: Optional[str] = None + country: str = "DE" + industry: Optional[str] = None + + # Enrichment Data + robotics_potential_score: int = 0 + robotics_potential_reason: Optional[str] = None + + # Meta + source_id: Optional[str] = None # ID im Quellsystem (z.B. SuperOffice ID) + +class TaskData(BaseModel): + subject: str + description: str + deadline: Optional[str] = None + +# --- Der Vertrag (Repository Interface) --- +class CRMRepository(ABC): + """ + Abstrakte Basisklasse für alle CRM-Integrationen. + Egal ob Notion, SuperOffice oder Odoo - alle müssen diese Methoden haben. + """ + + @abstractmethod + def get_name(self) -> str: + """Gibt den Namen des Systems zurück (z.B. 'SuperOffice')""" + pass + + @abstractmethod + def find_company(self, name: str, email: str = None) -> Optional[str]: + """Sucht eine Firma und gibt die externe ID zurück, falls gefunden.""" + pass + + @abstractmethod + def create_lead(self, lead: LeadData) -> str: + """Erstellt einen neuen Lead und gibt die externe ID zurück.""" + pass + + @abstractmethod + def update_lead(self, external_id: str, lead: LeadData) -> bool: + """Aktualisiert einen bestehenden Lead mit neuen Enrichment-Daten.""" + pass + + @abstractmethod + def create_task(self, external_id: str, task: TaskData) -> bool: + """Erstellt eine Aufgabe/Wiedervorlage für den Vertriebler beim Lead.""" + pass diff --git a/company-explorer/backend/lib/core_utils.py b/company-explorer/backend/lib/core_utils.py new file mode 100644 index 00000000..4cc5c292 --- /dev/null +++ b/company-explorer/backend/lib/core_utils.py @@ -0,0 +1,144 @@ +import time +import logging +import random +import os +import re +from functools import wraps +from typing import Optional, Union, List + +# Versuche neue Google GenAI Lib (v1.0+) +try: + from google import genai + from google.genai import types + HAS_NEW_GENAI = True +except ImportError: + HAS_NEW_GENAI = False + +# Fallback auf alte Lib +try: + import google.generativeai as old_genai + HAS_OLD_GENAI = True +except ImportError: + HAS_OLD_GENAI = False + +from ..config import settings + +logger = logging.getLogger(__name__) + +# ============================================================================== +# 1. DECORATORS +# ============================================================================== + +def retry_on_failure(max_retries: int = 3, delay: float = 2.0): + """ + Decorator for retrying functions with exponential backoff. + """ + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + last_exception = None + for attempt in range(max_retries): + try: + return func(*args, **kwargs) + except Exception as e: + last_exception = e + # Don't retry on certain fatal errors (can be extended) + if isinstance(e, ValueError) and "API Key" in str(e): + raise e + + wait_time = delay * (2 ** attempt) + random.uniform(0, 1) + logger.warning(f"Retry {attempt + 1}/{max_retries} for '{func.__name__}' after error: {e}. Waiting {wait_time:.1f}s") + time.sleep(wait_time) + + logger.error(f"Function '{func.__name__}' failed after {max_retries} attempts.") + raise last_exception + return wrapper + return decorator + +# ============================================================================== +# 2. TEXT TOOLS +# ============================================================================== + +def clean_text(text: str) -> str: + """Removes excess whitespace and control characters.""" + if not text: + return "" + text = str(text).strip() + text = re.sub(r'\s+', ' ', text) + return text + +def normalize_string(s: str) -> str: + """Basic normalization (lowercase, stripped).""" + return s.lower().strip() if s else "" + +# ============================================================================== +# 3. LLM WRAPPER (GEMINI) +# ============================================================================== + +@retry_on_failure(max_retries=3) +def call_gemini( + prompt: Union[str, List[str]], + model_name: str = "gemini-2.0-flash", + temperature: float = 0.3, + json_mode: bool = False, + system_instruction: Optional[str] = None +) -> str: + """ + Unified caller for Gemini API. Prefers new `google.genai` library. + """ + api_key = settings.GEMINI_API_KEY + if not api_key: + raise ValueError("GEMINI_API_KEY is missing in configuration.") + + # Option A: New Library (google-genai) + if HAS_NEW_GENAI: + try: + client = genai.Client(api_key=api_key) + config = { + "temperature": temperature, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 8192, + } + if json_mode: + config["response_mime_type"] = "application/json" + + response = client.models.generate_content( + model=model_name, + contents=[prompt] if isinstance(prompt, str) else prompt, + config=config, + ) + if not response.text: + raise ValueError("Empty response from Gemini") + return response.text.strip() + except Exception as e: + logger.error(f"Error with google-genai lib: {e}") + if not HAS_OLD_GENAI: + raise e + # Fallthrough to Option B + + # Option B: Old Library (google-generativeai) + if HAS_OLD_GENAI: + try: + old_genai.configure(api_key=api_key) + generation_config = { + "temperature": temperature, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 8192, + } + if json_mode: + generation_config["response_mime_type"] = "application/json" + + model = old_genai.GenerativeModel( + model_name=model_name, + generation_config=generation_config, + system_instruction=system_instruction + ) + response = model.generate_content(prompt) + return response.text.strip() + except Exception as e: + logger.error(f"Error with google-generativeai lib: {e}") + raise e + + raise ImportError("No Google GenAI library installed (neither google-genai nor google-generativeai).") diff --git a/company-explorer/backend/lib/logging_setup.py b/company-explorer/backend/lib/logging_setup.py new file mode 100644 index 00000000..4b1eaef3 --- /dev/null +++ b/company-explorer/backend/lib/logging_setup.py @@ -0,0 +1,39 @@ +import logging +import sys +import os +from logging.handlers import RotatingFileHandler +from ..config import settings + +def setup_logging(): + log_file = os.path.join(settings.LOG_DIR, "company_explorer_debug.log") + + # Create Formatter + formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + + # File Handler + try: + file_handler = RotatingFileHandler(log_file, maxBytes=10*1024*1024, backupCount=5) + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.DEBUG) + except Exception as e: + print(f"FATAL: Could not create log file at {log_file}: {e}") + return + + # Console Handler + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(formatter) + console_handler.setLevel(logging.INFO) # Keep console clean + + # Root Logger Config + root_logger = logging.getLogger() + root_logger.setLevel(logging.DEBUG) # Catch ALL + root_logger.addHandler(file_handler) + root_logger.addHandler(console_handler) + + # Silence noisy libs partially + logging.getLogger("uvicorn.access").setLevel(logging.INFO) + logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) # Set to DEBUG to see SQL queries! + + logging.info(f"Logging initialized. Writing to {log_file}") \ No newline at end of file diff --git a/company-explorer/backend/repositories/mock.py b/company-explorer/backend/repositories/mock.py new file mode 100644 index 00000000..23c46a77 --- /dev/null +++ b/company-explorer/backend/repositories/mock.py @@ -0,0 +1,42 @@ +import logging +import uuid +from typing import Optional +from ..interfaces import CRMRepository, LeadData, TaskData + +logger = logging.getLogger(__name__) + +class MockRepository(CRMRepository): + """ + Simulates a CRM. Use this for local dev or tests. + Stores data in memory (lost on restart). + """ + def __init__(self): + self._store = {} + + def get_name(self) -> str: + return "Local Mock CRM" + + def find_company(self, name: str, email: str = None) -> Optional[str]: + # Simple Exact Match Simulation + for lead_id, lead in self._store.items(): + if lead.name.lower() == name.lower(): + logger.info(f"[MockCRM] Found existing company '{name}' with ID {lead_id}") + return lead_id + return None + + def create_lead(self, lead: LeadData) -> str: + new_id = f"MOCK_{uuid.uuid4().hex[:8]}" + self._store[new_id] = lead + logger.info(f"[MockCRM] Created company '{lead.name}' (ID: {new_id}). Total records: {len(self._store)}") + return new_id + + def update_lead(self, external_id: str, lead: LeadData) -> bool: + if external_id in self._store: + self._store[external_id] = lead + logger.info(f"[MockCRM] Updated company {external_id} with robotics score: {lead.robotics_potential_score}") + return True + return False + + def create_task(self, external_id: str, task: TaskData) -> bool: + logger.info(f"[MockCRM] 🔔 TASK CREATED for {external_id}: '{task.subject}'") + return True diff --git a/company-explorer/backend/repositories/superoffice.py b/company-explorer/backend/repositories/superoffice.py new file mode 100644 index 00000000..64ce332b --- /dev/null +++ b/company-explorer/backend/repositories/superoffice.py @@ -0,0 +1,40 @@ +import logging +import requests +from typing import Optional +from ..interfaces import CRMRepository, LeadData, TaskData +from ..config import settings + +logger = logging.getLogger(__name__) + +class SuperOfficeRepository(CRMRepository): + def __init__(self, tenant_id: str, api_token: str): + self.base_url = f"https://{tenant_id}.superoffice.com/api/v1" + self.headers = { + "Authorization": f"Bearer {api_token}", + "Accept": "application/json" + } + + def get_name(self) -> str: + return "SuperOffice" + + def find_company(self, name: str, email: str = None) -> Optional[str]: + # TODO: Implement actual OData query + # Example: GET /Contact?$filter=Name eq '{name}' + logger.info(f"[SuperOffice] Searching for '{name}'...") + return None + + def create_lead(self, lead: LeadData) -> str: + logger.info(f"[SuperOffice] Creating Lead: {lead.name}") + # TODO: POST /Contact + # Payload mapping: lead.industry -> SuperOffice BusinessId + return "SO_DUMMY_ID_123" + + def update_lead(self, external_id: str, lead: LeadData) -> bool: + logger.info(f"[SuperOffice] Updating Lead {external_id} with Score {lead.robotics_potential_score}") + # TODO: PUT /Contact/{id} + # Wir schreiben das Robotics-Potential z.B. in ein benutzerdefiniertes Feld (UserDefinedField) + return True + + def create_task(self, external_id: str, task: TaskData) -> bool: + logger.info(f"[SuperOffice] Creating Task for {external_id}: {task.subject}") + return True diff --git a/company-explorer/backend/scripts/import_legacy.py b/company-explorer/backend/scripts/import_legacy.py new file mode 100644 index 00000000..99d33d0f --- /dev/null +++ b/company-explorer/backend/scripts/import_legacy.py @@ -0,0 +1,91 @@ +import sys +import os +import logging +from sqlalchemy.orm import Session + +# Add paths to access legacy and new modules +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../"))) # Root for legacy +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))) # Company Explorer Root + +# Legacy Import +try: + from _legacy_gsheets_system.google_sheet_handler import GoogleSheetHandler + from _legacy_gsheets_system.config import Config as LegacyConfig +except ImportError as e: + print(f"Failed to import legacy modules: {e}") + sys.exit(1) + +# New DB +from backend.database import SessionLocal, Company, init_db + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("LegacyImporter") + +def migrate(): + logger.info("Starting migration from Google Sheets...") + + # 1. Connect to GSheets + LegacyConfig.load_api_keys() # Ensure keys are loaded + try: + handler = GoogleSheetHandler() + df = handler.get_sheet_as_dataframe("CRM_Accounts") # Assuming standard sheet name + except Exception as e: + logger.error(f"GSheet Connection failed: {e}") + return + + if df is None or df.empty: + logger.warning("No data found in sheet.") + return + + logger.info(f"Found {len(df)} rows. Transforming...") + + # 2. Connect to New DB + init_db() # Ensure tables exist + db = SessionLocal() + + count = 0 + skipped = 0 + + try: + for _, row in df.iterrows(): + name = str(row.get('CRM Name', '')).strip() + if not name or name.lower() in ['nan', 'none', '']: + continue + + # Check duplicate (simple check by name for migration) + exists = db.query(Company).filter(Company.name == name).first() + if exists: + skipped += 1 + continue + + # Create Company + comp = Company( + name=name, + website=str(row.get('CRM Website', '')).strip() or None, + crm_id=str(row.get('CRM ID', '')).strip() or None, + city=str(row.get('CRM Ort', '')).strip() or None, + country=str(row.get('CRM Land', 'DE')).strip(), + status="IMPORTED" # Mark as imported so we know to enrich them + ) + + # Map old industry if useful, otherwise leave blank for re-classification + # comp.industry_ai = str(row.get('Chat Vorschlag Branche', '')) + + db.add(comp) + count += 1 + + if count % 100 == 0: + logger.info(f"Committed {count}...") + db.commit() + + db.commit() + logger.info(f"Migration finished. Imported: {count}, Skipped: {skipped}") + + except Exception as e: + logger.error(f"Migration error: {e}") + db.rollback() + finally: + db.close() + +if __name__ == "__main__": + migrate() diff --git a/company-explorer/backend/services/classification.py b/company-explorer/backend/services/classification.py new file mode 100644 index 00000000..911deb4b --- /dev/null +++ b/company-explorer/backend/services/classification.py @@ -0,0 +1,77 @@ +import json +import logging +import os +from typing import Dict, Any, List +from ..lib.core_utils import call_gemini +from ..config import settings + +logger = logging.getLogger(__name__) + +ALLOWED_INDUSTRIES_FILE = os.path.join(os.path.dirname(__file__), "../data/allowed_industries.json") + +class ClassificationService: + def __init__(self): + self.allowed_industries = self._load_allowed_industries() + + def _load_allowed_industries(self) -> List[str]: + try: + with open(ALLOWED_INDUSTRIES_FILE, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + logger.error(f"Failed to load allowed industries: {e}") + return ["Sonstige"] + + def analyze_robotics_potential(self, company_name: str, website_text: str) -> Dict[str, Any]: + """ + Analyzes the company for robotics potential based on website content. + Returns strict JSON. + """ + if not website_text or len(website_text) < 100: + return {"error": "Insufficient text content"} + + prompt = f""" + You are a Senior B2B Market Analyst for 'Roboplanet', a robotics distributor. + Your job is to analyze a target company based on their website text and determine their potential for using robots. + + --- TARGET COMPANY --- + Name: {company_name} + Website Content (Excerpt): + {website_text[:15000]} + + --- ALLOWED INDUSTRIES (STRICT) --- + You MUST assign the company to exactly ONE of these industries. If unsure, choose the closest match or "Sonstige". + {json.dumps(self.allowed_industries, ensure_ascii=False)} + + --- ANALYSIS TASKS --- + 1. **Industry Classification:** Pick one from the list. + 2. **Robotics Potential Scoring (0-100):** + - **Cleaning:** Does the company manage large floors, hospitals, hotels, or public spaces? (Keywords: Hygiene, Cleaning, SPA, Facility Management) + - **Transport/Logistics:** Do they move goods internally? (Keywords: Warehouse, Intralogistics, Production line, Hospital logistics) + - **Security:** Do they have large perimeters or night patrols? (Keywords: Werkschutz, Security, Monitoring) + - **Service:** Do they interact with guests/patients? (Keywords: Reception, Restaurant, Nursing) + + 3. **Explanation:** A short, strategic reason for the scoring (German). + + --- OUTPUT FORMAT (JSON ONLY) --- + {{ + "industry": "String (from list)", + "summary": "Short business summary (German)", + "potentials": {{ + "cleaning": {{ "score": 0-100, "reason": "..." }}, + "transport": {{ "score": 0-100, "reason": "..." }}, + "security": {{ "score": 0-100, "reason": "..." }}, + "service": {{ "score": 0-100, "reason": "..." }} + }} + }} + """ + + try: + response_text = call_gemini( + prompt=prompt, + json_mode=True, + temperature=0.2 # Low temp for consistency + ) + return json.loads(response_text) + except Exception as e: + logger.error(f"Classification failed: {e}") + return {"error": str(e)} diff --git a/company-explorer/backend/services/deduplication.py b/company-explorer/backend/services/deduplication.py new file mode 100644 index 00000000..c8d279d5 --- /dev/null +++ b/company-explorer/backend/services/deduplication.py @@ -0,0 +1,209 @@ +import logging +import re +from collections import Counter +from typing import List, Tuple, Dict, Any, Optional +from sqlalchemy.orm import Session +from sqlalchemy import select + +# External libs (must be in requirements.txt) +from thefuzz import fuzz +from ..database import Company +from ..lib.core_utils import clean_text, normalize_string + +logger = logging.getLogger(__name__) + +# --- Configuration (Ported from Legacy) --- +SCORE_THRESHOLD = 80 +SCORE_THRESHOLD_WEAK = 95 +MIN_NAME_FOR_DOMAIN = 70 +CITY_MISMATCH_PENALTY = 30 +COUNTRY_MISMATCH_PENALTY = 40 + +STOP_TOKENS_BASE = { + 'gmbh','mbh','ag','kg','ug','ohg','se','co','kgaa','inc','llc','ltd','sarl', + 'holding','gruppe','group','international','solutions','solution','service','services', + 'deutschland','austria','germany','technik','technology','technologies','systems','systeme', + 'logistik','logistics','industries','industrie','management','consulting','vertrieb','handel', + 'international','company','gesellschaft','mbh&co','mbhco','werke','werk' +} + +# ============================================================================== +# Helpers +# ============================================================================== + +def _tokenize(s: str) -> List[str]: + if not s: return [] + return re.split(r"[^a-z0-9]+", str(s).lower()) + +def split_tokens(name: str) -> List[str]: + if not name: return [] + tokens = [t for t in _tokenize(name) if len(t) >= 3] + return [t for t in tokens if t not in STOP_TOKENS_BASE] + +def clean_name_for_scoring(norm_name: str) -> Tuple[str, set]: + toks = split_tokens(norm_name) + return " ".join(toks), set(toks) + +# ============================================================================== +# Core Deduplication Logic +# ============================================================================== + +class Deduplicator: + def __init__(self, db: Session): + self.db = db + self.reference_data = [] # Cache for DB records + self.domain_index = {} + self.token_freq = Counter() + self.token_index = {} + self._load_reference_data() + + def _load_reference_data(self): + """ + Loads minimal dataset from DB into RAM for fast fuzzy matching. + Optimized for 10k-50k records. + """ + logger.info("Loading reference data for deduplication...") + query = self.db.query(Company.id, Company.name, Company.website, Company.city, Company.country) + companies = query.all() + + for c in companies: + norm_name = normalize_string(c.name) + norm_domain = normalize_string(c.website) # Simplified, should extract domain + + record = { + 'id': c.id, + 'name': c.name, + 'normalized_name': norm_name, + 'normalized_domain': norm_domain, + 'city': normalize_string(c.city), + 'country': normalize_string(c.country) + } + self.reference_data.append(record) + + # Build Indexes + if norm_domain: + self.domain_index.setdefault(norm_domain, []).append(record) + + # Token Frequency + _, toks = clean_name_for_scoring(norm_name) + for t in toks: + self.token_freq[t] += 1 + self.token_index.setdefault(t, []).append(record) + + logger.info(f"Loaded {len(self.reference_data)} records for deduplication.") + + def _choose_rarest_token(self, norm_name: str) -> Optional[str]: + _, toks = clean_name_for_scoring(norm_name) + if not toks: return None + # Sort by frequency (asc) then length (desc) + lst = sorted(list(toks), key=lambda x: (self.token_freq.get(x, 10**9), -len(x))) + return lst[0] if lst else None + + def find_duplicates(self, candidate: Dict[str, Any]) -> List[Dict[str, Any]]: + """ + Checks a single candidate against the loaded index. + Returns list of matches with score >= Threshold. + """ + # Prepare Candidate + c_norm_name = normalize_string(candidate.get('name', '')) + c_norm_domain = normalize_string(candidate.get('website', '')) + c_city = normalize_string(candidate.get('city', '')) + c_country = normalize_string(candidate.get('country', '')) + + candidates_to_check = {} # Map ID -> Record + + # 1. Domain Match (Fastest) + if c_norm_domain and c_norm_domain in self.domain_index: + for r in self.domain_index[c_norm_domain]: + candidates_to_check[r['id']] = r + + # 2. Rarest Token Match (Blocking) + rtok = self._choose_rarest_token(c_norm_name) + if rtok and rtok in self.token_index: + for r in self.token_index[rtok]: + candidates_to_check[r['id']] = r + + if not candidates_to_check: + return [] + + # 3. Scoring + matches = [] + for db_rec in candidates_to_check.values(): + score, details = self._calculate_similarity( + cand={'n': c_norm_name, 'd': c_norm_domain, 'c': c_city, 'ct': c_country}, + ref=db_rec + ) + + # Threshold Logic (Weak vs Strong) + is_weak = (details['domain_match'] == 0 and not (details['loc_match'])) + threshold = SCORE_THRESHOLD_WEAK if is_weak else SCORE_THRESHOLD + + if score >= threshold: + matches.append({ + 'company_id': db_rec['id'], + 'name': db_rec['name'], + 'score': score, + 'details': details + }) + + matches.sort(key=lambda x: x['score'], reverse=True) + return matches + + def _calculate_similarity(self, cand, ref): + # Data Prep + n1, n2 = cand['n'], ref['normalized_name'] + + # Exact Name Shortcut + if n1 and n1 == n2: + return 100, {'exact': True, 'domain_match': 0, 'loc_match': 0} + + # Domain + d1, d2 = cand['d'], ref['normalized_domain'] + domain_match = 1 if (d1 and d2 and d1 == d2) else 0 + + # Location + city_match = 1 if (cand['c'] and ref['city'] and cand['c'] == ref['city']) else 0 + country_match = 1 if (cand['ct'] and ref['country'] and cand['ct'] == ref['country']) else 0 + loc_match = city_match and country_match + + # Name Fuzzy Score + clean1, _ = clean_name_for_scoring(n1) + clean2, _ = clean_name_for_scoring(n2) + + if clean1 and clean2: + ts = fuzz.token_set_ratio(clean1, clean2) + pr = fuzz.partial_ratio(clean1, clean2) + ss = fuzz.token_sort_ratio(clean1, clean2) + name_score = max(ts, pr, ss) + else: + name_score = 0 + + # Penalties + penalties = 0 + if cand['ct'] and ref['country'] and not country_match: + penalties += COUNTRY_MISMATCH_PENALTY + if cand['c'] and ref['city'] and not city_match: + penalties += CITY_MISMATCH_PENALTY + + # Final Calc + # Base weights: Domain is king (100), Name is mandatory (unless domain match) + total = 0 + if domain_match: + total = 100 + else: + total = name_score + + if loc_match: + total += 10 # Bonus + + total -= penalties + + # Capping + total = min(100, max(0, total)) + + return total, { + 'name_score': name_score, + 'domain_match': domain_match, + 'loc_match': loc_match, + 'penalties': penalties + } diff --git a/company-explorer/backend/services/discovery.py b/company-explorer/backend/services/discovery.py new file mode 100644 index 00000000..663fff97 --- /dev/null +++ b/company-explorer/backend/services/discovery.py @@ -0,0 +1,126 @@ +import logging +import requests +import re +from typing import Optional, Dict, Tuple +from urllib.parse import urlparse +from ..config import settings +from ..lib.core_utils import retry_on_failure, normalize_string + +logger = logging.getLogger(__name__) + +# Domains to ignore when looking for official company homepage +BLACKLIST_DOMAINS = { + "linkedin.com", "xing.com", "facebook.com", "instagram.com", "twitter.com", + "northdata.de", "northdata.com", "firmenwissen.de", "creditreform.de", + "dnb.com", "kompass.com", "wer-zu-wem.de", "kununu.com", "glassdoor.com", + "stepstone.de", "indeed.com", "monster.de", "youtube.com", "wikipedia.org" +} + +class DiscoveryService: + def __init__(self): + self.api_key = settings.SERP_API_KEY + if not self.api_key: + logger.warning("SERP_API_KEY not set. Discovery features will fail.") + + @retry_on_failure(max_retries=2) + def find_company_website(self, company_name: str, city: Optional[str] = None) -> str: + """ + Uses Google Search via SerpAPI to find the most likely official homepage. + Returns "k.A." if nothing credible is found. + """ + if not self.api_key: + return "k.A." + + query = f"{company_name} offizielle Website" + if city: + query += f" {city}" + + logger.info(f"Searching website for: {query}") + + try: + params = { + "engine": "google", + "q": query, + "api_key": self.api_key, + "num": 5, + "gl": "de", + "hl": "de" + } + response = requests.get("https://serpapi.com/search", params=params, timeout=15) + response.raise_for_status() + data = response.json() + + if "organic_results" not in data: + return "k.A." + + for result in data["organic_results"]: + link = result.get("link", "") + if self._is_credible_url(link): + # Simple heuristic: If the company name is part of the domain, high confidence + # Otherwise, take the first credible result. + return link + + return "k.A." + + except Exception as e: + logger.error(f"SerpAPI Error: {e}") + return "k.A." + + @retry_on_failure(max_retries=2) + def find_wikipedia_url(self, company_name: str) -> str: + """ + Searches for a specific German Wikipedia article. + """ + if not self.api_key: + return "k.A." + + query = f"{company_name} Wikipedia" + + try: + params = { + "engine": "google", + "q": query, + "api_key": self.api_key, + "num": 3, + "gl": "de", + "hl": "de" + } + response = requests.get("https://serpapi.com/search", params=params, timeout=15) + response.raise_for_status() + data = response.json() + + for result in data.get("organic_results", []): + link = result.get("link", "") + if "de.wikipedia.org/wiki/" in link: + # Basic validation: Is the title roughly the company? + title = result.get("title", "").replace(" – Wikipedia", "") + if self._check_name_similarity(company_name, title): + return link + + return "k.A." + + except Exception as e: + logger.error(f"Wiki Search Error: {e}") + return "k.A." + + def _is_credible_url(self, url: str) -> bool: + """Filters out social media, directories, and junk.""" + if not url: return False + try: + domain = urlparse(url).netloc.lower().replace("www.", "") + if domain in BLACKLIST_DOMAINS: + return False + # Check for subdomains of blacklist (e.g. de.linkedin.com) + for bad in BLACKLIST_DOMAINS: + if domain.endswith("." + bad): + return False + return True + except: + return False + + def _check_name_similarity(self, name1: str, name2: str) -> bool: + """Simple fuzzy check for validation.""" + n1 = normalize_string(name1) + n2 = normalize_string(name2) + # Very permissive: if one is contained in the other + return n1 in n2 or n2 in n1 diff --git a/company-explorer/backend/services/scraping.py b/company-explorer/backend/services/scraping.py new file mode 100644 index 00000000..470b07a1 --- /dev/null +++ b/company-explorer/backend/services/scraping.py @@ -0,0 +1,82 @@ +import logging +import requests +import random +import re +from bs4 import BeautifulSoup +from typing import Optional, Dict +from ..lib.core_utils import clean_text, retry_on_failure + +logger = logging.getLogger(__name__) + +USER_AGENTS = [ + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' +] + +class ScraperService: + def __init__(self, timeout: int = 15): + self.timeout = timeout + + @retry_on_failure(max_retries=2) + def scrape_url(self, url: str) -> Dict[str, str]: + """ + Fetches a URL and returns cleaned text content + meta info. + """ + if not url.startswith("http"): + url = "https://" + url + + try: + headers = {'User-Agent': random.choice(USER_AGENTS)} + # verify=False is risky but often needed for poorly configured corporate sites + response = requests.get(url, headers=headers, timeout=self.timeout, verify=False) + response.raise_for_status() + + # Check Content Type + content_type = response.headers.get('Content-Type', '').lower() + if 'text/html' not in content_type: + logger.warning(f"Skipping non-HTML content for {url}: {content_type}") + return {"error": "Not HTML"} + + return self._parse_html(response.content) + + except requests.exceptions.SSLError: + # Retry with HTTP if HTTPS fails + if url.startswith("https://"): + logger.info(f"SSL failed for {url}, retrying with http://...") + return self.scrape_url(url.replace("https://", "http://")) + raise + except Exception as e: + logger.error(f"Scraping failed for {url}: {e}") + return {"error": str(e)} + + def _parse_html(self, html_content: bytes) -> Dict[str, str]: + soup = BeautifulSoup(html_content, 'html.parser') + + # 1. Cleanup Junk + for element in soup(['script', 'style', 'noscript', 'iframe', 'svg', 'header', 'footer', 'nav', 'aside', 'form', 'button']): + element.decompose() + + # 2. Extract Title & Meta Description + title = soup.title.string if soup.title else "" + meta_desc = "" + meta_tag = soup.find('meta', attrs={'name': 'description'}) + if meta_tag: + meta_desc = meta_tag.get('content', '') + + # 3. Extract Main Text + # Prefer body, fallback to full soup + body = soup.find('body') + raw_text = body.get_text(separator=' ', strip=True) if body else soup.get_text(separator=' ', strip=True) + + cleaned_text = clean_text(raw_text) + + # 4. Extract Emails (Basic Regex) + emails = set(re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', raw_text)) + + return { + "title": clean_text(title), + "description": clean_text(meta_desc), + "text": cleaned_text[:25000], # Limit to avoid context overflow + "emails": list(emails)[:5] # Limit to 5 + } diff --git a/company-explorer/backend/services/sync.py b/company-explorer/backend/services/sync.py new file mode 100644 index 00000000..0929f790 --- /dev/null +++ b/company-explorer/backend/services/sync.py @@ -0,0 +1,103 @@ +import os +import logging +from sqlalchemy.orm import Session +from ..database import Company +from ..interfaces import LeadData, TaskData, CRMRepository +from ..repositories.mock import MockRepository +from ..repositories.superoffice import SuperOfficeRepository +from ..config import settings + +logger = logging.getLogger(__name__) + +class CRMFactory: + _instance: CRMRepository = None + + @classmethod + def get_repository(cls) -> CRMRepository: + if cls._instance: + return cls._instance + + crm_type = os.getenv("CRM_TYPE", "MOCK").upper() + + if crm_type == "SUPEROFFICE": + # Load credentials securely from settings/env + tenant = os.getenv("SO_TENANT_ID", "") + token = os.getenv("SO_API_TOKEN", "") + logger.info("Initializing SuperOffice Repository...") + cls._instance = SuperOfficeRepository(tenant, token) + else: + logger.info("Initializing Mock Repository (Default)...") + cls._instance = MockRepository() + + return cls._instance + +class SyncService: + def __init__(self, db: Session): + self.db = db + self.repo = CRMFactory.get_repository() + + def sync_company(self, company_id: int) -> dict: + """ + Pushes a local company to the external CRM. + """ + local_company = self.db.query(Company).filter(Company.id == company_id).first() + if not local_company: + return {"error": "Company not found"} + + # 1. Map Data + # Extract highest robotics potential score + max_score = 0 + reason = "" + for sig in local_company.signals: + if sig.confidence > max_score: + max_score = int(sig.confidence) + reason = f"{sig.signal_type} ({sig.value})" + + lead_data = LeadData( + name=local_company.name, + website=local_company.website, + city=local_company.city, + country=local_company.country, + industry=local_company.industry_ai, # We suggest our AI industry + robotics_potential_score=max_score, + robotics_potential_reason=reason + ) + + # 2. Check if already linked + external_id = local_company.crm_id + + # 3. Check if exists in CRM (by name) if not linked yet + if not external_id: + external_id = self.repo.find_company(local_company.name) + + action = "none" + if external_id: + # Update + success = self.repo.update_lead(external_id, lead_data) + if success: + action = "updated" + # If we found it by search, link it locally + if not local_company.crm_id: + local_company.crm_id = external_id + self.db.commit() + else: + # Create + new_id = self.repo.create_lead(lead_data) + if new_id: + action = "created" + local_company.crm_id = new_id + self.db.commit() + + # Create a task for the sales rep if high potential + if max_score > 70: + self.repo.create_task(new_id, TaskData( + subject="🔥 Hot Robotics Lead", + description=f"AI detected high potential ({max_score}%). Reason: {reason}. Please check website." + )) + + return { + "status": "success", + "action": action, + "crm": self.repo.get_name(), + "external_id": local_company.crm_id + } diff --git a/company-explorer/frontend/index.html b/company-explorer/frontend/index.html new file mode 100644 index 00000000..9f0b86ca --- /dev/null +++ b/company-explorer/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Company Explorer (Robotics) + + +

    + + + diff --git a/company-explorer/frontend/package.json b/company-explorer/frontend/package.json new file mode 100644 index 00000000..6cc75a1e --- /dev/null +++ b/company-explorer/frontend/package.json @@ -0,0 +1,31 @@ +{ + "name": "company-explorer-frontend", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@tanstack/react-table": "^8.10.7", + "axios": "^1.6.2", + "clsx": "^2.0.0", + "lucide-react": "^0.294.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwind-merge": "^2.1.0" + }, + "devDependencies": { + "@types/node": "^20.10.4", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.6", + "typescript": "^5.3.3", + "vite": "^5.0.8" + } +} diff --git a/company-explorer/frontend/postcss.config.js b/company-explorer/frontend/postcss.config.js new file mode 100644 index 00000000..2e7af2b7 --- /dev/null +++ b/company-explorer/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/company-explorer/frontend/src/App.tsx b/company-explorer/frontend/src/App.tsx new file mode 100644 index 00000000..39ac6a59 --- /dev/null +++ b/company-explorer/frontend/src/App.tsx @@ -0,0 +1,116 @@ +import { useState, useEffect } from 'react' +import axios from 'axios' +import { CompanyTable } from './components/CompanyTable' +import { ImportWizard } from './components/ImportWizard' +import { Inspector } from './components/Inspector' // NEW +import { LayoutDashboard, UploadCloud, Search, RefreshCw } from 'lucide-react' + +// Base URL detection (Production vs Dev) +const API_BASE = import.meta.env.BASE_URL === '/ce/' ? '/ce/api' : '/api'; + +interface Stats { + total: number; +} + +function App() { + const [stats, setStats] = useState({ total: 0 }) + const [refreshKey, setRefreshKey] = useState(0) + const [isImportOpen, setIsImportOpen] = useState(false) + const [selectedCompanyId, setSelectedCompanyId] = useState(null) // NEW + + const fetchStats = async () => { + try { + const res = await axios.get(`${API_BASE}/companies?limit=1`) + setStats({ total: res.data.total }) + } catch (e) { + console.error("Failed to fetch stats", e) + } + } + + useEffect(() => { + fetchStats() + }, [refreshKey]) + + const handleCompanySelect = (id: number) => { + setSelectedCompanyId(id) + } + + const handleCloseInspector = () => { + setSelectedCompanyId(null) + } + + return ( +
    + setIsImportOpen(false)} + apiBase={API_BASE} + onSuccess={() => setRefreshKey(k => k + 1)} + /> + + {/* Inspector Sidebar */} + + + {/* Header */} +
    +
    +
    +
    + +
    +
    +

    Company Explorer

    +

    ROBOTICS EDITION v0.2.2 (New DB Path)

    +
    +
    + +
    +
    + {stats.total} Companies +
    + + + + +
    +
    +
    + + {/* Main Content */} +
    +
    +
    + + +
    +
    + +
    + {/* NEW PROP */} +
    +
    +
    + ) +} + +export default App diff --git a/company-explorer/frontend/src/components/CompanyTable.tsx b/company-explorer/frontend/src/components/CompanyTable.tsx new file mode 100644 index 00000000..e98aa5a2 --- /dev/null +++ b/company-explorer/frontend/src/components/CompanyTable.tsx @@ -0,0 +1,205 @@ +import { useState, useEffect, useMemo } from 'react' +import { + useReactTable, + getCoreRowModel, + flexRender, + createColumnHelper, +} from '@tanstack/react-table' +import axios from 'axios' +import { Play, Globe, AlertCircle, Search as SearchIcon, Loader2 } from 'lucide-react' +import clsx from 'clsx' + +type Company = { + id: number + name: string + city: string | null + country: string + website: string | null + status: string + industry_ai: string | null +} + +const columnHelper = createColumnHelper() + +interface CompanyTableProps { + apiBase: string + onRowClick: (companyId: number) => void // NEW PROP +} + +export function CompanyTable({ apiBase, onRowClick }: CompanyTableProps) { + const [data, setData] = useState([]) + const [loading, setLoading] = useState(true) + const [processingId, setProcessingId] = useState(null) + + const fetchData = async () => { + setLoading(true) + try { + const res = await axios.get(`${apiBase}/companies?limit=100`) + setData(res.data.items) + } catch (e) { + console.error(e) + } finally { + setLoading(false) + } + } + + useEffect(() => { + fetchData() + }, []) + + const triggerDiscovery = async (id: number) => { + setProcessingId(id) + try { + await axios.post(`${apiBase}/enrich/discover`, { company_id: id }) + // Optimistic update or wait for refresh? Let's refresh shortly after to see results + setTimeout(fetchData, 2000) + } catch (e) { + alert("Discovery Error") + setProcessingId(null) + } + } + + const triggerAnalysis = async (id: number) => { + setProcessingId(id) + try { + await axios.post(`${apiBase}/enrich/analyze`, { company_id: id }) + setTimeout(fetchData, 2000) + } catch (e) { + alert("Analysis Error") + setProcessingId(null) + } + } + + const columns = useMemo(() => [ + columnHelper.accessor('name', { + header: 'Company', + cell: info => {info.getValue()}, + }), + columnHelper.accessor('city', { + header: 'Location', + cell: info => ( +
    + {info.getValue() || '-'} ({info.row.original.country}) +
    + ), + }), + columnHelper.accessor('website', { + header: 'Website', + cell: info => { + const url = info.getValue() + if (url && url !== "k.A.") { + return ( +
    + {new URL(url).hostname.replace('www.', '')} + + ) + } + return Not found + }, + }), + columnHelper.accessor('status', { + header: 'Status', + cell: info => { + const s = info.getValue() + return ( + + {s} + + ) + } + }), + columnHelper.display({ + id: 'actions', + header: '', + cell: info => { + const c = info.row.original + const isProcessing = processingId === c.id + + if (isProcessing) { + return + } + + // Action Logic + if (c.status === 'NEW' || !c.website || c.website === "k.A.") { + return ( + + ) + } + + // Ready for Analysis + return ( + + ) + } + }) + ], [processingId]) + + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + }) + + if (loading && data.length === 0) return
    Loading companies...
    + + if (data.length === 0) return ( +
    +
    + +
    +

    No companies found

    +

    Import a list to get started.

    +
    + ) + + return ( +
    + + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map(header => ( + + ))} + + ))} + + + {table.getRowModel().rows.map(row => ( + // Make row clickable + onRowClick(row.original.id)} // NEW: Row Click Handler + className="hover:bg-slate-800/30 transition-colors cursor-pointer" + > + {row.getVisibleCells().map(cell => ( + + ))} + + ))} + +
    + {flexRender(header.column.columnDef.header, header.getContext())} +
    + {flexRender(cell.column.columnDef.cell, cell.getContext())} +
    +
    + ) +} diff --git a/company-explorer/frontend/src/components/ImportWizard.tsx b/company-explorer/frontend/src/components/ImportWizard.tsx new file mode 100644 index 00000000..2a804b2a --- /dev/null +++ b/company-explorer/frontend/src/components/ImportWizard.tsx @@ -0,0 +1,85 @@ +import { useState } from 'react' +import axios from 'axios' +import { X, UploadCloud } from 'lucide-react' + +interface ImportWizardProps { + isOpen: boolean + onClose: () => void + onSuccess: () => void + apiBase: string +} + +export function ImportWizard({ isOpen, onClose, onSuccess, apiBase }: ImportWizardProps) { + const [text, setText] = useState("") + const [loading, setLoading] = useState(false) + + if (!isOpen) return null + + const handleImport = async () => { + const lines = text.split('\n').map(l => l.trim()).filter(l => l.length > 0) + if (lines.length === 0) return + + setLoading(true) + try { + await axios.post(`${apiBase}/companies/bulk`, { names: lines }) + setText("") + onSuccess() + onClose() + } catch (e: any) { + console.error(e) + const msg = e.response?.data?.detail || e.message || "Unknown Error" + alert(`Import failed: ${msg}`) + } finally { + setLoading(false) + } + } + + return ( +
    +
    + + {/* Header */} +
    +

    + + Quick Import +

    + +
    + + {/* Body */} +
    +

    + Paste company names below (one per line). Duplicates in the database will be skipped automatically. +

    +