Packages

An Elixir wrapper for the SOAP Deltek API

Current section

Files

Jump to
deltek lib deltek.ex
Raw

lib/deltek.ex

defmodule Deltek do
use Application
alias Deltek.Query
alias Deltek.Requester
alias Deltek.Template
@templates_dir "lib/deltek/templates"
@projects_xml Path.join(@templates_dir, "get_projects_by_query.xml.eex")
@clients_xml Path.join(@templates_dir, "get_clients_by_query.xml.eex")
@employees_xml Path.join(@templates_dir, "get_employees_by_query.xml.eex")
def start(_type, _args) do
import Supervisor.Spec
children = [
worker(Deltek.Template, [@clients_xml, :clients], id: :clients_template),
worker(Deltek.Template, [@projects_xml, :projects], id: :projects_template),
worker(Deltek.Template, [@employees_xml, :employees], id: :employees_template),
worker(Deltek.Template, [@clients_xml, :client], id: :client_template),
worker(Deltek.Template, [@projects_xml, :project], id: :project_template),
worker(Deltek.Template, [@employees_xml, :employee], id: :employee_template),
]
opts = [strategy: :one_for_one, name: Deltek.Supervisor]
Supervisor.start_link(children, opts)
end
# Public implementation
#######################
def projects(limit \\ 10, offset \\ 0), do: request(:projects, "GetProjectsByQuery", [limit, offset])
def clients(limit \\ 10, offset \\ 0), do: request(:clients, "GetClientsByQuery", [limit, offset])
def employees(limit \\ 10, offset \\ 0), do: request(:employees, "GetEmployeesByQuery", [limit, offset])
def project(code: code), do: request(:project, "GetProjectsByQuery", [[code: code]])
def project(name: name), do: request(:project, "GetProjectsByQuery", [[name: name]])
def client(id: id), do: request(:client, "GetClientsByQuery", [[id: id]])
def client(name: name), do: request(:client, "GetClientsByQuery", [[name: name]])
def employee(id: id), do: request(:employee, "GetEmployeesByQuery", [[id: id]])
def employee(name: name), do: request(:employee, "GetEmployeesByQuery", [[name: name]])
# Private implementation
########################
defp request(model, action, args) do
request = apply(Query, :build, [model | args])
|> create_request(model)
{:ok, requester} = Requester.start_link(action, model)
Requester.request(requester, request)
end
defp create_request(query, model) do
:deltek
|> Application.get_all_env
|> Keyword.merge([record_detail: "Primary", query: query])
|> Template.eval(model)
end
end