pedido_csv.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import 'dart:convert';
  2. import 'package:csv/csv.dart';
  3. import 'package:intl/intl.dart';
  4. import 'package:path_provider/path_provider.dart';
  5. import 'dart:io';
  6. import 'package:path/path.dart' as p;
  7. import '../../models/models.dart';
  8. Future<void> exportarPedidosACSV(List<Pedido> pedidos, String fileName) async {
  9. List<List<dynamic>> rows = [
  10. [
  11. "Folio",
  12. "Cliente",
  13. "Producto",
  14. "Cantidad",
  15. "Precio Unitario",
  16. "Toppings",
  17. "Descuento (%)",
  18. "Estado",
  19. "Total con Descuento",
  20. "Tipo de Pago",
  21. "Cantidad Efectivo",
  22. "Cantidad Tarjeta",
  23. "Cantidad Transferencia",
  24. "Fecha",
  25. ]
  26. ];
  27. for (var pedido in pedidos) {
  28. for (var producto in pedido.productos) {
  29. // Convertir toppings a una cadena de texto y calcular el total adicional de los toppings
  30. double totalToppingsPrecio = 0.0;
  31. String toppingsText = producto.toppings.isNotEmpty
  32. ? producto.toppings.map((t) {
  33. String toppingNombre =
  34. t.topping?.nombre ?? 'Topping no especificado';
  35. double toppingPrecio =
  36. double.tryParse(t.topping?.precio ?? '0') ?? 0.0;
  37. if (toppingPrecio > 0) {
  38. toppingNombre += "(+\$${formatCurrency(toppingPrecio)})";
  39. totalToppingsPrecio += toppingPrecio;
  40. }
  41. return toppingNombre;
  42. }).join(', ')
  43. : 'Sin toppings';
  44. // Calcular el total con descuento para este producto
  45. double precioUnitario =
  46. double.tryParse(producto.producto?.precio ?? '0') ?? 0.0;
  47. double subtotal =
  48. (precioUnitario + totalToppingsPrecio) * (producto.cantidad ?? 1);
  49. double descuento = pedido.descuento?.toDouble() ?? 0.0;
  50. double precioDescuento = subtotal * (descuento / 100);
  51. double totalConDescuento = subtotal - precioDescuento;
  52. // Aquí es donde formateamos la fecha a la zona horaria local
  53. String formattedFecha = _formatDateTime(pedido.peticion);
  54. List<dynamic> row = [
  55. pedido.folio,
  56. pedido.nombreCliente,
  57. producto.producto?.nombre ?? 'No especificado',
  58. producto.cantidad,
  59. formatCurrency(precioUnitario),
  60. toppingsText,
  61. descuento,
  62. pedido.estatus,
  63. formatCurrency(totalConDescuento),
  64. pedido.tipoPago ?? 'No especificado',
  65. formatCurrency(pedido.cantEfectivo ?? 0.0),
  66. formatCurrency(pedido.cantTarjeta ?? 0.0),
  67. formatCurrency(pedido.cantTransferencia ?? 0.0),
  68. formattedFecha,
  69. ];
  70. rows.add(row);
  71. }
  72. }
  73. String csv = const ListToCsvConverter().convert(rows);
  74. final directory = await getApplicationDocumentsDirectory();
  75. final path = p.join(directory.path, fileName);
  76. final file = File(path);
  77. final utf8Csv = utf8.encode('\uFEFF' + csv);
  78. await file.writeAsBytes(utf8Csv, flush: true);
  79. print('Archivo CSV guardado en $path');
  80. }
  81. // Formato de la fecha a hora local, similar a lo que ya hiciste en tu pantalla
  82. String _formatDateTime(String? dateTimeString) {
  83. if (dateTimeString == null) return "Sin fecha";
  84. DateTime parsedDate = DateTime.parse(dateTimeString);
  85. var formatter = DateFormat('dd-MM-yyyy HH:mm:ss');
  86. return formatter.format(parsedDate.toLocal()); // Convertimos a hora local
  87. }
  88. String formatCurrency(double amount) {
  89. final format = NumberFormat("#,##0.00", "es_MX");
  90. return format.format(amount);
  91. }