import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:http/http.dart' as http; import 'package:mobile_pos/constant.dart'; import 'package:mobile_pos/model/sale_transaction_model.dart'; import 'package:path_provider/path_provider.dart'; import 'package:pdf/widgets.dart' as pw; import 'package:permission_handler/permission_handler.dart'; import 'package:share_plus/share_plus.dart'; import '../Screens/PDF/pdf.dart'; import '../http_client/customer_http_client_get.dart'; class PDFCommonFunctions { //-------------------image Future getNetworkImage(String imageURL) async { if (imageURL.isEmpty) return null; try { final Uri uri = Uri.parse(imageURL); final String fileExtension = uri.path.split('.').last.toLowerCase(); if (fileExtension == 'png' || fileExtension == 'jpg' || fileExtension == 'jpeg') { final List responseBytes = await http.readBytes(uri); return Uint8List.fromList(responseBytes); } else if (fileExtension == 'svg') { CustomHttpClientGet clientGet = CustomHttpClientGet(client: http.Client()); final response = await clientGet.get(url: uri); return response.body; } else { print('Unsupported image type: $fileExtension'); return null; } } catch (e) { print('Error loading image: $e'); return null; } } Future loadAssetImage(String path) async { try { final ByteData data = await rootBundle.load(path); return data.buffer.asUint8List(); } catch (e) { print('Error loading local image: $e'); return null; } } int serialNumber = 1; // Initialize serial number num getProductQuantity({required num detailsId, required SalesTransactionModel transactions}) { num totalQuantity = transactions.salesDetails?.where((element) => element.id == detailsId).first.quantities ?? 0; if (transactions.salesReturns?.isNotEmpty ?? false) { for (var returns in transactions.salesReturns!) { if (returns.salesReturnDetails?.isNotEmpty ?? false) { for (var details in returns.salesReturnDetails!) { if (details.saleDetailId == detailsId) { totalQuantity += details.returnQty ?? 0; } } } } } return totalQuantity; } static Future savePdfAndShowPdf( {required BuildContext context, required String shopName, required String invoice, required pw.Document doc, bool? isShare, bool? download}) async { if (Platform.isIOS) { // EasyLoading.show(status: 'Generating PDF'); if (download ?? false) { EasyLoading.show(status: 'Downloading...'); } else { EasyLoading.show(status: 'Generating PDF'); } final dir = await getApplicationDocumentsDirectory(); final file = File('${dir.path}/${'$appsName-$shopName-$invoice'}.pdf'); final byteData = await doc.save(); try { await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); EasyLoading.showSuccess('Done'); if (isShare ?? false) { await SharePlus.instance.share(ShareParams( files: [XFile(file.path)], text: 'Here is your invoice PDF: ', )); } else if (download ?? false) { EasyLoading.showSuccess('Download successful! Check your Downloads folder'); } else { Navigator.push( context, MaterialPageRoute( builder: (context) => PDFViewerPage(path: file.path), ), ); } } on FileSystemException catch (err) { EasyLoading.showError(err.message); // handle error } } if (Platform.isAndroid) { var status = await Permission.storage.status; if (status != PermissionStatus.granted) { status = await Permission.storage.request(); } if (true) { if (download ?? false) { EasyLoading.show(status: 'Downloading...'); } else { EasyLoading.show(status: 'Generating PDF'); } const downloadsFolderPath = '/storage/emulated/0/Download/'; Directory dir = Directory(downloadsFolderPath); var file = File('${dir.path}/${'$appsName-$shopName-$invoice'}.pdf'); for (var i = 1; i < 20; i++) { if (await file.exists()) { try { await file.delete(); break; } catch (e) { if (e.toString().contains('Cannot delete file')) { file = File('${file.path.replaceAll(RegExp(r'\(\d+\)?'), '').replaceAll('.pdf', '')}($i).pdf'); } } } else { break; } } try { final byteData = await doc.save(); await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); EasyLoading.dismiss(); if (isShare ?? false) { await SharePlus.instance.share(ShareParams(files: [XFile(file.path)], text: 'Here is your invoice PDF: ')); } else if (download ?? false) { EasyLoading.showSuccess('Download successful! Check your Downloads folder'); } else { Navigator.push( context, MaterialPageRoute( builder: (context) => PDFViewerPage(path: file.path), ), ); } } on FileSystemException catch (err) { EasyLoading.showError(err.message); } } } } String numberToWords(num amount) { int taka = amount.floor(); int paisa = ((amount - taka) * 100).round(); String takaWords = _convertNumberToWords(taka); String paisaWords = paisa > 0 ? ' and ${_convertNumberToWords(paisa)} Cents' : ''; return '$takaWords $paisaWords Only'; } String _convertNumberToWords(int number) { if (number == 0) return 'Zero'; final units = [ '', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen' ]; final tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']; String convert(int n) { if (n < 20) return units[n]; if (n < 100) { return tens[n ~/ 10] + (n % 10 != 0 ? ' ' + units[n % 10] : ''); } if (n < 1000) { return units[n ~/ 100] + ' Hundred' + (n % 100 != 0 ? ' ' + convert(n % 100) : ''); } if (n < 100000) { return convert(n ~/ 1000) + ' Thousand' + (n % 1000 != 0 ? ' ' + convert(n % 1000) : ''); } if (n < 10000000) { return convert(n ~/ 100000) + ' Lakh' + (n % 100000 != 0 ? ' ' + convert(n % 100000) : ''); } return convert(n ~/ 10000000) + ' Crore' + (n % 10000000 != 0 ? ' ' + convert(n % 10000000) : ''); } return convert(number); } }