first commit

This commit is contained in:
2026-02-07 15:57:09 +07:00
commit 157096f164
1153 changed files with 415766 additions and 0 deletions

View File

@@ -0,0 +1,204 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:mobile_pos/constant.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';
import '../../Screens/Customers/Model/parties_model.dart';
import '../../model/business_info_model.dart';
Future<void> generateCustomerLedgerReportPdf(
BuildContext context, List<Party>? data, BusinessInformationModel? business) async {
final pw.Document pdf = pw.Document();
// Show loading indicator
EasyLoading.show(status: 'Generating PDF');
final totalAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.totalSaleAmount ?? 0));
final paidAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.totalSalePaid ?? 0));
final dueAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.due ?? 0));
try {
pdf.addPage(
pw.MultiPage(
pageFormat: PdfPageFormat.letter.copyWith(marginBottom: 1.5 * PdfPageFormat.cm),
margin: pw.EdgeInsets.symmetric(horizontal: 16),
//----------------pdf header--------------
header: (pw.Context context) {
return pw.Center(
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.center,
children: [
pw.Text(
business?.data?.companyName.toString() ?? '',
style: pw.TextStyle(
// font: interFont,
fontWeight: pw.FontWeight.bold,
fontSize: 20,
),
),
pw.Text(
// 'বিক্রয় প্রতিবেদন',
'Customer Ledger Report',
style: pw.TextStyle(
fontSize: 16,
fontWeight: pw.FontWeight.bold,
// font: ttf,
),
),
],
),
);
},
//-----------------pdf footer-------------
footer: (pw.Context context) {
return pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('${business?.data?.developByLevel ?? ''} ${business?.data?.developBy ?? ''}'),
pw.Text('Page-${context.pageNumber}'),
],
);
},
build: (pw.Context context) {
final List<List<String>> tableData = [];
for (int i = 0; i < data!.length; i++) {
tableData.add([
data[i].name ?? 'n/a',
data[i].phone ?? 'n/a',
formatPointNumber(data[i].saleCount ?? 0),
formatPointNumber(data[i].totalSaleAmount ?? 0),
formatPointNumber(data[i].totalSalePaid ?? 0),
formatPointNumber(data[i].due ?? 0),
]);
}
return [
pw.SizedBox(height: 16),
// Main Table
pw.Table.fromTextArray(
headers: [
"Customer Name ",
"Phone ",
"Total Sales ",
"Amount ",
"Paid ",
"Total Sale Due",
],
data: tableData,
headerDecoration: const pw.BoxDecoration(
color: PdfColor.fromInt(0xffC52127),
),
cellAlignment: pw.Alignment.center,
border: pw.TableBorder.all(color: PdfColor.fromInt(0xffD9D9D9)),
headerStyle: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
color: PdfColors.white,
),
rowDecoration: const pw.BoxDecoration(
color: PdfColors.white,
),
oddRowDecoration: pw.BoxDecoration(
color: PdfColor.fromInt(0xffF7F7F7),
),
cellPadding: const pw.EdgeInsets.all(8),
columnWidths: <int, pw.TableColumnWidth>{
0: const pw.FlexColumnWidth(4),
1: const pw.FlexColumnWidth(5),
2: const pw.FlexColumnWidth(4),
3: const pw.FlexColumnWidth(3),
4: const pw.FlexColumnWidth(4),
5: const pw.FlexColumnWidth(4),
6: const pw.FlexColumnWidth(4),
},
cellAlignments: {
0: pw.Alignment.center,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.center,
6: pw.Alignment.center,
},
),
// Totals row (styled to match)
pw.Table.fromTextArray(
border: const pw.TableBorder(
left: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
right: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
bottom: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
),
columnWidths: <int, pw.TableColumnWidth>{
0: const pw.FlexColumnWidth(4),
1: const pw.FlexColumnWidth(5),
2: const pw.FlexColumnWidth(4),
3: const pw.FlexColumnWidth(3),
4: const pw.FlexColumnWidth(4),
5: const pw.FlexColumnWidth(4),
6: const pw.FlexColumnWidth(4),
},
cellAlignments: {
0: pw.Alignment.center,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.center,
6: pw.Alignment.center,
},
data: [
[
'Total',
'',
'',
formatPointNumber(totalAmount ?? 0),
formatPointNumber(paidAmount ?? 0),
formatPointNumber(dueAmount ?? 0),
]
],
headerDecoration: const pw.BoxDecoration(
color: PdfColor.fromInt(0xffC52127),
),
headerStyle: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
color: PdfColors.white,
),
cellAlignment: pw.Alignment.center,
cellPadding: const pw.EdgeInsets.all(8),
),
];
},
),
);
final byteData = await pdf.save();
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$appsName-customer-ledger.pdf');
await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
EasyLoading.showSuccess('Generate Complete');
//print pdf
if (context.mounted) {
await Printing.layoutPdf(
name: 'Sales Report',
usePrinterSettings: true,
dynamicLayout: true,
forceCustomPrintPaper: true,
onLayout: (PdfPageFormat format) async => pdf.save(),
);
}
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => PDFViewerPage(path: file.path),
// ),
// );
} catch (e) {
EasyLoading.showError('Error: $e');
print('Error during PDF generation: $e');
}
}

View File

@@ -0,0 +1,204 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:mobile_pos/constant.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';
import '../../Screens/Customers/Model/parties_model.dart';
import '../../model/business_info_model.dart';
Future<void> generateSupplierLedgerReportPdf(
BuildContext context, List<Party>? data, BusinessInformationModel? business) async {
final pw.Document pdf = pw.Document();
// Show loading indicator
EasyLoading.show(status: 'Generating PDF');
final totalAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.totalSaleAmount ?? 0));
final paidAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.totalSalePaid ?? 0));
final dueAmount = data?.fold<num>(0, (previousValue, element) => previousValue + (element.due ?? 0));
try {
pdf.addPage(
pw.MultiPage(
pageFormat: PdfPageFormat.letter.copyWith(marginBottom: 1.5 * PdfPageFormat.cm),
margin: pw.EdgeInsets.symmetric(horizontal: 16),
//----------------pdf header--------------
header: (pw.Context context) {
return pw.Center(
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.center,
children: [
pw.Text(
business?.data?.companyName.toString() ?? '',
style: pw.TextStyle(
// font: interFont,
fontWeight: pw.FontWeight.bold,
fontSize: 20,
),
),
pw.Text(
// 'বিক্রয় প্রতিবেদন',
'Supplier Ledger Report',
style: pw.TextStyle(
fontSize: 16,
fontWeight: pw.FontWeight.bold,
// font: ttf,
),
),
],
),
);
},
//-----------------pdf footer-------------
footer: (pw.Context context) {
return pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('${business?.data?.developByLevel ?? ''} ${business?.data?.developBy ?? ''}'),
pw.Text('Page-${context.pageNumber}'),
],
);
},
build: (pw.Context context) {
final List<List<String>> tableData = [];
for (int i = 0; i < data!.length; i++) {
tableData.add([
data[i].name ?? 'n/a',
data[i].phone ?? 'n/a',
formatPointNumber(data[i].saleCount ?? 0),
formatPointNumber(data[i].totalSaleAmount ?? 0),
formatPointNumber(data[i].totalSalePaid ?? 0),
formatPointNumber(data[i].due ?? 0),
]);
}
return [
pw.SizedBox(height: 16),
// Main Table
pw.Table.fromTextArray(
headers: [
"Supplier Name ",
"Phone ",
"Total Purchases ",
"Amount ",
"Paid ",
"Total Purchase Due",
],
data: tableData,
headerDecoration: const pw.BoxDecoration(
color: PdfColor.fromInt(0xffC52127),
),
cellAlignment: pw.Alignment.center,
border: pw.TableBorder.all(color: PdfColor.fromInt(0xffD9D9D9)),
headerStyle: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
color: PdfColors.white,
),
rowDecoration: const pw.BoxDecoration(
color: PdfColors.white,
),
oddRowDecoration: pw.BoxDecoration(
color: PdfColor.fromInt(0xffF7F7F7),
),
cellPadding: const pw.EdgeInsets.all(8),
columnWidths: <int, pw.TableColumnWidth>{
0: const pw.FlexColumnWidth(4),
1: const pw.FlexColumnWidth(5),
2: const pw.FlexColumnWidth(4),
3: const pw.FlexColumnWidth(3),
4: const pw.FlexColumnWidth(4),
5: const pw.FlexColumnWidth(4),
6: const pw.FlexColumnWidth(4),
},
cellAlignments: {
0: pw.Alignment.center,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.center,
6: pw.Alignment.center,
},
),
// Totals row (styled to match)
pw.Table.fromTextArray(
border: const pw.TableBorder(
left: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
right: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
bottom: pw.BorderSide(color: PdfColor.fromInt(0xffD9D9D9)),
),
columnWidths: <int, pw.TableColumnWidth>{
0: const pw.FlexColumnWidth(4),
1: const pw.FlexColumnWidth(5),
2: const pw.FlexColumnWidth(4),
3: const pw.FlexColumnWidth(3),
4: const pw.FlexColumnWidth(4),
5: const pw.FlexColumnWidth(4),
6: const pw.FlexColumnWidth(4),
},
cellAlignments: {
0: pw.Alignment.center,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.center,
6: pw.Alignment.center,
},
data: [
[
'Total',
'',
'',
formatPointNumber(totalAmount ?? 0),
formatPointNumber(paidAmount ?? 0),
formatPointNumber(dueAmount ?? 0),
]
],
headerDecoration: const pw.BoxDecoration(
color: PdfColor.fromInt(0xffC52127),
),
headerStyle: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
color: PdfColors.white,
),
cellAlignment: pw.Alignment.center,
cellPadding: const pw.EdgeInsets.all(8),
),
];
},
),
);
final byteData = await pdf.save();
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$appsName-customer-ledger.pdf');
await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
EasyLoading.showSuccess('Generate Complete');
//print pdf
if (context.mounted) {
await Printing.layoutPdf(
name: 'Sales Report',
usePrinterSettings: true,
dynamicLayout: true,
forceCustomPrintPaper: true,
onLayout: (PdfPageFormat format) async => pdf.save(),
);
}
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => PDFViewerPage(path: file.path),
// ),
// );
} catch (e) {
EasyLoading.showError('Error: $e');
print('Error during PDF generation: $e');
}
}