payments_page.dart 3.8 KB

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