416 lines
11 KiB
Dart
416 lines
11 KiB
Dart
import 'dart:convert';
|
|
import 'package:intl/intl.dart';
|
|
|
|
/// Parse the entire response
|
|
ExpenseResponse expenseResponseFromJson(String str) =>
|
|
ExpenseResponse.fromJson(json.decode(str));
|
|
|
|
String expenseResponseToJson(ExpenseResponse data) =>
|
|
json.encode(data.toJson());
|
|
|
|
class ExpenseResponse {
|
|
final bool success;
|
|
final String message;
|
|
final ExpenseData data;
|
|
final dynamic errors;
|
|
final int statusCode;
|
|
final DateTime timestamp;
|
|
|
|
ExpenseResponse({
|
|
required this.success,
|
|
required this.message,
|
|
required this.data,
|
|
required this.errors,
|
|
required this.statusCode,
|
|
required this.timestamp,
|
|
});
|
|
|
|
factory ExpenseResponse.fromJson(Map<String, dynamic> json) {
|
|
final dataField = json["data"];
|
|
return ExpenseResponse(
|
|
success: json["success"] ?? false,
|
|
message: json["message"] ?? '',
|
|
data: (dataField is Map<String, dynamic>)
|
|
? ExpenseData.fromJson(dataField)
|
|
: ExpenseData.empty(),
|
|
errors: json["errors"],
|
|
statusCode: json["statusCode"] ?? 0,
|
|
timestamp: DateTime.tryParse(json["timestamp"] ?? '') ?? DateTime.now(),
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"success": success,
|
|
"message": message,
|
|
"data": data.toJson(),
|
|
"errors": errors,
|
|
"statusCode": statusCode,
|
|
"timestamp": timestamp.toIso8601String(),
|
|
};
|
|
}
|
|
|
|
class ExpenseData {
|
|
final Filter? filter;
|
|
final int currentPage;
|
|
final int totalPages;
|
|
final int totalEntites;
|
|
final List<ExpenseModel> data;
|
|
|
|
ExpenseData({
|
|
required this.filter,
|
|
required this.currentPage,
|
|
required this.totalPages,
|
|
required this.totalEntites,
|
|
required this.data,
|
|
});
|
|
|
|
factory ExpenseData.fromJson(Map<String, dynamic> json) => ExpenseData(
|
|
filter: json["filter"] != null ? Filter.fromJson(json["filter"]) : null,
|
|
currentPage: json["currentPage"] ?? 0,
|
|
totalPages: json["totalPages"] ?? 0,
|
|
totalEntites: json["totalEntites"] ?? 0,
|
|
data: (json["data"] as List<dynamic>? ?? [])
|
|
.map((x) => ExpenseModel.fromJson(x))
|
|
.toList(),
|
|
);
|
|
|
|
factory ExpenseData.empty() => ExpenseData(
|
|
filter: null,
|
|
currentPage: 0,
|
|
totalPages: 0,
|
|
totalEntites: 0,
|
|
data: [],
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"filter": filter?.toJson(),
|
|
"currentPage": currentPage,
|
|
"totalPages": totalPages,
|
|
"totalEntites": totalEntites,
|
|
"data": List<dynamic>.from(data.map((x) => x.toJson())),
|
|
};
|
|
}
|
|
|
|
class Filter {
|
|
final List<String> projectIds;
|
|
final List<String> statusIds;
|
|
final List<String> createdByIds;
|
|
final List<String> paidById;
|
|
final DateTime? startDate;
|
|
final DateTime? endDate;
|
|
|
|
Filter({
|
|
required this.projectIds,
|
|
required this.statusIds,
|
|
required this.createdByIds,
|
|
required this.paidById,
|
|
required this.startDate,
|
|
required this.endDate,
|
|
});
|
|
|
|
factory Filter.fromJson(Map<String, dynamic> json) => Filter(
|
|
projectIds: List<String>.from(json["projectIds"] ?? []),
|
|
statusIds: List<String>.from(json["statusIds"] ?? []),
|
|
createdByIds: List<String>.from(json["createdByIds"] ?? []),
|
|
paidById: List<String>.from(json["paidById"] ?? []),
|
|
startDate: json["startDate"] != null
|
|
? DateTime.tryParse(json["startDate"])
|
|
: null,
|
|
endDate:
|
|
json["endDate"] != null ? DateTime.tryParse(json["endDate"]) : null,
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"projectIds": projectIds,
|
|
"statusIds": statusIds,
|
|
"createdByIds": createdByIds,
|
|
"paidById": paidById,
|
|
"startDate": startDate?.toIso8601String(),
|
|
"endDate": endDate?.toIso8601String(),
|
|
};
|
|
}
|
|
|
|
// --- ExpenseModel and other classes remain same as you wrote ---
|
|
// I will include them here for completeness.
|
|
|
|
class ExpenseModel {
|
|
final String id;
|
|
final Project project;
|
|
final ExpenseType expensesType;
|
|
final PaymentMode paymentMode;
|
|
final PaidBy paidBy;
|
|
final CreatedBy createdBy;
|
|
final DateTime transactionDate;
|
|
final DateTime createdAt;
|
|
final String supplerName;
|
|
final double amount;
|
|
final Status status;
|
|
final List<Status> nextStatus;
|
|
final bool preApproved;
|
|
|
|
ExpenseModel({
|
|
required this.id,
|
|
required this.project,
|
|
required this.expensesType,
|
|
required this.paymentMode,
|
|
required this.paidBy,
|
|
required this.createdBy,
|
|
required this.transactionDate,
|
|
required this.createdAt,
|
|
required this.supplerName,
|
|
required this.amount,
|
|
required this.status,
|
|
required this.nextStatus,
|
|
required this.preApproved,
|
|
});
|
|
|
|
/// ✅ Comma-separated amount getter with currency symbol
|
|
String get formattedAmount {
|
|
final formatter = NumberFormat.currency(
|
|
locale: 'en_IN',
|
|
symbol: '₹ ',
|
|
decimalDigits: 2,
|
|
);
|
|
return formatter.format(amount);
|
|
}
|
|
|
|
factory ExpenseModel.fromJson(Map<String, dynamic> json) => ExpenseModel(
|
|
id: json["id"] ?? '',
|
|
project: Project.fromJson(json["project"] ?? {}),
|
|
expensesType: ExpenseType.fromJson(json["expensesType"] ?? {}),
|
|
paymentMode: PaymentMode.fromJson(json["paymentMode"] ?? {}),
|
|
paidBy: PaidBy.fromJson(json["paidBy"] ?? {}),
|
|
createdBy: CreatedBy.fromJson(json["createdBy"] ?? {}),
|
|
transactionDate:
|
|
DateTime.tryParse(json["transactionDate"] ?? '') ?? DateTime.now(),
|
|
createdAt: DateTime.tryParse(json["createdAt"] ?? '') ?? DateTime.now(),
|
|
supplerName: json["supplerName"] ?? '',
|
|
amount: (json["amount"] ?? 0).toDouble(),
|
|
status: Status.fromJson(json["status"] ?? {}),
|
|
nextStatus: (json["nextStatus"] as List<dynamic>? ?? [])
|
|
.map((x) => Status.fromJson(x))
|
|
.toList(),
|
|
preApproved: json["preApproved"] ?? false,
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"project": project.toJson(),
|
|
"expensesType": expensesType.toJson(),
|
|
"paymentMode": paymentMode.toJson(),
|
|
"paidBy": paidBy.toJson(),
|
|
"createdBy": createdBy.toJson(),
|
|
"transactionDate": transactionDate.toIso8601String(),
|
|
"createdAt": createdAt.toIso8601String(),
|
|
"supplerName": supplerName,
|
|
"amount": amount,
|
|
"status": status.toJson(),
|
|
"nextStatus": List<dynamic>.from(nextStatus.map((x) => x.toJson())),
|
|
"preApproved": preApproved,
|
|
};
|
|
}
|
|
|
|
class Project {
|
|
final String id;
|
|
final String name;
|
|
final String shortName;
|
|
final String projectAddress;
|
|
final String contactPerson;
|
|
final DateTime startDate;
|
|
final DateTime endDate;
|
|
final String projectStatusId;
|
|
|
|
Project({
|
|
required this.id,
|
|
required this.name,
|
|
required this.shortName,
|
|
required this.projectAddress,
|
|
required this.contactPerson,
|
|
required this.startDate,
|
|
required this.endDate,
|
|
required this.projectStatusId,
|
|
});
|
|
|
|
factory Project.fromJson(Map<String, dynamic> json) => Project(
|
|
id: json["id"] ?? '',
|
|
name: json["name"] ?? '',
|
|
shortName: json["shortName"] ?? '',
|
|
projectAddress: json["projectAddress"] ?? '',
|
|
contactPerson: json["contactPerson"] ?? '',
|
|
startDate: DateTime.tryParse(json["startDate"] ?? '') ?? DateTime.now(),
|
|
endDate: DateTime.tryParse(json["endDate"] ?? '') ?? DateTime.now(),
|
|
projectStatusId: json["projectStatusId"] ?? '',
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"name": name,
|
|
"shortName": shortName,
|
|
"projectAddress": projectAddress,
|
|
"contactPerson": contactPerson,
|
|
"startDate": startDate.toIso8601String(),
|
|
"endDate": endDate.toIso8601String(),
|
|
"projectStatusId": projectStatusId,
|
|
};
|
|
}
|
|
|
|
class ExpenseType {
|
|
final String id;
|
|
final String name;
|
|
final bool noOfPersonsRequired;
|
|
final String description;
|
|
|
|
ExpenseType({
|
|
required this.id,
|
|
required this.name,
|
|
required this.noOfPersonsRequired,
|
|
required this.description,
|
|
});
|
|
|
|
factory ExpenseType.fromJson(Map<String, dynamic> json) => ExpenseType(
|
|
id: json["id"] ?? '',
|
|
name: json["name"] ?? '',
|
|
noOfPersonsRequired: json["noOfPersonsRequired"] ?? false,
|
|
description: json["description"] ?? '',
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"name": name,
|
|
"noOfPersonsRequired": noOfPersonsRequired,
|
|
"description": description,
|
|
};
|
|
}
|
|
|
|
class PaymentMode {
|
|
final String id;
|
|
final String name;
|
|
final String description;
|
|
|
|
PaymentMode({
|
|
required this.id,
|
|
required this.name,
|
|
required this.description,
|
|
});
|
|
|
|
factory PaymentMode.fromJson(Map<String, dynamic> json) => PaymentMode(
|
|
id: json["id"] ?? '',
|
|
name: json["name"] ?? '',
|
|
description: json["description"] ?? '',
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"name": name,
|
|
"description": description,
|
|
};
|
|
}
|
|
|
|
class PaidBy {
|
|
final String id;
|
|
final String firstName;
|
|
final String lastName;
|
|
final String photo;
|
|
final String jobRoleId;
|
|
final String? jobRoleName;
|
|
|
|
PaidBy({
|
|
required this.id,
|
|
required this.firstName,
|
|
required this.lastName,
|
|
required this.photo,
|
|
required this.jobRoleId,
|
|
this.jobRoleName,
|
|
});
|
|
|
|
factory PaidBy.fromJson(Map<String, dynamic> json) => PaidBy(
|
|
id: json["id"] ?? '',
|
|
firstName: json["firstName"] ?? '',
|
|
lastName: json["lastName"] ?? '',
|
|
photo: json["photo"] ?? '',
|
|
jobRoleId: json["jobRoleId"] ?? '',
|
|
jobRoleName: json["jobRoleName"],
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"firstName": firstName,
|
|
"lastName": lastName,
|
|
"photo": photo,
|
|
"jobRoleId": jobRoleId,
|
|
"jobRoleName": jobRoleName,
|
|
};
|
|
}
|
|
|
|
class CreatedBy {
|
|
final String id;
|
|
final String firstName;
|
|
final String lastName;
|
|
final String photo;
|
|
final String jobRoleId;
|
|
final String? jobRoleName;
|
|
|
|
CreatedBy({
|
|
required this.id,
|
|
required this.firstName,
|
|
required this.lastName,
|
|
required this.photo,
|
|
required this.jobRoleId,
|
|
this.jobRoleName,
|
|
});
|
|
|
|
factory CreatedBy.fromJson(Map<String, dynamic> json) => CreatedBy(
|
|
id: json["id"] ?? '',
|
|
firstName: json["firstName"] ?? '',
|
|
lastName: json["lastName"] ?? '',
|
|
photo: json["photo"] ?? '',
|
|
jobRoleId: json["jobRoleId"] ?? '',
|
|
jobRoleName: json["jobRoleName"],
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"firstName": firstName,
|
|
"lastName": lastName,
|
|
"photo": photo,
|
|
"jobRoleId": jobRoleId,
|
|
"jobRoleName": jobRoleName,
|
|
};
|
|
}
|
|
|
|
class Status {
|
|
final String id;
|
|
final String name;
|
|
final String displayName;
|
|
final String description;
|
|
final String color;
|
|
final bool isSystem;
|
|
|
|
Status({
|
|
required this.id,
|
|
required this.name,
|
|
required this.displayName,
|
|
required this.description,
|
|
required this.color,
|
|
required this.isSystem,
|
|
});
|
|
|
|
factory Status.fromJson(Map<String, dynamic> json) => Status(
|
|
id: json["id"] ?? '',
|
|
name: json["name"] ?? '',
|
|
displayName: json["displayName"] ?? '',
|
|
description: json["description"] ?? '',
|
|
color: (json["color"] ?? '').replaceAll("'", ''),
|
|
isSystem: json["isSystem"] ?? false,
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
"id": id,
|
|
"name": name,
|
|
"displayName": displayName,
|
|
"description": description,
|
|
"color": color,
|
|
"isSystem": isSystem,
|
|
};
|
|
}
|