Facturas recurrentes, edición, padding, y política de privacidad

- Servicio: nuevo campo esRecurrente + migración DB v2
- Al marcar pagada una factura recurrente se genera la siguiente
- Editar facturas existentes desde CrearFacturaScreen
- Nuevo método actualizarFactura en FacturaProvider
- padding inferior en listas de facturas y servicios (último item visible)
- Nota de factura visible en subtítulo
- Filtro Vencidas corregido
- Monto pendiente total visible en dashboard
- Botón undo para revertir factura pagada
- Configuración de release signing (keystore)
- Pantalla de política de privacidad en la app + PRIVACY_POLICY.md
This commit is contained in:
Super User
2026-06-15 21:45:59 -04:00
parent be28ef39cd
commit bbd20f66da
12 changed files with 260 additions and 16 deletions

View File

@@ -1,4 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import '../database/database_helper.dart';
import '../models/factura.dart';
@@ -15,7 +16,11 @@ class FacturaProvider extends ChangeNotifier {
Future<void> cargarFacturas({String? estado, int? servicioId}) async {
_cargando = true;
notifyListeners();
_facturas = await _db.getFacturas(estado: estado, servicioId: servicioId);
if (estado == 'vencidas') {
_facturas = await _db.getFacturasVencidas();
} else {
_facturas = await _db.getFacturas(estado: estado, servicioId: servicioId);
}
_facturasVencidas = await _db.getFacturasVencidas();
_cargando = false;
notifyListeners();
@@ -31,6 +36,39 @@ class FacturaProvider extends ChangeNotifier {
final hoy = DateTime.now().toIso8601String().split('T')[0];
final actualizada = factura.copyWith(estado: 'Pagada', fechaPago: hoy);
await _db.updateFactura(actualizada);
final servicio = await _db.getServicio(factura.servicioId);
if (servicio != null && servicio.esRecurrente) {
final nextEmision = _sumarMes(factura.fechaEmision);
final nextVencimiento = _sumarMes(factura.fechaVencimiento);
final nueva = Factura(
servicioId: factura.servicioId,
monto: factura.monto,
fechaEmision: nextEmision,
fechaVencimiento: nextVencimiento,
nota: factura.nota,
);
await _db.insertFactura(nueva);
}
await cargarFacturas();
}
String _sumarMes(String dateStr) {
final date = DateTime.parse(dateStr);
final next = DateTime(date.year, date.month + 1, date.day);
return DateFormat('yyyy-MM-dd').format(next);
}
Future<void> marcarPendiente(int id) async {
final factura = _facturas.firstWhere((f) => f.id == id);
final actualizada = factura.copyWith(estado: 'Pendiente', fechaPago: null);
await _db.updateFactura(actualizada);
await cargarFacturas();
}
Future<void> actualizarFactura(Factura factura) async {
await _db.updateFactura(factura);
await cargarFacturas();
}