// edrpou-data.jsx — автопідтягування контрагента за кодом ЄДРПОУ + робочий стан // замовників і договорів (додані вручну зберігаються у localStorage). // lookupEdrpou() — мок реєстру (Opendatabot/ДПС/Дія). На бекенді замінюється // реальним запитом; сигнатура (Promise з тими ж полями) лишається. // ——— Мок державного реєстру ЄДР ——— // Ключ — код ЄДРПОУ (юр. особи 8 цифр, ФОП — РНОКПП 10 цифр). const EDR_REGISTRY = { // вже наявні замовники (щоб підтягування знаходило їх) "41835672": { name: "Товариство з обмеженою відповідальністю «Подільський Девелопмент»", short: "ТОВ «Подільський Девелопмент»", type: "legal", address: "04070, м. Київ, вул. Хорива, 12, оф. 305", director: "Гриценко Олександр Володимирович", directorRole: "Директор", kved: "41.10", kvedText: "Організація будівництва будівель", status: "active", vatPayer: true, registeredDate: "2016-08-19" }, "02147853": { name: "Управління освіти виконавчого органу Київської міської ради", short: "Управління освіти м. Києва", type: "state", address: "01001, м. Київ, вул. Богдана Хмельницького, 32", director: "Фіданян Олена Володимирівна", directorRole: "Начальник управління", kved: "84.11", kvedText: "Державне управління загального характеру", status: "active", vatPayer: false, registeredDate: "2002-03-14" }, "39184562": { name: "Приватне підприємство «Лісове»", short: "ПП «Лісове»", type: "legal", address: "08120, Київська обл., с. Лісники, вул. Соснова, 1", director: "Петрук Ігор Степанович", directorRole: "Директор", kved: "68.10", kvedText: "Купівля та продаж власного нерухомого майна", status: "active", vatPayer: true, registeredDate: "2014-05-22" }, "00015622": { name: "Міністерство юстиції України", short: "Мін'юст", type: "state", address: "01001, м. Київ, вул. Архітектора Городецького, 13", director: "Малюська Денис Леонтійович", directorRole: "Міністр", kved: "84.11", kvedText: "Державне управління загального характеру", status: "active", vatPayer: false, registeredDate: "1998-01-12" }, // нові контрагенти — для демонстрації «введи код → підтягнулося» "43217890": { name: "Товариство з обмеженою відповідальністю «Аркадія Резиденс»", short: "ТОВ «Аркадія Резиденс»", type: "legal", address: "65009, м. Одеса, Фонтанська дорога, 16", director: "Захаров Дмитро Сергійович", directorRole: "Директор", kved: "41.10", kvedText: "Організація будівництва будівель", status: "active", vatPayer: true, registeredDate: "2019-11-04" }, "38217604": { name: "Товариство з обмеженою відповідальністю «Бізнес-Центр Хорива»", short: "ТОВ «БЦ Хорива»", type: "legal", address: "04071, м. Київ, вул. Хорива, 12", director: "Литвин Олег Павлович", directorRole: "Директор", kved: "68.20", kvedText: "Надання в оренду нерухомого майна", status: "active", vatPayer: true, registeredDate: "2012-02-28" }, "04056789": { name: "Одеська міська рада", short: "Одеська міськрада", type: "state", address: "65026, м. Одеса, Думська площа, 1", director: "—", directorRole: "Міський голова", kved: "84.11", kvedText: "Державне управління загального характеру", status: "active", vatPayer: false, registeredDate: "2000-06-15" }, "42889106": { name: "Товариство з обмеженою відповідальністю «Чорноморбуд-Інвест»", short: "ТОВ «Чорноморбуд-Інвест»", type: "legal", address: "68003, Одеська обл., м. Чорноморськ, вул. Праці, 7", director: "Ковальова Ірина Миколаївна", directorRole: "Директор", kved: "41.20", kvedText: "Будівництво житлових і нежитлових будівель", status: "active", vatPayer: true, registeredDate: "2018-09-30" }, "37652104": { name: "Товариство з обмеженою відповідальністю «Преміум Девелопмент»", short: "ТОВ «Преміум Девелопмент»", type: "legal", address: "65114, м. Одеса, вул. Генуезька, 24", director: "Соколов Артем Ігорович", directorRole: "Директор", kved: "41.10", kvedText: "Організація будівництва будівель", status: "terminated", vatPayer: false, registeredDate: "2011-04-18" }, }; // Затримка + результат запиту до реєстру (мок). Повертає Promise. window.lookupEdrpou = function (codeRaw) { const code = String(codeRaw || "").replace(/\D/g, ""); return new Promise((resolve) => { setTimeout(() => { if (code.length !== 8 && code.length !== 10) { resolve({ found: false, error: "Код має містити 8 цифр (юр. особа) або 10 (ФОП).", code }); return; } const rec = EDR_REGISTRY[code]; if (!rec) { resolve({ found: false, error: "У реєстрі не знайдено. Перевірте код або введіть дані вручну.", code }); return; } resolve({ found: true, edrpou: code, source: "ЄДР · Opendatabot (демо)", checkedAt: window.SYS_DATE || "2026-05-29", ...rec }); }, 650); }); }; window.EDR_REGISTRY = EDR_REGISTRY; // ——— Робочий стан: додані вручну замовники та договори (localStorage) ——— const CP_KEY = "ukrbud_counterparties_v1"; function loadAdded() { try { const r = localStorage.getItem(CP_KEY); if (r) { const p = JSON.parse(r); if (p && p.__v === 1) return p; } } catch (e) {} return { __v: 1, clients: [], contracts: [] }; } window.__cpAdded = loadAdded(); function saveAdded() { try { localStorage.setItem(CP_KEY, JSON.stringify(window.__cpAdded)); } catch (e) {} window.dispatchEvent(new Event("ukrbud-cp")); } // домержити збережені додавання у живі масиви DATA (один раз на завантаження) (function applyAdded() { const C = window.DATA.CLIENTS, K = window.DATA.CONTRACTS; window.__cpAdded.clients.forEach(c => { if (!C.some(x => x.id === c.id)) C.push(c); }); window.__cpAdded.contracts.forEach(k => { if (!K.some(x => x.id === k.id)) K.push(k); }); })(); window.useCounterparties = function () { const [, force] = React.useState(0); React.useEffect(() => { const h = () => force(x => x + 1); window.addEventListener("ukrbud-cp", h); return () => window.removeEventListener("ukrbud-cp", h); }, []); return window.__cpAdded; }; window.addClient = function (client) { const id = client.id || ("c-" + Date.now()); const rec = { ...client, id, _added: true }; window.DATA.CLIENTS.push(rec); window.__cpAdded.clients.push(rec); saveAdded(); return rec; }; window.nextContractNumber = function () { const nums = window.DATA.CONTRACTS .map(c => { const m = (c.number || "").match(/(\d+)\s*\/\s*2026/); return m ? parseInt(m[1], 10) : 0; }); const n = (nums.length ? Math.max(0, ...nums) : 0) + 1; return `${String(n).padStart(2, "0")}/2026`; }; window.addContract = function (contract) { const id = contract.id || ("k-" + Date.now()); const rec = { ...contract, id, _added: true }; window.DATA.CONTRACTS.push(rec); window.__cpAdded.contracts.push(rec); saveAdded(); return rec; }; // Шаблони графіка платежів (% етапів) для нового договору window.CONTRACT_SCHEDULE_TEMPLATES = [ { id: "std", label: "Стандартний (аванс 30 / робочий проєкт 50 / завершення 20)", stages: [ { stage: "Аванс при підписанні", pct: 30 }, { stage: "Здача робочого проєкту", pct: 50 }, { stage: "Завершальний розрахунок", pct: 20 }, ] }, { id: "stages4", label: "Поетапний (20 / 25 / 40 / 15)", stages: [ { stage: "Аванс при підписанні", pct: 20 }, { stage: "Здача ескізного проєкту", pct: 25 }, { stage: "Здача робочого проєкту", pct: 40 }, { stage: "Реєстрація в ЄДЕССБ / завершення", pct: 15 }, ] }, { id: "tender", label: "Бюджетний / тендер (аванс 30 / експертиза 15 / РП 40 / решта 15)", stages: [ { stage: "Аванс після тендеру", pct: 30 }, { stage: "Експертиза кошторису", pct: 15 }, { stage: "Здача робочого проєкту", pct: 40 }, { stage: "Експертиза + остаточний", pct: 15 }, ] }, ]; // Побудувати графік платежів із шаблону + загальної суми + дати старту window.buildSchedule = function (templateId, total, startISO) { const tpl = window.CONTRACT_SCHEDULE_TEMPLATES.find(t => t.id === templateId) || window.CONTRACT_SCHEDULE_TEMPLATES[0]; const start = new Date((startISO || window.SYS_DATE || "2026-05-29") + "T00:00:00"); let acc = 0; return tpl.stages.map((s, i) => { let amount = Math.round(total * s.pct / 100); acc += amount; if (i === tpl.stages.length - 1) amount += (total - acc); // дотягнути до точної суми const due = new Date(start); due.setMonth(due.getMonth() + i * 2 + (i === 0 ? 0 : 1)); const iso = due.toISOString().slice(0, 10); return { stage: s.stage, pct: s.pct, amount, dueDate: iso }; }); };