Do
Use
Assign/Reassignactions so ownership, SLA fields, and ToDo artifacts stay consistent.Move state with named actions (
Mark Contacted,Qualify,Archive) so server transition rules and metrics are enforced.
Capture, assign, and track inquiry follow-up with SLA visibility, assignment ownership, and conversion into Student Applicant.
School master data exist for scoped inquiries.Inquiry is the general inbound intake record for website visitors. It can represent admission interest, general questions, media requests, or any other first-contact message that needs managed follow-up.
Inquiry gives teams visibility on response speed and ownership so no inbound request disappears into email threads.
| State | Meaning | How It Is Reached (Conditions) |
|---|---|---|
New |
First capture, not yet assigned | Set automatically on insert if empty (after_insert). |
Assigned |
Owner set, follow-up deadline active | Reached through assignment flows (assign_inquiry / reassign_inquiry -> mark_assigned) with admissions permission and a valid admissions assignee. |
Contacted |
First outreach completed | Reached from New or Assigned through mark_contacted with admissions permission. Can also be triggered by ToDo-close automation when the current assignee closes the linked task. |
Qualified |
Confirmed as admissions-ready | Reached only from Contacted through mark_qualified with admissions permission. |
Archived |
Closed terminal state | Reached from any non-archived state through archive with admissions permission. |
Allowed transitions are strictly server-validated:
New -> Assigned or ContactedAssigned -> ContactedContacted -> QualifiedArchived state -> ArchivedUse Assign/Reassign actions so ownership, SLA fields, and ToDo artifacts stay consistent.
Move state with named actions (Mark Contacted, Qualify, Archive) so server transition rules and metrics are enforced.
Manually edit workflow fields to skip required transitions.
Treat every inquiry as admissions conversion; convert only when it is actually admissions-relevant.
Assign, Reassign, Mark Contacted, Qualify, Archive, Invite to Apply)Mark Contacted is available in Assigned state for both Admission Officer and Admission Manager/apply/inquiry creates Inquiry records from visitor submissions.Notify Admission Manager on new InquiryInquiry Assigned on assignee changeinquiry.follow_up.act.first_contact routes to the inquiry follow-up focus actioncreate_contact_from_inquiry links/creates Contact.ifitwala_ed.admission.admission_utils.from_inquiry_inviteContact anchor and carries it into Student Applicant.applicant_contact when conversion is requestedUser; portal invite is a separate button on Student Applicant/staff/analytics/inquiryifitwala_ed.api.inquiry.get_dashboard_data and related filter endpointsrun_hourly_sla_sweep -> check_sla_breaches) with per-doctype column validation, legacy due-date backfill for Inquiry rows, and run summary cache at admissions:sla_sweep:last_run.Capture inbound request as New (admission-related or not).
Assign ownership (Assigned) when coordinated follow-up is needed.
Mark as Contacted when first outreach is completed and metrics are stamped.
If it is admissions-relevant and ready, move to Qualified and optionally invite/create a Student Applicant.
Archive completed/closed paths through Archived (including non-admissions inquiries like general or media requests).
Workflow transitions are server-validated. Teams should follow the canonical state path instead of manually editing status fields.
Invite to Apply on Inquiry creates the Student Applicant record in Invited and links Contact anchor fields, but it does not provision applicant portal login credentials. After conversion, open the applicant and use Actions -> Invite Applicant Portal (or Resend Portal Invite) to pick/add a Contact email and trigger invite_applicant(student_applicant, email).
DocType schema file: ifitwala_ed/admission/doctype/inquiry/inquiry.json
Controller file: ifitwala_ed/admission/doctype/inquiry/inquiry.py
Required fields (reqd=1): none at schema level; controller/workflow rules enforce operational completeness where applicable.
Lifecycle hooks in controller: validate, before_insert, after_insert, before_save
Operational/public methods: mark_assigned, mark_qualified, archive, invite_to_apply, set_contact_metrics, create_contact_from_inquiry, mark_contacted
Workflow-state contract: only canonical Inquiry states are accepted (New, Assigned, Contacted, Qualified, Archived); no legacy state alias normalization in Inquiry controller or Inquiry Desk/list scripts.
DocType: Inquiry (ifitwala_ed/admission/doctype/inquiry/)
Autoname: INQ-{YYYY}-{MM}-{DD}-{##}
Desk surfaces:
ifitwala_ed/admission/doctype/inquiry/inquiry.jsifitwala_ed/admission/doctype/inquiry/inquiry_list.jsifitwala_ed/admission/workspace/admission/admission.jsonWeb form surface:
ifitwala_ed/admission/web_form/inquiry/inquiry.jsonapply/inquiry (public form)hooks.py webform_include_css/js for both Inquiry and Registration of Interest, using app public paths: public/css/admissions_webform_shell.css and public/js/admissions_webform_shell.jsStaff analytics (SPA):
ifitwala_ed/ui-spa/src/pages/staff/analytics/InquiryAnalytics.vue/staff/analytics/inquiry via ifitwala_ed/ui-spa/src/router/index.tsifitwala_ed/ui-spa/src/lib/admission.ts calling inquiry analytics APIsLifecycle hooks:
before_insert: stamps submitted_atafter_insert: ensures workflow_state = New, notifies managersbefore_save: computes deadlines and SLA statusValidation:
student_applicant link immutabilityWhitelisted methods on document:
mark_qualifiedarchiveinvite_to_applycreate_contact_from_inquirymark_contactedConversion nuance:
invite_to_apply enforces Qualified statefrom_inquiry_invite, available from Contacted and Qualified in client logicUtility endpoints (ifitwala_ed/admission/admission_utils.py):
assign_inquiryreassign_inquiryget_admission_officersschool_by_organization_scope_queryfrom_inquiry_inviteAnalytics API endpoints (ifitwala_ed/api/inquiry.py):
get_dashboard_dataget_inquiry_typesget_inquiry_organizationsget_inquiry_schoolsacademic_year_link_queryadmission_user_link_queryFocus API endpoints (ifitwala_ed/api/focus.py):
list_focus_items (includes Inquiry action items assigned to current user)get_focus_context (returns Inquiry context payload for focus routing)mark_inquiry_contacted (named focus action endpoint delegating to Inquiry.mark_contacted)| Role | Read | Write | Create | Delete | Notes |
|---|---|---|---|---|---|
System Manager |
Yes | Yes | Yes | Yes | Full Desk access |
Admission Manager |
Yes | Yes | Yes | Yes | Full Desk access |
Admission Officer |
Yes | Yes | Yes | Yes | Full Desk access |
Academic Admin |
Yes | No | No | No | Read-only in DocType permissions |
Action-level guard in server code: lifecycle and assignment methods enforce admissions-role checks.
Inquiry as ref_doctype.