183 lines
5.4 KiB
Elixir
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
|