update invoice

This commit is contained in:
Phuoc Nguyen
2025-12-02 15:58:10 +07:00
parent 49a41d24eb
commit 359c31a4d4
15 changed files with 3398 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
/// Invoices Provider
///
/// Riverpod providers for managing invoices state.
library;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:worker/core/network/dio_client.dart';
import 'package:worker/features/invoices/data/datasources/invoice_remote_datasource.dart';
import 'package:worker/features/invoices/data/repositories/invoice_repository_impl.dart';
import 'package:worker/features/invoices/domain/entities/invoice.dart';
import 'package:worker/features/invoices/domain/repositories/invoice_repository.dart';
part 'invoices_provider.g.dart';
/// Invoice Repository Provider
@riverpod
Future<InvoiceRepository> invoiceRepository(Ref ref) async {
final dioClient = await ref.watch(dioClientProvider.future);
final remoteDataSource = InvoiceRemoteDataSource(dioClient);
return InvoiceRepositoryImpl(remoteDataSource);
}
/// Invoices Provider
///
/// Provides list of all invoices from repository.
@riverpod
class Invoices extends _$Invoices {
@override
Future<List<Invoice>> build() async {
try {
final repository = await ref.read(invoiceRepositoryProvider.future);
final invoices = await repository.getInvoicesList(
limitStart: 0,
limitPageLength: 0, // 0 = get all
);
// Sort by posting date (newest first)
invoices.sort((a, b) => b.postingDate.compareTo(a.postingDate));
return invoices;
} catch (e) {
throw Exception('Failed to load invoices: $e');
}
}
/// Refresh invoices
Future<void> refresh() async {
state = const AsyncValue.loading();
state = await AsyncValue.guard(() async {
final repository = await ref.read(invoiceRepositoryProvider.future);
final invoices = await repository.getInvoicesList(
limitStart: 0,
limitPageLength: 0,
);
// Sort by posting date (newest first)
invoices.sort((a, b) => b.postingDate.compareTo(a.postingDate));
return invoices;
});
}
}
/// Invoice Detail Provider
///
/// Provides invoice detail by ID.
@riverpod
Future<Invoice> invoiceDetail(Ref ref, String name) async {
final repository = await ref.watch(invoiceRepositoryProvider.future);
return await repository.getInvoiceDetail(name);
}