// order-print.jsx — друкований бланк кадрового наказу (A4), верстка 1:1 за фірмовим
// зразком ТОВ «УКРБУДПРОЄКТ» (наказ ГІП): шапка з логотипом + контакти, зелена лінія,
// реєстраційний рядок, «НАКАЗ №» по центру, НАКАЗУЮ з нумерованими пунктами,
// підпис директорки + печатка, підвал з ТМ. Блок ознайомлення — на продовженні.
// Тіло редаговане (contentEditable). Авто-перенос на 2-гу сторінку за переповнення.
function OrderHeader({ co }) {
return (
тел. {co.phone}
{co.email} · {co.web}
{co.fullName} · Код ЄДРПОУ {co.edrpou} · {co.address}
);
}
function OrderFooter({ co, page, total }) {
return (
🇺🇦 Слава Україні · Героям слава
стор. {page} з {total}
);
}
function OrderPrintDoc({ order, onClose }) {
React.useEffect(() => {
const onKey = (e) => e.key === "Escape" && onClose();
window.addEventListener("keydown", onKey);
return () => window.removeEventListener("keydown", onKey);
}, [onClose]);
const co = window.COMPANY || {};
const p = window.getTeam(order.personId) || { name: (order.f && order.f.name) || "" };
const T = window.ORDER_TYPES[order.type] || {};
const body = window.buildOrderBody(order);
const titleText = (order.titleText) || (T.title ? T.title.charAt(0).toUpperCase() + T.title.slice(1) : "Наказ");
const fioNom = window.declineFio(p.name, "nom");
const dDot = (iso) => window.dateDots(iso);
// Авто-перенос: вимірюємо контент 1-ї сторінки; якщо переповнює — ознайомлення на стор. 2
const flowRef = React.useRef(null);
const [twoPages, setTwoPages] = React.useState(false);
React.useLayoutEffect(() => {
const el = flowRef.current;
if (!el) return;
// корисна висота A4 за вирахуванням полів і підвалу ≈ 960px
setTwoPages(el.scrollHeight > 952);
}, [order]);
const doPrint = () => window.print();
const AckBlock = (
З наказом ознайомлений(а):
{fioNom}
(прізвище, ім'я, по батькові)
{dDot(order.ackDate || order.date)}
дата
);
return (
Наказ № {order.no} · {T.label}
Текст можна редагувати перед друком
{/* ───────── Сторінка 1 ───────── */}
{co.city || "м. Одеса"}
НАКАЗ № {order.no}
від {dDot(order.date)} р.
{titleText}
{body.preamble},
НАКАЗУЮ:
{body.points.map((pt, i) => (
- {pt}
))}
{body.basis && (
Підстава:{" "}
{body.basis}
)}
{/* Підпис */}
{co.directorRole} {co.shortName}
діє на підставі {co.directorBasis || "Статуту"} · м.п.
{co.stampImg ?

:
М.П.}
{co.signImg &&

}
{co.directorSign || co.directorFull || co.director}
{/* Ознайомлення — на стор. 1, якщо вміщається */}
{!twoPages && AckBlock}
{/* ───────── Сторінка 2 (продовження) ───────── */}
{twoPages && (
Продовження наказу № {order.no} від {dDot(order.date)} р.
{AckBlock}
)}
);
}
function OrderPrintStyles() {
return (
);
}
window.OrderPrintDoc = OrderPrintDoc;