import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/discount.dart'; import 'package:fcs/domain/entities/invoice.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/discount/discount_list.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; typedef OnDiscountSelected(Discount discount); typedef OnDeliveryFeeSelected(bool selected); typedef OnRemove(InvoiceTableRow row); final formatter = new NumberFormat("#,###.00"); enum InvoiceDataType { CargoDataType, DiscountDataType, CustomFeeDataType, HandlingFeeType, DeliveryFeeType, } class InvoiceTableRow { final dynamic data; final String id; final InvoiceDataType invoiceDataType; final String desc; final String rate; final String amount; InvoiceTableRow( {this.id, this.data, this.invoiceDataType, this.desc, this.rate, this.amount}); } class InvoiceTable extends StatelessWidget { final Invoice invoice; final Rate rate; final OnDiscountSelected discountSelected; final OnDeliveryFeeSelected deliveryFeeSelected; final OnRemove onRemove; const InvoiceTable( {Key key, this.invoice, this.discountSelected, this.deliveryFeeSelected, this.onRemove, this.rate}) : super(key: key); @override Widget build(BuildContext context) { return Column(children: getRows(context)); } List getTableRows() { List tableRows = []; // add cargo types List _cargoTypes = invoice.getCargoTypes(rate) ?? []; _cargoTypes.forEach((c) { tableRows.add(InvoiceTableRow( invoiceDataType: InvoiceDataType.CargoDataType, desc: c.name, rate: "${c.calWeight.toStringAsFixed(2)} x ${c.calRate.toStringAsFixed(2)}", amount: "${c.calAmount.toStringAsFixed(2)}")); }); invoice.shipments.where((ss) => (ss.isSelected ?? false)).forEach((s) { tableRows.add(InvoiceTableRow( data: s, invoiceDataType: InvoiceDataType.HandlingFeeType, desc: "Handling fee\n${s.shipmentNumber}", rate: "", amount: "${s.handlingFee.toStringAsFixed(2)}")); }); // // add custom fee invoice.customDuties.forEach((c) { tableRows.add(InvoiceTableRow( data: c, invoiceDataType: InvoiceDataType.CustomFeeDataType, desc: "${c.productType} custom fee", rate: "", amount: "${c.fee.toStringAsFixed(2)}")); }); // // add delivery fee tableRows.add(InvoiceTableRow( data: invoice.deliveryFee == null || invoice.deliveryFee == 0 ? null : invoice.deliveryFee, invoiceDataType: InvoiceDataType.DeliveryFeeType, desc: "Delivery fee", rate: "", amount: "${invoice?.deliveryFee?.toStringAsFixed(2) ?? '0'}")); // // add discounts if (invoice.discount != null) { tableRows.add(InvoiceTableRow( data: invoice.discount, invoiceDataType: InvoiceDataType.DiscountDataType, desc: "Discount\n${invoice?.discount?.code ?? ""}", rate: "", amount: "(${invoice?.discount?.amount?.toStringAsFixed(2) ?? ''})")); } return tableRows; } getRows(BuildContext context) { List tableRows = getTableRows(); List dataRow = tableRows.map((r) { return Container( decoration: BoxDecoration( border: Border(bottom: BorderSide(color: Colors.grey))), padding: const EdgeInsets.only( left: 5.0, right: 5.0, top: 10.0, bottom: 10.0), child: Row( children: [ Expanded( flex: 2, child: Row( children: [ Flexible(child: Text('${r.desc}')), SizedBox( width: 5, ), r.data == null || onRemove == null ? Container() : InkWell( onTap: () => onRemove(r), child: Icon( Icons.remove_circle, color: Colors.black45, ), ) ], )), Expanded( flex: 1, child: Text( '${r.rate}', textAlign: TextAlign.end, style: TextStyle(fontSize: 12), )), Expanded( flex: 1, child: Text('\$ ${r.amount}', textAlign: TextAlign.end, style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ))) ], ), ); }).toList(); dataRow.insert( 0, Container( padding: const EdgeInsets.only( left: 5.0, right: 5.0, top: 15.0, bottom: 15.0), decoration: BoxDecoration( border: Border(bottom: BorderSide(color: Colors.grey))), child: Row( children: [ Expanded( flex: 2, child: Text(getLocalString(context, 'invoice.box.desc'), style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.grey))), Expanded( flex: 2, child: Text( getLocalString(context, 'invoice.weight') + ' x ' + getLocalString(context, 'invoice.rate'), textAlign: TextAlign.center, style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.grey))), Expanded( child: Text(getLocalString(context, 'invoice.amount'), textAlign: TextAlign.end, style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.grey))) ], ), )); dataRow.insert( dataRow.length, Container( padding: const EdgeInsets.only( left: 5.0, right: 5.0, top: 10.0, bottom: 10.0), child: Row( children: [ Expanded( flex: 1, child: Container( alignment: Alignment.centerRight, child: LocalText( context, 'invoice.total', color: Colors.black, ), ), ), SizedBox(width: 20), Text( '\$ ${invoice.getNetAmount(rate).toStringAsFixed(2)}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), textAlign: TextAlign.end, ) ], ), )); // dataRow.insert( // dataRow.length, // Container( // padding: const EdgeInsets.only(left: 5.0, right: 5.0, top: 20.0), // child: Row( // children: [ // Expanded( // flex: 1, // child: Container( // alignment: Alignment.centerRight, // child: LocalText( // context, // 'invoice.handling_fee', // color: Colors.black, // ), // ), // ), // SizedBox(width: 50), // Expanded( // child: Text( // '\$ ${invoice.getHandlingFee().toStringAsFixed(2) ?? ""}', // textAlign: TextAlign.end, // style: TextStyle( // fontSize: 15, // fontWeight: FontWeight.bold, // ))) // ], // ), // )); // dataRow.insert( // dataRow.length, // Container( // padding: const EdgeInsets.only( // left: 5.0, right: 5.0, top: 10.0, bottom: 10.0), // child: Row( // children: [ // Expanded( // flex: 1, // child: Container( // alignment: Alignment.centerRight, // child: LocalText( // context, // 'invoice.delivery_fee', // color: Colors.black, // ), // )), // Switch( // value: (invoice.deliveryFee ?? 0) > 0, // onChanged: (value) { // if (deliveryFeeSelected != null) { // deliveryFeeSelected(value); // } // }, // activeTrackColor: primaryColor.withOpacity(0.8), // activeColor: primaryColor, // ), // Expanded( // child: // Text('\$ ${invoice.getDeliveryFee().toStringAsFixed(2)}', // textAlign: TextAlign.end, // style: TextStyle( // fontSize: 15, // fontWeight: FontWeight.bold, // ))) // ], // ), // )); // dataRow.insert( // dataRow.length, // Container( // child: Row( // children: [ // Expanded(child: Text('')), // Expanded( // flex: 2, // child: Divider( // thickness: 3, // )), // ], // ))); // dataRow.insert( // dataRow.length, // Container( // padding: const EdgeInsets.only( // left: 5.0, right: 5.0, top: 10.0, bottom: 10.0), // child: Row( // children: [ // Expanded( // flex: 2, // child: Center( // child: LocalText( // context, // 'invoice.net_amount', // color: Colors.black, // fontSize: 15, // fontWeight: FontWeight.bold, // ), // ), // ), // Expanded( // child: Text( // '\$ ${invoice.getNetAmount(rate).toStringAsFixed(2)}', // textAlign: TextAlign.end, // style: TextStyle( // fontSize: 18, // fontWeight: FontWeight.bold, // color: primaryColor))) // ], // ), // )); // dataRow.insert( // dataRow.length, // Container( // padding: const EdgeInsets.only( // left: 5.0, right: 5.0, top: 10.0, bottom: 10.0), // child: Row( // children: [ // Expanded( // flex: 2, // child: Center( // child: LocalText( // context, // 'invoice.balance', // color: Colors.black, // fontSize: 15, // fontWeight: FontWeight.bold, // ), // ), // ), // Expanded( // child: Text( // '\$ ${invoice.getTotalBalance(rate).toStringAsFixed(2)}', // textAlign: TextAlign.end, // style: TextStyle( // fontSize: 18, // fontWeight: FontWeight.bold, // color: primaryColor))) // ], // ), // )); return dataRow; } }