Compare commits
12 Commits
dev_v3.13.
...
dev_3.13.6
| Author | SHA1 | Date |
|---|---|---|
|
|
adf00e101f | 1 year ago |
|
|
f6b89e1ae6 | 1 year ago |
|
|
4dc0a3f6c2 | 1 year ago |
|
|
84159656b6 | 1 year ago |
|
|
8f9882fc5c | 1 year ago |
|
|
88d79367ba | 1 year ago |
|
|
de5317ae55 | 1 year ago |
|
|
9a0a658083 | 1 year ago |
|
|
3a64858905 | 1 year ago |
|
|
f65fe26fd2 | 1 year ago |
|
|
f5df1b1d01 | 1 year ago |
|
|
704d691816 | 1 year ago |
@ -0,0 +1,96 @@
|
||||
class EROnlineCheckInPaymentDetailsResponse {
|
||||
num? cashPrice;
|
||||
num? cashPriceTax;
|
||||
num? cashPriceWithTax;
|
||||
int? companyId;
|
||||
String? companyName;
|
||||
num? companyShareWithTax;
|
||||
dynamic errCode;
|
||||
int? groupID;
|
||||
String? insurancePolicyNo;
|
||||
String? message;
|
||||
String? patientCardID;
|
||||
num? patientShare;
|
||||
num? patientShareWithTax;
|
||||
num? patientTaxAmount;
|
||||
int? policyId;
|
||||
String? policyName;
|
||||
String? procedureId;
|
||||
String? procedureName;
|
||||
dynamic setupID;
|
||||
int? statusCode;
|
||||
String? subPolicyNo;
|
||||
|
||||
EROnlineCheckInPaymentDetailsResponse(
|
||||
{this.cashPrice,
|
||||
this.cashPriceTax,
|
||||
this.cashPriceWithTax,
|
||||
this.companyId,
|
||||
this.companyName,
|
||||
this.companyShareWithTax,
|
||||
this.errCode,
|
||||
this.groupID,
|
||||
this.insurancePolicyNo,
|
||||
this.message,
|
||||
this.patientCardID,
|
||||
this.patientShare,
|
||||
this.patientShareWithTax,
|
||||
this.patientTaxAmount,
|
||||
this.policyId,
|
||||
this.policyName,
|
||||
this.procedureId,
|
||||
this.procedureName,
|
||||
this.setupID,
|
||||
this.statusCode,
|
||||
this.subPolicyNo});
|
||||
|
||||
EROnlineCheckInPaymentDetailsResponse.fromJson(Map<String, dynamic> json) {
|
||||
cashPrice = json['CashPrice'];
|
||||
cashPriceTax = json['CashPriceTax'];
|
||||
cashPriceWithTax = json['CashPriceWithTax'];
|
||||
companyId = json['CompanyId'];
|
||||
companyName = json['CompanyName'];
|
||||
companyShareWithTax = json['CompanyShareWithTax'];
|
||||
errCode = json['ErrCode'];
|
||||
groupID = json['GroupID'];
|
||||
insurancePolicyNo = json['InsurancePolicyNo'];
|
||||
message = json['Message'];
|
||||
patientCardID = json['PatientCardID'];
|
||||
patientShare = json['PatientShare'];
|
||||
patientShareWithTax = json['PatientShareWithTax'];
|
||||
patientTaxAmount = json['PatientTaxAmount'];
|
||||
policyId = json['PolicyId'];
|
||||
policyName = json['PolicyName'];
|
||||
procedureId = json['ProcedureId'];
|
||||
procedureName = json['ProcedureName'];
|
||||
setupID = json['SetupID'];
|
||||
statusCode = json['StatusCode'];
|
||||
subPolicyNo = json['SubPolicyNo'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['CashPrice'] = this.cashPrice;
|
||||
data['CashPriceTax'] = this.cashPriceTax;
|
||||
data['CashPriceWithTax'] = this.cashPriceWithTax;
|
||||
data['CompanyId'] = this.companyId;
|
||||
data['CompanyName'] = this.companyName;
|
||||
data['CompanyShareWithTax'] = this.companyShareWithTax;
|
||||
data['ErrCode'] = this.errCode;
|
||||
data['GroupID'] = this.groupID;
|
||||
data['InsurancePolicyNo'] = this.insurancePolicyNo;
|
||||
data['Message'] = this.message;
|
||||
data['PatientCardID'] = this.patientCardID;
|
||||
data['PatientShare'] = this.patientShare;
|
||||
data['PatientShareWithTax'] = this.patientShareWithTax;
|
||||
data['PatientTaxAmount'] = this.patientTaxAmount;
|
||||
data['PolicyId'] = this.policyId;
|
||||
data['PolicyName'] = this.policyName;
|
||||
data['ProcedureId'] = this.procedureId;
|
||||
data['ProcedureName'] = this.procedureName;
|
||||
data['SetupID'] = this.setupID;
|
||||
data['StatusCode'] = this.statusCode;
|
||||
data['SubPolicyNo'] = this.subPolicyNo;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,205 @@
|
||||
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
|
||||
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart';
|
||||
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class EROnlineCheckInBookAppointment extends StatefulWidget {
|
||||
const EROnlineCheckInBookAppointment();
|
||||
|
||||
@override
|
||||
State<EROnlineCheckInBookAppointment> createState() => _EROnlineCheckInBookAppointmentState();
|
||||
}
|
||||
|
||||
class _EROnlineCheckInBookAppointmentState extends State<EROnlineCheckInBookAppointment> with SingleTickerProviderStateMixin {
|
||||
late ProjectViewModel projectViewModel;
|
||||
List<HospitalsModel> projectsList = [];
|
||||
final GlobalKey projectDropdownKey = GlobalKey();
|
||||
HospitalsModel? selectedHospital;
|
||||
String projectDropdownValue = "";
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
getProjectsList();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
projectViewModel = Provider.of(context);
|
||||
return AppScaffold(
|
||||
isShowAppBar: true,
|
||||
appBarTitle: TranslationBase.of(context).emergency + " ${TranslationBase.of(context).checkinOptions}",
|
||||
isShowDecPage: false,
|
||||
showNewAppBar: true,
|
||||
showNewAppBarTitle: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () {
|
||||
openDropdown(projectDropdownKey);
|
||||
},
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
decoration: containerRadius(Colors.white, 12),
|
||||
padding: EdgeInsets.only(left: 10, right: 10, top: 12, bottom: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Flexible(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).selectHospital,
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
letterSpacing: -0.44,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 18,
|
||||
child: DropdownButtonHideUnderline(
|
||||
child: DropdownButton<HospitalsModel>(
|
||||
key: projectDropdownKey,
|
||||
hint: new Text(TranslationBase.of(context).selectHospital),
|
||||
value: selectedHospital,
|
||||
iconSize: 0,
|
||||
isExpanded: true,
|
||||
style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black),
|
||||
items: projectsList.map((item) {
|
||||
return new DropdownMenuItem<HospitalsModel>(
|
||||
value: item,
|
||||
child: new Text(item.name!),
|
||||
);
|
||||
}).toList(),
|
||||
onChanged: (newValue) async {
|
||||
setState(() {
|
||||
selectedHospital = newValue!;
|
||||
projectDropdownValue = newValue.mainProjectID.toString();
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Icon(Icons.keyboard_arrow_down),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
mHeight(16),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: containerRadius(Colors.white, 12),
|
||||
padding: EdgeInsets.only(left: 10, right: 10, top: 12, bottom: 12),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).clinicName,
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
letterSpacing: -0.44,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
"ER Clinic",
|
||||
style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
bottomSheet: Container(
|
||||
height: 80,
|
||||
color: CustomColors.white,
|
||||
padding: EdgeInsets.fromLTRB(12.0, 12.0, 12.0, 25.0),
|
||||
child: DefaultButton(
|
||||
TranslationBase.of(context).bookAppo,
|
||||
() {
|
||||
if (projectDropdownValue == "" || selectedHospital == null) {
|
||||
AppToast.showErrorToast(message: TranslationBase.of(context).selectHospital);
|
||||
} else {
|
||||
Navigator.push(
|
||||
context,
|
||||
FadePage(
|
||||
page: EROnlineCheckInPaymentDetails(
|
||||
projectID: selectedHospital?.iD,
|
||||
isERBookAppointment: true,
|
||||
projectName: selectedHospital!.name!,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
color: CustomColors.accentColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
getProjectsList() {
|
||||
int languageID = projectViewModel.isArabic ? 1 : 2;
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
ClinicListService service = new ClinicListService();
|
||||
List<HospitalsModel> projectsListLocal = [];
|
||||
service.getProjectsList(languageID, context).then((res) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
if (res['MessageStatus'] == 1) {
|
||||
setState(() {
|
||||
res['ListProject'].forEach((v) {
|
||||
projectsListLocal.add(new HospitalsModel.fromJson(v));
|
||||
});
|
||||
projectsList = projectsListLocal;
|
||||
});
|
||||
}
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
bool openDropdown(GlobalKey key) {
|
||||
GestureDetector? detector;
|
||||
bool returnValue = false;
|
||||
void searchForGestureDetector(BuildContext element) {
|
||||
element.visitChildElements((element) {
|
||||
if (element.widget != null && element.widget is GestureDetector) {
|
||||
detector = element.widget as GestureDetector?;
|
||||
returnValue = false;
|
||||
} else {
|
||||
searchForGestureDetector(element);
|
||||
}
|
||||
returnValue = true;
|
||||
});
|
||||
}
|
||||
|
||||
searchForGestureDetector(key.currentContext!);
|
||||
assert(detector != null);
|
||||
detector?.onTap!();
|
||||
return returnValue;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,453 @@
|
||||
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart';
|
||||
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
|
||||
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
|
||||
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/nfc/nfc_reader_sheet.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_nfc_kit/flutter_nfc_kit.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class EROnlineCheckInHomePage extends StatefulWidget {
|
||||
const EROnlineCheckInHomePage();
|
||||
|
||||
@override
|
||||
State<EROnlineCheckInHomePage> createState() => _EROnlineCheckInHomePageState();
|
||||
}
|
||||
|
||||
class _EROnlineCheckInHomePageState extends State<EROnlineCheckInHomePage> with SingleTickerProviderStateMixin {
|
||||
late ProjectViewModel projectViewModel;
|
||||
bool _supportsNFC = false;
|
||||
bool isPatientArrived = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
// checkIfPatientHasArrived();
|
||||
checkPatientERClinicBalanceAmount();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
projectViewModel = Provider.of(context);
|
||||
FlutterNfcKit.nfcAvailability.then((value) {
|
||||
_supportsNFC = (value == NFCAvailability.available);
|
||||
});
|
||||
return AppScaffold(
|
||||
isShowAppBar: true,
|
||||
appBarTitle: TranslationBase.of(context).emergency + " ${TranslationBase.of(context).checkinOptions}",
|
||||
isShowDecPage: false,
|
||||
showNewAppBar: true,
|
||||
showNewAppBarTitle: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
spreadRadius: 5,
|
||||
blurRadius: 7,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.check_circle,
|
||||
size: 50,
|
||||
color: CustomColors.green,
|
||||
),
|
||||
mHeight(6),
|
||||
Text(
|
||||
"What is Online Check-In?",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 20, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: Color(0xff2B353E), letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
Text(
|
||||
"online check-in lets patients fill out forms, share insurance details, and book appointments online, making their visit smoother and quicker.",
|
||||
style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
mHeight(16),
|
||||
Text(
|
||||
"How can i use Online Check-In?",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 20, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: Color(0xff2B353E), letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
Text(
|
||||
"online check-in lets patients fill out forms, share insurance details, and book appointments online, making their visit smoother and quicker.",
|
||||
style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
mHeight(24),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
spreadRadius: 5,
|
||||
blurRadius: 7,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 35,
|
||||
height: 35,
|
||||
decoration: BoxDecoration(
|
||||
color: CustomColors.green,
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"1",
|
||||
style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: CustomColors.white, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
),
|
||||
mWidth(12),
|
||||
SvgPicture.asset(
|
||||
"assets/images/new/tap.svg",
|
||||
width: 35,
|
||||
height: 35,
|
||||
),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Tap On",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
|
||||
fontWeight: FontWeight.w700,
|
||||
color: Color(0xff2B353E),
|
||||
letterSpacing: -1.44,
|
||||
height: 35 / 24),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Tap on the check-in button within the app",
|
||||
style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
mHeight(16),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 35,
|
||||
height: 35,
|
||||
decoration: BoxDecoration(
|
||||
color: CustomColors.green,
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"2",
|
||||
style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: CustomColors.white, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
),
|
||||
mWidth(12),
|
||||
SvgPicture.asset(
|
||||
"assets/images/new/NFC_Hold.svg",
|
||||
width: 35,
|
||||
height: 35,
|
||||
),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Hold your phone",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
|
||||
fontWeight: FontWeight.w700,
|
||||
color: Color(0xff2B353E),
|
||||
letterSpacing: -1.44,
|
||||
height: 35 / 24),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Hold the phone 1 to 2 cm from the NFC sign displayed on the board",
|
||||
style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
mHeight(16),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 35,
|
||||
height: 35,
|
||||
decoration: BoxDecoration(
|
||||
color: CustomColors.green,
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"3",
|
||||
style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: CustomColors.white, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
),
|
||||
mWidth(12),
|
||||
SvgPicture.asset(
|
||||
"assets/images/new/hourglass.svg",
|
||||
width: 35,
|
||||
height: 35,
|
||||
),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Wait your turn",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
|
||||
fontWeight: FontWeight.w700,
|
||||
color: Color(0xff2B353E),
|
||||
letterSpacing: -1.44,
|
||||
height: 35 / 24),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 50, right: 50),
|
||||
child: Text(
|
||||
"Please wait in the waiting area until called by the nurse",
|
||||
style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
bottomSheet: Container(
|
||||
height: 80,
|
||||
color: CustomColors.white,
|
||||
padding: EdgeInsets.fromLTRB(12.0, 12.0, 12.0, 25.0),
|
||||
child: isPatientArrived
|
||||
? Container(
|
||||
child: DefaultButton(
|
||||
TranslationBase.of(context).arrived,
|
||||
() {
|
||||
if (_supportsNFC) {
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
showNfcReader(context, onNcfScan: (String nfcId) {
|
||||
Future.delayed(const Duration(milliseconds: 100), () {
|
||||
print(nfcId);
|
||||
getProjectIDFromNFC(nfcId, true);
|
||||
// Navigator.push(context, FadePage(page: EROnlineCheckInPaymentDetails()));
|
||||
});
|
||||
}, onCancel: () {
|
||||
Navigator.of(context).pop();
|
||||
});
|
||||
});
|
||||
} else {
|
||||
//NFCNotSupported
|
||||
AppToast.showErrorToast(message: TranslationBase.of(context).NFCNotSupported);
|
||||
}
|
||||
},
|
||||
color: CustomColors.accentColor,
|
||||
),
|
||||
)
|
||||
: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: DefaultButton(
|
||||
TranslationBase.of(context).checkinOptions,
|
||||
() {
|
||||
if (_supportsNFC) {
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
showNfcReader(context, onNcfScan: (String nfcId) {
|
||||
Future.delayed(const Duration(milliseconds: 100), () {
|
||||
print(nfcId);
|
||||
getProjectIDFromNFC(nfcId, false);
|
||||
});
|
||||
}, onCancel: () {
|
||||
Navigator.of(context).pop();
|
||||
});
|
||||
});
|
||||
} else {
|
||||
//NFCNotSupported
|
||||
AppToast.showErrorToast(message: TranslationBase.of(context).NFCNotSupported);
|
||||
}
|
||||
},
|
||||
color: CustomColors.green,
|
||||
),
|
||||
),
|
||||
mWidth(12),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: DefaultButton(
|
||||
TranslationBase.of(context).bookAppo,
|
||||
() {
|
||||
Navigator.push(context, FadePage(page: EROnlineCheckInBookAppointment()));
|
||||
},
|
||||
color: CustomColors.accentColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void getProjectIDFromNFC(String nfcID, bool isArrived) {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
ClinicListService ancillaryOrdersService = new ClinicListService();
|
||||
ancillaryOrdersService.getProjectIDFromNFC(nfcID).then((response) {
|
||||
if (response["GetProjectByNFC"].length != 0) {
|
||||
print(response["GetProjectByNFC"]);
|
||||
int projectID = response['GetProjectByNFC'][0]["ProjectID"];
|
||||
String projectName = response['GetProjectByNFC'][0]["ProjectName"];
|
||||
if (isArrived) {
|
||||
autoGenerateInvoiceER(projectID);
|
||||
} else {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
FadePage(
|
||||
page: EROnlineCheckInPaymentDetails(
|
||||
projectID: projectID,
|
||||
isERBookAppointment: false,
|
||||
projectName: projectName,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
AppToast.showErrorToast(message: "Invalid NFC Card Scanned.");
|
||||
}
|
||||
}).catchError((err) {
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
});
|
||||
}
|
||||
|
||||
void checkIfPatientHasArrived() {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
ClinicListService ancillaryOrdersService = new ClinicListService();
|
||||
ancillaryOrdersService.checkIfPatientHasArrived(15, 10).then((response) {
|
||||
print(response["IsPatientArrivedResponse"]);
|
||||
isPatientArrived = response['IsPatientArrivedResponse']["IsPatientArrived"];
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
// erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]);
|
||||
setState(() {});
|
||||
}).catchError((err) {
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
});
|
||||
}
|
||||
|
||||
autoGenerateInvoiceER(int projectID) {
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
service.autoGenerateInvoiceERClinicWithNoPaymentDetails(projectID, true).then((res) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
if(res["MessageStatus"] == 1) {
|
||||
_showMyDialog("Your online Check-In in the ER clinic has been done successfully.", context);
|
||||
} else {
|
||||
AppToast.showErrorToast(message: res["InvoiceResponse"]["Message"]);
|
||||
}
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err);
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _showMyDialog(String message, BuildContext context) async {
|
||||
return showDialog<void>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text('Alert'),
|
||||
content: SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text(message),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void checkPatientERClinicBalanceAmount() {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
ClinicListService ancillaryOrdersService = new ClinicListService();
|
||||
ancillaryOrdersService.checkPatientERClinicBalanceAmount(10).then((response) {
|
||||
print(response["BalanceAmount"]);
|
||||
isPatientArrived = response['BalanceAmount'] > 0;
|
||||
// isPatientArrived = false;
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
// erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]);
|
||||
setState(() {});
|
||||
}).catchError((err) {
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,612 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
||||
import 'package:diplomaticquarterapp/core/enum/PayfortEnums.dart';
|
||||
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
||||
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
|
||||
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
|
||||
import 'package:diplomaticquarterapp/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart';
|
||||
import 'package:diplomaticquarterapp/models/LiveCare/ApplePayInsertRequest.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
|
||||
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
|
||||
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
|
||||
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
|
||||
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
|
||||
import 'package:diplomaticquarterapp/services/payfort_services/payfort_project_details_resp_model.dart';
|
||||
import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart';
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/dragable_sheet.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class EROnlineCheckInPaymentDetails extends StatefulWidget {
|
||||
int projectID = 0;
|
||||
bool isERBookAppointment = false;
|
||||
String projectName = "";
|
||||
|
||||
EROnlineCheckInPaymentDetails({required this.projectID, required this.isERBookAppointment, required this.projectName});
|
||||
|
||||
@override
|
||||
State<EROnlineCheckInPaymentDetails> createState() => _EROnlineCheckInPaymentDetailsState();
|
||||
}
|
||||
|
||||
class _EROnlineCheckInPaymentDetailsState extends State<EROnlineCheckInPaymentDetails> with SingleTickerProviderStateMixin {
|
||||
late ProjectViewModel projectViewModel;
|
||||
EROnlineCheckInPaymentDetailsResponse? erOnlineCheckInPaymentDetailsResponse;
|
||||
String? selectedPaymentMethod;
|
||||
String? selectedInstallmentPlan;
|
||||
String transID = "";
|
||||
MyInAppBrowser? browser;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
getEROnlineCheckInPaymentDetails();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
projectViewModel = Provider.of(context);
|
||||
return AppScaffold(
|
||||
isShowAppBar: true,
|
||||
appBarTitle: TranslationBase.of(context).emergency + " ${TranslationBase.of(context).checkinOptions}",
|
||||
isShowDecPage: false,
|
||||
showNewAppBar: true,
|
||||
showNewAppBarTitle: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
spreadRadius: 5,
|
||||
blurRadius: 7,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).patientInfo,
|
||||
style: TextStyle(
|
||||
fontSize: 18, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: Color(0xff2B353E), letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
mHeight(12),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).patientName + ":",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
letterSpacing: -0.6,
|
||||
color: CustomColors.grey,
|
||||
),
|
||||
),
|
||||
mWidth(3),
|
||||
Text(
|
||||
projectViewModel.user.firstName! + " " + projectViewModel.user.lastName!,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14,
|
||||
letterSpacing: -0.48,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).mrn + ":",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
letterSpacing: -0.6,
|
||||
color: CustomColors.grey,
|
||||
),
|
||||
),
|
||||
mWidth(3),
|
||||
Text(
|
||||
projectViewModel.user.patientID.toString(),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14,
|
||||
letterSpacing: -0.48,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
mHeight(24),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
spreadRadius: 5,
|
||||
blurRadius: 7,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"ER Visit Details",
|
||||
style: TextStyle(
|
||||
fontSize: 18, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: Color(0xff2B353E), letterSpacing: -1.44, height: 35 / 24),
|
||||
),
|
||||
mHeight(12),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).hospital + ":",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
letterSpacing: -0.6,
|
||||
color: CustomColors.grey,
|
||||
),
|
||||
),
|
||||
mWidth(3),
|
||||
Text(
|
||||
widget.projectName,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14,
|
||||
letterSpacing: -0.48,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).clinicName + ":",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
letterSpacing: -0.6,
|
||||
color: CustomColors.grey,
|
||||
),
|
||||
),
|
||||
mWidth(3),
|
||||
Text(
|
||||
"ER Clinic",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14,
|
||||
letterSpacing: -0.48,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
"Time Check-In" + ":",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
letterSpacing: -0.6,
|
||||
color: CustomColors.grey,
|
||||
),
|
||||
),
|
||||
mWidth(3),
|
||||
Text(
|
||||
DateUtil.getMonthDayYearDateFormatted(DateTime.now()),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 14,
|
||||
letterSpacing: -0.48,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
bottomSheet: erOnlineCheckInPaymentDetailsResponse != null
|
||||
? Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.withOpacity(0.5),
|
||||
spreadRadius: 5,
|
||||
blurRadius: 7,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
padding: EdgeInsets.only(left: 21, right: 21, top: 15, bottom: 15),
|
||||
width: double.infinity,
|
||||
// color: Colors.white,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
SizedBox(height: 12),
|
||||
Text(
|
||||
TranslationBase.of(context).YouCanPayByTheFollowingOptions,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Color(0xff2B353E),
|
||||
letterSpacing: -0.64,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.75,
|
||||
child: getPaymentMethods(),
|
||||
),
|
||||
_amountView(TranslationBase.of(context).patientShareTotalToDo, erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax.toString() + " " + TranslationBase.of(context).sar,
|
||||
isBold: true, isTotal: true),
|
||||
SizedBox(height: 12),
|
||||
DefaultButton(
|
||||
TranslationBase.of(context).payNow.toUpperCase(),
|
||||
() {
|
||||
makePayment();
|
||||
},
|
||||
color: CustomColors.green,
|
||||
disabledColor: CustomColors.grey2,
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
: Container(),
|
||||
);
|
||||
}
|
||||
|
||||
makePayment() {
|
||||
showDraggableDialog(
|
||||
context,
|
||||
PaymentMethod(
|
||||
onSelectedMethod: (String method, [String? selectedInstallmentPlan]) {
|
||||
selectedPaymentMethod = method;
|
||||
this.selectedInstallmentPlan = selectedInstallmentPlan;
|
||||
AppoitmentAllHistoryResultList appo = new AppoitmentAllHistoryResultList();
|
||||
appo.projectID = widget.projectID;
|
||||
if (selectedPaymentMethod == "ApplePay") {
|
||||
if (projectViewModel.havePrivilege(103)) {
|
||||
startApplePay();
|
||||
} else {
|
||||
openPayment(selectedPaymentMethod!, projectViewModel.user, erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax!, appo);
|
||||
}
|
||||
} else {
|
||||
openPayment(selectedPaymentMethod!, projectViewModel.user, erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax!, appo);
|
||||
}
|
||||
},
|
||||
patientShare: erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax,
|
||||
isFromAdvancePayment: false,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
openPayment(String paymentMethod, AuthenticatedUser authenticatedUser, num amount, AppoitmentAllHistoryResultList appo) {
|
||||
transID = Utils.getAdvancePaymentTransID(widget.projectID, projectViewModel.user.patientID!);
|
||||
|
||||
browser = new MyInAppBrowser(onExitCallback: onBrowserExit, appo: appo, onLoadStartCallback: onBrowserLoadStart);
|
||||
|
||||
browser?.openPaymentBrowser(amount, "ER Online Check-In Payment", transID, widget.projectID.toString(), authenticatedUser.emailAddress!, paymentMethod, authenticatedUser.patientType,
|
||||
authenticatedUser.firstName!, authenticatedUser.patientID, authenticatedUser, browser!, false, "3", "", context);
|
||||
}
|
||||
|
||||
onBrowserLoadStart(String url) {
|
||||
print("onBrowserLoadStart");
|
||||
print(url);
|
||||
|
||||
MyInAppBrowser.successURLS.forEach((element) {
|
||||
if (url.contains(element)) {
|
||||
if (browser!.isOpened()) browser!.close();
|
||||
MyInAppBrowser.isPaymentDone = true;
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
MyInAppBrowser.errorURLS.forEach((element) {
|
||||
if (url.contains(element)) {
|
||||
if (browser!.isOpened()) browser!.close();
|
||||
MyInAppBrowser.isPaymentDone = false;
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onBrowserExit(AppoitmentAllHistoryResultList appo, bool isPaymentMade) {
|
||||
print("onBrowserExit Called!!!!");
|
||||
checkPaymentStatus(appo);
|
||||
}
|
||||
|
||||
void startApplePay() async {
|
||||
transID = Utils.getAdvancePaymentTransID(widget.projectID, projectViewModel.user.patientID!);
|
||||
|
||||
print("TransactionID: $transID");
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
|
||||
LiveCareService service = new LiveCareService();
|
||||
ApplePayInsertRequest applePayInsertRequest = new ApplePayInsertRequest();
|
||||
|
||||
PayfortProjectDetailsRespModel? payfortProjectDetailsRespModel;
|
||||
await context.read<PayfortViewModel>().getProjectDetailsForPayfort(projectId: widget.projectID, serviceId: ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum()).then((value) {
|
||||
payfortProjectDetailsRespModel = value;
|
||||
});
|
||||
|
||||
applePayInsertRequest.clientRequestID = transID;
|
||||
applePayInsertRequest.clinicID = 0;
|
||||
applePayInsertRequest.currency = projectViewModel.user.outSA == 1 ? "AED" : "SAR";
|
||||
// applePayInsertRequest.customerEmail = projectViewModel.authenticatedUserObject.user.emailAddress;
|
||||
applePayInsertRequest.customerEmail = "CustID_${projectViewModel.user.patientID}@HMG.com";
|
||||
applePayInsertRequest.customerID = projectViewModel.user.patientID;
|
||||
applePayInsertRequest.customerName = projectViewModel.user.firstName! + " " + projectViewModel.user.lastName!;
|
||||
applePayInsertRequest.deviceToken = await AppSharedPreferences().getString(PUSH_TOKEN);
|
||||
applePayInsertRequest.voipToken = await AppSharedPreferences().getString(ONESIGNAL_APNS_TOKEN);
|
||||
applePayInsertRequest.doctorID = 0;
|
||||
applePayInsertRequest.projectID = widget.projectID.toString();
|
||||
applePayInsertRequest.serviceID = ServiceTypeEnum.advancePayment.getIdFromServiceEnum().toString();
|
||||
applePayInsertRequest.channelID = 3;
|
||||
applePayInsertRequest.patientID = projectViewModel.user.patientID;
|
||||
applePayInsertRequest.patientTypeID = projectViewModel.user.patientType;
|
||||
applePayInsertRequest.patientOutSA = projectViewModel.user.outSA;
|
||||
applePayInsertRequest.appointmentDate = null;
|
||||
applePayInsertRequest.appointmentNo = 0;
|
||||
applePayInsertRequest.orderDescription = "ER Online Check-In Payment";
|
||||
applePayInsertRequest.liveServiceID = "0";
|
||||
applePayInsertRequest.latitude = "0.0";
|
||||
applePayInsertRequest.longitude = "0.0";
|
||||
applePayInsertRequest.amount = erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax.toString();
|
||||
applePayInsertRequest.isSchedule = "0";
|
||||
applePayInsertRequest.language = projectViewModel.isArabic ? 'ar' : 'en';
|
||||
applePayInsertRequest.languageID = projectViewModel.isArabic ? 1 : 2;
|
||||
applePayInsertRequest.userName = projectViewModel.user.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 = payfortProjectDetailsRespModel?.merchantIdentifier;
|
||||
applePayInsertRequest.commandType = "PURCHASE";
|
||||
applePayInsertRequest.signature = payfortProjectDetailsRespModel?.signature;
|
||||
applePayInsertRequest.accessCode = payfortProjectDetailsRespModel?.accessCode;
|
||||
applePayInsertRequest.shaRequestPhrase = payfortProjectDetailsRespModel?.shaRequest;
|
||||
applePayInsertRequest.shaResponsePhrase = payfortProjectDetailsRespModel?.shaResponse;
|
||||
applePayInsertRequest.returnURL = "";
|
||||
|
||||
service.applePayInsertRequest(applePayInsertRequest, context).then((res) async {
|
||||
if (res["MessageStatus"] == 1) {
|
||||
await context.read<PayfortViewModel>().initiateApplePayWithPayfort(
|
||||
customerName: projectViewModel.user.firstName! + " " + projectViewModel.user.lastName!,
|
||||
// customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
|
||||
customerEmail: "CustID_${projectViewModel.user.patientID}@HMG.com",
|
||||
orderDescription: "ER Online Check-In Payment",
|
||||
orderAmount: erOnlineCheckInPaymentDetailsResponse!.patientShareWithTax,
|
||||
merchantReference: transID,
|
||||
payfortProjectDetailsRespModel: payfortProjectDetailsRespModel,
|
||||
currency: projectViewModel.user.outSA == 1 ? "AED" : "SAR",
|
||||
onFailed: (failureResult) async {
|
||||
log("failureResult: ${failureResult.toString()}");
|
||||
AppToast.showErrorToast(message: failureResult.toString());
|
||||
},
|
||||
onSuccess: (successResult) async {
|
||||
log("Payfort: ${successResult.responseMessage}");
|
||||
await context.read<PayfortViewModel>().addPayfortApplePayResponse(projectViewModel.user.patientID!, result: successResult);
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
checkPaymentStatus(AppoitmentAllHistoryResultList());
|
||||
},
|
||||
projectId: widget.projectID,
|
||||
serviceTypeEnum: ServiceTypeEnum.appointmentPayment,
|
||||
);
|
||||
} else {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: "An error occurred while processing your request");
|
||||
}
|
||||
}).catchError((err) {
|
||||
print(err);
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err);
|
||||
});
|
||||
}
|
||||
|
||||
checkPaymentStatus(AppoitmentAllHistoryResultList appo) {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
service.checkPaymentStatus(transID, false, context).then((res) {
|
||||
String paymentInfo = res['Response_Message'];
|
||||
if (paymentInfo == 'Success') {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
// createAdvancePayment(res, appo);
|
||||
ER_createAdvancePayment(res, appo);
|
||||
} else {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: res['Response_Message'], localContext: context);
|
||||
}
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err, localContext: context);
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
ER_createAdvancePayment(payment_res, AppoitmentAllHistoryResultList appo) {
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
// GifLoaderDialogUtils.showMyDialog(context);
|
||||
String paymentReference = payment_res['Fort_id'].toString();
|
||||
service.ER_createAdvancePayment(appo, widget.projectID.toString(), payment_res['Amount'], payment_res['Fort_id'], payment_res['PaymentMethod'], context).then((res) {
|
||||
addAdvancedNumberRequest(
|
||||
Utils.isVidaPlusProject(projectViewModel, widget.projectID) ? res['ER_AdvancePaymentResponse']['AdvanceNumber_VP'].toString() : res['ER_AdvancePaymentResponse']['AdvanceNumber'].toString(),
|
||||
paymentReference,
|
||||
0,
|
||||
appo,
|
||||
payment_res);
|
||||
// GifLoaderDialogUtils.hideDialog(context);
|
||||
// ER_InsertEROnlinePaymentDetails(payment_res, appo);
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
createAdvancePayment(paymentRes, AppoitmentAllHistoryResultList appo) {
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
String paymentReference = paymentRes['Fort_id'].toString();
|
||||
service.HIS_createAdvancePayment(appo, widget.projectID.toString(), paymentRes['Amount'], paymentRes['Fort_id'], paymentRes['PaymentMethod'], projectViewModel.user.patientType,
|
||||
projectViewModel.user.firstName! + " " + projectViewModel.user.lastName!, projectViewModel.user.patientID, context)
|
||||
.then((res) {
|
||||
addAdvancedNumberRequest(
|
||||
Utils.isVidaPlusProject(projectViewModel, widget.projectID)
|
||||
? res['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
|
||||
: res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
|
||||
paymentReference,
|
||||
0,
|
||||
appo,
|
||||
paymentRes);
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err);
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
addAdvancedNumberRequest(String advanceNumber, String paymentReference, dynamic appointmentID, AppoitmentAllHistoryResultList appo, paymentRes) {
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
service.addAdvancedNumberRequest(advanceNumber, paymentReference, appointmentID, context).then((res) {
|
||||
if (widget.isERBookAppointment) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showSuccessToast(message: "Your appointment has been booked successfully. Please perform Check-In once you arrive at the hospital.");
|
||||
// Navigator.pop(context);
|
||||
// Navigator.pop(context);
|
||||
// Navigator.pop(context);
|
||||
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
|
||||
} else {
|
||||
autoGenerateInvoiceER(paymentRes);
|
||||
}
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
autoGenerateInvoiceER(res) {
|
||||
DoctorsListService service = new DoctorsListService();
|
||||
service.autoGenerateInvoiceERClinic(widget.projectID, 4, res['Fort_id'], res['Amount'], res['PaymentMethod'], res['CardNumber'], res['Merchant_Reference'], res['RRN'], true).then((res) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
_showMyDialog("Your online Check-In in the ER clinic has been done successfully.", context);
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err);
|
||||
print(err);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _showMyDialog(String message, BuildContext context) async {
|
||||
return showDialog<void>(
|
||||
context: context,
|
||||
barrierDismissible: true, // user must tap button!
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text('Alert'),
|
||||
content: SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text(message),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
getEROnlineCheckInPaymentDetails() {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
ClinicListService ancillaryOrdersService = new ClinicListService();
|
||||
ancillaryOrdersService.getEROnlineCheckInPaymentDetails(widget.projectID, 10).then((response) {
|
||||
erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]);
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
setState(() {});
|
||||
}).catchError((err) {
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
AppToast.showErrorToast(message: err.toString());
|
||||
});
|
||||
}
|
||||
|
||||
_amountView(String title, String value, {bool isBold = false, bool isTotal = false}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 10, bottom: 10),
|
||||
child: Row(children: [
|
||||
Expanded(
|
||||
child: _getNormalText(title),
|
||||
),
|
||||
Expanded(
|
||||
child: _getNormalText(value, isBold: isBold, isTotal: isTotal),
|
||||
),
|
||||
]),
|
||||
);
|
||||
}
|
||||
|
||||
_getNormalText(text, {bool isBold = false, bool isTotal = false}) {
|
||||
return Text(
|
||||
text,
|
||||
style: TextStyle(
|
||||
fontSize: isBold
|
||||
? isTotal
|
||||
? 16
|
||||
: 12
|
||||
: 11,
|
||||
letterSpacing: -0.5,
|
||||
color: isBold ? Color(0xff2E303A) : Color(0xff575757),
|
||||
fontWeight: isTotal ? FontWeight.bold : FontWeight.w600,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue