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.
		
		
		
		
		
			
		
			
				
	
	
		
			541 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			541 lines
		
	
	
		
			29 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/presentation/lab/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/routes/custom_page_route.dart';
 | |
| import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart';
 | |
| import 'package:hmg_patient_app_new/widgets/transitions/fade_page.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 = "";
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     scheduleMicrotask(() {
 | |
|       payfortViewModel.initPayfortViewModel();
 | |
|       payfortViewModel.setIsApplePayConfigurationLoading(false);
 | |
|       myAppointmentsViewModel.getPatientShareAppointment(
 | |
|         widget.patientAppointmentHistoryResponseModel.projectID,
 | |
|         widget.patientAppointmentHistoryResponseModel.clinicID,
 | |
|         widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
 | |
|       );
 | |
|     });
 | |
|     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(),
 | |
|                             Utils.buildSvgWithAssets(
 | |
|                               icon: AppAssets.forward_arrow_icon,
 | |
|                               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(),
 | |
|                             Utils.buildSvgWithAssets(
 | |
|                               icon: AppAssets.forward_arrow_icon,
 | |
|                               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),
 | |
|                       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(),
 | |
|                             Utils.buildSvgWithAssets(
 | |
|                               icon: AppAssets.forward_arrow_icon,
 | |
|                               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");
 | |
|                       }),
 | |
|                     ],
 | |
|                   ),
 | |
|                 ),
 | |
|               ),
 | |
|             ),
 | |
|             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: [
 | |
|                               "Total amount to pay".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(selectedPaymentMethod);
 | |
|                                   }
 | |
|                                 })
 | |
|                               : 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 {
 | |
|     print("onBrowserExit Called!!!!");
 | |
|     if (selectedPaymentMethod == "TAMARA") {
 | |
|       // checkTamaraPaymentStatus(transID!, appo);
 | |
|       // if (tamaraPaymentStatus != null && tamaraPaymentStatus.toLowerCase() == "approved") {
 | |
|       //   updateTamaraRequestStatus("success", "14", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo);
 | |
|       // } else {
 | |
|       //   updateTamaraRequestStatus("Failed", "00", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo);
 | |
|       // }
 | |
|     } else {
 | |
|       checkPaymentStatus();
 | |
|       // checkPaymentStatus(appo);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void checkPaymentStatus() async {
 | |
|     showCommonBottomSheet(context,
 | |
|         child: Utils.getLoadingWidget(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.3, isCloseButtonVisible: false, isDismissible: false, isFullScreen: false);
 | |
|     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
 | |
|                         } 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), () {
 | |
|                                   Navigator.of(context).pop();
 | |
|                                   Navigator.pushAndRemoveUntil(
 | |
|                                       context,
 | |
|                                       CustomPageRoute(
 | |
|                                         page: LandingNavigation(),
 | |
|                                       ),
 | |
|                                       (r) => false);
 | |
|                                   Navigator.of(context).push(
 | |
|                                     CustomPageRoute(page: MyAppointmentsPage()),
 | |
|                                   );
 | |
|                                 });
 | |
|                               });
 | |
|                         }
 | |
|                       });
 | |
|                 });
 | |
|           } 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,
 | |
|       );
 | |
|     });
 | |
|   }
 | |
| }
 |