From 0efb79b294ce3b75124480b69af860271084428e Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Mon, 16 Mar 2026 21:44:48 +0100 Subject: [PATCH] feat: add PEJ external contacts import script 8 contacts: PEJ leadership (Maj, Woszczyk, Skolimowski), supplier dept, Bechtel (Holda), PAA (Glowacki), Ministry (Wrochna), Choczewo info point. Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/import_pej_contacts.py | 172 +++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 scripts/import_pej_contacts.py diff --git a/scripts/import_pej_contacts.py b/scripts/import_pej_contacts.py new file mode 100644 index 0000000..d7361b9 --- /dev/null +++ b/scripts/import_pej_contacts.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +"""Import PEJ-related external contacts to NordaBiz.""" + +import os +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from database import ExternalContact + +DATABASE_URL = os.environ.get('DATABASE_URL', 'postgresql://nordabiz_app:dev_password@localhost:5433/nordabiz') + +CONTACTS = [ + # PEJ — kluczowe osoby + { + 'first_name': 'Grzegorz', 'last_name': 'Maj', + 'position': 'Pełnomocnik Zarządu ds. Wsparcia Rozwoju Rynku (Local Content)', + 'organization_name': 'Polskie Elektrownie Jądrowe Sp. z o.o.', + 'organization_type': 'company', + 'organization_address': 'Al. Jerozolimskie 132/136, 02-305 Warszawa', + 'organization_website': 'https://pej.pl', + 'linkedin_url': 'https://www.linkedin.com/in/grzegorz-maj-80145574/', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PEJ, local content, dostawcy, atom, elektrownia jądrowa', + 'notes': 'Kluczowy kontakt Izby ws. local content. Spotkanie z Zarządem Izby w marcu 2026.', + }, + { + 'first_name': 'Marek', 'last_name': 'Woszczyk', + 'position': 'Prezes Zarządu PEJ', + 'organization_name': 'Polskie Elektrownie Jądrowe Sp. z o.o.', + 'organization_type': 'company', + 'organization_address': 'Al. Jerozolimskie 132/136, 02-305 Warszawa', + 'organization_website': 'https://pej.pl', + 'linkedin_url': 'https://www.linkedin.com/in/marek-woszczyk-emba-1670a969/', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PEJ, zarząd, prezes, atom, elektrownia jądrowa', + 'notes': 'Prezes PEJ od 1 lipca 2025. Były prezes URE i PGE.', + }, + { + 'first_name': 'Marcin', 'last_name': 'Skolimowski', + 'position': 'Rzecznik prasowy PEJ', + 'phone': '+48 885 661 184', + 'email': 'Marcin.Skolimowski@pej.pl', + 'organization_name': 'Polskie Elektrownie Jądrowe Sp. z o.o.', + 'organization_type': 'company', + 'organization_address': 'Al. Jerozolimskie 132/136, 02-305 Warszawa', + 'organization_website': 'https://pej.pl', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PEJ, rzecznik, media, komunikacja, atom', + }, + # PEJ — dział dostawców + { + 'first_name': 'Dział', 'last_name': 'Dostawców PEJ', + 'position': 'Rejestracja i współpraca z dostawcami', + 'phone': '+48 885 993 277', + 'email': 'dostawcy@pej.pl', + 'organization_name': 'Polskie Elektrownie Jądrowe Sp. z o.o.', + 'organization_type': 'company', + 'organization_address': 'Al. Jerozolimskie 132/136, 02-305 Warszawa', + 'organization_website': 'https://pej.pl', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PEJ, dostawcy, przetargi, zamówienia, local content', + 'notes': 'Rejestracja dostawców: wysłać nazwę firmy, NIP, branżę, DUNS, osobę kontaktową.', + 'related_links': [ + {'title': 'Platforma zakupowa PEJ', 'url': 'https://pz.pej.pl/', 'type': 'portal'}, + {'title': 'Tablica ogłoszeń dostawców', 'url': 'https://pej.pl/en/for-suppliers/notice-board/', 'type': 'portal'}, + ], + }, + # Bechtel Polska + { + 'first_name': 'Leszek', 'last_name': 'Hołda', + 'position': 'Prezes Bechtel Polska', + 'organization_name': 'Bechtel Polska Sp. z o.o.', + 'organization_type': 'company', + 'organization_website': 'https://www.bechtel.com/markets/nuclear-power/', + 'linkedin_url': 'https://www.linkedin.com/in/leszekholda/', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'Bechtel, generalny wykonawca, budowa, EPC, atom', + 'notes': 'Generalny wykonawca elektrowni jądrowej. Wcześniej w PKP Energetyka.', + }, + # PAA + { + 'first_name': 'Andrzej', 'last_name': 'Głowacki', + 'position': 'Prezes Państwowej Agencji Atomistyki', + 'organization_name': 'Państwowa Agencja Atomistyki (PAA)', + 'organization_type': 'government', + 'organization_address': 'ul. Bonifraterska 17, 00-203 Warszawa', + 'organization_website': 'https://www.gov.pl/web/paa', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PAA, regulator, dozór jądrowy, pozwolenie na budowę, atom', + 'notes': 'Prezes PAA od marca 2023 (kadencja 5 lat). Odpowiada za wydanie pozwolenia na budowę EJ.', + }, + # Ministerstwo Przemysłu + { + 'first_name': 'Wojciech', 'last_name': 'Wrochna', + 'position': 'Pełnomocnik Rządu ds. Strategicznej Infrastruktury Energetycznej', + 'organization_name': 'Ministerstwo Przemysłu', + 'organization_type': 'government', + 'organization_website': 'https://www.gov.pl/web/przemysl', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'ministerstwo, pełnomocnik, infrastruktura energetyczna, atom, PEJ', + 'notes': 'Sekretarz stanu w Ministerstwie Przemysłu. Nadzoruje PEJ od strony rządowej.', + }, + # Punkt informacyjny Choczewo + { + 'first_name': 'Punkt Informacyjny', 'last_name': 'PEJ Choczewo', + 'position': 'Lokalny Punkt Informacyjny', + 'phone': '+48 785 772 726', + 'email': 'info.choczewo@pej.pl', + 'organization_name': 'Polskie Elektrownie Jądrowe Sp. z o.o.', + 'organization_type': 'company', + 'organization_address': 'ul. Pucka 4, 84-210 Choczewo', + 'organization_website': 'https://pej.pl', + 'project_name': 'Elektrownia Jądrowa Lubiatowo-Kopalino', + 'tags': 'PEJ, Choczewo, punkt informacyjny, lokalny, atom', + 'notes': 'Godziny otwarcia: Pn/Śr/Czw 9-16, Pt 9-14, Wt nieczynne.', + }, +] + + +def import_contacts(): + engine = create_engine(DATABASE_URL) + Session = sessionmaker(bind=engine) + session = Session() + + added = 0 + skipped = 0 + + for c in CONTACTS: + # Check if already exists (by name + organization) + existing = session.query(ExternalContact).filter( + ExternalContact.first_name == c['first_name'], + ExternalContact.last_name == c['last_name'], + ExternalContact.organization_name == c['organization_name'] + ).first() + + if existing: + print(f" SKIP: {c['first_name']} {c['last_name']} ({c['organization_name']}) — already exists (ID={existing.id})") + skipped += 1 + continue + + contact = ExternalContact( + first_name=c['first_name'], + last_name=c['last_name'], + position=c.get('position'), + phone=c.get('phone'), + email=c.get('email'), + linkedin_url=c.get('linkedin_url'), + organization_name=c['organization_name'], + organization_type=c.get('organization_type', 'other'), + organization_address=c.get('organization_address'), + organization_website=c.get('organization_website'), + project_name=c.get('project_name'), + tags=c.get('tags'), + notes=c.get('notes'), + related_links=c.get('related_links'), + source_type='manual', + is_active=True, + is_verified=True, + ) + session.add(contact) + print(f" ADD: {c['first_name']} {c['last_name']} @ {c['organization_name']}") + added += 1 + + session.commit() + print(f"\nDone: {added} added, {skipped} skipped") + session.close() + + +if __name__ == '__main__': + import_contacts()