/* global React */ // AZOR — shared data, mock report content, icons. // All text in PL. Realistic Polish public-tender domain. const { useState, useEffect, useRef, useMemo } = React; // ============================================================= // Mock tender database — 3 realistic Polish tenders // ============================================================= const TENDERS = { go: { id: "2026/BZP-00018472", url: "ezamowienia.gov.pl/mp-client/tenders/ocds-148610-2026-018472", title: "Budowa hali sportowej przy Szkole Podstawowej nr 14", buyer: "Gmina Miasto Płock", buyerType: "Jednostka samorządu terytorialnego", procedure: "Tryb podstawowy bez negocjacji (art. 275 pkt 1)", cpv: "45212222-8 / 45000000-7", value: "8 420 000 PLN netto (szac.)", deadline: "2026-05-14, 10:00", daysLeft: 16, submission: "Platforma e-Zamówienia", bond: "84 200 PLN (1%)", contractTerm: "18 miesięcy od podpisania umowy", decision: "STARTUJEMY", decisionScore: 82, decisionLabel: "go", summary: "Budowa hali sportowej z zapleczem szatniowym i łącznikiem do istniejącego budynku szkoły. Zakres zgodny z kompetencjami GW. Brak nietypowych warunków referencyjnych.", risks: [ { level: "low", label: "TERMIN", text: "16 dni do otwarcia ofert — wystarczająco na kalkulację i zabezpieczenie podwykonawców." }, { level: "med", label: "REFERENCJE", text: "Wymagane 2 obiekty kubaturowe ≥ 5 000 m³ z ostatnich 5 lat. Spełniasz: 4 obiekty w bazie." }, { level: "low", label: "FINANSOWANIE", text: "Dotacja Ministerstwa Sportu potwierdzona (50%), wkład własny gminy w WPF 2026." }, ], gaps: [ { label: "PROJEKT WYKONAWCZY", note: "Załącznik 7 — wymaga zalogowania na platformie" }, { label: "ZAŁ. GEOTECH", note: "Nieujawnione publicznie, wniosek o udostępnienie" }, ], }, cond: { id: "2026/S 074-225891", url: "ted.europa.eu/udl?uri=TED:NOTICE:225891-2026", title: "Rozbudowa odcinka DK-50 Sochaczew — Mszczonów, etap II", buyer: "GDDKiA Oddział w Warszawie", buyerType: "Centralny zamawiający publiczny", procedure: "Przetarg nieograniczony, prog UE", cpv: "45233140-2 / 45233220-7", value: "142 800 000 PLN netto", deadline: "2026-05-22, 11:30", daysLeft: 24, submission: "Platforma SmartPZP", bond: "2 000 000 PLN", contractTerm: "32 miesiące, FIDIC Yellow Book", decision: "WARUNKOWO", decisionScore: 58, decisionLabel: "cond", summary: "Kontrakt FIDIC Yellow z ryzykiem projektowania. Wymagane referencje na obiekty mostowe ≥ 60 m. Zmiana SWZ z 18.04 modyfikuje warunki finansowe — wymaga ponownej kalkulacji.", risks: [ { level: "high", label: "KONTRAKT", text: "FIDIC Yellow — przeniesienie ryzyka projektowego na wykonawcę. Wymaga zespołu projektowego in-house lub partnera." }, { level: "high", label: "REFERENCJE", text: "Brak w bazie: most o rozpiętości ≥ 60 m. Konieczne konsorcjum lub potencjał podmiotu trzeciego." }, { level: "med", label: "ZMIANA SWZ", text: "Modyfikacja z 18.04.2026: zaliczkowanie 5% → 0%, wpływ na cash flow ok. 7 100 000 PLN." }, { level: "med", label: "GWARANCJA", text: "Okres rękojmi 84 mies. — powyżej standardu, wpływ na koszt gwarancji bankowej." }, ], gaps: [ { label: "DOK. ŚRODOWISKOWA", note: "Decyzja DŚU — załącznik tylko po zalogowaniu" }, { label: "PROTOKÓŁ Q&A", note: "Tura 2 jeszcze nieopublikowana, termin 02.05" }, ], }, stop: { id: "2026/BZP-00021105", url: "ezamowienia.gov.pl/mp-client/tenders/ocds-148610-2026-021105", title: "Modernizacja systemu sterowania ruchem kolejowym, LCS Działdowo", buyer: "PKP Polskie Linie Kolejowe S.A.", buyerType: "Sektorowy zamawiający (transport)", procedure: "Przetarg nieograniczony sektorowy", cpv: "34942000-2 / 31600000-2", value: "67 300 000 PLN netto", deadline: "2026-05-04, 09:00", daysLeft: 6, submission: "Platforma SWZ PKP PLK", bond: "1 350 000 PLN", contractTerm: "24 miesiące", decision: "NIE STARTUJEMY", decisionScore: 23, decisionLabel: "stop", summary: "Specjalistyczne SRK ETCS L2 — poza profilem firmy. Krótki termin, wymagana certyfikacja ISA i autoryzacja producenta systemu (Alstom/Thales/Siemens). Brak realnej szansy zestawienia oferty.", risks: [ { level: "high", label: "KOMPETENCJE", text: "Wymagana autoryzacja producenta SRK + zespół z certyfikacją CSM-RA. Brak w portfolio." }, { level: "high", label: "TERMIN", text: "6 dni do otwarcia. Kalkulacja oferty SRK wymaga min. 14 dni roboczych." }, { level: "high", label: "REFERENCJE", text: "Wymagane 2 wdrożenia ETCS L2 na liniach AGC w UE. Brak w bazie i w sieci podwykonawców." }, ], gaps: [ { label: "MATRYCA WYMAGAŃ", note: "Załącznik 12 — wymaga zalogowania" }, ], }, }; // ============================================================= // 8 sekcji raportu — meta // ============================================================= const REPORT_SECTIONS = [ { num: "01", code: "META", title: "Podstawowe dane", desc: "Numer postępowania, tryb, CPV, terminy, wadium, źródła publikacji.", lines: ["Nr postępowania", "Tryb / podstawa prawna", "CPV", "Termin składania", "Wadium / zabezpieczenie"] }, { num: "02", code: "BUYER", title: "Zamawiający", desc: "Profil zamawiającego, historia postępowań, znane preferencje.", lines: ["Nazwa, NIP, REGON", "Typ jednostki", "Liczba postępowań / 12 mies.", "Średnia cena vs. szacunkowa"] }, { num: "03", code: "DOCS", title: "Dokumenty", desc: "SWZ, OPZ, projekt budowlany, STWiOR, przedmiar, formularze.", lines: ["SWZ + załączniki", "OPZ / SST", "Projekt + przedmiary", "Wzór umowy"] }, { num: "04", code: "DELTA", title: "Zmiany i Q&A", desc: "Os czasu modyfikacji SWZ, odpowiedzi na pytania, aktualna wersja.", lines: ["Modyfikacje SWZ", "Tury Q&A", "Zmiany terminów", "Diff wersji"] }, { num: "05", code: "REQ", title: "Doświadczenie", desc: "Wymagane referencje, potencjał kadrowy, zdolność finansowa.", lines: ["Referencje minimum", "Wymagana kadra", "Sytuacja finansowa", "Polisy i zabezpieczenia"] }, { num: "06", code: "SCOPE", title: "Zakres robót", desc: "Bilans rzeczowy, krytyczne pozycje przedmiarowe, podział branżowy.", lines: ["Branże i zakresy", "Krytyczne KNR-y", "Specyfika placu budowy", "Logistyka"] }, { num: "07", code: "SYS", title: "Systemy i instalacje",desc: "Sanitarne, elektryczne, słaboprądowe, BMS, instalacje specjalne.", lines: ["HVAC / sanitarne", "Elektryczne i NN", "Teletechnika / BMS", "Specjalistyczne"] }, { num: "08", code: "RISK", title: "Ryzyka", desc: "Klasyfikacja ryzyk: kontrakt, finansowanie, harmonogram, kary.", lines: ["Ryzyka kontraktowe", "Finansowe / cash flow", "Harmonogram / kary", "Środowiskowe / formalne"] }, ]; // ============================================================= // Audience cards // ============================================================= const AUDIENCES = [ { code: "GW", label: "Generalny wykonawca", desc: "Kompleksowe oceny przetargów kubaturowych i drogowych. Rozkład ryzyk kontraktowych, FIDIC vs. PZP." }, { code: "INST", label: "Instalacje", desc: "Sanitarne, elektryczne, gazowe. Branżowy bilans przedmiarowy i wymagania techniczne dla podwykonawcy." }, { code: "TT", label: "Teletechnika", desc: "Słaboprądowe, BMS, SRK, monitoring. Walidacja wymagań certyfikacyjnych i autoryzacji producenta." }, { code: "KOSZ", label: "Kosztorysy", desc: "Wstępna ocena opłacalności przed pełnym kosztorysem. Identyfikacja brakujących pozycji KNR." }, ]; // ============================================================= // Trust pillars // ============================================================= const PILLARS = [ { num: "1", title: "Aktualna wersja warunków", desc: "AZOR scala wszystkie modyfikacje SWZ, tury Q&A i sprostowania w jedną oś czasu. Pracujesz na bieżącej wersji, nie na pierwotnym SWZ z dnia ogłoszenia." }, { num: "2", title: "Fakt + źródło (evidence)", desc: "Każdy krytyczny punkt raportu zawiera odnośnik do konkretnej strony i akapitu w SWZ, OPZ lub piśmie zamawiającego. Audytowalne." }, { num: "3", title: "Decyzja przed kalkulacją", desc: "Wstępna ocena STARTUJEMY / WARUNKOWO / NIE STARTUJEMY w ciągu kilkunastu minut. Nie tracisz tygodnia kosztorysanta na przetarg, którego nie wygrasz." }, ]; // ============================================================= // Inline icons (stroke-based, 1.5px) // ============================================================= const Icon = ({ name, size = 18, className = "" }) => { const props = { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", className, }; switch (name) { case "link": return ; case "upload": return ; case "check": return ; case "alert": return ; case "x": return ; case "arrow-right": return ; case "arrow-down-right": return ; case "shield": return ; case "clock": return ; case "doc": return ; case "diff": return ; case "lock": return ; case "search": return ; case "branch": return ; case "layers": return ; case "shield-check": return ; default: return null; } }; // Status decision pill — large, prominent const DecisionBadge = ({ kind, score, size = "md" }) => { const map = { go: { label: "STARTUJEMY", cls: "go", accent: "var(--olive-600)", tint: "var(--olive-50)", ring: "var(--olive-100)" }, cond: { label: "WARUNKOWO", cls: "cond", accent: "var(--amber-600)", tint: "var(--amber-50)", ring: "var(--amber-100)" }, stop: { label: "NIE STARTUJEMY", cls: "stop", accent: "var(--crimson-600)", tint: "var(--crimson-50)", ring: "var(--crimson-100)" }, }; const m = map[kind] || map.cond; const isLg = size === "lg"; return (