253 lines
7.4 KiB
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);
|
|
}
|
|
}
|