feat: improve patient flow and pricing workflow

This commit is contained in:
egecankomur
2026-06-12 00:04:53 +03:00
parent e12587398b
commit b42f68214e
26 changed files with 1283 additions and 243 deletions
@@ -48,10 +48,12 @@ class _LabFinanceScreenState extends ConsumerState<LabFinanceScreen>
LabFinanceRepository.instance.listEntries(tenantId, status: 'pending'),
LabFinanceRepository.instance.listEntries(tenantId, status: 'paid'),
LabFinanceRepository.instance.summary(tenantId),
LabFinanceRepository.instance.byCounterparty(tenantId),
]).then((results) => _FinanceData(
pending: results[0] as List<FinanceEntry>,
paid: results[1] as List<FinanceEntry>,
summary: results[2] as Map<String, double>,
counterparties: results[3] as List<CounterpartyFinanceSummary>,
));
});
}
@@ -199,6 +201,15 @@ class _LabFinanceScreenState extends ConsumerState<LabFinanceScreen>
],
),
),
if (data.counterparties.isNotEmpty)
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 12),
child: _CounterpartySummaryList(
title: 'Klinik Bazlı Alacak',
items: data.counterparties,
formatAmount: formatAmount,
),
),
PillTabs(
tabs: [s.pending, s.collected],
selected: _tabController.index,
@@ -240,11 +251,13 @@ class _FinanceData {
required this.pending,
required this.paid,
required this.summary,
required this.counterparties,
});
final List<FinanceEntry> pending;
final List<FinanceEntry> paid;
final Map<String, double> summary;
final List<CounterpartyFinanceSummary> counterparties;
}
class _SummaryCard extends StatelessWidget {
@@ -465,3 +478,66 @@ class _EntriesList extends StatelessWidget {
);
}
}
class _CounterpartySummaryList extends StatelessWidget {
const _CounterpartySummaryList({
required this.title,
required this.items,
required this.formatAmount,
});
final String title;
final List<CounterpartyFinanceSummary> items;
final String Function(double) formatAmount;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(14),
decoration: BoxDecoration(
color: AppColors.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: AppColors.border),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
),
),
const SizedBox(height: 10),
for (final item in items.take(5)) ...[
Row(
children: [
Expanded(
child: Text(
item.counterpartyName,
style: const TextStyle(
fontSize: 13,
color: AppColors.textPrimary,
fontWeight: FontWeight.w600,
),
),
),
Text(
formatAmount(item.pendingAmount),
style: const TextStyle(
fontSize: 13,
color: AppColors.pending,
fontWeight: FontWeight.w700,
),
),
],
),
const SizedBox(height: 8),
],
],
),
);
}
}