Files
Kifi/kifi-app/lib/features/sales/providers/credit_notes_provider.dart

76 lines
2.1 KiB
Dart

import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:dio/dio.dart';
import '../../../core/network/dio_client.dart';
import '../domain/credit_note.dart';
import 'invoices_provider.dart';
class CreditNotesNotifier extends AsyncNotifier<List<CreditNote>> {
@override
FutureOr<List<CreditNote>> build() async {
return _fetchCreditNotes();
}
Future<List<CreditNote>> _fetchCreditNotes() async {
try {
final response = await DioClient().dio.get('/credit-notes');
if (response.statusCode == 200) {
final List<dynamic> data = response.data;
return data.map((e) => CreditNote.fromJson(e)).toList();
}
return [];
} catch (e) {
return [];
}
}
Future<void> refresh() async {
state = const AsyncValue.loading();
try {
final creditNotes = await _fetchCreditNotes();
state = AsyncValue.data(creditNotes);
} catch (e, stack) {
state = AsyncValue.error(e, stack);
}
}
Future<CreditNote?> createCreditNote(int invoiceId, CreditNote creditNote) async {
try {
final response = await DioClient().dio.post(
'/invoices/$invoiceId/credit-notes',
data: creditNote.toJson(),
);
await refresh();
ref.refresh(invoicesProvider);
if (response.data != null) {
return CreditNote.fromJson(response.data);
}
return null;
} catch (e) {
if (e is DioException) {
throw Exception(
'Failed to process return: ${e.response?.statusCode} - ${e.response?.data}',
);
}
throw Exception('Failed to process return: $e');
}
}
}
final creditNotesProvider =
AsyncNotifierProvider<CreditNotesNotifier, List<CreditNote>>(CreditNotesNotifier.new);
final invoiceCreditNotesProvider =
FutureProvider.family<List<CreditNote>, int>((ref, invoiceId) async {
try {
final response = await DioClient().dio.get('/invoices/$invoiceId/credit-notes');
if (response.statusCode == 200) {
final List<dynamic> data = response.data;
return data.map((e) => CreditNote.fromJson(e)).toList();
}
return [];
} catch (e) {
return [];
}
});