You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.7 KiB
151 lines
4.7 KiB
import 'package:get/get.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:youmazgestion/controller/userController.dart';
|
|
import '../Components/cartItem.dart';
|
|
import '../Models/produit.dart';
|
|
import '../Services/OrderDatabase.dart';
|
|
import '../Services/WorkDatabase.dart';
|
|
import '../Services/productDatabase.dart';
|
|
import '../Views/ticketPage.dart';
|
|
import '../my_app.dart';
|
|
|
|
class AccueilController extends GetxController {
|
|
final UserController userController = Get.find();
|
|
final ProductDatabase productDatabase = ProductDatabase();
|
|
final Rx<Map<String, List<Product>>> productsFuture = Rx({}); // Observable
|
|
final OrderDatabase orderDatabase = OrderDatabase.instance;
|
|
final WorkDatabase workDatabase = WorkDatabase.instance;
|
|
DateTime? startDate;
|
|
|
|
final RxInt orderId = RxInt(0); // Observable
|
|
final RxList<CartItem> selectedProducts = <CartItem>[].obs; // Observable list
|
|
final RxInt selectedQuantity = RxInt(1); // Observable
|
|
final RxDouble totalCartPrice = RxDouble(0.0); // Observable
|
|
final RxDouble amountPaid = RxDouble(0.0); // Observable
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
initOrder();
|
|
initWork();
|
|
_initDatabaseAndFetchProducts();
|
|
}
|
|
|
|
Future<void> saveOrderToDatabase() async {
|
|
final totalPrice = _calculateTotalPrice();
|
|
final dateTime = DateTime.now().toString();
|
|
String user = userController.username;
|
|
|
|
orderId.value = await orderDatabase.insertOrder(
|
|
totalPrice, dateTime, MyApp.startDate!, user);
|
|
|
|
for (final cartItem in selectedProducts) {
|
|
final product = cartItem.product;
|
|
final quantity = cartItem.quantity;
|
|
final price = product.price * quantity;
|
|
|
|
await orderDatabase.insertOrderItem(
|
|
orderId.value, product.name, quantity, price);
|
|
|
|
final updatedStock = product.stock! - quantity;
|
|
await productDatabase.updateStock(product.id!, updatedStock);
|
|
}
|
|
showTicketPage();
|
|
}
|
|
|
|
Future<void> _initDatabaseAndFetchProducts() async {
|
|
await productDatabase.initDatabase();
|
|
final categories = await productDatabase.getCategories();
|
|
final productsByCategory = <String, List<Product>>{};
|
|
|
|
categories.sort();
|
|
|
|
for (final categoryName in categories) {
|
|
final products =
|
|
await productDatabase.getProductsByCategory(categoryName);
|
|
productsByCategory[categoryName] = products;
|
|
}
|
|
|
|
productsFuture.value = productsByCategory;
|
|
}
|
|
|
|
void initOrder() async {
|
|
await orderDatabase.initDatabase();
|
|
}
|
|
|
|
void initWork() async {
|
|
await workDatabase.initDatabase();
|
|
}
|
|
|
|
double _calculateTotalPrice() {
|
|
double totalPrice = 0;
|
|
for (final cartItem in selectedProducts) {
|
|
totalPrice += cartItem.product.price * cartItem.quantity;
|
|
}
|
|
return totalPrice;
|
|
}
|
|
|
|
void addToCartWithDetails(Product product) {
|
|
final existingCartItem = selectedProducts.firstWhere(
|
|
(cartItem) => cartItem.product == product,
|
|
orElse: () => CartItem(product, 0),
|
|
);
|
|
if (existingCartItem.quantity == 0) {
|
|
selectedProducts.add(CartItem(product, selectedQuantity.value));
|
|
} else {
|
|
existingCartItem.quantity += selectedQuantity.value;
|
|
}
|
|
|
|
// Afficher une notification
|
|
Get.snackbar(
|
|
'Produit ajouté',
|
|
'Le produit ${product.name} a été ajouté au panier',
|
|
snackPosition: SnackPosition.TOP,
|
|
duration: const Duration(seconds: 1),
|
|
backgroundColor: Colors.green,
|
|
colorText: Colors.white,
|
|
);
|
|
resetQuantityAfterDelay();
|
|
}
|
|
|
|
Future<void> resetQuantityAfterDelay() async {
|
|
await Future.delayed(const Duration(seconds: 1));
|
|
selectedQuantity.value = 1;
|
|
}
|
|
|
|
void showTicketPage() {
|
|
final double totalCartPrice = _calculateTotalPrice();
|
|
|
|
if (selectedProducts.isNotEmpty) {
|
|
if (amountPaid.value >= totalCartPrice) {
|
|
Get.offAll(TicketPage(
|
|
businessName: 'Youmaz',
|
|
businessAddress:
|
|
'quartier escale, Diourbel, Sénégal, en face de Sonatel',
|
|
businessPhoneNumber: '77 446 92 68',
|
|
cartItems: selectedProducts,
|
|
totalCartPrice: totalCartPrice,
|
|
amountPaid: amountPaid.value,
|
|
));
|
|
} else {
|
|
Get.snackbar(
|
|
'Paiement incomplet',
|
|
'Le montant payé est insuffisant. Veuillez payer le montant total du panier.',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
duration: const Duration(seconds: 3),
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
}
|
|
} else {
|
|
Get.snackbar(
|
|
'Panier vide',
|
|
'Le panier est vide. Veuillez ajouter des produits avant de passer commande.',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
duration: const Duration(seconds: 3),
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|