58 lines
2.0 KiB
Dart
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;
|
|
}
|
|
}
|