From 33897977a82927ce0329361f46213da38a940227 Mon Sep 17 00:00:00 2001 From: suvaissov Date: Fri, 25 Jun 2021 14:09:21 +0600 Subject: [PATCH] halyk token decline response parse --- lib/core/models/halyk/halyk_post_session.dart | 58 ++++++- lib/core/services/ApiService.dart | 1 + lib/core/services/BankService.dart | 6 +- lib/views/check/image_show_container.dart | 19 ++- lib/views/payment/halyk_pos_service.dart | 150 +++++++++++------- lib/views/payment/payment_view.dart | 11 ++ 6 files changed, 184 insertions(+), 61 deletions(-) diff --git a/lib/core/models/halyk/halyk_post_session.dart b/lib/core/models/halyk/halyk_post_session.dart index 6554eb1..6ad3b2b 100644 --- a/lib/core/models/halyk/halyk_post_session.dart +++ b/lib/core/models/halyk/halyk_post_session.dart @@ -2,18 +2,74 @@ import 'package:intl/intl.dart'; class HalykPosSession { const HalykPosSession( - {this.login, this.token, this.serverTime, this.tokenTimeout}); + {this.login, + this.token, + this.serverTime, + this.tokenTimeout, + this.result}); final String login; final String token; final DateTime serverTime; final int tokenTimeout; + final ResultBean result; static HalykPosSession fromJson(Map data) => HalykPosSession( login: data['login'], token: data['token'], + result: ResultBean.fromMap(data['result']), serverTime: data['ServerTime'] != null ? new DateFormat("dd.MM.yyyy HH:mm:ss ZZZ").parse(data['ServerTime']) : null, tokenTimeout: data['TokenTimeout']); } + +/// ServerTime : "25.06.2021 13:18:00 GMT+06:00" +/// ResultCode : "040" +/// ResultStr : "Unknown operator login. Check the correctness of the data or contact support." +/// Response : {"Code":"040","Description":"Unknown operator login. Check the correctness of the data or contact support."} + +class ResultBean { + String ServerTime; + String ResultCode; + String ResultStr; + ResponseBean Response; + + static ResultBean fromMap(Map map) { + if (map == null) return null; + ResultBean resultBean = ResultBean(); + resultBean.ServerTime = map['ServerTime']; + resultBean.ResultCode = map['ResultCode']; + resultBean.ResultStr = map['ResultStr']; + resultBean.Response = ResponseBean.fromMap(map['Response']); + return resultBean; + } + + Map toJson() => { + "ServerTime": ServerTime, + "ResultCode": ResultCode, + "ResultStr": ResultStr, + "Response": Response, + }; +} + +/// Code : "040" +/// Description : "Unknown operator login. Check the correctness of the data or contact support." + +class ResponseBean { + String Code; + String Description; + + static ResponseBean fromMap(Map map) { + if (map == null) return null; + ResponseBean responseBean = ResponseBean(); + responseBean.Code = map['Code']; + responseBean.Description = map['Description']; + return responseBean; + } + + Map toJson() => { + "Code": Code, + "Description": Description, + }; +} diff --git a/lib/core/services/ApiService.dart b/lib/core/services/ApiService.dart index ae1a9bd..56b2ed8 100644 --- a/lib/core/services/ApiService.dart +++ b/lib/core/services/ApiService.dart @@ -74,6 +74,7 @@ class ApiService extends BaseService { Map requestBody = {'login': login, 'hash': hash}; var response = await requestFormData('/hb/pos/gettoken', requestBody, bodyEntry: true, posEndPoint: true, statusCheck: false); + print(response); return HalykPosSession.fromJson(jsonDecode(response)); } diff --git a/lib/core/services/BankService.dart b/lib/core/services/BankService.dart index 58e72ce..fbfac7b 100644 --- a/lib/core/services/BankService.dart +++ b/lib/core/services/BankService.dart @@ -3,7 +3,7 @@ import 'package:aman_kassa_flutter/core/base/base_service.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/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_post_session.dart' as Ps; 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'; @@ -31,8 +31,8 @@ class BankService extends BaseService { return int.parse(result) ?? 0; } - Future renewToken({String token, String login, String password}) async { - HalykPosSession result; + Future renewToken({String token, String login, String password}) async { + Ps.HalykPosSession result; try { result = await _api.halykPosToken(token, login, password); } catch (e, stack) { diff --git a/lib/views/check/image_show_container.dart b/lib/views/check/image_show_container.dart index 235453c..a60375d 100644 --- a/lib/views/check/image_show_container.dart +++ b/lib/views/check/image_show_container.dart @@ -205,7 +205,15 @@ class _MyFloatingActionButtonState extends State { color: whiteColor, ), onPressed: () async { - + var today = new DateTime.now(); + var yesterday = today.subtract(new Duration(days: 1)); + if( Redux.store.state.userState == null + || Redux.store.state.userState.smena == null + || Redux.store.state.userState.smena.startedAt == null + || yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) { + _dialog.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.'); + return; + } try { await Redux.store.dispatch(changePinSkipFromSetting(true)); AmanDao response = await reversalHalykPos(widget.data.cardData, widget.data.voucher.total); @@ -237,6 +245,15 @@ class _MyFloatingActionButtonState extends State { color: whiteColor, ), onPressed: () async { + var today = new DateTime.now(); + var yesterday = today.subtract(new Duration(days: 1)); + if( Redux.store.state.userState == null + || Redux.store.state.userState.smena == null + || Redux.store.state.userState.smena.startedAt == null + || yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) { + _dialog.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.'); + return; + } try { await Redux.store.dispatch(changePinSkipFromSetting(true)); diff --git a/lib/views/payment/halyk_pos_service.dart b/lib/views/payment/halyk_pos_service.dart index 7e32b40..0fbdb6f 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 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart' as Cd; +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'; @@ -24,80 +25,118 @@ Future> paymentHalykPos(double total) async { String token = Redux.store.state.userState.user.token; BankState bankState = Redux.store.state.bankState; //права доступа - HalykPosSession session = - await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password); + HalykPosSession session = await _bankService.renewToken( + token: token, login: bankState.login, password: bankState.password); if (session.token == null) { - return AmanDao(success: false, msg: 'Отказано в доступе к API банка'); + return sessionDeclineDao(session); } //Инициализация - HalykResponse response = await _bankService.pay(token: session.token, amount: total); + HalykResponse response = + await _bankService.pay(token: session.token, amount: total); if (response.result.code == 0) { CardData cardData = new CardData( - authorizationCode: response.transaction.instrumentSpecificData.authorizationCode, - cardholderName: response.transaction.instrumentSpecificData.cardholderName, - cardNumber: response.transaction.instrumentSpecificData.maskedPan, - operationDay: response.transaction.operationDay, - transactionNumber: response.transaction.transactionNumber, - terminalId: response.transaction.terminalId, - transactionType: 'payment' - ); - return AmanDao(msg: response.result.description, success: true, data: cardData); - } - return AmanDao(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false); -} - -Future> refundHalykPos(CardData refundData, double total) async { - //Авторизация - String token = Redux.store.state.userState.user.token; - BankState bankState = Redux.store.state.bankState; - //права доступа - HalykPosSession session = - await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password); - if (session.token == null) { - return AmanDao(success: false, msg: 'Отказано в доступе к API банка'); - } - HalykResponse response = await _bankService.refund(token: session.token, amount: total, operDay: refundData.operationDay, terminalId: refundData.terminalId, transNum: refundData.transactionNumber ); - if (response.result.code == 0) { - CardData cardData = new CardData( - authorizationCode: response.transaction.instrumentSpecificData.authorizationCode, - cardholderName: response.transaction.instrumentSpecificData.cardholderName, + authorizationCode: + response.transaction.instrumentSpecificData.authorizationCode, + cardholderName: + response.transaction.instrumentSpecificData.cardholderName, cardNumber: response.transaction.instrumentSpecificData.maskedPan, operationDay: response.transaction.operationDay, transactionNumber: response.transaction.transactionNumber, terminalId: response.transaction.terminalId, - transactionType: 'refund' - ); - return AmanDao(msg: response.result.description, success: true, data: cardData); + transactionType: 'payment'); + return AmanDao( + msg: response.result.description, success: true, data: cardData); } - return AmanDao(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false); + return AmanDao( + msg: response.result.errorData != null + ? response.result.errorData.description + : response.result.description, + success: false); } -Future> reversalHalykPos(CardData refundData, double total) async { +AmanDao sessionDeclineDao(HalykPosSession session) { + String msg = 'Отказано в доступе к API банка'; + if(session.result?.Response?.Description != null) { + msg = '${session.result.Response.Description} (${session.result.Response.Code}) '; + } + return AmanDao(success: false, msg: msg); +} + +Future> refundHalykPos( + CardData refundData, double total) async { //Авторизация String token = Redux.store.state.userState.user.token; BankState bankState = Redux.store.state.bankState; //права доступа - HalykPosSession session = - await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password); + HalykPosSession session = await _bankService.renewToken( + token: token, login: bankState.login, password: bankState.password); if (session.token == null) { - return AmanDao(success: false, msg: 'Отказано в доступе к API банка'); + return sessionDeclineDao(session); + } + HalykResponse response = await _bankService.refund( + token: session.token, + amount: total, + operDay: refundData.operationDay, + terminalId: refundData.terminalId, + transNum: refundData.transactionNumber); + if (response.result.code == 0) { + CardData cardData = new CardData( + authorizationCode: + response.transaction.instrumentSpecificData.authorizationCode, + cardholderName: + response.transaction.instrumentSpecificData.cardholderName, + cardNumber: response.transaction.instrumentSpecificData.maskedPan, + operationDay: response.transaction.operationDay, + transactionNumber: response.transaction.transactionNumber, + terminalId: response.transaction.terminalId, + transactionType: 'refund'); + return AmanDao( + msg: response.result.description, success: true, data: cardData); + } + return AmanDao( + msg: response.result.errorData != null + ? response.result.errorData.description + : response.result.description, + success: false); +} + +Future> reversalHalykPos( + CardData refundData, double total) async { + //Авторизация + String token = Redux.store.state.userState.user.token; + BankState bankState = Redux.store.state.bankState; + //права доступа + HalykPosSession session = await _bankService.renewToken( + token: token, login: bankState.login, password: bankState.password); + if (session.token == null) { + return sessionDeclineDao(session); } log.i(refundData.toJson()); - HalykResponse response = await _bankService.reversal(token: session.token, operDay: refundData.operationDay, terminalId: refundData.terminalId, transNum: refundData.transactionNumber ); + HalykResponse response = await _bankService.reversal( + token: session.token, + operDay: refundData.operationDay, + terminalId: refundData.terminalId, + transNum: refundData.transactionNumber); if (response.result.code == 0) { CardData cardData = new CardData( - authorizationCode: response.transaction.instrumentSpecificData.authorizationCode, - cardholderName: response.transaction.instrumentSpecificData.cardholderName, + authorizationCode: + response.transaction.instrumentSpecificData.authorizationCode, + cardholderName: + response.transaction.instrumentSpecificData.cardholderName, cardNumber: response.transaction.instrumentSpecificData.maskedPan, operationDay: response.transaction.operationDay, transactionNumber: response.transaction.transactionNumber, terminalId: response.transaction.terminalId, - transactionType: 'reversal' - ); - return AmanDao(msg: response.result.description, success: true, data: cardData); + transactionType: 'reversal'); + return AmanDao( + msg: response.result.description, success: true, data: cardData); } - return AmanDao(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false); + return AmanDao( + msg: response.result.errorData != null + ? response.result.errorData.description + : response.result.description, + success: false); } Future closeDayHalykPos() async { @@ -105,16 +144,15 @@ Future closeDayHalykPos() async { String token = Redux.store.state.userState.user.token; BankState bankState = Redux.store.state.bankState; //права доступа - HalykPosSession session = - await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password); + HalykPosSession session = await _bankService.renewToken( + token: token, login: bankState.login, password: bankState.password); if (session.token == null) { - return new Cd.HalykCloseDayDao(result: Cd.ResultBean(description: 'Отказано в доступе к API банка', code: -1)); + return new Cd.HalykCloseDayDao( + result: Cd.ResultBean( + description: 'Отказано в доступе к API банка', code: -1)); } //Инициализация - Cd.HalykCloseDayDao response = await _bankService.closeDay(token: session.token); + Cd.HalykCloseDayDao response = + await _bankService.closeDay(token: session.token); return response; } - - - - diff --git a/lib/views/payment/payment_view.dart b/lib/views/payment/payment_view.dart index 52ddcec..3e8d3fa 100644 --- a/lib/views/payment/payment_view.dart +++ b/lib/views/payment/payment_view.dart @@ -217,6 +217,17 @@ class _PaymentViewState extends State { } return InkWell( onTap: () async { + + var today = new DateTime.now(); + var yesterday = today.subtract(new Duration(days: 1)); + if( Redux.store.state.userState == null + || Redux.store.state.userState.smena == null + || Redux.store.state.userState.smena.startedAt == null + || yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) { + _dialogService.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.'); + return; + } + try { await Redux.store.dispatch(changePinSkipFromSetting(true)); AmanDao data = await paymentHalykPos(_total);