100 lines
2.9 KiB
Dart
100 lines
2.9 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:pshared/models/payment/execution_operation.dart';
|
|
import 'package:pshared/models/payment/payment.dart';
|
|
import 'package:pshared/models/payment/status.dart';
|
|
import 'package:pshared/provider/payment/payments.dart';
|
|
import 'package:pweb/models/documents/operation.dart';
|
|
|
|
import 'package:pweb/utils/payment/operation_code.dart';
|
|
import 'package:pweb/utils/report/payment_mapper.dart';
|
|
|
|
|
|
class PaymentDetailsController extends ChangeNotifier {
|
|
PaymentDetailsController({required String paymentId})
|
|
: _paymentId = paymentId;
|
|
|
|
PaymentsProvider? _payments;
|
|
String _paymentId;
|
|
Payment? _payment;
|
|
|
|
String get paymentId => _paymentId;
|
|
Payment? get payment => _payment;
|
|
bool get isLoading => _payments?.isLoading ?? false;
|
|
Exception? get error => _payments?.error;
|
|
|
|
bool get canDownload {
|
|
final current = _payment;
|
|
if (current == null) return false;
|
|
if (statusFromPayment(current) != OperationStatus.success) return false;
|
|
return primaryOperationDocumentRequest != null;
|
|
}
|
|
|
|
OperationDocumentRequestModel? get primaryOperationDocumentRequest {
|
|
final current = _payment;
|
|
if (current == null) return null;
|
|
for (final operation in current.operations) {
|
|
final request = operationDocumentRequest(operation);
|
|
if (request != null) {
|
|
return request;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
OperationDocumentRequestModel? operationDocumentRequest(
|
|
PaymentExecutionOperation operation,
|
|
) {
|
|
final current = _payment;
|
|
if (current == null) return null;
|
|
|
|
final operationRef = operation.operationRef;
|
|
if (operationRef == null || operationRef.isEmpty) return null;
|
|
final gatewayService = operation.gateway;
|
|
if (gatewayService == null || gatewayService.isEmpty) return null;
|
|
|
|
final pair = parseOperationCodePair(operation.code);
|
|
if (pair == null) return null;
|
|
if (pair.operation != 'card_payout' || pair.action != 'send') return null;
|
|
|
|
return OperationDocumentRequestModel(
|
|
gatewayService: gatewayService,
|
|
operationRef: operationRef,
|
|
);
|
|
}
|
|
|
|
bool canDownloadOperationDocument(PaymentExecutionOperation operation) =>
|
|
operationDocumentRequest(operation) != null;
|
|
|
|
void update(PaymentsProvider provider, String paymentId) {
|
|
if (_paymentId != paymentId) {
|
|
_paymentId = paymentId;
|
|
}
|
|
|
|
if (!identical(_payments, provider)) {
|
|
_payments = provider;
|
|
}
|
|
|
|
_rebuild();
|
|
}
|
|
|
|
Future<void> refresh() async {
|
|
await _payments?.refresh();
|
|
}
|
|
|
|
void _rebuild() {
|
|
_payment = _findPayment(_payments?.payments ?? const [], _paymentId);
|
|
notifyListeners();
|
|
}
|
|
|
|
Payment? _findPayment(List<Payment> payments, String paymentId) {
|
|
final trimmed = paymentId.trim();
|
|
if (trimmed.isEmpty) return null;
|
|
for (final payment in payments) {
|
|
if (payment.paymentRef == trimmed) return payment;
|
|
if (payment.idempotencyKey == trimmed) return payment;
|
|
}
|
|
return null;
|
|
}
|
|
}
|