8bbc9dbff2
- Flutter + PocketBase dental lab management system - Clinic & lab dashboards, job tracking, patient management - Product catalog, finance tracking, multi-language support - AI assistant integration, realtime notifications - Windows installer (Inno Setup) included - Developed by kovakyazilim.com
50 lines
1.5 KiB
Dart
50 lines
1.5 KiB
Dart
import 'package:pocketbase/pocketbase.dart';
|
|
import '../../../core/api/pocketbase_client.dart';
|
|
import '../../../models/finance_entry.dart';
|
|
|
|
class ClinicFinanceRepository {
|
|
ClinicFinanceRepository._();
|
|
static final instance = ClinicFinanceRepository._();
|
|
|
|
PocketBase get _pb => PocketBaseClient.instance.pb;
|
|
|
|
Future<List<FinanceEntry>> listEntries(
|
|
String tenantId, {
|
|
String? status,
|
|
int page = 1,
|
|
int limit = 30,
|
|
}) async {
|
|
final filterParts = ['tenant_id = "$tenantId"', 'type = "payable"'];
|
|
if (status != null) filterParts.add('status = "$status"');
|
|
|
|
final result = await _pb.collection('finance_entries').getList(
|
|
page: page,
|
|
perPage: limit,
|
|
filter: filterParts.join(' && '),
|
|
expand: 'job_id',
|
|
);
|
|
return (result.items.map((r) => FinanceEntry.fromJson(r.toJson())).toList()
|
|
..sort((a, b) => (b.dateCreated ?? '').compareTo(a.dateCreated ?? '')));
|
|
}
|
|
|
|
Future<Map<String, double>> summary(String tenantId) async {
|
|
final all = await listEntries(tenantId, limit: 200);
|
|
double pending = 0, paid = 0;
|
|
for (final e in all) {
|
|
if (e.status == FinanceStatus.pending) {
|
|
pending += e.amount;
|
|
} else {
|
|
paid += e.amount;
|
|
}
|
|
}
|
|
return {'pending': pending, 'paid': paid};
|
|
}
|
|
|
|
Future<void> markPaid(String entryId) async {
|
|
await _pb.collection('finance_entries').update(entryId, body: {
|
|
'status': 'paid',
|
|
'paid_at': DateTime.now().toIso8601String(),
|
|
});
|
|
}
|
|
}
|