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
 |