first commit
This commit is contained in:
221
lib/PDF Invoice/pdf_common_functions.dart
Normal file
221
lib/PDF Invoice/pdf_common_functions.dart
Normal file
@@ -0,0 +1,221 @@
|
||||
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<dynamic> 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<int> 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<Uint8List?> 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<void> 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user