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:
62
lib/screens/privacy_policy_screen.dart
Normal file
62
lib/screens/privacy_policy_screen.dart
Normal file
@@ -0,0 +1,62 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class PrivacyPolicyScreen extends StatelessWidget {
|
||||
const PrivacyPolicyScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('Política de Privacidad')),
|
||||
body: ListView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
children: [
|
||||
Text('Factura del Hogar', style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 24),
|
||||
_section(context, 'Recolección de datos',
|
||||
'Factura del Hogar no recolecta, transmite ni comparte ningún dato personal. '
|
||||
'Toda la información que ingresas (facturas, servicios, montos y configuración) '
|
||||
'se almacena exclusivamente en tu dispositivo usando una base de datos SQLite local.'),
|
||||
const SizedBox(height: 16),
|
||||
_section(context, 'Acceso a Internet',
|
||||
'La aplicación no requiere acceso a Internet. El permiso INTERNET solo se '
|
||||
'declara en builds de depuración (requerido por Flutter para recarga en caliente). '
|
||||
'La versión de distribución en Google Play no tiene permiso de Internet ni '
|
||||
'capacidades de red.'),
|
||||
const SizedBox(height: 16),
|
||||
_section(context, 'Permisos',
|
||||
'• POST_NOTIFICATIONS: Para mostrar recordatorios locales de vencimiento de facturas.\n'
|
||||
'• RECEIVE_BOOT_COMPLETED: Para reprogramar notificaciones después de reiniciar el dispositivo.\n'
|
||||
'• SCHEDULE_EXACT_ALARM: Para entregar recordatorios a la hora exacta programada.\n\n'
|
||||
'Ningún permiso se usa para acceder a Internet, cuentas o almacenamiento externo.'),
|
||||
const SizedBox(height: 16),
|
||||
_section(context, 'Servicios de terceros',
|
||||
'Esta aplicación no usa servicios de análisis, publicidad ni rastreo de terceros. '
|
||||
'No se envía ningún dato a ningún servidor.'),
|
||||
const SizedBox(height: 16),
|
||||
_section(context, 'Eliminación de datos',
|
||||
'Como todos los datos se almacenan localmente, desinstalar la aplicación elimina '
|
||||
'todos los datos asociados. También puedes eliminar facturas o servicios '
|
||||
'individualmente desde la interfaz de la aplicación.'),
|
||||
const SizedBox(height: 16),
|
||||
_section(context, 'Contacto',
|
||||
'Si tienes preguntas sobre esta política de privacidad, abre un issue en el '
|
||||
'repositorio del proyecto.'),
|
||||
const SizedBox(height: 16),
|
||||
Text('Última actualización: Junio 2026', style: Theme.of(context).textTheme.bodySmall?.copyWith(color: Colors.grey)),
|
||||
const SizedBox(height: 32),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _section(BuildContext context, String title, String body) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(title, style: Theme.of(context).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.w600)),
|
||||
const SizedBox(height: 4),
|
||||
Text(body, style: Theme.of(context).textTheme.bodyMedium),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user