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

173
lib/models/client.dart Normal file
View File

@@ -0,0 +1,173 @@
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,
);
}
}