Vaibhav_Feature-#768 #59
@ -72,15 +72,12 @@ class ExpenseController extends GetxController {
|
|||||||
|
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
try {
|
try {
|
||||||
final List<dynamic> rawList = result['expenses'] ?? [];
|
final expenseResponse = ExpenseResponse.fromJson(result);
|
||||||
final parsed = rawList
|
expenses.assignAll(expenseResponse.data.data);
|
||||||
.map((e) => ExpenseModel.fromJson(e as Map<String, dynamic>))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
expenses.assignAll(parsed);
|
logSafe("Expenses loaded: ${expenses.length}");
|
||||||
logSafe("Expenses loaded: ${parsed.length}");
|
|
||||||
logSafe(
|
logSafe(
|
||||||
"Pagination Info: Page ${result['currentPage']} of ${result['totalPages']} | Total: ${result['totalEntites']}");
|
"Pagination Info: Page ${expenseResponse.data.currentPage} of ${expenseResponse.data.totalPages} | Total: ${expenseResponse.data.totalEntites}");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
errorMessage.value = 'Failed to parse expenses: $e';
|
errorMessage.value = 'Failed to parse expenses: $e';
|
||||||
logSafe("Parse error in fetchExpenses: $e", level: LogLevel.error);
|
logSafe("Parse error in fetchExpenses: $e", level: LogLevel.error);
|
||||||
|
|||||||
@ -308,27 +308,25 @@ class ApiService {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
final response = await _getRequest(uri.toString());
|
final response = await _getRequest(uri.toString());
|
||||||
if (response == null) return null;
|
if (response == null) {
|
||||||
|
logSafe("Expense list request failed: null response",
|
||||||
|
level: LogLevel.error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
final parsed = _parseResponseForAllData(response, label: 'Expense List');
|
// Directly parse and return the entire JSON response
|
||||||
|
final body = response.body.trim();
|
||||||
|
if (body.isEmpty) {
|
||||||
|
logSafe("Expense list response body is empty", level: LogLevel.error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (parsed != null && parsed['data'] is Map<String, dynamic>) {
|
final jsonResponse = jsonDecode(body);
|
||||||
final dataObj = parsed['data'] as Map<String, dynamic>;
|
if (jsonResponse is Map<String, dynamic>) {
|
||||||
|
logSafe("Expense list response parsed successfully");
|
||||||
if (dataObj['data'] is List) {
|
return jsonResponse; // Return the entire API response
|
||||||
return {
|
|
||||||
'currentPage': dataObj['currentPage'] ?? 1,
|
|
||||||
'totalPages': dataObj['totalPages'] ?? 1,
|
|
||||||
'totalEntites': dataObj['totalEntites'] ?? 0,
|
|
||||||
'expenses': List<dynamic>.from(dataObj['data']),
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
logSafe("Expense list 'data' is not a list: $dataObj",
|
|
||||||
level: LogLevel.error);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
logSafe("Unexpected response structure: $parsed",
|
logSafe("Unexpected response structure: $jsonResponse",
|
||||||
level: LogLevel.error);
|
level: LogLevel.error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,77 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
List<ExpenseModel> expenseModelFromJson(String str) {
|
/// Parse the entire response
|
||||||
final jsonData = json.decode(str);
|
ExpenseResponse expenseResponseFromJson(String str) =>
|
||||||
return List<ExpenseModel>.from(
|
ExpenseResponse.fromJson(json.decode(str));
|
||||||
jsonData["data"]["data"].map((x) => ExpenseModel.fromJson(x))
|
|
||||||
);
|
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) =>
|
||||||
|
ExpenseResponse(
|
||||||
|
success: json["success"],
|
||||||
|
message: json["message"],
|
||||||
|
data: ExpenseData.fromJson(json["data"]),
|
||||||
|
errors: json["errors"],
|
||||||
|
statusCode: json["statusCode"],
|
||||||
|
timestamp: DateTime.parse(json["timestamp"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"success": success,
|
||||||
|
"message": message,
|
||||||
|
"data": data.toJson(),
|
||||||
|
"errors": errors,
|
||||||
|
"statusCode": statusCode,
|
||||||
|
"timestamp": timestamp.toIso8601String(),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
String expenseModelToJson(List<ExpenseModel> data) =>
|
class ExpenseData {
|
||||||
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
|
final int currentPage;
|
||||||
|
final int totalPages;
|
||||||
|
final int totalEntites;
|
||||||
|
final List<ExpenseModel> data;
|
||||||
|
|
||||||
|
ExpenseData({
|
||||||
|
required this.currentPage,
|
||||||
|
required this.totalPages,
|
||||||
|
required this.totalEntites,
|
||||||
|
required this.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory ExpenseData.fromJson(Map<String, dynamic> json) => ExpenseData(
|
||||||
|
currentPage: json["currentPage"],
|
||||||
|
totalPages: json["totalPages"],
|
||||||
|
totalEntites: json["totalEntites"],
|
||||||
|
data: List<ExpenseModel>.from(
|
||||||
|
json["data"].map((x) => ExpenseModel.fromJson(x))),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"currentPage": currentPage,
|
||||||
|
"totalPages": totalPages,
|
||||||
|
"totalEntites": totalEntites,
|
||||||
|
"data": List<dynamic>.from(data.map((x) => x.toJson())),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
class ExpenseModel {
|
class ExpenseModel {
|
||||||
final String id;
|
final String id;
|
||||||
@ -53,9 +116,12 @@ class ExpenseModel {
|
|||||||
supplerName: json["supplerName"],
|
supplerName: json["supplerName"],
|
||||||
amount: (json["amount"] as num).toDouble(),
|
amount: (json["amount"] as num).toDouble(),
|
||||||
status: Status.fromJson(json["status"]),
|
status: Status.fromJson(json["status"]),
|
||||||
nextStatus: List<Status>.from(
|
nextStatus: json["nextStatus"] != null
|
||||||
json["nextStatus"].map((x) => Status.fromJson(x))),
|
? List<Status>.from(
|
||||||
preApproved: json["preApproved"],
|
json["nextStatus"].map((x) => Status.fromJson(x)),
|
||||||
|
)
|
||||||
|
: [],
|
||||||
|
preApproved: json["preApproved"] ?? false,
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user