Initial commit of Doormile CRM Mobile with UI modernizations

This commit is contained in:
2026-06-26 13:43:37 +05:30
commit 3965046984
183 changed files with 18135 additions and 0 deletions

166
lib/data/india_cities.dart Normal file
View File

@@ -0,0 +1,166 @@
/// A selectable Indian city shown flight-booking style: "Chennai (MAA)".
class IndiaCity {
final String name;
final String code; // airport-style 3-letter code
final String state;
const IndiaCity(this.name, this.code, this.state);
String get label => '$name ($code)';
/// True if [query] matches the city name, code, or state.
bool matches(String query) {
final q = query.trim().toLowerCase();
if (q.isEmpty) return true;
return name.toLowerCase().contains(q) ||
code.toLowerCase().contains(q) ||
state.toLowerCase().contains(q);
}
}
/// Major Indian cities with flight-style codes. Tamil Nadu listed first
/// (primary operating region), then the rest of India.
const List<IndiaCity> indiaCities = [
// ── Tamil Nadu ──────────────────────────────────────────────────────────
IndiaCity('Chennai', 'MAA', 'Tamil Nadu'),
IndiaCity('Coimbatore', 'CJB', 'Tamil Nadu'),
IndiaCity('Madurai', 'IXM', 'Tamil Nadu'),
IndiaCity('Tiruchirappalli', 'TRZ', 'Tamil Nadu'),
IndiaCity('Salem', 'SXV', 'Tamil Nadu'),
IndiaCity('Tuticorin', 'TCR', 'Tamil Nadu'),
IndiaCity('Tirupur', 'TUP', 'Tamil Nadu'),
IndiaCity('Erode', 'ERD', 'Tamil Nadu'),
IndiaCity('Vellore', 'VLR', 'Tamil Nadu'),
IndiaCity('Tirunelveli', 'TEN', 'Tamil Nadu'),
IndiaCity('Thanjavur', 'TNJ', 'Tamil Nadu'),
IndiaCity('Dindigul', 'DGL', 'Tamil Nadu'),
IndiaCity('Hosur', 'HSR', 'Tamil Nadu'),
IndiaCity('Nagercoil', 'NGL', 'Tamil Nadu'),
IndiaCity('Karur', 'KRR', 'Tamil Nadu'),
IndiaCity('Namakkal', 'NMK', 'Tamil Nadu'),
IndiaCity('Kanchipuram', 'KCP', 'Tamil Nadu'),
IndiaCity('Cuddalore', 'CDL', 'Tamil Nadu'),
IndiaCity('Thoothukudi', 'TOO', 'Tamil Nadu'),
// ── Karnataka ───────────────────────────────────────────────────────────
IndiaCity('Bengaluru', 'BLR', 'Karnataka'),
IndiaCity('Mysuru', 'MYQ', 'Karnataka'),
IndiaCity('Mangaluru', 'IXE', 'Karnataka'),
IndiaCity('Hubli', 'HBX', 'Karnataka'),
IndiaCity('Belagavi', 'IXG', 'Karnataka'),
IndiaCity('Kalaburagi', 'GBI', 'Karnataka'),
IndiaCity('Davangere', 'DVG', 'Karnataka'),
IndiaCity('Ballari', 'BEP', 'Karnataka'),
// ── Kerala ──────────────────────────────────────────────────────────────
IndiaCity('Kochi', 'COK', 'Kerala'),
IndiaCity('Thiruvananthapuram', 'TRV', 'Kerala'),
IndiaCity('Kozhikode', 'CCJ', 'Kerala'),
IndiaCity('Kannur', 'CNN', 'Kerala'),
IndiaCity('Thrissur', 'TCR2', 'Kerala'),
IndiaCity('Kollam', 'QLN', 'Kerala'),
// ── Telangana & Andhra Pradesh ──────────────────────────────────────────
IndiaCity('Hyderabad', 'HYD', 'Telangana'),
IndiaCity('Warangal', 'WGC', 'Telangana'),
IndiaCity('Visakhapatnam', 'VTZ', 'Andhra Pradesh'),
IndiaCity('Vijayawada', 'VGA', 'Andhra Pradesh'),
IndiaCity('Tirupati', 'TIR', 'Andhra Pradesh'),
IndiaCity('Guntur', 'GNT', 'Andhra Pradesh'),
IndiaCity('Rajahmundry', 'RJA', 'Andhra Pradesh'),
IndiaCity('Nellore', 'NLR', 'Andhra Pradesh'),
// ── Maharashtra ─────────────────────────────────────────────────────────
IndiaCity('Mumbai', 'BOM', 'Maharashtra'),
IndiaCity('Pune', 'PNQ', 'Maharashtra'),
IndiaCity('Nagpur', 'NAG', 'Maharashtra'),
IndiaCity('Nashik', 'ISK', 'Maharashtra'),
IndiaCity('Aurangabad', 'IXU', 'Maharashtra'),
IndiaCity('Kolhapur', 'KLH', 'Maharashtra'),
IndiaCity('Solapur', 'SSE', 'Maharashtra'),
// ── Delhi NCR & North ───────────────────────────────────────────────────
IndiaCity('New Delhi', 'DEL', 'Delhi'),
IndiaCity('Gurugram', 'GGN', 'Haryana'),
IndiaCity('Noida', 'NOI', 'Uttar Pradesh'),
IndiaCity('Faridabad', 'FBD', 'Haryana'),
IndiaCity('Chandigarh', 'IXC', 'Chandigarh'),
IndiaCity('Amritsar', 'ATQ', 'Punjab'),
IndiaCity('Ludhiana', 'LUH', 'Punjab'),
IndiaCity('Jalandhar', 'JLR2', 'Punjab'),
// ── Gujarat ─────────────────────────────────────────────────────────────
IndiaCity('Ahmedabad', 'AMD', 'Gujarat'),
IndiaCity('Surat', 'STV', 'Gujarat'),
IndiaCity('Vadodara', 'BDQ', 'Gujarat'),
IndiaCity('Rajkot', 'RAJ', 'Gujarat'),
IndiaCity('Bhavnagar', 'BHU', 'Gujarat'),
IndiaCity('Jamnagar', 'JGA', 'Gujarat'),
// ── Rajasthan ───────────────────────────────────────────────────────────
IndiaCity('Jaipur', 'JAI', 'Rajasthan'),
IndiaCity('Jodhpur', 'JDH', 'Rajasthan'),
IndiaCity('Udaipur', 'UDR', 'Rajasthan'),
IndiaCity('Kota', 'KTU', 'Rajasthan'),
IndiaCity('Bikaner', 'BKB', 'Rajasthan'),
// ── Uttar Pradesh & Central ─────────────────────────────────────────────
IndiaCity('Lucknow', 'LKO', 'Uttar Pradesh'),
IndiaCity('Kanpur', 'KNU', 'Uttar Pradesh'),
IndiaCity('Varanasi', 'VNS', 'Uttar Pradesh'),
IndiaCity('Agra', 'AGR', 'Uttar Pradesh'),
IndiaCity('Prayagraj', 'IXD', 'Uttar Pradesh'),
IndiaCity('Gorakhpur', 'GOP', 'Uttar Pradesh'),
IndiaCity('Bhopal', 'BHO', 'Madhya Pradesh'),
IndiaCity('Indore', 'IDR', 'Madhya Pradesh'),
IndiaCity('Gwalior', 'GWL', 'Madhya Pradesh'),
IndiaCity('Jabalpur', 'JLR', 'Madhya Pradesh'),
IndiaCity('Raipur', 'RPR', 'Chhattisgarh'),
// ── East & North-East ───────────────────────────────────────────────────
IndiaCity('Kolkata', 'CCU', 'West Bengal'),
IndiaCity('Siliguri', 'IXB', 'West Bengal'),
IndiaCity('Durgapur', 'RDP', 'West Bengal'),
IndiaCity('Patna', 'PAT', 'Bihar'),
IndiaCity('Gaya', 'GAY', 'Bihar'),
IndiaCity('Ranchi', 'IXR', 'Jharkhand'),
IndiaCity('Jamshedpur', 'JSD', 'Jharkhand'),
IndiaCity('Bhubaneswar', 'BBI', 'Odisha'),
IndiaCity('Cuttack', 'CTC', 'Odisha'),
IndiaCity('Guwahati', 'GAU', 'Assam'),
IndiaCity('Dibrugarh', 'DIB', 'Assam'),
IndiaCity('Agartala', 'IXA', 'Tripura'),
IndiaCity('Imphal', 'IMF', 'Manipur'),
IndiaCity('Shillong', 'SHL', 'Meghalaya'),
IndiaCity('Aizawl', 'AJL', 'Mizoram'),
IndiaCity('Dimapur', 'DMU', 'Nagaland'),
// ── Hills, UTs & others ─────────────────────────────────────────────────
IndiaCity('Dehradun', 'DED', 'Uttarakhand'),
IndiaCity('Haridwar', 'HDW', 'Uttarakhand'),
IndiaCity('Shimla', 'SLV', 'Himachal Pradesh'),
IndiaCity('Srinagar', 'SXR', 'Jammu & Kashmir'),
IndiaCity('Jammu', 'IXJ', 'Jammu & Kashmir'),
IndiaCity('Leh', 'IXL', 'Ladakh'),
IndiaCity('Panaji', 'GOI', 'Goa'),
IndiaCity('Puducherry', 'PNY', 'Puducherry'),
IndiaCity('Port Blair', 'IXZ', 'Andaman & Nicobar Islands'),
];
/// Finds a city by (loose) name match — used to map a GPS reverse-geocode
/// result to a known city. Returns null if nothing reasonable matches.
IndiaCity? findCityByName(String? name) {
if (name == null || name.trim().isEmpty) return null;
final n = name.trim().toLowerCase();
for (final c in indiaCities) {
if (c.name.toLowerCase() == n) return c;
}
// Loose contains match (e.g. "Coimbatore District" → "Coimbatore")
for (final c in indiaCities) {
if (n.contains(c.name.toLowerCase()) ||
c.name.toLowerCase().contains(n)) {
return c;
}
}
return null;
}

View File

@@ -0,0 +1,221 @@
/// All Indian states + Union Territories, alphabetically sorted.
const List<String> indianStates = [
'Andaman & Nicobar Islands',
'Andhra Pradesh',
'Arunachal Pradesh',
'Assam',
'Bihar',
'Chandigarh',
'Chhattisgarh',
'Dadra & Nagar Haveli',
'Daman & Diu',
'Delhi',
'Goa',
'Gujarat',
'Haryana',
'Himachal Pradesh',
'Jammu & Kashmir',
'Jharkhand',
'Karnataka',
'Kerala',
'Ladakh',
'Lakshadweep',
'Madhya Pradesh',
'Maharashtra',
'Manipur',
'Meghalaya',
'Mizoram',
'Nagaland',
'Odisha',
'Puducherry',
'Punjab',
'Rajasthan',
'Sikkim',
'Tamil Nadu',
'Telangana',
'Tripura',
'Uttar Pradesh',
'Uttarakhand',
'West Bengal',
];
/// Major cities per state. Falls back to an empty list for states not listed.
const Map<String, List<String>> stateCities = {
'Tamil Nadu': [
'Chennai', 'Coimbatore', 'Madurai', 'Salem', 'Tirupur', 'Erode',
'Tiruchirappalli', 'Tirunelveli', 'Vellore', 'Dindigul', 'Thanjavur',
'Kanchipuram', 'Namakkal', 'Karur', 'Dharmapuri', 'Krishnagiri',
'Cuddalore', 'Villupuram', 'Nagapattinam', 'Thoothukudi', 'Virudhunagar',
'Sivaganga', 'Ramanathapuram', 'Theni', 'Perambalur', 'Puducherry',
],
'Karnataka': [
'Bengaluru', 'Mysuru', 'Mangaluru', 'Hubli', 'Belagavi',
'Davangere', 'Shivamogga', 'Tumakuru', 'Kalaburagi', 'Udupi',
'Ballari', 'Bidar', 'Vijayapura', 'Raichur', 'Dharwad', 'Hassan',
],
'Kerala': [
'Kochi', 'Thiruvananthapuram', 'Kozhikode', 'Thrissur', 'Kannur',
'Kollam', 'Palakkad', 'Malappuram', 'Alappuzha', 'Kottayam',
'Idukki', 'Wayanad', 'Kasaragod', 'Pathanamthitta',
],
'Andhra Pradesh': [
'Vijayawada', 'Visakhapatnam', 'Tirupati', 'Guntur', 'Nellore',
'Kakinada', 'Rajahmundry', 'Kadapa', 'Kurnool', 'Ongole',
'Anantapur', 'Vizianagaram', 'Eluru',
],
'Telangana': [
'Hyderabad', 'Warangal', 'Nizamabad', 'Karimnagar', 'Khammam',
'Mahbubnagar', 'Nalgonda', 'Adilabad', 'Secunderabad', 'Siddipet',
],
'Maharashtra': [
'Mumbai', 'Pune', 'Nagpur', 'Nashik', 'Aurangabad', 'Thane',
'Solapur', 'Amravati', 'Kolhapur', 'Nanded', 'Sangli', 'Jalgaon',
'Akola', 'Latur', 'Chandrapur',
],
'Delhi': [
'New Delhi', 'North Delhi', 'South Delhi', 'East Delhi', 'West Delhi',
'Noida', 'Gurgaon', 'Faridabad', 'Ghaziabad', 'Dwarka',
],
'Gujarat': [
'Ahmedabad', 'Surat', 'Vadodara', 'Rajkot', 'Gandhinagar',
'Bhavnagar', 'Jamnagar', 'Junagadh', 'Anand', 'Bharuch',
'Morbi', 'Nadiad', 'Surendranagar',
],
'Rajasthan': [
'Jaipur', 'Jodhpur', 'Udaipur', 'Kota', 'Ajmer',
'Bikaner', 'Alwar', 'Bharatpur', 'Sikar', 'Sri Ganganagar',
'Pali', 'Tonk', 'Barmer',
],
'West Bengal': [
'Kolkata', 'Howrah', 'Durgapur', 'Asansol', 'Siliguri',
'Bardhaman', 'Malda', 'Kharagpur', 'Haldia', 'Jalpaiguri',
],
'Uttar Pradesh': [
'Lucknow', 'Kanpur', 'Varanasi', 'Agra', 'Meerut',
'Prayagraj', 'Bareilly', 'Moradabad', 'Gorakhpur', 'Aligarh',
'Noida', 'Ghaziabad', 'Firozabad', 'Saharanpur', 'Mathura',
],
'Madhya Pradesh': [
'Bhopal', 'Indore', 'Gwalior', 'Jabalpur', 'Ujjain',
'Sagar', 'Dewas', 'Satna', 'Ratlam', 'Rewa', 'Singrauli',
],
'Punjab': [
'Ludhiana', 'Amritsar', 'Jalandhar', 'Patiala', 'Bathinda',
'Mohali', 'Hoshiarpur', 'Gurdaspur', 'Pathankot', 'Firozpur',
],
'Haryana': [
'Gurugram', 'Faridabad', 'Hisar', 'Panipat', 'Ambala',
'Karnal', 'Rohtak', 'Bhiwani', 'Sirsa', 'Sonipat',
],
'Bihar': [
'Patna', 'Gaya', 'Bhagalpur', 'Muzaffarpur', 'Purnia',
'Darbhanga', 'Arrah', 'Begusarai', 'Munger', 'Chhapra',
],
'Odisha': [
'Bhubaneswar', 'Cuttack', 'Rourkela', 'Brahmapur', 'Puri',
'Sambalpur', 'Balasore', 'Baripada', 'Jharsuguda',
],
'Assam': [
'Guwahati', 'Silchar', 'Dibrugarh', 'Jorhat', 'Nagaon',
'Tinsukia', 'Tezpur', 'Bongaigaon', 'Karimganj',
],
'Jharkhand': [
'Ranchi', 'Jamshedpur', 'Dhanbad', 'Bokaro', 'Deoghar',
'Hazaribagh', 'Giridih', 'Dumka', 'Phusro',
],
'Chhattisgarh': [
'Raipur', 'Bhilai', 'Bilaspur', 'Korba', 'Rajnandgaon',
'Durg', 'Jagdalpur', 'Ambikapur', 'Raigarh',
],
'Uttarakhand': [
'Dehradun', 'Haridwar', 'Rishikesh', 'Roorkee', 'Haldwani',
'Nainital', 'Mussoorie', 'Kashipur', 'Rudrapur',
],
'Himachal Pradesh': [
'Shimla', 'Dharamshala', 'Solan', 'Mandi', 'Kullu',
'Manali', 'Baddi', 'Bilaspur', 'Kangra',
],
'Goa': [
'Panaji', 'Margao', 'Vasco da Gama', 'Mapusa', 'Ponda', 'Calangute',
],
'Puducherry': ['Puducherry', 'Karaikal', 'Mahe', 'Yanam'],
'Jammu & Kashmir': [
'Srinagar', 'Jammu', 'Anantnag', 'Baramulla', 'Sopore', 'Udhampur',
],
'Chandigarh': ['Chandigarh'],
'Ladakh': ['Leh', 'Kargil'],
'Andaman & Nicobar Islands': ['Port Blair'],
'Manipur': ['Imphal', 'Thoubal', 'Bishnupur', 'Churachandpur'],
'Meghalaya': ['Shillong', 'Tura', 'Jowai'],
'Mizoram': ['Aizawl', 'Lunglei', 'Champhai'],
'Nagaland': ['Kohima', 'Dimapur', 'Mokokchung'],
'Arunachal Pradesh': ['Itanagar', 'Naharlagun', 'Pasighat', 'Tawang'],
'Sikkim': ['Gangtok', 'Namchi', 'Gyalshing'],
'Tripura': ['Agartala', 'Dharmanagar', 'Udaipur', 'Kailasahar'],
};
const Map<String, List<String>> categorisedProviders = {
'National & Pan-India Courier Services (Parcels & Express)': [
'Blue Dart',
'Delhivery',
'DTDC',
'India Post / Speed Post',
'The Professional Couriers',
'XpressBees',
'Ecom Express',
'Shadowfax',
],
'National Heavyweight Cargo & B2B Surface Freight': [
'Safexpress',
'VRL Logistics',
'TCI (Transport Corporation of India)',
'Om Logistics',
'Best Roadways',
],
'Southern India Dual-Purpose & Regional Networks (Tamil Nadu, Telangana, AP, Karnataka)': [
'MSS (Mettur Super Services / Mettur Transports)',
'ABT Travels & Logistics',
'Navata Road Transport',
'KRS (Kerala Roadways)',
'Parveen Travels / Parveen Express',
'SRM Transports',
'KPN Travels & KPN Speed Parcel',
'SRS Travels',
],
'Hyper-Local & District Operators in Tamil Nadu': [
'Hindusthan Travels',
'City Travels',
'Essaar Travels',
'No. 1 Air Travels',
'A1 Travels',
'Krish Travels',
'Hebron Transports',
'Horma Travels',
'Vivegam Travels',
'PSS Transport',
'SRT (Renugambal Travels)',
'Thamarai Bus Transports',
'Rathimeena Travels',
'Ganesh Travels',
'John Kennedy Bus Service',
'Arun Travel',
'Saaji Meera Roadways',
'ARC Parcel Service',
'Chakra Travels & Parcel Service',
'MVA Parcel And Bus Service',
],
'Northern & Central India Regional Operators (Delhi NCR, Rajasthan, UP, MP, Punjab, Haryana)': [
'Shrinath Travels & Cargo',
'Hans Travels',
'Zingbus',
'Kalpana Travels / City Land Travels',
'Trackon Couriers',
'North India Transways',
'RSRTC Cargo',
'UPSRTC Cargo',
],
};
final List<String> allProvidersFlat =
categorisedProviders.values.expand((list) => list).toList();

View File

@@ -0,0 +1,46 @@
import '../models/client.dart';
import '../models/activity.dart';
import '../models/app_stats.dart';
const AppStats initialStats = AppStats(
totalClients: 1,
avgVolume: 200,
revenueOpportunity: 0.1,
todayEntries: 1,
pendingFollowups: 0,
);
const List<Client> initialClients = [
Client(
id: 'suriya_001',
name: 'Suriya',
city: 'Coimbatore',
businessType: BusinessType.ecommerce,
parcelVolume: 200,
activeContracts: 5,
provider: 'DTDC Express',
efficiency: 'High Efficiency',
status: ClientStatus.newClient,
lastUpdated: 'Just now',
surveySubmitted: true,
notes: '',
dataConsent: DataConsent.full,
phone: '',
frequency: 'Weekly',
businessState: 'Tamil Nadu',
transitType: 'within_state',
transitFrom: 'Coimbatore',
transitTo: 'Chennai',
neighbourhood: 'RS Puram',
),
];
const List<Activity> initialActivities = [
Activity(
id: 'a1',
clientName: 'Suriya',
action: 'Profile created — staging entry',
icon: ActivityIcon.shipping,
status: ActivityStatus.newStatus,
),
];