Commit Graph

458 Commits (e64e6849bb0b04db8dc9cd97a76f2220f3201df0)

Author SHA1 Message Date
ahmed.mujtaba 6979eb4b83 removed the /yml files 2026-09-07 19:46:25 +05:00
ahmed.mujtaba ad6f8ba121 s3 lionk done
CI / checks (push) Failing after 2m9s Details
CI / checks (pull_request) Failing after 2m4s Details
2026-09-07 19:32:49 +05:00
ahmed.mujtaba 7c9e18741d applied 10 cache
CI / checks (push) Failing after 1m58s Details
CI / checks (pull_request) Failing after 1m53s Details
2026-09-07 18:55:42 +05:00
ahmed.mujtaba 5cc1dc1997 Nonclick untile load complete
CI / checks (push) Failing after 1m50s Details
CI / checks (pull_request) Failing after 1m55s Details
2026-09-07 18:51:49 +05:00
ahmed.mujtaba d00ebcf6f5 filter appliede
CI / checks (push) Failing after 1m57s Details
CI / checks (pull_request) Failing after 1m53s Details
2026-09-07 18:42:15 +05:00
ahmed.mujtaba 9036a48098 Merge pull request 'SQS_BROKER' (#78) from SQS_BROKER into main
Deploy to S3 / checks (push) Failing after 1m54s Details
Deploy to S3 / deploy (push) Has been skipped Details
CI / checks (push) Failing after 2m0s Details
CI / checks (pull_request) Failing after 1m56s Details
Reviewed-on: #78
2026-09-07 12:54:46 +00:00
ahmed.mujtaba cc504fed65 Merge branch 'main' into SQS_BROKER
CI / checks (push) Failing after 1m50s Details
CI / checks (pull_request) Failing after 2m6s Details
2026-09-07 12:54:40 +00:00
ahmed.mujtaba ded1b9053d dashboiard sheet export
CI / checks (push) Failing after 1m55s Details
CI / checks (pull_request) Failing after 1m47s Details
2026-09-07 17:53:49 +05:00
ahmed.mujtaba 41f46c2c39 dashboard sheet added 2026-09-07 17:36:36 +05:00
ahmed.mujtaba 5b6588f90a Merge branch 'SQS_BROKER' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER
CI / checks (push) Failing after 1m54s Details
2026-09-07 17:32:23 +05:00
ahmed.mujtaba 3dd716c3d3 added onhold tab that sorts the unmatched cvs 2026-09-07 17:32:20 +05:00
ahmed.mujtaba 6998563aa2 Merge pull request 'sewt all limit' (#77) from SQS_BROKER into main
Deploy to S3 / checks (push) Failing after 2m36s Details
Deploy to S3 / deploy (push) Has been skipped Details
Reviewed-on: #77
2026-09-07 11:52:12 +00:00
ahmed.mujtaba c141362056 Merge branch 'main' into SQS_BROKER
CI / checks (push) Failing after 2m35s Details
CI / checks (pull_request) Failing after 2m28s Details
2026-09-07 11:52:00 +00:00
ahmed.mujtaba e378b323b9 sewt all limit
CI / checks (push) Failing after 2m27s Details
CI / checks (pull_request) Failing after 2m32s Details
2026-09-07 16:47:44 +05:00
ahmed.mujtaba 3d032a5069 Merge pull request 'reapplied logic correct' (#76) from SQS_BROKER into main
Deploy to S3 / checks (push) Failing after 2m28s Details
Deploy to S3 / deploy (push) Has been skipped Details
Reviewed-on: #76
2026-09-07 10:56:40 +00:00
ahmed.mujtaba 0ede681a30 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER
CI / checks (push) Failing after 2m33s Details
CI / checks (pull_request) Failing after 2m29s Details
2026-09-07 15:56:10 +05:00
ahmed.mujtaba 7ceecdb6c7 reapplied logic correct
CI / checks (push) Failing after 2m41s Details
CI / checks (pull_request) Failing after 2m37s Details
2026-09-07 15:54:47 +05:00
ahmed.mujtaba db1dcb154c Merge pull request 'cronjjob implementedd' (#75) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 32s Details
Reviewed-on: #75
2026-09-07 09:58:09 +00:00
ahmed.mujtaba f692680c6e Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-07 14:57:13 +05:00
ahmed.mujtaba 82686f0bdf cronjjob implementedd 2026-09-07 14:56:03 +05:00
ahmed.mujtaba 57167e77ba Merge pull request 'corect timezone' (#74) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 37s Details
Reviewed-on: #74
2026-09-07 09:21:32 +00:00
ahmed.mujtaba 53b1d4d238 corect timezone 2026-09-07 14:19:51 +05:00
ahmed.mujtaba 3086f3fca7 Merge pull request 'SQS_BROKER' (#73) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 39s Details
Reviewed-on: #73
2026-09-07 09:05:41 +00:00
ahmed.mujtaba 20f03aad3c Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-07 14:00:09 +05:00
ahmed.mujtaba 2e0e6b1dda notification 2026-09-07 13:55:32 +05:00
Talha Ahmed 5b29e2b592 CV Bank: replace Talent Pool with a searchable, ranked bank of stored CVs
CI / checks (push) Failing after 3m12s Details
Deploy to S3 / checks (push) Failing after 2m24s Details
Deploy to S3 / deploy (push) Has been skipped Details
The bank used to be write-only: a CV uploaded with no job carried only its
full text, so nothing could search or rank it. Now the employment agent's
extraction (title, company, education, plus new skills and years_experience,
both clamped to what the resume actually states) is stored on the row, and
the bank is ranked against a job the moment that job opens.

- New CV Bank screen at /cvbank replaces Talent Pool; the inline bank card
  moves out of CV Import. One table, two populations: speculative uploads,
  and silver medalists (rejected applicants scoring >= CV_BANK_SILVER_FLOOR,
  read live from their application rather than copied).
- matching/ranking.py: the tier-1 keyword ranker moves out of
  talent/plugins.py so Find Talent and the bank share one implementation;
  talent/plugins.py re-exports it and its numbers are unchanged.
- Taskiq tasks in job.candidate.bank_tasks: backfill profiles for CVs
  banked before extraction existed, and rank the bank when a job opens so
  recruiters are told about matches above CV_BANK_SUGGEST_THRESHOLD.
  Retention (CV_BANK_RETENTION_MONTHS) is stamped on the row at upload; the
  sweep flags expired rows and never deletes.
- Migrations 029 (bank profile columns) and 030 (per-job bank matches).
- Routes: POST /candidate/cv-bank/score, GET /candidate/cv-bank/suggestions.
- README: The CV Bank, plus the retention and deletion policy.

Also in this change:
- Inbox, Sheet Forms: has_linkedin / has_resume filters, tri-valued so
  "no link" is a real filter and NULL rows are kept in it; tab badge counts
  now narrow with the list and the search box.
- Hiring-manager candidate rows carry the ATS score and band.
- Tests: analytics dashboard merge logic, employment extraction clamps,
  form-data filters, manager candidate serializer, CV Bank mapper.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 13:39:20 +05:00
Talha Ahmed 05ca7bce8f Merge remote-tracking branch 'origin/main' into Talha
# Conflicts:
#	backend/inbox/views.py
#	backend/job/candidate/serializers.py
#	backend/job/candidate/views.py
#	frontend/src/api/candidates.js
#	frontend/src/screens/Candidates.jsx
#	frontend/src/screens/Inbox.jsx
2026-09-07 13:19:39 +05:00
ahmed.mujtaba ac49a903ae . 2026-09-04 21:00:54 +05:00
ahmed.mujtaba 0d4f5be565 Merge pull request 'frontend bar' (#72) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 33s Details
Reviewed-on: #72
2026-09-04 14:27:56 +00:00
ahmed.mujtaba 74ad8dd7e1 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-04 19:26:11 +05:00
ahmed.mujtaba 40c25caeff frontend bar 2026-09-04 19:24:13 +05:00
ahmed.mujtaba 7e11d136e8 Merge pull request 'Implement application history retrieval for candidates and enhance reapplication tracking' (#71) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 33s Details
Reviewed-on: #71
2026-09-04 14:08:39 +00:00
ahmed.mujtaba 6ae6f0538d Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-04 19:07:53 +05:00
ahmed.mujtaba 6b4ad6b0dd Implement application history retrieval for candidates and enhance reapplication tracking
- Added methods to retrieve application history by email across various sources (inbox, manual uploads, form data).
- Introduced new serializers for application history items and overall history.
- Updated candidate and inbox views to include application history in responses.
- Enhanced frontend components to display reapplication badges and previous application details.
- Adjusted API endpoints to support fetching application history based on email input.
2026-09-04 19:06:22 +05:00
ahmed.mujtaba 14a2817afd Merge pull request 'approved permission' (#70) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 32s Details
Reviewed-on: #70
2026-09-04 13:00:19 +00:00
ahmed.mujtaba b33aa0c322 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-04 17:59:48 +05:00
ahmed.mujtaba c5d603c621 approved permission 2026-09-04 17:58:19 +05:00
ahmed.mujtaba 0365ee3a8f Merge pull request 'permission module base applied' (#69) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 37s Details
Reviewed-on: #69
2026-09-04 11:49:42 +00:00
ahmed.mujtaba 3cdfdd4c4c Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-04 16:49:14 +05:00
ahmed.mujtaba 4086bbdeb4 permission module base applied 2026-09-04 16:48:30 +05:00
ahmed.mujtaba 6a1f5ba9fa Merge pull request 'SQS_BROKER' (#68) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 33s Details
Reviewed-on: #68
2026-09-04 11:12:47 +00:00
ahmed.mujtaba c353f41b20 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into SQS_BROKER 2026-09-04 16:11:53 +05:00
ahmed.mujtaba 0558af52c4 . 2026-09-04 16:10:56 +05:00
Talha Ahmed 8dcd262dc4 Repair CVs that pypdf extracts one character per line
CI / checks (push) Successful in 2m46s Details
Reported as "LinkedIn is not showing though the resume has it". The LinkedIn
was never the problem.

Traced on the live application (Mohammad Raza, inbox row 2f81cebc). Its stored
resume_text is 4,555 characters over 2,278 lines, and every one of those lines
is exactly one character long. The CV really does say

    LinkedIn:linkedin.com/in/mohammad-raza-digital-marketer

but it is stored as forty separate lines, so nothing that looks for a substring
can find it. Not a link annotation, not an image, not OCR: pypdf's default mode
breaks after every glyph on PDFs whose author positioned each one separately,
which design tools do routinely.

It survived review because a model reads that text fine. The candidate was
classified, matched and scored normally. What fails, silently, is every check
that asks "does this string appear in the resume":

  - slugs_from_text finds no profile, so linkedin_slug is stored empty
  - _clean_skills drops every skill, since each must appear in the text
  - the company and education clamps drop theirs for the same reason
  - verify_matched_keywords drops every matched keyword in the ATS engine

despace_line could not help: it rebuilds glyphs padded *within* a line, and
here there is nothing left on a line to rebuild.

is_glyph_fragmented measures the giveaway — the share of non-empty lines that
are a single character — and extract_pdf_text re-extracts with pypdf's layout
mode when it trips. Layout mode is the fallback, never the default: it is
slower and pads ordinary documents with alignment whitespace, so a CV that
extracts cleanly today is untouched. The fallback is checked before it is
trusted; fragmented text still scores a candidate, empty text fails them.

Both extractors had the defect, so the helpers live in app/services/pdf.py,
which owns PDF handling and is already imported by the recruiting path.

Measured against that real CV, before and after:

    slugs_from_text        []            -> ['mohammad-raza-digital-marketer']
    profile_url_from_text  None          -> https://www.linkedin.com/in/...
    lines                  2278          -> 61
    single-char lines      2278          -> 0
    'performance' found    False         -> True
    'google ads' found     False         -> True

Existing rows keep their broken text; extraction runs at ingest. Re-running
the match on affected rows is what backfills them.

.gitignore had `tests/**` twice and `/backend/tests/**` once. Both suites are
tracked and both run in CI, so the rules were inert for existing files and did
nothing but swallow new ones — this test was invisible to `git status` until
they went. That is also why they are removed rather than negated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:29:05 +05:00
ahmed.mujtaba d541b82067 Merge pull request 'deparmetn req1 maanged' (#67) from SQS_BROKER into main
Deploy to S3 / deploy (push) Successful in 35s Details
Reviewed-on: #67
2026-09-04 08:08:28 +00:00
ahmed.mujtaba 6ebdd7c5ba deparmetn req1 maanged 2026-09-04 13:07:18 +05:00
Talha Ahmed 0d209315ab Candidates: show ATS score, stage and recruiter instead of just an email column
Deploy to S3 / deploy (push) Successful in 34s Details
The recruiter table was user-centric (GET /candidate/fetch/users), so it could
only ever render account fields - name, email, created date. Everything a
recruiter actually triages on lives on the application, not the user.

Point the table at GET /candidate/fetch and map application rows through a new
toApplicationListView, adding Job, ATS (score + band chip), Stage and Recruiter
columns. Stage and band become real filters; the dead Department facet is gone.

Manual uploads came back unscored because the list path never joined the ATS
results, so attach scores there and expose ai_score/recommendation from the
manager serializer, deriving the band from the score when the model omitted it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 20:59:04 +05:00
Talha Ahmed 0eff43def4 Candidates: show ATS score, stage and recruiter instead of just an email column
CI / checks (push) Successful in 2m40s Details
The recruiter table was user-centric (GET /candidate/fetch/users), so it could
only ever render account fields - name, email, created date. Everything a
recruiter actually triages on lives on the application, not the user.

Point the table at GET /candidate/fetch and map application rows through a new
toApplicationListView, adding Job, ATS (score + band chip), Stage and Recruiter
columns. Stage and band become real filters; the dead Department facet is gone.

Manual uploads came back unscored because the list path never joined the ATS
results, so attach scores there and expose ai_score/recommendation from the
manager serializer, deriving the band from the score when the model omitted it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 20:45:35 +05:00
Talha Ahmed 8540577531 Fix inbox loading stall
Deploy to S3 / deploy (push) Successful in 34s Details
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 19:59:26 +05:00
Talha Ahmed 22b2a7323f Fix inbox loading stall
CI / checks (push) Successful in 2m31s Details
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 19:53:23 +05:00