- Created ExpenseModel, Project, ExpenseType, PaymentMode, PaidBy, CreatedBy, and Status classes for expense management. - Implemented JSON serialization and deserialization for expense models. - Added ExpenseStatusModel and ExpenseTypeModel for handling status and type of expenses. - Introduced PaymentModeModel for managing payment modes. - Refactored ExpenseDetailScreen to utilize the new ExpenseModel structure. - Enhanced UI components for better display of expense details. - Added search and filter functionality in ExpenseMainScreen. - Updated dependencies in pubspec.yaml to include geocoding package.
43 lines
1.5 KiB
Dart
43 lines
1.5 KiB
Dart
import 'package:get/get.dart';
|
|
import 'package:marco/helpers/services/api_service.dart';
|
|
import 'package:marco/helpers/services/app_logger.dart';
|
|
import 'package:marco/model/expense/expense_list_model.dart';
|
|
|
|
class ExpenseController extends GetxController {
|
|
final RxList<ExpenseModel> expenses = <ExpenseModel>[].obs;
|
|
final RxBool isLoading = false.obs;
|
|
final RxString errorMessage = ''.obs;
|
|
|
|
/// Fetch all expenses from API
|
|
Future<void> fetchExpenses() async {
|
|
isLoading.value = true;
|
|
errorMessage.value = '';
|
|
|
|
try {
|
|
final result = await ApiService.getExpenseListApi();
|
|
|
|
if (result != null) {
|
|
try {
|
|
// Convert the raw result (List<dynamic>) to List<ExpenseModel>
|
|
final List<ExpenseModel> parsed = List<ExpenseModel>.from(
|
|
result.map((e) => ExpenseModel.fromJson(e)));
|
|
expenses.assignAll(parsed);
|
|
logSafe("Expenses loaded: ${parsed.length}");
|
|
} catch (e) {
|
|
errorMessage.value = 'Failed to parse expenses: $e';
|
|
logSafe("Parse error in fetchExpenses: $e", level: LogLevel.error);
|
|
}
|
|
} else {
|
|
errorMessage.value = 'Failed to fetch expenses from server.';
|
|
logSafe("fetchExpenses failed: null response", level: LogLevel.error);
|
|
}
|
|
} catch (e, stack) {
|
|
errorMessage.value = 'An unexpected error occurred.';
|
|
logSafe("Exception in fetchExpenses: $e", level: LogLevel.error);
|
|
logSafe("StackTrace: $stack", level: LogLevel.debug);
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
}
|