diff --git a/lib/core/models/close_day_data.dart b/lib/core/models/close_day_data.dart index 2f3437a..10fd148 100644 --- a/lib/core/models/close_day_data.dart +++ b/lib/core/models/close_day_data.dart @@ -1,6 +1,8 @@ import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; +import 'halyk/halyk_close_day_dao.dart'; + class CloseDayData { final String title; final num totalAmount; @@ -10,7 +12,7 @@ class CloseDayData { final num refundAmount; final int refundCount; - final List items; + final List items; CloseDayData({ this.title, this.items, @@ -28,7 +30,7 @@ class CloseDayData { paymentCount: json['paymentCount'], refundAmount: json['refundAmount'], refundCount: json['refundCount'], - items: (json['items'] as List).map((e) => TransactionItem.fromJson(e)).toList(), + items: (json['items'] as List).map((e) => TransactionBean.fromMap(e)).toList(), ); } Map toJson() => diff --git a/lib/core/models/halyk/halyk_close_day_dao.dart b/lib/core/models/halyk/halyk_close_day_dao.dart new file mode 100644 index 0000000..cc9a917 --- /dev/null +++ b/lib/core/models/halyk/halyk_close_day_dao.dart @@ -0,0 +1,182 @@ +/// result : {"code":"0","description":"Successfully completed"} +/// transactions : {"transaction":[{"type":"PAYMENT","instrument":"CARD","amount":"6000","terminalId":"123321","operationDay":"4","transactionNumber":"69","instrumentSpecificData":{"authorizationCode":"000000","rrn":"1234567890","cardholderName":"IVAN IVANOV","maskedPan":"123456******7890"}},{"type":"REFUND","instrument":"CARD","amount":"4500","terminalId":"123321","operationDay":"4","transactionNumber":"70","instrumentSpecificData":{"authorizationCode":"000000","rrn":"1234567890","cardholderName":"IVAN IVANOV","maskedPan":"123456******7890"},"parentTransaction":{"terminalId":"123321","operationDay":"4","transactionNumber":"69"}}]} +/// closeDayResults : {"reconciliationResult":[{"hostResultCode":"000","hostResultDescription":"Success","terminalExternalId":"example_terminal_id"}]} + +class HalykCloseDayDao { + ResultBean result; + TransactionsBean transactions; + CloseDayResultsBean closeDayResults; + + HalykCloseDayDao({ this.result, this.closeDayResults, this.transactions}); + + static HalykCloseDayDao fromMap(Map map) { + if (map == null) return null; + HalykCloseDayDao halykCloseDayDaoBean = HalykCloseDayDao(); + halykCloseDayDaoBean.result = ResultBean.fromMap(map['result']); + halykCloseDayDaoBean.transactions = TransactionsBean.fromMap(map['transactions']); + halykCloseDayDaoBean.closeDayResults = CloseDayResultsBean.fromMap(map['closeDayResults']); + return halykCloseDayDaoBean; + } + + Map toJson() => { + "result": result, + "transactions": transactions, + "closeDayResults": closeDayResults, + }; +} + +/// reconciliationResult : [{"hostResultCode":"000","hostResultDescription":"Success","terminalExternalId":"example_terminal_id"}] + +class CloseDayResultsBean { + List reconciliationResult; + + static CloseDayResultsBean fromMap(Map map) { + if (map == null) return null; + CloseDayResultsBean closeDayResultsBean = CloseDayResultsBean(); + closeDayResultsBean.reconciliationResult = List()..addAll( + (map['reconciliationResult'] as List ?? []).map((o) => ReconciliationResultBean.fromMap(o)) + ); + return closeDayResultsBean; + } + + Map toJson() => { + "reconciliationResult": reconciliationResult, + }; +} + +/// hostResultCode : "000" +/// hostResultDescription : "Success" +/// terminalExternalId : "example_terminal_id" + +class ReconciliationResultBean { + String hostResultCode; + String hostResultDescription; + String terminalExternalId; + + static ReconciliationResultBean fromMap(Map map) { + if (map == null) return null; + ReconciliationResultBean reconciliationResultBean = ReconciliationResultBean(); + reconciliationResultBean.hostResultCode = map['hostResultCode']; + reconciliationResultBean.hostResultDescription = map['hostResultDescription']; + reconciliationResultBean.terminalExternalId = map['terminalExternalId']; + return reconciliationResultBean; + } + + Map toJson() => { + "hostResultCode": hostResultCode, + "hostResultDescription": hostResultDescription, + "terminalExternalId": terminalExternalId, + }; +} + +/// transaction : [{"type":"PAYMENT","instrument":"CARD","amount":"6000","terminalId":"123321","operationDay":"4","transactionNumber":"69","instrumentSpecificData":{"authorizationCode":"000000","rrn":"1234567890","cardholderName":"IVAN IVANOV","maskedPan":"123456******7890"}},{"type":"REFUND","instrument":"CARD","amount":"4500","terminalId":"123321","operationDay":"4","transactionNumber":"70","instrumentSpecificData":{"authorizationCode":"000000","rrn":"1234567890","cardholderName":"IVAN IVANOV","maskedPan":"123456******7890"},"parentTransaction":{"terminalId":"123321","operationDay":"4","transactionNumber":"69"}}] + +class TransactionsBean { + List transaction; + + static TransactionsBean fromMap(Map map) { + if (map == null) return null; + TransactionsBean transactionsBean = TransactionsBean(); + transactionsBean.transaction = List()..addAll( + (map['transaction'] as List ?? []).map((o) => TransactionBean.fromMap(o)) + ); + return transactionsBean; + } + + Map toJson() => { + "transaction": transaction, + }; +} + +/// type : "PAYMENT" +/// instrument : "CARD" +/// amount : "6000" +/// terminalId : "123321" +/// operationDay : "4" +/// transactionNumber : "69" +/// instrumentSpecificData : {"authorizationCode":"000000","rrn":"1234567890","cardholderName":"IVAN IVANOV","maskedPan":"123456******7890"} + +class TransactionBean { + String type; + String instrument; + num amount; + int terminalId; + int operationDay; + int transactionNumber; + InstrumentSpecificDataBean instrumentSpecificData; + + static TransactionBean fromMap(Map map) { + if (map == null) return null; + TransactionBean transactionBean = TransactionBean(); + transactionBean.type = map['type']; + transactionBean.instrument = map['instrument']; + transactionBean.amount = map['amount']; + transactionBean.terminalId = map['terminalId']; + transactionBean.operationDay = map['operationDay']; + transactionBean.transactionNumber = map['transactionNumber']; + transactionBean.instrumentSpecificData = InstrumentSpecificDataBean.fromMap(map['instrumentSpecificData']); + return transactionBean; + } + + Map toJson() => { + "type": type, + "instrument": instrument, + "amount": amount, + "terminalId": terminalId, + "operationDay": operationDay, + "transactionNumber": transactionNumber, + "instrumentSpecificData": instrumentSpecificData, + }; +} + +/// authorizationCode : "000000" +/// rrn : "1234567890" +/// cardholderName : "IVAN IVANOV" +/// maskedPan : "123456******7890" + +class InstrumentSpecificDataBean { + String authorizationCode; + String rrn; + String cardholderName; + String maskedPan; + + static InstrumentSpecificDataBean fromMap(Map map) { + if (map == null) return null; + InstrumentSpecificDataBean instrumentSpecificDataBean = InstrumentSpecificDataBean(); + instrumentSpecificDataBean.authorizationCode = map['authorizationCode']; + instrumentSpecificDataBean.rrn = map['rrn']; + instrumentSpecificDataBean.cardholderName = map['cardholderName']; + instrumentSpecificDataBean.maskedPan = map['maskedPan']; + return instrumentSpecificDataBean; + } + + Map toJson() => { + "authorizationCode": authorizationCode, + "rrn": rrn, + "cardholderName": cardholderName, + "maskedPan": maskedPan, + }; +} + +/// code : "0" +/// description : "Successfully completed" + +class ResultBean { + int code; + String description; + + ResultBean({this.code, this.description}); + + static ResultBean fromMap(Map map) { + if (map == null) return null; + ResultBean resultBean = ResultBean(); + resultBean.code = map['code']; + resultBean.description = map['description']; + return resultBean; + } + + Map toJson() => { + "code": code, + "description": description, + }; +} \ No newline at end of file diff --git a/lib/core/models/halyk_post_session.dart b/lib/core/models/halyk/halyk_post_session.dart similarity index 100% rename from lib/core/models/halyk_post_session.dart rename to lib/core/models/halyk/halyk_post_session.dart diff --git a/lib/core/models/halyk_response_dao.dart b/lib/core/models/halyk/halyk_response_dao.dart similarity index 100% rename from lib/core/models/halyk_response_dao.dart rename to lib/core/models/halyk/halyk_response_dao.dart diff --git a/lib/core/services/ApiService.dart b/lib/core/services/ApiService.dart index 1401908..8afbea2 100644 --- a/lib/core/services/ApiService.dart +++ b/lib/core/services/ApiService.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:aman_kassa_flutter/core/base/base_service.dart'; -import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart'; import 'package:aman_kassa_flutter/redux/state/user_state.dart'; import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/views/login/login_view.dart'; diff --git a/lib/core/services/BankService.dart b/lib/core/services/BankService.dart index 0ece79d..01a96d0 100644 --- a/lib/core/services/BankService.dart +++ b/lib/core/services/BankService.dart @@ -1,9 +1,10 @@ import 'dart:convert'; import 'package:aman_kassa_flutter/core/base/base_service.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; -import 'file:///D:/Work/serik/Flutter/aman-kassa-flutter/lib/core/models/halyk_response_dao.dart'; import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; -import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart' as Cd; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_response_dao.dart'; import 'package:aman_kassa_flutter/core/models/transaction_item.dart'; import 'package:aman_kassa_flutter/core/services/ApiService.dart'; import 'package:flutter/services.dart'; @@ -42,14 +43,15 @@ class BankService extends BaseService { - Future closeDay({ String token}) async { + Future closeDay({ String token}) async { try { String response = await _channel.invokeMethod("closeDay", {'token': token }); - HalykResponse dao = HalykResponse.fromMap(json.decode(response)); + log.i(response); + Cd.HalykCloseDayDao dao = Cd.HalykCloseDayDao.fromMap(json.decode(response)); return dao; } catch (e, stack) { log.e("BankService", e, stack); - return new HalykResponse(result: ResultBean(description: 'Ошибка при закрытии дня', code: -1)); + return new Cd.HalykCloseDayDao(result: Cd.ResultBean(description: 'Ошибка при закрытии дня', code: -1)); } } @@ -81,11 +83,11 @@ class BankService extends BaseService { } - CloseDayData closeDayDataConvert(dynamic rows) { + CloseDayData closeDayDataConvert(Cd.TransactionsBean transactions) { 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(); + List items = transactions.transaction; num totalAmount = 0; int totalCount = 0; num paymentAmount = 0; @@ -93,12 +95,12 @@ class BankService extends BaseService { num refundAmount = 0; int refundCount = 0; - for(TransactionItem item in items) { - if(item.transactionType == 'PAYMENT') { + for(Cd.TransactionBean item in items) { + if(item.type == 'PAYMENT') { paymentCount++; paymentAmount += ( item.amount / 100 ); totalAmount += ( item.amount / 100 ); - } else if(item.transactionType == 'REFUND') { + } else if(item.type == 'REFUND') { refundCount++; refundAmount += ( item.amount / 100 ); totalAmount -= ( item.amount / 100 ); diff --git a/lib/redux/actions/bank_actions.dart b/lib/redux/actions/bank_actions.dart index 705bc4f..ae56de3 100644 --- a/lib/redux/actions/bank_actions.dart +++ b/lib/redux/actions/bank_actions.dart @@ -1,5 +1,5 @@ -import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart'; +import 'file:///D:/Work/serik/Flutter/aman-kassa-flutter/lib/core/models/halyk/halyk_post_session.dart'; import 'package:aman_kassa_flutter/redux/state/bank_state.dart'; import 'package:meta/meta.dart'; import 'package:redux/redux.dart'; diff --git a/lib/redux/state/bank_state.dart b/lib/redux/state/bank_state.dart index ad8ad3d..072e0f1 100644 --- a/lib/redux/state/bank_state.dart +++ b/lib/redux/state/bank_state.dart @@ -1,4 +1,4 @@ -import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart'; +import 'file:///D:/Work/serik/Flutter/aman-kassa-flutter/lib/core/models/halyk/halyk_post_session.dart'; import 'package:aman_kassa_flutter/redux/constants/setting_const.dart'; import 'package:meta/meta.dart'; diff --git a/lib/views/close_day_view/close_day_show_container.dart b/lib/views/close_day_view/close_day_show_container.dart index c68998b..3aa1c32 100644 --- a/lib/views/close_day_view/close_day_show_container.dart +++ b/lib/views/close_day_view/close_day_show_container.dart @@ -1,4 +1,5 @@ import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.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'; @@ -54,13 +55,15 @@ class CloseDayShowContainer extends StatelessWidget { return Divider(); }, itemBuilder: (BuildContext context, int index) { - TransactionItem item = data.items.elementAt(index); + TransactionBean item = data.items.elementAt(index); return ListTile( - title: Text(item.cardNumber), + title: Text(item.instrumentSpecificData.maskedPan), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(dateFormat.format(item.date)), + if(item.instrumentSpecificData.cardholderName!=null) + Text(item.instrumentSpecificData.cardholderName), + Text('Операционный день № ${item.operationDay?.toString()}'), ], ), trailing: Text('${item.amount / 100} T'), diff --git a/lib/views/home/tabs/AdditionalTab.dart b/lib/views/home/tabs/AdditionalTab.dart index 005ac63..42e6cb8 100644 --- a/lib/views/home/tabs/AdditionalTab.dart +++ b/lib/views/home/tabs/AdditionalTab.dart @@ -4,7 +4,8 @@ import 'package:aman_kassa_flutter/core/entity/Voucher.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/models/close_day_data.dart'; -import 'package:aman_kassa_flutter/core/models/halyk_response_dao.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart'; +import 'file:///D:/Work/serik/Flutter/aman-kassa-flutter/lib/core/models/halyk/halyk_response_dao.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'; @@ -235,8 +236,8 @@ class _AdditionalTabState extends State { } - HalykResponse closeDayDao = (await closeDayHalykPos()) as HalykResponse; - + HalykCloseDayDao closeDayDao = await closeDayHalykPos(); + log.i(closeDayDao.toJson()); if (closeDayDao.result.code != 0) { if (closeDayDao.result.description != null) { _dialog.showDialog(description: closeDayDao.result.description); @@ -247,24 +248,24 @@ class _AdditionalTabState extends State { return; } - // - // 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); + + CloseDayData closeDayData = _bankService.closeDayDataConvert(closeDayDao.transactions); + + 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/halyk_pos_service.dart b/lib/views/payment/halyk_pos_service.dart index 4e36c0b..b70d904 100644 --- a/lib/views/payment/halyk_pos_service.dart +++ b/lib/views/payment/halyk_pos_service.dart @@ -1,6 +1,7 @@ import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/logger.dart'; -import 'file:///D:/Work/serik/Flutter/aman-kassa-flutter/lib/core/models/halyk_response_dao.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart' as Cd; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_response_dao.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'; @@ -8,7 +9,7 @@ import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:logger/logger.dart'; import '../../core/models/aman_dao.dart'; import '../../core/models/card_data.dart'; -import '../../core/models/halyk_post_session.dart'; +import '../../core/models/halyk/halyk_post_session.dart'; import '../../core/services/BankService.dart'; import '../../redux/state/bank_state.dart'; @@ -72,7 +73,7 @@ Future> refundHalykPos(CardData refundData, double total) asyn return AmanDao(msg: response.result.description, success: false); } -Future closeDayHalykPos() async { +Future closeDayHalykPos() async { //Авторизация String token = Redux.store.state.userState.user.token; BankState bankState = Redux.store.state.bankState; @@ -80,10 +81,10 @@ Future closeDayHalykPos() async { HalykPosSession session = await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password); if (session.token == null) { - return new HalykResponse(result: ResultBean(description: 'Отказано в доступе к API банка', code: -1)); + return new Cd.HalykCloseDayDao(result: Cd.ResultBean(description: 'Отказано в доступе к API банка', code: -1)); } //Инициализация - HalykResponse response = await _bankService.closeDay(token: session.token); + Cd.HalykCloseDayDao response = await _bankService.closeDay(token: session.token); return response; } diff --git a/lib/views/payment_nfc/payment_nfc_view.dart b/lib/views/payment_nfc/payment_nfc_view.dart index 6989187..d95c9b0 100644 --- a/lib/views/payment_nfc/payment_nfc_view.dart +++ b/lib/views/payment_nfc/payment_nfc_view.dart @@ -8,7 +8,7 @@ import 'package:aman_kassa_flutter/core/models/calc_model.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/check_image_modal.dart'; -import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart'; +import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart'; import 'package:aman_kassa_flutter/core/models/product_dao.dart'; import 'package:aman_kassa_flutter/core/models/response.dart'; import 'package:aman_kassa_flutter/core/route_names.dart';