api-v2/lib/api/emailsender/contexts/emailstosendcontext.ex

183 lines
5.4 KiB
Elixir

defmodule Api.EmailToSendContext do
require Logger
import Ecto.Query, warn: false
alias Api.Repo
alias Api.Emailtosend
alias Api.Pagination
def mark_sent(idemailtosend, attrs)do
from(e in Emailtosend, where: e.idemailtosend == ^idemailtosend)
|> Repo.one
|> Emailtosend.changeset(attrs)
|> Repo.update()
end
defp list_emails({filter, sort}) do
filter_conditions =
Enum.reduce(filter, true, fn v, filter_conditions ->
case v["field"] do
"idstudy" ->
dynamic([e], e.idstudy == ^v["value"] and ^filter_conditions)
"patientemail" ->
dynamic([e], ilike(e.patientemail, ^"#{v["value"]}%") and ^filter_conditions)
"sent" ->
dynamic([e], e.sent == ^v["value"] and ^filter_conditions)
"hasreport" ->
dynamic([e], e.hasreport == ^v["value"] and ^filter_conditions)
"retries" ->
dynamic([e], e.retries == ^v["value"] and ^filter_conditions)
"errormsg" ->
dynamic([e], ilike(e.errormsg, ^"#{v["value"]}%") and ^filter_conditions)
"forcereprocess" ->
dynamic([e], e.send == ^v["forcereprocess"] and ^filter_conditions)
"sentdatetime" ->
dynamic([e], e.send == ^v["sentdatetime"] and ^filter_conditions)
"accessionnumber" ->
dynamic([s], ilike(s.accessionnumber, ^"#{v["value"]}%") and ^filter_conditions)
"errormsg" ->
dynamic([p], ilike(p.patientname, ^"#{v["value"]}%") and ^filter_conditions)
"errormsg" ->
dynamic([p], ilike(p.patientid, ^"#{v["value"]}%") and ^filter_conditions)
"errormsg" ->
dynamic([s], ilike(s.studydate, ^"#{v["value"]}%") and ^filter_conditions)
_ ->
filter_conditions
end
end)
sort_values =
case sort do
[] -> [desc: :idstudy]
_ -> Enum.reduce(sort, [], fn v, acc ->
IO.inspect(v)
case v["field"] do
"patientname" ->
if v["dir"] == "asc" do
[asc: dynamic([_,_,p], p.patientname)]
else
[desc: dynamic([_,_,p], p.patientname)]
end
"patientid" ->
if v["dir"] == "asc" do
[asc: dynamic([_,_,p], p.patientid)]
else
[desc: dynamic([_,_,p], p.patientid)]
end
"accessionnumber" ->
if v["dir"] == "asc" do
[asc: dynamic([_,s], s.accessionnumber)]
else
[desc: dynamic([_,s], s.accessionnumber)]
end
"studydate" ->
if v["dir"] == "asc" do
[asc: dynamic([_,s], s.studydate)]
else
[desc: dynamic([_,s], s.studydate)]
end
_ ->
if v["dir"] == "asc" do
Enum.concat( acc, asc: String.to_existing_atom(v["field"]))
else
Enum.concat( acc, desc: String.to_existing_atom(v["field"]))
end
end
end)
end
queryable = from(
e in Emailtosend,
where: ^filter_conditions,
join: s in "study", on: s.idstudy == e.idstudy,
join: p in "patient", on: p.idpatient == s.idpatient,
order_by: ^sort_values,
select: %{
idemailtosend: e.idemailtosend,
idstudy: e.idstudy,
patientemail: e.patientemail,
sent: e.sent,
hasreport: e.hasreport,
retries: e.retries,
errormsg: e.errormsg,
forcereprocess: e.forcereprocess,
sentdatetime: e.sentdatetime,
accessionnumber: s.accessionnumber,
patientname: p.patientname,
patientid: p.patientid,
studydate: s.studydate
}
)
queryable
end
def list_emails(:paged, params, page, per_page) do
list_emails(params)
|> Pagination.page(page, per_page: per_page)
end
def get_email_by_id(id) do
from(e in Emailtosend, where: e.idemailtosend == ^id)
|> Repo.one()
end
def update_emailtosend(attrs) do
get_email_by_id(attrs["idemailtosend"])
|> Emailtosend.changeset(attrs)
|> Repo.update()
end
def get_next_email() do
one_day_ago = NaiveDateTime.utc_now() |> NaiveDateTime.add(-86400, :second)
from(
e in Emailtosend,
join: s in "study", on: s.idstudy == e.idstudy,
join: p in "patient", on: p.idpatient == s.idpatient,
where:
(
e.patientemail != "notiene@notiene.com" and
e.patientemail != "" and
not is_nil(e.patientemail) and
e.forcereprocess == true
) or
(
e.patientemail != "notiene@notiene.com" and
e.patientemail != "" and
not is_nil(e.patientemail) and
e.hasreport == true and
e.sent != true and
e.retries < 10
)
and e.registered >= ^one_day_ago,
limit: 1,
select: %{
idemailtosend: e.idemailtosend,
retries: e.retries,
idstudy: s.idstudy,
accessionnumber: s.accessionnumber,
patientemail: e.patientemail,
patientname: p.patientname,
patientid: p.patientid,
studydate: s.studydate
}
)
|> Repo.one()
|> IO.inspect(label: "CONTEXTO")
end
end