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; final status = statusFromPayment(current); final paymentRef = current.paymentRef ?? ''; return status == OperationStatus.success && paymentRef.trim().isNotEmpty; } OperationDocumentRequestModel? operationDocumentRequest( PaymentExecutionOperation operation, ) { final current = _payment; if (current == null) return null; final paymentRef = current.paymentRef?.trim() ?? ''; if (paymentRef.isEmpty) return null; final operationRef = operation.operationRef; if (operationRef == null || operationRef.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( paymentRef: paymentRef, 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 refresh() async { await _payments?.refresh(); } void _rebuild() { _payment = _findPayment(_payments?.payments ?? const [], _paymentId); notifyListeners(); } Payment? _findPayment(List 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; } }