import '../../shared/models/approval_status.dart'; class ExpenseApplicationModel { final String id; final String applicationNo; final String applicantId; final String applicantName; final String deptId; final String deptName; final String expenseType; final double estimatedAmount; final String purpose; final String remark; final String status; final String currentApproverId; final List approvalChain; final DateTime createTime; final DateTime updateTime; final List details; final List approvalRecords; const ExpenseApplicationModel({ required this.id, required this.applicationNo, this.applicantId = '', this.applicantName = '', this.deptId = '', this.deptName = '', this.expenseType = '', this.estimatedAmount = 0.0, this.purpose = '', this.remark = '', this.status = 'draft', this.currentApproverId = '', this.approvalChain = const [], required this.createTime, required this.updateTime, this.details = const [], this.approvalRecords = const [], }); factory ExpenseApplicationModel.fromJson(Map json) { return ExpenseApplicationModel( id: json['id'] as String, applicationNo: json['applicationNo'] as String? ?? '', applicantId: json['applicantId'] as String? ?? '', applicantName: json['applicantName'] as String? ?? '', deptId: json['deptId'] as String? ?? '', deptName: json['deptName'] as String? ?? '', expenseType: json['expenseType'] as String? ?? '', estimatedAmount: (json['estimatedAmount'] as num?)?.toDouble() ?? 0.0, purpose: json['purpose'] as String? ?? '', remark: json['remark'] as String? ?? '', status: json['status'] as String? ?? 'draft', currentApproverId: json['currentApproverId'] as String? ?? '', approvalChain: (json['approvalChain'] as List?) ?.map((e) => e as String) .toList() ?? [], createTime: DateTime.parse(json['createTime'] as String), updateTime: DateTime.parse(json['updateTime'] as String), details: (json['details'] as List?) ?.map((e) => ExpenseAppDetailModel.fromJson(e as Map)) .toList() ?? [], approvalRecords: (json['approvalRecords'] as List?) ?.map((e) => ApprovalRecord.fromJson(e as Map)) .toList() ?? [], ); } Map toJson() => { 'id': id, 'applicationNo': applicationNo, 'applicantId': applicantId, 'applicantName': applicantName, 'deptId': deptId, 'deptName': deptName, 'expenseType': expenseType, 'estimatedAmount': estimatedAmount, 'purpose': purpose, 'remark': remark, 'status': status, 'currentApproverId': currentApproverId, 'approvalChain': approvalChain, 'createTime': createTime.toIso8601String(), 'updateTime': updateTime.toIso8601String(), 'details': details.map((d) => d.toJson()).toList(), 'approvalRecords': approvalRecords.map((r) => r.toJson()).toList(), }; ExpenseApplicationModel copyWith({ String? id, String? applicationNo, String? applicantId, String? applicantName, String? deptId, String? deptName, String? expenseType, double? estimatedAmount, String? purpose, String? remark, String? status, String? currentApproverId, List? approvalChain, DateTime? createTime, DateTime? updateTime, List? details, List? approvalRecords, }) { return ExpenseApplicationModel( id: id ?? this.id, applicationNo: applicationNo ?? this.applicationNo, applicantId: applicantId ?? this.applicantId, applicantName: applicantName ?? this.applicantName, deptId: deptId ?? this.deptId, deptName: deptName ?? this.deptName, expenseType: expenseType ?? this.expenseType, estimatedAmount: estimatedAmount ?? this.estimatedAmount, purpose: purpose ?? this.purpose, remark: remark ?? this.remark, status: status ?? this.status, currentApproverId: currentApproverId ?? this.currentApproverId, approvalChain: approvalChain ?? this.approvalChain, createTime: createTime ?? this.createTime, updateTime: updateTime ?? this.updateTime, details: details ?? this.details, approvalRecords: approvalRecords ?? this.approvalRecords, ); } } class ExpenseAppDetailModel { final String id; final String applicationId; final String itemName; final double estimatedAmount; final String remark; final int sortOrder; const ExpenseAppDetailModel({ required this.id, this.applicationId = '', this.itemName = '', this.estimatedAmount = 0.0, this.remark = '', this.sortOrder = 1, }); factory ExpenseAppDetailModel.fromJson(Map json) { return ExpenseAppDetailModel( id: json['id'] as String, applicationId: json['applicationId'] as String? ?? '', itemName: json['itemName'] as String? ?? '', estimatedAmount: (json['estimatedAmount'] as num?)?.toDouble() ?? 0.0, remark: json['remark'] as String? ?? '', sortOrder: json['sortOrder'] as int? ?? 1, ); } Map toJson() => { 'id': id, 'applicationId': applicationId, 'itemName': itemName, 'estimatedAmount': estimatedAmount, 'remark': remark, 'sortOrder': sortOrder, }; }