93 lines
2.9 KiB
Dart
93 lines
2.9 KiB
Dart
import 'dart:convert';
|
|
import 'package:get/get.dart';
|
|
import 'package:siro_admin/constant/links.dart';
|
|
import 'package:siro_admin/controller/functions/crud.dart';
|
|
import 'package:siro_admin/views/widgets/snackbar.dart';
|
|
import '../../print.dart';
|
|
|
|
/// طلبات سحب أرصدة السائقين (جدول driver_withdrawal_requests على خادم
|
|
/// المدفوعات). لم تكن لها واجهة إطلاقاً قبل هذا: السائق يرسل الطلب فيُخزَّن
|
|
/// وتُرسل رسالة واتساب لحظية، ثم لا يقرأ الجدول أحد.
|
|
class WithdrawalController extends GetxController {
|
|
bool isLoading = true;
|
|
List<dynamic> requests = [];
|
|
Map<String, dynamic> totals = {};
|
|
String filter = 'pending';
|
|
|
|
/// المعرّف قيد المعالجة — لتعطيل أزرار الصف أثناء الطلب ومنع النقر المزدوج
|
|
int? busyId;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
fetchRequests();
|
|
}
|
|
|
|
Future<void> changeFilter(String next) async {
|
|
if (filter == next) return;
|
|
filter = next;
|
|
await fetchRequests();
|
|
}
|
|
|
|
Future<void> fetchRequests() async {
|
|
isLoading = true;
|
|
update();
|
|
|
|
try {
|
|
var res = await CRUD().getWallet(
|
|
link: AppLink.withdrawalRequests,
|
|
payload: {'action': 'list', 'status': filter},
|
|
);
|
|
if (res != 'failure' && res != null) {
|
|
var d = res is String ? jsonDecode(res) : res;
|
|
if (d['status'] == 'success' && d['data'] is Map) {
|
|
requests = d['data']['requests'] ?? [];
|
|
totals = Map<String, dynamic>.from(d['data']['totals'] ?? {});
|
|
} else {
|
|
mySnackbarError('${d['message'] ?? 'تعذّر جلب طلبات السحب'}');
|
|
}
|
|
}
|
|
} catch (e) {
|
|
Log.print('Error fetching withdrawal requests: $e');
|
|
mySnackbarError('$e');
|
|
}
|
|
|
|
isLoading = false;
|
|
update();
|
|
}
|
|
|
|
/// تغيير الحالة يتطلّب super_admin على الخادم؛ الخادم يرفض أيضاً أي انتقال
|
|
/// غير مسموح (مثل إعادة فتح طلب مرفوض) بـ 409، فنعرض رسالته كما هي.
|
|
Future<void> updateStatus(int id, String status) async {
|
|
busyId = id;
|
|
update();
|
|
|
|
try {
|
|
var res = await CRUD().getWallet(
|
|
link: AppLink.withdrawalRequests,
|
|
payload: {
|
|
'action': 'update_status',
|
|
'id': id.toString(),
|
|
'status': status,
|
|
},
|
|
);
|
|
if (res != 'failure' && res != null) {
|
|
var d = res is String ? jsonDecode(res) : res;
|
|
if (d['status'] == 'success') {
|
|
mySnackbarSuccess('تم تحديث حالة الطلب');
|
|
busyId = null;
|
|
await fetchRequests();
|
|
return;
|
|
}
|
|
mySnackbarError('${d['message'] ?? 'تعذّر تحديث الحالة'}');
|
|
}
|
|
} catch (e) {
|
|
Log.print('Error updating withdrawal status: $e');
|
|
mySnackbarError('$e');
|
|
}
|
|
|
|
busyId = null;
|
|
update();
|
|
}
|
|
}
|