// ============================================================= // 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, ) }