// legal-page.jsx — Юридичні зміни (учасники, протоколи, ЄДР) (function () { // =================================================================== // ДАНІ // =================================================================== const COMPANY_LEGAL = { fullName: "Товариство з обмеженою відповідальністю «Укрбудпроєкт»", shortName: "ТОВ «Укрбудпроєкт»", edrpou: "12345678", registeredDate: "2018-04-02", legalAddress: "м. Київ, вул. Хорива, 12, оф. 304", director: { name: "Кравченко Олена Андріївна", since: "2018-04-02", powerUntil: "2029-12-20" }, capital: 250000, capitalCurrency: "UAH", mainKved: { code: "71.11", label: "Діяльність у сфері архітектури" }, additionalKveds: [ { code: "71.12", label: "Діяльність у сфері інжинірингу" }, { code: "74.10", label: "Спеціалізована діяльність із дизайну" }, ], bankAccounts: 3, taxSystem: "Спрощена, 3 група, 5%", }; const PARTICIPANTS = [ { id: "p-ok", name: "Кравченко Олена Андріївна", initials: "ОК", share: 60, shareAmount: 150000, joinedDate: "2018-04-02", role: "founder", passport: "АА 123456", taxId: "1234567890", address: "м. Київ, вул. Лук'янівська, 21, кв. 14", }, { id: "p-ap", name: "Петренко Андрій Іванович", initials: "АП", share: 25, shareAmount: 62500, joinedDate: "2020-07-15", role: "participant", passport: "ВВ 234567", taxId: "2345678901", address: "м. Київ, пр. Перемоги, 75, кв. 88", }, { id: "p-tm", name: "Мельник Тарас Володимирович", initials: "ТМ", share: 15, shareAmount: 37500, joinedDate: "2022-09-01", role: "participant", passport: "СС 345678", taxId: "3456789012", address: "м. Київ, вул. Антоновича, 102", }, ]; const LEGAL_CHANGE_TYPES = { creation: { label: "Створення ТОВ", icon: "🌱", color: "var(--c-green-deep)" }, director_change: { label: "Зміна керівника", icon: "👔", color: "var(--c-blue)" }, director_extend: { label: "Продовження повноважень", icon: "🔄", color: "var(--c-blue)" }, participant_in: { label: "Вхід учасника", icon: "➕", color: "var(--c-green-deep)" }, participant_out: { label: "Вихід учасника", icon: "➖", color: "var(--c-red)" }, share_change: { label: "Зміна часток", icon: "⇄", color: "var(--c-blue)" }, capital_change: { label: "Зміна статутного капіталу", icon: "💰", color: "var(--c-blue)" }, address_change: { label: "Зміна юр. адреси", icon: "📍", color: "var(--c-blue)" }, kved_change: { label: "Зміна КВЕД", icon: "📋", color: "var(--c-blue)" }, statute_revision:{ label: "Нова редакція статуту", icon: "📜", color: "var(--c-blue)" }, seal_kep: { label: "Печатка / КЕП", icon: "🔐", color: "var(--ink-2)" }, }; const EDR_STATUS = { pending: { label: "У підготовці", tone: "neutral" }, submitted: { label: "Подано", tone: "warn" }, registered: { label: "Зареєстровано", tone: "live" }, rejected: { label: "Відмова", tone: "late" }, not_required:{label: "Не потребує", tone: "neutral" }, }; const LEGAL_CHANGES = [ { id: "lc1", date: "2026-05-15", type: "seal_kep", title: "Оновлення КЕП директора", summary: "Перевипуск кваліфікованого електронного підпису Кравченко О.А. — попередній закінчився 2026-05-14.", orderNumber: "14-К", edrStatus: "not_required", attachments: [ { name: "Наказ №14-К про оновлення КЕП.pdf", type: "order" }, { name: "Сертифікат КЕП (Дія).p7s", type: "cert" }, ], }, { id: "lc2", date: "2025-08-10", type: "capital_change", title: "Збільшення статутного капіталу зі 100 000 до 250 000 ₴", summary: "Додаткові внески учасників пропорційно до часток. Підстава — розширення діяльності.", protocolNumber: "7", protocolDate: "2025-08-05", orderNumber: "—", edrStatus: "registered", edrNumber: "1234567890123", edrDate: "2025-08-22", attachments: [ { name: "Протокол №7 загальних зборів.pdf", type: "protocol" }, { name: "Зміни до статуту.pdf", type: "statute" }, { name: "Опис документів до ЄДР.pdf", type: "edr" }, { name: "Витяг з ЄДР від 2025-08-22.pdf", type: "extract" }, ], }, { id: "lc3", date: "2024-12-20", type: "director_extend", title: "Продовження повноважень директора Кравченко О.А. на 5 років", summary: "Повноваження продовжено до 2029-12-20.", protocolNumber: "6", protocolDate: "2024-12-18", orderNumber: "77-К", edrStatus: "registered", edrNumber: "0987654321098", edrDate: "2025-01-10", attachments: [ { name: "Протокол №6 загальних зборів.pdf", type: "protocol" }, { name: "Наказ №77-К.pdf", type: "order" }, { name: "Витяг з ЄДР від 2025-01-10.pdf", type: "extract" }, ], }, { id: "lc4", date: "2024-03-15", type: "kved_change", title: "Додано КВЕД 71.12 «Діяльність у сфері інжинірингу»", summary: "Для покриття інжинірингових послуг при технадзорі.", protocolNumber: "5", protocolDate: "2024-03-10", edrStatus: "registered", edrNumber: "5678901234567", edrDate: "2024-03-28", attachments: [ { name: "Протокол №5.pdf", type: "protocol" }, { name: "Заява на реєстраційну дію.pdf", type: "edr" }, { name: "Витяг з ЄДР від 2024-03-28.pdf", type: "extract" }, ], }, { id: "lc5", date: "2022-09-01", type: "participant_in", title: "Вхід учасника Мельник Т.В. (частка 15%)", summary: "Внесення вкладу 15 000 ₴. Перерозподіл часток: ОК — 60%, АП — 25%, ТМ — 15%.", protocolNumber: "4", protocolDate: "2022-08-25", edrStatus: "registered", edrNumber: "3456789012345", edrDate: "2022-09-14", relatedParticipantIds: ["p-tm"], attachments: [ { name: "Протокол №4 загальних зборів.pdf", type: "protocol" }, { name: "Нова редакція статуту.pdf", type: "statute" }, { name: "Заява про вступ (Мельник Т.В.).pdf", type: "request" }, { name: "Витяг з ЄДР від 2022-09-14.pdf", type: "extract" }, ], }, { id: "lc6", date: "2022-05-10", type: "address_change", title: "Зміна юр. адреси на вул. Хорива, 12, оф. 304", summary: "Переїзд офісу з вул. Велика Васильківська, 87. Договір оренди №ОР-2022-04.", protocolNumber: "3", protocolDate: "2022-05-05", edrStatus: "registered", edrNumber: "2345678901234", edrDate: "2022-05-23", attachments: [ { name: "Протокол №3.pdf", type: "protocol" }, { name: "Зміни до статуту.pdf", type: "statute" }, { name: "Договір оренди ОР-2022-04.pdf", type: "lease" }, { name: "Витяг з ЄДР від 2022-05-23.pdf", type: "extract" }, ], }, { id: "lc7", date: "2020-07-15", type: "participant_in", title: "Вхід учасника Петренко А.І. (частка 25%)", summary: "Внесення вкладу 25 000 ₴. Зменшення частки Кравченко з 100% до 75%.", protocolNumber: "2", protocolDate: "2020-07-10", edrStatus: "registered", edrNumber: "1234567890999", edrDate: "2020-07-29", relatedParticipantIds: ["p-ap"], attachments: [ { name: "Протокол №2 загальних зборів.pdf", type: "protocol" }, { name: "Нова редакція статуту.pdf", type: "statute" }, { name: "Заява про вступ (Петренко А.І.).pdf", type: "request" }, { name: "Витяг з ЄДР від 2020-07-29.pdf", type: "extract" }, ], }, { id: "lc8", date: "2018-04-02", type: "creation", title: "Створення ТОВ «Укрбудпроєкт»", summary: "Реєстрація юридичної особи. Засновник — Кравченко О.А. (100%). Статутний капітал — 100 000 ₴.", protocolNumber: "1", protocolDate: "2018-03-28", orderNumber: "1-К", edrStatus: "registered", edrNumber: "1234567890001", edrDate: "2018-04-02", attachments: [ { name: "Протокол №1 установчих зборів.pdf", type: "protocol" }, { name: "Статут (перша редакція).pdf", type: "statute" }, { name: "Наказ №1-К про вступ на посаду.pdf", type: "order" }, { name: "Витяг з ЄДР від 2018-04-02.pdf", type: "extract" }, ], }, ]; const PROTOCOL_TEMPLATES = [ { id: "ptr-director-extend", name: "Продовження повноважень керівника", icon: "🔄", type: "director_extend", description: "Стандартний протокол загальних зборів про продовження повноважень діючого керівника на новий строк.", fields: ["Дата зборів", "Учасники присутні", "Термін повноважень (з ‒ по)"], }, { id: "ptr-director-change", name: "Зміна керівника", icon: "👔", type: "director_change", description: "Протокол про звільнення попереднього керівника і призначення нового. Готується разом з наказом про звільнення / прийняття.", fields: ["Дата зборів", "ПІБ нового керівника", "Дата вступу на посаду", "Термін повноважень"], }, { id: "ptr-participant-in", name: "Вхід нового учасника", icon: "➕", type: "participant_in", description: "Протокол про прийняття нового учасника до товариства, його внесок і перерозподіл часток.", fields: ["ПІБ учасника", "ІПН", "Сума внеску", "Розмір частки", "Перерозподіл часток"], }, { id: "ptr-participant-out", name: "Вихід учасника", icon: "➖", type: "participant_out", description: "Протокол про вихід учасника, повернення внеску і перерозподіл часток між тими, що залишилися. Потребує нотаріальної заяви.", fields: ["ПІБ учасника, що виходить", "Сума повернення", "Перерозподіл часток"], }, { id: "ptr-capital-change", name: "Зміна статутного капіталу", icon: "💰", type: "capital_change", description: "Протокол про збільшення (додаткові внески / нові учасники) або зменшення статутного капіталу.", fields: ["Старий розмір", "Новий розмір", "Джерело змін", "Розподіл по учасниках"], }, { id: "ptr-address-change", name: "Зміна юридичної адреси", icon: "📍", type: "address_change", description: "Протокол про зміну юр. адреси. Підставою для реєстрації служить договір оренди / право власності за новою адресою.", fields: ["Стара адреса", "Нова адреса", "Підстава (договір)"], }, { id: "ptr-kved-change", name: "Зміна / додавання КВЕД", icon: "📋", type: "kved_change", description: "Протокол про зміну видів економічної діяльності — додавання, виключення або зміну основного КВЕД.", fields: ["КВЕД, що додаються", "КВЕД, що виключаються", "Новий основний КВЕД"], }, { id: "ptr-statute-revision", name: "Нова редакція статуту", icon: "📜", type: "statute_revision", description: "Протокол про затвердження нової редакції статуту. Зазвичай супроводжує будь-яку структурну зміну.", fields: ["Причина перегляду", "Ключові зміни"], }, ]; window.LEGAL_DATA = { company: COMPANY_LEGAL, participants: PARTICIPANTS, changes: LEGAL_CHANGES, templates: PROTOCOL_TEMPLATES, }; window.LEGAL_CHANGE_TYPES = LEGAL_CHANGE_TYPES; window.EDR_STATUS = EDR_STATUS; // =================================================================== // СТОРІНКА // =================================================================== function LegalChangesPage({ role }) { const [openChange, setOpenChange] = React.useState(null); const [openParticipant, setOpenParticipant] = React.useState(null); const [openTemplate, setOpenTemplate] = React.useState(null); const co = COMPANY_LEGAL; const pending = LEGAL_CHANGES.filter(c => c.edrStatus === "pending" || c.edrStatus === "submitted").length; return (

Юридичні зміни

Учасники, протоколи, реєстраційні дії в ЄДР {LEGAL_CHANGES.length} {window.plural(LEGAL_CHANGES.length, "запис", "записи", "записів")} в історії {pending > 0 && <> {pending} в процесі }
{/* Шапка — компанія */}
{co.shortName}
{co.fullName}
ЄДРПОУ
{co.edrpou}
Юр. адреса
{co.legalAddress}
Директор
{co.director.name}
з {window.formatDate ? window.formatDate(co.director.since) : co.director.since} · повноваження до {window.formatDate ? window.formatDate(co.director.powerUntil) : co.director.powerUntil}
Статутний капітал
{co.capital.toLocaleString("uk-UA")} ₴
Основний КВЕД
{co.mainKved.code} {co.mainKved.label}
+ {co.additionalKveds.length} додаткових
Дата створення
{window.formatDate ? window.formatDate(co.registeredDate) : co.registeredDate}
Система оподаткування
{co.taxSystem}
{/* Учасники */}

Склад учасників

{PARTICIPANTS.length} {window.plural(PARTICIPANTS.length, "учасник", "учасники", "учасників")} · 100% часток
{PARTICIPANTS.map(p => (
setOpenParticipant(p)}>
{p.initials}
{p.name}
{p.role === "founder" ? "Засновник" : "Учасник"} · з {p.joinedDate.slice(0, 4)} р.
{p.share}%
{p.shareAmount.toLocaleString("uk-UA")} ₴
))}
{/* Хронологія */}

Хронологія змін

{LEGAL_CHANGES.length} {window.plural(LEGAL_CHANGES.length, "запис", "записи", "записів")}
{LEGAL_CHANGES.map((ch, i) => { const t = LEGAL_CHANGE_TYPES[ch.type] || { label: ch.type, icon: "•", color: "var(--ink-3)" }; const status = EDR_STATUS[ch.edrStatus] || EDR_STATUS.not_required; return (
setOpenChange(ch)}>
{t.label} {window.formatDate ? window.formatDate(ch.date) : ch.date} {ch.protocolNumber && <> Протокол №{ch.protocolNumber} } {ch.orderNumber && ch.orderNumber !== "—" && <> Наказ №{ch.orderNumber} }
{ch.title}
{ch.summary}
{status.label} {ch.edrNumber &&
№ {ch.edrNumber}
}
{ch.attachments.length} {window.plural(ch.attachments.length, "файл", "файли", "файлів")}
); })}
{/* Шаблони протоколів */}

Шаблони протоколів

Швидке формування для типових змін
{PROTOCOL_TEMPLATES.map(t => (
setOpenTemplate(t)} style={{cursor: "pointer"}}>
{t.name}
{t.description}
))}
{openChange && setOpenChange(null)} />} {openParticipant && setOpenParticipant(null)} />} {openTemplate && setOpenTemplate(null)} />}
); } // =================================================================== // Drawer: зміна // =================================================================== function LegalChangeDrawer({ change, onClose }) { React.useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); const t = LEGAL_CHANGE_TYPES[change.type] || {}; const status = EDR_STATUS[change.edrStatus] || EDR_STATUS.not_required; return ( <>
{t.label} {status.label}

{change.title}

{window.formatDate ? window.formatDate(change.date) : change.date}

{change.summary}

Документи і реєстрація

{change.protocolNumber && (
Протокол
№{change.protocolNumber}
від {window.formatDate ? window.formatDate(change.protocolDate) : change.protocolDate}
)} {change.orderNumber && change.orderNumber !== "—" && (
Наказ
№{change.orderNumber}
)} {change.edrNumber && (
Реєстраційна дія в ЄДР
{change.edrNumber}
від {window.formatDate ? window.formatDate(change.edrDate) : change.edrDate}
)}

Прикріплені файли

{change.attachments.length}
{change.attachments.map((a, i) => (
{a.name} {a.type}
))}
); } // =================================================================== // Drawer: учасник // =================================================================== function ParticipantDrawer({ participant: p, onClose }) { React.useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); // Знайти зміни, пов'язані з цим учасником const related = LEGAL_CHANGES.filter(c => (c.relatedParticipantIds || []).includes(p.id)); return ( <>
{p.initials}

{p.name}

{p.role === "founder" ? "Засновник" : "Учасник"}
Частка
{p.share}%
Сума
{p.shareAmount.toLocaleString("uk-UA")}
У складі з
{p.joinedDate.slice(0, 4)} р.

Реквізити

Паспорт
{p.passport}
ІПН
{p.taxId}
Адреса реєстрації
{p.address}
{related.length > 0 && (

Пов'язані зміни

{related.map(c => { const t = LEGAL_CHANGE_TYPES[c.type] || {}; return (
{c.title}
{window.formatDate ? window.formatDate(c.date) : c.date} · Протокол №{c.protocolNumber}
); })}
)}
); } // =================================================================== // Модалка: шаблон протоколу // =================================================================== function ProtocolTemplateModal({ template, onClose }) { React.useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); return ( <>
{template.name}
{template.description}

Поля для заповнення

{template.fields.map((f, i) => (
))}
); } window.LegalChangesPage = LegalChangesPage; })();