Часть 6. Структура приложения
— Часть 1. Введение
           — Часть 2. Общая структура
           — Часть 3. Первичные цепочки
           — Часть 4. Администратор данных
           — Часть 5. Администратор процессов
           — Часть 6. Структура приложения
           — Часть 7. Публикация в GCP
Постановка задачи
В Частях 3 и 4 мы показали как писать простые универсальные адиминки для основных объектов предприятия — данных и процессов. В этой части мы покажем структуру первого эликсир приложения PLM для управления предприятием совершающим аутсорсную деятельность. Требования к этому приложению были сформулированы в Части 1, а первичная структура самого предприятия и его ресурсов спратана в приложении ERP (которое должно публиковаться с приватном репозитории). Но для примера и во ися прозрачности бухгалтерского учета между самими программистами организационная структура предприятия заэкспожена публично полность, вместе с инвойсами и аггрегированными суммами по зарлплатным ведомостям, но без детализации по ЗП, зато с часовыми аллокациями рабочего временя (рейты анонимны, опционы насчитываются независимо от рейтов). Кроме опционов можно совершать инвестирование в проекты этой аутсорс компании поз залог самих же проектов компании, который акумулируется в соотвествующем субконто счёте после вычисления чистой нерапрделённой прибыли. Всего количество статей для распределения не много: 1) это резерв компании, 2) кредитованине других проектов, 3) опционы программистов и 4) исследования и разработка.
Конфигурация
Чтобы не писать каждый раз эту прелюдию для каждого приложения приведем на примере PLM проекта, который уже включает почти весь стек: N2O, KVS, BPE, а также другие N2O протоколы CHAT, NITRO. NITRO — является портом Nitrogen Web Framework написанный Расти Клопхаусом.
config/config.exs
use Mix.Config
config :n2o,
  pickler: :n2o_secret,
  mq: :n2o_syn,
  port: 8043,
  proto: CHAT.Server
  mqtt_services: ['erp', 'plm'],
  ws_services: ['chat'],
  upload: "./priv/static",
  routes: KVS.Routes,
  protocols:
  [
    :n2o_heart,
    :n2o_nitro,
    :n2o_ftp,
    :bpe_n2o,
    CHAT.TXT
  ]
config :kvs,
  dba: :kvs_rocks,
  dba_st: :kvs_st,
  schema:
  [
    :kvs,
    :kvs_stream,
    :bpe_metainfo
  ]
config :erp,
  boot:
  [
    :erp_boot,
    :acc_boot,
    :pay_boot,
    :plm_boot,
    :fin_boot
  ]
      Публикация
mix.exs
defmodule PLM.Mixfile do
  use Mix.Project
  def project() do
    [
      app: :plm,
      version: "0.7.1",
      elixir: "~> 1.8.1",
      description: "PLM",
      deps: deps()
    ]
  end
  def application() do
    [
      mod: {PLM.Application, []},
      applications:
      [
        :ranch,
        :cowboy,
        :rocksdb,
        :kvs,
        :syn,
        :erp,
        :bpe,
        :n2o,
        :chat
      ]
    ]
  end
  def deps() do
    [
      {:ex_doc, "~> 0.20.2", only: :dev},
      {:cowboy, "~> 2.5.0"},
      {:rocksdb, "~> 1.2.0"},
      {:chat, "~> 3.7.2"},
      {:n2o, "~> 6.7.1"},
      {:syn, "~> 1.6.3"},
      {:kvs, "~> 6.7.4"},
      {:erp, "~> 0.7.6"},
      {:bpe, "~> 4.7.3"},
      {:nitro, "~> 4.7.3"}
    ]
  end
emd
    Страницы

PLM
PLM.Index

def event(:init)
def event({:chart, code, x, y, z, i})
def event({:invest, code})
    PLM.CashFlow

def event(:init)
def event(:create_investment)
def event(:create_income)
def event(:create_outcome)
def event({:discard, []})
    FIN
FIN.Index


def event(:init)
def event({:txs, proc})
def event({:off, form})
    LDAP
LDAP.Index


def event(:init)
def event(:on)
def event({:auth, form})
def event({:close, form})
def event({:revoke, x})
def event({:off, form})
    Роутер
Роутинг контроллеров страниц Nitrogen Web фреймворка. В этом роутере мы подключим все наши модули разработанные в Частях 3 и 4, т.е. администраторы данных и процессов.
ldap — LDAP.Index
form — FORM.Index
act — BPE.Actor
bpe — BPE.Index
kvs — KVS.Index
plm — PLM.Index
cashflow — PLM.CashFlow