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

@@ -39,6 +39,9 @@ class _DashboardScreenState extends State<DashboardScreen> {
final moneda = configProv.config?.moneda ?? 'USD';
final pendientes = facturaProv.facturas.where((f) => f.estado == 'Pendiente').length;
final pendienteTotal = facturaProv.facturas
.where((f) => f.estado == 'Pendiente')
.fold(0.0, (sum, f) => sum + f.monto);
final vencidas = facturaProv.facturasVencidas.length;
return Scaffold(
@@ -48,7 +51,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
body: RefreshIndicator(
onRefresh: () async => _cargarDatos(),
child: ListView(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.fromLTRB(16, 16, 16, 80),
children: [
Row(
children: [
@@ -95,6 +98,11 @@ class _DashboardScreenState extends State<DashboardScreen> {
Icon(Icons.event_note, size: 20, color: Theme.of(context).colorScheme.primary),
const SizedBox(width: 8),
Text('Próximos vencimientos', style: Theme.of(context).textTheme.titleMedium),
const Spacer(),
Text(CurrencyUtils.formatPrice(pendienteTotal, moneda),
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.w600,
color: Theme.of(context).colorScheme.primary)),
],
),
const SizedBox(height: 12),