When somebody applied is lost: applied_at is set only on "Applied", and no form lets you say the date #222
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Postulo/postulo#222
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Backfilled or after-the-fact applications disappear from Insights and from the employment-office report, or land in the wrong month. Found in the 2026-09-15 code audit.
1.
applied_atis set only on the literal Applied statusapplications/services.py:96-98sets it only whennew_status == APPLIED.apply_to_listingcreates a DRAFT and jumps straight to the chosen status (services.py:144-157). Choosing Interviewing, Rejected, Offer and so on at intake (forms.py:115) or through the API (api/schemas.py:203) leavesapplied_atnull._catch_updoes the same when an interview is held on a draft (services.py:389-394).core/csv_import.py:841), which shows the intent.What goes wrong:
ever_applied(analytics.py:223): the sent count, reply and interview times, sources and industries.analytics.py:228-236), so a stage can exceed 100% of Applied.reports.py:404-412), from by-month figures, from "sent recently", and from the APIsincefilter.2. No way to say when you applied
ApplicationDetailsForm,ApplicationForm, capture review's "already applied" ("marked as applied today",jobs/capture_views.py:200-206), or the API.3. CSV import decides by the date, not by the status
ParsedRow.becomesdepends only onapplied_at(csv_import.py:673-677).:818-824).:841-843).Proposal
change_status, setapplied_aton the first move out of DRAFT to any sent status, usingoccurred_at.applied_atfrom each application's earliest non-draftto_statusevent.occurred_at. Correcting it later goes through a service that writes a timeline entry.