{"title":"Auto Insurance Proposal Request","description":"Susman Insurance Agency — auto insurance proposal request. Please have driver licenses, VINs, and odometer readings ready.","logoPosition":"right","showQuestionNumbers":"off","showProgressBar":"top","progressBarType":"pages","checkErrorsMode":"onValueChanged","widthMode":"responsive","firstPageIsStarted":false,"completeText":"Submit Application","pageNextText":"Next","pagePrevText":"Back","_migration":{"source":"form-auto-insurance/includes/class-sir-form-data.php::get_field_definitions() (authoritative) reconciled with assets/js/*.js","nameConvention":"Old dotted field keys are converted to dot-free SurveyJS names by replacing '.' with '__' (double underscore) so that visibleIf expressions resolve correctly. Dynamic-panel inner questions keep their bare suffix; old key vehicles.0.vin maps to SurveyJS path vehicles[0].vin. See MIGRATION-NOTES.md for the full key map.","requiredHardBlock":"Every applicable required question is a hard block on submit (old sir-app.js submitApplication + server is_field_applicable). SurveyJS isRequired reproduces this; the engine MUST also enforce required-when-applicable server-side.","ageFunction":"Driver student/mature age gates use the SurveyJS built-in age() expression function; the engine's Survey Core build must support it (available in survey-core for years)."},"pages":[{"name":"about_you","title":"About You","elements":[{"type":"text","name":"about_you__name","title":"Full Name","isRequired":true},{"type":"dropdown","name":"about_you__how_found_us","title":"How did you find us?","isRequired":true,"choices":["Search engines","Social media","News story","Referral","I am a current client of Susman Insurance"]},{"type":"text","name":"about_you__referral_name","title":"Name of Referral","isRequired":true,"visibleIf":"{about_you__how_found_us} = 'Referral'"},{"type":"radiogroup","name":"about_you__working_with_agent","title":"Are you working with one of our agents?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"about_you__agent_name","title":"Agent's Name","isRequired":true,"visibleIf":"{about_you__working_with_agent} = 'Yes'"},{"type":"text","name":"about_you__cell_phone","title":"Cell Phone","isRequired":true,"inputType":"tel","validators":[{"type":"regex","regex":"^\\D*(\\d\\D*){10,}$","text":"Please enter a valid phone number (at least 10 digits)."}]},{"type":"text","name":"about_you__home_phone","title":"Home Phone","isRequired":true,"inputType":"tel","validators":[{"type":"regex","regex":"^\\D*(\\d\\D*){10,}$","text":"Please enter a valid phone number (at least 10 digits)."}]},{"type":"text","name":"about_you__email","title":"Email","isRequired":true,"inputType":"email","validators":[{"type":"email"}]},{"type":"text","name":"about_you__mailing_address__street","title":"Mailing Address - Street","isRequired":true},{"type":"text","name":"about_you__mailing_address__street2","title":"Mailing Address - Line 2","isRequired":false},{"type":"text","name":"about_you__mailing_address__city","title":"Mailing Address - City","isRequired":true},{"type":"text","name":"about_you__mailing_address__state","title":"Mailing Address - State","isRequired":true},{"type":"text","name":"about_you__mailing_address__zip","title":"Mailing Address - ZIP","isRequired":true,"validators":[{"type":"regex","regex":"^\\d{5}(-\\d{4})?$","text":"Please enter a valid ZIP code."}]},{"type":"radiogroup","name":"about_you__moved_last_3_years","title":"Have you moved in the last 3 years?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"about_you__previous_address__street","title":"Previous Address - Street","isRequired":true,"visibleIf":"{about_you__moved_last_3_years} = 'Yes'"},{"type":"text","name":"about_you__previous_address__city","title":"Previous Address - City","isRequired":true,"visibleIf":"{about_you__moved_last_3_years} = 'Yes'"},{"type":"text","name":"about_you__previous_address__state","title":"Previous Address - State","isRequired":true,"visibleIf":"{about_you__moved_last_3_years} = 'Yes'"},{"type":"text","name":"about_you__previous_address__zip","title":"Previous Address - ZIP","isRequired":true,"visibleIf":"{about_you__moved_last_3_years} = 'Yes'","validators":[{"type":"regex","regex":"^\\d{5}(-\\d{4})?$","text":"Please enter a valid ZIP code."}]}]},{"name":"current_insurance","title":"Current Insurance","elements":[{"type":"radiogroup","name":"insurance__has_current","title":"Do you currently have auto insurance?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"insurance__current_company","title":"Who is your current auto insurance company?","isRequired":true,"visibleIf":"{insurance__has_current} = 'Yes'"},{"type":"text","name":"insurance__expiration_date","title":"Expiration date of current auto insurance","isRequired":true,"inputType":"text","visibleIf":"{insurance__has_current} = 'Yes'","maskType":"datetime","maskSettings":{"pattern":"mm/dd/yyyy","saveMaskedValue":false},"placeholder":"MM/DD/YYYY","description":"Use Month/Day/Year (MM/DD/YYYY)."},{"type":"dropdown","name":"insurance__years_continuous","title":"Years of continuous auto insurance","isRequired":true,"visibleIf":"{insurance__has_current} = 'Yes'","choices":["0-1 year","1-2 years","2-3 years","3-4 years","4-5 years","5 years or more"]},{"type":"radiogroup","name":"insurance__claims_last_5_years","title":"Have you had any claims in the last 5 years?","isRequired":true,"choices":["Yes","No"]}]},{"name":"vehicles","title":"Vehicles","elements":[{"type":"paneldynamic","name":"vehicles","title":"Vehicles","description":"Add each vehicle you want quoted (1 to 5). Old schema stored these as vehicles.{index}.{field} with a vehicles.count select; here the panel count replaces vehicles.count.","panelCount":1,"minPanelCount":1,"maxPanelCount":5,"panelAddText":"Add another vehicle","panelRemoveText":"Remove this vehicle","templateTitle":"Vehicle {panelIndex}","keyName":"vin","templateElements":[{"type":"text","name":"year_make_model","title":"Year, make and model","isRequired":true},{"type":"text","name":"vin","title":"VIN #","isRequired":true,"placeholder":"17-character VIN","validators":[{"type":"regex","regex":"^[A-HJ-NPR-Za-hj-npr-z0-9]{17}$","text":"A VIN is 17 characters (no I, O, or Q)."}]},{"type":"radiogroup","name":"garaged_at_mailing","title":"Is it garaged at mailing address?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"garaging_street","title":"Garaging Address - Street","isRequired":true,"visibleIf":"{panel.garaged_at_mailing} = 'No'"},{"type":"text","name":"garaging_city","title":"Garaging Address - City","isRequired":true,"visibleIf":"{panel.garaged_at_mailing} = 'No'"},{"type":"text","name":"garaging_state","title":"Garaging Address - State","isRequired":true,"visibleIf":"{panel.garaged_at_mailing} = 'No'"},{"type":"text","name":"garaging_zip","title":"Garaging Address - ZIP","isRequired":true,"visibleIf":"{panel.garaged_at_mailing} = 'No'"},{"type":"dropdown","name":"usage","title":"Usage","isRequired":true,"choices":["To and from work","Pleasure","Business usage"]},{"type":"text","name":"miles_to_work","title":"Number of miles from home to work","isRequired":true,"inputType":"number","visibleIf":"{panel.usage} = 'To and from work'"},{"type":"text","name":"work_address","title":"Full address of work location","isRequired":true,"visibleIf":"{panel.usage} = 'To and from work'"},{"type":"text","name":"miles_per_year","title":"How many miles do you drive per year?","isRequired":true,"inputType":"number"},{"type":"text","name":"purchase_date","title":"Purchase or lease date","isRequired":true,"inputType":"text","maskType":"datetime","maskSettings":{"pattern":"mm/dd/yyyy","saveMaskedValue":false},"placeholder":"MM/DD/YYYY","description":"Use Month/Day/Year (MM/DD/YYYY)."},{"type":"text","name":"odometer","title":"Current exact odometer reading","isRequired":true,"inputType":"number"},{"type":"text","name":"registered_owner","title":"Who is the registered owner?","isRequired":true}]}]},{"name":"drivers","title":"Drivers","elements":[{"type":"paneldynamic","name":"drivers","title":"Drivers","description":"Add each driver in the household (1 to 5). Old schema stored these as drivers.{index}.{field} with a drivers.count select; here the panel count replaces drivers.count.","panelCount":1,"minPanelCount":1,"maxPanelCount":5,"panelAddText":"Add another driver","panelRemoveText":"Remove this driver","templateTitle":"Driver {panelIndex}","templateElements":[{"type":"text","name":"legal_name","title":"Full legal name (as on license)","isRequired":true},{"type":"text","name":"dob","title":"Date of birth","isRequired":true,"inputType":"text","maskType":"datetime","maskSettings":{"pattern":"mm/dd/yyyy","saveMaskedValue":false},"placeholder":"MM/DD/YYYY","description":"Use Month/Day/Year (MM/DD/YYYY)."},{"type":"dropdown","name":"sex","title":"Sex","isRequired":true,"choices":["Male","Female"]},{"type":"text","name":"license_number","title":"Driver's license number","isRequired":true},{"type":"text","name":"year_licensed","title":"Year licensed","isRequired":true,"inputType":"number"},{"type":"text","name":"license_state","title":"Driver's license state","isRequired":true},{"type":"dropdown","name":"marital_status","title":"Marital status","isRequired":true,"choices":["Single","Married","Divorced","Widowed","Separated","Domestic Partner"]},{"type":"text","name":"relation","title":"Relation to the applicant","isRequired":true},{"type":"dropdown","name":"occupation","title":"Occupation","isRequired":true,"searchEnabled":true,"placeholder":"Search or select your occupation","description":"Open the list and use the search box to find your occupation.","showOtherItem":true,"otherText":"Other / not listed","otherPlaceholder":"Enter your occupation","otherErrorText":"Please enter your occupation.","storeOthersAsComment":false,"choices":["Account Executive","Accountant","Accounting Supervisor","Actuary","Adjudicator","Administrator","Advertising Agent","Advisor","Agricultural Inspector","Air Traffic Controller","Airport Manager","Ambassador","Analyst","Anesthesiologist","Architect","Art Appraiser","Assistant Airport Manager","Assistant City Manager","Assistant Manager","Assistant Operations Manager","Assistant Personnel Manager","Assistant Principal","Assistant Productions Manager","Assistant Range Manager","Audiologist","Auditor","Bank Examiner","Bank Manager","Bank Officer","Bank Owner","Border Patrol Agent","Broadcaster","Business Vice President","Cameraman","Cartographer","Child Counselor","City Manager","Claims Adjuster","Claims Examiner","Classical Musician","Clerical Staff Manager","Co-op Agent","Coach","Commercial Artist","Communication Specialist","Comptroller","Computer Programmer","Computer Systems Engineer","Computer Technical Support Representative","Conservationist","Construction Engineer","Construction Inspector","Consultant","Contractor/Developer","Controller (Financial)","Copywriter","Coroner","Credit Advisor","Credit Manager","Criminologist","Curator","Data Systems Supervisor","Dental Hygienist","Dentist","Department Store Manager","Dietitian","Drafter","Economist","Editor","Editorial Assistant","Educational Counselor","Electrical Technician","Electronic Technician","Emergency Medical Technician","Employee Benefits Supervisor","Employment Agent","Engineer – Equipment","Engineer – Flight","Engineer/Draftsman/Technical Designer","Epidemiologist: Non-Physician","Executive Assistant","Executive/Director","Expediter","Export Agent","Extension Service Agent","Farm Manager or Owner","Field Underwriter","Film Editor","Financial Analyst/Auditor","Financial or Credit Manager","Financial/Credit Advisor","Flight Instructor","Floormen Supervisor","Food Technician","Forester","Fundraiser","General Manager","Geographer","Grader","Graphic Designer","Health Club Manager","High Tech Salesman","Historian","Hotel Manager","Human Resources and Personnel Supervisor","Human Resources Manager","Human Resources Representative","Illustrator","Import/Export Agent","Industrial Hygienist","Inspector - White Collar","Instructor","Instrumentation Technician","Insurance Agent","Insurance Broker","Insurance Underwriter","Interior Decorator","Interpreter","Investment Broker","Journalist","Judge","Lab Technician","Lawyer","Layperson or Non-Clergy","Leasing Agent","Legal Assistant","Legislative Assistant","Librarian","Loan Officer","Lobbyist","Manufacturer's Representative - High Tech","Marketing Representative","Mathematician","Medical Assistant","Medical Technician","Mental Health Counselor","Merchandise Manager","Merchant Marine Officer","Mercury Insurance Group Employees","Mining Engineer","Mortgage Broker","Mortician","Museum Archivist","Navigator","Non-High Tech Salesperson","Non-Resident Property Manager","Nurse Practitioner","Nutritionist","Occupational Therapist","Office Manager","Operations Manager","Operator, Nuclear Reactor","Optometrist","Paralegal","Paramedic","Penologist","Personnel and Human Resources Supervisor","Personnel Management Specialist","Personnel Recruiter","Pharmaceutical Salesperson","Pharmacist","Physical Therapist – Non APTA certified","Physical Therapist, APTA certified","Physician","Pilot","Planner","Police Captain","Police Chief","Position Classifier","Postmaster","Principal","Printer Planner","Private Investor","Producer","Production Controller","Production Manager","Production Planner","Professional Designer","Professional Staff Manager","Project Manager","Psychologist","Public Relations","Publisher","Purchasing Agent/Buyer","Purser-Ship","Radiological Technician","Radiologist","Ranch Manager or Owner","Range Ecologist","Real Estate Agent","Real Estate Appraiser","Real Estate Broker","Registrar","Reporter","Researcher","Resident Property Manager","Respiratory Therapist","Restaurant Manager (Non Fast Food)","Safety Engineer","Sales Manager","Sanitarian","School Superintendent","Science Technician","Scientist","Security Screening Manager","Ship Captain","Ship Master","Ship Officer","Shipping or Receiving Manager","Speech Pathologist","Staffing Specialist","State Examiner","Stock & Bonds Broker","Superintendent","Supermarket Manager","Surveyor (licensed)","Tax Examiner","Tax Preparer (non-accountant)","Teacher/Educator","Technical Staff Manager","Technician","Telecomm Officer","Testing Technician","Theatrical Agent","Therapist","Toxicologist","Training Specialist","Translator","Treasurer","Treasury Agent","Tutor","Ultrasound Technician","Veterinarian","Warden","Wastewater Treatment Plant Operator","White Collar Contractor/Developer/Inspector","Wholesale Salesman","Writer – Commercial","X Ray Technician"]},{"type":"text","name":"work_address","title":"Full work address","isRequired":false},{"type":"radiogroup","name":"costco_aaa","title":"Costco or AAA member?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"costco_aaa_which","title":"Which? (Costco or AAA)","isRequired":true,"visibleIf":"{panel.costco_aaa} = 'Yes'","_drift":"PHP authoritative type is free text. The shipped client (sir-drivers.js) used a dropdown with choices ['Costco','AAA']. Kept as text per instruction; switch to dropdown if desired."},{"type":"dropdown","name":"drives_vehicle","title":"Drives which vehicle?","isRequired":true,"choicesFromQuestion":"vehicles","choiceValuesFromQuestion":"year_make_model","choiceTextsFromQuestion":"year_make_model","_crossref":"Options are the entered vehicles' year_make_model values (client did SIR.vehicles.getVehicleNames()). PHP stored this as free text. If the engine's SurveyJS build cannot carry choices across two sibling dynamic panels, populate choices in code from the vehicles array (fallback label 'Vehicle N')."},{"type":"radiogroup","name":"is_student","title":"Currently a student?","isRequired":true,"choices":["Yes","No"],"visibleIf":"{panel.dob} empty or (age({panel.dob}) >= 16 and age({panel.dob}) <= 25)","_agegate":"Client-only age gate (sir-drivers.js): shown when driver age is 16-25 OR DOB unknown. isRequired resolved to true (client behavior); PHP marked it required=false only as a server-side progress-tracking workaround. SurveyJS does not validate hidden questions, so true+age-gate == the shipped UX."},{"type":"text","name":"school_name","title":"School name","isRequired":true,"visibleIf":"({panel.dob} empty or (age({panel.dob}) >= 16 and age({panel.dob}) <= 25)) and {panel.is_student} = 'Yes'"},{"type":"text","name":"school_address","title":"School address","isRequired":true,"visibleIf":"({panel.dob} empty or (age({panel.dob}) >= 16 and age({panel.dob}) <= 25)) and {panel.is_student} = 'Yes'"},{"type":"text","name":"school_distance","title":"Distance from home to school (miles)","isRequired":true,"inputType":"number","visibleIf":"({panel.dob} empty or (age({panel.dob}) >= 16 and age({panel.dob}) <= 25)) and {panel.is_student} = 'Yes'"},{"type":"radiogroup","name":"good_student","title":"Good student? (3.0 GPA or higher)","isRequired":true,"choices":["Yes","No"],"visibleIf":"({panel.dob} empty or (age({panel.dob}) >= 16 and age({panel.dob}) <= 25)) and {panel.is_student} = 'Yes'"},{"type":"radiogroup","name":"mature_driver_course","title":"Taken a mature driver course?","isRequired":true,"choices":["Yes","No"],"visibleIf":"{panel.dob} empty or age({panel.dob}) >= 50","_agegate":"Client-only age gate (sir-drivers.js): shown when driver age is 50+ OR DOB unknown. isRequired resolved to true (client behavior); PHP marked it required=false as a server-side progress-tracking workaround."},{"type":"text","name":"mature_driver_course_date","title":"Mature driver course completion date","isRequired":true,"inputType":"text","visibleIf":"({panel.dob} empty or age({panel.dob}) >= 50) and {panel.mature_driver_course} = 'Yes'","maskType":"datetime","maskSettings":{"pattern":"mm/dd/yyyy","saveMaskedValue":false},"placeholder":"MM/DD/YYYY","description":"Use Month/Day/Year (MM/DD/YYYY)."}]}]},{"name":"household","title":"Household & Associations","elements":[{"type":"radiogroup","name":"household__alumni_association","title":"Any driver a member of an Alumni Association?","isRequired":true,"choices":["Yes","No"]},{"type":"radiogroup","name":"household__has_additional_members","title":"Are there any additional household members?","isRequired":true,"choices":["Yes","No"]},{"type":"comment","name":"household__member_names","title":"Names of additional household members","isRequired":true,"placeholder":"Enter each name on a separate line","visibleIf":"{household__has_additional_members} = 'Yes'"},{"type":"comment","name":"household__member_dobs","title":"Dates of birth of additional household members","isRequired":true,"placeholder":"Enter each date of birth on a separate line — Dates: MM/DD/YYYY","visibleIf":"{household__has_additional_members} = 'Yes'","description":"Enter any full dates as Month/Day/Year (MM/DD/YYYY)."}]},{"name":"coverage","title":"Coverage Preferences","elements":[{"type":"dropdown","name":"coverage__liability_limits","title":"Limits of Liability and Property Damage","isRequired":true,"choices":["100/300/100","250/500/250"]},{"type":"dropdown","name":"coverage__uninsured_motorist","title":"Uninsured Motorist Limits","isRequired":true,"showOtherItem":true,"otherText":"Other","choices":["15/30","25/50","50/100","100/300","250/500","500/500"],"_drift":"Old type was select_other (dropdown with a free-text Other). showOtherItem reproduces it. For SurveyJS < 1.9.100 use hasOther:true instead of showOtherItem."},{"type":"dropdown","name":"coverage__medical_payments","title":"Medical Payments","isRequired":true,"choices":["None","$5,000","$10,000"]},{"type":"paneldynamic","name":"coverage_vehicles","title":"Per-Vehicle Coverage","description":"One coverage block per vehicle. Old schema stored these as coverage.vehicle_{index}.{field}; the panel count must mirror the number of vehicles entered on the Vehicles page.","panelCount":1,"minPanelCount":1,"maxPanelCount":5,"allowAddPanel":false,"allowRemovePanel":false,"templateTitle":"Vehicle {panelIndex} — Coverage","_crossref":"Old renderCoveragePerVehicle() generated exactly one block per vehicle and titled each with that vehicle's year_make_model. SurveyJS cannot declaratively mirror another panel's count or borrow its per-panel title, so the ENGINE must keep coverage_vehicles panelCount == vehicles panelCount and (ideally) set each panel title to the matching vehicle name.","templateElements":[{"type":"dropdown","name":"collision_deductible","title":"Collision Deductible","isRequired":true,"choices":["$1,000","$2,500","$5,000"]},{"type":"dropdown","name":"comprehensive_deductible","title":"Comprehensive Deductible","isRequired":true,"choices":["$1,000","$2,500","$5,000"]},{"type":"dropdown","name":"rental_reimbursement","title":"Rental Car Reimbursement","isRequired":true,"choices":["$30/day","$40/day","$50/day","$75/day","$100/day"]}]}]},{"name":"discounts","title":"Discounts & Final Info","elements":[{"type":"dropdown","name":"discounts__group_association","title":"Group/association membership","isRequired":false,"choices":["AAA Members","Bank of America Employees","CalCPA","California Medical Association","Costco/Sam's Club Members","Educators","Financial Professionals","Government Employees","Insurance Professionals","Medical Professionals","Mercury Insurance Employees","Pilots","Public Safety Professionals","Scientists and Engineers"]},{"type":"radiogroup","name":"discounts__aarp_member","title":"AARP member?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"discounts__aarp_number","title":"AARP member number","isRequired":true,"visibleIf":"{discounts__aarp_member} = 'Yes'"},{"type":"radiogroup","name":"discounts__multi_policy_quote","title":"Would you like a quote for renters, home, or condo for the multi-policy discount?","isRequired":true,"choices":["Yes","No"]},{"type":"text","name":"discounts__other_lines","title":"What other lines of insurance would you like a proposal for?","isRequired":true,"visibleIf":"{discounts__multi_policy_quote} = 'Yes'"},{"type":"dropdown","name":"discounts__also_quote","title":"Also quote the following","isRequired":true,"choices":["Earthquake insurance","Flood insurance","Mortgage protection insurance","Other","None"]},{"type":"html","name":"discounts__upload_current_policy","html":"<div style=\"padding:12px 14px;border:1px dashed #9aa5b1;border-radius:6px;color:#555;font-size:13px;\"><strong>Upload current auto insurance declaration page</strong><br>Note: this form does not collect file uploads. Please email your declaration page to <a href=\"mailto:azy@susmaninsurance.com\">azy@susmaninsurance.com</a>, or share it securely via Canopy Connect after you submit.</div>","_decorative":"Old field discounts.upload_current_policy (type=file, required=false) rendered a file input but there was NO upload endpoint — it was decorative. Represented here as an html note; captures no value. Do not promise upload."},{"type":"comment","name":"discounts__additional_info","title":"Additional information you want us to have","isRequired":false}]}]}