PayTabs Card & Apple Pay Payment integration completed.

pull/317/head
haroon amjad 1 month ago
parent 155916b1a8
commit 4015f5ba2e

@ -44,7 +44,7 @@ class AppState {
AuthenticatedUser? _authenticatedRootUser; AuthenticatedUser? _authenticatedRootUser;
AuthenticatedUser? _authenticatedChildUser; AuthenticatedUser? _authenticatedChildUser;
bool isPaytabsEnabled = true; bool isPaytabsEnabled = false;
int? _superUserID; int? _superUserID;
bool isChildLoggedIn = false; bool isChildLoggedIn = false;

@ -866,6 +866,7 @@ class BookAppointmentsViewModel extends ChangeNotifier {
initialSlotDuration = apiResponse.data["InitialSlotDuration"]; initialSlotDuration = apiResponse.data["InitialSlotDuration"];
freeSlotsResponse = apiResponse.data['FreeTimeSlots']; freeSlotsResponse = apiResponse.data['FreeTimeSlots'];
isWaitingAppointmentAvailable = apiResponse.data["IsAllowToBookWaitingAppointment"]; isWaitingAppointmentAvailable = apiResponse.data["IsAllowToBookWaitingAppointment"];
// isWaitingAppointmentAvailable = true; // isWaitingAppointmentAvailable = true;
freeSlotsResponse.forEach((element) { freeSlotsResponse.forEach((element) {

@ -48,18 +48,18 @@ class HabibWalletViewModel extends ChangeNotifier {
String yahalaAccountNumber = ''; String yahalaAccountNumber = '';
bool isLakumAccountInfoLoading = false; bool isLakumAccountInfoLoading = false;
late LakumInquiryInformationResponseModel lakumAccountInfo; LakumInquiryInformationResponseModel? lakumAccountInfo;
// Get all flattened transactions sorted by date descending // Get all flattened transactions sorted by date descending
List<PointsDetails> getAllLakumTransactions() { List<PointsDetails> getAllLakumTransactions() {
if (lakumAccountInfo.gainedPointsAmountPerYear == null) { if (lakumAccountInfo?.gainedPointsAmountPerYear == null) {
return []; return [];
} }
List<PointsDetails> allTransactions = []; List<PointsDetails> allTransactions = [];
// Flatten the nested structure // Flatten the nested structure
for (var yearData in lakumAccountInfo.gainedPointsAmountPerYear!) { for (var yearData in lakumAccountInfo!.gainedPointsAmountPerYear!) {
if (yearData.pointsAmountPerMonth != null) { if (yearData.pointsAmountPerMonth != null) {
for (var monthData in yearData.pointsAmountPerMonth!) { for (var monthData in yearData.pointsAmountPerMonth!) {
if (monthData.pointsAmountPerday != null) { if (monthData.pointsAmountPerday != null) {

@ -35,6 +35,7 @@ class PayTabsViewModel extends ChangeNotifier {
locale: appState.isArabic() ? PaymentSdkLocale.AR : PaymentSdkLocale.EN, locale: appState.isArabic() ? PaymentSdkLocale.AR : PaymentSdkLocale.EN,
merchantApplePayIndentifier: merchantApplePayIndentifier:
ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? PaymentSdkDefaultConfig.defaultMerchantAppleBundleIDUAT : PaymentSdkDefaultConfig.defaultMerchantAppleBundleID, ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? PaymentSdkDefaultConfig.defaultMerchantAppleBundleIDUAT : PaymentSdkDefaultConfig.defaultMerchantAppleBundleID,
// merchantApplePayIndentifier: PaymentSdkDefaultConfig.defaultMerchantAppleBundleIDUAT,
screentTitle: paymentDescription, screentTitle: paymentDescription,
amount: amount.toDouble(), amount: amount.toDouble(),
showBillingInfo: false, showBillingInfo: false,

@ -19,6 +19,8 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart';
import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/models/paytabs_transaction_response_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/paytabs_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.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/insurance/insurance_home_page.dart';
@ -45,6 +47,7 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
late BookAppointmentsViewModel bookAppointmentsViewModel; late BookAppointmentsViewModel bookAppointmentsViewModel;
late MyAppointmentsViewModel myAppointmentsViewModel; late MyAppointmentsViewModel myAppointmentsViewModel;
late PayfortViewModel payfortViewModel; late PayfortViewModel payfortViewModel;
late PayTabsViewModel paytabsViewModel;
late AppState appState; late AppState appState;
MyInAppBrowser? browser; MyInAppBrowser? browser;
@ -87,6 +90,7 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
bookAppointmentsViewModel = Provider.of<BookAppointmentsViewModel>(context); bookAppointmentsViewModel = Provider.of<BookAppointmentsViewModel>(context);
myAppointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context); myAppointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context);
payfortViewModel = Provider.of<PayfortViewModel>(context); payfortViewModel = Provider.of<PayfortViewModel>(context);
paytabsViewModel = Provider.of<PayTabsViewModel>(context, listen: false);
return Scaffold( return Scaffold(
backgroundColor: AppColors.bgScaffoldColor, backgroundColor: AppColors.bgScaffoldColor,
body: Consumer<BookAppointmentsViewModel>(builder: (context, bookAppointmentsVM, child) { body: Consumer<BookAppointmentsViewModel>(builder: (context, bookAppointmentsVM, child) {
@ -133,7 +137,50 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
).paddingSymmetrical(16.h, 16.h), ).paddingSymmetrical(16.h, 16.h),
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
selectedPaymentMethod = "MADA"; selectedPaymentMethod = "MADA";
openPaymentURL("mada"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"Appointment Payment",
bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
LoaderBottomSheet.showLoader(loadingText: LocaleKeys.bookingWaitingAppointment.tr(context: context));
await bookAppointmentsViewModel.insertSpecificAppointmentForWalkIn(onSuccess: (val) async {
String appointmentNo = val.data['AppointmentNo'].toString();
await myAppointmentsViewModel.createAdvancePayment(
paymentMethodName: selectedPaymentMethod,
projectID: bookAppointmentsViewModel.waitingAppointmentProjectID,
clinicID: bookAppointmentsViewModel.selectedDoctor.clinicID!,
appointmentNo: appointmentNo,
payedAmount: bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
paymentReference: transactionData.transactionReference!,
patientID: appState.getAuthenticatedUser()!.patientId.toString(),
patientType: appState.getAuthenticatedUser()!.patientType!,
onSuccess: (value) async {
print(value);
await myAppointmentsViewModel.addAdvanceNumberRequest(
advanceNumber: Utils.isVidaPlusProject(bookAppointmentsViewModel.waitingAppointmentProjectID)
? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
: value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference: transactionData.transactionReference!,
appointmentNo: appointmentNo,
onSuccess: (value) async {
LoaderBottomSheet.hideLoader();
sendCheckInRequest(bookAppointmentsViewModel.waitingAppointmentNFCCode, appointmentNo, context);
});
});
});
}, onError: (err) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
openPaymentURL("mada");
}
}), }),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Container( Container(
@ -175,7 +222,50 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
).paddingSymmetrical(16.h, 16.h), ).paddingSymmetrical(16.h, 16.h),
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
selectedPaymentMethod = "VISA"; selectedPaymentMethod = "VISA";
openPaymentURL("visa"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"Appointment Payment",
bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
LoaderBottomSheet.showLoader(loadingText: LocaleKeys.bookingWaitingAppointment.tr(context: context));
await bookAppointmentsViewModel.insertSpecificAppointmentForWalkIn(onSuccess: (val) async {
String appointmentNo = val.data['AppointmentNo'].toString();
await myAppointmentsViewModel.createAdvancePayment(
paymentMethodName: selectedPaymentMethod,
projectID: bookAppointmentsViewModel.waitingAppointmentProjectID,
clinicID: bookAppointmentsViewModel.selectedDoctor.clinicID!,
appointmentNo: appointmentNo,
payedAmount: bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
paymentReference: transactionData.transactionReference!,
patientID: appState.getAuthenticatedUser()!.patientId.toString(),
patientType: appState.getAuthenticatedUser()!.patientType!,
onSuccess: (value) async {
print(value);
await myAppointmentsViewModel.addAdvanceNumberRequest(
advanceNumber: Utils.isVidaPlusProject(bookAppointmentsViewModel.waitingAppointmentProjectID)
? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
: value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference: transactionData.transactionReference!,
appointmentNo: appointmentNo,
onSuccess: (value) async {
LoaderBottomSheet.hideLoader();
sendCheckInRequest(bookAppointmentsViewModel.waitingAppointmentNFCCode, appointmentNo, context);
});
});
});
}, onError: (err) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
openPaymentURL("visa");
}
}), }),
SizedBox(height: 16.h), SizedBox(height: 16.h),
isShowTamara isShowTamara
@ -531,14 +621,7 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
} }
startApplePay() async { startApplePay() async {
showCommonBottomSheet(context, LoaderBottomSheet.showLoader(loadingText: LocaleKeys.loadingText.tr(context: context));
child: Utils.getLoadingWidget(),
callBackFunc: (str) {},
title: "",
height: ResponsiveExtension.screenHeight * 0.3,
isCloseButtonVisible: false,
isDismissible: false,
isFullScreen: false);
transID = Utils.getAppointmentTransID( transID = Utils.getAppointmentTransID(
bookAppointmentsViewModel.selectedDoctor.projectID!, bookAppointmentsViewModel.selectedDoctor.projectID!,
bookAppointmentsViewModel.selectedDoctor.clinicID!, bookAppointmentsViewModel.selectedDoctor.clinicID!,
@ -596,36 +679,80 @@ class _WaitingAppointmentPaymentPageState extends State<WaitingAppointmentPaymen
//TODO: Need to pass dynamic params to the Apple Pay instead of static values //TODO: Need to pass dynamic params to the Apple Pay instead of static values
await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) {
payfortViewModel.paymentWithApplePay( if (appState.isPaytabsEnabled) {
customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", LoaderBottomSheet.hideLoader();
// customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, paytabsViewModel.setPaymentConfiguration(
customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", "Appointment Payment",
orderDescription: "Appointment Payment", bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
orderAmount: double.parse(bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!.toString()), );
merchantReference: transID, paytabsViewModel.startApplePayPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, LoaderBottomSheet.showLoader(loadingText: LocaleKeys.bookingWaitingAppointment.tr(context: context));
applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, await bookAppointmentsViewModel.insertSpecificAppointmentForWalkIn(onSuccess: (val) async {
applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, String appointmentNo = val.data['AppointmentNo'].toString();
currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", await myAppointmentsViewModel.createAdvancePayment(
onFailed: (failureResult) async { paymentMethodName: selectedPaymentMethod,
log("failureResult: ${failureResult.message.toString()}"); projectID: bookAppointmentsViewModel.waitingAppointmentProjectID,
Navigator.of(context).pop(); clinicID: bookAppointmentsViewModel.selectedDoctor.clinicID!,
appointmentNo: appointmentNo,
payedAmount: bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.patientShareWithTax!,
paymentReference: transactionData.transactionReference!,
patientID: appState.getAuthenticatedUser()!.patientId.toString(),
patientType: appState.getAuthenticatedUser()!.patientType!,
onSuccess: (value) async {
print(value);
await myAppointmentsViewModel.addAdvanceNumberRequest(
advanceNumber: Utils.isVidaPlusProject(bookAppointmentsViewModel.waitingAppointmentProjectID)
? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
: value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference: transactionData.transactionReference!,
appointmentNo: appointmentNo,
onSuccess: (value) async {
LoaderBottomSheet.hideLoader();
sendCheckInRequest(bookAppointmentsViewModel.waitingAppointmentNFCCode, appointmentNo, context);
});
});
});
}, onError: (err) {
showCommonBottomSheetWithoutHeight( showCommonBottomSheetWithoutHeight(
context, context,
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {}, callBackFunc: () {},
isFullScreen: false, isFullScreen: false,
isCloseButtonVisible: true, isCloseButtonVisible: true,
); );
}, });
onSucceeded: (successResult) async { } else {
log("successResult: ${successResult.responseMessage.toString()}"); payfortViewModel.paymentWithApplePay(
selectedPaymentMethod = successResult.paymentOption ?? "VISA"; customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
checkPaymentStatus(); // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
}, customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
// projectId: appo.projectID, orderDescription: "Appointment Payment",
// serviceTypeEnum: ServiceTypeEnum.appointmentPayment, orderAmount: double.parse(bookAppointmentsViewModel.patientWalkInAppointmentShareResponseModel!.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 {
log("successResult: ${successResult.responseMessage.toString()}");
selectedPaymentMethod = successResult.paymentOption ?? "VISA";
checkPaymentStatus();
},
// projectId: appo.projectID,
// serviceTypeEnum: ServiceTypeEnum.appointmentPayment,
);
}
}); });
} }

@ -16,6 +16,8 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart';
import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart';
import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/models/paytabs_transaction_response_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/paytabs_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.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/insurance/insurance_home_page.dart';
@ -39,6 +41,7 @@ class ErOnlineCheckinPaymentPage extends StatefulWidget {
class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage> { class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage> {
late PayfortViewModel payfortViewModel; late PayfortViewModel payfortViewModel;
late EmergencyServicesViewModel emergencyServicesViewModel; late EmergencyServicesViewModel emergencyServicesViewModel;
late PayTabsViewModel paytabsViewModel;
late AppState appState; late AppState appState;
@ -75,6 +78,7 @@ class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage>
appState = getIt.get<AppState>(); appState = getIt.get<AppState>();
payfortViewModel = Provider.of<PayfortViewModel>(context, listen: false); payfortViewModel = Provider.of<PayfortViewModel>(context, listen: false);
emergencyServicesViewModel = Provider.of<EmergencyServicesViewModel>(context, listen: false); emergencyServicesViewModel = Provider.of<EmergencyServicesViewModel>(context, listen: false);
paytabsViewModel = Provider.of<PayTabsViewModel>(context, listen: false);
return Scaffold( return Scaffold(
backgroundColor: AppColors.bgScaffoldColor, backgroundColor: AppColors.bgScaffoldColor,
body: Column( body: Column(
@ -119,7 +123,54 @@ class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage>
).paddingSymmetrical(16.h, 16.h), ).paddingSymmetrical(16.h, 16.h),
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
selectedPaymentMethod = "MADA"; selectedPaymentMethod = "MADA";
openPaymentURL("mada"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"ER Online Check-In Payment",
emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
if (emergencyServicesViewModel.isERBookAppointment) {
await emergencyServicesViewModel.ER_CreateAdvancePayment(
paymentMethodName: selectedPaymentMethod,
paymentReference: transactionData.transactionReference!,
onSuccess: (value) async {
await emergencyServicesViewModel.addAdvanceNumberRequest(
advanceNumber: value,
paymentReference: transactionData.transactionReference!,
appointmentNo: "0",
onSuccess: (val) {
LoaderBottomSheet.hideLoader();
if (emergencyServicesViewModel.isERBookAppointment) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getSuccessWidget(loadingText: LocaleKeys.erAppointmentBookedSuccess.tr(context: context)),
callBackFunc: () {
Navigator.pushAndRemoveUntil(
context,
CustomPageRoute(
page: LandingNavigation(),
),
(r) => false);
},
isFullScreen: false,
isCloseButtonVisible: true,
);
} else {}
});
});
} else {}
}, onError: (errMsg) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: errMsg.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
openPaymentURL("mada");
}
}), }),
SizedBox(height: 16.h), SizedBox(height: 16.h),
Container( Container(
@ -161,7 +212,54 @@ class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage>
).paddingSymmetrical(16.h, 16.h), ).paddingSymmetrical(16.h, 16.h),
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
selectedPaymentMethod = "VISA"; selectedPaymentMethod = "VISA";
openPaymentURL("visa"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"ER Online Check-In Payment",
emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
if (emergencyServicesViewModel.isERBookAppointment) {
await emergencyServicesViewModel.ER_CreateAdvancePayment(
paymentMethodName: selectedPaymentMethod,
paymentReference: transactionData.transactionReference!,
onSuccess: (value) async {
await emergencyServicesViewModel.addAdvanceNumberRequest(
advanceNumber: value,
paymentReference: transactionData.transactionReference!,
appointmentNo: "0",
onSuccess: (val) {
LoaderBottomSheet.hideLoader();
if (emergencyServicesViewModel.isERBookAppointment) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getSuccessWidget(loadingText: LocaleKeys.erAppointmentBookedSuccess.tr(context: context)),
callBackFunc: () {
Navigator.pushAndRemoveUntil(
context,
CustomPageRoute(
page: LandingNavigation(),
),
(r) => false);
},
isFullScreen: false,
isCloseButtonVisible: true,
);
} else {}
});
});
} else {}
}, onError: (errMsg) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: errMsg.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
openPaymentURL("visa");
}
}), }),
SizedBox(height: 16.h), SizedBox(height: 16.h),
isShowTamara isShowTamara
@ -393,35 +491,84 @@ class _ErOnlineCheckinPaymentPageState extends State<ErOnlineCheckinPaymentPage>
//TODO: Need to pass dynamic params to the Apple Pay instead of static values //TODO: Need to pass dynamic params to the Apple Pay instead of static values
await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) {
payfortViewModel.paymentWithApplePay( if (appState.isPaytabsEnabled) {
customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", LoaderBottomSheet.hideLoader();
// customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, paytabsViewModel.setPaymentConfiguration(
customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", "ER Online Check-In Payment",
orderDescription: "Appointment Payment", emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!,
orderAmount: double.parse(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!.toString()), );
merchantReference: transID, paytabsViewModel.startApplePayPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, LoaderBottomSheet.showLoader(loadingText: LocaleKeys.checkingPaymentStatusPleaseWait.tr(context: context));
applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, if (emergencyServicesViewModel.isERBookAppointment) {
applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, await emergencyServicesViewModel.ER_CreateAdvancePayment(
currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", paymentMethodName: selectedPaymentMethod,
onFailed: (failureResult) async { paymentReference: transactionData.transactionReference!,
LoaderBottomSheet.hideLoader(); onSuccess: (value) async {
log("failureResult: ${failureResult.message.toString()}"); await emergencyServicesViewModel.addAdvanceNumberRequest(
advanceNumber: value,
paymentReference: transactionData.transactionReference!,
appointmentNo: "0",
onSuccess: (val) {
LoaderBottomSheet.hideLoader();
if (emergencyServicesViewModel.isERBookAppointment) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getSuccessWidget(loadingText: LocaleKeys.erAppointmentBookedSuccess.tr(context: context)),
callBackFunc: () {
Navigator.pushAndRemoveUntil(
context,
CustomPageRoute(
page: LandingNavigation(),
),
(r) => false);
},
isFullScreen: false,
isCloseButtonVisible: true,
);
} else {}
});
});
} else {}
}, onError: (err) {
showCommonBottomSheetWithoutHeight( showCommonBottomSheetWithoutHeight(
context, context,
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {}, callBackFunc: () {},
isFullScreen: false, isFullScreen: false,
isCloseButtonVisible: true, isCloseButtonVisible: true,
); );
}, });
onSucceeded: (successResult) async { } else {
LoaderBottomSheet.hideLoader(); payfortViewModel.paymentWithApplePay(
log("successResult: ${successResult.responseMessage.toString()}"); customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
selectedPaymentMethod = successResult.paymentOption ?? "VISA"; // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
checkPaymentStatus(); customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
}, orderDescription: "ER Online Check-In Payment",
); orderAmount: double.parse(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.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 {
LoaderBottomSheet.hideLoader();
log("failureResult: ${failureResult.message.toString()}");
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
},
onSucceeded: (successResult) async {
LoaderBottomSheet.hideLoader();
log("successResult: ${successResult.responseMessage.toString()}");
selectedPaymentMethod = successResult.paymentOption ?? "VISA";
checkPaymentStatus();
},
);
}
}); });
} }

@ -95,7 +95,7 @@ class LakumWalletDetails extends StatelessWidget {
); );
} }
Widget _buildLakumMainCard(LakumInquiryInformationResponseModel accountInfo, AppState appState) { Widget _buildLakumMainCard(LakumInquiryInformationResponseModel? accountInfo, AppState appState) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
@ -134,7 +134,7 @@ class LakumWalletDetails extends StatelessWidget {
color: Colors.white, color: Colors.white,
), ),
SizedBox(height: 4.h), SizedBox(height: 4.h),
(accountInfo.accountNumber ?? 0).toString().toText14( (accountInfo?.accountNumber ?? 0).toString().toText14(
color: Colors.white.withAlpha(230), color: Colors.white.withAlpha(230),
), ),
], ],
@ -155,7 +155,7 @@ class LakumWalletDetails extends StatelessWidget {
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
(accountInfo.pointsBalance?.toString() ?? "0").toText44( (accountInfo?.pointsBalance?.toString() ?? "0").toText44(
isBold: true, isBold: true,
color: Colors.white, color: Colors.white,
), ),
@ -172,7 +172,7 @@ class LakumWalletDetails extends StatelessWidget {
SizedBox(height: 4.h), SizedBox(height: 4.h),
// Balance Amount in SAR // Balance Amount in SAR
"${accountInfo.pointsBalanceAmount?.toStringAsFixed(2) ?? "0.00"} SAR".toText18( "${accountInfo?.pointsBalanceAmount?.toStringAsFixed(2) ?? "0.00"} SAR".toText18(
color: Colors.white.withAlpha(204), color: Colors.white.withAlpha(204),
), ),
SizedBox(height: 20.h), SizedBox(height: 20.h),
@ -183,7 +183,7 @@ class LakumWalletDetails extends StatelessWidget {
Expanded( Expanded(
child: _buildStatChip( child: _buildStatChip(
LocaleKeys.gained.tr(), LocaleKeys.gained.tr(),
accountInfo.gainedPoints?.toString() ?? "0", accountInfo?.gainedPoints?.toString() ?? "0",
Icons.arrow_circle_up, Icons.arrow_circle_up,
), ),
), ),
@ -191,16 +191,14 @@ class LakumWalletDetails extends StatelessWidget {
Expanded( Expanded(
child: _buildStatChip( child: _buildStatChip(
LocaleKeys.consumed.tr(), LocaleKeys.consumed.tr(),
accountInfo.consumedPoints?.toString() ?? "0", accountInfo?.consumedPoints?.toString() ?? "0",
Icons.arrow_circle_down, Icons.arrow_circle_down,
), ),
), ),
SizedBox(width: 8.w), SizedBox(width: 8.w),
Expanded( Expanded(
child: _buildStatChip( child: _buildStatChip(
LocaleKeys.expired.tr(), LocaleKeys.expired.tr(), accountInfo?.expiredPoints?.toString() ?? "0", Icons.calendar_month,
accountInfo.expiredPoints?.toString() ?? "0",
Icons.calendar_month,
isSvg: true isSvg: true
), ),
), ),

@ -99,7 +99,11 @@ class LakumWalletCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
NumberFormat.decimalPattern() NumberFormat.decimalPattern()
.format(habibWalletVM.isLakumAccountInfoLoading ? 123 : habibWalletVM.yahalaAccountNumber == "0" ? 0 : habibWalletVM.lakumAccountInfo.pointsBalance) .format(habibWalletVM.isLakumAccountInfoLoading
? 123
: habibWalletVM.yahalaAccountNumber == "0"
? 0
: (habibWalletVM.lakumAccountInfo?.pointsBalance ?? 0))
.toString() .toString()
.toText32(isBold: true, isEnglishOnly: true) .toText32(isBold: true, isEnglishOnly: true)
.toShimmer2(isShow: habibWalletVM.isLakumAccountInfoLoading, radius: 12.h, width: 80.h, height: 40.h), .toShimmer2(isShow: habibWalletVM.isLakumAccountInfoLoading, radius: 12.h, width: 80.h, height: 40.h),

@ -16,6 +16,8 @@ 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/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart';
import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/models/paytabs_transaction_response_model.dart';
import 'package:hmg_patient_app_new/features/paytabs/paytabs_view_model.dart';
import 'package:hmg_patient_app_new/features/todo_section/models/resp_models/ancillary_order_procedures_detail_response_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/models/resp_models/ancillary_order_procedures_detail_response_model.dart';
import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
@ -55,6 +57,7 @@ class _AncillaryOrderPaymentPageState extends State<AncillaryOrderPaymentPage> {
late PayfortViewModel payfortViewModel; late PayfortViewModel payfortViewModel;
late AppState appState; late AppState appState;
late TodoSectionViewModel todoSectionViewModel; late TodoSectionViewModel todoSectionViewModel;
late PayTabsViewModel paytabsViewModel;
MyInAppBrowser? browser; MyInAppBrowser? browser;
String selectedPaymentMethod = ""; String selectedPaymentMethod = "";
@ -74,6 +77,7 @@ class _AncillaryOrderPaymentPageState extends State<AncillaryOrderPaymentPage> {
appState = getIt.get<AppState>(); appState = getIt.get<AppState>();
todoSectionViewModel = Provider.of<TodoSectionViewModel>(context); todoSectionViewModel = Provider.of<TodoSectionViewModel>(context);
payfortViewModel = Provider.of<PayfortViewModel>(context); payfortViewModel = Provider.of<PayfortViewModel>(context);
paytabsViewModel = Provider.of<PayTabsViewModel>(context, listen: false);
return Scaffold( return Scaffold(
backgroundColor: AppColors.bgScaffoldColor, backgroundColor: AppColors.bgScaffoldColor,
@ -125,7 +129,34 @@ class _AncillaryOrderPaymentPageState extends State<AncillaryOrderPaymentPage> {
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
if (!todoVM.isProcessingPayment) { if (!todoVM.isProcessingPayment) {
selectedPaymentMethod = "MADA"; selectedPaymentMethod = "MADA";
_openPaymentURL("mada"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"Ancillary Orders Payment",
widget.totalAmount,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
final paymentAmount = widget.totalAmount;
final fortId = transactionData.transactionReference;
final paymentMethod = selectedPaymentMethod;
// Call createAdvancePayment with the payment details
_createAdvancePayment(
paymentAmount: paymentAmount.toDouble(),
paymentReference: fortId!,
paymentMethod: paymentMethod,
);
}, onError: (err) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
_openPaymentURL("mada");
}
} }
}), }),
@ -172,7 +203,34 @@ class _AncillaryOrderPaymentPageState extends State<AncillaryOrderPaymentPage> {
).paddingSymmetrical(24.h, 0.h).onPress(() { ).paddingSymmetrical(24.h, 0.h).onPress(() {
if (!todoVM.isProcessingPayment) { if (!todoVM.isProcessingPayment) {
selectedPaymentMethod = "VISA"; selectedPaymentMethod = "VISA";
_openPaymentURL("visa"); if (appState.isPaytabsEnabled) {
paytabsViewModel.setPaymentConfiguration(
"Ancillary Orders Payment",
widget.totalAmount,
);
paytabsViewModel.startCardPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
final paymentAmount = widget.totalAmount;
final fortId = transactionData.transactionReference;
final paymentMethod = selectedPaymentMethod;
// Call createAdvancePayment with the payment details
_createAdvancePayment(
paymentAmount: paymentAmount.toDouble(),
paymentReference: fortId!,
paymentMethod: paymentMethod,
);
}, onError: (err) {
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
});
} else {
_openPaymentURL("visa");
}
} }
}), }),
], ],
@ -573,33 +631,61 @@ class _AncillaryOrderPaymentPageState extends State<AncillaryOrderPaymentPage> {
return; return;
} }
// Only proceed with Apple Pay if insert was successful // Only proceed with Apple Pay if insert was successful
payfortViewModel.paymentWithApplePay( if(appState.isPaytabsEnabled) {
customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", LoaderBottomSheet.hideLoader();
customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", paytabsViewModel.setPaymentConfiguration(
orderDescription: "Ancillary Order Payment", "Ancillary Orders Payment",
orderAmount: widget.totalAmount, widget.totalAmount,
merchantReference: transID, );
merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, paytabsViewModel.startApplePayPayment(onSuccess: (PaytabsTransactionResponseModel transactionData) async {
applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, final paymentAmount = widget.totalAmount;
applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, final fortId = transactionData.transactionReference;
currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", final paymentMethod = selectedPaymentMethod;
onFailed: (failureResult) async {
log("failureResult: ${failureResult.message.toString()}"); // Call createAdvancePayment with the payment details
LoaderBottomSheet.hideLoader(); _createAdvancePayment(
paymentAmount: paymentAmount.toDouble(),
paymentReference: fortId!,
paymentMethod: paymentMethod,
);
}, onError: (err) {
showCommonBottomSheetWithoutHeight( showCommonBottomSheetWithoutHeight(
context, context,
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), child: Utils.getErrorWidget(loadingText: err.toString()),
callBackFunc: () {}, callBackFunc: () {},
isFullScreen: false, isFullScreen: false,
isCloseButtonVisible: true, isCloseButtonVisible: true,
); );
}, });
onSucceeded: (successResult) async { } else {
LoaderBottomSheet.hideLoader(); payfortViewModel.paymentWithApplePay(
log("successResult: ${successResult.responseMessage.toString()}"); customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
selectedPaymentMethod = successResult.paymentOption ?? "VISA"; customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
_checkPaymentStatus(); orderDescription: "Ancillary Order Payment",
}, orderAmount: widget.totalAmount,
); 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()}");
LoaderBottomSheet.hideLoader();
showCommonBottomSheetWithoutHeight(
context,
child: Utils.getErrorWidget(loadingText: failureResult.message.toString()),
callBackFunc: () {},
isFullScreen: false,
isCloseButtonVisible: true,
);
},
onSucceeded: (successResult) async {
LoaderBottomSheet.hideLoader();
log("successResult: ${successResult.responseMessage.toString()}");
selectedPaymentMethod = successResult.paymentOption ?? "VISA";
_checkPaymentStatus();
},
);
}
} }
} }

Loading…
Cancel
Save