You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
639 lines
35 KiB
Dart
639 lines
35 KiB
Dart
import 'dart:async';
|
|
import 'dart:developer';
|
|
import 'dart:io';
|
|
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
|
import 'package:hmg_patient_app_new/core/app_state.dart';
|
|
import 'package:hmg_patient_app_new/core/cache_consts.dart';
|
|
import 'package:hmg_patient_app_new/core/dependencies.dart';
|
|
import 'package:hmg_patient_app_new/core/enums.dart';
|
|
import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart';
|
|
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
|
import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
|
|
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
|
|
import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
|
|
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
|
import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart';
|
|
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
|
|
import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart';
|
|
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
|
|
import 'package:hmg_patient_app_new/services/cache_service.dart';
|
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
|
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
|
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
|
|
import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart';
|
|
import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
|
|
import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:smooth_corner/smooth_corner.dart';
|
|
|
|
class AppointmentPaymentPage extends StatefulWidget {
|
|
AppointmentPaymentPage({super.key, required this.patientAppointmentHistoryResponseModel});
|
|
|
|
PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel;
|
|
|
|
@override
|
|
State<AppointmentPaymentPage> createState() => _AppointmentPaymentPageState();
|
|
}
|
|
|
|
class _AppointmentPaymentPageState extends State<AppointmentPaymentPage> {
|
|
late MyAppointmentsViewModel myAppointmentsViewModel;
|
|
late PayfortViewModel payfortViewModel;
|
|
late AppState appState;
|
|
|
|
MyInAppBrowser? browser;
|
|
String selectedPaymentMethod = "";
|
|
|
|
String transID = "";
|
|
|
|
bool isShowTamara = false;
|
|
String tamaraPaymentStatus = "";
|
|
String tamaraOrderID = "";
|
|
|
|
@override
|
|
void initState() {
|
|
scheduleMicrotask(() {
|
|
payfortViewModel.initPayfortViewModel();
|
|
myAppointmentsViewModel.getTamaraInstallmentsDetails().then((val) {
|
|
if (myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax! >= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.minLimit!.amount! &&
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax! <= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.maxLimit!.amount!) {
|
|
setState(() {
|
|
isShowTamara = true;
|
|
});
|
|
}
|
|
});
|
|
payfortViewModel.setIsApplePayConfigurationLoading(false);
|
|
myAppointmentsViewModel.getPatientShareAppointment(
|
|
widget.patientAppointmentHistoryResponseModel.projectID,
|
|
widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false, onError: (err) {
|
|
Navigator.of(context).pop();
|
|
Navigator.of(context).pop();
|
|
});
|
|
});
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
appState = getIt.get<AppState>();
|
|
myAppointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context);
|
|
payfortViewModel = Provider.of<PayfortViewModel>(context);
|
|
return Scaffold(
|
|
backgroundColor: AppColors.bgScaffoldColor,
|
|
body: Consumer<MyAppointmentsViewModel>(builder: (context, myAppointmentsVM, child) {
|
|
return Column(
|
|
children: [
|
|
Expanded(
|
|
child: CollapsingListView(
|
|
title: "Appointment Payment".needTranslation,
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
SizedBox(height: 24.h),
|
|
Container(
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
|
color: AppColors.whiteColor,
|
|
borderRadius: 20.h,
|
|
hasShadow: false,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Image.asset(AppAssets.mada, width: 72.h, height: 25.h).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
SizedBox(height: 16.h),
|
|
"Mada".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
],
|
|
),
|
|
SizedBox(width: 8.h),
|
|
const Spacer(),
|
|
Transform.flip(
|
|
flipX: appState.isArabic() ? true : false,
|
|
child: Utils.buildSvgWithAssets(
|
|
icon: AppAssets.forward_arrow_icon_small,
|
|
iconColor: AppColors.blackColor,
|
|
width: 18.h,
|
|
height: 13.h,
|
|
fit: BoxFit.contain,
|
|
).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
),
|
|
],
|
|
).paddingSymmetrical(16.h, 16.h),
|
|
).paddingSymmetrical(24.h, 0.h).onPress(() {
|
|
selectedPaymentMethod = "MADA";
|
|
openPaymentURL("mada");
|
|
}),
|
|
SizedBox(height: 16.h),
|
|
Container(
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
|
color: AppColors.whiteColor,
|
|
borderRadius: 20.h,
|
|
hasShadow: false,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Image.asset(AppAssets.visa, width: 50.h, height: 50.h),
|
|
SizedBox(width: 8.h),
|
|
Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
|
|
],
|
|
).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
SizedBox(height: 16.h),
|
|
"Visa or Mastercard".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
],
|
|
),
|
|
SizedBox(width: 8.h),
|
|
const Spacer(),
|
|
Transform.flip(
|
|
flipX: appState.isArabic() ? true : false,
|
|
child: Utils.buildSvgWithAssets(
|
|
icon: AppAssets.forward_arrow_icon_small,
|
|
iconColor: AppColors.blackColor,
|
|
width: 18.h,
|
|
height: 13.h,
|
|
fit: BoxFit.contain,
|
|
).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
),
|
|
],
|
|
).paddingSymmetrical(16.h, 16.h),
|
|
).paddingSymmetrical(24.h, 0.h).onPress(() {
|
|
selectedPaymentMethod = "VISA";
|
|
openPaymentURL("visa");
|
|
}),
|
|
SizedBox(height: 16.h),
|
|
isShowTamara
|
|
? Container(
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
|
color: AppColors.whiteColor,
|
|
borderRadius: 20.h,
|
|
hasShadow: false,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
SizedBox(height: 16.h),
|
|
"Tamara".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
],
|
|
),
|
|
SizedBox(width: 8.h),
|
|
const Spacer(),
|
|
Transform.flip(
|
|
flipX: appState.isArabic() ? true : false,
|
|
child: Utils.buildSvgWithAssets(
|
|
icon: AppAssets.forward_arrow_icon_small,
|
|
iconColor: AppColors.blackColor,
|
|
width: 18.h,
|
|
height: 13.h,
|
|
fit: BoxFit.contain,
|
|
).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
|
|
),
|
|
],
|
|
).paddingSymmetrical(16.h, 16.h),
|
|
).paddingSymmetrical(24.h, 0.h).onPress(() {
|
|
selectedPaymentMethod = "TAMARA";
|
|
openPaymentURL("tamara");
|
|
})
|
|
: SizedBox.shrink(),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
myAppointmentsVM.isAppointmentPatientShareLoading
|
|
? SizedBox.shrink()
|
|
: Container(
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
|
|
color: AppColors.whiteColor,
|
|
borderRadius: 24.h,
|
|
hasShadow: false,
|
|
),
|
|
child: Consumer<PayfortViewModel>(builder: (context, payfortVM, child) {
|
|
//TODO: Need to add loading state & animation for Apple Pay Configuration
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
(myAppointmentsVM.patientAppointmentShareResponseModel!.isCash ?? true)
|
|
? Container(
|
|
height: 50.h,
|
|
decoration: ShapeDecoration(
|
|
color: AppColors.secondaryLightRedBorderColor,
|
|
shape: SmoothRectangleBorder(
|
|
borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)),
|
|
smoothness: 1,
|
|
),
|
|
),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
"Insurance expired or inactive".needTranslation.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500).paddingSymmetrical(24.h, 0.h),
|
|
CustomButton(
|
|
text: LocaleKeys.updateInsurance.tr(context: context),
|
|
onPressed: () {
|
|
Navigator.of(context).push(
|
|
CustomPageRoute(
|
|
page: InsuranceHomePage(),
|
|
),
|
|
);
|
|
},
|
|
backgroundColor: AppColors.primaryRedColor,
|
|
borderColor: AppColors.secondaryLightRedBorderColor,
|
|
textColor: AppColors.whiteColor,
|
|
fontSize: 10,
|
|
fontWeight: FontWeight.w500,
|
|
borderRadius: 8,
|
|
padding: EdgeInsets.fromLTRB(15, 0, 15, 0),
|
|
height: 30.h,
|
|
).paddingSymmetrical(24.h, 0.h),
|
|
],
|
|
),
|
|
)
|
|
: const SizedBox(),
|
|
SizedBox(height: 24.h),
|
|
"Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h),
|
|
SizedBox(height: 17.h),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
"Amount before tax".needTranslation.toText14(isBold: true),
|
|
Utils.getPaymentAmountWithSymbol(myAppointmentsVM.patientAppointmentShareResponseModel!.patientShare!.toString().toText16(isBold: true), AppColors.blackColor, 13,
|
|
isSaudiCurrency: true),
|
|
],
|
|
).paddingSymmetrical(24.h, 0.h),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
"VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor),
|
|
Utils.getPaymentAmountWithSymbol(
|
|
myAppointmentsVM.patientAppointmentShareResponseModel!.patientTaxAmount!.toString().toText14(isBold: true, color: AppColors.greyTextColor),
|
|
AppColors.greyTextColor,
|
|
13,
|
|
isSaudiCurrency: true),
|
|
],
|
|
).paddingSymmetrical(24.h, 0.h),
|
|
SizedBox(height: 17.h),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
"".needTranslation.toText14(isBold: true),
|
|
Utils.getPaymentAmountWithSymbol(myAppointmentsVM.patientAppointmentShareResponseModel!.patientShareWithTax!.toString().toText24(isBold: true), AppColors.blackColor, 17,
|
|
isSaudiCurrency: true),
|
|
],
|
|
).paddingSymmetrical(24.h, 0.h),
|
|
Platform.isIOS
|
|
? Utils.buildSvgWithAssets(
|
|
icon: AppAssets.apple_pay_button,
|
|
width: 200.h,
|
|
height: 80.h,
|
|
fit: BoxFit.contain,
|
|
).paddingSymmetrical(24.h, 0.h).onPress(() {
|
|
// payfortVM.setIsApplePayConfigurationLoading(true);
|
|
if (Utils.havePrivilege(103)) {
|
|
startApplePay();
|
|
} else {
|
|
openPaymentURL("ApplePay");
|
|
}
|
|
})
|
|
: SizedBox(height: 12.h),
|
|
SizedBox(height: 12.h),
|
|
],
|
|
);
|
|
}),
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
|
|
onBrowserLoadStart(String url) {
|
|
print("onBrowserLoadStart");
|
|
print(url);
|
|
|
|
if (selectedPaymentMethod == "tamara") {
|
|
if (Platform.isAndroid) {
|
|
Uri uri = new Uri.dataFromString(url);
|
|
tamaraPaymentStatus = uri.queryParameters['status']!;
|
|
tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!;
|
|
} else {
|
|
Uri uri = new Uri.dataFromString(url);
|
|
tamaraPaymentStatus = uri.queryParameters['paymentStatus']!;
|
|
tamaraOrderID = uri.queryParameters['orderId']!;
|
|
}
|
|
}
|
|
|
|
// if(selectedPaymentMethod != "TAMARA") {
|
|
MyInAppBrowser.successURLS.forEach((element) {
|
|
if (url.contains(element)) {
|
|
browser?.close();
|
|
MyInAppBrowser.isPaymentDone = true;
|
|
return;
|
|
}
|
|
});
|
|
// }
|
|
|
|
// if(selectedPaymentMethod != "TAMARA") {
|
|
MyInAppBrowser.errorURLS.forEach((element) {
|
|
if (url.contains(element)) {
|
|
browser?.close();
|
|
MyInAppBrowser.isPaymentDone = false;
|
|
return;
|
|
}
|
|
});
|
|
// }
|
|
}
|
|
|
|
onBrowserExit(bool isPaymentMade) async {
|
|
checkPaymentStatus();
|
|
}
|
|
|
|
void checkPaymentStatus() async {
|
|
LoaderBottomSheet.showLoader(loadingText: "Checking payment status, Please wait...".needTranslation);
|
|
if (selectedPaymentMethod == "TAMARA") {
|
|
await payfortViewModel.checkTamaraPaymentStatus(
|
|
transactionID: transID,
|
|
onSuccess: (apiResponse) async {
|
|
if (apiResponse.data["status"].toString().toLowerCase() == "success") {
|
|
tamaraOrderID = apiResponse.data["tamara_order_id"].toString();
|
|
await payfortViewModel.updateTamaraRequestStatus(responseMessage: "success", status: "14", clientRequestID: transID, tamaraOrderID: tamaraOrderID);
|
|
await payfortViewModel.markAppointmentAsTamaraPaid(
|
|
projectID: widget.patientAppointmentHistoryResponseModel.projectID, appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo);
|
|
await myAppointmentsViewModel.addAdvanceNumberRequest(
|
|
advanceNumber: "Tamara-Advance-0000",
|
|
paymentReference: tamaraOrderID,
|
|
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
|
|
onSuccess: (value) async {
|
|
if (widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment!) {
|
|
//TODO: Implement LiveCare Check-In API Call
|
|
await myAppointmentsViewModel.insertLiveCareVIDARequest(
|
|
clientRequestID: tamaraOrderID,
|
|
patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel,
|
|
onSuccess: (apiResponse) {
|
|
Future.delayed(Duration(milliseconds: 500), () {
|
|
LoaderBottomSheet.hideLoader();
|
|
Navigator.pushAndRemoveUntil(
|
|
context,
|
|
CustomPageRoute(
|
|
page: LandingNavigation(),
|
|
),
|
|
(r) => false);
|
|
});
|
|
},
|
|
onError: (error) {});
|
|
} else {
|
|
await myAppointmentsViewModel.generateAppointmentQR(
|
|
clinicID: widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
projectID: widget.patientAppointmentHistoryResponseModel.projectID,
|
|
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
|
|
isFollowUp: myAppointmentsViewModel.patientAppointmentShareResponseModel!.isFollowup!,
|
|
onSuccess: (apiResponse) {
|
|
Future.delayed(Duration(milliseconds: 500), () {
|
|
LoaderBottomSheet.hideLoader();
|
|
Navigator.pushAndRemoveUntil(
|
|
context,
|
|
CustomPageRoute(
|
|
page: LandingNavigation(),
|
|
),
|
|
(r) => false);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
} else {
|
|
await payfortViewModel.updateTamaraRequestStatus(responseMessage: "Failed", status: "00", clientRequestID: transID, tamaraOrderID: tamaraOrderID);
|
|
LoaderBottomSheet.hideLoader();
|
|
showCommonBottomSheetWithoutHeight(
|
|
context,
|
|
child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation),
|
|
callBackFunc: () {},
|
|
isFullScreen: false,
|
|
isCloseButtonVisible: true,
|
|
);
|
|
}
|
|
},
|
|
onError: (err) {
|
|
LoaderBottomSheet.hideLoader();
|
|
showCommonBottomSheetWithoutHeight(
|
|
context,
|
|
child: Utils.getErrorWidget(loadingText: err),
|
|
callBackFunc: () {},
|
|
isFullScreen: false,
|
|
isCloseButtonVisible: true,
|
|
);
|
|
});
|
|
} else {
|
|
await payfortViewModel.checkPaymentStatus(
|
|
transactionID: transID,
|
|
onSuccess: (apiResponse) async {
|
|
print(apiResponse.data);
|
|
if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") {
|
|
await myAppointmentsViewModel.createAdvancePayment(
|
|
paymentMethodName: selectedPaymentMethod,
|
|
projectID: widget.patientAppointmentHistoryResponseModel.projectID,
|
|
clinicID: widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
|
|
payedAmount: payfortViewModel.payfortCheckPaymentStatusResponseModel!.amount!,
|
|
paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
|
|
patientID: appState.getAuthenticatedUser()!.patientId.toString(),
|
|
patientType: appState.getAuthenticatedUser()!.patientType!,
|
|
onSuccess: (value) async {
|
|
print(value);
|
|
await myAppointmentsViewModel.addAdvanceNumberRequest(
|
|
advanceNumber: Utils.isVidaPlusProject(widget.patientAppointmentHistoryResponseModel.projectID)
|
|
? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
|
|
: value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
|
|
paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
|
|
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
|
|
onSuccess: (value) async {
|
|
if (widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment!) {
|
|
//TODO: Implement LiveCare Check-In API Call
|
|
await myAppointmentsViewModel.insertLiveCareVIDARequest(
|
|
clientRequestID: transID,
|
|
patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel,
|
|
onSuccess: (apiResponse) {
|
|
Future.delayed(Duration(milliseconds: 500), () {
|
|
LoaderBottomSheet.hideLoader();
|
|
Navigator.pushAndRemoveUntil(
|
|
context,
|
|
CustomPageRoute(
|
|
page: LandingNavigation(),
|
|
),
|
|
(r) => false);
|
|
});
|
|
},
|
|
onError: (error) {});
|
|
} else {
|
|
await myAppointmentsViewModel.generateAppointmentQR(
|
|
clinicID: widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
projectID: widget.patientAppointmentHistoryResponseModel.projectID,
|
|
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
|
|
isFollowUp: myAppointmentsViewModel.patientAppointmentShareResponseModel!.isFollowup!,
|
|
onSuccess: (apiResponse) {
|
|
Future.delayed(Duration(milliseconds: 500), () {
|
|
LoaderBottomSheet.hideLoader();
|
|
Navigator.pushAndRemoveUntil(
|
|
context,
|
|
CustomPageRoute(
|
|
page: LandingNavigation(),
|
|
),
|
|
(r) => false);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
});
|
|
} else {
|
|
showCommonBottomSheetWithoutHeight(
|
|
context,
|
|
child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation),
|
|
callBackFunc: () {},
|
|
isFullScreen: false,
|
|
isCloseButtonVisible: true,
|
|
);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
openPaymentURL(String paymentMethod) {
|
|
browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context);
|
|
transID = Utils.getAppointmentTransID(
|
|
widget.patientAppointmentHistoryResponseModel.projectID,
|
|
widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
widget.patientAppointmentHistoryResponseModel.appointmentNo,
|
|
);
|
|
|
|
//TODO: Need to pass dynamic params to the payment request instead of static values
|
|
browser?.openPaymentBrowser(
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!,
|
|
"Appointment check in",
|
|
transID,
|
|
widget.patientAppointmentHistoryResponseModel.projectID.toString(),
|
|
"CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
|
|
selectedPaymentMethod,
|
|
appState.getAuthenticatedUser()!.patientType.toString(),
|
|
"${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
|
|
appState.getAuthenticatedUser()!.patientId.toString(),
|
|
appState.getAuthenticatedUser()!,
|
|
browser!,
|
|
widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false,
|
|
"2",
|
|
widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? myAppointmentsViewModel.patientAppointmentShareResponseModel!.clinicID.toString() : "",
|
|
context,
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.appointmentDate,
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.appointmentNo,
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.clinicID,
|
|
myAppointmentsViewModel.patientAppointmentShareResponseModel!.doctorID,
|
|
"3");
|
|
}
|
|
|
|
startApplePay() async {
|
|
showCommonBottomSheet(context,
|
|
child: Utils.getLoadingWidget(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.3, isCloseButtonVisible: false, isDismissible: false, isFullScreen: false);
|
|
transID = Utils.getAppointmentTransID(
|
|
widget.patientAppointmentHistoryResponseModel.projectID,
|
|
widget.patientAppointmentHistoryResponseModel.clinicID,
|
|
widget.patientAppointmentHistoryResponseModel.appointmentNo,
|
|
);
|
|
|
|
ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest();
|
|
|
|
await payfortViewModel.getPayfortConfigurations(
|
|
serviceId: ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum(), projectId: widget.patientAppointmentHistoryResponseModel.projectID, integrationId: 2);
|
|
|
|
applePayInsertRequest.clientRequestID = transID;
|
|
applePayInsertRequest.clinicID = widget.patientAppointmentHistoryResponseModel.clinicID;
|
|
|
|
applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED";
|
|
applePayInsertRequest.customerEmail = "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com";
|
|
applePayInsertRequest.customerID = appState.getAuthenticatedUser()!.patientId.toString();
|
|
applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}";
|
|
|
|
applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken);
|
|
applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken);
|
|
applePayInsertRequest.doctorID = widget.patientAppointmentHistoryResponseModel.doctorID;
|
|
applePayInsertRequest.projectID = widget.patientAppointmentHistoryResponseModel.projectID.toString();
|
|
applePayInsertRequest.serviceID = ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum().toString();
|
|
applePayInsertRequest.channelID = 3;
|
|
applePayInsertRequest.patientID = appState.getAuthenticatedUser()!.patientId.toString();
|
|
applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType;
|
|
applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa;
|
|
applePayInsertRequest.appointmentDate = widget.patientAppointmentHistoryResponseModel.appointmentDate;
|
|
applePayInsertRequest.appointmentNo = widget.patientAppointmentHistoryResponseModel.appointmentNo;
|
|
applePayInsertRequest.orderDescription = "Appointment Payment";
|
|
applePayInsertRequest.liveServiceID = "0";
|
|
applePayInsertRequest.latitude = "0.0";
|
|
applePayInsertRequest.longitude = "0.0";
|
|
applePayInsertRequest.amount = myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!.toString();
|
|
applePayInsertRequest.isSchedule = widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? "1" : "0";
|
|
applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en';
|
|
applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2;
|
|
applePayInsertRequest.userName = appState.getAuthenticatedUser()!.patientId;
|
|
applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html";
|
|
applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html";
|
|
applePayInsertRequest.paymentOption = "ApplePay";
|
|
|
|
applePayInsertRequest.isMobSDK = true;
|
|
applePayInsertRequest.merchantReference = transID;
|
|
applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier;
|
|
applePayInsertRequest.commandType = "PURCHASE";
|
|
applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature;
|
|
applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode;
|
|
applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest;
|
|
applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse;
|
|
applePayInsertRequest.returnURL = "";
|
|
|
|
//TODO: Need to pass dynamic params to the Apple Pay instead of static values
|
|
await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) {
|
|
payfortViewModel.paymentWithApplePay(
|
|
customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
|
|
// customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
|
|
customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
|
|
orderDescription: "Appointment Payment",
|
|
orderAmount: double.parse(myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!.toString()),
|
|
merchantReference: transID,
|
|
merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier,
|
|
applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode,
|
|
applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest,
|
|
currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED",
|
|
onFailed: (failureResult) async {
|
|
log("failureResult: ${failureResult.message.toString()}");
|
|
Navigator.of(context).pop();
|
|
showCommonBottomSheetWithoutHeight(
|
|
context,
|
|
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()),
|
|
callBackFunc: () {},
|
|
isFullScreen: false,
|
|
isCloseButtonVisible: true,
|
|
);
|
|
},
|
|
onSucceeded: (successResult) async {
|
|
Navigator.of(context).pop();
|
|
log("successResult: ${successResult.responseMessage.toString()}");
|
|
selectedPaymentMethod = successResult.paymentOption ?? "VISA";
|
|
checkPaymentStatus();
|
|
},
|
|
// projectId: appo.projectID,
|
|
// serviceTypeEnum: ServiceTypeEnum.appointmentPayment,
|
|
);
|
|
});
|
|
}
|
|
}
|