Skip to content

Commit 3c09eec

Browse files
committed
miscellanea
1 parent 4943856 commit 3c09eec

File tree

5 files changed

+86
-5
lines changed

5 files changed

+86
-5
lines changed

lib/algora/accounts/schemas/user.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ defmodule Algora.Accounts.User do
123123

124124
field :location_meta, :map
125125
field :location_iso_lvl4, :string
126+
field :grad_year, :integer
126127

127128
field :email_recipients, {:array, :map}, default: []
128129
field :language_contributions_synced, :boolean, default: false
@@ -374,7 +375,8 @@ defmodule Algora.Accounts.User do
374375
:seeking_bounties,
375376
:seeking_jobs,
376377
:hourly_rate_min,
377-
:hours_per_week
378+
:hours_per_week,
379+
:preferences
378380
])
379381
|> validate_required([:handle])
380382
|> validate_handle()

lib/algora/interviews/interviews.ex

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ defmodule Algora.Interviews do
88
alias Algora.Interviews.JobInterview
99
alias Algora.Repo
1010

11+
require Logger
12+
1113
@doc """
1214
Returns the list of job interviews.
1315
@@ -70,9 +72,26 @@ defmodule Algora.Interviews do
7072
7173
"""
7274
def create_job_interview(attrs \\ %{}) do
73-
%JobInterview{}
74-
|> JobInterview.changeset(attrs)
75-
|> Repo.insert()
75+
case %JobInterview{}
76+
|> JobInterview.changeset(attrs)
77+
|> Repo.insert() do
78+
{:ok, interview} ->
79+
# Schedule reminder emails if the interview has a scheduled time
80+
# if Map.get(attrs, :scheduled_at) || Map.get(attrs, "scheduled_at") do
81+
# case AlgoraCloud.Talent.Jobs.SendInterviewReminderEmail.schedule_reminders(interview.id) do
82+
# {:ok, results} ->
83+
# Logger.info("Scheduled interview reminders for interview #{interview.id}: #{inspect(results)}")
84+
85+
# {:error, reason} ->
86+
# Logger.warning("Failed to schedule interview reminders for interview #{interview.id}: #{inspect(reason)}")
87+
# end
88+
# end
89+
90+
{:ok, interview}
91+
92+
{:error, changeset} ->
93+
{:error, changeset}
94+
end
7695
end
7796

7897
@doc """
@@ -156,6 +175,38 @@ defmodule Algora.Interviews do
156175
attrs
157176
end
158177

159-
create_job_interview(attrs)
178+
case create_job_interview(attrs) do
179+
{:ok, interview} ->
180+
# Additional scheduling logic is handled in create_job_interview
181+
{:ok, interview}
182+
183+
{:error, changeset} ->
184+
{:error, changeset}
185+
end
186+
end
187+
188+
@doc """
189+
Upserts a job interview for a user and job posting.
190+
If an interview already exists, returns the existing one.
191+
If not, creates a new one with initial status.
192+
193+
## Examples
194+
195+
iex> upsert_job_interview(user_id, job_posting_id)
196+
{:ok, %JobInterview{}}
197+
198+
"""
199+
def upsert_job_interview(user_id, job_posting_id) do
200+
case Repo.get_by(JobInterview, user_id: user_id, job_posting_id: job_posting_id) do
201+
nil ->
202+
create_job_interview(%{
203+
user_id: user_id,
204+
job_posting_id: job_posting_id,
205+
status: :initial
206+
})
207+
208+
existing_interview ->
209+
{:ok, existing_interview}
210+
end
160211
end
161212
end

lib/algora/matches/matches.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,15 @@ defmodule Algora.Matches do
276276
defp maybe_preload(query, preload_list) do
277277
preload(query, ^preload_list)
278278
end
279+
280+
@doc """
281+
Check if a match is considered "new" (within the last 7 days and not yet approved/bookmarked by company).
282+
"""
283+
def is_match_new?(match) do
284+
one_week_ago = DateTime.add(DateTime.utc_now(), -7, :day)
285+
286+
is_nil(match.company_approved_at) &&
287+
is_nil(match.company_bookmarked_at) &&
288+
DateTime.after?(match.inserted_at, one_week_ago)
289+
end
279290
end

lib/algora_web/live/org/settings_live.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ defmodule AlgoraWeb.Org.SettingsLive do
140140
</.card_content>
141141
</.card>
142142
143+
<.card :if={@current_org.contract_signed}>
144+
<.card_header>
145+
<.card_title>Candidate preferences</.card_title>
146+
</.card_header>
147+
<.card_content>
148+
<.simple_form for={@form} phx-change="validate" phx-submit="save">
149+
<div class="flex flex-col gap-6">
150+
<.input field={@form[:preferences]} label="Preferences" type="textarea" rows={10} />
151+
<.button class="ml-auto">Save</.button>
152+
</div>
153+
</.simple_form>
154+
</.card_content>
155+
</.card>
156+
143157
<.card>
144158
<.card_header>
145159
<.card_title>Bot Templates</.card_title>

lib/algora_web/router.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ defmodule AlgoraWeb.Router do
3939
redirect(from, to, :temporary)
4040
end
4141

42+
redirect("/create", "/anything", :permanent)
43+
redirect("/create/*path", "/anything/*path", :permanent)
44+
4245
scope "/" do
4346
forward "/asset", AlgoraWeb.Plugs.RewriteAssetsPlug, upstream: :assets_url
4447
forward "/storage", AlgoraWeb.Plugs.RewriteStoragePlug, upstream: :storage_url

0 commit comments

Comments
 (0)