updated document upload according to fresh api
This commit is contained in:
@@ -26,9 +26,20 @@ class PaymentDetailsController extends ChangeNotifier {
|
||||
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;
|
||||
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(
|
||||
@@ -37,18 +48,17 @@ class PaymentDetailsController extends ChangeNotifier {
|
||||
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 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(
|
||||
paymentRef: paymentRef,
|
||||
gatewayService: gatewayService,
|
||||
operationRef: operationRef,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
class OperationDocumentRequestModel {
|
||||
final String paymentRef;
|
||||
final String gatewayService;
|
||||
final String operationRef;
|
||||
|
||||
const OperationDocumentRequestModel({
|
||||
required this.paymentRef,
|
||||
required this.gatewayService,
|
||||
required this.operationRef,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
9
frontend/pweb/lib/models/report/operation/document.dart
Normal file
9
frontend/pweb/lib/models/report/operation/document.dart
Normal file
@@ -0,0 +1,9 @@
|
||||
class OperationDocumentInfo {
|
||||
final String operationRef;
|
||||
final String gatewayService;
|
||||
|
||||
const OperationDocumentInfo({
|
||||
required this.operationRef,
|
||||
required this.gatewayService,
|
||||
});
|
||||
}
|
||||
@@ -65,7 +65,15 @@ class _PaymentDetailsView extends StatelessWidget {
|
||||
payment: payment,
|
||||
onBack: () => _handleBack(context),
|
||||
onDownloadAct: controller.canDownload
|
||||
? () => downloadPaymentAct(context, payment.paymentRef ?? '')
|
||||
? () {
|
||||
final request = controller.primaryOperationDocumentRequest;
|
||||
if (request == null) return;
|
||||
downloadPaymentAct(
|
||||
context,
|
||||
gatewayService: request.gatewayService,
|
||||
operationRef: request.operationRef,
|
||||
);
|
||||
}
|
||||
: null,
|
||||
canDownloadOperationDocument:
|
||||
controller.canDownloadOperationDocument,
|
||||
@@ -74,7 +82,7 @@ class _PaymentDetailsView extends StatelessWidget {
|
||||
if (request == null) return;
|
||||
downloadPaymentAct(
|
||||
context,
|
||||
request.paymentRef,
|
||||
gatewayService: request.gatewayService,
|
||||
operationRef: request.operationRef,
|
||||
);
|
||||
},
|
||||
|
||||
@@ -9,7 +9,6 @@ import 'package:pweb/utils/report/download_act.dart';
|
||||
|
||||
import 'package:pweb/generated/i18n/app_localizations.dart';
|
||||
|
||||
|
||||
class OperationRow {
|
||||
static DataRow build(OperationItem op, BuildContext context) {
|
||||
final isUnknownDate = op.date.millisecondsSinceEpoch == 0;
|
||||
@@ -18,29 +17,37 @@ class OperationRow {
|
||||
final dateLabel = isUnknownDate
|
||||
? '-'
|
||||
: '${TimeOfDay.fromDateTime(localDate).format(context)}\n'
|
||||
'${localDate.toIso8601String().split("T").first}';
|
||||
'${localDate.toIso8601String().split("T").first}';
|
||||
|
||||
final canDownload = op.status == OperationStatus.success &&
|
||||
(op.paymentRef ?? '').trim().isNotEmpty;
|
||||
final canDownload =
|
||||
op.status == OperationStatus.success &&
|
||||
(op.operationRef ?? '').trim().isNotEmpty &&
|
||||
(op.gatewayService ?? '').trim().isNotEmpty;
|
||||
|
||||
final documentCell = canDownload
|
||||
? TextButton.icon(
|
||||
onPressed: () => downloadPaymentAct(context, op.paymentRef ?? ''),
|
||||
onPressed: () => downloadPaymentAct(
|
||||
context,
|
||||
gatewayService: op.gatewayService ?? '',
|
||||
operationRef: op.operationRef ?? '',
|
||||
),
|
||||
icon: const Icon(Icons.download),
|
||||
label: Text(loc.downloadAct),
|
||||
)
|
||||
: Text(op.fileName ?? '');
|
||||
|
||||
return DataRow(cells: [
|
||||
DataCell(OperationStatusBadge(status: op.status)),
|
||||
DataCell(documentCell),
|
||||
DataCell(Text('${amountToString(op.amount)} ${op.currency}')),
|
||||
DataCell(Text('${amountToString(op.toAmount)} ${op.toCurrency}')),
|
||||
DataCell(Text(op.payId)),
|
||||
DataCell(Text(op.cardNumber ?? '-')),
|
||||
DataCell(Text(op.name)),
|
||||
DataCell(Text(dateLabel)),
|
||||
DataCell(Text(op.comment)),
|
||||
]);
|
||||
return DataRow(
|
||||
cells: [
|
||||
DataCell(OperationStatusBadge(status: op.status)),
|
||||
DataCell(documentCell),
|
||||
DataCell(Text('${amountToString(op.amount)} ${op.currency}')),
|
||||
DataCell(Text('${amountToString(op.toAmount)} ${op.toCurrency}')),
|
||||
DataCell(Text(op.payId)),
|
||||
DataCell(Text(op.cardNumber ?? '-')),
|
||||
DataCell(Text(op.name)),
|
||||
DataCell(Text(dateLabel)),
|
||||
DataCell(Text(op.comment)),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,18 +10,18 @@ import 'package:pweb/utils/error/snackbar.dart';
|
||||
|
||||
import 'package:pweb/generated/i18n/app_localizations.dart';
|
||||
|
||||
|
||||
Future<void> downloadPaymentAct(
|
||||
BuildContext context,
|
||||
String paymentRef, {
|
||||
String? operationRef,
|
||||
BuildContext context, {
|
||||
required String gatewayService,
|
||||
required String operationRef,
|
||||
}) async {
|
||||
final organizations = context.read<OrganizationsProvider>();
|
||||
if (!organizations.isOrganizationSet) {
|
||||
return;
|
||||
}
|
||||
final trimmed = paymentRef.trim();
|
||||
if (trimmed.isEmpty) {
|
||||
final gateway = gatewayService.trim();
|
||||
final operation = operationRef.trim();
|
||||
if (gateway.isEmpty || operation.isEmpty) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -29,10 +29,10 @@ Future<void> downloadPaymentAct(
|
||||
await executeActionWithNotification(
|
||||
context: context,
|
||||
action: () async {
|
||||
final file = await PaymentDocumentsService.getAct(
|
||||
final file = await PaymentDocumentsService.getOperationDocument(
|
||||
organizations.current.id,
|
||||
trimmed,
|
||||
operationRef: operationRef,
|
||||
gateway,
|
||||
operation,
|
||||
);
|
||||
await downloadFile(file);
|
||||
},
|
||||
|
||||
@@ -4,6 +4,9 @@ import 'package:pshared/models/payment/state.dart';
|
||||
import 'package:pshared/models/payment/status.dart';
|
||||
import 'package:pshared/utils/money.dart';
|
||||
|
||||
import 'package:pweb/models/report/operation/document.dart';
|
||||
import 'package:pweb/utils/payment/operation_code.dart';
|
||||
|
||||
|
||||
OperationItem mapPaymentToOperation(Payment payment) {
|
||||
final debit = payment.lastQuote?.amounts?.sourceDebitTotal;
|
||||
@@ -33,6 +36,7 @@ OperationItem mapPaymentToOperation(Payment payment) {
|
||||
payment.state,
|
||||
]) ??
|
||||
'';
|
||||
final operationDocument = _resolveOperationDocument(payment);
|
||||
|
||||
return OperationItem(
|
||||
status: statusFromPayment(payment),
|
||||
@@ -43,6 +47,8 @@ OperationItem mapPaymentToOperation(Payment payment) {
|
||||
toCurrency: toCurrency,
|
||||
payId: payId,
|
||||
paymentRef: payment.paymentRef,
|
||||
operationRef: operationDocument?.operationRef,
|
||||
gatewayService: operationDocument?.gatewayService,
|
||||
cardNumber: null,
|
||||
name: name,
|
||||
date: resolvePaymentDate(payment),
|
||||
@@ -50,6 +56,25 @@ OperationItem mapPaymentToOperation(Payment payment) {
|
||||
);
|
||||
}
|
||||
|
||||
OperationDocumentInfo? _resolveOperationDocument(Payment payment) {
|
||||
for (final operation in payment.operations) {
|
||||
final operationRef = operation.operationRef;
|
||||
final gatewayService = operation.gateway;
|
||||
if (operationRef == null || operationRef.isEmpty) continue;
|
||||
if (gatewayService == null || gatewayService.isEmpty) continue;
|
||||
|
||||
final pair = parseOperationCodePair(operation.code);
|
||||
if (pair == null) continue;
|
||||
if (pair.operation != 'card_payout' || pair.action != 'send') continue;
|
||||
|
||||
return OperationDocumentInfo(
|
||||
operationRef: operationRef,
|
||||
gatewayService: gatewayService,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
OperationStatus statusFromPayment(Payment payment) {
|
||||
switch (payment.orchestrationState) {
|
||||
case PaymentOrchestrationState.failed:
|
||||
@@ -108,4 +133,4 @@ String? _firstNonEmpty(List<String?> values) {
|
||||
if (trimmed != null && trimmed.isNotEmpty) return trimmed;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user