TIF_E41211491/lib/app/modules/demo/controllers/demo_controller.dart

253 lines
7.4 KiB
Dart

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 = <int, String>{}.obs;
late AnimationController animationController;
late AnimationController _controller;
late TabController tabController; // Tambahkan variabel TabController
final searchResults = <Datasearch>[].obs;
final menuProvider = MenuProvider().obs;
late Penjualan penjualan = Penjualan();
late Recommendation rekomendasi = Recommendation();
var cartList = <Datasearch>[].obs;
var penjualanD = <Data>[].obs;
var rekomendasiD = <DataRekomendasi>[].obs;
var itemQuantities = <int, int>{}.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<Biayakurir> biayaData = Biayakurir().obs;
Rx<waktuModel> 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<void> 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<void> 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<void> refreshData() async {}
void setCartList(List<Datasearch> updatedCartList) {
cartList.assignAll(updatedCartList);
}
}