84 lines
2.0 KiB
Dart
84 lines
2.0 KiB
Dart
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)';
|
|
}
|
|
}
|