Untitled
unknown
plain_text
3 years ago
24 kB
13
Indexable
import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';
import 'package:firewood/consts/FirewoodRes.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:firewood/model/SellModel.dart';
import 'package:http/http.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';
import '../Reports/SalePurchaseHeaderInvoice.dart';
import '../model/report/SalePurchaseInvoiceModel.dart';
import 'BaseInvoice.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:universal_html/html.dart';
class SaleAndSaleReturnInvoiceModel {
String productName;
String saleType;
String unitPrice;
String quantity;
String total;
SaleAndSaleReturnInvoiceModel(
{this.productName,
this.saleType,
this.unitPrice,
this.quantity,
this.total
});
@override
String toString() {
return 'SaleAndSaleReturnInvoiceModel{productName: $productName, saleType: $saleType, unitPrice: $unitPrice, quantity: $quantity, total: $total}';
}
}
class SaleAndSaleReturnInvoice {
static Future<Uint8List> generatePdf(
{PdfPageFormat format,
SellType sellType,
String userName,
String userAddress,
String userMobile,
String sellID,
String invoiceNo,
String invoiceDate,
String vatNo,
String name,
String mobile,
String saleBy,
String availableEmptyCylinderDue,
String availableCommission,
List<SaleAndSaleReturnInvoiceModel> saleAndSaleReturnInvoiceModel,
String extraCharge,
String discount,
String totalBillable,
String previousDue,
String paid,
String totalQuantity,
String totalAmount,
String availableDue,
bool isShowPaidOverlay = true,
bool isLPG,
String note,
bool secondaryInvoice,
double payByCommission,
BuildContext my_context,
SalePurchaseInvoiceModel salePurchaseInvoiceModel
}) async {
// print("Preparing Preview");
final pdf = pw.Document(version: PdfVersion.pdf_1_5, compress: true);
// final banglaFont = await PdfGoogleFonts.hindSiliguriLight();
//final banglaFont = await PdfGoogleFonts.notoSansBengaliMedium();
// final banglaFont = await fontFromAssetBundle('assets/fonts/NotoSansBengali-Medium.ttf');
Uint8List ff = (await rootBundle.load("assets/fonts/NotoSansBengali-Medium.ttf")).buffer.asUint8List();
// final banglaFont = MultipartFile.fromBytes(ff.buffer.asByteData().toString(), ff.toList());
final banglaFont = pw.Font.ttf(ff.buffer.asByteData());
// final font = await rootBundle.load("assets/fonts/HindSiliguri-Regular.ttf");
// final banglaFont = pw.Font.ttf(font);
// final Uint8List fontData = File('fonts/HindSiliguri-Regular.ttf');
//final ttf = pw.Font.ttf(fontData.buffer.asByteData());
//final banglaFont = await PdfGoogleFonts.hindSiliguriLight();
/*final Uint8List fontData = File('fonts/HindSiliguri-Regular.ttf').readAsBytesSync();
final ttf = pw.Font.ttf(fontData.buffer.asByteData());*/
//final Uint8List fontData = File('fonts/HindSiliguri-Regular.ttf').readAsBytesSync();
//final fontLocation = await rootBundle.load("assets/fonts/HindSiliguri-Regular.ttf");
Uint8List fontLocation = (await rootBundle.load("assets/fonts/solaimanlipi.ttf")).buffer.asUint8List();
final ttf = pw.Font.ttf(/*fontData.buffer.asByteData()*/fontLocation.buffer.asByteData());
// final banglaFont = ttf;
double dueBalance =double.parse(totalBillable) - double.parse(paid) - payByCommission;
var data = isLPG ?secondaryInvoice?List.generate(saleAndSaleReturnInvoiceModel.length + 1,
(index) => (index == saleAndSaleReturnInvoiceModel.length) ? [
'Total',
'',
'',
totalQuantity,
] :
[
index + 1,
saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.length >
30
? saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.substring(0, 30) +
"..."
: saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName,
saleAndSaleReturnInvoiceModel.elementAt(index).saleType,
saleAndSaleReturnInvoiceModel.elementAt(index).quantity,
]).toList()
: List.generate(saleAndSaleReturnInvoiceModel.length + 1,
(index) => (index == saleAndSaleReturnInvoiceModel.length) ? [
'',
'Total',
'',
'',
totalQuantity,
(double.parse(totalAmount)+double.parse(discount)).toStringAsFixed(2),
] : [
index + 1,
saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.length >
30
? saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.substring(0, 30) +
"..."
: saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName,
saleAndSaleReturnInvoiceModel.elementAt(index).saleType,
double.parse (saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice).toStringAsFixed(2),
saleAndSaleReturnInvoiceModel.elementAt(index).quantity,
(double.parse(saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice)*
int.parse(saleAndSaleReturnInvoiceModel.elementAt(index).quantity.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).quantity)).toStringAsFixed(2)==0?"":(double.parse(saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice)*
int.parse(saleAndSaleReturnInvoiceModel.elementAt(index).quantity.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).quantity)).toStringAsFixed(2) ]).toList()
: List.generate(
saleAndSaleReturnInvoiceModel.length + 1,
(index) => (index == saleAndSaleReturnInvoiceModel.length)
? [
'',
'Total ',
'',
totalQuantity,
(double.parse(totalAmount)+double.parse(discount)).toStringAsFixed(2),
]
: [
index + 1,
saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.length >
30
? saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName
.substring(0, 30) +
"..."
: saleAndSaleReturnInvoiceModel
.elementAt(index)
.productName,
double.parse(saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice).toStringAsFixed(2),
saleAndSaleReturnInvoiceModel.elementAt(index).quantity,
(double.parse(saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice)*
int.parse(saleAndSaleReturnInvoiceModel.elementAt(index).quantity.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).quantity)).toStringAsFixed(2)==0?"":(double.parse(saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).unitPrice)*
int.parse(saleAndSaleReturnInvoiceModel.elementAt(index).quantity.isEmpty?"0":saleAndSaleReturnInvoiceModel.elementAt(index).quantity)).toStringAsFixed(2)
]).toList();
int numberOfPage = (data.length / 15).ceil().toInt();
final paidOverlayPath = (await rootBundle.load(FirewoodRes.paidOverlay)).buffer.asUint8List();
var footer = pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
mainAxisAlignment: pw.MainAxisAlignment.start,
children: [
pw.SizedBox(
height: 0.5 * PdfPageFormat.cm,
),
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Expanded(
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
mainAxisAlignment: pw.MainAxisAlignment.start,
children: [
isLPG ? pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('Available Empty Cylinder Due: ',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.5 * PdfPageFormat.cm,
),
pw.Text(availableEmptyCylinderDue),
],
) : pw.SizedBox.shrink(),
//notes
pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment: pw.MainAxisAlignment.start,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Text(/*'Note: '*/ AppLocalizations.of(my_context).note,
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
font: banglaFont
)),
pw.Text( note),
],
),
pw.SizedBox(
width: isShowPaidOverlay ? 0.5 * PdfPageFormat.cm : 0,
height: isShowPaidOverlay ? 0.5 * PdfPageFormat.cm : 0,
),
dueBalance==0 ?isShowPaidOverlay ? pw.Image(pw.MemoryImage(paidOverlayPath),
height: 100,
width: 100,
alignment: pw.Alignment.center)
: pw.SizedBox.shrink():pw.SizedBox.shrink(),
]
)),
pw.SizedBox(
width: 3 * PdfPageFormat.cm,
),
pw.Expanded(
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
mainAxisAlignment: pw.MainAxisAlignment.start,
children: [
pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('Discount (-): ',
style:
pw.TextStyle(fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.3 * PdfPageFormat.cm,
),
pw.Text(discount),
],
),
pw.SizedBox(
width: 0.3 * PdfPageFormat.cm,
),
sellType == SellType.SELL
? pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.end ,
children: [
pw.SizedBox(
width: 8.2 * PdfPageFormat.cm,
height: 1,
child:
pw.Container(color: PdfColors.black)),
])
: pw.SizedBox.shrink(),
pw.SizedBox(
width: 0.3 * PdfPageFormat.cm,
),
pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
sellType == SellType.SELL
? 'Total Billable: '
: 'Total Amount: ',
style:
pw.TextStyle(fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.5 * PdfPageFormat.cm,
),
pw.Text( double.parse(totalBillable).toStringAsFixed(2)),
],
),
sellType == SellType.SELL
? pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('Paid (-): ',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.5 * PdfPageFormat.cm,
),
pw.Text(paid),
],
)
: pw.SizedBox.shrink(),
sellType == SellType.SELL
? pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('Paid By Commission (-): ',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.3 * PdfPageFormat.cm,
),
pw.Text(payByCommission.toString()),
],
)
: pw.SizedBox.shrink(),
sellType == SellType.SELL
? pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.end,
children: [
pw.SizedBox(
width: 8.2 * PdfPageFormat.cm,
height: 1,
child:
pw.Container(color: PdfColors.black)),
])
: pw.SizedBox.shrink(),
sellType == SellType.SELL
? pw.Row(
mainAxisSize: pw.MainAxisSize.max,
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('Available Due: ',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold)),
pw.SizedBox(
width: 0.5 * PdfPageFormat.cm,
),
pw.Text(dueBalance.toStringAsFixed(2)),
],
)
: pw.SizedBox.shrink(),
]),
)
]),
pw.SizedBox(
height: 1.5 * PdfPageFormat.cm,
),
BaseInvoice.defaultFooter()
],
);
final companyIcon = (await rootBundle.load('assets/images/bkash_icon.png'))
.buffer
.asUint8List();
pdf.addPage(pw.MultiPage(
pageFormat: format,
maxPages: 200,
margin: pw.EdgeInsets.symmetric(
horizontal: .8 * PdfPageFormat.cm, vertical: .5 * PdfPageFormat.cm),
build: (context) => [
pw.Column(children: [
pw.SizedBox(height: 10),
SalePurchaseInvoiceHeader.generateSalePurchaseInvoiceHeader(salePurchaseInvoice: salePurchaseInvoiceModel),
pw.SizedBox(
height: .5 * PdfPageFormat.cm,
),
pw.Table.fromTextArray(
headers: isLPG ? secondaryInvoice?
[
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Sale Type'*/'${AppLocalizations.of(my_context).saleType}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
]
:[
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Sale Type'*/'${AppLocalizations.of(my_context).saleType}',
/*'Unit Price'*/'${AppLocalizations.of(my_context).unitPrice}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
/*'Total'*/ '${AppLocalizations.of(my_context).total}',
]
: [
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Unit Price'*/'${AppLocalizations.of(my_context).unitPrice}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
/*'Total'*/ '${AppLocalizations.of(my_context).total}',
],
data: data.sublist(0, data.length > 15 ? 15 : data.length),
border: pw.TableBorder.all(width: .5),
headerStyle: pw.TextStyle(fontWeight: pw.FontWeight.bold,font: banglaFont ),
headerDecoration: pw.BoxDecoration(color: PdfColors.grey300),
cellHeight: 30,
cellDecoration: (x, y, z) {
return pw.BoxDecoration(color: PdfColors.grey100);
},
cellAlignments: isLPG ? secondaryInvoice?{
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
}: {
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.centerRight,}
:
{
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.centerRight,
},
),
numberOfPage <= 1 ? secondaryInvoice?pw.SizedBox(width: 1): footer : pw.SizedBox(width: 0, height: 0),
]),
],
));
if (numberOfPage > 1) {
pdf.addPage(
pw.MultiPage(
pageFormat: format,
maxPages: 200,
margin: pw.EdgeInsets.symmetric(
horizontal: 2 * PdfPageFormat.cm,
vertical: 1.5 * PdfPageFormat.cm),
build: (context) => [
pw.Table.fromTextArray(
cellStyle: pw.TextStyle(font: banglaFont),
headers: isLPG ? secondaryInvoice?
/* [
'SL',
'Product Name',
'Sale Type',
'Quantity',
]:
[
'SL',
'Product Name',
'Sale Type',
'Unit Price',
'Quantity',
'Total'
] :
['SL',
'Product Name',
'Unit Price',
'Quantity',
'Total'
],*/
[
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Sale Type'*/'${AppLocalizations.of(my_context).saleType}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
]
:[
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Sale Type'*/'${AppLocalizations.of(my_context).saleType}',
/*'Unit Price'*/'${AppLocalizations.of(my_context).unitPrice}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
/*'Total'*/ '${AppLocalizations.of(my_context).total}',
]
: [
/*'SL'*/ '${AppLocalizations.of(my_context).sl}',
/*'Product Name'*/ '${AppLocalizations.of(my_context).productName}',
/*'Unit Price'*/'${AppLocalizations.of(my_context).unitPrice}',
/*'Quantity'*/ '${AppLocalizations.of(my_context).quantity}',
/*'Total'*/ '${AppLocalizations.of(my_context).total}',
],
data: data.sublist((15 * 1), data.length),
border: null,
headerStyle: pw.TextStyle(fontWeight: pw.FontWeight.bold,font: banglaFont),
headerDecoration: pw.BoxDecoration(color: PdfColors.grey300),
cellHeight: 15,
cellDecoration: (x, y, z) {
return pw.BoxDecoration(color: PdfColors.grey100);
},
cellAlignments: isLPG ? secondaryInvoice ?{
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
}: {
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.center,
5: pw.Alignment.centerRight,
}
: {
0: pw.Alignment.centerLeft,
1: pw.Alignment.center,
2: pw.Alignment.center,
3: pw.Alignment.center,
4: pw.Alignment.centerRight,
},
),
secondaryInvoice ?footer:pw.SizedBox(height: 1 * PdfPageFormat.cm,
),
],
),
index: 1);
}
await Printing.layoutPdf(
onLayout: (PdfPageFormat format) async => pdf.save());
}
}
Editor is loading...