Initial commit

This commit is contained in:
malysheva committed 2026-10-09 04:24:38 +00:00
commit c534d5ce80
163 files changed
+11500

No files matched your search

+207
View File
@@ -0,0 +1,207 @@
// =============================================================
// 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,
)
}