import 'package:aman_kassa_flutter/core/entity/Goods.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/models/product_dao.dart'; import 'package:aman_kassa_flutter/core/route_names.dart'; import 'package:aman_kassa_flutter/core/services/DataService.dart'; import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; import 'package:aman_kassa_flutter/redux/actions/kassa_actions.dart'; import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart'; import 'package:aman_kassa_flutter/redux/constants/operation_const.dart'; import 'package:aman_kassa_flutter/redux/constants/setting_const.dart'; import 'package:aman_kassa_flutter/redux/state/kassa_state.dart'; import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/shared/app_colors.dart'; import 'package:aman_kassa_flutter/shared/shared_styles.dart'; import 'package:aman_kassa_flutter/views/home/tabs/kassaView/CatalogBottomSheet.dart'; import 'package:aman_kassa_flutter/views/home/tabs/kassaView/ProductAddBottomSheet.dart'; import 'package:aman_kassa_flutter/views/payment/payment_view.dart'; import 'package:aman_kassa_flutter/widgets/components/ProductListItem.dart'; // import 'package:barcode_scan/gen/protos/protos.pb.dart'; // import 'package:barcode_scan/gen/protos/protos.pbenum.dart'; // import 'package:barcode_scan/model/scan_options.dart'; // import 'package:barcode_scan/platform_wrapper.dart'; import 'package:barcode_scan2/barcode_scan2.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class KassaTab extends StatelessWidget { final NavigatorService _navigatorService = locator(); final DialogService _dialogService = locator(); final DataService _dataService = locator(); final int index; KassaTab(this.index); Widget buildItem(BuildContext ctxt, int index, ProductDao productDao) { return ProductListItem( item: productDao, index: index, ); } @override Widget build(BuildContext context) { return Scaffold( floatingActionButton: Container( padding: EdgeInsets.only(bottom: 65.0, left: 8.0), child: Align( alignment: Alignment.bottomLeft, child: FloatingActionButton( elevation: 3.0, onPressed: scan, child: Icon( MdiIcons.barcode, size: 30, ), ), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, body: Padding( padding: const EdgeInsets.all(4), child: Column( children: [ Row( children: [ Expanded( child: Padding( padding: const EdgeInsets.all(4.0), child: RaisedButton( padding: const EdgeInsets.all(8), color: primaryColor, child: Text( "Добавить", style: buttonBigTitleTextStyle, ), onPressed: () { showModalBottomSheetCatalog(context, 'add'); }, ), ), ), Expanded( child: Padding( padding: const EdgeInsets.all(4.0), child: RaisedButton( padding: EdgeInsets.all(8), color: greenColor, child: Text( "Каталог", style: buttonBigTitleTextStyle, ), onPressed: () { showModalBottomSheetCatalog(context, 'catalog'); }, ), ), ), ], ), Expanded( child: Container( child: StoreConnector( converter: (store) => store.state.kassaState, builder: (context, vm) { return ListView.builder( itemCount: vm.kassaItems.length, itemBuilder: (BuildContext ctxt, int index) => buildItem(ctxt, index, vm.kassaItems[index])); }), ), ), //Divider(), Container( margin: const EdgeInsets.symmetric(vertical: 8), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ StoreConnector( converter: (store) => store.state.kassaState, builder: (context, vm) { return Text(totalCalc(vm.kassaItems), style: TextStyle(fontSize: 25)); }), ], ), ), Row( children: [ Expanded( child: Padding( padding: const EdgeInsets.all(4.0), child: RaisedButton( padding: const EdgeInsets.all(8), color: redColor, child: Text( "возврат", style: buttonBigTitleTextStyle, ), onPressed: () { _navigatorService.push(PaymentViewRoute, arguments: PaymentModel( mode: SettingModeKassa, operationType: OperationTypeReturn)); }), ), ), Expanded( child: Padding( padding: const EdgeInsets.all(4.0), child: RaisedButton( padding: const EdgeInsets.all(8), color: greenColor, child: Text( "оплата", style: buttonBigTitleTextStyle, ), onPressed: () { _navigatorService.push(PaymentViewRoute, arguments: PaymentModel( mode: SettingModeKassa, operationType: OperationTypePay)); }, ), ), ), ], ) ], ), ), ); } String totalCalc(List kassaItems) { num total = 0.0; kassaItems.forEach((element) { total += element.total == null ? 0.0 : element.total.toDouble(); }); return total.toString(); } Future scan() async { try { await Redux.store.dispatch(changePinSkipFromSetting(true)); var options = ScanOptions( strings: { "cancel": 'Отмена', "flash_on": 'Вкл фонарик', "flash_off": 'Выкл фонарик', }, ); var result = await BarcodeScanner.scan(options: options); if (result.type == ResultType.Barcode) { String barcode; String dataMatrix; if (result.format == BarcodeFormat.ean13 || result.format == BarcodeFormat.ean8) { barcode = result.rawContent; } else if (result.format == BarcodeFormat.dataMatrix) { dataMatrix = result.rawContent; if (dataMatrix != null && dataMatrix.length > 15) { try { String numberText = dataMatrix .substring(0, dataMatrix.length - 15) .replaceAll(RegExp("[a-zA-Z]"), ''); barcode = int.parse(numberText).toString(); } catch (e) { // Обработка ошибки, если необходимо } } } if (barcode != null) { List goods = await _dataService.getGoodsByBarcode(barcode: barcode); if (goods != null && goods.isNotEmpty) { await Redux.store.dispatch(addProductToKassaItems(goods.first, dataMatrix)); } else { _dialogService.showDialog(description: 'Товар не найден: $barcode'); } } else { _dialogService.showDialog(description: 'Не удалось распознать штрих-код'); } } else if (result.type == ResultType.Cancelled) { // Пользователь отменил сканирование } else if (result.type == ResultType.Error) { _dialogService.showDialog(description: 'Ошибка сканирования: ${result.rawContent}'); } } on PlatformException catch (e) { if (e.code == BarcodeScanner.cameraAccessDenied) { _dialogService.showDialog(description: 'Нет доступа к камере устройства'); } else { _dialogService.showDialog(description: 'Ошибка сканирования: ${e.message}'); } } catch (e) { _dialogService.showDialog(description: 'Неизвестная ошибка: $e'); } finally { await Redux.store.dispatch(changePinSkipFromSetting(false)); } } void showModalBottomSheetCatalog(BuildContext context, String action) { if (action == 'add') { Navigator.push( context, MaterialPageRoute(builder: (context) => ProductAddBottomSheet()) ); } else { Navigator.push( context, MaterialPageRoute(builder: (context) => CatalogBottomSheet()) ); } // showModalBottomSheet( // context: context, // isScrollControlled: true, // backgroundColor: Colors.transparent, // builder: (context) { // return DraggableScrollableSheet( // initialChildSize: 0.8, // maxChildSize: 0.95, // minChildSize: 0.5, // builder: (BuildContext context, ScrollController scrollController) { // if (action == 'add') { // return ProductAddBottomSheet( // scrollController: scrollController, // ); // } else { // return CatalogBottomSheet( // scrollController: scrollController, // ); // } // }, // ); // }); } }