Files
sendico/frontend/pshared/lib/service/payment/documents.dart
2026-03-04 17:43:18 +03:00

58 lines
2.0 KiB
Dart

import 'package:logging/logging.dart';
import 'package:pshared/models/file/downloaded_file.dart';
import 'package:pshared/service/authorization/service.dart';
import 'package:pshared/service/services.dart';
class PaymentDocumentsService {
static final _logger = Logger('service.payment_documents');
static const String _objectType = Services.payments;
static Future<DownloadedFile> getAct(
String organizationRef,
String paymentRef, {
String? operationRef,
}) async {
final query = <String, String>{'payment_ref': paymentRef};
final operationRefValue = operationRef;
if (operationRefValue != null && operationRefValue.isNotEmpty) {
query['operation_ref'] = operationRefValue;
query['operationRef'] = operationRefValue;
}
final queryString = Uri(queryParameters: query).query;
final url = '/documents/act/$organizationRef?$queryString';
_logger.fine('Downloading act document for payment $paymentRef');
final response = await AuthorizationService.getGETBinaryResponse(
_objectType,
url,
);
final filename =
_filenameFromDisposition(response.header('content-disposition')) ??
'act_$paymentRef.pdf';
final mimeType = response.header('content-type') ?? 'application/pdf';
return DownloadedFile(
bytes: response.bytes,
filename: filename,
mimeType: mimeType,
);
}
static String? _filenameFromDisposition(String? disposition) {
if (disposition == null || disposition.isEmpty) return null;
final parts = disposition.split(';');
for (final part in parts) {
final trimmed = part.trim();
if (trimmed.toLowerCase().startsWith('filename=')) {
var value = trimmed.substring('filename='.length).trim();
if (value.startsWith('"') && value.endsWith('"') && value.length > 1) {
value = value.substring(1, value.length - 1);
}
if (value.isNotEmpty) {
return value;
}
}
}
return null;
}
}