Turn campaign timezone field into a searchable city/country picker
Seth+1: Claude Sonnet 5
0d1ff1d
Free-text timezone entry let users type non-IANA names (e.g. "India")
that silently failed open and disabled the business-hours restriction
with no feedback. Replaced it with a type-ahead combobox backed by a
curated city/country list plus the full IANA zone list as fallback, so
only a real timezone id can be committed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Allow LinkedIn generation for contacts with no email but a LinkedIn URL
Seth+1: Claude Sonnet 5
56eda2f
Apollo CSV exports frequently can't verify an email but still include a
valid LinkedIn profile URL — generate_linkedin_sequence() was hard-
requiring an email and failing these contacts entirely, even though
LinkedIn sending never uses email (it already resolves the profile from
the LinkedIn URL at send time). Also fixes contact field extraction
(both email and LinkedIn generation) to recognize Apollo's actual
column names like "Company Name" instead of only "Company", which was
silently leaving company blank for every Apollo-sourced contact.
- gpt_service.py: case-insensitive field lookup with the same alias
list main.py already uses elsewhere; LinkedIn generation now only
requires a name, email, or LinkedIn URL — not specifically an email.
Email generation still requires an email (needed to actually send).
- Give generate_email_sequence the same typed generation_failed marker
treatment as LinkedIn instead of silently returning fake fallback
email content on error.
- main.p…