Initial commit
This commit is contained in:
commit
c534d5ce80
163 files changed
+11500
No files matched your search
@@ -0,0 +1,109 @@
|
||||
// ==========================================
|
||||
// INFRASTRUCTURE: ПУБЛИЧНЫЕ ДАННЫЕ КОМПАНИЙ
|
||||
// ==========================================
|
||||
#import "../domain/company.typ": company-profile
|
||||
#import "../domain/document.typ": fail
|
||||
|
||||
#let available-companies() = ("scientia", "technology", "too", "test-company")
|
||||
|
||||
#let company-data-path(id) = {
|
||||
if id == "scientia" {
|
||||
path("../../companies/scientia/data.json")
|
||||
} else if id == "technology" {
|
||||
path("../../companies/technology/data.json")
|
||||
} else if id == "too" {
|
||||
path("../../companies/too/data.json")
|
||||
} else if id == "test-company" {
|
||||
path("../../companies/test-company/data.json")
|
||||
} else {
|
||||
fail(
|
||||
"load-company.id",
|
||||
"неизвестная компания " + repr(id) + "; доступны " + available-companies().join(", "),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#let internal-asset(value) = {
|
||||
let value = if value == "" { none } else { value }
|
||||
if value == none {
|
||||
none
|
||||
} else if type(value) == path or type(value) == content {
|
||||
value
|
||||
} else if type(value) == str and value.starts-with("companies/") {
|
||||
path("../../" + value)
|
||||
} else if type(value) == str {
|
||||
fail("company-asset", "путь должен начинаться с companies/: " + repr(value))
|
||||
} else {
|
||||
fail("company-asset", "ожидались none, str, path или content")
|
||||
}
|
||||
}
|
||||
|
||||
#let external-resource(value, field) = {
|
||||
if value == none or type(value) == path or type(value) == content {
|
||||
value
|
||||
} else {
|
||||
fail("load-company." + field, "ожидались none, path или content")
|
||||
}
|
||||
}
|
||||
|
||||
#let normalize-company-data(id, raw) = {
|
||||
let jurisdiction = if id == "too" { "KZ" } else { "RU" }
|
||||
let color-value = raw.at("brand-color", default: "#e39f49")
|
||||
let brand-color = if type(color-value) == color { color-value } else { rgb(color-value) }
|
||||
|
||||
company-profile(
|
||||
id,
|
||||
(
|
||||
name: raw.at("name"),
|
||||
short-name: raw.at("short-name", default: raw.at("name")),
|
||||
jurisdiction: jurisdiction,
|
||||
inn: raw.at("inn", default: none),
|
||||
kpp: raw.at("kpp", default: none),
|
||||
ogrn: raw.at("ogrn", default: none),
|
||||
bin: raw.at("bin", default: none),
|
||||
kbe: raw.at("kbe", default: none),
|
||||
),
|
||||
contacts: (
|
||||
email: raw.at("email", default: none),
|
||||
website: raw.at("website", default: none),
|
||||
phone: raw.at("phone", default: none),
|
||||
address: raw.at("address", default: none),
|
||||
address-en: raw.at("address_en", default: none),
|
||||
city: raw.at("city", default: none),
|
||||
summary: raw.at("company_info", default: none),
|
||||
),
|
||||
banking: (
|
||||
bank: raw.at("bank", default: none),
|
||||
correspondent-account: raw.at("ks", default: none),
|
||||
bik: raw.at("bik", default: none),
|
||||
),
|
||||
brand: (color: brand-color),
|
||||
director: (
|
||||
title: raw.at("director-title", default: "Директор"),
|
||||
name: raw.at("director-name", default: none),
|
||||
),
|
||||
resources: (
|
||||
logo: internal-asset(raw.at("logo_image", default: none)),
|
||||
signature: internal-asset(raw.at("sign_image", default: none)),
|
||||
stamp: internal-asset(raw.at("stamp_image", default: none)),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
#let load-company(
|
||||
id,
|
||||
logo: auto,
|
||||
signature: auto,
|
||||
stamp: auto,
|
||||
) = {
|
||||
if type(id) != str {
|
||||
fail("load-company.id", "ожидалась строка")
|
||||
}
|
||||
let company = normalize-company-data(id, json(company-data-path(id)))
|
||||
let resources = company.resources
|
||||
if logo != auto { resources.insert("logo", external-resource(logo, "logo")) }
|
||||
if signature != auto { resources.insert("signature", external-resource(signature, "signature")) }
|
||||
if stamp != auto { resources.insert("stamp", external-resource(stamp, "stamp")) }
|
||||
company.insert("resources", resources)
|
||||
company
|
||||
}
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
Reference in new issue
Block a user