Commit Graph

220 Commits (Edit_Job_Profile)

Author SHA1 Message Date
ahmed.mujtaba c1e44356e9 . 2026-08-13 18:21:35 +05:00
Talha Ahmed 6eefaa2fad Tasks: recruiter-only assignees, role-gated creation, assignees API
- Assignees restricted to recruiter-role users (role id resolved from the
  roles table per request, not hardcoded); server 422s any other role on
  create and update
- New GET /tasks/assignees/fetch: active recruiter users for the picker,
  separate from /users/fetch so assigning never needs rbac_users.view
- Creation gated to system_administrator / hr_administrator / recruiter:
  allowed role ids searched from the DB and compared to the callers
  role_id, on top of the tasks.create permission tag
- manual/005_tasks_rbac_restrict.sql: permission DB follows suit -
  hiring_manager / department_head / ceo swap tasks_management for a
  view-only tasks_viewer bundle (idempotent, auto-applies at boot)
- UI: assignee dropdown lists recruiters from the new endpoint with
  required-field validation; recruiters get an assign-to-me default; the
  New Task button honours the creator roles

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 17:54:50 +05:00
ahmed.mujtaba 0899342c34 listy of pipeline done 2026-08-13 17:25:50 +05:00
Talha Ahmed b3483d9a6e Tasks domain: real backend + live screen with DB users/roles as assignees
- New backend/tasks/ package (offer/ house style): tasks table
  (title/status/priority/due_date/assignee_id -> users.id, optional
  inbox_id/job_post_id links, soft delete), routes /tasks/fetch|create|
  update|delete guarded by new tasks.* permission tags
- Assignees validated against users+roles: must exist, not deleted, not
  candidate-role; omitted assignee defaults to the caller; responses carry
  assignee_name/assignee_role from one batched join
- TASKS permission module (104 -> 112 tags); manual/004_tasks_rbac.sql
  seeds the tags + tasks_management bundle onto 6 staff roles (auto-applies
  at startup)
- Tasks.jsx cut over from seed to live: real create/complete/reopen with
  optimistic flip, two-click delete in the detail modal, assignee picker
  listing real users with roles; live sidebar badge (open-task total);
  route now requires tasks.view

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 16:27:19 +05:00
ahmed.mujtaba 4f9b03bd4f pipeline done 2026-08-13 13:29:02 +05:00
ahmed.mujtaba 1491931d95 Merge branch 'Talha' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into RecruiterHub 2026-08-13 13:01:22 +05:00
Talha Ahmed 5c0eaef86d ATS scores land on inbox tables + ats_results history; manual SQL auto-applies on boot
- inbox_messages.ats_score/ats_band written on every completed inbox score;
  inbox.ats_id always points at the current ats_results row
- ats_results now holds the supersede-chained history for BOTH inbox and
  upload scores (new candidate_id link, inbox_id nullable for uploads)
- migrations/manual/*.sql apply automatically at startup, tracked once per
  database in manual_migrations - developers just pull and boot
- 002_backfill_inbox_ats.sql backfills pre-existing scores
- Add Candidate modal: Matching-style role picker above the CV dropzone,
  and the CV is scored via /candidate/score after creation

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 20:44:46 +05:00
ahmed.mujtaba 6463b7f377 add job create 2026-08-12 20:04:45 +05:00
ahmed.mujtaba 7ded865ceb /jobs page done 2026-08-12 19:47:03 +05:00
ahmed.mujtaba 4d56f987f7 /candidate page is done and completedc 2026-08-12 18:11:42 +05:00
ahmed.mujtaba a49022b757 added finishe /candidate 2026-08-12 17:49:21 +05:00
ahmed.mujtaba c4104c0cfe . 2026-08-12 16:49:09 +05:00
ahmed.mujtaba e52912a927 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Link_ATS_with_Sys 2026-08-12 16:48:34 +05:00
ahmed.mujtaba 6dadbbc472 add Readme.md update 2026-08-12 16:45:37 +05:00
ahmed.mujtaba 6f7cfb42a7 updated mainj 2026-08-12 16:36:37 +05:00
ahmed.mujtaba 17279b567b Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Dashboard_Wiring 2026-08-12 16:16:55 +05:00
ahmed.mujtaba 29ee228eaa Dashboard seems to work 2026-08-12 16:11:36 +05:00
Talha Ahmed 8ada794b29 Merge origin/main (PR #10: manual candidate upload) into Talha
Conflict resolutions:
- backend/job/app.py: dropped duplicate pydantic import (already present below)
- backend/job/candidate/views.py: union of both sides — kept Talha's
  _recommendation/_scores_by_message helpers alongside main's manual-upload
  create_candidate, merged import lists and module-level config
- frontend/src/lib/apiClient.js: both sides made the same FormData fix;
  kept main's version that reuses the shared multipart const
- frontend/src/screens/Candidates.jsx: kept Talha's live-data screen and
  ported main's AddCandidate modal onto it — server POST via
  candidatesApi.createManual with live job posts, seed-shaped buildRow
  replaced by a candidates query invalidation; seed-only BulkAssign dropped

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 16:08:42 +05:00
ahmed.mujtaba 6e1ecb6d72 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Dashboard_Wiring 2026-08-12 14:00:07 +05:00
ahmed.mujtaba 038d89ced1 update 2026-08-12 13:57:53 +05:00
ahmed.mujtaba d38b21bb1a with filepath and fiolename 2026-08-12 13:47:19 +05:00
ahmed.mujtaba 84daea9efe /candidates completed with manual upload 2026-08-12 13:33:35 +05:00
ahmed.mujtaba 326842ebba backend manual uplaod 2026-08-11 20:34:02 +05:00
Talha Ahmed da61fe2a3a Auto-score inbox CVs against matched jobs - no manual upload needed
The decoded attachment is already the CV and the job post is already the JD, so
scoring now fires from the data we have:

- After the agent matches an inbox message, score_message_against_job runs
  inline in the match task - against the assigned job if one is set, else the
  top suggested job. Failures log and never fail the match.
- When a recruiter assigns a job post, the new inbox.score_message task is
  queued in the background so the request never waits on OpenAI.

Idempotent by (message, job): an already-completed score is never paid for
twice. Rows are attributed to the job post owner since background tasks have
no request user. CV Import and the profile Score-with-ATS button remain as
manual fallbacks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 20:03:02 +05:00
Talha Ahmed 7c593d32ce Surface real ATS scores in the talent-pool profile
Main stubbed ai_score/recommendation as None in the candidate-profile payload;
fill them from the scoring engine's candidates table, joined by inbox message
(one batched query for the list, assigned-job-preferred for the detail). The
detail payload also gains matched/missing keywords, the critique, and which job
the score was against.

Frontend: TalentPool cards and the profile hero prefer the real score over the
seed placeholder, and the profile grows a Score-with-ATS button (shown when the
candidate has an assigned job and an inbox message) that runs the existing
score_inbox pipeline and repaints via the detail refetch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 19:22:29 +05:00
Talha Ahmed eb95d7a2c0 Merge origin/main (PR #9: interviews, notes, activity, feedback + job matching) into Talha
Union resolution, same policy as the previous merge — both feature sets kept:

- app.py: scoring routes kept; main's richer GET /job/fetch (search/top/skip/ids)
  adopted, with the dual JOB_BOARD_VIEW-or-CANDIDATES_VIEW permission restored so
  recruiters with only candidate rights keep the CV Import job picker.
- candidate/models.py: Candidates (scoring) coexists with main's new Interviews,
  Notes, Activity, Feedback models.
- candidate/serializers.py: serialize_candidate kept alongside main's
  detail-mode serialize_candidate_profile.
- CandidateProfile.jsx: main's rich tabbed profile (interviews/notes/feedback/
  activity) is now THE CandidateProfile, used by TalentPool; the scored-CV modal
  moved to ScoredCandidateProfile.jsx, used by Candidates.jsx. The two payload
  shapes share almost no fields, hence two components.

Backend imports verified; frontend builds clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 19:10:45 +05:00
ahmed.mujtaba 38249cc6f2 job_matching assignment by recruiter added 2026-08-11 19:01:24 +05:00
ahmed.mujtaba 17c99d24e4 model updated 2026-08-11 18:43:41 +05:00
ahmed.mujtaba a81107cb96 frontend integrated 2026-08-11 18:19:30 +05:00
ahmed.mujtaba c726bbacbc pedning testinf 2026-08-11 17:48:00 +05:00
ahmed.mujtaba e717dbf704 . 2026-08-11 16:42:55 +05:00
Talha Ahmed 927cb37672 Merge origin/main (talent pool API + user-candidate linking) into Talha
Both sides had rewritten the candidate surface, so the merge keeps the two
features side by side instead of picking one:

- GET /candidate/fetch stays main's paginated inbox-profile listing
  (CandidateView); the scoring leaderboard moved to GET /candidate/scored/fetch
  and the frontend listCandidates() now points there.
- backend candidate views/serializers keep both CandidateScoring and
  CandidateView, serialize_candidate and serialize_candidate_profile.
- Candidates.jsx stays the scored table (Talha); TalentPool.jsx takes main's
  profile card grid; AtsMatch is exported from Candidates for TalentPool's
  modal and tolerates a missing jobTitle.
- CandidateProfile hides the Scored/Failed badge for rows that were never
  scored (talent-pool profiles).
- queryKeys.js: dropped a duplicated candidates block the auto-merge produced.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 16:16:25 +05:00
ahmed.mujtaba 3e87e1a0bc enumbs added 2026-08-11 14:01:19 +05:00
ahmed.mujtaba 54c39946d3 /talentpool integatrted 2026-08-11 13:43:21 +05:00
Talha Ahmed 9ffa1ef673 Phase 2: wire frontend candidate screens to the real scoring API
Backend: GET /job/fetch (active job posts, job-board OR candidate viewers) and
/candidate/fetch now works unscoped for the cross-job pool. Frontend: apiClient
gains FormData support; new api/candidates.js with a shared snake->camel view
mapper; CvImport is a real upload->score flow (job selector, PDF multipart to
/candidate/score, per-file results, no more simulation); TalentPool and
Candidates render the persisted pool with job/skill/source/ATS filters; the ATS
modal shows the real critique and matched/missing skills; CandidateProfile
keeps only tabs the backend can back. Screens hide affordances with no backing
column instead of rendering placeholders (Inbox precedent).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 22:27:20 +05:00
Talha Ahmed a68d4bc2f6 Integrate bulk-ats scoring into backend: candidates table + scoring routes
Embeds the tested bulk-ats engine (pip install -e ., app.services.*) rather
than duplicating it. New Candidates table (auto-migrated) persists one row per
CV per job, deduped on (job_id, content_sha256) so re-scores update in place.
CandidateScoring service extracts (pypdf off-loop), despaces, scores with
bounded concurrency + cache priming via llm_setup's shared client, and
isolates per-file failures as failed rows. Routes: /candidate/score (uploads),
/candidate/score_inbox (decoded attachments), /candidate/fetch,
/candidate/fetch_by_id. Complements the agent inbox-match flow: it routes,
this scores.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 21:44:04 +05:00
ahmed.mujtaba da3077c302 talet pool api done 2026-08-10 21:01:51 +05:00
ahmed.mujtaba 1d8b167606 readme file 2026-08-10 17:23:10 +05:00
ahmed.mujtaba 4d340fd6d5 agent coide simplifgication 2026-08-10 16:24:47 +05:00
ahmed.mujtaba 08068b2b18 Linking user to candidate to job 2026-08-10 16:19:29 +05:00
ahmed.mujtaba 09fdb39109 IS READ UPDATE 2026-08-10 14:06:54 +05:00
ahmed.mujtaba 36be406f92 WIRED WITH FRONTEND 2026-08-07 20:49:00 +05:00
ahmed.mujtaba 9f6926b1e1 PROCESSED ADN REJECTED TAB TOO with their own specific conditions 2026-08-07 20:35:27 +05:00
ahmed.mujtaba 4bd02cefb0 email response handled 2026-08-07 20:16:54 +05:00
ahmed.mujtaba 40e40a3864 isRead working 2026-08-07 19:58:53 +05:00
ahmed.mujtaba 3ae716a8c4 frontend all aplications 2026-08-07 19:17:16 +05:00
ahmed.mujtaba 52b76bb1cf added all aplicants 2026-08-07 19:03:23 +05:00
ahmed.mujtaba 8b4ebb1bb8 Background saving terminated 2026-08-07 18:26:37 +05:00
ahmed.mujtaba 588afd0a28 . 2026-08-06 20:21:48 +05:00
ahmed.mujtaba dcf0bf5d50 mapped Candidate CV with job_Post_id 2026-08-06 18:53:18 +05:00
ahmed.mujtaba cc92dc744f LLM Setup for Email 2026-08-06 16:29:17 +05:00
ahmed.mujtaba 07a75e2ee6 customScheduled 2026-08-06 13:57:50 +05:00
ahmed.mujtaba cc6c458df2 File/CV TEXT Extraction 2026-08-06 13:38:53 +05:00
ahmed.mujtaba f884ae1d1d Api for @router.post("/job/post-job")
done
2026-08-05 20:41:39 +05:00
ahmed.mujtaba c79024160c LINKEDIN POST CONFIG DONE AND TESTED 2026-08-05 20:09:34 +05:00
ahmed.mujtaba 3991bd60a3 Candidate 2026-08-05 18:25:34 +05:00
ahmed.mujtaba 92c06d9335 login confirmation and forget password done 2026-08-04 20:40:42 +05:00
ahmed.mujtaba 31592dc7f1 # this is for password hashing and dehashing
comment
2026-08-04 18:22:58 +05:00
ahmed.mujtaba 9c417b0325 asssignment role api 2026-08-04 17:38:03 +05:00
ahmed.mujtaba b84cc27d62 permission grandted 2026-08-04 17:14:45 +05:00
ahmed.mujtaba 8bdd740404 login corrected 2026-08-04 16:44:43 +05:00
ahmed.mujtaba ef07694254 jwt token integrated 2026-08-04 14:33:07 +05:00
ahmed.mujtaba caab412f96 email tem work now need uses to create the system with rback 2026-08-03 21:29:32 +05:00
ahmed.mujtaba d48048bb7a filepath added 2026-08-03 21:15:43 +05:00
ahmed.mujtaba cd1693fd43 filename added 2026-08-03 21:00:26 +05:00
ahmed.mujtaba a8816afc08 .. 2026-08-03 20:44:35 +05:00
ahmed.mujtaba 04a6264bb0 . 2026-08-03 20:35:47 +05:00
ahmed.mujtaba a9f0b32eea pdf product converted 2026-08-03 19:55:01 +05:00
ahmed.mujtaba c47a380d3d commiot 2026-08-03 19:10:54 +05:00
ahmed.mujtaba bb935d4708 stashed 2026-08-03 15:42:38 +05:00