payments_page.dart 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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: paysAsync?.when(
  21. data: (pays) {
  22. if (pays.isEmpty) return const EmptyState(icon: Icons.account_balance_wallet_outlined, title: 'Nessuna scadenza');
  23. return ListView.builder(
  24. itemCount: pays.length,
  25. itemBuilder: (_, i) => _ScadenzaCard(scadenza: pays[i]),
  26. );
  27. },
  28. loading: () => const Center(child: CircularProgressIndicator()),
  29. error: (e, _) => Center(child: Text('Errore: $e')),
  30. ) ?? const Center(child: CircularProgressIndicator()),
  31. );
  32. }
  33. }
  34. class _ScadenzaCard extends StatelessWidget {
  35. final Scadenza scadenza;
  36. const _ScadenzaCard({required this.scadenza});
  37. @override
  38. Widget build(BuildContext context) {
  39. final theme = Theme.of(context);
  40. final importo = scadenza.importoScadenza ?? 0;
  41. final scaduta = scadenza.dataScadenza != null && DateTime.parse(scadenza.dataScadenza!).isBefore(DateTime.now());
  42. return Card(
  43. margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
  44. color: scaduta ? Colors.red.shade50 : null,
  45. child: ListTile(
  46. leading: CircleAvatar(
  47. backgroundColor: scaduta ? Colors.red.shade100 : theme.colorScheme.primaryContainer,
  48. child: Icon(Icons.account_balance_wallet_outlined, color: scaduta ? Colors.red : theme.colorScheme.primary),
  49. ),
  50. title: Text('Documento ${scadenza.numDoc ?? ""}'),
  51. subtitle: Text('Scadenza: ${scadenza.dataScadenza ?? ""}'),
  52. trailing: Column(
  53. mainAxisSize: MainAxisSize.min,
  54. crossAxisAlignment: CrossAxisAlignment.end,
  55. children: [
  56. Text(NumberFormat.currency(locale: 'it', symbol: '€').format(importo),
  57. style: theme.textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold)),
  58. if (scaduta)
  59. Container(
  60. padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 1),
  61. decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(8)),
  62. child: const Text('SCADUTA', style: TextStyle(color: Colors.white, fontSize: 10)),
  63. ),
  64. ],
  65. ),
  66. ),
  67. );
  68. }
  69. }