enum DataConsent { basicOnly, full } enum BusinessType { ecommerce, manufacturing, wholesale, retail } enum ClientStatus { newClient, pending, completed, updated } extension BusinessTypeLabel on BusinessType { String get label { switch (this) { case BusinessType.ecommerce: return 'E-commerce'; case BusinessType.manufacturing: return 'Manufacturing'; case BusinessType.wholesale: return 'Wholesale'; case BusinessType.retail: return 'Retail'; } } } extension ClientStatusLabel on ClientStatus { String get label { switch (this) { case ClientStatus.newClient: return 'NEW'; case ClientStatus.pending: return 'PENDING'; case ClientStatus.completed: return 'COMPLETED'; case ClientStatus.updated: return 'UPDATED'; } } } class Client { final String id; final String name; final String city; // free-text, e.g. "New York", "Austin" final BusinessType businessType; final double parcelVolume; final int activeContracts; final String provider; final String efficiency; final ClientStatus status; final String lastUpdated; final bool surveySubmitted; final String notes; final DataConsent dataConsent; // Extended basic-info fields final String phone; // contact number final String frequency; // shipment frequency: Daily / Weekly / etc. final String businessState; // Indian state of the business final String transitType; // 'within_state' | 'state_to_state' | '' final String transitFrom; // city (within_state) or state name (state_to_state) final String transitTo; // city (within_state) or state name (state_to_state) final String neighbourhood; // local area / neighbourhood final String logisticsSegment; // 'First Mile' | 'Middle Mile' | 'Last Mile' | '' final String pincode; // client postal/PIN code — optional manual entry // Device GPS at the moment of survey submission — stored for field audit, not displayed in app UI. final double surveyLat; final double surveyLng; final String surveyAddress; // reverse-geocoded full address final String surveyZone; // suburb / neighbourhood from geocoder final String surveyPincode; // postal code from GPS reverse-geocode // Field-agent attribution — who collected this record (from login session). final String recordedByName; // e.g. "Kamesh" final String recordedByEmail; // login email of the agent final String recordedByRole; // 'admin' | 'rep' | 'support' const Client({ required this.id, required this.name, required this.city, required this.businessType, required this.parcelVolume, required this.activeContracts, required this.provider, required this.efficiency, required this.status, required this.lastUpdated, required this.surveySubmitted, this.notes = '', this.dataConsent = DataConsent.full, this.phone = '', this.frequency = '', this.businessState = '', this.transitType = '', this.transitFrom = '', this.transitTo = '', this.neighbourhood = '', this.logisticsSegment = '', this.pincode = '', this.surveyLat = 0.0, this.surveyLng = 0.0, this.surveyAddress = '', this.surveyZone = '', this.surveyPincode = '', this.recordedByName = '', this.recordedByEmail = '', this.recordedByRole = '', }); Client copyWith({ String? id, String? name, String? city, BusinessType? businessType, double? parcelVolume, int? activeContracts, String? provider, String? efficiency, ClientStatus? status, String? lastUpdated, bool? surveySubmitted, String? notes, DataConsent? dataConsent, String? phone, String? frequency, String? businessState, String? transitType, String? transitFrom, String? transitTo, String? neighbourhood, String? logisticsSegment, String? pincode, double? surveyLat, double? surveyLng, String? surveyAddress, String? surveyZone, String? surveyPincode, String? recordedByName, String? recordedByEmail, String? recordedByRole, }) { return Client( id: id ?? this.id, name: name ?? this.name, city: city ?? this.city, businessType: businessType ?? this.businessType, parcelVolume: parcelVolume ?? this.parcelVolume, activeContracts: activeContracts ?? this.activeContracts, provider: provider ?? this.provider, efficiency: efficiency ?? this.efficiency, status: status ?? this.status, lastUpdated: lastUpdated ?? this.lastUpdated, surveySubmitted: surveySubmitted ?? this.surveySubmitted, notes: notes ?? this.notes, dataConsent: dataConsent ?? this.dataConsent, phone: phone ?? this.phone, frequency: frequency ?? this.frequency, businessState: businessState ?? this.businessState, transitType: transitType ?? this.transitType, transitFrom: transitFrom ?? this.transitFrom, transitTo: transitTo ?? this.transitTo, neighbourhood: neighbourhood ?? this.neighbourhood, logisticsSegment: logisticsSegment ?? this.logisticsSegment, pincode: pincode ?? this.pincode, surveyLat: surveyLat ?? this.surveyLat, surveyLng: surveyLng ?? this.surveyLng, surveyAddress: surveyAddress ?? this.surveyAddress, surveyZone: surveyZone ?? this.surveyZone, surveyPincode: surveyPincode ?? this.surveyPincode, recordedByName: recordedByName ?? this.recordedByName, recordedByEmail: recordedByEmail ?? this.recordedByEmail, recordedByRole: recordedByRole ?? this.recordedByRole, ); } }