Surveys Models ============== Survey ------ Represents a scheduled site survey linked to a lead. The survey determines whether the customer's site is ready for charger installation. .. list-table:: :header-rows: 1 :widths: 20 20 20 40 * - Field - Type - Constraints - Description * - id - UUIDField - PK, default=uuid4 - Primary key * - survey_id - CharField(20) - unique, auto-generated - Human-readable ID (e.g., ``SRV-2026-00123``) * - lead - OneToOneField(Lead) - not null, on_delete=CASCADE - Associated lead * - scheduled_date - DateField - not null - Planned survey date * - scheduled_time_slot - CharField(20) - choices: ``morning``, ``afternoon``, ``evening`` - Time window * - status - CharField(20) - choices, default='scheduled' - Survey lifecycle state * - customer_confirmed - BooleanField - default=False - Customer confirmed availability * - created_by - ForeignKey(User) - not null, on_delete=PROTECT - Central Ops who scheduled * - created_at - DateTimeField - auto_now_add - Creation timestamp * - updated_at - DateTimeField - auto_now - Last update **Status choices**: ``scheduled``, ``confirmed``, ``in_progress``, ``completed``, ``report_submitted``, ``reviewed_approved``, ``reviewed_rejected``, ``rescheduled``, ``cancelled`` **Indexes**: ``status``, ``scheduled_date``, ``created_by`` SurveyAssignment ---------------- Links a survey to a field team. Supports both primary assignments and emergency backup reassignments. .. list-table:: :header-rows: 1 :widths: 20 20 20 40 * - Field - Type - Constraints - Description * - id - UUIDField - PK, default=uuid4 - Primary key * - survey - ForeignKey(Survey) - not null, on_delete=CASCADE - Parent survey * - team - ForeignKey(Team) - not null, on_delete=PROTECT - Assigned field team * - assigned_by - ForeignKey(User) - not null, on_delete=PROTECT - Central Ops who assigned * - is_primary - BooleanField - default=True - Primary assignment vs emergency backup * - assigned_at - DateTimeField - auto_now_add - Assignment timestamp * - status - CharField(20) - choices: ``assigned``, ``accepted``, ``en_route``, ``on_site``, ``completed``, ``cancelled`` - Assignment state SurveyReport ------------ Detailed site assessment submitted by the field team after conducting the survey. .. list-table:: :header-rows: 1 :widths: 20 20 20 40 * - Field - Type - Constraints - Description * - id - UUIDField - PK, default=uuid4 - Primary key * - survey - OneToOneField(Survey) - not null, on_delete=CASCADE - Parent survey * - submitted_by - ForeignKey(User) - not null, on_delete=PROTECT - Field team member who submitted * - site_ready - BooleanField - not null - Overall: is the site installation-ready? * - load_adequate - BooleanField - not null - Electrical load sufficient for charger * - earthing_present - BooleanField - not null - Proper earthing exists at site * - civil_work_needed - BooleanField - default=False - Civil work required before installation * - civil_work_details - TextField - blank - Description of civil work needed * - electrical_notes - TextField - blank - Electrical observations and recommendations * - general_notes - TextField - blank - General site observations * - reviewed_by - ForeignKey(User) - nullable, on_delete=SET_NULL - Central Ops reviewer * - review_status - CharField(20) - choices: ``pending``, ``approved``, ``rejected``, default='pending' - Review outcome * - review_notes - TextField - blank - Reviewer comments * - submitted_at - DateTimeField - auto_now_add - Submission timestamp * - reviewed_at - DateTimeField - nullable - Review timestamp SurveyMedia ------------ Photos and videos captured during a survey. .. list-table:: :header-rows: 1 :widths: 20 20 20 40 * - Field - Type - Constraints - Description * - id - UUIDField - PK, default=uuid4 - Primary key * - survey - ForeignKey(Survey) - not null, on_delete=CASCADE - Parent survey * - media_type - CharField(20) - choices: ``photo``, ``video`` - Media type * - file - FileField - not null, upload_to='survey_media/' - Media file * - caption - CharField(255) - blank - Description of what the media shows * - uploaded_by - ForeignKey(User) - not null, on_delete=PROTECT - Field team member who uploaded * - uploaded_at - DateTimeField - auto_now_add - Upload timestamp