From 38ae9e3571de56b226f5e660819fb5a3fa53cf4e Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Tue, 30 Sep 2025 11:03:33 +0530 Subject: [PATCH] feat: Update GlobalProjectModel and ProjectModel to handle nullable date fields and improve JSON parsing --- lib/model/global_project_model.dart | 108 ++++++++++++++++------------ lib/model/project_model.dart | 66 +++++++++++------ 2 files changed, 104 insertions(+), 70 deletions(-) diff --git a/lib/model/global_project_model.dart b/lib/model/global_project_model.dart index 5d1c6b5..5492d2b 100644 --- a/lib/model/global_project_model.dart +++ b/lib/model/global_project_model.dart @@ -1,51 +1,65 @@ class GlobalProjectModel { -final String id; -final String name; -final String projectAddress; -final String contactPerson; -final DateTime startDate; -final DateTime endDate; -final int teamSize; -final String projectStatusId; -final String? tenantId; + final String id; + final String name; + final String projectAddress; + final String contactPerson; + final DateTime? startDate; + final DateTime? endDate; + final int teamSize; + final String projectStatusId; + final String? tenantId; -GlobalProjectModel({ -required this.id, -required this.name, -required this.projectAddress, -required this.contactPerson, -required this.startDate, -required this.endDate, -required this.teamSize, -required this.projectStatusId, -this.tenantId, -}); + GlobalProjectModel({ + required this.id, + required this.name, + required this.projectAddress, + required this.contactPerson, + this.startDate, + this.endDate, + required this.teamSize, + required this.projectStatusId, + this.tenantId, + }); -factory GlobalProjectModel.fromJson(Map json) { -return GlobalProjectModel( -id: json['id'] ?? '', -name: json['name'] ?? '', -projectAddress: json['projectAddress'] ?? '', -contactPerson: json['contactPerson'] ?? '', -startDate: DateTime.parse(json['startDate']), -endDate: DateTime.parse(json['endDate']), -teamSize: json['teamSize'] ?? 0, // ✅ SAFER -projectStatusId: json['projectStatusId'] ?? '', -tenantId: json['tenantId'], -); + factory GlobalProjectModel.fromJson(Map json) { + return GlobalProjectModel( + id: json['id'] ?? '', + name: json['name'] ?? '', + projectAddress: json['projectAddress'] ?? '', + contactPerson: json['contactPerson'] ?? '', + startDate: _parseDate(json['startDate']), + endDate: _parseDate(json['endDate']), + teamSize: json['teamSize'] is int + ? json['teamSize'] + : int.tryParse(json['teamSize']?.toString() ?? '0') ?? 0, + projectStatusId: json['projectStatusId'] ?? '', + tenantId: json['tenantId'], + ); + } + + Map toJson() { + return { + 'id': id, + 'name': name, + 'projectAddress': projectAddress, + 'contactPerson': contactPerson, + 'startDate': startDate?.toIso8601String(), + 'endDate': endDate?.toIso8601String(), + 'teamSize': teamSize, + 'projectStatusId': projectStatusId, + 'tenantId': tenantId, + }; + } + + static DateTime? _parseDate(dynamic value) { + if (value == null || value.toString().trim().isEmpty) { + return null; + } + try { + return DateTime.parse(value.toString()); + } catch (e) { + print('⚠️ Failed to parse date "$value": $e'); + return null; + } + } } - -Map toJson() { -return { -'id': id, -'name': name, -'projectAddress': projectAddress, -'contactPerson': contactPerson, -'startDate': startDate.toIso8601String(), -'endDate': endDate.toIso8601String(), -'teamSize': teamSize, -'projectStatusId': projectStatusId, -'tenantId': tenantId, -}; -} -} \ No newline at end of file diff --git a/lib/model/project_model.dart b/lib/model/project_model.dart index 9498cf4..1e54951 100644 --- a/lib/model/project_model.dart +++ b/lib/model/project_model.dart @@ -3,8 +3,8 @@ class ProjectModel { final String name; final String projectAddress; final String contactPerson; - final DateTime startDate; - final DateTime endDate; + final DateTime? startDate; + final DateTime? endDate; final int teamSize; final double completedWork; final double plannedWork; @@ -16,8 +16,8 @@ class ProjectModel { required this.name, required this.projectAddress, required this.contactPerson, - required this.startDate, - required this.endDate, + this.startDate, + this.endDate, required this.teamSize, required this.completedWork, required this.plannedWork, @@ -25,36 +25,30 @@ class ProjectModel { this.tenantId, }); - // Factory method to create an instance of ProjectModel from a JSON object factory ProjectModel.fromJson(Map json) { return ProjectModel( - id: json['id'], - name: json['name'], - projectAddress: json['projectAddress'], - contactPerson: json['contactPerson'], - startDate: DateTime.parse(json['startDate']), - endDate: DateTime.parse(json['endDate']), - teamSize: json['teamSize'], - completedWork: json['completedWork'] != null - ? (json['completedWork'] as num).toDouble() - : 0.0, - plannedWork: json['plannedWork'] != null - ? (json['plannedWork'] as num).toDouble() - : 0.0, - projectStatusId: json['projectStatusId'], - tenantId: json['tenantId'], + id: json['id']?.toString() ?? '', + name: json['name']?.toString() ?? '', + projectAddress: json['projectAddress']?.toString() ?? '', + contactPerson: json['contactPerson']?.toString() ?? '', + startDate: _parseDate(json['startDate']), + endDate: _parseDate(json['endDate']), + teamSize: _parseInt(json['teamSize']), + completedWork: _parseDouble(json['completedWork']), + plannedWork: _parseDouble(json['plannedWork']), + projectStatusId: json['projectStatusId']?.toString() ?? '', + tenantId: json['tenantId']?.toString(), ); } - // Method to convert the ProjectModel instance back to a JSON object Map toJson() { return { 'id': id, 'name': name, 'projectAddress': projectAddress, 'contactPerson': contactPerson, - 'startDate': startDate.toIso8601String(), - 'endDate': endDate.toIso8601String(), + 'startDate': startDate?.toIso8601String(), + 'endDate': endDate?.toIso8601String(), 'teamSize': teamSize, 'completedWork': completedWork, 'plannedWork': plannedWork, @@ -62,4 +56,30 @@ class ProjectModel { 'tenantId': tenantId, }; } + + // ---------- Helpers ---------- + + static DateTime? _parseDate(dynamic value) { + if (value == null || value.toString().trim().isEmpty) { + return null; + } + try { + return DateTime.parse(value.toString()); + } catch (e) { + print('⚠️ Failed to parse date: $value'); + return null; + } + } + + static int _parseInt(dynamic value) { + if (value == null) return 0; + if (value is int) return value; + return int.tryParse(value.toString()) ?? 0; + } + + static double _parseDouble(dynamic value) { + if (value == null) return 0.0; + if (value is num) return value.toDouble(); + return double.tryParse(value.toString()) ?? 0.0; + } }