import type { TguPlanStatus } from "../../model/tguTypes"; import type { TimelineStatusStyle } from "../../model/timelineTypes"; // Порядок — по жизненному циклу плана (см. docs/architect/PCP_TGU_PLAN_STATUS_LIFECYCLE.md). // ACCEPTED из enum бэка здесь намеренно отсутствует: приёмка переводит план сразу в AWAITING_LAYIN. // LAID_IN возникает по событию подтверждения закладки (AWAITING_LAYIN → LAID_IN) и делает план базой // цепочки; конкуренты на то же окно при этом уходят в SUPERSEDED. export const STATUS_STYLES: TimelineStatusStyle[] = [ { status: "DRAFT", label: "ЧЕРНОВИК", color: "#a98bdb", className: "status-draft", description: "Черновик: план в стадии правки, в выдачу пока не идёт." }, { status: "PLANNED", label: "PLANNED", color: "#8d99a6", className: "status-planned", description: "Возможный будущий план (проекция цепочки)." }, { status: "ISSUING", label: "ISSUING", color: "#2f80ed", className: "status-issuing", description: "Идёт выдача плана." }, { status: "WAITING_DECISION", label: "WAITING_DECISION", color: "#f0ad2e", className: "status-waiting", description: "План выдан, ожидается решение (принять / отклонить)." }, { status: "AWAITING_LAYIN", label: "AWAITING_LAYIN", color: "#2f9e44", className: "status-awaiting-layin", description: "План принят, ожидается подтверждение закладки." }, { status: "LAID_IN", label: "LAID_IN", color: "#1b6b34", className: "status-laid-in", description: "Получено подтверждение закладки плана." }, { status: "START_AMBIGUOUS", label: "START_AMBIGUOUS", color: "#b42318", className: "status-ambiguous", description: "Ошибка после старта процесса выдачи плана. Требуется оператор." }, { status: "REJECTED", label: "REJECTED", color: "#d64545", className: "status-rejected", description: "План отклонён, цепочка поставлена на паузу." }, { status: "NOT_ACCEPTED", label: "NOT_ACCEPTED", color: "#e8590c", className: "status-not-accepted", description: "План не принят, идёт срочная перевыдача на ближайшую ЗРВ." }, { status: "LAYIN_FAILED", label: "LAYIN_FAILED", color: "#a61e4d", className: "status-layin-failed", description: "План не заложен, идёт срочная перевыдача на ближайшую ЗРВ." }, { status: "SUPERSEDED", label: "SUPERSEDED", color: "#6b7280", className: "status-superseded", description: "Вытеснён: по тому же окну заложен другой план (коррекция). Терминальный." } ]; const STATUS_BY_NAME = new Map(STATUS_STYLES.map((style) => [style.status, style])); export function statusStyle(status: TguPlanStatus): TimelineStatusStyle { return ( STATUS_BY_NAME.get(status) ?? { status, label: status || "UNKNOWN", color: "#79828d", className: "status-unknown", description: "Неизвестный статус." } ); }