receipt_view.dart

null-safety-migration
error500 2021-09-28 16:02:44 +06:00
parent 012ef0acc6
commit 068374e794
10 changed files with 170 additions and 83 deletions

View File

@ -95,4 +95,21 @@ class DataService extends BaseService {
..articul = product.article?.toString(); ..articul = product.article?.toString();
return item; return item;
} }
Future<TransactionData?> getTransactionDataById(int? id) async {
if(id == null) return null;
try {
Map<String, dynamic>? map = await _db.queryById(transactionTableName, id);
if (map != null) {
final Transaction transaction = Transaction.fromMap(map);
final String? data = transaction.data;
if (data != null) {
return TransactionData.fromMap(jsonDecode(data));
}
}
} catch (e, stack) {
log.e('getTransactionDataById', e, stack);
}
return null;
}
} }

View File

@ -7,10 +7,9 @@ const String addByBarcodeViewRoute = 'AddByBarcodeView';
const String contragentSelectViewRoute = 'ContragentSelectViewRoute'; const String contragentSelectViewRoute = 'ContragentSelectViewRoute';
const String paymentViewRoute = 'paymentViewRoute'; const String paymentViewRoute = 'paymentViewRoute';
const String receiptViewRoute = 'receiptViewRoute';
const String settingPrinterBluetoothViewRoute = 'SettingPrinterBluetoothView'; const String settingPrinterBluetoothViewRoute = 'SettingPrinterBluetoothView';
const String settingPrinterBleBluetoothView = 'SettingPrinterBleBluetoothView';
const String settingPrinterBlueView = 'settingPrinterBlueView';
// Generate the views here // Generate the views here

View File

@ -1,23 +1,22 @@
import 'package:flutter/material.dart';
import 'package:satu/core/models/dictionary/category_row_data.dart'; import 'package:satu/core/models/dictionary/category_row_data.dart';
import 'package:satu/core/models/dictionary/good_row_data.dart'; import 'package:satu/core/models/dictionary/good_row_data.dart';
import 'package:satu/core/models/entity_data/transaction_data.dart';
import 'package:satu/views/dictionaries/category/category_edit.dart'; import 'package:satu/views/dictionaries/category/category_edit.dart';
import 'package:satu/views/dictionaries/category/category_select_view.dart'; import 'package:satu/views/dictionaries/category/category_select_view.dart';
import 'package:satu/views/dictionaries/category/category_view.dart';
import 'package:satu/views/dictionaries/goods/goods_edit.dart'; import 'package:satu/views/dictionaries/goods/goods_edit.dart';
import 'package:satu/views/dictionaries/goods/goods_view.dart'; import 'package:satu/views/login/login_view.dart';
import 'package:satu/views/main/main_view.dart';
import 'package:satu/views/settings/printer_bluetooth/printer_view.dart'; import 'package:satu/views/settings/printer_bluetooth/printer_view.dart';
import 'package:satu/views/work/views/add_by_barcode/add_by_barcode_view.dart'; import 'package:satu/views/work/views/add_by_barcode/add_by_barcode_view.dart';
import 'package:satu/views/work/views/add_product/add_product_view.dart'; import 'package:satu/views/work/views/add_product/add_product_view.dart';
import 'package:satu/views/login/login_view.dart';
import 'package:satu/views/main/main_view.dart';
import 'package:satu/views/settings/printer_bluetooth/printer_select.dart';
import 'package:satu/views/work/views/contragent/select_contragent_view.dart'; import 'package:satu/views/work/views/contragent/select_contragent_view.dart';
import 'package:satu/views/work/views/payment/payment_view.dart'; import 'package:satu/views/work/views/payment/payment_view.dart';
import 'package:satu/views/work/views/receipt/receipt_view.dart';
import 'package:satu/views/work/work_view.dart'; import 'package:satu/views/work/work_view.dart';
import './route_names.dart'; import './route_names.dart';
import 'package:flutter/material.dart';
Route<dynamic> generateRoute(RouteSettings settings) { Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) { switch (settings.name) {
@ -80,13 +79,13 @@ Route<dynamic> generateRoute(RouteSettings settings) {
viewToShow: GoodEdit(good: good,), viewToShow: GoodEdit(good: good,),
); );
// case ImageShowRoute: case receiptViewRoute:
// ImageShowModel data = settings.arguments as ImageShowModel; final TransactionData data = settings.arguments! as TransactionData;
// //return SlideRightRoute(widget: ImageShowContainer(data)); //return SlideRightRoute(widget: ImageShowContainer(data));
// return _getPageRoute( return _getPageRoute(
// routeName: settings.name, routeName: settings.name,
// viewToShow: ImageShowContainer(data), viewToShow: ReceiptView(transactionData: data,),
// ); );
default: default:
return MaterialPageRoute( return MaterialPageRoute(
builder: (_) => Scaffold( builder: (_) => Scaffold(

View File

@ -23,7 +23,7 @@ class ContragentSelectBar extends StatelessWidget {
locator<NavigatorService>().push(contragentSelectViewRoute); locator<NavigatorService>().push(contragentSelectViewRoute);
}, },
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(vertical: 8.w, horizontal: 15.w), padding: EdgeInsets.symmetric(vertical:08.w, horizontal: 15.w),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(

View File

@ -1,10 +1,15 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:grouped_list/grouped_list.dart'; import 'package:grouped_list/grouped_list.dart';
import 'package:satu/core/models/entity_data/transaction_data.dart';
import 'package:satu/core/models/flow/dao/transaction_dao.dart'; import 'package:satu/core/models/flow/dao/transaction_dao.dart';
import 'package:satu/core/redux/actions/journal_actions.dart'; import 'package:satu/core/redux/actions/journal_actions.dart';
import 'package:satu/core/redux/state/journal_state.dart'; import 'package:satu/core/redux/state/journal_state.dart';
import 'package:satu/core/redux/store.dart'; import 'package:satu/core/redux/store.dart';
import 'package:satu/core/services/data_service.dart';
import 'package:satu/core/services/navigator_service.dart';
import 'package:satu/core/utils/locator.dart';
import 'package:satu/routes/route_names.dart';
import 'package:satu/shared/app_colors.dart'; import 'package:satu/shared/app_colors.dart';
import 'package:satu/widgets/bar/products_app_bar.dart'; import 'package:satu/widgets/bar/products_app_bar.dart';
import 'package:satu/widgets/buttons/option_pill.dart'; import 'package:satu/widgets/buttons/option_pill.dart';
@ -17,6 +22,9 @@ class JournalView extends StatefulWidget {
} }
class _JournalViewState extends State<JournalView> { class _JournalViewState extends State<JournalView> {
final DataService _dataService = locator<DataService>();
final NavigatorService _navigatorService = locator<NavigatorService>();
int tabIndex = 0; int tabIndex = 0;
@override @override
@ -30,6 +38,7 @@ class _JournalViewState extends State<JournalView> {
return Scaffold( return Scaffold(
appBar: const ProductsAppBar( appBar: const ProductsAppBar(
title: 'Журнал транзакции', title: 'Журнал транзакции',
drawerShow: true,
), ),
body: StoreConnector<AppState, JournalState>( body: StoreConnector<AppState, JournalState>(
converter: (store) => store.state.journalState!, converter: (store) => store.state.journalState!,
@ -38,9 +47,7 @@ class _JournalViewState extends State<JournalView> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(color: whiteColor),
color: whiteColor
),
child: Padding( child: Padding(
padding: const EdgeInsets.all(15.0), padding: const EdgeInsets.all(15.0),
child: Row( child: Row(
@ -105,6 +112,9 @@ class _JournalViewState extends State<JournalView> {
date: element.date!, date: element.date!,
amount: element.total, amount: element.total,
received: element.received, received: element.received,
onPress: () {
pushToReceiptView(element);
},
), ),
itemComparator: (item1, item2) => itemComparator: (item1, item2) =>
item1.day!.compareTo(item2.day!), item1.day!.compareTo(item2.day!),
@ -122,4 +132,13 @@ class _JournalViewState extends State<JournalView> {
}), }),
); );
} }
Future<void> pushToReceiptView(TransactionDao element) async {
final int? id = element.id;
TransactionData? transactionData =
await _dataService.getTransactionDataById(id);
if(transactionData != null) {
_navigatorService.push(receiptViewRoute, arguments: transactionData);
}
}
} }

View File

@ -35,7 +35,7 @@ class SellView extends StatelessWidget {
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
childHeight: 60, childHeight: 60,
child: ProductHeaderBar( child: ProductHeaderBar(
count: state.items!.length, count: state.items!.length,
sum: sumProducts(state.items!), sum: sumProducts(state.items!),
), ),
), ),

View File

@ -0,0 +1,51 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:satu/core/models/entity_data/transaction_data.dart';
import 'package:satu/core/models/flow/sell_response.dart';
import 'package:satu/shared/app_colors.dart';
import 'package:satu/widgets/bar/products_app_bar.dart';
class ReceiptView extends StatelessWidget {
const ReceiptView({
required this.transactionData,
Key? key,
}) : super(key: key);
final TransactionData transactionData;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: whiteColor,
appBar: const ProductsAppBar(
title: 'Просмотр чека',
),
body: Column(
children: [
Expanded(
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Center(child: imageFromBase64String(transactionData.sellResponse)),
),
)
],
));
}
}
Widget imageFromBase64String(SellResponse? sellResponse) {
final String? base64String = sellResponse?.checkPng;
if (base64String == null) {
return const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 8.0),
child: Center(
child: Text('Отсутсвует информация о чеке'),
),
);
}
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 8.0),
child: Image.memory(base64Decode(base64String)),
);
}

View File

@ -8,7 +8,7 @@ class ProductsAppBar extends StatelessWidget implements PreferredSizeWidget {
final String? title; final String? title;
final List<Widget>? actions; final List<Widget>? actions;
final Widget? child; final Widget? child;
final int? childHeight; final double childHeight;
final double elevation; final double elevation;
final Color? backgroundColor; final Color? backgroundColor;
final bool drawerShow; final bool drawerShow;
@ -32,8 +32,8 @@ class ProductsAppBar extends StatelessWidget implements PreferredSizeWidget {
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: AssetImage('assets/images/top_bar_bg.png'), image: const AssetImage('assets/images/top_bar_bg.png'),
fit: BoxFit.fitWidth, fit: childHeight > 0 ? BoxFit.cover : BoxFit.fitWidth,
alignment: FractionalOffset.topLeft, alignment: FractionalOffset.topLeft,
), ),
), ),
@ -42,25 +42,32 @@ class ProductsAppBar extends StatelessWidget implements PreferredSizeWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
AppBar( AppBar(
title: Text(title ?? ''), title: Text(
title ?? '',
style: const TextStyle(color: blackColor, fontSize: 14),
),
iconTheme: const IconThemeData(
color: blackColor, //change your color here
),
centerTitle: true, centerTitle: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
elevation: 0.0, elevation: 0.0,
leading: drawerShow ? IconButton( leading: drawerShow
icon: Icon( ? IconButton(
Icons.menu, icon: const Icon(
color: blackColor, Icons.menu,
), ),
onPressed: () { onPressed: () {
locator<NavigatorService>() locator<NavigatorService>()
.scaffoldDrawerKey .scaffoldDrawerKey
.currentState! .currentState!
.openDrawer(); .openDrawer();
}, },
) : null , )
: null,
actions: actions, actions: actions,
), ),
if (child != null && childHeight! > 0) child!, if (child != null && childHeight > 0) child!,
], ],
), ),
), ),
@ -69,6 +76,6 @@ class ProductsAppBar extends StatelessWidget implements PreferredSizeWidget {
@override @override
Size get preferredSize { Size get preferredSize {
return new Size.fromHeight(60.0 + childHeight!); return Size.fromHeight(60.0 + childHeight);
} }
} }

View File

@ -5,32 +5,33 @@ import 'package:satu/shared/shared_styles.dart';
import 'package:satu/widgets/dialog/modal_select_dialog.dart'; import 'package:satu/widgets/dialog/modal_select_dialog.dart';
class ProductHeaderBar extends StatelessWidget { class ProductHeaderBar extends StatelessWidget {
const ProductHeaderBar({required this.count, required this.sum , Key? key})
: super(key: key);
final int count; final int count;
final num sum; final num sum;
const ProductHeaderBar({Key? key, required this.count, required this.sum})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.w), padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'Итого: $sum тнг', 'Итого: $sum тнг',
style: TextStyle( style: const TextStyle(
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
color: blackColor, color: blackColor,
fontSize: ScreenUtil().setSp(20)), fontSize: 20),
), ),
Text( Text(
'Товаров выбрано: $count', 'Товаров выбрано: $count',
style: TextStyle( style: const TextStyle(
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
color: blackColor, color: blackColor,
fontSize: ScreenUtil().setSp(15)), fontSize: 12),
), ),
], ],
), ),

View File

@ -1,18 +1,22 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:satu/core/models/dialog_models.dart';
import 'package:satu/core/redux/actions/sell_actions.dart'; import 'package:satu/core/redux/actions/sell_actions.dart';
import 'package:satu/core/redux/store.dart'; import 'package:satu/core/redux/store.dart';
import 'package:satu/core/services/dialog_service.dart';
import 'package:satu/core/utils/locator.dart';
import 'package:satu/shared/app_colors.dart'; import 'package:satu/shared/app_colors.dart';
class ProductsTitleBarBar extends StatelessWidget { class ProductsTitleBarBar extends StatelessWidget {
const ProductsTitleBarBar( const ProductsTitleBarBar({
{required this.title , Key? key, this.itemsExist = false}) required this.title,
: super(key: key); Key? key,
this.itemsExist = false,
}) : super(key: key);
final bool itemsExist; final bool itemsExist;
final String title; final String title;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
@ -20,43 +24,33 @@ class ProductsTitleBarBar extends StatelessWidget {
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10), padding: const EdgeInsets.symmetric(vertical: 10),
child: Text( child: Text(
title, title,
style: const TextStyle(fontSize: 12, color: placeholderColor), style: const TextStyle(fontSize: 12, color: placeholderColor),
),
), ),
)), ),
if (itemsExist) if (itemsExist)
TextButton( TextButton(
onPressed: () async { onPressed: () async {
final bool? result = await showDialog( final DialogResponse response =
context: context, await locator<DialogService>().showConfirmationDialog(
builder: (BuildContext context) { title: 'Внимание',
return AlertDialog( description: 'Удалить все товары из списка?',
title: const Text('Внимание'), confirmationTitle: 'Удалить',
content: const Text('Удалить все товары из списка'), cancelTitle: 'Отмена',
actions: <Widget>[ );
TextButton( if (response.confirmed == true) {
onPressed: () => Redux.store!.dispatch(removeAllSellData);
Navigator.of(context).pop(true), }
child: const Text('Удалить')), },
TextButton( child: Text(
onPressed: () => Navigator.of(context).pop(false), 'Удалить все',
child: const Text('Отмена'), style: TextStyle(fontSize: 16.sp, color: dangerColor),
), ),
], )
);
},
);
if (result == true) {
Redux.store!.dispatch(removeAllSellData);
}
},
child: Text(
'Удалить все',
style: TextStyle(fontSize: 16.sp, color: dangerColor),
))
], ],
), ),
); );