From 8b4379a4951e22e828d1db93305a5422c9c360db Mon Sep 17 00:00:00 2001 From: suvaissov Date: Mon, 6 Sep 2021 14:20:22 +0600 Subject: [PATCH] payment/payment_view.dart --- lib/core/models/flow/check_bean.dart | 12 ++-- .../{rows_bean.dart => check_row_bean.dart} | 10 +-- lib/core/models/flow/items_bean.dart | 6 +- lib/core/models/flow/product_dao.dart | 8 +-- lib/core/models/flow/sell_request.dart | 24 ++++--- lib/core/models/flow/sell_response.dart | 5 +- lib/core/models/flow/transaction_state.dart | 1 + lib/core/redux/actions/sell_actions.dart | 12 +++- lib/core/services/api_service.dart | 72 ++++++++++++++----- lib/core/services/data_service.dart | 44 +++++++++++- .../work/views/payment/payment_view.dart | 29 ++++++-- 11 files changed, 163 insertions(+), 60 deletions(-) rename lib/core/models/flow/{rows_bean.dart => check_row_bean.dart} (75%) diff --git a/lib/core/models/flow/check_bean.dart b/lib/core/models/flow/check_bean.dart index 3cd52ad..aad6f6c 100644 --- a/lib/core/models/flow/check_bean.dart +++ b/lib/core/models/flow/check_bean.dart @@ -1,18 +1,20 @@ -import 'package:satu/core/models/flow/rows_bean.dart'; +import 'package:satu/core/models/flow/check_row_bean.dart'; import 'package:satu/core/utils/utils_parse.dart'; class CheckBean { - List rows =[]; + List rows =[]; String? qr; String? link; static CheckBean? fromMap(dynamic map) { if (map == null) return null; final CheckBean checkBean = CheckBean(); - checkBean.rows.addAll( - (map['rows'] as List ?? []).map((o) => CheckRowsBean.fromMap(o)) - ); + if(map['rows'] != null) { + checkBean.rows.addAll( + (map['rows'] as List).map((o) => CheckRowBean.fromMap(o)) + ); + } checkBean.qr = cast(map['qr']); checkBean.link = cast(map['link']); return checkBean; diff --git a/lib/core/models/flow/rows_bean.dart b/lib/core/models/flow/check_row_bean.dart similarity index 75% rename from lib/core/models/flow/rows_bean.dart rename to lib/core/models/flow/check_row_bean.dart index 791fc7a..684a328 100644 --- a/lib/core/models/flow/rows_bean.dart +++ b/lib/core/models/flow/check_row_bean.dart @@ -6,17 +6,17 @@ import 'package:satu/core/utils/utils_parse.dart'; /// name : "toptext" /// value : null -class CheckRowsBean { +class CheckRowBean { late int size; - String? text; + dynamic text; late bool center; String? name; String? value; - static CheckRowsBean fromMap(dynamic map) { - CheckRowsBean rowsBean = CheckRowsBean(); + static CheckRowBean fromMap(dynamic map) { + final CheckRowBean rowsBean = CheckRowBean(); rowsBean.size = cast(map['size']) ?? 14; - rowsBean.text = cast(map['text']); + rowsBean.text = cast(map['text']); rowsBean.center = cast(map['center']) ?? false; rowsBean.name = cast(map['name']); rowsBean.value = cast(map['value']); diff --git a/lib/core/models/flow/items_bean.dart b/lib/core/models/flow/items_bean.dart index d6179f8..f5e5ce5 100644 --- a/lib/core/models/flow/items_bean.dart +++ b/lib/core/models/flow/items_bean.dart @@ -8,7 +8,7 @@ import 'package:satu/core/utils/utils_parse.dart'; /// price : 200 /// excise : "000000000000_gs1_excise_code" -class ItemsBean { +class ItemBean { int? id; String? name; String? articul; @@ -16,8 +16,8 @@ class ItemsBean { double? price; String? excise; - static ItemsBean fromMap(dynamic map) { - final ItemsBean itemsBean = ItemsBean(); + static ItemBean fromMap(dynamic map) { + final ItemBean itemsBean = ItemBean(); itemsBean.id = cast(map['id']); itemsBean.name = cast(map['name']); itemsBean.articul = cast(map['articul']); diff --git a/lib/core/models/flow/product_dao.dart b/lib/core/models/flow/product_dao.dart index 63dc719..0852360 100644 --- a/lib/core/models/flow/product_dao.dart +++ b/lib/core/models/flow/product_dao.dart @@ -6,8 +6,8 @@ class ProductDao { ProductDao.fromMap(dynamic map) { id = map['id'] as int; categoryId = map['categoryId'] as int; - count = map['count'] as num; - price = map['price'] as num; + count = map['count'] as double; + price = map['price'] as double; productName = cast(map['productName']) ?? ''; categoryName = cast(map['categoryName']); eanCode = cast(map['eanCode']); @@ -18,8 +18,8 @@ class ProductDao { int? id; int? categoryId; - num? count; - num? price; + double? count; + double? price; String productName = ''; String? categoryName; String? eanCode; diff --git a/lib/core/models/flow/sell_request.dart b/lib/core/models/flow/sell_request.dart index 26f935b..3c0dc5c 100644 --- a/lib/core/models/flow/sell_request.dart +++ b/lib/core/models/flow/sell_request.dart @@ -5,10 +5,10 @@ import 'items_bean.dart'; import 'operator_bean.dart'; class SellRequest { - String? type; - List items = []; - int card = 0; - int nal = 0; + String type = 'g'; + List items = []; + double card = 0; + double nal = 0; String? invoiceId; String? section; OperatorBean? operator; @@ -16,12 +16,14 @@ class SellRequest { static SellRequest fromMap(dynamic map) { final SellRequest sellRequestBean = SellRequest(); - sellRequestBean.type = cast(map['type']); - sellRequestBean.items.addAll( - (map['items'] as List ?? []).map((o) => ItemsBean.fromMap(o)) - ); - sellRequestBean.card = cast(map['card']) ?? 0; - sellRequestBean.nal = cast(map['nal']) ?? 0; + sellRequestBean.type = cast(map['type']) ?? 'g'; + if(map['items'] !=null) { + sellRequestBean.items.addAll( + (map['items'] as List).map((o) => ItemBean.fromMap(o)) + ); + } + sellRequestBean.card = cast(map['card']) ?? 0; + sellRequestBean.nal = cast(map['nal']) ?? 0; sellRequestBean.invoiceId = cast(map['invoice_id']); sellRequestBean.section = cast(map['section']); sellRequestBean.operator = OperatorBean.fromMap(map['operator']); @@ -29,7 +31,7 @@ class SellRequest { return sellRequestBean; } - Map toJson() => { + Map toJson() => { 'type': type, 'items': items, 'card': card, diff --git a/lib/core/models/flow/sell_response.dart b/lib/core/models/flow/sell_response.dart index fe95a9c..f323f4f 100644 --- a/lib/core/models/flow/sell_response.dart +++ b/lib/core/models/flow/sell_response.dart @@ -12,8 +12,7 @@ class SellResponse { String? message; late bool operation; - static SellResponse? fromMap(dynamic map) { - if (map == null) return null; + static SellResponse fromMap(dynamic map) { final SellResponse sellResponseBean = SellResponse(); sellResponseBean.journalId = cast(map['journal_id']); sellResponseBean.check = CheckBean.fromMap(map['check']); @@ -25,7 +24,7 @@ class SellResponse { return sellResponseBean; } - Map toJson() => { + Map toJson() => { 'journal_id': journalId, 'check': check, 'check_png': checkPng, diff --git a/lib/core/models/flow/transaction_state.dart b/lib/core/models/flow/transaction_state.dart index 11c140c..ee7dca2 100644 --- a/lib/core/models/flow/transaction_state.dart +++ b/lib/core/models/flow/transaction_state.dart @@ -1,3 +1,4 @@ class TransactionState { String? uuid; + int? transactionId; } diff --git a/lib/core/redux/actions/sell_actions.dart b/lib/core/redux/actions/sell_actions.dart index 3594fef..795167b 100644 --- a/lib/core/redux/actions/sell_actions.dart +++ b/lib/core/redux/actions/sell_actions.dart @@ -22,6 +22,7 @@ import '../store.dart'; @immutable class SetSellStateAction { const SetSellStateAction(this.sellState); + final SellState sellState; } @@ -47,7 +48,7 @@ ThunkAction counterOrEditSellItem( item.count = counter; } else { final String val = ((item.count ?? 0) + counter).toStringAsFixed(5); - item.count = num.parse(val); + item.count = double.parse(val); } transactionRec.data = jsonEncode(item.toMap()); _dbService.update(transactionRecTableName, transactionRec.toMap()); @@ -119,7 +120,7 @@ ThunkAction addSellItem({required Good good, String? excise}) { if (item == null) { item = ProductDao() ..id = good.id - ..price = good.price + ..price = good.price!.toDouble() ..article = good.articul ..count = 1.0 ..eanCode = good.ean @@ -200,9 +201,11 @@ Future loadSellData(Store store) async { orderBy: '$transactionColumnCreatedAt desc'); final List list = []; String? uuid; + int? transactionId; if (set.isNotEmpty) { final Transaction transaction = Transaction.fromMap(set.first); uuid = transaction.uuid; + transactionId = transaction.id; final List> recs = await _dbService.queryRowsWithWhere(transactionRecTableName, '$transactionRecTransactionIdRef = ? ', [transaction.id], @@ -215,7 +218,10 @@ Future loadSellData(Store store) async { } } store.dispatch(SetSellStateAction(SellState( - items: list, transactionState: TransactionState()..uuid = uuid))); + items: list, + transactionState: TransactionState() + ..uuid = uuid + ..transactionId = transactionId))); } catch (e, stack) { log.e('loadSellData', e, stack); } diff --git a/lib/core/services/api_service.dart b/lib/core/services/api_service.dart index fc62f3a..8b10e27 100644 --- a/lib/core/services/api_service.dart +++ b/lib/core/services/api_service.dart @@ -4,6 +4,8 @@ import 'dart:io'; import 'package:satu/core/base/base_service.dart'; import 'package:http/http.dart' as http; import 'package:satu/core/models/auth/auth_response.dart'; +import 'package:satu/core/models/flow/sell_request.dart'; +import 'package:satu/core/models/flow/sell_response.dart'; import 'package:satu/core/models/response.dart'; /// The service responsible for networking requests @@ -16,10 +18,11 @@ class ApiService extends BaseService { //TOKEN String? token; - Future _get(String point, {Map? requestBody, Map? header}) async { + Future _get(String point, + {Map? requestBody, Map? header}) async { final Map headers = { - HttpHeaders.contentTypeHeader: "application/json", - HttpHeaders.cacheControlHeader: "no-cache" + HttpHeaders.contentTypeHeader: 'application/json', + HttpHeaders.cacheControlHeader: 'no-cache' }; if (header != null && header.isNotEmpty) { headers.addAll(header); @@ -29,31 +32,36 @@ class ApiService extends BaseService { return response.body; } - Future _post(String point, {Map? requestBody, Map? header}) async { + Future _post(String point, + {Map? requestBody, Map? header}) async { final Map headers = { - HttpHeaders.contentTypeHeader: "application/json", - HttpHeaders.cacheControlHeader: "no-cache" + HttpHeaders.contentTypeHeader: 'application/json', + HttpHeaders.cacheControlHeader: 'no-cache' }; if (header != null && header.isNotEmpty) { headers.addAll(header); } final String url = '$endpoint$point'; - if(requestBody!=null) { + if (requestBody != null) { log.i(jsonEncode(requestBody)); } - final response = await http.post(Uri.https(host, url), body: jsonEncode(requestBody), headers: headers); + final response = await http.post(Uri.https(host, url), + body: jsonEncode(requestBody), headers: headers); return response.body; } Future login(String username, String password) async { - final Map requestBody = {'username': username, 'password': password}; + final Map requestBody = { + 'username': username, + 'password': password + }; AuthResponse result; try { final String response = await _post('/login', requestBody: requestBody); result = AuthResponse.fromMap(json.decode(response)); } catch (e, stack) { - log.e("login", e, stack); + log.e('login', e, stack); result = AuthResponse() ..message = 'Ошибка вызова сервера' ..operation = false; @@ -65,10 +73,11 @@ class ApiService extends BaseService { final Map requestBody = {'token': token}; AuthResponse result; try { - final String response = await _post('/authorization', requestBody: requestBody); + final String response = + await _post('/authorization', requestBody: requestBody); result = AuthResponse.fromMap(json.decode(response)); } catch (e, stack) { - log.e("authorization", e, stack); + log.e('authorization', e, stack); result = AuthResponse() ..message = 'Ошибка вызова сервера' ..operation = false; @@ -77,13 +86,15 @@ class ApiService extends BaseService { } Future auth(String token) async { - final Map headers = {HttpHeaders.authorizationHeader: 'Bearer $token'}; + final Map headers = { + HttpHeaders.authorizationHeader: 'Bearer $token' + }; AuthResponse result; try { final String response = await _post('/auth', header: headers); result = AuthResponse.fromMap(json.decode(response)); } catch (e, stack) { - log.e("auth", e, stack); + log.e('auth', e, stack); result = AuthResponse() ..message = 'Ошибка вызова сервера' ..operation = false; @@ -92,13 +103,15 @@ class ApiService extends BaseService { } Future logout() async { - final Map headers = {HttpHeaders.authorizationHeader: 'Bearer $token'}; + final Map headers = { + HttpHeaders.authorizationHeader: 'Bearer $token' + }; AuthResponse result; try { final String response = await _post('/logout', header: headers); result = AuthResponse.fromMap(json.decode(response)); } catch (e, stack) { - log.e("auth", e, stack); + log.e('auth', e, stack); result = AuthResponse() ..message = 'Ошибка вызова сервера' ..operation = false; @@ -109,13 +122,34 @@ class ApiService extends BaseService { Future dictionaries(String target) async { Response result; try { - final Map headers = {HttpHeaders.authorizationHeader: 'Bearer $token'}; + final Map headers = { + HttpHeaders.authorizationHeader: 'Bearer $token' + }; final String response = await _post(target, header: headers); result = Response.fromMapList(json.decode(response), null); } catch (e, stack) { - log.e("dictionaries", e, stack); - result = Response()..operation=false..list=[]; + log.e('dictionaries', e, stack); + result = Response() + ..operation = false + ..list = []; } return result; } + + Future sell(SellRequest request) async { + SellResponse response; + try { + final Map headers = { + HttpHeaders.authorizationHeader: 'Bearer $token' + }; + final String responseBody = await _post('/sell', header: headers, requestBody: request.toJson()); + response = SellResponse.fromMap(json.decode(responseBody)); + } catch (e, stack) { + log.e('dictionaries', e, stack); + response = SellResponse() + ..operation = false + ..message = e.toString(); + } + return response; + } } diff --git a/lib/core/services/data_service.dart b/lib/core/services/data_service.dart index e75e7b3..f10b0f8 100644 --- a/lib/core/services/data_service.dart +++ b/lib/core/services/data_service.dart @@ -2,19 +2,61 @@ import 'package:flutter/material.dart'; import 'package:satu/core/base/base_service.dart'; +import 'package:satu/core/entity/transaction_entity.dart'; +import 'package:satu/core/models/flow/items_bean.dart'; +import 'package:satu/core/models/flow/operator_bean.dart'; +import 'package:satu/core/models/flow/product_dao.dart'; +import 'package:satu/core/models/flow/sell_request.dart'; +import 'package:satu/core/models/flow/sell_response.dart'; +import 'package:satu/core/models/flow/transaction_state.dart'; +import 'package:satu/core/redux/state/sell_state.dart'; +import 'package:satu/core/redux/store.dart'; import 'package:satu/core/utils/locator.dart'; import 'api_service.dart'; import 'db_service.dart'; +import 'dialog_service.dart'; class DataService extends BaseService { final ApiService _api = locator(); final DbService _db = locator(); + final DialogService _dialogService = locator(); - Future sellBtnHandler() async { + + Future sellBtnHandler({double card = 0, double nal = 0}) async { + final SellRequest request = SellRequest(); + final SellState sellState = Redux.store!.state.sellState!; + final TransactionState transactionState = sellState.transactionState!; + final List items = sellState.items!; + for(final ProductDao item in items){ + request.items.add(_productToItemBean(item)); + } + request.card = card; + request.nal = nal; + request.invoiceId = transactionState.uuid; + request.section = 'section'; + request.contragent = 'contragent'; + final OperatorBean operator = OperatorBean()..name='operator'..code=1; + request.operator = operator; + SellResponse response = await _api.sell(request); + final String msg = '${response.operation} - ${response.message}'; + log.w(response.toJson()); + _dialogService.showDialog(description: msg); return true; } + + + ItemBean _productToItemBean(ProductDao product) { + final ItemBean item = ItemBean() + ..id = product.id + ..price = product.price + ..cnt = product.count + ..name = product.productName + ..excise = product.excise + ..articul = product.article?.toString(); + return item; + } } diff --git a/lib/views/work/views/payment/payment_view.dart b/lib/views/work/views/payment/payment_view.dart index 9c7fdc9..846da95 100644 --- a/lib/views/work/views/payment/payment_view.dart +++ b/lib/views/work/views/payment/payment_view.dart @@ -3,9 +3,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:satu/core/redux/state/sell_state.dart'; import 'package:satu/core/redux/store.dart'; +import 'package:satu/core/utils/locator.dart'; import 'package:satu/core/utils/utils_parse.dart'; import 'package:satu/shared/app_colors.dart'; -import 'package:satu/views/dictionaries/category/category_view.dart'; +import 'package:satu/core/services/data_service.dart'; import 'package:satu/views/work/views/payment/component/combine_dock.dart'; import 'package:satu/widgets/bar/products_app_bar.dart'; import 'package:satu/widgets/bar/products_header_bar.dart'; @@ -22,12 +23,16 @@ class PaymentView extends StatefulWidget { } class _PaymentViewState extends State { + DataService _dataService = locator(); + bool combine = true; late double _sum; double _bankSum = 0; double _cashSum = 0; bool isCard = false; + bool loading = false; + late TextEditingController _bankSumCtrl; late TextEditingController _cashSumCtrl; @@ -42,24 +47,24 @@ class _PaymentViewState extends State { _bankSumCtrl = TextEditingController(text: formatDecimal(_bankSum)); _cashSumCtrl = TextEditingController(text: formatDecimal(_cashSum)); _bankSumCtrl.addListener(() { - if( _bankSumCtrl.text.isNotEmpty) { + if (_bankSumCtrl.text.isNotEmpty) { setState(() { _bankSum = parseNumeric(_bankSumCtrl.text); }); } else { setState(() { - _bankSum = 0 ; + _bankSum = 0; }); } }); _cashSumCtrl.addListener(() { - if( _cashSumCtrl.text.isNotEmpty) { + if (_cashSumCtrl.text.isNotEmpty) { setState(() { _cashSum = parseNumeric(_cashSumCtrl.text); }); } else { setState(() { - _cashSum = 0 ; + _cashSum = 0; }); } }); @@ -127,7 +132,19 @@ class _PaymentViewState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 45, vertical: 30), - child: BusyButton(title: 'ОПЛАТА', onPressed: () {}), + child: BusyButton( + title: 'ОПЛАТА', + busy: loading, + onPressed: () { + setState(() { + loading = true; + }); + _dataService.sellBtnHandler( + card: _bankSum, nal: _cashSum); + setState(() { + loading = false; + }); + }), ), ], ),