Appointment payment implemented, Book Success implemented, Appointment flow implemented

merge-requests/34/merge
Haroon Amjad 4 years ago
parent 3a9fa97c91
commit 41c922bfeb

@ -67,6 +67,9 @@ const CHECK_PAYMENT_STATUS = "/PayFort_Serv.svc/REST/GetRequestStatusByRequestID
//URL create advance payment //URL create advance payment
const CREATE_ADVANCE_PAYMENT = "/Doctors.svc/REST/CreateAdvancePayment"; const CREATE_ADVANCE_PAYMENT = "/Doctors.svc/REST/CreateAdvancePayment";
const ADD_ADVANCE_NUMBER_REQUEST = '/PayFort_Serv.svc/REST/AddAdvancedNumberRequest';
//URL to get medicine and pharmacies list //URL to get medicine and pharmacies list
const CHANNEL = 3; const CHANNEL = 3;
const GENERAL_ID = 'Cs2020@2016\$2958'; const GENERAL_ID = 'Cs2020@2016\$2958';

@ -1,8 +1,16 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart'; import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'QRCode.dart'; import 'QRCode.dart';
@ -11,6 +19,8 @@ class BookSuccess extends StatefulWidget {
PatientShareResponse patientShareResponse; PatientShareResponse patientShareResponse;
DoctorList docObject; DoctorList docObject;
MyInAppBrowser browser;
String appoDateFormatted; String appoDateFormatted;
String appoTimeFormatted; String appoTimeFormatted;
@ -25,6 +35,9 @@ class BookSuccess extends StatefulWidget {
} }
class _BookSuccessState extends State<BookSuccess> { class _BookSuccessState extends State<BookSuccess> {
AppSharedPreferences sharedPref = AppSharedPreferences();
AuthenticatedUser authUser;
@override @override
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
@ -34,12 +47,6 @@ class _BookSuccessState extends State<BookSuccess> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
// appBar: AppBar(
// title: Text("Book Success"),
// bottomOpacity: 0.0,
// elevation: 0.0,
// backgroundColor: new Color(0xFF20bc44),
// ),
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -320,12 +327,15 @@ class _BookSuccessState extends State<BookSuccess> {
margin: EdgeInsets.only(top: 20.0, bottom: 0.0), margin: EdgeInsets.only(top: 20.0, bottom: 0.0),
alignment: Alignment.center, alignment: Alignment.center,
child: Text(TranslationBase.of(context).payNowBookSuccess, child: Text(TranslationBase.of(context).payNowBookSuccess,
style: TextStyle(fontSize: 20.0, letterSpacing: 0.8, fontWeight: FontWeight.bold)), style: TextStyle(
fontSize: 20.0,
letterSpacing: 0.8,
fontWeight: FontWeight.bold)),
), ),
Container( Container(
alignment: Alignment.center, alignment: Alignment.center,
child: Image.asset("assets/images/new-design/no-wait-queue.png", width: 120.0, child: Image.asset("assets/images/new-design/no-wait-queue.png",
height: 120.0), width: 120.0, height: 120.0),
), ),
Flex( Flex(
direction: Axis.horizontal, direction: Axis.horizontal,
@ -396,7 +406,9 @@ class _BookSuccessState extends State<BookSuccess> {
textColor: Colors.white, textColor: Colors.white,
disabledTextColor: Colors.white, disabledTextColor: Colors.white,
disabledColor: new Color(0xFFbcc2c4), disabledColor: new Color(0xFFbcc2c4),
onPressed: () {}, onPressed: () {
startPaymentProcess();
},
child: Text(TranslationBase.of(context).payNow.toUpperCase(), child: Text(TranslationBase.of(context).payNow.toUpperCase(),
style: TextStyle(fontSize: 18.0)), style: TextStyle(fontSize: 18.0)),
), ),
@ -427,6 +439,154 @@ class _BookSuccessState extends State<BookSuccess> {
); );
} }
startPaymentProcess() {
navigateToPaymentMethod(context, widget.patientShareResponse);
}
Future navigateToPaymentMethod(
context, PatientShareResponse patientShareResponse) async {
if (await this.sharedPref.getObject(USER_PROFILE) != null) {
var data = AuthenticatedUser.fromJson(
await this.sharedPref.getObject(USER_PROFILE));
setState(() {
authUser = data;
});
}
AppoitmentAllHistoryResultList appo = new AppoitmentAllHistoryResultList();
appo.projectID = widget.patientShareResponse.projectID;
appo.clinicID = widget.patientShareResponse.clinicID;
appo.appointmentNo = widget.patientShareResponse.appointmentNo;
Navigator.push(
context, MaterialPageRoute(builder: (context) => PaymentMethod()))
.then((value) {
print(value);
if (value != null) {
openPayment(
value,
authUser,
double.parse(patientShareResponse.patientShareWithTax.toString()),
patientShareResponse,
appo);
}
});
}
openPayment(
String paymentMethod,
AuthenticatedUser authenticatedUser,
double amount,
PatientShareResponse patientShareResponse,
AppoitmentAllHistoryResultList appo) {
widget.browser = new MyInAppBrowser(
onExitCallback: onBrowserExit,
appo: appo,
onLoadStartCallback: onBrowserLoadStart);
widget.browser.openPaymentBrowser(
amount,
"Appointment check in",
Utils.getAppointmentTransID(
appo.projectID, appo.clinicID, appo.appointmentNo),
appo.projectID.toString(),
authenticatedUser.emailAddress,
paymentMethod,
authenticatedUser,
widget.browser);
}
onBrowserLoadStart(String url) {
print("onBrowserLoadStart");
print(url);
MyInAppBrowser.successURLS.forEach((element) {
if (url.contains(element)) {
if (widget.browser.isOpened()) widget.browser.close();
MyInAppBrowser.isPaymentDone = true;
Utils.hideProgressDialog();
return;
}
});
MyInAppBrowser.errorURLS.forEach((element) {
if (url.contains(element)) {
if (widget.browser.isOpened()) widget.browser.close();
MyInAppBrowser.isPaymentDone = false;
Utils.hideProgressDialog();
return;
}
});
}
onBrowserExit(AppoitmentAllHistoryResultList appo, bool isPaymentMade) {
print("onBrowserExit Called!!!!");
if (isPaymentMade) checkPaymentStatus(appo);
}
checkPaymentStatus(AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
service
.checkPaymentStatus(
Utils.getAppointmentTransID(
appo.projectID, appo.clinicID, appo.appointmentNo),
context)
.then((res) {
print("Printing Payment Status Reponse!!!!");
print(res);
String paymentInfo = res['Response_Message'];
if (paymentInfo == 'Success') {
createAdvancePayment(res, appo);
} else {
AppToast.showErrorToast(message: res['Response_Message']);
}
}).catchError((err) {
print(err);
});
}
createAdvancePayment(res, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
String paymentReference = res['Fort_id'].toString();
service
.createAdvancePayment(
appo, res['Amount'], res['Fort_id'], res['PaymentMethod'], context)
.then((res) {
print(res['OnlineCheckInAppointments'][0]['AdvanceNumber']);
addAdvancedNumberRequest(
res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference,
appo.appointmentNo.toString());
}).catchError((err) {
print(err);
});
}
//
// Future navigateToQR(
// context, String appoQR, PatientShareResponse patientShareResponse) async {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => QRCode(
// patientShareResponse: patientShareResponse,
// appoQR: appoQR,
// ))).then((value) {});
// }
addAdvancedNumberRequest(String advanceNumber, String paymentReference,
String appointmentID) {
DoctorsListService service = new DoctorsListService();
service
.addAdvancedNumberRequest(
advanceNumber, paymentReference, appointmentID, context)
.then((res) {
print(res);
getAppoQR(context);
}).catchError((err) {
print(err);
});
}
Widget _getQRAppo() { Widget _getQRAppo() {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -440,8 +600,8 @@ class _BookSuccessState extends State<BookSuccess> {
), ),
Container( Container(
alignment: Alignment.center, alignment: Alignment.center,
child: Image.asset("assets/images/new-design/device_icon.png", width: 120.0, child: Image.asset("assets/images/new-design/device_icon.png",
height: 120.0), width: 120.0, height: 120.0),
), ),
Flex( Flex(
direction: Axis.horizontal, direction: Axis.horizontal,

@ -93,6 +93,7 @@ class _AppointmentDetailsState extends State<AppointmentDetails>
widget.appo.doctorTitle + widget.appo.doctorTitle +
" " + " " +
widget.appo.doctorNameObj, widget.appo.doctorNameObj,
textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 20.0, fontSize: 20.0,
color: Colors.grey[900], color: Colors.grey[900],

@ -127,15 +127,9 @@ class _MyAppointmentsState extends State<MyAppointments>
openAppointmentsTab() { openAppointmentsTab() {
if (widget.bookedAppoList.length != 0) { if (widget.bookedAppoList.length != 0) {
_tabController.animateTo((_tabController.index + 1) % 1); _tabController.animateTo((_tabController.index + 1) % 1);
return; } else if (widget.confirmedAppoList.length != 0) {
}
if (widget.confirmedAppoList.length != 0) {
_tabController.animateTo((_tabController.index + 1) % 2); _tabController.animateTo((_tabController.index + 1) % 2);
return; } else if (widget.arrivedAppoList.length != 0) {
}
if (widget.arrivedAppoList.length != 0) {
_tabController.animateTo((_tabController.index + 1) % 3); _tabController.animateTo((_tabController.index + 1) % 3);
return; return;
} }

@ -95,7 +95,7 @@ class _AppointmentActionsState extends State<AppointmentActions> {
Container( Container(
alignment: Alignment.bottomRight, alignment: Alignment.bottomRight,
margin: margin:
EdgeInsets.fromLTRB(0.0, 10.0, 10.0, 8.0), EdgeInsets.fromLTRB(0.0, 10.0, 10.0, 7.0),
child: Image.asset(e.icon, child: Image.asset(e.icon,
width: 45.0, height: 45.0), width: 45.0, height: 45.0),
), ),
@ -308,6 +308,7 @@ class _AppointmentActionsState extends State<AppointmentActions> {
print(res); print(res);
if (res['MessageStatus'] == 1) { if (res['MessageStatus'] == 1) {
AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); AppToast.showSuccessToast(message: res['ErrorEndUserMessage']);
Navigator.of(context).pop();
} else { } else {
AppToast.showErrorToast(message: res['ErrorEndUserMessage']); AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
} }

@ -42,7 +42,7 @@ class _ApointmentCardState extends State<AppointmentCard> {
fit: BoxFit.fill, height: 60.0, width: 60.0), fit: BoxFit.fill, height: 60.0, width: 60.0),
), ),
Container( Container(
width: MediaQuery.of(context).size.width * 0.666, width: MediaQuery.of(context).size.width * 0.6,
margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0), margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -27,7 +27,7 @@ class _ReminderDialogState extends State<ReminderDialog> {
shape: shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
child: Container( child: Container(
height: MediaQuery.of(context).size.height * 0.55, height: MediaQuery.of(context).size.height * 0.57,
width: 450.0, width: 450.0,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -597,11 +597,31 @@ class _ToDoState extends State<ToDo> {
createAdvancePayment(res, AppoitmentAllHistoryResultList appo) { createAdvancePayment(res, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService(); DoctorsListService service = new DoctorsListService();
String paymentReference = res['Fort_id'].toString();
service service
.createAdvancePayment( .createAdvancePayment(
appo, res['Amount'], res['Fort_id'], res['PaymentMethod'], context) appo, res['Amount'], res['Fort_id'], res['PaymentMethod'], context)
.then((res) { .then((res) {
print(res['OnlineCheckInAppointments']); print(res['OnlineCheckInAppointments'][0]['AdvanceNumber']);
addAdvancedNumberRequest(
res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference,
appo.appointmentNo.toString(),
appo);
}).catchError((err) {
print(err);
});
}
addAdvancedNumberRequest(String advanceNumber, String paymentReference,
String appointmentID, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
service
.addAdvancedNumberRequest(
advanceNumber, paymentReference, appointmentID, context)
.then((res) {
print(res);
getAppoQR(context, appo);
}).catchError((err) { }).catchError((err) {
print(err); print(err);
}); });

@ -24,7 +24,7 @@ class _PaymentDialogState extends State<PaymentDialog> {
shape: shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
child: Container( child: Container(
height: MediaQuery.of(context).size.height * 0.62, height: MediaQuery.of(context).size.height * 0.67,
width: 450.0, width: 450.0,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -613,6 +613,44 @@ class DoctorsListService extends BaseService {
return Future.value(localRes); return Future.value(localRes);
} }
Future<Map> addAdvancedNumberRequest(
String advanceNumber, String paymentReference, String appointmentID, BuildContext context) async {
Map<String, dynamic> request;
if (await this.sharedPref.getObject(USER_PROFILE) != null) {
var data = AuthenticatedUser.fromJson(
await this.sharedPref.getObject(USER_PROFILE));
authUser = data;
}
var languageID = await sharedPref.getString(APP_LANGUAGE);
Request req = appGlobal.getPublicRequest();
request = {
"AdvanceNumber": advanceNumber,
"PaymentReferenceNumber": paymentReference,
"AppointmentID": appointmentID,
"VersionID": req.VersionID,
"Channel": req.Channel,
"LanguageID": languageID == 'ar' ? 1 : 2,
"IPAdress": req.IPAdress,
"generalid": req.generalid,
"PatientOutSA": authUser.outSA,
"SessionID": "YckwoXhUmWBsnHKEKig",
"isDentalAllowedBackend": false,
"DeviceTypeID": req.DeviceTypeID,
"PatientID": authUser.patientID,
"TokenID": "@dm!n",
"PatientTypeID": authUser.patientType,
"PatientType": authUser.patientType
};
dynamic localRes;
await baseAppClient.post(ADD_ADVANCE_NUMBER_REQUEST,
onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request);
return Future.value(localRes);
}
Future<Map> createAdvancePayment( Future<Map> createAdvancePayment(
AppoitmentAllHistoryResultList appo, AppoitmentAllHistoryResultList appo,
double payedAmount, double payedAmount,

Loading…
Cancel
Save