123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- import 'package:flutter/material.dart';
- import 'package:intl/intl.dart';
- import 'package:sqflite/sqflite.dart';
- import 'package:yoshi_papas_app/services/repo_service.dart';
- import '../data/api_response.dart';
- import '../services/base_service.dart';
- import '../models/models.dart';
- class PedidoViewModel extends ChangeNotifier {
- String _busqueda = "";
- String get busqueda => _busqueda;
- List<Pedido> _pedidos = [];
- Pedido? _selectedPedido;
- bool _isLoading = false;
- int _currentPage = 1;
- int _totalPedidos = 0;
- int _limit = 10;
- int get currentPage => _currentPage;
- int get totalPedidos => _totalPedidos;
- int get totalPages => (_totalPedidos / _limit).ceil();
- List<Pedido> get pedidos => _pedidos;
- Pedido? get selectedPedido => _selectedPedido;
- bool get isLoading => _isLoading;
- void setIsLoading(bool loading) {
- _isLoading = loading;
- notifyListeners();
- }
- Future<bool> guardarPedidoLocal({required Pedido pedido}) async {
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- int nextFolio = await repoPedido.obtenerProximoFolio();
- pedido.folio = nextFolio;
- int idPedido = await repoPedido.guardarLocal(pedido);
- if (idPedido > 0) {
- pedido.id = idPedido;
- RepoService<PedidoProducto> repoPedidoProducto =
- RepoService<PedidoProducto>();
- RepoService<PedidoProductoTopping> repoPedidoProductoTopping =
- RepoService<PedidoProductoTopping>();
- for (var producto in pedido.productos) {
- PedidoProducto pedidoProducto = PedidoProducto(
- idPedido: idPedido,
- idProducto: producto.idProducto,
- cantidad: producto.cantidad,
- costoUnitario: producto.costoUnitario,
- comentario: producto.comentario,
- );
- int idPedidoProducto =
- await repoPedidoProducto.guardarLocal(pedidoProducto);
- for (var topping in producto.toppings) {
- PedidoProductoTopping pedidoProductoTopping = PedidoProductoTopping(
- idPedidoProducto: idPedidoProducto,
- idTopping: topping.idTopping,
- );
- await repoPedidoProductoTopping.guardarLocal(pedidoProductoTopping);
- }
- }
- notifyListeners();
- return true;
- } else {
- return false;
- }
- }
- Future<void> fetchLocalPedidos({int page = 1}) async {
- _isLoading = true;
- _currentPage = page;
- notifyListeners();
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- _totalPedidos = await repoPedido.contarPedidos();
- int offset = (_limit * (page - 1));
- List<Pedido> paginatedPedidos =
- await repoPedido.obtenerPedidosPaginados(_limit, offset);
- _pedidos = paginatedPedidos;
- _isLoading = false;
- notifyListeners();
- }
- void nextPage() {
- if (_currentPage < totalPages) {
- fetchLocalPedidosForScreen(page: _currentPage + 1);
- }
- }
- void previousPage() {
- if (_currentPage > 1) {
- fetchLocalPedidosForScreen(page: _currentPage - 1);
- }
- }
- Future<void> fetchLocalPedidosForScreen({int page = 1}) async {
- setIsLoading(true);
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- _currentPage = page;
- var db = await RepoService().db;
- int? count = Sqflite.firstIntValue(
- await db!.rawQuery('SELECT COUNT(*) FROM Pedido'));
- _totalPedidos = count ?? 0;
- int offset = (_limit * (page - 1));
- List<Pedido> localPedidos =
- await repoPedido.obtenerPedidosPaginados(_limit, offset);
- _pedidos = localPedidos;
- setIsLoading(false);
- notifyListeners();
- }
- Future<Pedido?> fetchPedidoConProductos(int idPedido) async {
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- Pedido? pedido = await repoPedido.obtenerPorId(idPedido);
- if (pedido != null) {
- RepoService<PedidoProducto> repoProducto = RepoService<PedidoProducto>();
- RepoService<Producto> repoProductoInfo = RepoService<Producto>();
- List<PedidoProducto> productos =
- await repoProducto.obtenerPorIdPedido(idPedido);
- for (var producto in productos) {
- Producto? prodInfo =
- await repoProductoInfo.obtenerProductoPorId(producto.idProducto!);
- if (prodInfo != null) {
- producto.producto = prodInfo;
- }
- RepoService<PedidoProductoTopping> repoTopping =
- RepoService<PedidoProductoTopping>();
- List<PedidoProductoTopping> toppings =
- await repoTopping.obtenerToppingsPorPedidoProducto(producto.id!);
- for (var topping in toppings) {
- Producto? toppingInfo =
- await repoProductoInfo.obtenerProductoPorId(topping.idTopping!);
- if (toppingInfo != null) {
- topping.topping = toppingInfo;
- }
- }
- producto.toppings = toppings;
- }
- pedido.productos = productos;
- }
- return pedido;
- }
- Future<void> buscarPedidosPorFolio(String folio) async {
- setIsLoading(true);
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- List<Pedido> localPedidos = await repoPedido.buscarPorFolio(folio);
- _pedidos = localPedidos;
- setIsLoading(false);
- notifyListeners();
- }
- Future<void> buscarPedidosPorFecha(
- DateTime startDate, DateTime endDate) async {
- setIsLoading(true);
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- List<Pedido> localPedidos =
- await repoPedido.buscarPorFecha(startDate, endDate);
- _pedidos = localPedidos;
- setIsLoading(false);
- notifyListeners();
- }
- Future<List<Pedido>> buscarPorFecha(
- DateTime startDate, DateTime endDate) async {
- setIsLoading(true);
- RepoService<Pedido> repoPedido = RepoService<Pedido>();
- List<Pedido> pedidos = await repoPedido.buscarPorFecha(startDate, endDate);
- setIsLoading(false);
- notifyListeners();
- return pedidos;
- }
- Future<void> cancelarPedido(int idPedido) async {
- var db = await RepoService().db;
- await db?.update('Pedido', {'estatus': 'CANCELADO'},
- where: 'id = ?', whereArgs: [idPedido]);
- fetchLocalPedidosForScreen();
- }
- }
|