From b31e685af0d4561ae7d6f7538e24f5d41a0e4895 Mon Sep 17 00:00:00 2001 From: suvaissov Date: Thu, 14 Jan 2021 22:10:53 +0600 Subject: [PATCH] - halykpos logo - save pos close day report --- .../handler/CardRefundAmanHandlerImpl.java | 24 +++--- .../kassa/handler/CloseDayHandlerImpl.java | 21 ++++- .../com/aman/kassa/model/TransactionDao.java | 60 ++++++++++++++ assets/images/halykpos.png | Bin 0 -> 41638 bytes lib/core/entity/Voucher.dart | 1 + lib/core/foo_test.dart | 22 +++++ lib/core/models/aman_dao.dart | 7 +- lib/core/models/close_day_data.dart | 45 ++++++++++ lib/core/models/transaction_item.dart | 31 +++++++ lib/core/route_names.dart | 1 + lib/core/router.dart | 8 ++ lib/core/services/BankService.dart | 37 +++++++++ lib/views/bank_setting/bank_setting_view.dart | 2 +- .../close_day_show_container.dart | 77 ++++++++++++++++++ lib/views/history/history_view.dart | 30 +++++-- lib/views/home/components/popup_menu.dart | 2 +- lib/views/home/tabs/AdditionalTab.dart | 19 ++++- lib/views/payment/payment_view.dart | 69 +++++++++------- lib/views/payment_nfc/widgets/phone_view.dart | 42 +++++++++- 19 files changed, 441 insertions(+), 57 deletions(-) create mode 100644 android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java create mode 100644 assets/images/halykpos.png create mode 100644 lib/core/foo_test.dart create mode 100644 lib/core/models/close_day_data.dart create mode 100644 lib/core/models/transaction_item.dart create mode 100644 lib/views/close_day_view/close_day_show_container.dart diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java index 1b3a975..913b9b6 100644 --- a/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java @@ -339,18 +339,18 @@ public class CardRefundAmanHandlerImpl implements EasyCardRefundCallbackHandler< if(this.authorizationCode.equalsIgnoreCase(transaction.getAuthorizationCode()) && transactionNumber.equals(transaction.getTransactionNumber()) && transaction.getTransactionType().equalsIgnoreCase("PAYMENT")) { - System.out.println("getCheck:"+ transaction.getCheck()); - System.out.println("getCheckNumber:"+ transaction.getCheckNumber()); - System.out.println("getAmount:"+ transaction.getAmount()); - System.out.println("getCardHolderName:"+ transaction.getCardHolderName()); - System.out.println("getCardType:"+ transaction.getCardType()); - System.out.println("getPrinterCheckNumber:"+ transaction.getPrinterCheckNumber()); - System.out.println("getTransactionNumber:"+ transaction.getTransactionNumber()); - System.out.println("getAdditionalAuthorizationCode:"+ transaction.getAdditionalAuthorizationCode()); - System.out.println("getAuthorizationCode:"+ transaction.getAuthorizationCode()); - System.out.println("getCardExpiryDate:"+ transaction.getCardExpiryDate()); - System.out.println("getTransactionType:"+ transaction.getTransactionType()); - System.out.println("getTransactionDate:"+ transaction.getTransactionDate()); +// System.out.println("getCheck:"+ transaction.getCheck()); +// System.out.println("getCheckNumber:"+ transaction.getCheckNumber()); +// System.out.println("getAmount:"+ transaction.getAmount()); +// System.out.println("getCardHolderName:"+ transaction.getCardHolderName()); +// System.out.println("getCardType:"+ transaction.getCardType()); +// System.out.println("getPrinterCheckNumber:"+ transaction.getPrinterCheckNumber()); +// System.out.println("getTransactionNumber:"+ transaction.getTransactionNumber()); +// System.out.println("getAdditionalAuthorizationCode:"+ transaction.getAdditionalAuthorizationCode()); +// System.out.println("getAuthorizationCode:"+ transaction.getAuthorizationCode()); +// System.out.println("getCardExpiryDate:"+ transaction.getCardExpiryDate()); +// System.out.println("getTransactionType:"+ transaction.getTransactionType()); +// System.out.println("getTransactionDate:"+ transaction.getTransactionDate()); this.transaction = transaction; break; } diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java index 53b490a..c783699 100644 --- a/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java @@ -4,11 +4,14 @@ import android.widget.Toast; import com.google.gson.Gson; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.List; import io.flutter.plugin.common.MethodChannel; import kz.com.aman.kassa.bank.M4BankActivity; import kz.com.aman.kassa.model.AmanDao; +import kz.com.aman.kassa.model.TransactionDao; import kz.com.aman.kassa.plugins.BankNfcPlugins; import ru.m4bank.mpos.library.external.transactions.CloseDayCallbackHandler; import ru.m4bank.mpos.service.commons.data.ResultType; @@ -24,6 +27,7 @@ public class CloseDayHandlerImpl implements CloseDayCallbackHandler { private final BankNfcPlugins plugin; private final MethodChannel.Result result; private final Gson gson = new Gson(); + final SimpleDateFormat sdfDart = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public CloseDayHandlerImpl(BankNfcPlugins plugin, MethodChannel.Result result) { this.plugin = plugin; @@ -54,10 +58,21 @@ public class CloseDayHandlerImpl implements CloseDayCallbackHandler { @Override public void onTransactionsListReceived(List transactionList, List list1) { plugin.getActivity().runOnUiThread(() -> { - AmanDao dao = new AmanDao<>(); + AmanDao dao = new AmanDao<>(); dao.setSuccess(true); + dao.setMsg("list"); + for(Transaction transaction: transactionList){ + TransactionDao transactionDao = new TransactionDao(); + transactionDao.setAmount(transaction.getAmount()); + transactionDao.setCardExpireDate(transaction.getCardExpiryDate()); + transactionDao.setCardNumber(transaction.getMaskedPan()); + transactionDao.setCardType(transaction.getCardType()); + transactionDao.setTransactionType(transaction.getTransactionType()); + transactionDao.setDate(sdfDart.format(transaction.getDate())); + dao.getRows().add(transactionDao); + } this.result.success(gson.toJson(dao)); - Toast.makeText(plugin.getActivity(), "На закрытие дня: - " + transactionList, Toast.LENGTH_SHORT).show(); + // Toast.makeText(plugin.getActivity(), "На закрытие дня: - " + transactionList, Toast.LENGTH_SHORT).show(); }); } @@ -66,7 +81,7 @@ public class CloseDayHandlerImpl implements CloseDayCallbackHandler { plugin.getActivity().runOnUiThread(() -> { AmanDao dao = new AmanDao<>(); dao.setSuccess(ResultType.SUCCESSFUL.equals(closeDayResult.getResultType())); - dao.setMsg((closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription())); + dao.setMsg((closeDayResult.getDescription() == null ? "null" : closeDayResult.getDescription())); this.result.success(gson.toJson(dao)); Toast.makeText(plugin.getActivity(), closeDayResult.getResultType() + " " + (closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription()), Toast.LENGTH_SHORT) .show(); diff --git a/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java b/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java new file mode 100644 index 0000000..5ed9b3e --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/model/TransactionDao.java @@ -0,0 +1,60 @@ +package kz.com.aman.kassa.model; + +import java.sql.Timestamp; + +public class TransactionDao { + String cardType; + String cardExpireDate; + String cardNumber; + String transactionType; + Long amount; + String date; + + public void setDate(String date) { + this.date = date; + } + + public String getDate() { + return date; + } + + public String getCardType() { + return cardType; + } + + public void setCardType(String cardType) { + this.cardType = cardType; + } + + public String getCardExpireDate() { + return cardExpireDate; + } + + public void setCardExpireDate(String cardExpireDate) { + this.cardExpireDate = cardExpireDate; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } +} diff --git a/assets/images/halykpos.png b/assets/images/halykpos.png new file mode 100644 index 0000000000000000000000000000000000000000..40b13b43ce21a68192fe4aa30a24e8602ae6aebe GIT binary patch literal 41638 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 literal 0 HcmV?d00001 diff --git a/lib/core/entity/Voucher.dart b/lib/core/entity/Voucher.dart index 8b6740a..3540b1c 100644 --- a/lib/core/entity/Voucher.dart +++ b/lib/core/entity/Voucher.dart @@ -14,6 +14,7 @@ const String Voucher_columnUrl = 'url'; const String VoucherTypePayment = 'payment'; const String VoucherTypeReturnPay = 'returnPay'; const String VoucherTypeReport = 'report'; +const String VoucherTypeCloseDayPosReport = 'closeDayPosReport'; class Voucher { int id; diff --git a/lib/core/foo_test.dart b/lib/core/foo_test.dart new file mode 100644 index 0000000..ce37072 --- /dev/null +++ b/lib/core/foo_test.dart @@ -0,0 +1,22 @@ +import 'dart:convert'; + +import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; + +void main() { + var date = "2021-01-14T12:15:34.511Z"; + + String text = '{'+ + '"amount": 5500,'+ + '"cardExpireDate": "09/22",'+ + '"cardNumber": "400303******6254",'+ + '"cardType": "VISA",'+ + '"date": "2021-01-14 12:22:09",'+ + '"transactionType": "PAYMENT"'+ + '}'; + + print(text); + dynamic data = json.decode(text); + TransactionItem item = TransactionItem.fromJson(data); + + print(item.date); +} \ No newline at end of file diff --git a/lib/core/models/aman_dao.dart b/lib/core/models/aman_dao.dart index a8812ac..7581b24 100644 --- a/lib/core/models/aman_dao.dart +++ b/lib/core/models/aman_dao.dart @@ -1,16 +1,17 @@ class AmanDao { final T data; - //final List rows; + final dynamic rows; final String msg; final bool success; - AmanDao({this.data, this.success, this.msg}); + AmanDao({this.data, this.success, this.msg, this.rows}); factory AmanDao.fromJson(Map data) { return AmanDao( data: data['data'], msg: data['msg'], - success: data['success']); + success: data['success'], + rows: data['rows']); } } diff --git a/lib/core/models/close_day_data.dart b/lib/core/models/close_day_data.dart new file mode 100644 index 0000000..2f3437a --- /dev/null +++ b/lib/core/models/close_day_data.dart @@ -0,0 +1,45 @@ + +import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; + +class CloseDayData { + final String title; + final num totalAmount; + final int totalCount; + final num paymentAmount; + final int paymentCount; + final num refundAmount; + final int refundCount; + + final List items; + CloseDayData({ + this.title, + this.items, + this.totalAmount, this.totalCount, + this.paymentAmount, this.paymentCount, + this.refundAmount, this.refundCount + }); + + static CloseDayData fromJson(Map json) { + return CloseDayData( + title: json['title'], + totalAmount: json['totalAmount'], + totalCount: json['totalCount'], + paymentAmount: json['paymentAmount'], + paymentCount: json['paymentCount'], + refundAmount: json['refundAmount'], + refundCount: json['refundCount'], + items: (json['items'] as List).map((e) => TransactionItem.fromJson(e)).toList(), + ); + } + Map toJson() => + { + 'title': title, + 'totalAmount': totalAmount, + 'totalCount': totalCount, + 'paymentAmount': paymentAmount, + 'paymentCount': paymentCount, + 'refundAmount': refundAmount, + 'refundCount': refundCount, + 'items': items.map((e) => e.toJson()).toList(), + }; +} \ No newline at end of file diff --git a/lib/core/models/transaction_item.dart b/lib/core/models/transaction_item.dart new file mode 100644 index 0000000..7744ca2 --- /dev/null +++ b/lib/core/models/transaction_item.dart @@ -0,0 +1,31 @@ +class TransactionItem { + final String cardType; + final String cardExpireDate; + final String cardNumber; + final String transactionType; + final num amount; + final DateTime date; + TransactionItem({this.cardType, this.cardExpireDate, this.cardNumber, this.transactionType, this.amount, this.date}); + + static TransactionItem fromJson(Map json) { + return TransactionItem( + cardType: json['cardType'], + cardExpireDate: json['cardExpireDate'], + cardNumber: json['cardNumber'], + transactionType: json['transactionType'], + amount: json['amount'], + date: json['date'] != null + ? DateTime.parse(json['date']) + : null, + ); + } + Map toJson() => + { + 'cardType': cardType, + 'cardExpireDate': cardExpireDate, + 'cardNumber': cardNumber, + 'transactionType': transactionType, + 'amount': amount, + 'date' : date !=null ? date.toString() : null, + }; +} \ No newline at end of file diff --git a/lib/core/route_names.dart b/lib/core/route_names.dart index 05777c6..dd2469b 100644 --- a/lib/core/route_names.dart +++ b/lib/core/route_names.dart @@ -1,6 +1,7 @@ const String LoginViewRoute = "LoginView"; const String HomeViewRoute = "HomeView"; const String ImageShowRoute = "ImageShowRoute"; +const String CloseDayShowRoute = "CloseDayShowRoute"; const String PaymentViewRoute = "PaymentView"; const String PaymentNfcViewRoute = "PaymentNfcViewRoute"; const String HistoryViewRoute = "HistoryView"; diff --git a/lib/core/router.dart b/lib/core/router.dart index 1a213ef..ba822a2 100644 --- a/lib/core/router.dart +++ b/lib/core/router.dart @@ -1,6 +1,8 @@ +import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; import 'package:aman_kassa_flutter/views/bank_setting/bank_setting_view.dart'; import 'package:aman_kassa_flutter/views/bank_view/bank_view.dart'; import 'package:aman_kassa_flutter/views/check/image_show_container.dart'; +import 'package:aman_kassa_flutter/views/close_day_view/close_day_show_container.dart'; import 'package:aman_kassa_flutter/views/history/history_view.dart'; import 'package:aman_kassa_flutter/views/info_kkm/info_kkm_view.dart'; import 'package:aman_kassa_flutter/views/payment/payment_view.dart'; @@ -72,6 +74,12 @@ Route generateRoute(RouteSettings settings) { routeName: settings.name, viewToShow: ImageShowContainer(data), ); + case CloseDayShowRoute: + CloseDayData data = settings.arguments as CloseDayData; + return _getPageRoute( + routeName: settings.name, + viewToShow: CloseDayShowContainer(data), + ); default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/core/services/BankService.dart b/lib/core/services/BankService.dart index 4c9982d..dea5551 100644 --- a/lib/core/services/BankService.dart +++ b/lib/core/services/BankService.dart @@ -1,7 +1,10 @@ import 'dart:convert'; import 'package:aman_kassa_flutter/core/base/base_service.dart'; import 'package:aman_kassa_flutter/core/models/aman_dao.dart'; +import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; +import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; class BankService extends BaseService { static const String _url = 'http://195.200.74.83:5000'; @@ -171,5 +174,39 @@ class BankService extends BaseService { } } + CloseDayData closeDayDataConvert(dynamic rows) { + final DateFormat formatter = DateFormat('dd.MM.yyyy'); + final DateTime now = DateTime.now(); + final String formatted = formatter.format(now); + List items = (rows as List).map((e) => TransactionItem.fromJson(e)).toList(); + num totalAmount = 0; + int totalCount = 0; + num paymentAmount = 0; + int paymentCount = 0; + num refundAmount = 0; + int refundCount = 0; + + for(TransactionItem item in items) { + if(item.transactionType == 'PAYMENT') { + paymentCount++; + paymentAmount += ( item.amount / 100 ); + totalAmount += ( item.amount / 100 ); + } else if(item.transactionType == 'REFUND') { + refundCount++; + refundAmount += ( item.amount / 100 ); + totalAmount -= ( item.amount / 100 ); + } + totalCount++; + } + + CloseDayData closeDayData = new CloseDayData( + items: items, + title: 'Отчет POS от $formatted', + totalAmount: totalAmount, totalCount: totalCount, + paymentAmount: paymentAmount, paymentCount: paymentCount, + refundAmount: refundAmount, refundCount: refundCount, + ); + return closeDayData; + } } diff --git a/lib/views/bank_setting/bank_setting_view.dart b/lib/views/bank_setting/bank_setting_view.dart index 034a744..f318196 100644 --- a/lib/views/bank_setting/bank_setting_view.dart +++ b/lib/views/bank_setting/bank_setting_view.dart @@ -63,7 +63,7 @@ class _BankSettingViewState extends State { return Scaffold( appBar: AppBar( centerTitle: true, - title: Text('Настройка Tap2Phone'), + title: Text('Настройка HalykPos'), ), body: SingleChildScrollView( child: Container( diff --git a/lib/views/close_day_view/close_day_show_container.dart b/lib/views/close_day_view/close_day_show_container.dart new file mode 100644 index 0000000..c68998b --- /dev/null +++ b/lib/views/close_day_view/close_day_show_container.dart @@ -0,0 +1,77 @@ +import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; +import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; +import 'package:aman_kassa_flutter/shared/shared_styles.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class CloseDayShowContainer extends StatelessWidget { + final CloseDayData data; + DateFormat dateFormat = DateFormat("dd.MM.yyyy HH:mm:ss"); + CloseDayShowContainer(this.data); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(data.title ?? 'Отчет: Закрытие дня POS'), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Общий итоги', style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.black, fontSize: 15) ), + Table( + children: [ + TableRow(children: [ + TableCell(child: Text('Оплат:', style: productTextStyle,)), + TableCell(child: Text('${data.paymentCount}', textAlign: TextAlign.center, style: productTextStyle)), + TableCell(child: Text('${data.paymentAmount} T', textAlign: TextAlign.end, style: productTextStyle)), + ]), + TableRow(children: [ + TableCell(child: Text('Возвратов:', style: productTextStyle,)), + TableCell(child: Text('${data.refundCount}', textAlign: TextAlign.center, style: productTextStyle)), + TableCell(child: Text('${data.refundAmount} T', textAlign: TextAlign.end, style: productTextStyle)), + ]), + TableRow(children: [ + TableCell(child: Text('Итого:', style: productTextStyle,)), + TableCell(child: Text('${data.totalCount}', textAlign: TextAlign.center, style: productTextStyle)), + TableCell(child: Text('${data.totalAmount} T', textAlign: TextAlign.end, style: productTextStyle)), + ]), + ], + ) + ], + ), + ), + Divider(), + Expanded( + child: ListView.separated( + itemCount: data.items.length, + separatorBuilder: (BuildContext context, int index) { + return Divider(); + }, + itemBuilder: (BuildContext context, int index) { + TransactionItem item = data.items.elementAt(index); + return ListTile( + title: Text(item.cardNumber), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(dateFormat.format(item.date)), + ], + ), + trailing: Text('${item.amount / 100} T'), + ); + }, + ), + ), + ], + ) + ); + } +} + + diff --git a/lib/views/history/history_view.dart b/lib/views/history/history_view.dart index ec7498f..7e5d6dd 100644 --- a/lib/views/history/history_view.dart +++ b/lib/views/history/history_view.dart @@ -4,6 +4,7 @@ import 'package:aman_kassa_flutter/core/entity/Voucher.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/models/card_data.dart'; import 'package:aman_kassa_flutter/core/models/check_data.dart'; +import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; import 'package:aman_kassa_flutter/core/route_names.dart'; import 'package:aman_kassa_flutter/core/services/DbService.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; @@ -66,18 +67,32 @@ class _HistoryViewState extends State { }, itemBuilder: (BuildContext context, int index) { Voucher voucher = data[index]; - CheckData checkData = CheckData.fromJson(json.decode(voucher.data)); - CardData cardData = checkData.cardData; + CardData cardData; + CloseDayData closeDayData; + if( voucher.type == VoucherTypeCloseDayPosReport ) { + closeDayData = CloseDayData.fromJson(json.decode(voucher.data)); + } else if( voucher.data !=null ) { + CheckData checkData = CheckData.fromJson(json.decode(voucher.data)); + cardData = checkData.cardData; + } + + return ListTile( onTap: () { - _navigatorService.push(ImageShowRoute, - arguments: ImageShowModel( + + if( voucher.type == VoucherTypeCloseDayPosReport ) { + _navigatorService.push(CloseDayShowRoute, + arguments: closeDayData); + } else { + _navigatorService.push(ImageShowRoute, + arguments: ImageShowModel( data: voucher.base64Data, title: voucher.name, url: voucher.url, cardData: cardData, voucher: voucher, - )); + )); + } }, title: buildText(voucher), subtitle: Column( @@ -98,6 +113,11 @@ class _HistoryViewState extends State { MdiIcons.backupRestore, size: 40, ) + : voucher.type == VoucherTypeCloseDayPosReport ? + Icon( + Icons.phonelink_lock_outlined, + size: 40, + ) : Icon( Icons.description, size: 40, diff --git a/lib/views/home/components/popup_menu.dart b/lib/views/home/components/popup_menu.dart index 75c89af..9b68189 100644 --- a/lib/views/home/components/popup_menu.dart +++ b/lib/views/home/components/popup_menu.dart @@ -33,7 +33,7 @@ class _PopupMenuState extends State { //if (version >= 24 ) // const Choice(title: 'Bank', icon: Icons.text_fields, command: 'bank'), if (version >= 24 ) - const Choice(title: 'Настройка Tap2Phone', icon: MdiIcons.nfc, command: 'tap2phone'), + const Choice(title: 'Настройка HalykPos', icon: Icons.phonelink_lock_outlined, command: 'tap2phone'), const Choice(title: 'Выйти', icon: Icons.exit_to_app, command: 'exit') ]; setState(() { diff --git a/lib/views/home/tabs/AdditionalTab.dart b/lib/views/home/tabs/AdditionalTab.dart index 9e4aa4e..45487b9 100644 --- a/lib/views/home/tabs/AdditionalTab.dart +++ b/lib/views/home/tabs/AdditionalTab.dart @@ -1,6 +1,9 @@ +import 'dart:convert'; + import 'package:aman_kassa_flutter/core/entity/Voucher.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/models/aman_dao.dart'; +import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; import 'package:aman_kassa_flutter/core/models/money.dart'; import 'package:aman_kassa_flutter/core/models/response.dart'; import 'package:aman_kassa_flutter/core/models/dialog_models.dart'; @@ -273,10 +276,24 @@ class _AdditionalTabState extends State { return; } - _dialog.showDialog(description: 'Закрытие дня: операция прошла успешно!'); + + CloseDayData closeDayData = _bankService.closeDayDataConvert(closeDayDao.rows); + + User user = Redux.store.state.userState.user; + _dataService.insertVoucher( + user: user, + name: closeDayData.title, + data: jsonEncode(closeDayData.toJson()), + total: closeDayData.totalAmount.toDouble(), + type: VoucherTypeCloseDayPosReport); + + // _dialog.showDialog(description: 'Закрытие дня: операция прошла успешно!'); setState(() { isClosePosBusy = false; }); + + _navigator.push(CloseDayShowRoute, + arguments: closeDayData); } @override diff --git a/lib/views/payment/payment_view.dart b/lib/views/payment/payment_view.dart index 21a9248..c4edfb0 100644 --- a/lib/views/payment/payment_view.dart +++ b/lib/views/payment/payment_view.dart @@ -187,7 +187,7 @@ class _PaymentViewState extends State { } Widget _nfsButtonRender() { - if(!isBankApiAccess){ + if(!isBankApiAccess || widget.model.operationType != OperationTypePay){ return Container(); } return StoreConnector( @@ -204,36 +204,47 @@ class _PaymentViewState extends State { splashColor: halykColor.withOpacity(0.4), borderRadius: BorderRadius.circular(10.0), highlightColor: halykColor.withOpacity(0.1), - child: Stack( - alignment: Alignment.center, - children: [ - Opacity( - opacity: 0.25, - child: Image.asset( - 'assets/images/halyk-bank.png', - fit: BoxFit.cover, + child: Container( + width: ScreenUtil().setSp(100.0), + padding: const EdgeInsets.symmetric(vertical: 8.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0) + ), + child: Column( + children: [ + Container( width: ScreenUtil().setSp(80.0), - height: ScreenUtil().setSp(90.0), + height: ScreenUtil().setSp(80.0), + margin: const EdgeInsets.only(bottom: 8.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.white), + borderRadius: BorderRadius.circular(10.0), + image: DecorationImage( + image: AssetImage('assets/images/halykpos.png'), fit: BoxFit.fitWidth + ), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), ), - ), - Container( - padding: const EdgeInsets.all(8.0), - decoration: BoxDecoration( - border: Border.all(color: halykColor), - borderRadius: BorderRadius.circular(10.0) - ), - child: Column( - children: [ - Icon( - MdiIcons.nfc, - color: halykColor, - size: ScreenUtil().setSp(60.0), - ), - Text('Tap2Phone',style: TextStyle(fontSize: ScreenUtil().setSp(10.0), color: halykColor, fontWeight: FontWeight.bold ),), - ], - ), - ), - ], + // Row( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Icon( + // MdiIcons.nfc, + // color: halykColor, + // size: ScreenUtil().setSp(20.0), + // ), + // Text('Tap2Phone',style: TextStyle(fontSize: ScreenUtil().setSp(10.0), color: halykColor, fontWeight: FontWeight.bold ),), + // ], + // ), + ], + ), ), ); } diff --git a/lib/views/payment_nfc/widgets/phone_view.dart b/lib/views/payment_nfc/widgets/phone_view.dart index 76e653c..fc42389 100644 --- a/lib/views/payment_nfc/widgets/phone_view.dart +++ b/lib/views/payment_nfc/widgets/phone_view.dart @@ -69,7 +69,26 @@ class _PhoneViewState extends State { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(MdiIcons.nfc, color: primaryColor,size: ScreenUtil().setSp(90.0),), + Container( + width: ScreenUtil().setSp(80.0), + height: ScreenUtil().setSp(80.0), + margin: const EdgeInsets.only(bottom: 8.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.white), + borderRadius: BorderRadius.circular(10.0), + image: DecorationImage( + image: AssetImage('assets/images/halykpos.png'), fit: BoxFit.fitWidth + ), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + ), verticalSpaceSmall, AutoSizeText('Ожидание карты', style: TextStyle(fontWeight: FontWeight.bold),) ], @@ -79,7 +98,26 @@ class _PhoneViewState extends State { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(MdiIcons.shieldSearch, color: yellowColor,size: ScreenUtil().setSp(90.0),), + Container( + width: ScreenUtil().setSp(80.0), + height: ScreenUtil().setSp(80.0), + margin: const EdgeInsets.only(bottom: 8.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.white), + borderRadius: BorderRadius.circular(10.0), + image: DecorationImage( + image: AssetImage('assets/images/halykpos.png'), fit: BoxFit.fitWidth + ), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + ), verticalSpaceSmall, AutoSizeText('Проверка', style: TextStyle(fontWeight: FontWeight.bold),) ],