import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:new_version_plus/new_version_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; import "package:http/http.dart" as http; import '../../../data/models/biayakurir_model.dart'; import '../../../data/models/penjualan_model.dart'; import '../../../data/models/recommendation_model.dart'; import '../../../data/models/search_model.dart'; import '../../../data/models/waktu_model.dart'; import '../../../data/providers/customer_provider.dart'; import '../../../data/providers/menu_provider.dart'; import '../../../data/providers/services.dart'; import '../../order/controllers/order_controller.dart'; class DemoController extends GetxController with GetTickerProviderStateMixin { final TextEditingController catatanController = TextEditingController(); final notesMap = {}.obs; late AnimationController animationController; late AnimationController _controller; late TabController tabController; // Tambahkan variabel TabController final searchResults = [].obs; final menuProvider = MenuProvider().obs; late Penjualan penjualan = Penjualan(); late Recommendation rekomendasi = Recommendation(); var cartList = [].obs; var penjualanD = [].obs; var rekomendasiD = [].obs; var itemQuantities = {}.obs; final isLoading = false.obs; // Tambahkan isLoading final isCashSelected = true.obs; final isPolijePaySelected = false .obs; // Digunakan untuk memantau apakah metode pembayaran Polije Pay dipilih Rx biayaData = Biayakurir().obs; Rx waktuData = waktuModel().obs; final _customerProvider = CustomerProvider().obs; // Menghitung total harga dari semua item di keranjang, termasuk kuantitas dan diskon int get totalPrice { int total = 0; for (var item in cartList) { int itemTotal = calculatePriceAfterDiscount(item) * (itemQuantities[item.idMenu] ?? 1); total += itemTotal; } return total; } int get totalPriceWithKurir { int total = 0; for (var item in cartList) { int itemTotal = calculatePriceAfterDiscount(item) * (itemQuantities[item.idMenu] ?? 1); total += itemTotal; } // Menambahkan biaya kirim ke total harga final biayakirim = OrderController().calculateValueBasedOnRange() ?? 0; total += biayakirim; return total; } late int nominalUserBayar = totalPriceWithKurir; int get countc => cartList.length; int get count { return itemQuantities.values.fold(0, (sum, quantity) => sum + quantity); } // Calculate discount for each item int calculateDiscount(Datasearch item) { // Check for null and return 0 if discount is null int discount = item.diskon ?? 0; return (item.harga! * discount) ~/ 100; } // Calculate price after discount for each item int calculatePriceAfterDiscount(Datasearch item) { // Subtract the discount from the item's price return item.harga! - calculateDiscount(item); } // Get total price after all discounts have been applied int get totalPriceAfterDiscount => cartList.fold(0, (sum, item) => sum + calculatePriceAfterDiscount(item)); @override void onInit() { super.onInit(); _controller = AnimationController( vsync: this, duration: const Duration(seconds: 1), ); animationController = AnimationController( duration: const Duration(milliseconds: 500), // Sesuaikan durasi animasi vsync: this, ); tabController = TabController(length: 3, vsync: this); refreshData(); fetchbiayakurir(); } @override void onClose() { _controller.dispose(); tabController.dispose(); super.onClose(); } void saveNoteForMenu(int idMenu, String note) { notesMap[idMenu] = note; } String getNoteForMenu(int idMenu) { return notesMap[idMenu] ?? ''; } void clearNoteForMenu(int idMenu) { notesMap.remove(idMenu); } void addToCart(Datasearch item, String note) async { try { int idMenu = item.idMenu!; // Fetch waktu data waktuModel result = await _customerProvider.value.fetchWaktu(); // Check if the response status code is 200 if (result.code == 200) { // Execute addToCart logic if (!cartList.any((element) => element.idMenu == item.idMenu)) { cartList.add(item); itemQuantities[item.idMenu!] = 1; saveNoteForMenu(item.idMenu!, catatanController.text); } else { addQuantity(item.idMenu!); } // Save or update the note for the item notesMap[idMenu] = note; // Refresh itemQuantities and notesMap itemQuantities.refresh(); notesMap.refresh(); } else { // Show error Snackbar if the response status code is not 200 Get.snackbar( 'Mohon maaf', result.data.toString(), snackPosition: SnackPosition.TOP, backgroundColor: Colors.red, ); } } catch (error) { Get.snackbar( 'Mohon maaf', 'Batas Pelayanan .', snackPosition: SnackPosition.TOP, backgroundColor: Colors.red, ); } } void removeFromCart(Datasearch item) { int idMenu = item.idMenu!; clearNoteForMenu(idMenu); cartList.removeWhere((element) => element.idMenu == item.idMenu); itemQuantities.remove(item.idMenu); // Ini akan menghapus kuantitas dari map itemQuantities.refresh(); notesMap.refresh(); update(); } void startAnimation() { _controller.forward(); } void addQuantity(int idMenu) { if (itemQuantities.containsKey(idMenu)) { itemQuantities[idMenu] = (itemQuantities[idMenu] ?? 1) + 1; } else { itemQuantities[idMenu] = 1; // Jika item belum ada dalam map, set kuantitas ke 1 } itemQuantities.refresh(); // Memperbarui UI } void subtractQuantity(int idMenu) { if (itemQuantities.containsKey(idMenu) && itemQuantities[idMenu]! > 1) { itemQuantities[idMenu] = (itemQuantities[idMenu] ?? 1) - 1; itemQuantities.refresh(); // Memperbarui UI } } void setLoading(bool value) { isLoading.value = value; // Metode untuk mengatur status isLoading } Future fetchWaktu() async { try { isLoading(true); // Call the fetchqr method from CustomerProvider waktuModel result = await _customerProvider.value.fetchWaktu(); // Update the qr data waktuData(result); isLoading(false); } catch (error) { isLoading(false); print('Error fetching biaya kurir data: $error'); } } Future fetchbiayakurir() async { try { isLoading(true); // Call the fetchqr method from CustomerProvider Biayakurir result = await _customerProvider.value.fetchbiayakurir(); // Update the qr data biayaData(result); isLoading(false); } catch (error) { isLoading(false); print('Error fetching biaya kurir data: $error'); } } int calculateSubtotal(int idMenu) { final int price = calculatePriceAfterDiscount(findMenuById(idMenu)); final int quantity = itemQuantities[idMenu] ?? 1; return price * quantity; } Datasearch findMenuById(int idMenu) { return cartList.firstWhere((menu) => menu.idMenu == idMenu, orElse: () => Datasearch()); } Future refreshData() async {} void setCartList(List updatedCartList) { cartList.assignAll(updatedCartList); } }