runable
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'cart_provider.dart';
|
||||
import '../../../settings/presentation/providers/settings_provider.dart';
|
||||
|
||||
part 'cart_total_provider.g.dart';
|
||||
|
||||
/// Cart totals calculation provider
|
||||
@riverpod
|
||||
class CartTotal extends _$CartTotal {
|
||||
@override
|
||||
CartTotalData build() {
|
||||
final itemsAsync = ref.watch(cartProvider);
|
||||
final settingsAsync = ref.watch(settingsProvider);
|
||||
|
||||
final items = itemsAsync.when(
|
||||
data: (data) => data,
|
||||
loading: () => <dynamic>[],
|
||||
error: (_, __) => <dynamic>[],
|
||||
);
|
||||
|
||||
final settings = settingsAsync.when(
|
||||
data: (data) => data,
|
||||
loading: () => null,
|
||||
error: (_, __) => null,
|
||||
);
|
||||
|
||||
// Calculate subtotal
|
||||
final subtotal = items.fold<double>(
|
||||
0.0,
|
||||
(sum, item) => sum + item.lineTotal,
|
||||
);
|
||||
|
||||
// Calculate tax
|
||||
final taxRate = settings?.taxRate ?? 0.0;
|
||||
final tax = subtotal * taxRate;
|
||||
|
||||
// Calculate total
|
||||
final total = subtotal + tax;
|
||||
|
||||
return CartTotalData(
|
||||
subtotal: subtotal,
|
||||
tax: tax,
|
||||
taxRate: taxRate,
|
||||
total: total,
|
||||
itemCount: items.length,
|
||||
);
|
||||
}
|
||||
|
||||
/// Apply discount amount to total
|
||||
double applyDiscount(double discountAmount) {
|
||||
final currentTotal = state.total;
|
||||
return (currentTotal - discountAmount).clamp(0.0, double.infinity);
|
||||
}
|
||||
|
||||
/// Apply discount percentage to total
|
||||
double applyDiscountPercentage(double discountPercent) {
|
||||
final currentTotal = state.total;
|
||||
final discountAmount = currentTotal * (discountPercent / 100);
|
||||
return (currentTotal - discountAmount).clamp(0.0, double.infinity);
|
||||
}
|
||||
}
|
||||
|
||||
/// Cart total data model
|
||||
class CartTotalData {
|
||||
final double subtotal;
|
||||
final double tax;
|
||||
final double taxRate;
|
||||
final double total;
|
||||
final int itemCount;
|
||||
|
||||
const CartTotalData({
|
||||
required this.subtotal,
|
||||
required this.tax,
|
||||
required this.taxRate,
|
||||
required this.total,
|
||||
required this.itemCount,
|
||||
});
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'CartTotalData(subtotal: $subtotal, tax: $tax, total: $total, items: $itemCount)';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user