payments_page.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:intl/intl.dart';
  4. import '../../../providers/auth_provider.dart';
  5. import '../../../providers/database_provider.dart';
  6. import '../../../database/database.dart';
  7. import '../../widgets/empty_state.dart';
  8. import '../../../core/responsive.dart';
  9. final paymentsProvider = FutureProvider.family<List<Scadenza>, int>((ref, idAgente) {
  10. return ref.read(scadenzeDaoProvider).getScadenzePerAgente(idAgente);
  11. });
  12. class PaymentsPage extends ConsumerWidget {
  13. const PaymentsPage({super.key});
  14. @override
  15. Widget build(BuildContext context, WidgetRef ref) {
  16. final agente = ref.watch(authProvider).agente;
  17. final paysAsync = agente != null ? ref.watch(paymentsProvider(agente.idAgente)) : null;
  18. return Scaffold(
  19. appBar: AppBar(title: const Text('Scadenze')),
  20. body: SafeArea(
  21. child: paysAsync?.when(
  22. data: (pays) {
  23. if (pays.isEmpty) return const EmptyState(icon: Icons.account_balance_wallet_outlined, title: 'Nessuna scadenza');
  24. return ListView.builder(
  25. itemCount: pays.length,
  26. itemBuilder: (_, i) => _ScadenzaCard(scadenza: pays[i]),
  27. );
  28. },
  29. loading: () => const Center(child: CircularProgressIndicator()),
  30. error: (e, _) => Center(child: Text('Errore: $e')),
  31. ) ?? const Center(child: CircularProgressIndicator()),
  32. ),
  33. );
  34. }
  35. }
  36. class _ScadenzaCard extends StatelessWidget {
  37. final Scadenza scadenza;
  38. const _ScadenzaCard({required this.scadenza});
  39. @override
  40. Widget build(BuildContext context) {
  41. final theme = Theme.of(context);
  42. final importo = scadenza.importoScadenza ?? 0;
  43. final scaduta = scadenza.dataScadenza != null && DateTime.parse(scadenza.dataScadenza!).isBefore(DateTime.now());
  44. return Card(
  45. margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
  46. color: scaduta ? Colors.red.shade50 : null,
  47. child: ListTile(
  48. leading: CircleAvatar(
  49. backgroundColor: scaduta ? Colors.red.shade100 : theme.colorScheme.primaryContainer,
  50. child: Icon(Icons.account_balance_wallet_outlined, color: scaduta ? Colors.red : theme.colorScheme.primary),
  51. ),
  52. title: Text('Documento ${scadenza.numDoc ?? ""}'),
  53. subtitle: Text('Scadenza: ${scadenza.dataScadenza ?? ""}'),
  54. trailing: Column(
  55. mainAxisSize: MainAxisSize.min,
  56. crossAxisAlignment: CrossAxisAlignment.end,
  57. children: [
  58. Text(NumberFormat.currency(locale: 'it', symbol: '€').format(importo),
  59. style: theme.textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold)),
  60. if (scaduta)
  61. Container(
  62. padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 1),
  63. decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(8)),
  64. child: const Text('SCADUTA', style: TextStyle(color: Colors.white, fontSize: 10)),
  65. ),
  66. ],
  67. ),
  68. ),
  69. );
  70. }
  71. }