defmodule CA.NPA do @moduledoc """ Generates anonymized normative and legal act orders (накази) for enterprise security. """ require EEx def gen_order_szi_establishment(opts \\ []) do defaults = [ tryzub_def: CA.NPA.tryzub_def(), parent_org: "Державна судова адміністрація України", org_name: "Державне підприємство «Інформаційні судові системи»", city: "Київ", date: "30.01.2024", number: "18_ОД", system_name: "ЄСІКС", ciso_name: "Іван ПЕТРЕНКО", ciso_title: "начальник відділу інформаційної безпеки", director_name: "Василь ШЕВЧЕНКО", director_title: "Генеральний директор" ] render_order_template("order_szi_establishment", defaults, opts, "order_szi_establishment") end def gen_order_kszi_development(opts \\ []) do defaults = [ tryzub_def: CA.NPA.tryzub_def(), parent_org: "Державна судова адміністрація України", org_name: "Державне підприємство «Інформаційні судові системи»", city: "Київ", date: "05.02.2024", number: "22_ОД", system_name: "ЄСІКС", developer_name: "ДП «УСС»", head_of_group: "Петро СИДОРЕНКО", survey_deadline: "20.02.2024", risk_deadline: "28.02.2024", director_name: "Василь ШЕВЧЕНКО", director_title: "Генеральний директор" ] render_order_template("order_kszi_development", defaults, opts, "order_kszi_development") end def gen_order_at_ir_ma_ps_pe(opts \\ []) do defaults = [ tryzub_def: CA.NPA.tryzub_def(), parent_org: "Державна судова адміністрація України", org_name: "Державне підприємство «Інформаційні судові системи»", city: "Київ", date: "09.01.2023", number: "3_ОД", system_name: "ЄСІКС", ciso_name: "Дмитро КОВАЛЕНКО", ciso_title: "начальник відділу інформаційної безпеки", director_name: "Олексій ГРИЦЕНКО", director_title: "В. о. генерального директора" ] render_order_template("order_at_ir_ma_ps_pe", defaults, opts, "order_at_ir_ma_ps_pe") end def gen_order_admin_appointment(opts \\ []) do defaults = [ tryzub_def: CA.NPA.tryzub_def(), parent_org: "Державна судова адміністрація України", org_name: "Державне підприємство «Інформаційні судові системи»", city: "Київ", date: "30.01.2024", number: "19_ОД", system_name: "ЄСІКС", pol_date: "09.01.2023", pol_num: "3_ОД", prev_date: "17.01.2023", prev_num: "08_ОД", ciso_name: "Дмитро КОВАЛЕНКО", director_name: "Микола МЕЛЬНИК", director_title: "Генеральний директор", domain_admins: [ %{name: "Олександр ІВАНЕНКО", title: "начальник відділу адміністрування IT-інфраструктури"}, %{name: "Юрій ПЕТРЕНКО", title: "адміністратор системи"}, %{name: "Олександр СИДОРЕНКО", title: "інженер відділу адміністрування мереж"} ], network_admins: [ %{name: "Михайло ДМИТРЕНКО", title: "адміністратор системи"}, %{name: "Юрій ПЕТРЕНКО", title: "адміністратор системи"}, %{name: "Олександр СИДОРЕНКО", title: "інженер"}, %{name: "Андрій КОВАЛЬЧУК", title: "адміністратор системи"} ], app_admins: [ %{name: "Олександр ІВАНЕНКО", title: "начальник відділу"}, %{name: "Михайло ПАВЛЕНКО", title: "адміністратор системи"}, %{name: "Петро КУЗЬМЕНКО", title: "директор департаменту"}, %{name: "Олексій МОРОЗ", title: "начальник відділу СУБД"}, %{name: "Олександр ЛЕБЕДЄВ", title: "фахівець з інформаційних технологій"}, %{name: "Юрій ПЕТРЕНКО", title: "адміністратор системи"}, %{name: "Олександр СИДОРЕНКО", title: "інженер"}, %{name: "Андрій КОВАЛЬЧУК", title: "адміністратор системи"}, %{name: "Роман ТКАЧЕНКО", title: "адміністратор бази даних"}, %{name: "Іван КРАВЧЕНКО", title: "адміністратор бази даних"} ], db_admins: [ %{name: "Петро КУЗЬМЕНКО", title: "директор департаменту"}, %{name: "Олексій МОРОЗ", title: "начальник відділу СУБД"}, %{name: "Роман ТКАЧЕНКО", title: "адміністратор бази даних"}, %{name: "Іван КРАВЧЕНКО", title: "адміністратор бази даних"} ], security_admins: [ %{name: "Євген РОМАНЕНКО", title: "начальник відділу адміністрування мереж"}, %{name: "В'ячеслав БОЙКО", title: "адміністратор системи відділу інформаційної безпеки"} ], backup_admins: [ %{name: "Олександр ІВАНЕНКО", title: "начальник відділу"}, %{name: "Євген РОМАНЕНКО", title: "начальник відділу"}, %{name: "Петро КУЗЬМЕНКО", title: "директор департаменту"}, %{name: "Олексій МОРОЗ", title: "начальник відділу СУБД"} ] ] render_order_template("order_admin_appointment", defaults, opts, "order_admin_appointment") end def gen_order_physical_access(opts \\ []) do defaults = [ tryzub_def: CA.TeX.tryzub_def(), parent_org: "Державна судова адміністрація України", org_name: "Державне підприємство «Інформаційні судові системи»", city: "Київ", date: "28.05.2026", number: "96_ОД", base_date: "13.04.2023", base_num: "53_ОД", prev_date: "16.05.2025", prev_num: "67_ОД", address: "м. Київ, вул. Липська, 18/5", director_name: "Василь ШЕВЧЕНКО", director_title: "Генеральний директор", ciso_name: "Дмитро КОВАЛЕНКО", persons: [ %{name: "КЛИМЕНКО Володимир", title: "Головний інженер"}, %{name: "ІВАНЕНКО Юрій", title: "Директор департаменту централізованого адміністрування мереж та системного супроводу"}, %{name: "ГЕРАСИМЧУК Микола", title: "Директор департаменту розробки програмного забезпечення"}, %{name: "КУЗЬМЕНКО Петро", title: "Директор департаменту підтримки користувачів"}, %{name: "СИДОРЕНКО Юрій", title: "Начальник відділу інформаційної безпеки"}, %{name: "ПАВЛЕНКО Михайло", title: "Адміністратор системи відділу адміністрування IT-інфраструктури"}, %{name: "КОЛОМІЄЦЬ Денис", title: "Адміністратор системи"}, %{name: "ЛЕБЕДЄВ Олександр", title: "Фахівець з інформаційних технологій"} ] ] render_order_template("order_physical_access", defaults, opts, "order_physical_access") end defp render_order_template(template_name, default_opts, overrides, output_name) do logo_style = Keyword.get(overrides, :logo, :mono) tryzub = Keyword.get(overrides, :tryzub_def) || CA.NPA.tryzub_def(logo_style) opts = Keyword.merge(default_opts, overrides) escaped_opts = Enum.map(opts, fn {k, v} -> {k, CA.TeX.escape_val(v)} end) escaped_opts = Keyword.put(escaped_opts, :tryzub_def, tryzub) content = EEx.eval_file("priv/templates/#{template_name}.tex.eex", assigns: escaped_opts) filename = "priv/templates/#{output_name}.tex" File.write!(filename, content) filename end def tryzub_def(style \\ :mono) do case style do :mono -> """ \\newcommand{\\tryzub}[1][1]{% \\begin{tikzpicture}[scale=0.03*#1, yscale=-1, baseline=(current bounding box.center)] % Shield: transparent background, black stroke \\filldraw[fill=white, draw=black, line width=1.5pt] svg {m5 5h650v689c0 48-29 97-76 117l-251 105-251-105c-44-20-76-65-72-117z}; % Right half of Tryzub (Black) \\fill[color=black] svg {m329 53c-6 4-2 396 0 401 12 43 29 81 48 112-104 31-63 146-48 287 7-12 17-21 28-28 43-34 70-81 79-132h133v-580c-148 88-132 213-148 361 59-10 75 76-3 83-92-149-59-257-59-419 0-37-9-62-30-85zm200 143v297h-22c-6-23-21-41-42-51 8-85 10-189 64-246zm-22 337h22v120h-89c0-19-3-39-8-58 36-4 68-29 75-62zm-114 71c4 16 6 33 6 49h-50c1-27 19-44 44-49zm-44 89h46c-7 31-23 61-46 85z}; % Left (mirrored) half of Tryzub (Black) \\fill[color=black] svg {m331 53c6 4 2 396 0 401-12 43-29 81-48 112 104 31 63 146 48 287-7-12-17-21-28-28-43-34-70-81-79-132h-133v-580c148 88 132 213 148 361-59-10-75 76 3 83 92-149 59-257 59-419 0-37 9-62 30-85zm-200 143v297h22c6-23 21-41 42-51-8-85-10-189-64-246zm22 337h-22v120h89c0-19 3-39 8-58-36-4-68-29-75-62zm114 71c-4 16-6 33-6 49h50c-1-27-19-44-44-49zm44 89h-46c7 31 23 61 46 85z}; \\end{tikzpicture}% } """ _ -> """ \\newcommand{\\tryzub}[1][1]{% \\begin{tikzpicture}[scale=0.03*#1, yscale=-1, baseline=(current bounding box.center)] % Blue shield \\fill[color={rgb,255:red,0;green,91;blue,187}, draw={rgb,255:red,255;green,213;blue,0}, line width=1.5pt] svg {m5 5h650v689c0 48-29 97-76 117l-251 105-251-105c-44-20-76-65-72-117z}; % Right half of Tryzub \\fill[color={rgb,255:red,255;green,213;blue,0}] svg {m329 53c-6 4-2 396 0 401 12 43 29 81 48 112-104 31-63 146-48 287 7-12 17-21 28-28 43-34 70-81 79-132h133v-580c-148 88-132 213-148 361 59-10 75 76-3 83-92-149-59-257-59-419 0-37-9-62-30-85zm200 143v297h-22c-6-23-21-41-42-51 8-85 10-189 64-246zm-22 337h22v120h-89c0-19-3-39-8-58 36-4 68-29 75-62zm-114 71c4 16 6 33 6 49h-50c1-27 19-44 44-49zm-44 89h46c-7 31-23 61-46 85z}; % Left (mirrored) half of Tryzub \\fill[color={rgb,255:red,255;green,213;blue,0}] svg {m331 53c6 4 2 396 0 401-12 43-29 81-48 112 104 31 63 146 48 287-7-12-17-21-28-28-43-34-70-81-79-132h-133v-580c148 88 132 213 148 361-59-10-75 76 3 83 92-149 59-257 59-419 0-37 9-62 30-85zm-200 143v297h22c6-23 21-41 42-51-8-85-10-189-64-246zm22 337h-22v120h89c0-19 3-39 8-58-36-4-68-29-75-62zm114 71c-4 16-6 33-6 49h50c-1-27-19-44-44-49zm44 89h-46c7 31 23 61 46 85z}; \\end{tikzpicture}% } """ end end end