import 'dart:convert'; import 'package:logger/logger.dart'; import 'package:meta/meta.dart'; import 'package:redux/redux.dart'; import 'package:redux_thunk/redux_thunk.dart'; import 'package:satu/core/entity/Category.dart'; import 'package:satu/core/entity/Goods.dart'; import 'package:satu/core/entity/Transaction.dart'; import 'package:satu/core/models/flow/product_dao.dart'; import 'package:satu/core/models/flow/transaction_state.dart'; import 'package:satu/core/redux/state/sell_state.dart'; import 'package:satu/core/services/db_service.dart'; import 'package:satu/core/utils/locator.dart'; import 'package:satu/core/utils/logger.dart'; import 'package:uuid/uuid.dart'; import '../store.dart'; @immutable class SetSellStateAction { final SellState sellState; SetSellStateAction(this.sellState); } final Logger log = getLogger('SetSellStateAction'); final DbService _dbService = locator(); ThunkAction addSellItem({Good good, String excise}) { return (Store store) async { log.i('addSellItem'); int appCompanyId = store.state.userState.auth.companyId; String uuid = store.state.sellState.transactionState.uuid; Transaction transaction; if (uuid != null && good != null) { List> set = await _dbService.queryRowsWithWhere( TransactionTableName, '$TransactionColumnAppCompanyId = ? and $TransactionColumnStatus = ? and ${TransactionColumnType} = ?', [appCompanyId, TransactionStatusPrepare, TransactionTypeSell], orderBy: '$TransactionColumnCreatedAt desc'); if (set.isNotEmpty) { for (Map map in set) { Transaction _transaction = Transaction.fromMap(map); ProductDao _product = ProductDao.fromMap(jsonDecode(_transaction.data)); if (_product.id == good.id && _product.excise == excise) { transaction = _transaction; break; } } } } if (transaction != null) { ProductDao item = ProductDao.fromMap(jsonDecode(transaction.data)); item..count = item.count + 1; transaction.data = jsonEncode(item.toMap()); transaction.createdAt = DateTime.now().toIso8601String(); _dbService.update(TransactionTableName, transaction.toMap()); } else { ProductDao item = new ProductDao() ..id = good.id ..price = good.price ..article = good.articul ..count = 1.0 ..eanCode = good.ean ..productName = good.name ..excise = excise; //category add logic if (good.categoryId != null) { List> set = await _dbService.queryRowsWithWhere(CategoryTableName, 'id = ?', [good.categoryId]); if (set.isNotEmpty) { Category category = Category.fromMap(set.first); item.categoryId = category.id; } } if (uuid == null) { var uuidTool = Uuid(); ; uuid = uuidTool.v4(); } transaction = new Transaction() ..uuid = uuid ..status = TransactionStatusPrepare ..appCompanyId = appCompanyId ..type = TransactionTypeSell ..createdAt = DateTime.now().toIso8601String() ..data = jsonEncode(item.toMap()); await _dbService.insert(TransactionTableName, transaction.toMap()); } await loadSellData(store); }; } Future loadSellData(Store store) async { try { int appCompanyId = store.state.userState.auth.companyId; List> set = await _dbService.queryRowsWithWhere( TransactionTableName, '$TransactionColumnAppCompanyId = ? and $TransactionColumnStatus = ? and ${TransactionColumnType} = ?', [appCompanyId, TransactionStatusPrepare, TransactionTypeSell], orderBy: '$TransactionColumnCreatedAt desc'); List list = []; String uuid; for (Map map in set) { Transaction transaction = Transaction.fromMap(map); uuid = transaction.uuid; list.add(ProductDao.fromMap(jsonDecode(transaction.data))); } store.dispatch(SetSellStateAction(SellState(items: list, transactionState: TransactionState()..uuid = uuid))); } catch (e, stack) { log.e('loadSellData', e, stack); } }