nordabiz/templates/pej/index.html
Maciej Pienczyn 110d971dca
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
feat: migrate prod docs to OVH VPS + UTC→Warsaw timezone in all templates
Production moved from on-prem VM 249 (10.22.68.249) to OVH VPS
(57.128.200.27, inpi-vps-waw01). Updated ALL documentation, slash
commands, memory files, architecture docs, and deploy procedures.

Added |local_time Jinja filter (UTC→Europe/Warsaw) and converted
155 .strftime() calls across 71 templates so timestamps display
in Polish timezone regardless of server timezone.

Also includes: created_by_id tracking, abort import fix, ICS
calendar fix for missing end times, Pros Poland data cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:41:53 +02:00

451 lines
23 KiB
HTML

{% extends "base.html" %}
{% block title %}PEJ — Elektrownia Jądrowa - Norda Biznes Partner{% endblock %}
{% block extra_css %}
<style>
.pej-hero {
background: #1a365d;
color: #fff;
padding: var(--spacing-2xl) 0;
margin: calc(-1 * var(--spacing-lg)) calc(-1 * var(--spacing-lg)) var(--spacing-xl);
text-align: center;
}
.pej-hero h1 { font-size: 2rem; margin-bottom: var(--spacing-sm); }
.pej-hero p { opacity: 0.9; max-width: 600px; margin: 0 auto; font-size: var(--font-size-md); }
.pej-stats {
display: flex; justify-content: center; gap: var(--spacing-xl);
padding: var(--spacing-md) 0;
margin-bottom: var(--spacing-xl);
}
.pej-stat { text-align: center; }
.pej-stat-value { font-size: 2rem; font-weight: 700; color: #1a365d; }
.pej-stat-label { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-section { margin-bottom: var(--spacing-xl); }
.pej-section-title {
font-size: var(--font-size-lg); font-weight: 600;
margin-bottom: var(--spacing-md);
display: flex; align-items: center; gap: var(--spacing-sm);
}
.pej-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-grid { grid-template-columns: 1fr; } }
.pej-announcement {
background: #eef2f7; border: 1px solid #c3d5e8; border-radius: var(--radius);
padding: var(--spacing-md); margin-bottom: var(--spacing-sm);
}
.pej-announcement-title { font-weight: 600; margin-bottom: var(--spacing-xs); }
.pej-announcement-date { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-news-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius); padding: var(--spacing-md);
margin-bottom: var(--spacing-sm); transition: var(--transition);
}
.pej-news-card:hover { border-color: #1a365d; }
.pej-news-card h3 { font-size: var(--font-size-md); margin-bottom: var(--spacing-xs); }
.pej-news-card h3 a { color: var(--text-primary); text-decoration: none; }
.pej-news-card h3 a:hover { color: #1a365d; }
.pej-news-card .meta { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-milestone {
display: flex; gap: var(--spacing-md); padding: var(--spacing-sm) 0;
border-bottom: 1px solid var(--border);
}
.pej-milestone:last-child { border-bottom: none; }
.pej-milestone-date {
min-width: 80px; font-size: var(--font-size-sm); color: #1a365d; font-weight: 600;
}
.pej-milestone-title { font-size: var(--font-size-sm); }
.pej-milestone-status {
font-size: 0.7rem; padding: 2px 6px; border-radius: 10px;
display: inline-block; margin-left: var(--spacing-xs);
}
.pej-milestone-status.planned { background: #dbeafe; color: #1e40af; }
.pej-milestone-status.in_progress { background: #fef3c7; color: #92400e; }
.pej-milestone-status.completed { background: #d1fae5; color: #065f46; }
.pej-milestone-status.delayed { background: #fee2e2; color: #991b1b; }
.pej-company-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-md); }
@media (max-width: 768px) { .pej-company-grid { grid-template-columns: 1fr; } }
@media (min-width: 769px) and (max-width: 1024px) { .pej-company-grid { grid-template-columns: repeat(2, 1fr); } }
.pej-company-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius); padding: var(--spacing-md);
transition: var(--transition);
}
.pej-company-card:hover { border-color: #1a365d; box-shadow: 0 2px 8px rgba(26,54,93,0.1); }
.pej-company-name { font-weight: 600; margin-bottom: var(--spacing-xs); }
.pej-company-name a { color: var(--text-primary); text-decoration: none; }
.pej-company-name a:hover { color: #1a365d; }
.pej-company-meta { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-company-score {
display: inline-block; background: #eef2f7; color: #1a365d;
padding: 2px 8px; border-radius: 10px; font-size: var(--font-size-sm); font-weight: 600;
}
.pej-company-type {
display: inline-block; background: #dbeafe; color: #1e40af;
padding: 2px 8px; border-radius: 10px; font-size: 0.75rem;
}
.pej-company-desc {
font-size: var(--font-size-sm); color: var(--text-secondary);
margin-top: var(--spacing-xs);
}
.pej-cta {
text-align: center; margin-top: var(--spacing-lg);
display: flex; gap: var(--spacing-md); justify-content: center; flex-wrap: wrap;
}
.pej-btn {
display: inline-block; padding: var(--spacing-sm) var(--spacing-lg);
border-radius: var(--radius); text-decoration: none; font-weight: 500;
transition: var(--transition);
}
.pej-btn-primary { background: #1a365d; color: #fff; }
.pej-btn-primary:hover { background: #0f2440; }
.pej-btn-outline { border: 1px solid #1a365d; color: #1a365d; }
.pej-btn-outline:hover { background: #eef2f7; }
.pej-media-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-media-grid { grid-template-columns: 1fr; } }
.pej-video-card {
display: block; text-decoration: none; border-radius: var(--radius);
border: 1px solid var(--border); overflow: hidden; transition: var(--transition);
}
.pej-video-card:hover { border-color: #1a365d; box-shadow: 0 2px 8px rgba(26,54,93,0.1); }
.pej-video-thumb {
position: relative; padding-bottom: 56.25%; background: #000;
}
.pej-video-thumb img {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;
}
.pej-video-play {
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
width: 60px; height: 60px; background: rgba(26,54,93,0.85); border-radius: 50%;
display: flex; align-items: center; justify-content: center;
}
.pej-video-play::after {
content: ''; width: 0; height: 0;
border-left: 20px solid #fff; border-top: 12px solid transparent; border-bottom: 12px solid transparent;
margin-left: 4px;
}
.pej-video-title {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm); font-weight: 500; color: var(--text-primary);
}
.pej-infographic {
border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden;
background: #fff;
}
.pej-infographic img { width: 100%; height: auto; display: block; }
.pej-infographic-caption {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm); color: var(--text-secondary);
border-top: 1px solid var(--border);
}
.pej-empty { text-align: center; padding: var(--spacing-xl); color: var(--text-secondary); }
.pej-sources { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-sources { grid-template-columns: 1fr; } }
.pej-source-group { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--spacing-md); }
.pej-source-group h3 { font-size: var(--font-size-md); font-weight: 600; margin-bottom: var(--spacing-sm); color: #1a365d; }
.pej-source-item { display: flex; align-items: flex-start; gap: var(--spacing-sm); padding: var(--spacing-xs) 0; }
.pej-source-item { transition: var(--transition); border-radius: var(--radius); padding: var(--spacing-sm); margin: 0 calc(-1 * var(--spacing-sm)); }
.pej-source-item:hover { background: #eef2f7; }
.pej-source-item a { color: var(--text-primary); text-decoration: none; font-size: var(--font-size-sm); }
.pej-source-item a:hover { color: #2563eb; }
.pej-source-item a strong { color: #1a365d; }
.pej-source-item .pej-src-label { font-size: 0.75rem; color: var(--text-secondary); }
.pej-source-icon { min-width: 24px; width: 24px; height: 24px; color: #1a365d; font-size: var(--font-size-md); display: flex; align-items: center; justify-content: center; }
.pej-contact-card {
background: #eef2f7; border-radius: var(--radius); padding: var(--spacing-md);
margin-bottom: var(--spacing-sm); transition: var(--transition);
border-left: 3px solid transparent; cursor: default;
}
.pej-contact-card:hover { border-left-color: #2563eb; background: #e8eef5; }
.pej-contact-card a { color: #2563eb; text-decoration: none; font-size: var(--font-size-sm); }
.pej-contact-card a:hover { text-decoration: underline; }
.pej-contact-name { font-weight: 600; display: flex; align-items: center; gap: var(--spacing-sm); }
.pej-contact-role { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-contact-details { font-size: var(--font-size-sm); margin-top: var(--spacing-xs); }
</style>
{% endblock %}
{% block content %}
<div class="pej-hero">
<h1>Elektrownia Jądrowa — Szanse dla Naszych Firm</h1>
<p>Izba Norda Biznes aktywnie uczestniczy w projekcie PEJ. Tu znajdziesz aktualności, listę firm gotowych do współpracy i informacje o możliwościach dla członków.</p>
</div>
<div class="pej-stats">
<div class="pej-stat">
<div class="pej-stat-value">{{ companies_count }}</div>
<div class="pej-stat-label">firm gotowych</div>
</div>
<div class="pej-stat">
<div class="pej-stat-value">{{ news_count }}</div>
<div class="pej-stat-label">aktualności</div>
</div>
<div class="pej-stat">
<div class="pej-stat-value">{{ milestones_count }}</div>
<div class="pej-stat-label">kamieni milowych</div>
</div>
</div>
{% if announcements %}
<div class="pej-section">
<div class="pej-section-title">Komunikaty Izby</div>
{% for ann in announcements %}
<div class="pej-announcement">
<div class="pej-announcement-title">{{ ann.title }}</div>
<div class="pej-announcement-date">{{ ann.created_at|local_time('%d.%m.%Y') }}</div>
<p>{{ ann.content[:300] }}{% if ann.content|length > 300 %}...{% endif %}</p>
</div>
{% endfor %}
</div>
{% endif %}
<div class="pej-grid">
<div class="pej-section">
<div class="pej-section-title">Najnowsze aktualności</div>
{% if news %}
{% for item in news %}
<div class="pej-news-card">
<h3><a href="{{ item.url }}" target="_blank" rel="noopener">{{ item.title }}</a></h3>
<div class="meta">
{{ item.source_name or item.source_domain or '' }}
{% if item.published_at %} &middot; {{ item.published_at|local_time('%d.%m.%Y') }}{% endif %}
</div>
</div>
{% endfor %}
<a href="{{ url_for('pej_news') }}" class="pej-btn pej-btn-outline" style="margin-top: var(--spacing-sm); display: inline-block;">Zobacz wszystkie &rarr;</a>
{% else %}
<div class="pej-empty">Brak aktualności nuklearnych.</div>
{% endif %}
</div>
<div class="pej-section">
<div class="pej-section-title">Kamienie milowe</div>
{% if milestones %}
{% for m in milestones %}
<div class="pej-milestone">
<div class="pej-milestone-date">
{% if m.target_date %}{{ m.target_date.strftime('%m/%Y') }}{% else %}&mdash;{% endif %}
</div>
<div>
<span class="pej-milestone-title">{{ m.title }}</span>
<span class="pej-milestone-status {{ m.status }}">{{ m.status }}</span>
</div>
</div>
{% endfor %}
{% else %}
<div class="pej-empty">Brak kamieni milowych.</div>
{% endif %}
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Multimedia</div>
<div class="pej-media-grid">
<div>
<a href="https://www.youtube.com/watch?v=Ne7Nwo3sGSg" target="_blank" rel="noopener" class="pej-video-card">
<div class="pej-video-thumb">
<img src="{{ url_for('static', filename='images/pej/yt-Ne7Nwo3sGSg.jpg') }}" alt="Wirtualny spacer po elektrowni jądrowej" loading="lazy">
<div class="pej-video-play"></div>
</div>
<div class="pej-video-title">Wirtualny spacer po elektrowni jądrowej z perspektywy dozoru</div>
</a>
</div>
<div>
<a href="https://www.youtube.com/watch?v=VnNmsntBHsg" target="_blank" rel="noopener" class="pej-video-card">
<div class="pej-video-thumb">
<img src="{{ url_for('static', filename='images/pej/yt-VnNmsntBHsg.jpg') }}" alt="Elektrownia jądrowa Lubiatowo-Kopalino" loading="lazy">
<div class="pej-video-play"></div>
</div>
<div class="pej-video-title">Elektrownia jądrowa Lubiatowo-Kopalino</div>
</a>
</div>
<div>
<div class="pej-infographic">
<a href="{{ url_for('static', filename='images/pej/elementy-bloku-ej.png') }}" target="_blank" rel="noopener">
<img src="{{ url_for('static', filename='images/pej/elementy-bloku-ej.png') }}" alt="Elementy bloku elektrowni jądrowej" loading="lazy">
</a>
<div class="pej-infographic-caption">Elementy bloku elektrowni jądrowej AP1000</div>
</div>
</div>
<div>
<div class="pej-infographic">
<a href="{{ url_for('static', filename='images/pej/harmonogram-budowy.png') }}" target="_blank" rel="noopener">
<img src="{{ url_for('static', filename='images/pej/harmonogram-budowy.png') }}" alt="Harmonogram budowy elektrowni jądrowej" loading="lazy">
</a>
<div class="pej-infographic-caption">Harmonogram budowy elektrowni jądrowej (luty 2026)</div>
</div>
</div>
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Źródła i kontakty PEJ</div>
<div class="pej-sources">
<div class="pej-source-group">
<h3>Jak zostać dostawcą PEJ</h3>
<div class="pej-source-item">
<span class="pej-source-icon">&#9993;</span>
<div>
<a href="mailto:dostawcy@pej.pl"><strong>dostawcy@pej.pl</strong></a>
<div class="pej-src-label">Rejestracja dostawców — wyślij: nazwę firmy, NIP, branżę, osobę kontaktową</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128722;</span>
<div>
<a href="https://pz.pej.pl/" target="_blank" rel="noopener"><strong>pz.pej.pl</strong> — Platforma zakupowa PEJ</a>
<div class="pej-src-label">Przetargi i aukcje otwarte (43 planowane do końca 2026)</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127891;</span>
<div>
<a href="https://polskaplatformajadrowa.pl/" target="_blank" rel="noopener"><strong>Polska Platforma Jądrowa</strong></a>
<div class="pej-src-label">Newsletter, grupy tematyczne dla polskich dostawców</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128196;</span>
<div>
<a href="https://pej.pl/en/for-suppliers/notice-board/" target="_blank" rel="noopener"><strong>Notice Board</strong> — ogłoszenia Bechtel i Westinghouse</a>
<div class="pej-src-label">Aktualne zapotrzebowanie technologiczne i usługowe</div>
</div>
</div>
</div>
<div class="pej-source-group">
<h3>Osoby kontaktowe i biuro PEJ</h3>
<div class="pej-contact-card">
<div class="pej-contact-name">Grzegorz Maj</div>
<div class="pej-contact-role">Pełnomocnik Zarządu ds. Wsparcia Rozwoju Rynku (Local Content)</div>
<div class="pej-contact-details">
<a href="https://www.linkedin.com/in/grzegorz-maj-80145574/" target="_blank" rel="noopener">LinkedIn &rarr;</a>
</div>
</div>
<div class="pej-contact-card">
<div class="pej-contact-name">Marek Woszczyk</div>
<div class="pej-contact-role">Prezes Zarządu PEJ</div>
<div class="pej-contact-details">
<a href="https://www.linkedin.com/in/marek-woszczyk-emba-1670a969/" target="_blank" rel="noopener">LinkedIn &rarr;</a>
</div>
</div>
<div class="pej-contact-card">
<div class="pej-contact-name">Leszek Hołda</div>
<div class="pej-contact-role">Prezes Bechtel Polska</div>
<div class="pej-contact-details">
<a href="https://www.linkedin.com/in/leszekholda/" target="_blank" rel="noopener">LinkedIn &rarr;</a>
</div>
</div>
<div class="pej-contact-card" style="background: #e8eef5; border-left-color: #1a365d;">
<div class="pej-contact-name">Biuro PEJ</div>
<div class="pej-contact-role">Al. Jerozolimskie 132/136, 02-305 Warszawa</div>
<div class="pej-contact-details">
<a href="tel:+48223402980">+48 22 340 2980</a> &middot;
<a href="mailto:korespondencja@pej.pl">korespondencja@pej.pl</a>
</div>
</div>
</div>
<div class="pej-source-group">
<h3>Oficjalne strony projektu</h3>
<div class="pej-source-item">
<span class="pej-source-icon">&#127970;</span>
<div><a href="https://pej.pl/" target="_blank" rel="noopener"><strong>pej.pl</strong> — Polskie Elektrownie Jądrowe</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#9762;</span>
<div>
<a href="https://www.gov.pl/web/paa" target="_blank" rel="noopener"><strong>PAA</strong> — Państwowa Agencja Atomistyki</a>
<div class="pej-src-label">Regulator — proces licencyjny, pozwolenie na budowę</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127463;</span>
<div><a href="https://www.gov.pl/web/polski-atom" target="_blank" rel="noopener"><strong>Polski Atom</strong> — portal rządowy</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127468;</span>
<div><a href="https://www.westinghousenuclear.com" target="_blank" rel="noopener"><strong>Westinghouse</strong> — technologia AP1000</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127959;</span>
<div><a href="https://www.bechtel.com/markets/nuclear-power/" target="_blank" rel="noopener"><strong>Bechtel</strong> — generalny wykonawca</a></div>
</div>
</div>
<div class="pej-source-group">
<h3>Śledź PEJ w mediach</h3>
<div class="pej-source-item">
<span class="pej-source-icon">in</span>
<div><a href="https://www.linkedin.com/company/polskieelektrowniejadrowe/" target="_blank" rel="noopener"><strong>PEJ na LinkedIn</strong> (~16 tys. obserwujących)</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#120143;</span>
<div><a href="https://x.com/pej_pl" target="_blank" rel="noopener"><strong>@PEJ_PL</strong> na X</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#120143;</span>
<div><a href="https://x.com/WECNuclearPL" target="_blank" rel="noopener"><strong>@WECNuclearPL</strong> — Westinghouse Polska na X</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">f</span>
<div><a href="https://www.facebook.com/polskiatom.govpl/" target="_blank" rel="noopener"><strong>Polski Atom</strong> na Facebooku</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128240;</span>
<div>
<a href="https://nuclear.pl/" target="_blank" rel="noopener"><strong>nuclear.pl</strong></a> &middot;
<a href="https://biznesalert.pl/" target="_blank" rel="noopener"><strong>BiznesAlert</strong></a> &middot;
<a href="https://energetyka24.com/" target="_blank" rel="noopener"><strong>Energetyka24</strong></a>
<div class="pej-src-label">Portale informacyjne z sekcjami nuklearnymi</div>
</div>
</div>
</div>
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Local Content — Firmy z Izby gotowe do współpracy</div>
{% if top_companies %}
<div class="pej-company-grid">
{% for link, company in top_companies %}
<div class="pej-company-card">
<div class="pej-company-name">
<a href="{{ url_for('company_detail_by_slug', slug=company.slug) }}">{{ company.name }}</a>
</div>
<div class="pej-company-meta">
{% if company.category %}<span>{{ company.category.name }}</span>{% endif %}
<span class="pej-company-score">{{ link.relevance_score }}/100</span>
{% if link.link_type %}
<span class="pej-company-type">{{ link_type_labels.get(link.link_type, link.link_type) }}</span>
{% endif %}
</div>
{% if link.collaboration_description %}
<div class="pej-company-desc">{{ link.collaboration_description[:150] }}{% if link.collaboration_description|length > 150 %}...{% endif %}</div>
{% endif %}
</div>
{% endfor %}
</div>
<div class="pej-cta">
<a href="{{ url_for('pej_local_content') }}" class="pej-btn pej-btn-primary">Zobacz pełną listę &rarr;</a>
{% if current_user.can_access_admin_panel() %}
<a href="{{ url_for('admin.pej_export_csv') }}" class="pej-btn pej-btn-outline">Eksportuj CSV</a>
{% endif %}
</div>
{% else %}
<div class="pej-empty">Brak dopasowanych firm.</div>
{% endif %}
</div>
{% endblock %}