Files
2026-10-09 01:45:17 +00:00

208 lines
6.3 KiB
Typst
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// =============================================================
// INFRASTRUCTURE: ПУБЛИЧНЫЙ СПРАВОЧНИК СОТРУДНИКОВ И ПОДПИСЕЙ
// =============================================================
// ФИО, обычная должность и имя файла не являются приватными.
// Наличие подписи и её индивидуальное смещение задаются только в
// игнорируемом Git файле /.private/settings.typ.
#import "../domain/document.typ": fail
#let employee-directory = (
musikhin: (
name: "Мусихин А.С.",
default-role: "Ответственный исполнитель",
signature-file: "Musikhin.png",
),
guzeev: (
name: "Гузеев И.А.",
default-role: "Главный геомеханик",
signature-file: "Guzeev.png",
),
fedorov: (
name: "Федоров Д.А.",
default-role: "Инженер-геомеханик",
signature-file: "Fedorov.png",
),
ilyasov: (
name: "Ильясов Б.Т.",
default-role: "Технический директор, к.т.н.",
signature-file: "Ilyasov.png",
),
khimichev: (
name: "Химичев С.С.",
default-role: "Инженер-геомеханик",
signature-file: "Khimichev.png",
),
brusnicin: (
name: "Брусницын И.В.",
default-role: "Инженер-геомеханик",
signature-file: "Brusnicin.png",
),
ozornin: (
name: "Озорнин Д.А.",
default-role: "Геолог",
signature-file: "Ozornin.png",
),
buhartdinov: (
name: "Бухартдинов А.С.",
default-role: "Главный маркшейдер",
signature-file: "Buhartdinov.png",
),
tkachenko: (
name: "Ткаченко А.С.",
default-role: "Инженер-геомеханик",
signature-file: "Tkachenko.png",
),
moshin: (
name: "Мошин В.Е.",
default-role: "Гидрогеолог",
signature-file: "Moshin.png",
),
mitrokhin: (
name: "Митрохин В.А.",
default-role: "Главный гидрогеолог",
signature-file: "Mitrokhin.png",
),
luzina: (
name: "Лузина М.В.",
default-role: "Геолог",
signature-file: "Luzina.png",
),
balandin: (
name: "Баландин А.",
default-role: "Геолог",
signature-file: "Balandin.png",
),
baigali: (
name: "Байгали Р.К.",
default-role: "Инженер-геомеханик",
signature-file: "Baigali.png",
),
sugatov: (
name: "Сугатов Н.С.",
default-role: "Инженер-геомеханик",
signature-file: "Sugatov.png",
),
soluyanov: (
name: "Солуянов Н.О.",
default-role: "Ведущий геомеханик",
signature-file: "Soluyanov.png",
),
ecenkov: (
name: "ЛЕценков И.А.",
default-role: "Инженер-геомеханик",
signature-file: "Ecenkov.png",
),
savin: (
name: "Савин Д.А.",
default-role: "Делопроизводитель",
signature-file: "Savin.png",
),
trescov: (
name: "Тресцов Н.Н.",
default-role: "Геолог",
signature-file: "Trescov.png",
),
)
#let empty-private-settings = (
companies: (:),
signatures: (:),
)
#let validate-private-settings(settings) = {
if type(settings) != dictionary {
fail("private-settings", "ожидался словарь из .private/settings.typ")
}
for field in ("companies", "signatures") {
if type(settings.at(field, default: (:))) != dictionary {
fail("private-settings." + field, "ожидался словарь")
}
}
settings
}
#let private-company-media(settings, company-id) = {
let settings = validate-private-settings(settings)
let company = settings.companies.at(company-id, default: none)
if company == none {
(signature: none, stamp: none)
} else {
if type(company) != dictionary {
fail("private-settings.companies." + company-id, "ожидался словарь")
}
let has-signature = company.at("signature", default: false)
let has-stamp = company.at("stamp", default: false)
if type(has-signature) != bool or type(has-stamp) != bool {
fail(
"private-settings.companies." + company-id,
"поля signature и stamp должны быть true или false",
)
}
(
signature: if has-signature {
path("/.private/" + company-id + "/sign.png")
} else {
none
},
stamp: if has-stamp {
path("/.private/" + company-id + "/stamp.png")
} else {
none
},
)
}
}
#let report-executor(employee-id, role: auto, private-settings: empty-private-settings) = {
if type(employee-id) != str or not employee-directory.keys().contains(employee-id) {
fail(
"report-executor.employee-id",
"неизвестный сотрудник " + repr(employee-id) + "; доступны "
+ employee-directory.keys().join(", "),
)
}
let person = employee-directory.at(employee-id)
let resolved-role = if role == auto { person.default-role } else { role }
if type(resolved-role) != str or resolved-role.trim() == "" {
fail("report-executor.role", "должность должна быть непустой строкой")
}
let settings = validate-private-settings(private-settings)
let signature = settings.signatures.at(employee-id, default: none)
let signature-image = none
let signature-offset = 0cm
if signature != none {
if type(signature) != dictionary {
fail("private-settings.signatures." + employee-id, "ожидался словарь")
}
let enabled = signature.at("enabled", default: true)
if type(enabled) != bool {
fail(
"private-settings.signatures." + employee-id + ".enabled",
"ожидалось true или false",
)
}
if enabled {
signature-image = path("/.private/executors/" + person.signature-file)
signature-offset = signature.at("offset", default: 0cm)
if type(signature-offset) != length {
fail(
"private-settings.signatures." + employee-id + ".offset",
"ожидалась длина, например 1.25cm",
)
}
}
}
(
resolved-role,
person.name,
signature-image,
signature-offset,
)
}